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

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

类定义:

 

  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、付费专栏及课程。

余额充值