使用CBaseFilter, CBaseInputPin和CBaseOutputPin写一个简单的Filter

原文地址: http://blog.csdn.net/blackboyofsnp/article/details/4877305

原文作者 : blackboycpp(AT)gmail.com

类定义:

  

  1. //=============================================================================  
  2. // 名 称 : zp_Gate.h  
  3. // 功 能 : Filter, 输入Pin, 输出Pin 3个类的类定义  
  4. //  
  5. //      这几个类主要示范了如何从CBaseFilter, CBaseInputPin, CBaseOutputPin这3个  
  6. //  类派生出自已需要的Filter及Pin类. 这3个类的实现已经几乎是最简单的了, 只实现了  
  7. //  必须实现的方法. 同样地, 这个Filter的功能也相当简单, 对于数据流相当于是透明的,  
  8. //  只是简单地转发一下sample, 不进行任何操作. 它有2个Pin, 一个输入Pin, 一输出Pin,  
  9. //  这两个Pin上的数据和媒体类型当然, 也是完全一样的.  
  10. //  
  11. // 开发者: blackboycpp@gmail.com  
  12. // 更新于: 2009-11-24 15:34:54  
  13. // 备 注 :  
  14. //=============================================================================  
  15. #pragma once  
  16.   
  17. // the GUID of the filter  
  18. // {1B0FFB65-DB1A-494f-8748-046970465B86}  
  19. DEFINE_GUID(CLSID_Gate,   
  20.     0x1b0ffb65, 0xdb1a, 0x494f, 0x87, 0x48, 0x4, 0x69, 0x70, 0x46, 0x5b, 0x86);  
  21.   
  22. class  CGate;  
  23. class  CDataOut;  
  24. // 功 能 : 输入Pin类  
  25. // 更新于: 2009-11-24 15:36:13  
  26. // 备 注 :   
  27. class CDataIn : public CBaseInputPin  
  28. {  
  29. friend class  CDataOut;  
  30. public:  
  31.     CDataIn(TCHAR* pObjName,  
  32.         CGate* pFilter,  
  33.         HRESULT* phr,  
  34.         LPCWSTR pPinName);  
  35.     virtual ~CDataIn();  
  36. public:  
  37.     // 连接时检查媒体类型  
  38.     HRESULT  CheckMediaType(const CMediaType *pmt);  
  39.     STDMETHODIMP  EndOfStream();  
  40.     STDMETHODIMP  BeginFlush();  
  41.     STDMETHODIMP  EndFlush();  
  42.     // 从流中接收下一个Sample  
  43.     STDMETHODIMP  Receive(IMediaSample *pSample);  
  44. private:  
  45.     CGate*   m_pGate;   // 所在的Filter  
  46. };  
  47.   
  48. // 功 能 : 输出Pin类  
  49. // 更新于: 2009-11-24 15:37:55  
  50. // 备 注 :   
  51. class CDataOut : public CBaseOutputPin  
  52. {  
  53. friend class  CDataIn;  
  54. public:  
  55.     CDataOut(TCHAR* pObjName,   
  56.         CGate* pFilter,  
  57.         HRESULT* phr,  
  58.         LPCWSTR pPinName);  
  59.     virtual ~CDataOut();  
  60. public:  
  61.     // 枚举首选的媒体类型  
  62.     STDMETHODIMP  EnumMediaTypes( IEnumMediaTypes **ppEnum);  
  63.     HRESULT  CheckMediaType(const CMediaType* pmt);  
  64.     HRESULT  DecideBufferSize( IMemAllocator * pAlloc,   
  65.                 ALLOCATOR_PROPERTIES * ppropInputRequest);  
  66.     HRESULT  Active();  
  67.     HRESULT  Inactive();  
  68.     // 将Sample交到下级输入Pin  
  69.     HRESULT  Deliver(IMediaSample* pMediaSample);  
  70.     HRESULT  DeliverBeginFlush();  
  71.     HRESULT  DeliverEndFlush();  
  72.     HRESULT  DeliverEndOfStream();  
  73. private:  
  74.     CGate*   m_pGate;   // 所在的Filter  
  75.     COutputQueue*  m_pOutQueue;  
  76. };  
  77.   
  78. class CGate : public CCritSec, public CBaseFilter  
  79. {  
  80. friend class  CDataIn;  
  81. friend class  CDataOut;  
  82. public:  
  83.     CGate(TCHAR* pName, LPUNKNOWN pUnk, HRESULT* hr);  
  84. public:  
  85.     virtual ~CGate(void);  
  86. public:  
  87.     static CUnknown*  WINAPI  CreateInstance(LPUNKNOWN pUnk, HRESULT* phr);  
  88.       
  89.     CBasePin*   GetPin(int n);  // 获得指定Pin  
  90.     int         GetPinCount();  // 获得Pin数量  
  91. private:  
  92.     CDataIn*        m_pInputPin;    // 输入Pin  
  93.     CDataOut*       m_pOutputPin;   // 输入Pin  
  94. };  
 

 

