FGManager.h
上传用户:tangyu_668
上传日期:2014-02-27
资源大小:678k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2006 Gabest
  3.  * http://www.gabest.org
  4.  *
  5.  *  This Program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2, or (at your option)
  8.  *  any later version.
  9.  *   
  10.  *  This Program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13.  *  GNU General Public License for more details.
  14.  *   
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with GNU Make; see the file COPYING.  If not, write to
  17.  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  18.  *  http://www.gnu.org/copyleft/gpl.html
  19.  *
  20.  */
  21. #pragma once
  22. #include "FGFilter.h"
  23. #include "IGraphBuilder2.h"
  24. class CFGManager
  25. : public CUnknown
  26. , public IGraphBuilder2
  27. , public IGraphBuilderDeadEnd
  28. , public CCritSec
  29. {
  30. public:
  31. struct path_t {CLSID clsid; CString filter, pin;};
  32. class CStreamPath : public CAtlList<path_t> 
  33. {
  34. public: 
  35. void Append(IBaseFilter* pBF, IPin* pPin); 
  36. bool Compare(const CStreamPath& path);
  37. };
  38. class CStreamDeadEnd : public CStreamPath 
  39. {
  40. public: 
  41. CAtlList<CMediaType> mts;
  42. };
  43. private:
  44. CComPtr<IUnknown> m_pUnkInner;
  45. DWORD m_dwRegister;
  46. CStreamPath m_streampath;
  47. CAutoPtrArray<CStreamDeadEnd> m_deadends;
  48. protected:
  49. CComPtr<IFilterMapper2> m_pFM;
  50. CInterfaceList<IUnknown, &IID_IUnknown> m_pUnks;
  51. CAtlList<CFGFilter*> m_source, m_transform, m_override;
  52. static bool CheckBytes(HANDLE hFile, CString chkbytes);
  53. HRESULT EnumSourceFilters(LPCWSTR lpcwstrFileName, CFGFilterList& fl);
  54. HRESULT AddSourceFilter(CFGFilter* pFGF, LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppBF);
  55. // IFilterGraph
  56. STDMETHODIMP AddFilter(IBaseFilter* pFilter, LPCWSTR pName);
  57. STDMETHODIMP RemoveFilter(IBaseFilter* pFilter);
  58. STDMETHODIMP EnumFilters(IEnumFilters** ppEnum);
  59. STDMETHODIMP FindFilterByName(LPCWSTR pName, IBaseFilter** ppFilter);
  60. STDMETHODIMP ConnectDirect(IPin* pPinOut, IPin* pPinIn, const AM_MEDIA_TYPE* pmt);
  61. STDMETHODIMP Reconnect(IPin* ppin);
  62. STDMETHODIMP Disconnect(IPin* ppin);
  63. STDMETHODIMP SetDefaultSyncSource();
  64. // IGraphBuilder
  65. STDMETHODIMP Connect(IPin* pPinOut, IPin* pPinIn);
  66. STDMETHODIMP Render(IPin* pPinOut);
  67. STDMETHODIMP RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList);
  68. STDMETHODIMP AddSourceFilter(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter);
  69. STDMETHODIMP SetLogFile(DWORD_PTR hFile);
  70. STDMETHODIMP Abort();
  71. STDMETHODIMP ShouldOperationContinue();
  72. // IFilterGraph2
  73. STDMETHODIMP AddSourceFilterForMoniker(IMoniker* pMoniker, IBindCtx* pCtx, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter);
  74. STDMETHODIMP ReconnectEx(IPin* ppin, const AM_MEDIA_TYPE* pmt);
  75. STDMETHODIMP RenderEx(IPin* pPinOut, DWORD dwFlags, DWORD* pvContext);
  76. // IGraphBuilder2
  77. STDMETHODIMP IsPinDirection(IPin* pPin, PIN_DIRECTION dir);
  78. STDMETHODIMP IsPinConnected(IPin* pPin);
  79. STDMETHODIMP ConnectFilter(IBaseFilter* pBF, IPin* pPinIn);
  80. STDMETHODIMP ConnectFilter(IPin* pPinOut, IBaseFilter* pBF);
  81. STDMETHODIMP ConnectFilterDirect(IPin* pPinOut, IBaseFilter* pBF, const AM_MEDIA_TYPE* pmt);
  82. STDMETHODIMP NukeDownstream(IUnknown* pUnk);
  83. STDMETHODIMP FindInterface(REFIID iid, void** ppv, BOOL bRemove);
  84. STDMETHODIMP AddToROT();
  85. STDMETHODIMP RemoveFromROT();
  86. // IGraphBuilderDeadEnd
  87. STDMETHODIMP_(size_t) GetCount();
  88. STDMETHODIMP GetDeadEnd(int iIndex, CAtlList<CStringW>& path, CAtlList<CMediaType>& mts);
  89. public:
  90. CFGManager(LPCTSTR pName, LPUNKNOWN pUnk);
  91. virtual ~CFGManager();
  92.     DECLARE_IUNKNOWN;
  93.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  94. };
  95. class CFGManagerCustom : public CFGManager
  96. {
  97. public:
  98. // IFilterGraph
  99. STDMETHODIMP AddFilter(IBaseFilter* pFilter, LPCWSTR pName);
  100. public:
  101. CFGManagerCustom(LPCTSTR pName, LPUNKNOWN pUnk, UINT src, UINT tra);
  102. };
  103. class CFGManagerPlayer : public CFGManagerCustom
  104. {
  105. protected:
  106. HWND m_hWnd;
  107. UINT64 m_vrmerit, m_armerit;
  108. // IFilterGraph
  109. STDMETHODIMP ConnectDirect(IPin* pPinOut, IPin* pPinIn, const AM_MEDIA_TYPE* pmt);
  110. public:
  111. CFGManagerPlayer(LPCTSTR pName, LPUNKNOWN pUnk, UINT src, UINT tra, HWND hWnd);
  112. };
  113. class CFGManagerDVD : public CFGManagerPlayer
  114. {
  115. protected:
  116. // IGraphBuilder
  117. STDMETHODIMP RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList);
  118. STDMETHODIMP AddSourceFilter(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter);
  119. public:
  120. CFGManagerDVD(LPCTSTR pName, LPUNKNOWN pUnk, UINT src, UINT tra, HWND hWnd);
  121. };
  122. class CFGManagerCapture : public CFGManagerPlayer
  123. {
  124. public:
  125. CFGManagerCapture(LPCTSTR pName, LPUNKNOWN pUnk, UINT src, UINT tra, HWND hWnd);
  126. };
  127. class CFGManagerMuxer : public CFGManagerCustom
  128. {
  129. public:
  130. CFGManagerMuxer(LPCTSTR pName, LPUNKNOWN pUnk);
  131. };
  132. //
  133. class CFGAggregator : public CUnknown
  134. {
  135. protected:
  136. CComPtr<IUnknown> m_pUnkInner;
  137. public:
  138. CFGAggregator(const CLSID& clsid, LPCTSTR pName, LPUNKNOWN pUnk, HRESULT& hr);
  139. virtual ~CFGAggregator();
  140.     DECLARE_IUNKNOWN;
  141.     STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
  142. };