一个是static CreateInstance,一个是构造函数。主要的功能都在pin中实现了。感觉pin和filter有很多完全一样的函数
比如
class CMySourceFilter
: public CSource
{
public :
//实例化接口
static CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr);
private :
//构造函数
CMySourceFilter(LPUNKNOWN lpunk, HRESULT *phr);
};
//MyOutputPin.h
class CMyOutputPin
//CSource的派生类都使用 CSourceStream的派生类做为pin
:public CSourceStream
{
public :
CMyOutputPin(HRESULT *phr, CSource *pFilter);
~CMyOutputPin(void );
HRESULT FillBuffer(IMediaSample *pMediaSample);
HRESULT DecideBufferSize(IMemAllocator *pIMemAlloc,
ALLOCATOR_PROPERTIES *pProperties);
HRESULT GetMediaType( int iPosition, CMediaType *pmt);
HRESULT CheckMediaType( const CMediaType *pMediaType);
STDMETHODIMP Notify(IBaseFilter *pSelf, Quality q)
{
return E_FAIL;
}
private :
BYTE * m_pData[3]; //存储图片数据
int m_nWidth; //图片的宽
int m_nHeight; //图片的高
int m_nImageSize; //图片数据的大小
int m_nCount; //计数器,用来切换图片数据的缓冲区
};
8 个解决方案
#1
因为基类实现了基础功能,具体的FILTER只需要关心自己需要做的东西去实现就好。
可以看下FILTER的类型介绍以及工作流程。
http://msdn.microsoft.com/en-us/library/dd373390%28v=vs.85%29
如果想知道细节,那么可以看每个Filter的基类,MSDN上也有相关的入门教程和示例。
可以看下FILTER的类型介绍以及工作流程。
http://msdn.microsoft.com/en-us/library/dd373390%28v=vs.85%29
如果想知道细节,那么可以看每个Filter的基类,MSDN上也有相关的入门教程和示例。
#2
如果将这个graph看成水流系统的话,filter是水处理中枢,pin就是管道和filter的阀门。
pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。
pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。
#3
++
#4
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗
#5
没有"重载filter"的说法,一般都是继承。
filter基本的类型了三种:
source filter——数据源,只有一个output pin,没有input pin;
transform filter——中间处理数据的filter,一个input 一个output;
sink filter(或者叫做render filter)——数据终端,流的最终到达位置,只有input,没有outpin;
这三种类型dshow都有提供接口类,直接继承就可以了.
如果你的filter是除此以外的特殊filter(我们写的filter大部分都是一进一出的transform filter)——特殊不特殊指的是pin的数量,那么你可以继承CBaseFilter,这个是所有filter类的基类。
filter类和pin类是互为友元关系,并互设为成员变量联系起来。
#6
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。
引用 4 楼 的回复:
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。
#7
推荐这个DirectShow的学习笔记,相信阅读后能解答你的大部分疑问。
http://www.bairuitech.com/upimg/soft/documents/Directshow_SDK_Notes.pdf
#8
如果你用directX自带的可视化工具graphedit的话,不需要考虑filter间的connect、pin的媒体检测和枚举、run这些问题,只要写好你的filter加载到这个工具中就行,filter的编写流程以及如何加载,dshow的自带文档都有教学。
如果是自己写底层的源代码进行filter连接,你可以去查API(IGraphBuilder、IBaseFilter这两个类),网上资料就那几篇,需要自己去研究了,建议还是用graphedit这个工具.
#1
因为基类实现了基础功能,具体的FILTER只需要关心自己需要做的东西去实现就好。
可以看下FILTER的类型介绍以及工作流程。
http://msdn.microsoft.com/en-us/library/dd373390%28v=vs.85%29
如果想知道细节,那么可以看每个Filter的基类,MSDN上也有相关的入门教程和示例。
可以看下FILTER的类型介绍以及工作流程。
http://msdn.microsoft.com/en-us/library/dd373390%28v=vs.85%29
如果想知道细节,那么可以看每个Filter的基类,MSDN上也有相关的入门教程和示例。
#2
如果将这个graph看成水流系统的话,filter是水处理中枢,pin就是管道和filter的阀门。
pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。
pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。
#3
++
#4
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗
#5
没有"重载filter"的说法,一般都是继承。
filter基本的类型了三种:
source filter——数据源,只有一个output pin,没有input pin;
transform filter——中间处理数据的filter,一个input 一个output;
sink filter(或者叫做render filter)——数据终端,流的最终到达位置,只有input,没有outpin;
这三种类型dshow都有提供接口类,直接继承就可以了.
如果你的filter是除此以外的特殊filter(我们写的filter大部分都是一进一出的transform filter)——特殊不特殊指的是pin的数量,那么你可以继承CBaseFilter,这个是所有filter类的基类。
filter类和pin类是互为友元关系,并互设为成员变量联系起来。
#6
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。
引用 4 楼 的回复:
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。
#7
推荐这个DirectShow的学习笔记,相信阅读后能解答你的大部分疑问。
http://www.bairuitech.com/upimg/soft/documents/Directshow_SDK_Notes.pdf
#8
如果你用directX自带的可视化工具graphedit的话,不需要考虑filter间的connect、pin的媒体检测和枚举、run这些问题,只要写好你的filter加载到这个工具中就行,filter的编写流程以及如何加载,dshow的自带文档都有教学。
如果是自己写底层的源代码进行filter连接,你可以去查API(IGraphBuilder、IBaseFilter这两个类),网上资料就那几篇,需要自己去研究了,建议还是用graphedit这个工具.