DirectX:在graph自己主动连线中增加自己定义filter(graph中遍历filter)
为客户提供的视频播放的filter的測试程序中,採用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791)。因为不同的视频压缩格式,导致这样的方式的缺点是不能及时的播放随意的视频文件。如今,採用在自己主动连线的graph中加入自己的filter:
步骤例如以下:
1. 构建自己主动连线graph。
2. 在graph中查找render filter;
3.在renderf ilter上查找输入m_r_in_pin的上位连接m_n_out_pin
4. 断开render pin和上位连接pin
5.加入自己定义filter,获取输入输出m_my_in_pin,m_my_out_pin
6.连接pin:m_n_out_pin-->m_my_in_pin,m_my_out_pin->m_r_in_pin
7.run
待完好:眼下的程序在找到Render filtre后,没有推断输入的类型,眼下仅支持RGB32的输入。假设是yuv的是另外一个filter
IGraphBuilder *pigb = NULL;
IMediaControl *pimc = NULL;
IMediaEventEx *pimex = NULL;
IVideoWindow *pivw = NULL;
IMediaSeeking *pims = NULL;
ICaptureGraphBuilder2 * g_pCaptureBuilder = NULL; //graph中枚举全部的filter
HRESULT FindFilterInterface(
IGraphBuilder *pGraph, // Pointer to the Filter Graph Manager.
REFGUID iid, // IID of the interface to retrieve.
void **ppUnk) // Receives the interface pointer.
{
if (!pGraph || !ppUnk) return E_POINTER; HRESULT hr = E_FAIL;
IEnumFilters *pEnum = NULL;
IBaseFilter *pF = NULL;
if (FAILED(pGraph->EnumFilters(&pEnum)))
{
return E_FAIL;
}
// Query every filter for the interface.
while (S_OK == pEnum->Next(1, &pF, 0))
{
hr = pF->QueryInterface(iid, ppUnk);
pF->Release();
if (SUCCEEDED(hr))
{
FILTER_INFO *fin=new FILTER_INFO();
hr = pF->QueryFilterInfo(fin);
////////wchar --->char
char *m_char;
int len= WideCharToMultiByte(CP_ACP,0,fin->achName,wcslen(fin->achName),NULL,0,NULL,NULL);
m_char=new char[len+1];
WideCharToMultiByte(CP_ACP,0,fin->achName,wcslen(fin->achName),m_char,len,NULL,NULL);
m_char[len]='\0';
MessageBox(NULL,m_char,"",NULL);//显示当前查到的filter的名称
if (strstr(m_char,"Render")!=NULL)
{//枚举graph中的filter。查找到Render filter
break;
}
//////// }
}
pEnum->Release();
return hr;
} void CTestDlg::OnButton1()
{
HRESULT hr; //构建graph
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_FilterGraph,
NULL,
CLSCTX_INPROC_SERVER,
IID_IGraphBuilder,
(void **)&pigb);
hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
IID_ICaptureGraphBuilder2, (void **) &g_pCaptureBuilder);
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 = g_pCaptureBuilder->SetFiltergraph(pigb); //构建graph //打开视频文件jpg。bmp,avi。mpg......///////////////////////////
CString strFilename;//
CFileDialog openBox(TRUE,NULL,"",OFN_HIDEREADONLY,"bmp(*.bmp)|*.bmp|jpg(*.jpg)|*.jpg|avi(*.avi)|*.avi|mpg(*.mpg)|*.mpg|ALLFiles(*.*)|*.*||",NULL);
openBox.m_ofn.lpstrTitle="打开数据文件";
INT_PTR nResult = openBox.DoModal();
// 假设文件打开则准备播放
if (nResult == IDOK)
{
strFilename=openBox.GetPathName();
}
else
{
return;
}
strFilename.ReleaseBuffer();
//cstring 转 LPCSTR
USES_CONVERSION;
LPWSTR pwStr=new wchar_t[strFilename.GetLength()+1];
wcscpy(pwStr,T2W((LPCTSTR)strFilename)); //////////////////////////////////////////////////////////////////////
hr = pigb->RenderFile(pwStr, NULL);// #if 1 //////找到Render filter 并获取Render filter的输入pin
IBaseFilter *pRenderFilter;
hr = FindFilterInterface(pigb,IID_IBaseFilter,(void **)&pRenderFilter);
hr = pigb->AddFilter(pRenderFilter,L"ffdshow Video Render ");
IPin *pIn_Render = 0;
hr = g_pCaptureBuilder->FindPin(pRenderFilter,PINDIR_INPUT,NULL,NULL,FALSE,0,&pIn_Render);
if(FAILED(hr))
{
MessageBox("err10");
}
#endif
#if 1 //////查询Render的上一个filter
IEnumFilters *pEnum = NULL;
IPin *pPinNext = 0;
hr = pigb->EnumFilters(&pEnum);
//IBaseFilter *pF; // Pointer to some filter.
IBaseFilter *pUpstream = NULL;
PIN_DIRECTION ThisPinDir;
hr = pIn_Render->QueryDirection(&ThisPinDir);
if (SUCCEEDED(hr))
{ if (ThisPinDir==PINDIR_INPUT)
{
hr = pIn_Render->ConnectedTo(&pPinNext);
if (SUCCEEDED(hr))
{
// Get the filter that owns that pin.
PIN_INFO PinInfo;
hr = pPinNext->QueryPinInfo(&PinInfo);
pPinNext->Release();
if (FAILED(hr) || (PinInfo.pFilter == NULL))
{
MessageBox("err GetNextFilter3");
}
pUpstream = PinInfo.pFilter; // Client must release. }
else
{
MessageBox("err GetNextFilter4");
}
} else
{
MessageBox("err GetNextFilter1");
}
}
else
{
MessageBox("err GetNextFilter2");
} #endif #if 1
///// 加入自己定义特效filter ///////////////////////////////////////////////
IBaseFilter *peffect;//---871E-AB91661A4EF7
const GUID CLSID_EFFECT={0x8b498501, 0x1218, 0x11cf,{ 0xad, 0xc4, 0x0, 0xa0, 0xd1, 0x0, 0x4, 0x1b}};
hr = CoCreateInstance(CLSID_EFFECT,NULL,CLSCTX_ALL,IID_IBaseFilter,(void **)&peffect);
hr = pigb->AddFilter(peffect,L"Image effect "); IPin *pIn_peffect = 0;
IPin *pOut_peffect = 0;
hr = g_pCaptureBuilder->FindPin(peffect,PINDIR_INPUT,NULL,NULL,FALSE,0,&pIn_peffect);
if(FAILED(hr))
{
MessageBox("err11");
}
hr = g_pCaptureBuilder->FindPin(peffect,PINDIR_OUTPUT,NULL,NULL,FALSE,0,&pOut_peffect);
if(FAILED(hr))
{
MessageBox("err12");
}
peffect->Release();
#endif
//断开以取得自己主动连接
pPinNext->Disconnect();
pIn_Render->Disconnect();
#if 1
//又一次连接
hr = pigb->Connect(pPinNext, pIn_peffect);
if(FAILED(hr))
{
MessageBox("err19");
}
hr = pigb->Connect(pOut_peffect, pIn_Render);
if(FAILED(hr))
{
MessageBox("err20");
}
#endif
//设置显示区域
HWND m_hwndScreen = m_Screen.GetSafeHwnd();
RECT rc;
hr = pivw->put_Owner((OAHWND)m_hwndScreen);
hr = pivw->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
m_Screen.GetClientRect(&rc);
hr = pivw->SetWindowPosition(0, 0, (rc.right), (rc.bottom)); //播放
hr = pimc->Run(); }
DirectX:在graph自己主动连线中增加自己定义filter(graph中遍历filter)的更多相关文章
- 在visual studio工程设置中增加宏定义的方法
		
