Пример #1
0
bool DShowPlayer::LoadVideo(VideoPtr pVideo, const std::wstring& fileName)
{
	if (pVideo->Rendering())
	{
		ShowMessage(L"Videos can't be loaded while rendering - DShowPlayer::LoadVideo", GSMT_ERROR);
		return false;
	}

	m_pVideo = pVideo;

	D3D9VideoInfoPtr videoInfo;
	try
	{
		videoInfo = boost::any_cast<D3D9VideoInfoPtr>(m_pVideo->GetVideoInfo());
	}
	catch (const boost::bad_any_cast &)
	{
		ShowMessage(L"Invalid D3D9VideoInfoPtr object - DShowPlayer::LoadVideo", GSMT_ERROR);
		return false;
	}

	m_data.hWnd = videoInfo->m_hWnd;

	if (FAILED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)))
	{
		m_pVideo->Message(L"Failed while trying to start COM interface - DShowPlayer::LoadVideo", GSMT_ERROR);
		return false;
	}

	bool failed = false;
	if (FAILED(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC, 
						 IID_IGraphBuilder, (void **)&m_data.pGB)))					failed = true;
	if (FAILED(m_data.pGB->QueryInterface(IID_IMediaControl, (void **)&m_data.pMC)))	failed = true;
	if (FAILED(m_data.pGB->QueryInterface(IID_IVideoWindow,  (void **)&m_data.pVW)))	failed = true;
	if (FAILED(m_data.pGB->QueryInterface(IID_IMediaEventEx, (void **)&m_data.pME)))	failed = true;
	if (FAILED(m_data.pGB->QueryInterface(IID_IMediaSeeking, (void**)&m_data.pMS)))		failed = true;
	if (FAILED(m_data.pGB->QueryInterface(IID_IBasicAudio,	 (void**)&m_data.pBA)))		failed = true;

	if (failed)
	{
		m_pVideo->Message(L"Failed while trying to query COM interfaces - DShowPlayer::LoadVideo", GSMT_ERROR);
		return false;
	}

	if (FAILED(m_data.pGB->RenderFile(fileName.c_str(), NULL)))
	{
		std::wstring message = fileName;
		message += L"\nFailed while trying to load and decode the video - DShowPlayer::LoadVideo";
		m_pVideo->Message(message, GSMT_ERROR);
		return false;
	}

	if (FAILED(m_data.pVW->put_MessageDrain((OAHWND)m_data.hWnd)))
	{
		std::wstring message = fileName;
		message += L" is not a video file. - DShowPlayer::LoadVideo";
		m_pVideo->Message(message, GSMT_ERROR);
		return false;
	}

	//m_data.pVW->put_WindowState(SW_SHOWNOACTIVATE);
	m_data.pVW->put_Owner((OAHWND)m_data.hWnd);
	m_data.pVW->put_WindowStyle(WS_CHILD);
	m_data.pVW->put_WindowStyleEx(WS_EX_NOACTIVATE | WS_EX_TOPMOST);

	m_data.pMC->Pause();

	long lWidth, lHeight;
	m_data.pVW->GetMinIdealImageSize(&lWidth, &lHeight);
	m_size.x = lWidth * (long)m_pVideo->GetScreenSize().x/16;
	m_size.y = lHeight * (long)m_pVideo->GetScreenSize().y/16;

	Vector2i pos(0, 0);
	m_pos = pos;
	m_data.pVW->SetWindowPosition((long)m_pos.x,(long)m_pos.y, (long)m_size.x, (long)m_size.y);

	return true;
}
Пример #2
0
GS_PLAYER_INFO PlayCutscene(VideoPtr pVideo, const std::wstring& fileName,
							InputPtr pInput, const GS_KEY escapeKey)
{
	if (!pVideo)
	{
		ShowMessage(L"Invalid video handler - gs2d::PlayCutscene", GSMT_ERROR);
		return GSPI_FAILED;
	}

	GS_PLAYER_INFO info = GSPI_FINISHED;
	//pVideo->TurnLoopManagerOff();

	const bool rendering = pVideo->Rendering();
	if (rendering)
		pVideo->EndSpriteScene();

	PlayerPtr player = CreatePlayer(pVideo, fileName);
	if (!player)
	{
		ShowMessage(L"Failed while trying to load the video - gs2d::PlayCutscene", GSMT_ERROR);
		if (rendering)
			pVideo->BeginSpriteScene();
		return GSPI_FAILED;
	}

	pVideo->EnableMediaPlaying(true);
	player->SetFullscreen();
	player->Rewind();
	player->Play();

	while (!player->IsFinished())
	{
		player->UpdateVideo();
		const Video::APP_STATUS status = pVideo->HandleEvents();
		if (status == Video::APP_QUIT)
		{
			info = GSPI_CLOSE_WINDOW;
			break;
		}
		else
		{
			if (status == Video::APP_SKIP)
				continue;
		}

		if (pInput)
		{
			pInput->Update();
			if (pInput->GetKeyState(escapeKey) == GSKS_HIT)
			{
				info = GSPI_SKIPPED;
				break;
			}
		}
	}

	if (rendering)
		pVideo->BeginSpriteScene();

	pVideo->EnableMediaPlaying(false);
	return info;
}