MP4 MOV Decoder Directshow Filter

How to use the MP4 MOV Decoder Directshow Filter



This article is intended to show you how to use the MP4 MOV Decoder Directshow Filters in a simple application with default parameters.

Start by calling CoInitialize to initialize the COM library:     

HRESULT hr = CoInitialize(NULL);


Next, call CoCreateInstance to create the Filter Graph Manager.

hr = CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);


Next, call CoCreateInstance to create the MP4 MOV Decoder filter.

CComPtr <IBaseFilter> pSourceFilter;
pSourceFilter.CoCreateInstance(CLSID_MP4MOVDecoder);
pGraph->AddFilter(pSourceFilter,L"MP4 Decoder");
CComQIPtr< IFileSourceFilter, &IID_IFileSourceFilter > pLoad( pSourceFilter );
hr=pLoad->Load(strFile, NULL);
if( FAILED(hr) )
{
return hr;
}


Next, call CoCreateInstance to create the VMR9 Video Renderer.

CComPtr <IBaseFilter> pVideoRenderer;
hr=pVideoRenderer.CoCreateInstance(CLSID_VideoMixingRenderer9);
if( FAILED(hr) )
{
return hr;
}
pGraph->AddFilter(pVideoRenderer,L"VMR9 Renderer");
CComPtr <IVMRFilterConfig9> pConfig;
pVideoRenderer->QueryInterface(IID_IVMRFilterConfig9, (void**)&pConfig);
pConfig->SetRenderingMode(VMR9Mode_Windowless);


Next, Setup the VMR9 Video Renderer.

CComPtr<IVMRWindowlessControl9> windowlessCtrl;
RECT rc;
if (pVideoRenderer) {
hr = pVideoRenderer->QueryInterface(IID_IVMRWindowlessControl9, (void**)&windowlessCtrl);
 if (FAILED(hr)) {
 return hr;
 }
}
if (windowlessCtrl) {
windowlessCtrl->SetVideoClippingWindow(m_hWnd);
::GetClientRect(m_hWnd, &rc);
windowlessCtrl->SetVideoPosition(0, &rc);
windowlessCtrl->SetAspectRatioMode(VMR9ARMode_LetterBox);
windowlessCtrl.Release();
}


 Next, Render the Video Pin and Audio Pin of MP4 MOV Decoder

CComPtr<IEnumPins> pEnumPins;
if(FAILED(hr = pSourceFilter->EnumPins(&pEnumPins)))
{
return hr;
}
CComPtr<IPin> pPin;
ULONG uFetched = 0;
while(S_OK == pEnumPins->Next(1, &pPin, &uFetched))
{
 if(FAILED(hr = pGraph->Render(pPin)))
 {
 return hr;
 }
pPin.Release();
}



Finally, run the graph
 

OAFilterState fs = State_Paused;
CComQIPtr<IMediaControl,&IID_IMediaControl> pMediaControl(pGraph);
if( !pMediaControl )
return E_NOINTERFACE;
hr = pMediaControl->GetState(INFINITE,&fs);
if( FAILED(hr) )
return hr;
hr=pMediaControl->Run();


When the filter graph runs, data moves through the filters and is rendered as video and audio. Playback occurs on a separate thread. You can wait for playback to complete by calling the IMediaEvent::WaitForCompletion method:

 

long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);

When you close your application, close the COM library.
 

CoUninitialize();