Nikolay Sivov : evr/mixer: Test format only when setting output type.
Alexandre Julliard
julliard at winehq.org
Fri May 28 16:22:27 CDT 2021
Module: wine
Branch: master
Commit: 626438a6be2df298c527870c8df9e6deb2f1c0fc
URL: https://source.winehq.org/git/wine.git/?a=commit;h=626438a6be2df298c527870c8df9e6deb2f1c0fc
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri May 28 15:43:07 2021 +0300
evr/mixer: Test format only when setting output type.
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/evr/mixer.c | 10 ++++++++--
dlls/evr/tests/evr.c | 42 +++++++++++++++++++++++++++++++++++++++++-
2 files changed, 49 insertions(+), 3 deletions(-)
diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c
index 554fb0725e8..c18bf0450bf 100644
--- a/dlls/evr/mixer.c
+++ b/dlls/evr/mixer.c
@@ -810,17 +810,23 @@ static HRESULT WINAPI video_mixer_transform_SetInputType(IMFTransform *iface, DW
static HRESULT WINAPI video_mixer_transform_SetOutputType(IMFTransform *iface, DWORD id, IMFMediaType *type, DWORD flags)
{
- const unsigned int equality_flags = MF_MEDIATYPE_EQUAL_MAJOR_TYPES |
- MF_MEDIATYPE_EQUAL_FORMAT_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_DATA;
+ const unsigned int equality_flags = MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_TYPES;
struct video_mixer *mixer = impl_from_IMFTransform(iface);
HRESULT hr = MF_E_INVALIDMEDIATYPE;
unsigned int i, compare_flags;
+ BOOL is_compressed = TRUE;
TRACE("%p, %u, %p, %#x.\n", iface, id, type, flags);
if (id)
return MF_E_INVALIDSTREAMNUMBER;
+ if (!type)
+ return E_INVALIDARG;
+
+ if (FAILED(IMFMediaType_IsCompressedFormat(type, &is_compressed)) || is_compressed)
+ return MF_E_INVALIDMEDIATYPE;
+
EnterCriticalSection(&mixer->cs);
for (i = 0; i < mixer->output.rt_formats_count; ++i)
diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c
index dd38a75ca2b..91fff21ebed 100644
--- a/dlls/evr/tests/evr.c
+++ b/dlls/evr/tests/evr.c
@@ -942,11 +942,11 @@ static void test_default_mixer_type_negotiation(void)
IDirect3DDeviceManager9 *manager;
DXVA2_VideoProcessorCaps caps;
IMFVideoProcessor *processor;
+ GUID subtype, guid, *guids;
IDirect3DDevice9 *device;
IMFMediaType *video_type;
IMFTransform *transform;
DWORD index, count;
- GUID guid, *guids;
IUnknown *unk;
HWND window;
HRESULT hr;
@@ -1070,6 +1070,46 @@ static void test_default_mixer_type_negotiation(void)
IMFMediaType_Release(media_type);
IMFMediaType_Release(media_type2);
+ /* Minimal valid attribute set for output type. */
+ hr = IMFTransform_GetOutputAvailableType(transform, 0, 0, &media_type);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = MFCreateMediaType(&media_type2);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFMediaType_GetGUID(media_type, &MF_MT_SUBTYPE, &subtype);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFMediaType_SetGUID(media_type2, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+ hr = IMFMediaType_SetGUID(media_type2, &MF_MT_SUBTYPE, &subtype);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_SetOutputType(transform, 1, NULL, MFT_SET_TYPE_TEST_ONLY);
+ ok(hr == MF_E_INVALIDSTREAMNUMBER, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_SetOutputType(transform, 0, NULL, MFT_SET_TYPE_TEST_ONLY);
+ ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_SetOutputType(transform, 0, media_type2, MFT_SET_TYPE_TEST_ONLY);
+ ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFMediaType_SetUINT32(media_type2, &MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_SetOutputType(transform, 0, media_type2, MFT_SET_TYPE_TEST_ONLY);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ /* Candidate type have frame size set, mismatching size is accepted. */
+ hr = IMFMediaType_SetUINT64(media_type2, &MF_MT_FRAME_SIZE, (UINT64)64 << 32 | 64);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ hr = IMFTransform_SetOutputType(transform, 0, media_type2, MFT_SET_TYPE_TEST_ONLY);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+ IMFMediaType_Release(media_type2);
+ IMFMediaType_Release(media_type);
+
hr = IMFTransform_QueryInterface(transform, &IID_IMFVideoProcessor, (void **)&processor);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
More information about the wine-cvs
mailing list