directshow 的filter和pin究竟是怎么回事,比如编写filter

时间:2021-01-01 18:24:43
很多时候,网上的例子,编写自己的filter,实际上是在编写该filter的pin,比如多数自定义的filter只定义了两个函数,
一个是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上也有相关的入门教程和示例。

#2


  如果将这个graph看成水流系统的话,filter是水处理中枢,pin就是管道和filter的阀门。
  pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。

#3


引用 2 楼  的回复:
如果将这个graph看成水流系统的话,filter是水处理中枢,pin就是管道和filter的阀门。
  pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。

++

#4


主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗

#5


引用 4 楼  的回复:
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗


没有"重载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(),谢谢了。

#7


引用 6 楼  的回复:
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。
……


推荐这个DirectShow的学习笔记,相信阅读后能解答你的大部分疑问。
http://www.bairuitech.com/upimg/soft/documents/Directshow_SDK_Notes.pdf

#8


引用 6 楼  的回复:
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。


如果你用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上也有相关的入门教程和示例。

#2


  如果将这个graph看成水流系统的话,filter是水处理中枢,pin就是管道和filter的阀门。
  pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。

#3


引用 2 楼  的回复:
如果将这个graph看成水流系统的话,filter是水处理中枢,pin就是管道和filter的阀门。
  pin决定了数据流的类型格式和每次允许的流量(每个sample的大小),filter可以对数据进行处理或者存储。

++

#4


主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗

#5


引用 4 楼  的回复:
主要是什么时候需要重载filter,什么时候需要重载cbasepin,还有,pin是filter的么有变量吗


没有"重载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(),谢谢了。

#7


引用 6 楼  的回复:
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。
……


推荐这个DirectShow的学习笔记,相信阅读后能解答你的大部分疑问。
http://www.bairuitech.com/upimg/soft/documents/Directshow_SDK_Notes.pdf

#8


引用 6 楼  的回复:
比如要编写个source filter,怎样打开一个函数呢,csource的什么函数呢。比如在pGraph运行run前,如何用这个filter打开一个文件,不要用默认的RenderFiler(),谢谢了。


如果你用directX自带的可视化工具graphedit的话,不需要考虑filter间的connect、pin的媒体检测和枚举、run这些问题,只要写好你的filter加载到这个工具中就行,filter的编写流程以及如何加载,dshow的自带文档都有教学。

如果是自己写底层的源代码进行filter连接,你可以去查API(IGraphBuilder、IBaseFilter这两个类),网上资料就那几篇,需要自己去研究了,建议还是用graphedit这个工具.