evr/presenter: Add IMFQualityAdviseLimits stub.

Signed-off-by: Nikolay Sivov <nsivov@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Nikolay Sivov 2021-04-16 16:15:57 +03:00 committed by Alexandre Julliard
parent 6b2627d59f
commit b7ac7ebbd6
2 changed files with 62 additions and 8 deletions

View File

@ -79,6 +79,7 @@ struct video_presenter
IMFVideoPositionMapper IMFVideoPositionMapper_iface;
IQualProp IQualProp_iface;
IMFQualityAdvise IMFQualityAdvise_iface;
IMFQualityAdviseLimits IMFQualityAdviseLimits_iface;
IDirect3DDeviceManager9 IDirect3DDeviceManager9_iface;
IMFVideoSampleAllocatorNotify allocator_cb;
IUnknown IUnknown_inner;
@ -166,6 +167,11 @@ static struct video_presenter *impl_from_IMFQualityAdvise(IMFQualityAdvise *ifac
return CONTAINING_RECORD(iface, struct video_presenter, IMFQualityAdvise_iface);
}
static struct video_presenter *impl_from_IMFQualityAdviseLimits(IMFQualityAdviseLimits *iface)
{
return CONTAINING_RECORD(iface, struct video_presenter, IMFQualityAdviseLimits_iface);
}
static struct video_presenter *impl_from_IDirect3DDeviceManager9(IDirect3DDeviceManager9 *iface)
{
return CONTAINING_RECORD(iface, struct video_presenter, IDirect3DDeviceManager9_iface);
@ -775,6 +781,10 @@ static HRESULT WINAPI video_presenter_inner_QueryInterface(IUnknown *iface, REFI
{
*obj = &presenter->IMFQualityAdvise_iface;
}
else if (IsEqualIID(riid, &IID_IMFQualityAdviseLimits))
{
*obj = &presenter->IMFQualityAdviseLimits_iface;
}
else if (IsEqualIID(riid, &IID_IDirect3DDeviceManager9))
{
*obj = &presenter->IDirect3DDeviceManager9_iface;
@ -1870,6 +1880,47 @@ static const IDirect3DDeviceManager9Vtbl video_presenter_device_manager_vtbl =
video_presenter_device_manager_GetVideoService,
};
static HRESULT WINAPI video_presenter_qa_limits_QueryInterface(IMFQualityAdviseLimits *iface, REFIID riid, void **obj)
{
struct video_presenter *presenter = impl_from_IMFQualityAdviseLimits(iface);
return IMFVideoPresenter_QueryInterface(&presenter->IMFVideoPresenter_iface, riid, obj);
}
static ULONG WINAPI video_presenter_qa_limits_AddRef(IMFQualityAdviseLimits *iface)
{
struct video_presenter *presenter = impl_from_IMFQualityAdviseLimits(iface);
return IMFVideoPresenter_AddRef(&presenter->IMFVideoPresenter_iface);
}
static ULONG WINAPI video_presenter_qa_limits_Release(IMFQualityAdviseLimits *iface)
{
struct video_presenter *presenter = impl_from_IMFQualityAdviseLimits(iface);
return IMFVideoPresenter_Release(&presenter->IMFVideoPresenter_iface);
}
static HRESULT WINAPI video_presenter_qa_limits_GetMaximumDropMode(IMFQualityAdviseLimits *iface, MF_QUALITY_DROP_MODE *mode)
{
FIXME("%p, %p.\n", iface, mode);
return E_NOTIMPL;
}
static HRESULT WINAPI video_presenter_qa_limits_GetMinimumQualityLevel(IMFQualityAdviseLimits *iface, MF_QUALITY_LEVEL *level)
{
FIXME("%p, %p.\n", iface, level);
return E_NOTIMPL;
}
static const IMFQualityAdviseLimitsVtbl video_presenter_qa_limits_vtbl =
{
video_presenter_qa_limits_QueryInterface,
video_presenter_qa_limits_AddRef,
video_presenter_qa_limits_Release,
video_presenter_qa_limits_GetMaximumDropMode,
video_presenter_qa_limits_GetMinimumQualityLevel,
};
HRESULT WINAPI MFCreateVideoPresenter(IUnknown *owner, REFIID riid_device, REFIID riid, void **obj)
{
TRACE("%p, %s, %s, %p.\n", owner, debugstr_guid(riid_device), debugstr_guid(riid), obj);
@ -1940,6 +1991,7 @@ HRESULT evr_presenter_create(IUnknown *outer, void **out)
object->IMFVideoPositionMapper_iface.lpVtbl = &video_presenter_position_mapper_vtbl;
object->IQualProp_iface.lpVtbl = &video_presenter_qualprop_vtbl;
object->IMFQualityAdvise_iface.lpVtbl = &video_presenter_quality_advise_vtbl;
object->IMFQualityAdviseLimits_iface.lpVtbl = &video_presenter_qa_limits_vtbl;
object->allocator_cb.lpVtbl = &video_presenter_allocator_cb_vtbl;
object->IUnknown_inner.lpVtbl = &video_presenter_inner_vtbl;
object->IDirect3DDeviceManager9_iface.lpVtbl = &video_presenter_device_manager_vtbl;

View File

@ -1154,7 +1154,7 @@ static void test_default_presenter(void)
check_interface(presenter, &IID_IMFVideoDeviceID, TRUE);
check_interface(presenter, &IID_IMFQualityAdvise, TRUE);
check_interface(presenter, &IID_IDirect3DDeviceManager9, TRUE);
todo_wine check_interface(presenter, &IID_IMFQualityAdviseLimits, TRUE);
check_interface(presenter, &IID_IMFQualityAdviseLimits, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPositionMapper, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDisplayControl, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoPresenter, TRUE);
@ -1165,7 +1165,7 @@ static void test_default_presenter(void)
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFGetService, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFVideoDeviceID, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFQualityAdvise, TRUE);
todo_wine check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFQualityAdviseLimits, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFQualityAdviseLimits, TRUE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IMFTransform, FALSE);
check_service_interface(presenter, &MR_VIDEO_RENDER_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
check_service_interface(presenter, &MR_VIDEO_ACCELERATION_SERVICE, &IID_IDirect3DDeviceManager9, TRUE);
@ -2018,30 +2018,32 @@ static void test_presenter_quality_control(void)
ok(hr == S_OK, "Failed to create default presenter, hr %#x.\n", hr);
hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFQualityAdviseLimits, (void **)&qa_limits);
todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
hr = IMFVideoPresenter_QueryInterface(presenter, &IID_IMFQualityAdvise, (void **)&advise);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
if (qa_limits)
{
hr = IMFQualityAdviseLimits_GetMaximumDropMode(qa_limits, NULL);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
hr = IMFQualityAdviseLimits_GetMaximumDropMode(qa_limits, &mode);
todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(mode == MF_DROP_MODE_NONE, "Unexpected mode %d.\n", mode);
if (SUCCEEDED(hr))
ok(mode == MF_DROP_MODE_NONE, "Unexpected mode %d.\n", mode);
hr = IMFQualityAdviseLimits_GetMinimumQualityLevel(qa_limits, NULL);
todo_wine
ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
hr = IMFQualityAdviseLimits_GetMinimumQualityLevel(qa_limits, &level);
todo_wine
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
ok(level == MF_QUALITY_NORMAL, "Unexpected level %d.\n", level);
if (SUCCEEDED(hr))
ok(level == MF_QUALITY_NORMAL, "Unexpected level %d.\n", level);
IMFQualityAdviseLimits_Release(qa_limits);
}
todo_wine {
mode = 1;