查找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();
}


相关文章
|
安全 Java 程序员
Spring框架的核心特性是什么?
【4月更文挑战第30天】Spring 的特性
1053 0
|
安全 网络安全 数据安全/隐私保护
HTTPS中的加密算法
HTTPS中的加密算法
网页编辑Office Word文档,开启修订功能,启用留痕、显示留痕并接受留痕
在日常办公环境场景下,有时候会遇到帮助他人修改文档或者为文档提供修改意见,如果我们在文档中直接修改,其他人很不容易看到我们修改了哪个部分,如果一旦你的修改意见不被采纳,原作者还需要恢复原来的文档,这样为别人带来了更多的工作。 如果用猿大师办公助手在网页中编辑Office Word文档,开启修订功能,启用留痕、显示留痕并接受留痕,就可以很好的来解决此问题。
724 93
|
机器学习/深度学习 PyTorch 算法框架/工具
通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
通过实例学习Pytorch加载权重.load_state_dict()与保存权重.save()
295 0
|
Linux Shell 开发工具
Linux 下通过nvm 安装node,并进行版本管理
Linux 下通过nvm 安装node,并进行版本管理
480 1
|
Linux 数据安全/隐私保护
Mac连接linux的办法(自带终端和iterm2)
Mac连接linux的办法(自带终端和iterm2)
|
编解码 小程序 算法
自己动手写RTP服务器——关于RTP协议
本文会带领着你一步步动手实现一个简单的RTP传输服务器,旨在了解RTP流媒体传输协议以及一些关于多媒体编解码的知识。   关于RTP协议的必备知识 要动手实现一个协议,当然首先需要阅读该协议的文档。
2054 0
|
小程序 数据格式
微信小程序事件通道使用教程
微信小程序事件通道使用教程
|
前端开发 JavaScript 开发者
【chatgpt谈前端三大主流框架】React、Vue和Angular的优缺点及如何选择
chatgpt号称无所不能,今天我们就来考考他,让他来对比下React、Vue和Angular。
586 0
|
JavaScript Android开发 Windows
OpenHarmony应用开发之全局配置参数解析
一般的项目都有全局模块的配置,OpenHarmony系统的应用同样也有这样的一个模块config.json,类似安卓中的AndroidManifest.xml,作用是相似的,配置应用板块,带大家来进一步解析其中的参数,以下给出一般的结构,正文即将开始~~
507 0
OpenHarmony应用开发之全局配置参数解析