quartz: Implement IVMRAspectRatioControl9.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=37517
Signed-off-by: Gijs Vermeulen <gijsvrm@gmail.com>
Signed-off-by: Zebediah Figura <z.figura12@gmail.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Gijs Vermeulen 2020-10-30 20:46:55 +01:00 committed by Alexandre Julliard
parent e0812be876
commit c7bd395ad9
2 changed files with 81 additions and 2 deletions

View File

@ -242,7 +242,7 @@ static void test_common_interfaces(IBaseFilter *filter)
check_interface(filter, &IID_IQualityControl, TRUE);
todo_wine check_interface(filter, &IID_IQualProp, TRUE);
check_interface(filter, &IID_IUnknown, TRUE);
todo_wine check_interface(filter, &IID_IVMRAspectRatioControl9, TRUE);
check_interface(filter, &IID_IVMRAspectRatioControl9, TRUE);
todo_wine check_interface(filter, &IID_IVMRDeinterlaceControl9, TRUE);
check_interface(filter, &IID_IVMRFilterConfig9, TRUE);
check_interface(filter, &IID_IVMRMixerBitmap9, TRUE);
@ -3851,6 +3851,7 @@ static void test_windowless_size(void)
};
IBaseFilter *filter = create_vmr9(VMR9Mode_Windowless);
LONG width, height, aspect_width, aspect_height;
IVMRAspectRatioControl9 *aspect_ratio_control;
IVMRWindowlessControl9 *windowless_control;
IFilterGraph2 *graph = create_graph();
VMR9AspectRatioMode aspect_mode;
@ -3864,6 +3865,7 @@ static void test_windowless_size(void)
IPin *pin;
IBaseFilter_QueryInterface(filter, &IID_IVMRWindowlessControl9, (void **)&windowless_control);
IBaseFilter_QueryInterface(filter, &IID_IVMRAspectRatioControl9, (void **)&aspect_ratio_control);
IBaseFilter_FindPin(filter, L"VMR Input0", &pin);
IPin_QueryInterface(pin, &IID_IMemInputPin, (void **)&input);
testfilter_init(&source);
@ -3902,6 +3904,11 @@ static void test_windowless_size(void)
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(aspect_mode == VMR9ARMode_None, "Got mode %u.\n", aspect_mode);
aspect_mode = 0xdeadbeef;
hr = IVMRAspectRatioControl9_GetAspectRatioMode(aspect_ratio_control, &aspect_mode);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(aspect_mode == VMR9ARMode_None, "Got mode %u.\n", aspect_mode);
width = height = 0xdeadbeef;
hr = IVMRWindowlessControl9_GetNativeVideoSize(windowless_control, &width, &height, NULL, NULL);
ok(hr == S_OK, "Got hr %#x.\n", hr);
@ -3956,7 +3963,7 @@ static void test_windowless_size(void)
SetRect(&expect, 0, 0, 640, 480);
ok(EqualRect(&src, &expect), "Got window rect %s.\n", wine_dbgstr_rect(&src));
hr = IVMRWindowlessControl9_SetAspectRatioMode(windowless_control, VMR9ARMode_LetterBox);
hr = IVMRAspectRatioControl9_SetAspectRatioMode(aspect_ratio_control, VMR9ARMode_LetterBox);
ok(hr == S_OK, "Got hr %#x.\n", hr);
aspect_mode = 0xdeadbeef;
@ -3964,6 +3971,17 @@ static void test_windowless_size(void)
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(aspect_mode == VMR9ARMode_LetterBox, "Got mode %u.\n", aspect_mode);
hr = IVMRWindowlessControl9_SetAspectRatioMode(windowless_control, VMR9ARMode_None);
ok(hr == S_OK, "Got hr %#x.\n", hr);
aspect_mode = 0xdeadbeef;
hr = IVMRAspectRatioControl9_GetAspectRatioMode(aspect_ratio_control, &aspect_mode);
ok(hr == S_OK, "Got hr %#x.\n", hr);
ok(aspect_mode == VMR9ARMode_None, "Got mode %u.\n", aspect_mode);
hr = IVMRWindowlessControl9_SetAspectRatioMode(windowless_control, VMR9ARMode_LetterBox);
ok(hr == S_OK, "Got hr %#x.\n", hr);
memset(&src, 0xcc, sizeof(src));
memset(&dst, 0xcc, sizeof(dst));
hr = IVMRWindowlessControl9_GetVideoPosition(windowless_control, &src, &dst);
@ -3993,6 +4011,7 @@ out:
IMemInputPin_Release(input);
IPin_Release(pin);
IVMRWindowlessControl9_Release(windowless_control);
IVMRAspectRatioControl9_Release(aspect_ratio_control);
ref = IBaseFilter_Release(filter);
ok(!ref, "Got outstanding refcount %d.\n", ref);
DestroyWindow(window);

View File

