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

多媒体编程

开发平台:

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. #define MERIT64(merit) (((UINT64)(merit))<<16)
  23. #define MERIT64_DO_NOT_USE MERIT64(MERIT_DO_NOT_USE)
  24. #define MERIT64_DO_USE MERIT64(MERIT_DO_NOT_USE+1)
  25. #define MERIT64_UNLIKELY (MERIT64(MERIT_UNLIKELY))
  26. #define MERIT64_NORMAL (MERIT64(MERIT_NORMAL))
  27. #define MERIT64_PREFERRED (MERIT64(MERIT_PREFERRED))
  28. #define MERIT64_ABOVE_DSHOW (MERIT64(1)<<32)
  29. class CFGFilter
  30. {
  31. protected:
  32. CLSID m_clsid;
  33. CStringW m_name;
  34. struct {union {UINT64 val; struct {UINT64 low:16, mid:32, high:16;};};} m_merit;
  35. CAtlList<GUID> m_types;
  36. public:
  37. CFGFilter(const CLSID& clsid, CStringW name = L"", UINT64 merit = MERIT64_DO_USE);
  38. virtual ~CFGFilter() {}
  39. CLSID GetCLSID() {return m_clsid;}
  40. CStringW GetName() {return m_name;}
  41. UINT64 GetMerit() {return m_merit.val;}
  42. DWORD GetMeritForDirectShow() {return m_merit.mid;}
  43. const CAtlList<GUID>& GetTypes() const;
  44. void SetTypes(const CAtlList<GUID>& types);
  45. void AddType(const GUID& majortype, const GUID& subtype);
  46. bool CheckTypes(const CAtlArray<GUID>& types, bool fExactMatch);
  47. CAtlList<CString> m_protocols, m_extensions, m_chkbytes; // TODO: subtype?
  48. virtual HRESULT Create(IBaseFilter** ppBF, CInterfaceList<IUnknown, &IID_IUnknown>& pUnks) = 0;
  49. };
  50. class CFGFilterRegistry : public CFGFilter
  51. {
  52. protected:
  53. CStringW m_DisplayName;
  54. CComPtr<IMoniker> m_pMoniker;
  55. void ExtractFilterData(BYTE* p, UINT len);
  56. public:
  57. CFGFilterRegistry(IMoniker* pMoniker, UINT64 merit = MERIT64_DO_USE);
  58. CFGFilterRegistry(CStringW DisplayName, UINT64 merit = MERIT64_DO_USE);
  59. CFGFilterRegistry(const CLSID& clsid, UINT64 merit = MERIT64_DO_USE);
  60. CStringW GetDisplayName() {return m_DisplayName;}
  61. IMoniker* GetMoniker() {return m_pMoniker;}
  62. HRESULT Create(IBaseFilter** ppBF, CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
  63. };
  64. template<class T>
  65. class CFGFilterInternal : public CFGFilter
  66. {
  67. public:
  68. CFGFilterInternal(CStringW name = L"", UINT64 merit = MERIT64_DO_USE) : CFGFilter(__uuidof(T), name, merit) {}
  69. HRESULT Create(IBaseFilter** ppBF, CInterfaceList<IUnknown, &IID_IUnknown>& pUnks)
  70. {
  71. CheckPointer(ppBF, E_POINTER);
  72. HRESULT hr = S_OK;
  73. CComPtr<IBaseFilter> pBF = new T(NULL, &hr);
  74. if(FAILED(hr)) return hr;
  75. *ppBF = pBF.Detach();
  76. return hr;
  77. }
  78. };
  79. class CFGFilterFile : public CFGFilter
  80. {
  81. protected:
  82. CString m_path;
  83. HINSTANCE m_hInst;
  84. public:
  85. CFGFilterFile(const CLSID& clsid, CString path, CStringW name = L"", UINT64 merit = MERIT64_DO_USE);
  86. HRESULT Create(IBaseFilter** ppBF, CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
  87. };
  88. class CFGFilterVideoRenderer : public CFGFilter
  89. {
  90. protected:
  91. HWND m_hWnd;
  92. public:
  93. CFGFilterVideoRenderer(HWND hWnd, const CLSID& clsid, CStringW name = L"", UINT64 merit = MERIT64_DO_USE);
  94. HRESULT Create(IBaseFilter** ppBF, CInterfaceList<IUnknown, &IID_IUnknown>& pUnks);
  95. };
  96. class CFGFilterList
  97. {
  98. struct filter_t {int index; CFGFilter* pFGF; int group; bool exactmatch, autodelete;};
  99. static int filter_cmp(const void* a, const void* b);
  100. CAtlList<filter_t> m_filters;
  101. CAtlList<CFGFilter*> m_sortedfilters;
  102. public:
  103. CFGFilterList();
  104. virtual ~CFGFilterList();
  105. bool IsEmpty() {return m_filters.IsEmpty();}
  106. void RemoveAll();
  107. void Insert(CFGFilter* pFGF, int group, bool exactmatch = false, bool autodelete = true);
  108. POSITION GetHeadPosition();
  109. CFGFilter* GetNext(POSITION& pos);
  110. };