-----------------------

 

实现:

  1. //=============================================================================  
  2. // 名 称 : zp_Gate.cpp  
  3. // 功 能 : CGate, CDataIn, CDataOut 3个类的实现  
  4. // 开发者: blackboycpp@gmail.com  
  5. // 更新于: 2009-11-24 16:02:17  
  6. // 备 注 :  
  7. //   
  8. //=============================================================================  
  9. #include "stdafx.h"  
  10. #include "zp_Gate.h"  
  11. //#include "zp_utl.h"  
  12. #ifdef _MANAGED  
  13. #pragma managed(push, off)  
  14. #endif  
  15.   
  16. #pragma  warning(disable:4355 4127)  
  17. const AMOVIESETUP_MEDIATYPE  sudPinTypes =  
  18. {  
  19.     &MEDIATYPE_NULL,    // Major type  
  20.     &MEDIASUBTYPE_NULL  // Minor type  
  21. };  
  22. const  AMOVIESETUP_PIN psudPins[] =  
  23. {  
  24.     {  
  25.         L"Input",       // Pin名字字符串  
  26.         FALSE,          // 是否被render  
  27.         FALSE,          // 是否输出  
  28.         FALSE,          // 允许为空  
  29.         FALSE,          // 允许多个  
  30.         &CLSID_NULL,    // 连接到Filter  
  31.         L"Output",      // 连接到Pin  
  32.         1,              // 媒体类型数量  
  33.         &sudPinTypes    // Pin信息      
  34.     },  
  35.     {  
  36.         L"Output",  
  37.         FALSE,  
  38.         TRUE,  
  39.         FALSE,  
  40.         FALSE,  
  41.         &CLSID_NULL,  
  42.         L"Input",  
  43.         1,  
  44.         &sudPinTypes  
  45.     }  
  46. };  
  47. const AMOVIESETUP_FILTER  sudGate =  
  48. {  
  49.     &CLSID_Gate,    // Filetr的CLSID  
  50.     L"Gate",        // Filter的名字  
  51.     MERIT_DO_NOT_USE,   // Filter的Merit  
  52.     2,                  // Pin数量  
  53.     psudPins            // Pin信息  
  54. };  
  55. CFactoryTemplate g_Templates [1] =  
  56. {  
  57.     {  
  58.         L"Gate",  
  59.         &CLSID_Gate,  
  60.         CGate::CreateInstance,  
  61.         NULL,  
  62.         &sudGate  
  63.     }  
  64. };  
  65. int  g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);  
  66. STDAPI  DllRegisterServer()  
  67. {  
  68.     return  AMovieDllRegisterServer2(TRUE);  
  69. }  
  70. STDAPI  DllUnregisterServer()  
  71. {  
  72.     return  AMovieDllRegisterServer2(FALSE);  
  73. }  
  74. extern  "C"  BOOL  WINAPI  DllEntryPoint(HINSTANCEULONGLPVOID);  
  75. BOOL APIENTRY DllMain( HMODULE hModule,  
  76.                       DWORD  ul_reason_for_call,  
  77.                       LPVOID lpReserved  
  78.                       )  
  79. {  
  80.     return  DllEntryPoint((HINSTANCE)(hModule), ul_reason_for_call, lpReserved);  
  81. }  
  82.   
  83. //  
  84. CDataIn::CDataIn(TCHAR* pObjName,   
  85.                    CGate* pFilter,   
  86.                    HRESULT* phr,   
  87.                    LPCWSTR pPinName)  
  88.     : CBaseInputPin(pObjName, pFilter, pFilter, phr, pPinName),  
  89.     m_pGate(pFilter)  
  90. {  
  91.     ASSERT(pFilter);  
  92. }  
  93.   
  94. CDataIn::~CDataIn()  
  95. {  
  96.       
  97. }  
  98. HRESULT  CDataIn::CheckMediaType(const CMediaType *pmt)  
  99. {  
  100.     CAutoLock  lockit(m_pLock);  
  101.     // TODO:  
  102.     return  NOERROR;  
  103. }  
  104.   
  105. STDMETHODIMP  CDataIn::EndOfStream()  
  106. {  
  107.     CAutoLock lockit(m_pLock);  
  108.     HRESULT  hr = NOERROR;  
  109.     CDataOut*  pOutPin = m_pGate->m_pOutputPin;  
  110.     if(pOutPin != NULL)   
  111.     {  
  112.         hr = pOutPin->DeliverEndOfStream();  
  113.         if(FAILED(hr))  return hr;  
  114.     }  
  115.     return  NOERROR;  
  116. }  
  117.   
  118. HRESULT  CDataIn::BeginFlush()  
  119. {  
  120.     CAutoLock  lockit(m_pLock);  
  121.     // TODO:  
  122.     HRESULT  hr = m_pGate->m_pOutputPin->DeliverBeginFlush();  
  123.     if(FAILED(hr))  return hr;  
  124.     return  CBaseInputPin::BeginFlush();  
  125. }  
  126.   
  127. HRESULT  CDataIn::EndFlush()  
  128. {  
  129.     CAutoLock  lockit(m_pLock);  
  130.     // TODO:  
  131.     HRESULT  hr = m_pGate->m_pOutputPin->DeliverEndFlush();  
  132.     if(FAILED(hr))  return hr;  
  133.     return  CBaseInputPin::EndFlush();  
  134. }  
  135.   
  136. HRESULT  CDataIn::Receive(IMediaSample *pSample)  
  137. {  
  138.     ASSERT(pSample);  
  139.     CAutoLock  lockit(m_pLock);  
  140.     HRESULT  hr = NOERROR;  
  141.     hr = CBaseInputPin::Receive(pSample);  
  142.     if(FAILED(hr))  return hr;  
  143.     // TODO:  
  144.     hr = m_pGate->m_pOutputPin->Deliver(pSample);  
  145.     if(FAILED(hr))  return hr;  
  146.     return  NOERROR;  
  147. }  
  148. //  
  149. CDataOut::CDataOut(TCHAR* pObjName,   
  150.                      CGate* pFilter,   
  151.                      HRESULT* phr,   
  152.                      LPCWSTR pPinName)  
  153.         : CBaseOutputPin(pObjName, pFilter, pFilter, phr, pPinName),  
  154.         m_pGate(pFilter)  
  155. {  
  156.     ASSERT(pFilter);  
  157.     m_pOutQueue = NULL;  
  158. }  
  159. CDataOut::~CDataOut()  
  160. {  
  161. }  
  162.   
  163. HRESULT  CDataOut::CheckMediaType(const CMediaType* pmt)  
  164. {  
  165.     CAutoLock  lockit(m_pLock);  
  166.     // TODO:  
  167.     HRESULT hr = NOERROR;  
  168.     if(m_pGate->m_pInputPin->m_Connected == NULL) return  VFW_E_NOT_CONNECTED;  
  169.     hr = m_pGate->m_pInputPin->m_Connected->QueryAccept(pmt);  
  170.     if(hr != NOERROR)   return VFW_E_TYPE_NOT_ACCEPTED;  
  171.     return  NOERROR;  
  172. }  
  173.   
  174. STDMETHODIMP  CDataOut::EnumMediaTypes(IEnumMediaTypes **ppEnum)  
  175. {  
  176.     CAutoLock  lockit(m_pLock);  
  177.     ASSERT(ppEnum);  
  178.     if(m_pGate->m_pInputPin->m_Connected == NULL) return  VFW_E_NOT_CONNECTED;  
  179.     return  m_pGate->m_pInputPin->m_Connected->EnumMediaTypes(ppEnum);  
  180. }  
  181.   
  182. HRESULT  CDataOut::DecideBufferSize(IMemAllocator * pAlloc,   
  183.                                      ALLOCATOR_PROPERTIES * ppropInputRequest)  
  184. {  
  185.     return  NOERROR;  
  186. }  
  187.   
  188. HRESULT  CDataOut::Deliver(IMediaSample* pMediaSample)  
  189. {  
  190.     CheckPointer(pMediaSample, E_POINTER);  
  191.     // TODO:  
  192.     if(m_pOutQueue == NULL)     return NOERROR;  
  193.     pMediaSample->AddRef();  
  194.     // TODO:  
  195.     return  m_pOutQueue->Receive(pMediaSample);  
  196. }  
  197.   
  198. HRESULT  CDataOut::Active()  
  199. {  
  200.     CAutoLock  lockit(m_pLock);  
  201.     HRESULT  hr = NOERROR;  
  202.     if(m_Connected == NULL) return  NOERROR;  
  203.     if(m_pOutQueue == NULL)  
  204.     {  
  205.         m_pOutQueue = new COutputQueue(m_Connected, &hr, TRUE, FALSE);  
  206.         if(m_pOutQueue == NULL) return E_OUTOFMEMORY;  
  207.         if(FAILED(hr))  
  208.         {  
  209.             delete m_pOutQueue;  
  210.             m_pOutQueue = NULL;  
  211.             return  hr;  
  212.         }  
  213.     }  
  214.     CBaseOutputPin::Active();  
  215.     return  NOERROR;  
  216. }  
  217.   
  218. HRESULT  CDataOut::Inactive()  
  219. {  
  220.     CAutoLock  lockit(m_pLock);  
  221.     if(m_pOutQueue)  
  222.     {  
  223.         delete m_pOutQueue;  
  224.         m_pOutQueue = NULL;  
  225.     }  
  226.     CBaseOutputPin::Inactive();  
  227.     return  NOERROR;  
  228. }  
  229. HRESULT  CDataOut::DeliverEndOfStream()  
  230. {  
  231.     if(m_pOutQueue == NULL) return NOERROR;  
  232.     m_pOutQueue->EOS();  
  233.     return  NOERROR;  
  234. }  
  235. HRESULT  CDataOut::DeliverBeginFlush()  
  236. {  
  237.     if(m_pOutQueue == NULL) return NOERROR;  
  238.     m_pOutQueue->BeginFlush();  
  239.     return  NOERROR;  
  240. }  
  241. HRESULT  CDataOut::DeliverEndFlush()  
  242. {  
  243.     if(m_pOutQueue == NULL) return NOERROR;  
  244.     m_pOutQueue->EndFlush();  
  245.     return  NOERROR;  
  246. }  
  247.   
  248. //  
  249.   
  250. CUnknown* WINAPI  CGate::CreateInstance(LPUNKNOWN pUnk, HRESULT* phr)  
  251. {  
  252.     return new CGate(NAME("Gate"), pUnk, phr);  
  253. }  
  254. CGate::CGate(TCHAR* pName, LPUNKNOWN pUnk, HRESULT* phr) :   
  255.     CBaseFilter(NAME("Gate"), pUnk, this, CLSID_Gate)  
  256. {  
  257.     m_pInputPin = new CDataIn(NAME("Input Pin"), this, phr, L"Input");  
  258.     m_pOutputPin = new CDataOut(NAME("Output Pin"), this, phr, L"Output");  
  259. }  
  260. CGate::~CGate()  
  261. {  
  262.     if(m_pInputPin != NULL)  
  263.     {  
  264.         delete m_pInputPin;  
  265.     }  
  266.     if(m_pOutputPin != NULL)  
  267.     {  
  268.         delete m_pOutputPin;  
  269.     }  
  270. }     
  271.   
  272. CBasePin*  CGate::GetPin(int n)  
  273. {  
  274.     if(n < 0)    return NULL;  
  275.     else if(n == 0) return m_pInputPin;  
  276.     else if(n == 1) return m_pOutputPin;  
  277.     else return NULL;  
  278. }  
  279. int  CGate::GetPinCount()  
  280. {  
  281.     return  2;  
  282. }  
  283.   
  284. #ifdef _MANAGED  
  285. #pragma managed(pop)  
  286. #endif  
 

 

 

FilterGraph里测试:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值