STDMETHODIMP CVMR7AllocatorPresenter::CreateRenderer(IUnknown** ppRenderer) { CheckPointer(ppRenderer, E_POINTER); *ppRenderer = NULL; HRESULT hr; do { CComPtr<IBaseFilter> pBF; if (FAILED(hr = pBF.CoCreateInstance(CLSID_VideoMixingRenderer))) { break; } CComQIPtr<IVMRFilterConfig> pConfig = pBF; if (!pConfig) { break; } if (FAILED(hr = pConfig->SetRenderingMode(VMRMode_Renderless))) { break; } CComQIPtr<IVMRSurfaceAllocatorNotify> pSAN = pBF; if (!pSAN) { break; } if (FAILED(hr = pSAN->AdviseSurfaceAllocator(MY_USER_ID, static_cast<IVMRSurfaceAllocator*>(this))) || FAILED(hr = AdviseNotify(pSAN))) { break; } CComPtr<IPin> pPin = GetFirstPin(pBF); CComQIPtr<IMemInputPin> pMemInputPin = pPin; m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin); *ppRenderer = (IUnknown*)pBF.Detach(); return S_OK; } while (0); return E_FAIL; }
STDMETHODIMP CVMR9AllocatorPresenter::CreateRenderer(IUnknown** ppRenderer) { CheckPointer(ppRenderer, E_POINTER); *ppRenderer = nullptr; CMacrovisionKicker* pMK = DEBUG_NEW CMacrovisionKicker(NAME("CMacrovisionKicker"), nullptr); CComPtr<IUnknown> pUnk = (IUnknown*)(INonDelegatingUnknown*)pMK; COuterVMR9* pOuter = DEBUG_NEW COuterVMR9(NAME("COuterVMR9"), pUnk, &m_VMR9AlphaBitmap, this); pMK->SetInner((IUnknown*)(INonDelegatingUnknown*)pOuter); CComQIPtr<IBaseFilter> pBF = pUnk; CComPtr<IPin> pPin = GetFirstPin(pBF); CComQIPtr<IMemInputPin> pMemInputPin = pPin; m_fUseInternalTimer = HookNewSegmentAndReceive((IPinC*)(IPin*)pPin, (IMemInputPinC*)(IMemInputPin*)pMemInputPin); if (CComQIPtr<IAMVideoAccelerator> pAMVA = pPin) { HookAMVideoAccelerator((IAMVideoAcceleratorC*)(IAMVideoAccelerator*)pAMVA); } CComQIPtr<IVMRFilterConfig9> pConfig = pBF; if (!pConfig) { return E_FAIL; } const CRenderersSettings& r = GetRenderersSettings(); if (r.fVMR9MixerMode) { if (FAILED(pConfig->SetNumberOfStreams(1))) { return E_FAIL; } if (CComQIPtr<IVMRMixerControl9> pMC = pBF) { DWORD dwPrefs; pMC->GetMixingPrefs(&dwPrefs); // See http://msdn.microsoft.com/en-us/library/dd390928(VS.85).aspx dwPrefs |= MixerPref9_NonSquareMixing; dwPrefs |= MixerPref9_NoDecimation; if (r.fVMR9MixerYUV && !SysVersion::IsVistaOrLater()) { dwPrefs &= ~MixerPref9_RenderTargetMask; dwPrefs |= MixerPref9_RenderTargetYUV; } pMC->SetMixingPrefs(dwPrefs); } } if (FAILED(pConfig->SetRenderingMode(VMR9Mode_Renderless))) { return E_FAIL; } CComQIPtr<IVMRSurfaceAllocatorNotify9> pSAN = pBF; if (!pSAN) { return E_FAIL; } if (FAILED(pSAN->AdviseSurfaceAllocator(MY_USER_ID, static_cast<IVMRSurfaceAllocator9*>(this))) || FAILED(AdviseNotify(pSAN))) { return E_FAIL; } *ppRenderer = (IUnknown*)pBF.Detach(); return S_OK; }