在Solution Explorer中鼠标右键点击其project之后,Configuration(Release)->Configuration Propertity ->C++ -&g ...
 - c语言中数组的定义和java中数组定义的一些区别
		
感谢原文:https://blog.csdn.net/gzwdz778/article/details/79799408 一维情况下: c中,数组的声明需要给出数组的维数,比如: int arr[5] ...
 - linux shell 中数组的定义和for循环遍历的方法
		
linux 中定义一个数据的语法为: variable=(arg1 arg2 arg3 ....) 中间用空格分开.数组的下标从0开始. 1 获取下标为n的元素: variable[n] 而且不存在数 ...
 - [Effective JavaScript 笔记]第47条:绝不要在Object.prototype中增加可枚举的属性
		
之前的几条都不断地重复着for...in循环,它便利好用,但又容易被原型污染.for...in循环最常见的用法是枚举字典中的元素.这里就是从侧面提出不要在共享的Object.prototype中增加可 ...
 - 在Oracle Spatial中增加Web Mercator投影坐标系
		
参考资料: 1. 最重要的参考文章,基本上就是按这个做的!!!:https://www.inf.unibz.it/dis/wiki/doku.php?id=students:minnerebner:o ...
 - DirectX:在graph自动连线中加入自定义filter(graph中遍历filter)
		
