render.cpp
上传用户:weixiumei
上传日期:2008-05-15
资源大小:1769k
文件大小:7k
开发平台:

Visual C++

  1. //==========================================================================;
  2. //
  3. //  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  4. //  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  5. //  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  6. //  PURPOSE.
  7. //
  8. //  Copyright (c) 1992 - 2000  Microsoft Corporation.  All Rights Reserved.
  9. //
  10. //--------------------------------------------------------------------------;
  11. //
  12. // A renderer that passes the captured image buffers to the application.
  13. //
  14. //
  15. //
  16. // Files
  17. //
  18. // Render.cpp             Main implementation of the Renderer filter
  19. // Render.def             What APIs the DLL will import and export
  20. // Render.h               Class definition of the derived renderer
  21. // Render.rc              Version information for the sample DLL
  22. // Renduids.h             CLSID for the Render filter
  23. // Itrnsfer.h             ITransfer Interface declaration for callback support
  24. //
  25. // Base classes used
  26. //
  27. // CBaseFilter          Base filter class supporting IMediaFilter
  28. // CRenderedInputPin    An input pin attached to a renderer
  29. // CUnknown             Handle IUnknown for our IFileSinkFilter
  30. // CPosPassThru         Passes seeking interfaces upstream
  31. // CCritSec             Helper class that wraps a critical section
  32. //
  33. //
  34. #include <windows.h>
  35. #include <commdlg.h>
  36. // Need to add <DirectShow Media SDK>ClassesBase to the include path
  37. // so that we can include Streams.h.
  38. #include <streams.h>
  39. #include <initguid.h>
  40. #include <renduids.h>
  41. #include <itrnsfer.h>
  42. #include "render.h"
  43. //LATER - Set this in sync with the VisDSCamera's callback function.
  44. typedef HRESULT (STDAPICALLTYPE *T_PfnFrameCallback) (void *, void *);
  45. // Setup data
  46. const AMOVIESETUP_MEDIATYPE sudPinTypes =
  47. {
  48.     &MEDIATYPE_NULL,            // Major type
  49.     &MEDIASUBTYPE_NULL          // Minor type
  50. };
  51. const AMOVIESETUP_PIN sudPins =
  52. {
  53.     L"Input",                   // Pin string name
  54.     FALSE,                      // Is it rendered
  55.     FALSE,                      // Is it an output
  56.     FALSE,                      // Allowed none
  57.     FALSE,                      // Likewise many
  58.     &CLSID_NULL,                // Connects to filter
  59.     L"Output",                  // Connects to pin
  60.     1,                          // Number of types
  61.     &sudPinTypes                // Pin information
  62. };
  63. const AMOVIESETUP_FILTER sudRender =
  64. {
  65. #ifdef _DEBUG
  66.     &CLSID_RenderDB,                // Filter CLSID
  67.     L"RenderDB",                    // String name
  68. #else // _DEBUG
  69.     &CLSID_Render,                // Filter CLSID
  70.     L"Render",                    // String name
  71. #endif // _DEBUG
  72.     MERIT_DO_NOT_USE,           // Filter merit
  73.     1,                          // Number pins
  74.     &sudPins                    // Pin details
  75. };
  76. //
  77. //  Object creation stuff
  78. //
  79. CFactoryTemplate g_Templates[]= {
  80. #ifdef _DEBUG
  81.     L"RenderDB", &CLSID_RenderDB, CRender::CreateInstance, NULL, &sudRender
  82. #else // _DEBUG
  83.     L"Render", &CLSID_Render, CRender::CreateInstance, NULL, &sudRender
  84. #endif // _DEBUG
  85. };
  86. int g_cTemplates = 1;
  87. // Constructor
  88. CRenderFilter::CRenderFilter(CRender *pRender,
  89.                          LPUNKNOWN pUnk,
  90.                          CCritSec *pLock,
  91.                          HRESULT *phr) :
  92. #ifdef _DEBUG
  93.     CBaseFilter(NAME("CRenderFilter"), pUnk, pLock, CLSID_RenderDB),
  94. #else // _DEBUG
  95.     CBaseFilter(NAME("CRenderFilter"), pUnk, pLock, CLSID_Render),
  96. #endif // _DEBUG
  97.     m_pRender(pRender)
  98. {
  99. }
  100. //
  101. // GetPin
  102. //
  103. CBasePin * CRenderFilter::GetPin(int n)
  104. {
  105.     if (n == 0) {
  106.         return m_pRender->m_pPin;
  107.     } else {
  108.         return NULL;
  109.     }
  110. }
  111. //
  112. // GetPinCount
  113. //
  114. int CRenderFilter::GetPinCount()
  115. {
  116.     return 1;
  117. }
  118. //
  119. //  Definition of CRenderInputPin
  120. //
  121. CRenderInputPin::CRenderInputPin(CRender *pRender,
  122.                              LPUNKNOWN pUnk,
  123.                              CBaseFilter *pFilter,
  124.                              CCritSec *pLock,
  125.                              CCritSec *pReceiveLock,
  126.                              HRESULT *phr) :
  127.     CRenderedInputPin(NAME("CRenderInputPin"),
  128.                   pFilter,                   // Filter
  129.                   pLock,                     // Locking
  130.                   phr,                       // Return code
  131.                   L"Input"),                 // Pin name
  132.     m_pReceiveLock(pReceiveLock),
  133.     m_pRender(pRender)
  134. {
  135. }
  136. //
  137. // CheckMediaType
  138. //
  139. // Check if the pin can support this specific proposed type and format
  140. //
  141. HRESULT CRenderInputPin::CheckMediaType(const CMediaType *)
  142. {
  143.     return S_OK;
  144. }
  145. //
  146. // ReceiveCanBlock
  147. //
  148. // We don't hold up source threads on Receive
  149. //
  150. STDMETHODIMP CRenderInputPin::ReceiveCanBlock()
  151. {
  152.     return S_FALSE;
  153. }
  154. //
  155. // Receive
  156. //
  157. // Do something with this media sample
  158. //
  159. STDMETHODIMP CRenderInputPin::Receive(IMediaSample *pSample)
  160. {
  161.     CAutoLock lock(m_pReceiveLock);
  162.     // Call the app's callback with the pointer to the Media Sample
  163.     return ((T_PfnFrameCallback)m_pRender->m_pfnCallback)(m_pRender->m_cbParam, pSample);
  164. }
  165. //
  166. //  CRender class
  167. //
  168. CRender::CRender(LPUNKNOWN pUnk, HRESULT *phr) :
  169.     CUnknown(NAME("CRender"), pUnk),
  170.     m_pFilter(NULL),
  171.     m_pPin(NULL),
  172.     m_pfnCallback(0),
  173.     m_cbParam(0)
  174. {
  175.     m_pFilter = new CRenderFilter(this, GetOwner(), &m_Lock, phr);
  176.     if (m_pFilter == NULL) {
  177.         *phr = E_OUTOFMEMORY;
  178.         return;
  179.     }
  180.     m_pPin = new CRenderInputPin(this,GetOwner(),
  181.                                m_pFilter,
  182.                                &m_Lock,
  183.                                &m_ReceiveLock,
  184.                                phr);
  185.     if (m_pPin == NULL) {
  186.         *phr = E_OUTOFMEMORY;
  187.         return;
  188.     }
  189. }
  190. HRESULT CRender::SetFrameCallback(void * cbParam, void * pfnCallback)
  191. {
  192.     CAutoLock lock(&m_Lock);
  193.     m_pfnCallback = pfnCallback;
  194.     m_cbParam = cbParam;
  195.     return NOERROR;
  196. }
  197. // Destructor
  198. CRender::~CRender()
  199. {
  200.     delete m_pPin;
  201.     delete m_pFilter;
  202. }
  203. //
  204. // CreateInstance
  205. //
  206. // Provide the way for COM to create a Render filter
  207. //
  208. CUnknown * WINAPI CRender::CreateInstance(LPUNKNOWN punk, HRESULT *phr)
  209. {
  210.     CRender *pNewObject = new CRender(punk, phr);
  211.     if (pNewObject == NULL) {
  212.         *phr = E_OUTOFMEMORY;
  213.     }
  214.     return pNewObject;
  215. } // CreateInstance
  216. //
  217. // NonDelegatingQueryInterface
  218. //
  219. // Override this to say what interfaces we support where
  220. //
  221. STDMETHODIMP CRender::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
  222. {
  223.     CheckPointer(ppv,E_POINTER);
  224.     CAutoLock lock(&m_Lock);
  225.     // Do we have this interface
  226.     if (riid == IID_ITransfer) {
  227.         return GetInterface((ITransfer *) this, ppv);
  228.     } else if (riid == IID_IBaseFilter || riid == IID_IMediaFilter || riid == IID_IPersist) {
  229. return m_pFilter->NonDelegatingQueryInterface(riid, ppv);
  230.     }  else {
  231. return CUnknown::NonDelegatingQueryInterface(riid, ppv);
  232.     }
  233. } // NonDelegatingQueryInterface
  234. //
  235. // DllRegisterSever
  236. //
  237. // Handle the registration of this filter
  238. //
  239. STDAPI DllRegisterServer()
  240. {
  241.     return AMovieDllRegisterServer2( TRUE );
  242. } // DllRegisterServer
  243. //
  244. // DllUnregisterServer
  245. //
  246. STDAPI DllUnregisterServer()
  247. {
  248.     return AMovieDllRegisterServer2( FALSE );
  249. } // DllUnregisterServer