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

来源:互联网 发布:从ncbi下载转录组数据 编辑:程序博客网 时间:2024/04/29 08:02

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

类定义:

 

view plain copy to clipboard print ?
  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. };  
view plain
  1. //=============================================================================  
  2. //  
  3.  名 称 : zp_Gate.h  
  4. // 功 能 : Filter, 输入Pin, 输出Pin 3个类的类定义  
  5. //  
  6. //      这几个类主要示范了如何从CBaseFilter, CBaseInputPin, CBaseOutputPin这3个  
  7. //  类派生出自已需要的Filter及Pin类. 这3个类的实现已经几乎是最简单的了, 只实现了  
  8. //  必须实现的方法. 同样地, 这个Filter的功能也相当简单, 对于数据流相当于是透明的,  
  9. //  只是简单地转发一下sample, 不进行任何操作. 它有2个Pin, 一个输入Pin, 一输出Pin,  
  10. //  这两个Pin上的数据和媒体类型当然, 也是完全一样的.  
  11. //  
  12. // 开发者: blackboycpp@gmail.com  
  13. // 更新于: 2009-11-24 15:34:54  
  14. // 备 注 :  
  15. //=============================================================================  
  16. #pragma  
  17.  once  
  18. // the GUID of the filter  
  19. // {1B0FFB65-DB1A-494f-8748-046970465B86}  
  20. DEFINE_GUID(CLSID_Gate,   
  21.     0x1b0ffb65, 0xdb1a, 0x494f, 0x87, 0x48, 0x4, 0x69, 0x70, 0x46, 0x5b,   
  22. 0x86);  
  23. class  CGate;  
  24. class  CDataOut;  
  25. // 功 能 : 输入Pin类  
  26. // 更新于: 2009-11-24 15:36:13  
  27. // 备 注 :   
  28. class CDataIn : public CBaseInputPin  
  29. {  
  30. friend class  CDataOut;  
  31. public:  
  32.     CDataIn(TCHAR* pObjName,  
  33.         CGate* pFilter,  
  34.         HRESULT* phr,  
  35.         LPCWSTR pPinName);  
  36.     virtual ~CDataIn();  
  37. public:  
  38.     // 连接时检查媒体类型  
  39.     HRESULT  CheckMediaType(const CMediaType *pmt);  
  40.     STDMETHODIMP  EndOfStream();  
  41.     STDMETHODIMP  BeginFlush();  
  42.     STDMETHODIMP  EndFlush();  
  43.     // 从流中接收下一个Sample  
  44.     STDMETHODIMP  Receive(IMediaSample *pSample);  
  45. private:  
  46.     CGate*   m_pGate;   // 所在的Filter  
  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. class CGate : public CCritSec, public CBaseFilter  
  78. {  
  79. friend class  CDataIn;  
  80. friend class  CDataOut;  
  81. public:  
  82.     CGate(TCHAR* pName, LPUNKNOWN pUnk, HRESULT* hr);  
  83. public:  
  84.     virtual ~CGate(void);  
  85. public:  
  86.     static CUnknown*  WINAPI  CreateInstance(LPUNKNOWN pUnk, HRESULT* phr);  
  87.       
  88.     CBasePin*   GetPin(int n);  // 获得指定Pin  
  89.     int         GetPinCount();  // 获得Pin数量  
  90. private:  
  91.     CDataIn*        m_pInputPin;    // 输入Pin  
  92.     CDataOut*       m_pOutputPin;   // 输入Pin  
  93. };  
 

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

实现:

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

FilterGraph里测试: