diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 1c72b86e971..f39f052d9d7 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -53,6 +53,7 @@ struct quartz_vmr IUnknown IUnknown_inner; IAMFilterMiscFlags IAMFilterMiscFlags_iface; + IVMRFilterConfig IVMRFilterConfig_iface; IVMRFilterConfig9 IVMRFilterConfig9_iface; IVMRWindowlessControl9 IVMRWindowlessControl9_iface; IVMRSurfaceAllocatorNotify9 IVMRSurfaceAllocatorNotify9_iface; @@ -120,6 +121,11 @@ static inline struct quartz_vmr *impl_from_IAMFilterMiscFlags(IAMFilterMiscFlags return CONTAINING_RECORD(iface, struct quartz_vmr, IAMFilterMiscFlags_iface); } +static inline struct quartz_vmr *impl_from_IVMRFilterConfig(IVMRFilterConfig *iface) +{ + return CONTAINING_RECORD(iface, struct quartz_vmr, IVMRFilterConfig_iface); +} + static inline struct quartz_vmr *impl_from_IVMRFilterConfig9(IVMRFilterConfig9 *iface) { return CONTAINING_RECORD(iface, struct quartz_vmr, IVMRFilterConfig9_iface); @@ -725,6 +731,8 @@ static HRESULT WINAPI VMR9Inner_QueryInterface(IUnknown * iface, REFIID riid, LP *ppv = &This->baseControlVideo.IBasicVideo_iface; else if (IsEqualIID(riid, &IID_IAMFilterMiscFlags)) *ppv = &This->IAMFilterMiscFlags_iface; + else if (IsEqualIID(riid, &IID_IVMRFilterConfig)) + *ppv = &This->IVMRFilterConfig_iface; else if (IsEqualIID(riid, &IID_IVMRFilterConfig9)) *ppv = &This->IVMRFilterConfig9_iface; else if (IsEqualIID(riid, &IID_IVMRWindowlessControl9) && This->mode == VMR9Mode_Windowless) @@ -1074,6 +1082,103 @@ static const IAMFilterMiscFlagsVtbl IAMFilterMiscFlags_Vtbl = { AMFilterMiscFlags_GetMiscFlags }; +static HRESULT WINAPI VMR7FilterConfig_QueryInterface(IVMRFilterConfig *iface, REFIID riid, + void** ppv) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv); +} + +static ULONG WINAPI VMR7FilterConfig_AddRef(IVMRFilterConfig *iface) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface); +} + +static ULONG WINAPI VMR7FilterConfig_Release(IVMRFilterConfig *iface) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + return VMR9_Release(&This->renderer.filter.IBaseFilter_iface); +} + +static HRESULT WINAPI VMR7FilterConfig_SetImageCompositor(IVMRFilterConfig *iface, + IVMRImageCompositor *compositor) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + FIXME("(%p/%p)->(%p) stub\n", iface, This, compositor); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR7FilterConfig_SetNumberOfStreams(IVMRFilterConfig *iface, DWORD max) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + FIXME("(%p/%p)->(%u) stub\n", iface, This, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR7FilterConfig_GetNumberOfStreams(IVMRFilterConfig *iface, DWORD *max) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + FIXME("(%p/%p)->(%p) stub\n", iface, This, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR7FilterConfig_SetRenderingPrefs(IVMRFilterConfig *iface, DWORD renderflags) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + FIXME("(%p/%p)->(%u) stub\n", iface, This, renderflags); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR7FilterConfig_GetRenderingPrefs(IVMRFilterConfig *iface, DWORD *renderflags) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + FIXME("(%p/%p)->(%p) stub\n", iface, This, renderflags); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR7FilterConfig_SetRenderingMode(IVMRFilterConfig *iface, DWORD mode) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + FIXME("(%p/%p)->(%u) stub\n", iface, This, mode); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR7FilterConfig_GetRenderingMode(IVMRFilterConfig *iface, DWORD *mode) +{ + struct quartz_vmr *This = impl_from_IVMRFilterConfig(iface); + + TRACE("(%p/%p)->(%p) stub\n", iface, This, mode); + if (!mode) return E_POINTER; + + if (This->mode) + *mode = This->mode; + else + *mode = VMRMode_Windowed; + + return S_OK; +} + +static const IVMRFilterConfigVtbl VMR7_FilterConfig_Vtbl = +{ + VMR7FilterConfig_QueryInterface, + VMR7FilterConfig_AddRef, + VMR7FilterConfig_Release, + VMR7FilterConfig_SetImageCompositor, + VMR7FilterConfig_SetNumberOfStreams, + VMR7FilterConfig_GetNumberOfStreams, + VMR7FilterConfig_SetRenderingPrefs, + VMR7FilterConfig_GetRenderingPrefs, + VMR7FilterConfig_SetRenderingMode, + VMR7FilterConfig_GetRenderingMode +}; + static HRESULT WINAPI VMR9FilterConfig_QueryInterface(IVMRFilterConfig9 *iface, REFIID riid, LPVOID * ppv) { struct quartz_vmr *This = impl_from_IVMRFilterConfig9(iface); @@ -1613,6 +1718,7 @@ static HRESULT vmr_create(IUnknown *outer_unk, LPVOID *ppv, const CLSID *clsid) pVMR->allocator = NULL; pVMR->presenter = NULL; pVMR->hWndClippingWindow = NULL; + pVMR->IVMRFilterConfig_iface.lpVtbl = &VMR7_FilterConfig_Vtbl; pVMR->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl; pVMR->IVMRWindowlessControl9_iface.lpVtbl = &VMR9_WindowlessControl_Vtbl; pVMR->IVMRSurfaceAllocatorNotify9_iface.lpVtbl = &IVMRSurfaceAllocatorNotify9_Vtbl;