查找IFileSourceFilter上的Pin

简介: 创建了IFileSourceFilter,可IFileSourceFilter好像不是从IBaseFilter继承来的,没有EnumPins,那应该怎么查找IFileSourceFilter上的pin啊?<pre name="code" class="cpp">IGraphBuilder *pigb = NULL;IMediaControl *pimc = NULL;IMediaEve
创建了IFileSourceFilter,可IFileSourceFilter好像不是从IBaseFilter继承来的,没有EnumPins,那应该怎么查找IFileSourceFilter上的pin啊?
IGraphBuilder *pigb  = NULL;
IMediaControl *pimc  = NULL;
IMediaEventEx *pimex = NULL;
IVideoWindow  *pivw  = NULL;
IMediaSeeking  *pims  = NULL;

HRESULT AddSourceByFilterCLSID(IGraphBuilder *pGraph,const GUID& clsid,	LPCWSTR wszName,LPCWSTR wszFileName)
{
		if  (!pGraph) return E_POINTER; 
		IBaseFilter *pF = 0; 
		HRESULT      hr = S_OK; 
		hr = CoCreateInstance(clsid, 0, CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pF)); 
		if (SUCCEEDED(hr)) 
		{ 
			hr = pGraph->AddFilter(pF, wszName); 
			if (SUCCEEDED(hr))
			{
				IFileSourceFilter *pSF = NULL;
				hr = pF->QueryInterface(IID_IFileSourceFilter, (void**)&pSF);
				if (SUCCEEDED(hr))
				{
					pSF->Load(wszFileName, NULL);
					pSF->Release();
				}
			}
			
			if (SUCCEEDED(hr))
			{
				IEnumPins *pEnum;
				IPin      *pPin;
				hr = pF->EnumPins(&pEnum);
				if (SUCCEEDED(hr))
				{
					while(pEnum->Next(1, &pPin, 0) == S_OK)
					{
						PIN_DIRECTION pinDirThis;
						pPin->QueryDirection(&pinDirThis);
						if (PINDIR_OUTPUT == pinDirThis)
						{
							hr = pGraph->Render(pPin);
							if (FAILED(hr))
							{
								break;
							}
						}
						pPin->Release();
					}
					pEnum->Release();
				}
			}
			
			pF->Release(); 
		} 
		return hr; 
} 

HRESULT RenderAVI(LPCTSTR szFilePath,IGraphBuilder * gb)
{
	LPCTSTR szExt = _tcsrchr(szFilePath,'.');//过滤avi文件
	if(!szExt)
	{
		return E_FAIL;
	}
	++szExt;
	if(_tcsicmp(szExt,_T("avi"))!=0) return E_INVALIDARG;
	USES_CONVERSION;
	const GUID CLSID_AviSource={0xCEA8DEFF,0x0AF7,0x4DB9,{0x9A,0x38,0xFB,0x3C,0x3A,0xEF,0xC0,0xDE}};
	CComPtr<IBaseFilter> spAviSource;
	HRESULT hr = AddSourceByFilterCLSID(gb,CLSID_AviSource,L"SOURCE FILTER",T2W(szFilePath));
	if(spAviSource==NULL) return hr;
/*	CComQIPtr<IFileSourceFilter> FileSource(spAviSource);
	hr = FileSource->Load(T2W(szFilePath),NULL);
	if(FAILED(hr)) return hr;
	CComPtr<IEnumPins> ep;
	hr = spAviSource->EnumPins(&ep);
	if(FAILED(hr)) return hr;
	CComPtr<IPin> pin;
	DWORD dwCount;
	int i = 0;
	for(;;)
	{
		dwCount = 0;
		hr = ep->Next(1,&pin,&dwCount);
		if(hr!=NOERROR)
		{
			if(i) hr = NOERROR;
			break;
		}
		hr = gb->Render(pin);
		if(hr==NOERROR) ++i;
		pin = NULL;
	}
	return hr;*/
	return NOERROR;
}

void CTestFilterDlg::OnButton4() 
{
	// TODO: Add your control notification handler code here
	CoInitialize(NULL);
    HRESULT	hr = CoCreateInstance(CLSID_FilterGraph,
		NULL,
		CLSCTX_INPROC_SERVER,
		IID_IGraphBuilder,
		(void **)&pigb);
	   pigb->QueryInterface(IID_IMediaControl, (void **)&pimc);
	   pigb->QueryInterface(IID_IMediaEventEx, (void **)&pimex);
       pigb->QueryInterface(IID_IMediaSeeking, (void **)&pims);
	   pigb->QueryInterface(IID_IVideoWindow, (void **)&pivw);
	  // hr = pigb->RenderFile(L"d:\\temp\\bmw.MPG", NULL);//
      hr = RenderAVI("F:\\FFOutput\\ff640480.avi",pigb);

      if (hr)
      {
		  MessageBox("ERR RENDERAVI!");
      }

	   HWND m_hwndScreen = m_Screen2.GetSafeHwnd();
	   
	   RECT rc;

	   hr = pivw->put_Owner((OAHWND)m_hwndScreen);
	   hr = pivw->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
	   m_Screen2.GetClientRect(&rc);
	   hr = pivw->SetWindowPosition(0, 0, (rc.right), (rc.bottom));
	   hr = pivw->put_Visible(OATRUE);//*/
	   hr = pimc->Run();
}


相关文章
|
10月前
|
STM32F103标准外设库——GPIO 输入、输出 (五)
STM32F103标准外设库——GPIO 输入、输出 (五)
521 0
STM32F103标准外设库——GPIO 输入、输出 (五)
【STM32】引脚GPIO批量操作数组&for循环流水灯
【STM32】引脚GPIO批量操作数组&for循环流水灯
1001 0
树莓派gpio指令问题:找不到指令和不能识别板子类型
安装wiringpi库之后,运行gpio readall,想查看一下引脚状态。但是出现下面的错误提示:Oops – unable to determine board type… model: 17,字面意思就是没有识别板子类型。错误提示:找不到该指令,也是同样的解决方法。
742 0
No.8 STM32F429IGT6 USART串口初始化结构体 总结
No.8 STM32F429IGT6 USART串口初始化结构体 总结
STM32读取BH1750光照强度数据打印到串口
BH1750是一种数字式环境光强度传感器(Digital Light Sensor),也称为其他名称,例如GY-302传感器、BH1750FVI传感器等。它的工作原理是通过收集光线照射到传感器上的量来测量环境亮度。
342 0
STM32的GPIO输入与输出
STM32的GPIO输入与输出
98 0
【STM32】USART串口重映射 & 打印输出printf标识符
【STM32】USART串口重映射 & 打印输出printf标识符
292 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等