Module: wine Branch: master Commit: 5dbede68f8846d70be1e6587d7236868a560e64a URL: https://source.winehq.org/git/wine.git/?a=commit;h=5dbede68f8846d70be1e6587d...
Author: Zebediah Figura z.figura12@gmail.com Date: Tue May 12 21:25:00 2020 -0500
quartz/vmr9: Add IVMRMixerControl9.
Needed by Sniper Fury and Modern Combat 5.
Signed-off-by: Zebediah Figura z.figura12@gmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/quartz/tests/vmr9.c | 7 +- dlls/quartz/vmr9.c | 171 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 174 insertions(+), 4 deletions(-)
diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 3edc91a342..d7664adac0 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -334,7 +334,7 @@ static void test_interfaces(void) check_interface(filter, &IID_IBasicVideo, TRUE); todo_wine check_interface(filter, &IID_IBasicVideo2, TRUE); check_interface(filter, &IID_IVideoWindow, TRUE); - todo_wine check_interface(filter, &IID_IVMRMixerControl9, TRUE); + check_interface(filter, &IID_IVMRMixerControl9, TRUE); /* IVMRMonitorConfig9 may not be available if the d3d9 device has * insufficient support. */ check_interface_broken(filter, &IID_IVMRMonitorConfig9, TRUE); @@ -3153,9 +3153,8 @@ static void test_mixing_mode(void) ok(stream_count == 1, "Got %u streams.\n", stream_count);
hr = IBaseFilter_QueryInterface(filter, &IID_IVMRMixerControl9, (void **)&mixer_control); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - if (hr == S_OK) - IVMRMixerControl9_Release(mixer_control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IVMRMixerControl9_Release(mixer_control);
hr = IVMRFilterConfig9_SetNumberOfStreams(config, 2); ok(hr == VFW_E_WRONG_STATE, "Got hr %#x.\n", hr); diff --git a/dlls/quartz/vmr9.c b/dlls/quartz/vmr9.c index 6dfc82804f..edcfe44732 100644 --- a/dlls/quartz/vmr9.c +++ b/dlls/quartz/vmr9.c @@ -63,6 +63,7 @@ struct quartz_vmr IVMRFilterConfig IVMRFilterConfig_iface; IVMRFilterConfig9 IVMRFilterConfig9_iface; IVMRMixerBitmap9 IVMRMixerBitmap9_iface; + IVMRMixerControl9 IVMRMixerControl9_iface; IVMRMonitorConfig IVMRMonitorConfig_iface; IVMRMonitorConfig9 IVMRMonitorConfig9_iface; IVMRSurfaceAllocatorNotify IVMRSurfaceAllocatorNotify_iface; @@ -597,6 +598,8 @@ static HRESULT vmr_query_interface(struct strmbase_renderer *iface, REFIID iid, *out = &filter->IVMRFilterConfig9_iface; else if (IsEqualGUID(iid, &IID_IVMRMixerBitmap9) && is_vmr9(filter)) *out = &filter->IVMRMixerBitmap9_iface; + else if (IsEqualGUID(iid, &IID_IVMRMixerControl9) && is_vmr9(filter) && filter->stream_count) + *out = &filter->IVMRMixerControl9_iface; else if (IsEqualGUID(iid, &IID_IVMRMonitorConfig)) *out = &filter->IVMRMonitorConfig_iface; else if (IsEqualGUID(iid, &IID_IVMRMonitorConfig9)) @@ -2121,6 +2124,173 @@ static const IVMRSurfaceAllocatorNotify9Vtbl VMR9_SurfaceAllocatorNotify_Vtbl = VMR9SurfaceAllocatorNotify_NotifyEvent };
+static inline struct quartz_vmr *impl_from_IVMRMixerControl9(IVMRMixerControl9 *iface) +{ + return CONTAINING_RECORD(iface, struct quartz_vmr, IVMRMixerControl9_iface); +} + +static HRESULT WINAPI mixer_control9_QueryInterface(IVMRMixerControl9 *iface, REFIID iid, void **out) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + return IUnknown_QueryInterface(filter->renderer.filter.outer_unk, iid, out); +} + +static ULONG WINAPI mixer_control9_AddRef(IVMRMixerControl9 *iface) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + return IUnknown_AddRef(filter->renderer.filter.outer_unk); +} + +static ULONG WINAPI mixer_control9_Release(IVMRMixerControl9 *iface) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + return IUnknown_Release(filter->renderer.filter.outer_unk); +} + +static HRESULT WINAPI mixer_control9_SetAlpha(IVMRMixerControl9 *iface, DWORD stream, float alpha) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, stream %u, alpha %.8e, stub!\n", filter, stream, alpha); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetAlpha(IVMRMixerControl9 *iface, DWORD stream, float *alpha) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, stream %u, alpha %p, stub!\n", filter, stream, alpha); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_SetZOrder(IVMRMixerControl9 *iface, DWORD stream, DWORD z) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, stream %u, z %u, stub!\n", filter, stream, z); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetZOrder(IVMRMixerControl9 *iface, DWORD stream, DWORD *z) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, stream %u, z %p, stub!\n", filter, stream, z); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_SetOutputRect(IVMRMixerControl9 *iface, + DWORD stream, const VMR9NormalizedRect *rect) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, stream %u, rect %s, stub!\n", filter, stream, debugstr_normalized_rect(rect)); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetOutputRect(IVMRMixerControl9 *iface, + DWORD stream, VMR9NormalizedRect *rect) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, stream %u, rect %p, stub!\n", filter, stream, rect); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_SetBackgroundClr(IVMRMixerControl9 *iface, COLORREF color) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, color #%06x, stub!\n", filter, color); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetBackgroundClr(IVMRMixerControl9 *iface, COLORREF *color) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, color %p, stub!\n", filter, color); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_SetMixingPrefs(IVMRMixerControl9 *iface, DWORD flags) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, flags %#x, stub!\n", filter, flags); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetMixingPrefs(IVMRMixerControl9 *iface, DWORD *flags) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, flags %p, stub!\n", filter, flags); + + *flags = MixerPref9_NoDecimation | MixerPref9_ARAdjustXorY | MixerPref9_BiLinearFiltering | MixerPref9_RenderTargetRGB; + + return S_OK; +} + +static HRESULT WINAPI mixer_control9_SetProcAmpControl(IVMRMixerControl9 *iface, + DWORD stream, VMR9ProcAmpControl *settings) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, settings %p, stub!\n", filter, settings); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetProcAmpControl(IVMRMixerControl9 *iface, + DWORD stream, VMR9ProcAmpControl *settings) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, settings %p, stub!\n", filter, settings); + + return E_NOTIMPL; +} + +static HRESULT WINAPI mixer_control9_GetProcAmpControlRange(IVMRMixerControl9 *iface, + DWORD stream, VMR9ProcAmpControlRange *settings) +{ + struct quartz_vmr *filter = impl_from_IVMRMixerControl9(iface); + + FIXME("filter %p, settings %p, stub!\n", filter, settings); + + return E_NOTIMPL; +} + +static const IVMRMixerControl9Vtbl mixer_control9_vtbl = +{ + mixer_control9_QueryInterface, + mixer_control9_AddRef, + mixer_control9_Release, + mixer_control9_SetAlpha, + mixer_control9_GetAlpha, + mixer_control9_SetZOrder, + mixer_control9_GetZOrder, + mixer_control9_SetOutputRect, + mixer_control9_GetOutputRect, + mixer_control9_SetBackgroundClr, + mixer_control9_GetBackgroundClr, + mixer_control9_SetMixingPrefs, + mixer_control9_GetMixingPrefs, + mixer_control9_SetProcAmpControl, + mixer_control9_GetProcAmpControl, + mixer_control9_GetProcAmpControlRange, +}; + static inline struct quartz_vmr *impl_from_IVMRMixerBitmap9(IVMRMixerBitmap9 *iface) { return CONTAINING_RECORD(iface, struct quartz_vmr, IVMRMixerBitmap9_iface); @@ -2307,6 +2477,7 @@ static HRESULT vmr_create(IUnknown *outer, IUnknown **out, const CLSID *clsid) object->IVMRFilterConfig_iface.lpVtbl = &VMR7_FilterConfig_Vtbl; object->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl; object->IVMRMixerBitmap9_iface.lpVtbl = &mixer_bitmap9_vtbl; + object->IVMRMixerControl9_iface.lpVtbl = &mixer_control9_vtbl; object->IVMRMonitorConfig_iface.lpVtbl = &VMR7_MonitorConfig_Vtbl; object->IVMRMonitorConfig9_iface.lpVtbl = &VMR9_MonitorConfig_Vtbl; object->IVMRSurfaceAllocatorNotify_iface.lpVtbl = &VMR7_SurfaceAllocatorNotify_Vtbl;