Module: wine Branch: master Commit: eb4972017e5188500c8144ecac81f75eba02884f URL: http://source.winehq.org/git/wine.git/?a=commit;h=eb4972017e5188500c8144ecac...
Author: Aric Stewart aric@codeweavers.com Date: Tue Apr 3 14:38:07 2012 -0500
quartz: Add VMRFilterConfig9 to VMR9.
---
dlls/quartz/vmr9.c | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 156 insertions(+), 0 deletions(-)
diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 07e3428..b8b81c2 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -53,12 +53,20 @@ typedef struct
IUnknown IUnknown_inner; IAMFilterMiscFlags IAMFilterMiscFlags_iface; + IVMRFilterConfig9 IVMRFilterConfig9_iface;
+ IVMRSurfaceAllocatorEx9 *allocator; + IVMRImagePresenter9 *presenter; + BOOL allocator_is_ex; + + VMR9Mode mode; BITMAPINFOHEADER bmiheader; IUnknown * outer_unk; BOOL bUnkOuterValid; BOOL bAggregatable;
+ DWORD_PTR cookie; + RECT source_rect; RECT target_rect; LONG VideoWidth; @@ -95,6 +103,11 @@ static inline VMR9Impl *impl_from_IAMFilterMiscFlags( IAMFilterMiscFlags *iface) return CONTAINING_RECORD(iface, VMR9Impl, IAMFilterMiscFlags_iface); }
+static inline VMR9Impl *impl_from_IVMRFilterConfig9( IVMRFilterConfig9 *iface) +{ + return CONTAINING_RECORD(iface, VMR9Impl, IVMRFilterConfig9_iface); +} + static HRESULT WINAPI VMR9_DoRenderSample(BaseRenderer *iface, IMediaSample * pSample) { VMR9Impl *This = (VMR9Impl *)iface; @@ -433,6 +446,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_IVMRFilterConfig9)) + *ppv = &This->IVMRFilterConfig9_iface; else { HRESULT hr; @@ -494,6 +509,11 @@ static ULONG WINAPI VMR9Inner_Release(IUnknown * iface) { TRACE("Destroying\n");
+ if (This->allocator) + IVMRSurfaceAllocator9_Release(This->allocator); + if (This->presenter) + IVMRImagePresenter9_Release(This->presenter); + CoTaskMemFree(This); } return refCount; @@ -762,6 +782,137 @@ static const IAMFilterMiscFlagsVtbl IAMFilterMiscFlags_Vtbl = { AMFilterMiscFlags_GetMiscFlags };
+static HRESULT WINAPI VMR9FilterConfig_QueryInterface(IVMRFilterConfig9 *iface, REFIID riid, LPVOID * ppv) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + return VMR9_QueryInterface(&This->renderer.filter.IBaseFilter_iface, riid, ppv); +} + +static ULONG WINAPI VMR9FilterConfig_AddRef(IVMRFilterConfig9 *iface) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + return VMR9_AddRef(&This->renderer.filter.IBaseFilter_iface); +} + +static ULONG WINAPI VMR9FilterConfig_Release(IVMRFilterConfig9 *iface) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + return VMR9_Release(&This->renderer.filter.IBaseFilter_iface); +} + +static HRESULT WINAPI VMR9FilterConfig_SetImageCompositor(IVMRFilterConfig9 *iface, IVMRImageCompositor9 *compositor) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + FIXME("(%p/%p)->(%p) stub\n", iface, This, compositor); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR9FilterConfig_SetNumberOfStreams(IVMRFilterConfig9 *iface, DWORD max) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + FIXME("(%p/%p)->(%u) stub\n", iface, This, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR9FilterConfig_GetNumberOfStreams(IVMRFilterConfig9 *iface, DWORD *max) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + FIXME("(%p/%p)->(%p) stub\n", iface, This, max); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR9FilterConfig_SetRenderingPrefs(IVMRFilterConfig9 *iface, DWORD renderflags) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + FIXME("(%p/%p)->(%u) stub\n", iface, This, renderflags); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR9FilterConfig_GetRenderingPrefs(IVMRFilterConfig9 *iface, DWORD *renderflags) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + FIXME("(%p/%p)->(%p) stub\n", iface, This, renderflags); + return E_NOTIMPL; +} + +static HRESULT WINAPI VMR9FilterConfig_SetRenderingMode(IVMRFilterConfig9 *iface, DWORD mode) +{ + HRESULT hr = S_OK; + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + TRACE("(%p/%p)->(%u)\n", iface, This, mode); + + EnterCriticalSection(&This->renderer.filter.csFilter); + if (This->mode) + { + LeaveCriticalSection(&This->renderer.filter.csFilter); + return VFW_E_WRONG_STATE; + } + + if (This->allocator) + IVMRSurfaceAllocator9_Release(This->allocator); + if (This->presenter) + IVMRImagePresenter9_Release(This->presenter); + + This->allocator = NULL; + This->presenter = NULL; + + switch (mode) + { + case VMR9Mode_Windowed: + case VMR9Mode_Windowless: + This->allocator = NULL; + This->presenter = NULL; + This->allocator_is_ex = 0; + This->cookie = ~0; + break; + case VMR9Mode_Renderless: + break; + default: + LeaveCriticalSection(&This->renderer.filter.csFilter); + return E_INVALIDARG; + } + + This->mode = mode; + LeaveCriticalSection(&This->renderer.filter.csFilter); + return hr; +} + +static HRESULT WINAPI VMR9FilterConfig_GetRenderingMode(IVMRFilterConfig9 *iface, DWORD *mode) +{ + VMR9Impl *This = impl_from_IVMRFilterConfig9(iface); + + TRACE("(%p/%p)->(%p) stub\n", iface, This, mode); + if (!mode) + return E_POINTER; + + if (This->mode) + *mode = This->mode; + else + *mode = VMR9Mode_Windowed; + + return S_OK; +} + +static const IVMRFilterConfig9Vtbl VMR9_FilterConfig_Vtbl = +{ + VMR9FilterConfig_QueryInterface, + VMR9FilterConfig_AddRef, + VMR9FilterConfig_Release, + VMR9FilterConfig_SetImageCompositor, + VMR9FilterConfig_SetNumberOfStreams, + VMR9FilterConfig_GetNumberOfStreams, + VMR9FilterConfig_SetRenderingPrefs, + VMR9FilterConfig_GetRenderingPrefs, + VMR9FilterConfig_SetRenderingMode, + VMR9FilterConfig_GetRenderingMode +}; + HRESULT VMR9Impl_create(IUnknown * outer_unk, LPVOID * ppv) { HRESULT hr; @@ -779,6 +930,11 @@ HRESULT VMR9Impl_create(IUnknown * outer_unk, LPVOID * ppv) pVMR9->IUnknown_inner.lpVtbl = &IInner_VTable; pVMR9->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
+ pVMR9->mode = 0; + pVMR9->allocator = NULL; + pVMR9->presenter = NULL; + pVMR9->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl; + hr = BaseRenderer_Init(&pVMR9->renderer, &VMR9_Vtbl, outer_unk, &CLSID_VideoMixingRenderer9, (DWORD_PTR)(__FILE__ ": VMR9Impl.csFilter"), &BaseFuncTable); if (FAILED(hr)) goto fail;