/*
* $Id$
*
* (C) 2003-2006 Gabest
* (C) 2006-2012 see Authors.txt
*
* This file is part of MPC-HC.
*
* MPC-HC 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.
*
* MPC-HC 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
#include "FGFilter.h"
#include "IGraphBuilder2.h"
#define LowMeritSuffix L" (low merit)"
#define LowMerit(x) (CStringW(x)+LowMeritSuffix)
class CFGManager
: public CUnknown
, public IGraphBuilder2
, public IGraphBuilderDeadEnd
, public CCritSec
{
public:
struct path_t {
CLSID clsid;
CString filter, pin;
};
class CStreamPath : public CAtlList
{
public:
void Append(IBaseFilter* pBF, IPin* pPin);
bool Compare(const CStreamPath& path);
};
class CStreamDeadEnd : public CStreamPath
{
public:
CAtlList mts;
};
private:
CComPtr m_pUnkInner;
DWORD m_dwRegister;
CStreamPath m_streampath;
CAutoPtrArray m_deadends;
protected:
CComPtr m_pFM;
CInterfaceList m_pUnks;
CAtlList m_source, m_transform, m_override;
static bool CheckBytes(HANDLE hFile, CString chkbytes);
HRESULT EnumSourceFilters(LPCWSTR lpcwstrFileName, CFGFilterList& fl);
HRESULT AddSourceFilter(CFGFilter* pFGF, LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppBF);
HRESULT Connect(IPin* pPinOut, IPin* pPinIn, bool bContinueRender);
// IFilterGraph
STDMETHODIMP AddFilter(IBaseFilter* pFilter, LPCWSTR pName);
STDMETHODIMP RemoveFilter(IBaseFilter* pFilter);
STDMETHODIMP EnumFilters(IEnumFilters** ppEnum);
STDMETHODIMP FindFilterByName(LPCWSTR pName, IBaseFilter** ppFilter);
STDMETHODIMP ConnectDirect(IPin* pPinOut, IPin* pPinIn, const AM_MEDIA_TYPE* pmt);
STDMETHODIMP Reconnect(IPin* ppin);
STDMETHODIMP Disconnect(IPin* ppin);
STDMETHODIMP SetDefaultSyncSource();
// IGraphBuilder
STDMETHODIMP Connect(IPin* pPinOut, IPin* pPinIn);
STDMETHODIMP Render(IPin* pPinOut);
STDMETHODIMP RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList);
STDMETHODIMP AddSourceFilter(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter);
STDMETHODIMP SetLogFile(DWORD_PTR hFile);
STDMETHODIMP Abort();
STDMETHODIMP ShouldOperationContinue();
// IFilterGraph2
STDMETHODIMP AddSourceFilterForMoniker(IMoniker* pMoniker, IBindCtx* pCtx, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter);
STDMETHODIMP ReconnectEx(IPin* ppin, const AM_MEDIA_TYPE* pmt);
STDMETHODIMP RenderEx(IPin* pPinOut, DWORD dwFlags, DWORD* pvContext);
// IGraphBuilder2
STDMETHODIMP IsPinDirection(IPin* pPin, PIN_DIRECTION dir);
STDMETHODIMP IsPinConnected(IPin* pPin);
STDMETHODIMP ConnectFilter(IBaseFilter* pBF, IPin* pPinIn);
STDMETHODIMP ConnectFilter(IPin* pPinOut, IBaseFilter* pBF);
STDMETHODIMP ConnectFilterDirect(IPin* pPinOut, IBaseFilter* pBF, const AM_MEDIA_TYPE* pmt);
STDMETHODIMP NukeDownstream(IUnknown* pUnk);
STDMETHODIMP FindInterface(REFIID iid, void** ppv, BOOL bRemove);
STDMETHODIMP AddToROT();
STDMETHODIMP RemoveFromROT();
// IGraphBuilderDeadEnd
STDMETHODIMP_(size_t) GetCount();
STDMETHODIMP GetDeadEnd(int iIndex, CAtlList& path, CAtlList& mts);
public:
CFGManager(LPCTSTR pName, LPUNKNOWN pUnk);
virtual ~CFGManager();
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
};
class CFGManagerCustom : public CFGManager
{
public:
// IFilterGraph
STDMETHODIMP AddFilter(IBaseFilter* pFilter, LPCWSTR pName);
public:
CFGManagerCustom(LPCTSTR pName, LPUNKNOWN pUnk);
};
class CFGManagerPlayer : public CFGManagerCustom
{
protected:
HWND m_hWnd;
UINT64 m_vrmerit, m_armerit;
// IFilterGraph
STDMETHODIMP ConnectDirect(IPin* pPinOut, IPin* pPinIn, const AM_MEDIA_TYPE* pmt);
public:
CFGManagerPlayer(LPCTSTR pName, LPUNKNOWN pUnk, HWND hWnd);
};
class CFGManagerDVD : public CFGManagerPlayer
{
protected:
// IGraphBuilder
STDMETHODIMP RenderFile(LPCWSTR lpcwstrFile, LPCWSTR lpcwstrPlayList);
STDMETHODIMP AddSourceFilter(LPCWSTR lpcwstrFileName, LPCWSTR lpcwstrFilterName, IBaseFilter** ppFilter);
public:
CFGManagerDVD(LPCTSTR pName, LPUNKNOWN pUnk, HWND hWnd);
};
class CFGManagerCapture : public CFGManagerPlayer
{
public:
CFGManagerCapture(LPCTSTR pName, LPUNKNOWN pUnk, HWND hWnd);
};
class CFGManagerMuxer : public CFGManagerCustom
{
public:
CFGManagerMuxer(LPCTSTR pName, LPUNKNOWN pUnk);
};
//
class CFGAggregator : public CUnknown
{
protected:
CComPtr m_pUnkInner;
public:
CFGAggregator(const CLSID& clsid, LPCTSTR pName, LPUNKNOWN pUnk, HRESULT& hr);
virtual ~CFGAggregator();
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv);
};