diff options
author | Casimir666 <casimir666@users.sourceforge.net> | 2006-06-25 01:37:43 +0400 |
---|---|---|
committer | Casimir666 <casimir666@users.sourceforge.net> | 2006-06-25 01:37:43 +0400 |
commit | 0868305e78da2b0742c2ce349efa041d5622ae21 (patch) | |
tree | 663fd93132c7927910ba7c13188d6332b2e3e5b2 /src/apps/mplayerc/FGFilter.h | |
parent | 43c8656956a0460fc4551e3ea7a39b9f3094a3e3 (diff) |
git-svn-id: https://mpc-hc.svn.sourceforge.net/svnroot/mpc-hc/trunk@14 10f7b99b-c216-0410-bff0-8a66a9350fd8
Diffstat (limited to 'src/apps/mplayerc/FGFilter.h')
-rw-r--r-- | src/apps/mplayerc/FGFilter.h | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/src/apps/mplayerc/FGFilter.h b/src/apps/mplayerc/FGFilter.h new file mode 100644 index 000000000..cae81c000 --- /dev/null +++ b/src/apps/mplayerc/FGFilter.h @@ -0,0 +1,138 @@ +/*
+ * Copyright (C) 2003-2006 Gabest
+ * http://www.gabest.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#pragma once
+
+#define MERIT64(merit) (((UINT64)(merit))<<16)
+#define MERIT64_DO_NOT_USE MERIT64(MERIT_DO_NOT_USE)
+#define MERIT64_DO_USE MERIT64(MERIT_DO_NOT_USE+1)
+#define MERIT64_UNLIKELY (MERIT64(MERIT_UNLIKELY))
+#define MERIT64_NORMAL (MERIT64(MERIT_NORMAL))
+#define MERIT64_PREFERRED (MERIT64(MERIT_PREFERRED))
+#define MERIT64_ABOVE_DSHOW (MERIT64(1)<<32)
+
+class CFGFilter
+{
+protected:
+ CLSID m_clsid;
+ CStringW m_name;
+ struct {union {UINT64 val; struct {UINT64 low:16, mid:32, high:16;};};} m_merit;
+ CAtlList<GUID> m_types;
+
+public:
+ CFGFilter(const CLSID& clsid, CStringW name = L"", UINT64 merit = MERIT64_DO_USE);
+ virtual ~CFGFilter() {}
+
+ CLSID GetCLSID() {return m_clsid;}
+ CStringW GetName() {return m_name;}
+ UINT64 GetMerit() {return m_merit.val;}
+ DWORD GetMeritForDirectShow() {return m_merit.mid;}
+ const CAtlList<GUID>& GetTypes() const;
+ void SetTypes(const CAtlList<GUID>& types);
+ void AddType(const GUID& majortype, const GUID& subtype);
+ bool CheckTypes(const CAtlArray<GUID>& types, bool fExactMatch);
+
+ CAtlList<CString> m_protocols, m_extensions, m_chkbytes; // TODO: subtype?
+
+ virtual HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk) = 0;
+};
+
+class CFGFilterRegistry : public CFGFilter
+{
+protected:
+ CStringW m_DisplayName;
+ CComPtr<IMoniker> m_pMoniker;
+
+ void ExtractFilterData(BYTE* p, UINT len);
+
+public:
+ CFGFilterRegistry(IMoniker* pMoniker, UINT64 merit = MERIT64_DO_USE);
+ CFGFilterRegistry(CStringW DisplayName, UINT64 merit = MERIT64_DO_USE);
+ CFGFilterRegistry(const CLSID& clsid, UINT64 merit = MERIT64_DO_USE);
+
+ CStringW GetDisplayName() {return m_DisplayName;}
+ IMoniker* GetMoniker() {return m_pMoniker;}
+
+ HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
+};
+
+template<class T>
+class CFGFilterInternal : public CFGFilter
+{
+public:
+ CFGFilterInternal(CStringW name = L"", UINT64 merit = MERIT64_DO_USE) : CFGFilter(__uuidof(T), name, merit) {}
+
+ HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk)
+ {
+ CheckPointer(ppBF, E_POINTER);
+
+ if(ppUnk) *ppUnk = NULL;
+
+ HRESULT hr = S_OK;
+ CComPtr<IBaseFilter> pBF = new T(NULL, &hr);
+ if(FAILED(hr)) return hr;
+
+ *ppBF = pBF.Detach();
+
+ return hr;
+ }
+};
+
+class CFGFilterFile : public CFGFilter
+{
+protected:
+ CString m_path;
+ HINSTANCE m_hInst;
+
+public:
+ CFGFilterFile(const CLSID& clsid, CString path, CStringW name = L"", UINT64 merit = MERIT64_DO_USE);
+
+ HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
+};
+
+class CFGFilterVideoRenderer : public CFGFilter
+{
+protected:
+ HWND m_hWnd;
+
+public:
+ CFGFilterVideoRenderer(HWND hWnd, const CLSID& clsid, CStringW name = L"", UINT64 merit = MERIT64_DO_USE);
+
+ HRESULT Create(IBaseFilter** ppBF, IUnknown** ppUnk);
+};
+
+class CFGFilterList
+{
+ struct filter_t {int index; CFGFilter* pFGF; int group; bool exactmatch, autodelete;};
+ static int filter_cmp(const void* a, const void* b);
+ CAtlList<filter_t> m_filters;
+ CAtlList<CFGFilter*> m_sortedfilters;
+
+public:
+ CFGFilterList();
+ virtual ~CFGFilterList();
+
+ void RemoveAll();
+ void Insert(CFGFilter* pFGF, int group, bool exactmatch = false, bool autodelete = true);
+
+ POSITION GetHeadPosition();
+ CFGFilter* GetNext(POSITION& pos);
+};
|