GraphBuilder.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:5k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* 
  2.  * Copyright (C) 2003-2005 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 <atlcoll.h>
  23. #define LMERIT(m) ((ULONGLONG(m))<<16)
  24. #define LMERIT_DO_NOT_USE LMERIT(MERIT_DO_NOT_USE)
  25. #define LMERIT_DO_USE LMERIT(MERIT_DO_NOT_USE+1)
  26. #define LMERIT_UNLIKELY (LMERIT(MERIT_UNLIKELY))
  27. #define LMERIT_NORMAL (LMERIT(MERIT_NORMAL))
  28. #define LMERIT_PREFERRED (LMERIT(MERIT_PREFERRED))
  29. #define LMERIT_ABOVE_DSHOW (LMERIT(1)<<32)
  30. class CGraphFilter
  31. {
  32. protected:
  33. CStringW m_name;
  34. struct {union {ULONGLONG val; struct {ULONGLONG low:16, mid:32, high:16;};};} m_merit;
  35. CLSID m_clsid;
  36. CList<GUID> m_guids;
  37. public:
  38. CGraphFilter(CStringW name = L"", ULONGLONG merit = LMERIT_DO_USE);
  39. virtual ~CGraphFilter() {}
  40. CStringW GetName() {return(m_name);}
  41. ULONGLONG GetMerit() {return(m_merit.val);}
  42. DWORD GetDWORDMerit() {return(m_merit.mid);}
  43. CLSID GetCLSID() {return(m_clsid);}
  44. void GetGUIDs(CList<GUID>& guids) {guids.RemoveAll(); guids.AddTail(&m_guids);}
  45. void SetGUIDs(CList<GUID>& guids) {m_guids.RemoveAll(); m_guids.AddTail(&guids);}
  46. bool IsExactMatch(CArray<GUID>& guids);
  47. bool IsCompatible(CArray<GUID>& guids);
  48. virtual HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk) = 0;
  49. };
  50. class CGraphRegFilter : public CGraphFilter
  51. {
  52. protected:
  53. CStringW m_dispname;
  54. CComPtr<IMoniker> m_pMoniker;
  55. void ExtractFilterData(BYTE* p, UINT len);
  56. public:
  57. CGraphRegFilter(IMoniker* pMoniker, ULONGLONG merit = LMERIT_DO_USE);
  58. CGraphRegFilter(CStringW m_dispname, ULONGLONG merit = LMERIT_DO_USE);
  59. CGraphRegFilter(const CLSID& clsid, ULONGLONG merit = LMERIT_DO_USE);
  60. CStringW GetDispName() {return(m_dispname);}
  61. CComPtr<IMoniker> GetMoniker() {return(m_pMoniker);}
  62. HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
  63. };
  64. class CGraphCustomFilter : public CGraphFilter
  65. {
  66. public:
  67. CGraphCustomFilter(const CLSID& clsid, CList<GUID>& guids, CStringW name = L"", ULONGLONG merit = LMERIT_DO_USE);
  68. HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
  69. };
  70. class CGraphFileFilter : public CGraphCustomFilter
  71. {
  72. protected:
  73. CString m_path;
  74. HINSTANCE m_hInst;
  75. public:
  76. CGraphFileFilter(const CLSID& clsid, CList<GUID>& guids, CString path, CStringW name = L"", ULONGLONG merit = LMERIT_DO_USE);
  77. HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
  78. };
  79. class CGraphRendererFilter : public CGraphFilter
  80. {
  81. protected:
  82. CLSID m_clsid;
  83. HWND m_hWnd;
  84. public:
  85. CGraphRendererFilter(const CLSID& clsid, HWND hWnd, CStringW name = L"", ULONGLONG merit = LMERIT_DO_USE);
  86. HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
  87. };
  88. class CGraphBuilder
  89. {
  90. public:
  91. typedef struct {int nStream; CString clsid, filter, pin; CList<CMediaType> mts; CList<CString> path;} DeadEnd;
  92. protected:
  93. HWND m_hWnd;
  94. CComPtr<IGraphBuilder> m_pGB;
  95. CComPtr<IFilterMapper2> m_pFM;
  96. CInterfaceList<IUnknown, &IID_IUnknown> m_pUnks;
  97. CAutoPtrList<CGraphFilter> m_pMoreFilters;
  98. ULONGLONG m_VRMerit, m_ARMerit;
  99. UINT m_nTotalStreams, m_nCurrentStream;
  100. CList<CGraphFilter*> m_chain;
  101. void ExtractMediaTypes(IPin* pPin, CArray<GUID>& guids);
  102. void ExtractMediaTypes(IPin* pPin, CList<CMediaType>& mts);
  103. void SaveFilters(CInterfaceList<IBaseFilter>& bfl);
  104. void RestoreFilters(CInterfaceList<IBaseFilter>& bfl);
  105. HRESULT SafeAddFilter(IBaseFilter* pBF, LPCWSTR pName);
  106. CAutoPtrArray<DeadEnd> m_DeadEnds;
  107. /*
  108. CList<CString> m_log;
  109. void LOG(LPCTSTR fmt, ...);
  110. */
  111. HRESULT ConnectDirect(IPin* pPin, IBaseFilter* pBF, const AM_MEDIA_TYPE* pmt = NULL);
  112. public:
  113. CGraphBuilder(IGraphBuilder* pGB, HWND hWnd);
  114. virtual ~CGraphBuilder();
  115. void Reset();
  116. void AddFilter(CGraphFilter* pFilter) {if(pFilter) {CAutoPtr<CGraphFilter> f(pFilter); m_pMoreFilters.AddTail(f);}}
  117. void RemoveFilters() {m_pMoreFilters.RemoveAll();}
  118. HRESULT AddSourceFilter(LPCTSTR fn, IBaseFilter** ppBF, UINT SrcFilters = 0xffffffff);
  119. HRESULT Render(LPCTSTR fn);
  120. HRESULT Render(IBaseFilter* pBF);
  121. HRESULT Render(IPin* pPin);
  122. HRESULT FindInterface(REFIID iid, void** ppv);
  123. int GetStreamCount() {return m_nTotalStreams;}
  124. DeadEnd* GetDeadEnd(int i) {return (i >= 0 && i < (int)m_DeadEnds.GetCount()) ? (DeadEnd*)m_DeadEnds[i] : NULL;}
  125. };
  126. class CGraphBuilderFile : public CGraphBuilder
  127. {
  128. public:
  129. CGraphBuilderFile(IGraphBuilder* pGB, HWND hWnd);
  130. };
  131. class CGraphBuilderDVD : public CGraphBuilderFile
  132. {
  133. public:
  134. CGraphBuilderDVD(IGraphBuilder* pGB, HWND hWnd);
  135. HRESULT Render(CString fn, CString& path);
  136. };
  137. class CGraphBuilderCapture : public CGraphBuilderFile
  138. {
  139. public:
  140. CGraphBuilderCapture(IGraphBuilder* pGB, HWND hWnd);
  141. };