为客户提供的视频播放的filter的测试程序中,采用正向手动连接的方式(http://blog.csdn.net/mao0514/article/details/40535791),由于不同的视频压缩 ...
 - Arduino下LCD1602综合探究(下)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法
		
一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduin ...
 - 简述C#中IO的应用  RabbitMQ安装笔记  一次线上问题引发的对于C#中相等判断的思考  ef和mysql使用(一)  ASP.NET/MVC/Core的HTTP请求流程
		
简述C#中IO的应用 在.NET Framework 中. System.IO 命名空间主要包含基于文件(和基于内存)的输入输出(I/O)服务的相关基础类库.和其他命名空间一样. System.I ...
 - tensorflow中创建多个计算图(Graph)
		
tf程序中,系统会自动创建并维护一个默认的计算图,计算图可以理解为神经网络(Neural Network)结构的程序化描述.如果不显式指定所归属的计算图,则所有的tensor和Operation都是在 ...
 
随机推荐
- 关于史考特证券(scottrade Inc)资金转出的手续费问题
			
投资美股账户的朋友可能开始的时候并没有关心史考特账户转出的费用,其实,仔细算一下这个费用还是蛮贵的,根据官网的文档可以明确知道,转出史考特账户资金到国内银行的费用由以下几项组成: 1. 国际电汇资金费 ...
 - 通讯框架 t-io 学习——websocket 部分源码解析
			
前言 前端时间看了看t-io的websocket部分源码,于是抽时间看了看websocket的握手和他的通讯机制.本篇只是简单记录一下websocket握手部分. WebSocket握手 好多人都用过 ...
 - 基于gitHub+hexo搭建的个人博客
			
文章导航 前期准备 安装hexo 修改hexo主题 自定义主题 部署本地文件到github查看 我的第一篇博客 前期准备 下载安装git命令行工具.node及npm环境 注册自己的GitHub账号 安 ...
 - 翻译连载 | 第 11 章:融会贯通 -《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
			
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
 - <p></p>标签为什么不能包含块级标签?还有哪些特殊的HTML标签?
			
最近,在码代码的时候,就是下面的这段代码,我犯了一个很不起眼,但犯了就致命的BUG. <body> <p> <ol> <li>Hello</li& ...
 - Python之作用域
			
作用域测试例子: >>> a = 10 >>> def test(): ... a = 20 ... print a ... >>> a 10 & ...
 - C语言之逆序数
			
#include<stdio.h>int main(){int num;int a,b,c,result,d,result1;scanf("%d",&num); ...
 - put()
			
put() 作用: 将集合的所有键名和值,存放在一个集合对象中. public Map selectSingleData(String sql,Object...obj) throws SQLExc ...
 - 【设计模式系列】之OO面向对象设计七大原则
			
1 概述 本章叙述面向向对象设计的七大原则,七大原则分为:单一职责原则.开闭原则.里氏替换原则.依赖倒置原则.接口隔离原则.合成/聚合复用原则.迪米特法则. 2 七大OO面向对象设计 2.1 单一 ...
 - Model中设置表单验证方法
			
Model类里面定义$_validate属性支持的验证因子格式: 格式:array(验证字段,验证规则,错误提示,验证条件,附加规则,验证时间). 验证条件: (1)Model::EXISTS_TO_ ...