@ -60,6 +60,7 @@ struct quartz_vmr
IAMCertifiedOutputProtection IAMCertifiedOutputProtection_iface;
IAMFilterMiscFlags IAMFilterMiscFlags_iface;
IVMRAspectRatioControl9 IVMRAspectRatioControl9_iface;
IVMRFilterConfig IVMRFilterConfig_iface;
IVMRFilterConfig9 IVMRFilterConfig9_iface;
IVMRMixerBitmap9 IVMRMixerBitmap9_iface;
@ -603,6 +604,8 @@ static HRESULT vmr_query_interface(struct strmbase_renderer *iface, REFIID iid,
*out = &filter->IAMCertifiedOutputProtection_iface;
else if (IsEqualGUID(iid, &IID_IAMFilterMiscFlags))
*out = &filter->IAMFilterMiscFlags_iface;
else if (IsEqualGUID(iid, &IID_IVMRAspectRatioControl9) && is_vmr9(filter))
*out = &filter->IVMRAspectRatioControl9_iface;
else if (IsEqualGUID(iid, &IID_IVMRFilterConfig) && !is_vmr9(filter))
*out = &filter->IVMRFilterConfig_iface;
else if (IsEqualGUID(iid, &IID_IVMRFilterConfig9) && is_vmr9(filter))
@ -2396,6 +2399,62 @@ static const IVMRMixerBitmap9Vtbl mixer_bitmap9_vtbl =
mixer_bitmap9_GetAlphaBitmapParameters,
};
static inline struct quartz_vmr *impl_from_IVMRAspectRatioControl9(IVMRAspectRatioControl9 *iface)
{
return CONTAINING_RECORD(iface, struct quartz_vmr, IVMRAspectRatioControl9_iface);
}
static HRESULT WINAPI aspect_ratio_control9_QueryInterface(IVMRAspectRatioControl9 *iface, REFIID iid, void **out)
{
struct quartz_vmr *filter = impl_from_IVMRAspectRatioControl9(iface);
return IUnknown_QueryInterface(filter->renderer.filter.outer_unk, iid, out);
}
static ULONG WINAPI aspect_ratio_control9_AddRef(IVMRAspectRatioControl9 *iface)
{
struct quartz_vmr *filter = impl_from_IVMRAspectRatioControl9(iface);
return IUnknown_AddRef(filter->renderer.filter.outer_unk);
}
static ULONG WINAPI aspect_ratio_control9_Release(IVMRAspectRatioControl9 *iface)
{
struct quartz_vmr *filter = impl_from_IVMRAspectRatioControl9(iface);
return IUnknown_Release(filter->renderer.filter.outer_unk);
}
static HRESULT WINAPI aspect_ratio_control9_GetAspectRatioMode(IVMRAspectRatioControl9 *iface, DWORD *mode)
{
struct quartz_vmr *filter = impl_from_IVMRAspectRatioControl9(iface);
TRACE("filter %p, mode %p.\n", filter, mode);
EnterCriticalSection(&filter->renderer.filter.csFilter);
*mode = filter->aspect_mode;
LeaveCriticalSection(&filter->renderer.filter.csFilter);
return S_OK;
}
static HRESULT WINAPI aspect_ratio_control9_SetAspectRatioMode(IVMRAspectRatioControl9 *iface, DWORD mode)
{
struct quartz_vmr *filter = impl_from_IVMRAspectRatioControl9(iface);
TRACE("filter %p, mode %u.\n", filter, mode);
EnterCriticalSection(&filter->renderer.filter.csFilter);
filter->aspect_mode = mode;
LeaveCriticalSection(&filter->renderer.filter.csFilter);
return S_OK;
}
static const IVMRAspectRatioControl9Vtbl aspect_ratio_control9_vtbl =
{
aspect_ratio_control9_QueryInterface,
aspect_ratio_control9_AddRef,
aspect_ratio_control9_Release,
aspect_ratio_control9_GetAspectRatioMode,
aspect_ratio_control9_SetAspectRatioMode,
};
static inline struct quartz_vmr *impl_from_IOverlay(IOverlay *iface)
{
return CONTAINING_RECORD(iface, struct quartz_vmr, IOverlay_iface);
@ -2522,6 +2581,7 @@ static HRESULT vmr_create(IUnknown *outer, IUnknown **out, const CLSID *clsid)
strmbase_renderer_init(&object->renderer, outer, clsid, L"VMR Input0", &renderer_ops);
object->IAMCertifiedOutputProtection_iface.lpVtbl = &IAMCertifiedOutputProtection_Vtbl;
object->IAMFilterMiscFlags_iface.lpVtbl = &IAMFilterMiscFlags_Vtbl;
object->IVMRAspectRatioControl9_iface.lpVtbl = &aspect_ratio_control9_vtbl;
object->IVMRFilterConfig_iface.lpVtbl = &VMR7_FilterConfig_Vtbl;
object->IVMRFilterConfig9_iface.lpVtbl = &VMR9_FilterConfig_Vtbl;
object->IVMRMixerBitmap9_iface.lpVtbl = &mixer_bitmap9_vtbl;