/* * $Id$ * * (C) 2003-2006 Gabest * (C) 2006-2010 see AUTHORS * * This file is part of mplayerc. * * Mplayerc 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 3 of the License, or * (at your option) any later version. * * Mplayerc 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 this program. If not, see . * */ #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 m_types; public: CFGFilter(const CLSID& clsid, CStringW name = L"", UINT64 merit = MERIT64_DO_USE); virtual ~CFGFilter() {} CLSID GetCLSID() const { return m_clsid; } CStringW GetName() const { return m_name; } UINT64 GetMerit() const { return m_merit.val; } DWORD GetMeritForDirectShow() const { return m_merit.mid; } const CAtlList& GetTypes() const; void SetTypes(const CAtlList& types); void AddType(const GUID& majortype, const GUID& subtype); bool CheckTypes(const CAtlArray& types, bool fExactMatch); CAtlList m_protocols, m_extensions, m_chkbytes; // TODO: subtype? virtual HRESULT Create(IBaseFilter** ppBF, CInterfaceList& pUnks) = 0; }; class CFGFilterRegistry : public CFGFilter { protected: CStringW m_DisplayName; CComPtr 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, CInterfaceList& pUnks); }; template class CFGFilterInternal : public CFGFilter { public: CFGFilterInternal(CStringW name = L"", UINT64 merit = MERIT64_DO_USE) : CFGFilter(__uuidof(T), name, merit) {} HRESULT Create(IBaseFilter** ppBF, CInterfaceList& pUnks) { CheckPointer(ppBF, E_POINTER); HRESULT hr = S_OK; CComPtr pBF = DNew 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, CInterfaceList& pUnks); }; 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, CInterfaceList& pUnks); }; 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 m_filters; CAtlList m_sortedfilters; public: CFGFilterList(); virtual ~CFGFilterList(); bool IsEmpty() { return m_filters.IsEmpty(); } void RemoveAll(); void Insert(CFGFilter* pFGF, int group, bool exactmatch = false, bool autodelete = true); POSITION GetHeadPosition(); CFGFilter* GetNext(POSITION& pos); };