Derek Lesho : mf/samplegrabber: Evaluate type compatibility by comparison to the initial type.

Alexandre Julliard julliard at winehq.org
Fri Nov 27 16:04:38 CST 2020


Module: wine
Branch: master
Commit: 133ba763e1f419dc23fd58ac82c6d8a73014ae22
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=133ba763e1f419dc23fd58ac82c6d8a73014ae22

Author: Derek Lesho <dlesho at codeweavers.com>
Date:   Thu Nov 26 12:42:31 2020 +0300

mf/samplegrabber: Evaluate type compatibility by comparison to the initial type.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mf/samplegrabber.c |  17 +++++---
 dlls/mf/tests/mf.c      | 104 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 6 deletions(-)

diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index 54e28b466c5..f60ce2a8433 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -72,6 +72,7 @@ struct sample_grabber
     IMFSampleGrabberSinkCallback *callback;
     IMFSampleGrabberSinkCallback2 *callback2;
     IMFMediaType *media_type;
+    IMFMediaType *current_media_type;
     BOOL is_shut_down;
     IMFMediaEventQueue *event_queue;
     IMFMediaEventQueue *stream_event_queue;
@@ -572,7 +573,8 @@ static ULONG WINAPI sample_grabber_stream_type_handler_Release(IMFMediaTypeHandl
 
 static HRESULT sample_grabber_stream_is_media_type_supported(struct sample_grabber *grabber, IMFMediaType *in_type)
 {
-    const DWORD supported_flags = MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_TYPES;
+    const DWORD supported_flags = MF_MEDIATYPE_EQUAL_MAJOR_TYPES | MF_MEDIATYPE_EQUAL_FORMAT_TYPES |
+            MF_MEDIATYPE_EQUAL_FORMAT_DATA;
     DWORD flags;
 
     if (grabber->is_shut_down)
@@ -631,9 +633,9 @@ static HRESULT WINAPI sample_grabber_stream_type_handler_SetCurrentMediaType(IMF
     if (FAILED(hr = sample_grabber_stream_is_media_type_supported(grabber, media_type)))
         return hr;
 
-    IMFMediaType_Release(grabber->media_type);
-    grabber->media_type = media_type;
-    IMFMediaType_AddRef(grabber->media_type);
+    IMFMediaType_Release(grabber->current_media_type);
+    grabber->current_media_type = media_type;
+    IMFMediaType_AddRef(grabber->current_media_type);
 
     return S_OK;
 }
@@ -651,7 +653,7 @@ static HRESULT WINAPI sample_grabber_stream_type_handler_GetCurrentMediaType(IMF
     if (grabber->is_shut_down)
         return MF_E_STREAMSINK_REMOVED;
 
-    *media_type = grabber->media_type;
+    *media_type = grabber->current_media_type;
     IMFMediaType_AddRef(*media_type);
 
     return S_OK;
@@ -669,7 +671,7 @@ static HRESULT WINAPI sample_grabber_stream_type_handler_GetMajorType(IMFMediaTy
     if (grabber->is_shut_down)
         return MF_E_STREAMSINK_REMOVED;
 
-    return IMFMediaType_GetMajorType(grabber->media_type, type);
+    return IMFMediaType_GetMajorType(grabber->current_media_type, type);
 }
 
 static const IMFMediaTypeHandlerVtbl sample_grabber_stream_type_handler_vtbl =
@@ -840,6 +842,7 @@ static ULONG WINAPI sample_grabber_sink_Release(IMFMediaSink *iface)
             IMFSampleGrabberSinkCallback_Release(grabber->callback);
         if (grabber->callback2)
             IMFSampleGrabberSinkCallback2_Release(grabber->callback2);
+        IMFMediaType_Release(grabber->current_media_type);
         IMFMediaType_Release(grabber->media_type);
         if (grabber->event_queue)
             IMFMediaEventQueue_Release(grabber->event_queue);
@@ -1411,6 +1414,8 @@ static HRESULT sample_grabber_create_object(IMFAttributes *attributes, void *use
     }
     object->media_type = context->media_type;
     IMFMediaType_AddRef(object->media_type);
+    object->current_media_type = context->media_type;
+    IMFMediaType_AddRef(object->current_media_type);
     IMFAttributes_GetUINT32(attributes, &MF_SAMPLEGRABBERSINK_IGNORE_CLOCK, &object->ignore_clock);
     IMFAttributes_GetUINT64(attributes, &MF_SAMPLEGRABBERSINK_SAMPLE_TIME_OFFSET, &object->sample_time_offset);
     list_init(&object->items);
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 41ca385cc2b..fda80974724 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -2562,6 +2562,109 @@ static void test_sample_grabber(void)
     ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
 }
 
+static void test_sample_grabber_is_mediatype_supported(void)
+{
+    IMFMediaType *media_type, *media_type2, *media_type3;
+    IMFMediaTypeHandler *handler;
+    IMFActivate *activate;
+    IMFStreamSink *stream;
+    IMFMediaSink *sink;
+    ULONG refcount;
+    HRESULT hr;
+    GUID guid;
+
+    /* IsMediaTypeSupported checks are done against the creation type, and check format data */
+    hr = MFCreateMediaType(&media_type);
+    ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
+
+    hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+    hr = IMFMediaType_SetGUID(media_type, &MF_MT_SUBTYPE, &MFAudioFormat_PCM);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+    hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+
+    hr = MFCreateSampleGrabberSinkActivate(media_type, &grabber_callback, &activate);
+    ok(hr == S_OK, "Failed to create grabber activate, hr %#x.\n", hr);
+
+    hr = IMFActivate_ActivateObject(activate, &IID_IMFMediaSink, (void **)&sink);
+    ok(hr == S_OK, "Failed to activate object, hr %#x.\n", hr);
+
+    hr = IMFMediaSink_GetStreamSinkByIndex(sink, 0, &stream);
+    ok(hr == S_OK, "Failed to get sink stream, hr %#x.\n", hr);
+    hr = IMFStreamSink_GetMediaTypeHandler(stream, &handler);
+    ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr);
+    IMFStreamSink_Release(stream);
+
+    IMFMediaSink_Release(sink);
+
+    /* On Win8+ this initialization happens automatically. */
+    hr = IMFMediaTypeHandler_SetCurrentMediaType(handler, media_type);
+    ok(hr == S_OK, "Failed to set media type, hr %#x.\n", hr);
+
+    hr = MFCreateMediaType(&media_type2);
+    ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
+
+    hr = IMFMediaType_SetGUID(media_type2, &MF_MT_MAJOR_TYPE, &MFMediaType_Audio);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+    hr = IMFMediaType_SetGUID(media_type2, &MF_MT_SUBTYPE, &MFAudioFormat_PCM);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+    hr = IMFMediaType_SetUINT32(media_type2, &MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, media_type2, NULL);
+    ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_SetCurrentMediaType(handler, media_type2);
+    ok(hr == MF_E_INVALIDMEDIATYPE, "Failed to set media type, hr %#x.\n", hr);
+
+    /* Make it match grabber type sample rate. */
+    hr = IMFMediaType_SetUINT32(media_type2, &MF_MT_AUDIO_SAMPLES_PER_SECOND, 44100);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, media_type2, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_SetCurrentMediaType(handler, media_type2);
+    ok(hr == S_OK, "Failed to set media type, hr %#x.\n", hr);
+    hr = IMFMediaTypeHandler_GetCurrentMediaType(handler, &media_type3);
+    ok(hr == S_OK, "Failed to set media type, hr %#x.\n", hr);
+    ok(media_type3 == media_type2, "Unexpected media type instance.\n");
+    IMFMediaType_Release(media_type3);
+
+    /* Change original type. */
+    hr = IMFMediaType_SetUINT32(media_type, &MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, media_type2, NULL);
+    ok(hr == MF_E_INVALIDMEDIATYPE, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaType_SetUINT32(media_type2, &MF_MT_AUDIO_SAMPLES_PER_SECOND, 48000);
+    ok(hr == S_OK, "Failed to set attribute, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_IsMediaTypeSupported(handler, media_type2, NULL);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(IsEqualGUID(&guid, &MFMediaType_Audio), "Unexpected major type.\n");
+
+    hr = IMFMediaType_SetGUID(media_type, &MF_MT_MAJOR_TYPE, &MFMediaType_Video);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+    ok(IsEqualGUID(&guid, &MFMediaType_Audio), "Unexpected major type.\n");
+
+    IMFMediaType_Release(media_type2);
+    IMFMediaType_Release(media_type);
+
+    IMFMediaTypeHandler_Release(handler);
+
+    refcount = IMFActivate_Release(activate);
+    ok(!refcount, "Unexpected refcount %u.\n", refcount);
+}
+
 static BOOL is_supported_video_type(const GUID *guid)
 {
     return IsEqualGUID(guid, &MFVideoFormat_L8)
@@ -4263,6 +4366,7 @@ START_TEST(mf)
     test_MFShutdownObject();
     test_presentation_clock();
     test_sample_grabber();
+    test_sample_grabber_is_mediatype_supported();
     test_video_processor();
     test_quality_manager();
     test_sar();




More information about the wine-cvs mailing list