Rémi Bernon : mf: Implement SAR media type required attributes checks.

Alexandre Julliard julliard at winehq.org
Tue Aug 2 14:53:35 CDT 2022


Module: wine
Branch: master
Commit: c806c4eed541a6b9e39b20fb2484edea4cf26eba
URL:    https://gitlab.winehq.org/wine/wine/-/commit/c806c4eed541a6b9e39b20fb2484edea4cf26eba

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Jul 29 18:11:15 2022 +0200

mf: Implement SAR media type required attributes checks.

---

 dlls/mf/sar.c      | 49 +++++++++++++++++++++++++++++++++++++++++--------
 dlls/mf/tests/mf.c |  2 --
 2 files changed, 41 insertions(+), 10 deletions(-)

diff --git a/dlls/mf/sar.c b/dlls/mf/sar.c
index 2aabb1fe10f..84824f954dd 100644
--- a/dlls/mf/sar.c
+++ b/dlls/mf/sar.c
@@ -1499,20 +1499,57 @@ static ULONG WINAPI audio_renderer_stream_type_handler_Release(IMFMediaTypeHandl
     return IMFStreamSink_Release(&renderer->IMFStreamSink_iface);
 }
 
+static HRESULT check_media_type(IMFMediaType *type, IMFMediaType *current)
+{
+    static const GUID *required_attrs[] =
+    {
+        &MF_MT_AUDIO_SAMPLES_PER_SECOND,
+        &MF_MT_AUDIO_NUM_CHANNELS,
+        &MF_MT_AUDIO_BITS_PER_SAMPLE,
+        &MF_MT_AUDIO_BLOCK_ALIGNMENT,
+        &MF_MT_AUDIO_AVG_BYTES_PER_SECOND,
+    };
+    PROPVARIANT value;
+    BOOL result;
+    HRESULT hr;
+    GUID major;
+    int i;
+
+    if (FAILED(hr = IMFMediaType_GetGUID(type, &MF_MT_MAJOR_TYPE, &major)))
+        return hr;
+    if (!IsEqualGUID(&major, &MFMediaType_Audio))
+        return MF_E_INVALIDMEDIATYPE;
+
+    for (i = 0; SUCCEEDED(hr) && i < ARRAY_SIZE(required_attrs); ++i)
+    {
+        PropVariantInit(&value);
+        hr = IMFMediaType_GetItem(type, required_attrs[i], &value);
+        if (SUCCEEDED(hr))
+            hr = IMFMediaType_CompareItem(current, required_attrs[i], &value, &result);
+        if (SUCCEEDED(hr) && !result)
+            hr = MF_E_INVALIDMEDIATYPE;
+        PropVariantClear(&value);
+    }
+
+    if (FAILED(hr))
+        return MF_E_INVALIDMEDIATYPE;
+
+    return S_OK;
+}
+
 static HRESULT WINAPI audio_renderer_stream_type_handler_IsMediaTypeSupported(IMFMediaTypeHandler *iface,
         IMFMediaType *in_type, IMFMediaType **out_type)
 {
     struct audio_renderer *renderer = impl_from_IMFMediaTypeHandler(iface);
-    DWORD flags;
     HRESULT hr;
 
     TRACE("%p, %p, %p.\n", iface, in_type, out_type);
 
     EnterCriticalSection(&renderer->cs);
-    hr = IMFMediaType_IsEqual(renderer->media_type, in_type, &flags);
+    hr = check_media_type(in_type, renderer->media_type);
     LeaveCriticalSection(&renderer->cs);
 
-    return hr != S_OK ? MF_E_INVALIDMEDIATYPE : hr;
+    return hr;
 }
 
 static HRESULT WINAPI audio_renderer_stream_type_handler_GetMediaTypeCount(IMFMediaTypeHandler *iface, DWORD *count)
@@ -1625,10 +1662,8 @@ static HRESULT WINAPI audio_renderer_stream_type_handler_SetCurrentMediaType(IMF
         IMFMediaType *media_type)
 {
     struct audio_renderer *renderer = impl_from_IMFMediaTypeHandler(iface);
-    const unsigned int test_flags = MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_TYPES;
     BOOL compare_result;
     HRESULT hr = S_OK;
-    DWORD flags;
 
     TRACE("%p, %p.\n", iface, media_type);
 
@@ -1636,7 +1671,7 @@ static HRESULT WINAPI audio_renderer_stream_type_handler_SetCurrentMediaType(IMF
         return E_POINTER;
 
     EnterCriticalSection(&renderer->cs);
-    if (SUCCEEDED(IMFMediaType_IsEqual(renderer->media_type, media_type, &flags)) && ((flags & test_flags) == test_flags))
+    if (SUCCEEDED(hr = check_media_type(media_type, renderer->media_type)))
     {
         if (renderer->current_media_type)
             IMFMediaType_Release(renderer->current_media_type);
@@ -1745,8 +1780,6 @@ static HRESULT audio_renderer_collect_supported_types(struct audio_renderer *ren
         return hr;
     }
 
-    IMFMediaType_DeleteItem(renderer->media_type, &MF_MT_AUDIO_PREFER_WAVEFORMATEX);
-
     return hr;
 }
 
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 4638edbec76..10f69e73a8b 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -4651,13 +4651,11 @@ if (SUCCEEDED(hr))
     hr = MFCreateMediaType(&mediatype);
     ok(hr == S_OK, "MFCreateMediaType returned %#lx\n", hr);
     hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, mediatype, NULL);
-    todo_wine
     ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#lx.\n", hr);
     init_media_type(mediatype, rate == 44100 ? input_type_desc_44100 : input_type_desc_48000, 2);
     for (int i = 1; i < (rate == 44100 ? ARRAY_SIZE(input_type_desc_44100) : ARRAY_SIZE(input_type_desc_48000)) - 1; ++i)
     {
         hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, mediatype, NULL);
-        todo_wine
         ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#lx.\n", hr);
         init_media_type(mediatype, rate == 44100 ? input_type_desc_44100 : input_type_desc_48000, i + 1);
     }




More information about the wine-cvs mailing list