Module: wine Branch: master Commit: 28423d79d4440b0b2a44ad92be305ba37d765012 URL: https://source.winehq.org/git/wine.git/?a=commit;h=28423d79d4440b0b2a44ad92b...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Mon Apr 11 11:23:13 2022 +0300
evr/mixer: Implement GetVideoProcessorCaps().
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/evr/mixer.c | 25 +++++++++++++++++++++++-- dlls/evr/tests/evr.c | 4 +++- 2 files changed, 26 insertions(+), 3 deletions(-)
diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c index c7e3033f2d1..668a97da979 100644 --- a/dlls/evr/mixer.c +++ b/dlls/evr/mixer.c @@ -1956,9 +1956,30 @@ static HRESULT WINAPI video_mixer_processor_GetAvailableVideoProcessorModes(IMFV static HRESULT WINAPI video_mixer_processor_GetVideoProcessorCaps(IMFVideoProcessor *iface, GUID *mode, DXVA2_VideoProcessorCaps *caps) { - FIXME("%p, %s, %p.\n", iface, debugstr_guid(mode), caps); + struct video_mixer *mixer = impl_from_IMFVideoProcessor(iface); + IDirectXVideoProcessorService *service; + DXVA2_VideoDesc video_desc; + GUID subtype = { 0 }; + HRESULT hr;
- return E_NOTIMPL; + TRACE("%p, %s, %p.\n", iface, debugstr_guid(mode), caps); + + EnterCriticalSection(&mixer->cs); + + if (!mixer->inputs[0].media_type || !mixer->output.media_type) + hr = MF_E_TRANSFORM_TYPE_NOT_SET; + else if (SUCCEEDED(hr = video_mixer_get_processor_service(mixer, &service))) + { + video_mixer_init_dxva_videodesc(mixer->inputs[0].media_type, &video_desc); + IMFMediaType_GetGUID(mixer->output.media_type, &MF_MT_SUBTYPE, &subtype); + + hr = IDirectXVideoProcessorService_GetVideoProcessorCaps(service, mode, &video_desc, subtype.Data1, caps); + IDirectXVideoProcessorService_Release(service); + } + + LeaveCriticalSection(&mixer->cs); + + return hr; }
static HRESULT WINAPI video_mixer_processor_GetVideoProcessorMode(IMFVideoProcessor *iface, GUID *mode) diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index bd280836046..93e262e52a3 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -1292,7 +1292,6 @@ static void test_default_mixer_type_negotiation(void) ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
hr = IMFVideoProcessor_GetVideoProcessorCaps(processor, (GUID *)&DXVA2_VideoProcSoftwareDevice, &caps); - todo_wine ok(hr == MF_E_TRANSFORM_TYPE_NOT_SET, "Unexpected hr %#lx.\n", hr);
hr = IMFTransform_GetInputCurrentType(transform, 0, &media_type); @@ -1324,6 +1323,9 @@ static void test_default_mixer_type_negotiation(void) ok(count > 0 && !!guids, "Unexpected modes data.\n"); CoTaskMemFree(guids);
+ hr = IMFVideoProcessor_GetVideoProcessorCaps(processor, (GUID *)&DXVA2_VideoProcSoftwareDevice, &caps); + ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); + hr = IMFTransform_GetOutputCurrentType(transform, 0, &media_type2); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); ok(media_type == media_type2, "Unexpected media type instance.\n");