/*
* (C) 2006-2014 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
/// === Outer EVR
namespace DSObjects
{
class COuterEVR
: public CUnknown
, public IVMRffdshow9
, public IVMRMixerBitmap9
, public IBaseFilter
{
CComPtr m_pEVR;
IBaseFilter* m_pEVRBase;
VMR9AlphaBitmap* m_pVMR9AlphaBitmap;
CEVRAllocatorPresenter* m_pAllocatorPresenter;
public:
COuterEVR(const TCHAR* pName, LPUNKNOWN pUnk, HRESULT& hr, VMR9AlphaBitmap* pVMR9AlphaBitmap, CEVRAllocatorPresenter* pAllocatorPresenter) : CUnknown(pName, pUnk) {
hr = m_pEVR.CoCreateInstance(CLSID_EnhancedVideoRenderer, GetOwner());
CComQIPtr pEVRBase = m_pEVR;
m_pEVRBase = pEVRBase; // Don't keep a second reference on the EVR filter
m_pVMR9AlphaBitmap = pVMR9AlphaBitmap;
m_pAllocatorPresenter = pAllocatorPresenter;
}
~COuterEVR() {}
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void** ppv) {
HRESULT hr;
if (riid == __uuidof(IVMRMixerBitmap9)) {
return GetInterface((IVMRMixerBitmap9*)this, ppv);
}
if (riid == __uuidof(IMediaFilter)) {
return GetInterface((IMediaFilter*)this, ppv);
}
if (riid == __uuidof(IPersist)) {
return GetInterface((IPersist*)this, ppv);
}
if (riid == __uuidof(IBaseFilter)) {
return GetInterface((IBaseFilter*)this, ppv);
}
hr = m_pEVR ? m_pEVR->QueryInterface(riid, ppv) : E_NOINTERFACE;
if (m_pEVR && FAILED(hr)) {
hr = m_pAllocatorPresenter ? m_pAllocatorPresenter->QueryInterface(riid, ppv) : E_NOINTERFACE;
if (FAILED(hr)) {
if (riid == __uuidof(IVMRffdshow9)) { // Support ffdshow queueing. We show ffdshow that this is patched MPC-HC.
return GetInterface((IVMRffdshow9*)this, ppv);
}
}
}
return SUCCEEDED(hr) ? hr : __super::NonDelegatingQueryInterface(riid, ppv);
}
// IBaseFilter
STDMETHODIMP EnumPins(__out IEnumPins** ppEnum);
STDMETHODIMP FindPin(LPCWSTR Id, __out IPin** ppPin);
STDMETHODIMP QueryFilterInfo(__out FILTER_INFO* pInfo);
STDMETHODIMP JoinFilterGraph(__in_opt IFilterGraph* pGraph, __in_opt LPCWSTR pName);
STDMETHODIMP QueryVendorInfo(__out LPWSTR* pVendorInfo);
STDMETHODIMP Stop();
STDMETHODIMP Pause();
STDMETHODIMP Run(REFERENCE_TIME tStart);
STDMETHODIMP GetState(DWORD dwMilliSecsTimeout, __out FILTER_STATE* State);
STDMETHODIMP SetSyncSource(__in_opt IReferenceClock* pClock);
STDMETHODIMP GetSyncSource(__deref_out_opt IReferenceClock** pClock);
STDMETHODIMP GetClassID(__RPC__out CLSID* pClassID);
// IVMRffdshow9
STDMETHODIMP support_ffdshow() {
queue_ffdshow_support = true;
return S_OK;
}
// IVMRMixerBitmap9
STDMETHODIMP GetAlphaBitmapParameters(VMR9AlphaBitmap* pBmpParms);
STDMETHODIMP SetAlphaBitmap(const VMR9AlphaBitmap* pBmpParms);
STDMETHODIMP UpdateAlphaBitmapParameters(const VMR9AlphaBitmap* pBmpParms);
};
}