zoukankan      html  css  js  c++  java
  • 查找IFileSourceFilter上的Pin 分类: DirectX 2014-10-27 18:19 433人阅读 评论(0) 收藏

    创建了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();
    }


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    jmeter常用功能补充介绍
    服务器性能监控
    shell三剑客介绍及实例
    shell基础
    jmeter基本使用及基于jmeter的数据验证
    使用Loadrunner进行性能测试
    react-loadable 源码解析
    DOMException [SecurityError]: localStorage is not available for opaque origins
    mac 安装node并且安装jsdom
    python操作关系型数据库mysql pgsql返回字典类型的数据
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706490.html
Copyright © 2011-2022 走看看