[PATCH] mf/samplegrabber: Evaluate type compatibility by comparison to the initial type.
Derek Lesho
dlesho at codeweavers.com
Mon Nov 23 14:34:37 CST 2020
Signed-off-by: Derek Lesho <dlesho at codeweavers.com>
---
dlls/mf/samplegrabber.c | 9 ++++---
dlls/mf/tests/mf.c | 56 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index 566ee2f2930..aa583e38dc0 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -67,7 +67,7 @@ struct sample_grabber
LONG refcount;
IMFSampleGrabberSinkCallback *callback;
IMFSampleGrabberSinkCallback2 *callback2;
- IMFMediaType *media_type;
+ IMFMediaType *media_type, *base_type;
BOOL is_shut_down;
IMFMediaEventQueue *event_queue;
IMFMediaEventQueue *stream_event_queue;
@@ -558,7 +558,7 @@ 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)
@@ -567,7 +567,7 @@ static HRESULT sample_grabber_stream_is_media_type_supported(struct sample_grabb
if (!in_type)
return E_POINTER;
- if (IMFMediaType_IsEqual(grabber->media_type, in_type, &flags) == S_OK)
+ if (IMFMediaType_IsEqual(grabber->base_type, in_type, &flags) == S_OK)
return S_OK;
return (flags & supported_flags) == supported_flags ? S_OK : MF_E_INVALIDMEDIATYPE;
@@ -819,6 +819,7 @@ static ULONG WINAPI sample_grabber_sink_Release(IMFMediaSink *iface)
if (grabber->callback2)
IMFSampleGrabberSinkCallback2_Release(grabber->callback2);
IMFMediaType_Release(grabber->media_type);
+ IMFMediaType_Release(grabber->base_type);
if (grabber->event_queue)
IMFMediaEventQueue_Release(grabber->event_queue);
if (grabber->clock)
@@ -1284,6 +1285,8 @@ static HRESULT sample_grabber_create_object(IMFAttributes *attributes, void *use
}
object->media_type = context->media_type;
IMFMediaType_AddRef(object->media_type);
+ MFCreateMediaType(&object->base_type);
+ IMFMediaType_CopyAllItems(context->media_type, (IMFAttributes *)object->base_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 43dc9a49ee7..dd3605c1075 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -2421,6 +2421,62 @@ static void test_sample_grabber(void)
refcount = IMFActivate_Release(activate);
ok(!refcount, "Unexpected refcount %u.\n", refcount);
+ /* 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);
+
+ /* 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_SetCurrentMediaType(handler, media_type2);
+ ok(hr == MF_E_INVALIDMEDIATYPE, "Failed to set media type, hr %#x.\n", hr);
+
+ 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_SetCurrentMediaType(handler, media_type2);
+ ok(hr == S_OK, "Failed to set media type, hr %#x.\n", hr);
+
+ IMFMediaType_Release(media_type2);
+ IMFMediaType_Release(media_type);
+
+ IMFMediaTypeHandler_Release(handler);
+ IMFMediaSink_Release(sink);
+ IMFStreamSink_Release(stream);
+
+ refcount = IMFActivate_Release(activate);
+ ok(!refcount, "Unexpected refcount %u.\n", refcount);
+
/* Rateless mode with MF_SAMPLEGRABBERSINK_IGNORE_CLOCK. */
hr = MFCreateMediaType(&media_type);
ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
--
2.29.2
More information about the wine-devel
mailing list