最简单的基于DirectShow的示例:视频播放器自定义版(二)
ter to the pin.
{
*ppPin = 0;
IEnumPins *pEnum = 0;
IPin *pPin = 0;
HRESULT hr = pFilter->EnumPins(&pEnum);
if (FAILED(hr))
{
return hr;
}
while (pEnum->Next(1, &pPin, NULL) == S_OK)
{
PIN_DIRECTION ThisPinDir;
pPin->QueryDirection(&ThisPinDir);
if (ThisPinDir == PinDir)
{
IPin *pTmp = 0;
hr = pPin->ConnectedTo(&pTmp);
if (SUCCEEDED(hr)) // Already connected, not the pin we want.
{
pTmp->Release();
}
else // Unconnected, the pin we want.
{
pEnum->Release();
*ppPin = pPin;
return S_OK;
}
}
pPin->Release();
}
pEnum->Release();
// Did not find a matching pin.
return E_FAIL;
}
//Connect 2 filters
HRESULT connect_filters(
IGraphBuilder *pGraph,
IBaseFilter *pSrc,
IBaseFilter *pDest)
{
if ((pGraph == NULL) || (pSrc == NULL) || (pDest == NULL))
{
return E_POINTER;
}
//Find Output pin in source filter
IPin *pOut = 0;
HRESULT hr = NULL;
hr=get_unconnected_pin(pSrc, PINDIR_OUTPUT, &pOut);
if (FAILED(hr)){
return hr;
}
//Find Input pin in destination filter
IPin *pIn = 0;
hr = get_unconnected_pin(pDest, PINDIR_INPUT, &pIn);
if (FAILED(hr)){
return hr;
}
//Connnect them
hr = pGraph->Connect(pOut, pIn);
pIn->Release();
pOut->Release();
return hr;
}
int _tmain(int argc, _TCHAR* argv[])
{
IGraphBuilder *pGraph = NULL;
IMediaControl *pControl = NULL;
IMediaEvent *pEvent = NULL;
// Init COM
HRESULT hr = CoInitialize(NULL);
if (FAILED(hr)){
printf(Error - Can't init COM.);
return -1;
}
// Create FilterGraph
hr=CoCreateInstance(CLSID_FilterGraph, NULL,CLSCTX_INPROC_SERVER,IID_IGraphBuilder, (void **)&pGraph);
if (FAILED(hr)){
printf(Error - Can't create Filter Graph.);
return -1;
}
// Query Interface
hr = pGraph->
QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
//1. Add Filters=======================
//Source
IBaseFilter *pF_source = 0;
hr = CoCreateInstance(CLSID_AsyncReader, 0, CLSCTX_INPROC_SERVER,IID_IBaseFilter, (void**)(&pF_source));
if (FAILED(hr)){
printf(Failed to create File Source.
);
return -1;
}
hr = pGraph->AddFilter(pF_source, LLei's Source);
if (FAILED(hr)){
printf(Failed to add File Source to Filter Graph.
);
return -1;
}
IFileSourceFilter* pFileSource;
pF_source->QueryInterface(IID_IFileSourceFilter, (void**)&pFileSource);
pFileSource->Load(Lcuc_ieschool.mpg, NULL);
pFileSource->Release();
#if ADD_MANUAL
//Demuxer
IBaseFilter *pF_demuxer = 0;
hr = CoCreateInstance(CLSID_MPEG1Splitter, 0, CLSCTX_INPROC_SERVER,IID_IBaseFilter, (void**)(&pF_demuxer));
if (FAILED(hr)){
printf(Failed to create Demuxer.
);
return -1;
}
hr = pGraph->AddFilter(pF_demuxer, LLei's Demuxer);
if (FAILED(hr)){
printf(Failed to add Demuxer to Filter Graph.
);
return -1;
}
//Decoder
IBaseFilter *pF_decoder = 0;
hr = CoCreateInstance(CLSID_CMpegVideoCodec, 0, CLSCTX_INPROC_SERVER,IID_IBaseFilter, (void**)(&pF_decoder));
if (FAILED(hr)){
printf(Failed to create Decoder.
);
return -1;
}
hr = pGraph->AddFilter(pF_decoder, LLei's Decoder);
if (FAILED(hr)){
printf(Failed to add Decoder to Filter Graph.
);
return -1;
}
//Render
IBaseFilter *pF_render = 0;
hr = CoCreateInstance(CLSID_VideoRenderer, 0