示例#1
0
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;
}