CMovie::CMovie( IDirect3D9* d3d, IDirect3DDevice9* d3dd ) :m_D3D(d3d) ,m_D3DDev(d3dd) { CComPtr<IVMRFilterConfig9> filterConfig; HRESULT hr; // フィルタグラフ インターフェース作成 if( FAILED( hr = m_graph.CoCreateInstance(CLSID_FilterGraph ) )); // VMR用フィルタ インターフェース作成 if( FAILED( hr = m_filter.CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER) )); // VMRレンダリングコンフィグ インターフェース取得 if( FAILED( hr = m_filter->QueryInterface(IID_IVMRFilterConfig9, reinterpret_cast<void**>(&filterConfig)))); // レンダリング方法設定 if( FAILED( hr = filterConfig->SetRenderingMode( VMR9Mode_Renderless ))); // レンダリングのミキシング数設定(2にする理由が不明) if( FAILED( hr = filterConfig->SetNumberOfStreams(2) )); // VMRフィルタにアロケータプレゼンター設定 if( FAILED( hr = SetAllocatorPresenter( m_filter ) )); // フィルタグラフにVMRフィルタを登録 if( FAILED( hr = m_graph->AddFilter(m_filter, L"Video Mixing Renderer 9") )); // フィルタグラフのコントローラー インターフェース取得 if( FAILED( hr = m_graph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&m_mediaControl)))); }
HRESULT StartGraph(HWND window) { // Clear DirectShow interfaces (COM smart pointers) CloseGraph(window); SmartPtr<IVMRFilterConfig9> filterConfig; BSTR path = GetMoviePath(); if( ! path ) { return E_FAIL; } HRESULT hr; hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&g_graph); if (SUCCEEDED(hr)) { hr = CoCreateInstance(CLSID_VideoMixingRenderer9, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&g_filter); } if (SUCCEEDED(hr)) { hr = g_filter->QueryInterface(IID_IVMRFilterConfig9, reinterpret_cast<void**>(&filterConfig)); } if (SUCCEEDED(hr)) { hr = filterConfig->SetRenderingMode( VMR9Mode_Renderless ); } if (SUCCEEDED(hr)) { hr = filterConfig->SetNumberOfStreams(2); } if (SUCCEEDED(hr)) { hr = SetAllocatorPresenter( g_filter, window ); } if (SUCCEEDED(hr)) { hr = g_graph->AddFilter(g_filter, L"Video Mixing Renderer 9"); } if (SUCCEEDED(hr)) { hr = g_graph->QueryInterface(IID_IMediaControl, reinterpret_cast<void**>(&g_mediaControl)); } if (SUCCEEDED(hr)) { hr = g_graph->RenderFile( path, NULL ); } if (SUCCEEDED(hr)) { hr = g_mediaControl->Run(); } SysFreeString(path); return hr; }