protected override void Initialize(IGraphBuilder pGraphBuilder, IntPtr hMediaWindow) { object factoryObject = null; object presenterObject = null; try { int hr = ClassFactory.GetEvrPresenterClassFactory(ref CLSID_CustomEVRPresenter, ref ClassFactory.IID_ClassFactory, out factoryObject); Marshal.ThrowExceptionForHR(hr); IClassFactory factory = (IClassFactory)factoryObject; var iidPresenter = typeof(IMFVideoPresenter).GUID; hr = factory.CreateInstance(null, ref iidPresenter, out presenterObject); Marshal.ThrowExceptionForHR(hr); IMFVideoPresenter presenter = (IMFVideoPresenter)presenterObject; IMFVideoRenderer renderer = (IMFVideoRenderer)BaseFilter; // will be released when IBaseFilter is released renderer.InitializeRenderer(null, presenter); IMFGetService pMFGetService = (IMFGetService)BaseFilter; // will be released when IBaseFilter is released object o; var serviceId = ServiceID.EnhancedVideoRenderer; var iidImfVideoDisplayControl = typeof(IMFVideoDisplayControl).GUID; Marshal.ThrowExceptionForHR(pMFGetService.GetService(ref serviceId, ref iidImfVideoDisplayControl, out o)); _pMFVideoDisplayControl = (IMFVideoDisplayControl)o; _pMFVideoDisplayControl.SetVideoWindow(hMediaWindow); _pMFVideoDisplayControl.SetAspectRatioMode(MFVideoAspectRatioMode.MFVideoARMode_None); _pvpPresenterConfig = (IPvpPresenterConfig)presenterObject; _pvpPresenterConfig.SetBufferCount(PRESENTER_BUFFER_COUNT); _pvpPresenterHook.HookUp(presenterObject); // as EVR requests IMFVideoDisplayControl from the presenter and our custom presenter implements IPvpPresenter and IPvpPresenterConfig // presenterObject and _pMFVideoDisplayControl point to the same RCW presenterObject = null; // we will release the presenter when releasing _pMFVideoDisplayControl } catch { _pMFVideoDisplayControl = null; _pvpPresenterConfig = null; } finally { if (factoryObject != null) { Marshal.FinalReleaseComObject(factoryObject); } if (presenterObject != null) { Marshal.FinalReleaseComObject(presenterObject); } } }
protected override void CloseInterfaces() { if (_pMFVideoDisplayControl != null) { _pMFVideoDisplayControl.SetVideoWindow(IntPtr.Zero); Marshal.FinalReleaseComObject(_pMFVideoDisplayControl); _pMFVideoDisplayControl = null; _pvpPresenterConfig = null; } base.CloseInterfaces(); // release pBaseFilter }