[PATCH 7/9] mfplat: Return stub interface for stream descriptor type handler.

Nikolay Sivov nsivov at codeweavers.com
Mon Mar 4 03:27:24 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfplat/mediatype.c    | 102 ++++++++++++++++++++++++++++++++++++-
 dlls/mfplat/tests/mfplat.c |  79 ++++++++++++++++++++++++++++
 2 files changed, 179 insertions(+), 2 deletions(-)

diff --git a/dlls/mfplat/mediatype.c b/dlls/mfplat/mediatype.c
index 11f5eab8d4..79d34405fe 100644
--- a/dlls/mfplat/mediatype.c
+++ b/dlls/mfplat/mediatype.c
@@ -35,6 +35,7 @@ struct stream_desc
 {
     struct attributes attributes;
     IMFStreamDescriptor IMFStreamDescriptor_iface;
+    IMFMediaTypeHandler IMFMediaTypeHandler_iface;
 };
 
 static inline struct media_type *impl_from_IMFMediaType(IMFMediaType *iface)
@@ -47,6 +48,11 @@ static inline struct stream_desc *impl_from_IMFStreamDescriptor(IMFStreamDescrip
     return CONTAINING_RECORD(iface, struct stream_desc, IMFStreamDescriptor_iface);
 }
 
+static struct stream_desc *impl_from_IMFMediaTypeHandler(IMFMediaTypeHandler *iface)
+{
+    return CONTAINING_RECORD(iface, struct stream_desc, IMFMediaTypeHandler_iface);
+}
+
 static HRESULT WINAPI mediatype_QueryInterface(IMFMediaType *iface, REFIID riid, void **out)
 {
     TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
@@ -616,9 +622,14 @@ static HRESULT WINAPI stream_descriptor_GetStreamIdentifier(IMFStreamDescriptor
 
 static HRESULT WINAPI stream_descriptor_GetMediaTypeHandler(IMFStreamDescriptor *iface, IMFMediaTypeHandler **handler)
 {
-    FIXME("%p, %p.\n", iface, handler);
+    struct stream_desc *stream_desc = impl_from_IMFStreamDescriptor(iface);
 
-    return E_NOTIMPL;
+    TRACE("%p, %p.\n", iface, handler);
+
+    *handler = &stream_desc->IMFMediaTypeHandler_iface;
+    IMFStreamDescriptor_AddRef(iface);
+
+    return S_OK;
 }
 
 static const IMFStreamDescriptorVtbl streamdescriptorvtbl =
@@ -660,6 +671,92 @@ static const IMFStreamDescriptorVtbl streamdescriptorvtbl =
     stream_descriptor_GetMediaTypeHandler
 };
 
+static HRESULT WINAPI mediatype_handler_QueryInterface(IMFMediaTypeHandler *iface, REFIID riid, void **obj)
+{
+    TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), obj);
+
+    if (IsEqualIID(riid, &IID_IMFMediaTypeHandler) ||
+            IsEqualIID(riid, &IID_IUnknown))
+    {
+        *obj = iface;
+        IMFMediaTypeHandler_AddRef(iface);
+        return S_OK;
+    }
+
+    WARN("Unsupported %s.\n", debugstr_guid(riid));
+    *obj = NULL;
+    return E_NOINTERFACE;
+}
+
+static ULONG WINAPI mediatype_handler_AddRef(IMFMediaTypeHandler *iface)
+{
+    struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface);
+    return IMFStreamDescriptor_AddRef(&stream_desc->IMFStreamDescriptor_iface);
+}
+
+static ULONG WINAPI mediatype_handler_Release(IMFMediaTypeHandler *iface)
+{
+    struct stream_desc *stream_desc = impl_from_IMFMediaTypeHandler(iface);
+    return IMFStreamDescriptor_Release(&stream_desc->IMFStreamDescriptor_iface);
+}
+
+static HRESULT WINAPI mediatype_handler_IsMediaTypeSupported(IMFMediaTypeHandler *iface, IMFMediaType *in_type,
+        IMFMediaType **out_type)
+{
+    FIXME("%p, %p, %p.\n", iface, in_type, out_type);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mediatype_handler_GetMediaTypeCount(IMFMediaTypeHandler *iface, DWORD *count)
+{
+    FIXME("%p, %p.\n", iface, count);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mediatype_handler_GetMediaTypeByIndex(IMFMediaTypeHandler *iface, DWORD index,
+        IMFMediaType **type)
+{
+    FIXME("%p, %u, %p.\n", iface, index, type);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mediatype_handler_SetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType *type)
+{
+    FIXME("%p, %p.\n", iface, type);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mediatype_handler_GetCurrentMediaType(IMFMediaTypeHandler *iface, IMFMediaType **type)
+{
+    FIXME("%p, %p.\n", iface, type);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI mediatype_handler_GetMajorType(IMFMediaTypeHandler *iface, GUID *type)
+{
+    FIXME("%p, %p.\n", iface, type);
+
+    return E_NOTIMPL;
+}
+
+static const IMFMediaTypeHandlerVtbl mediatypehandlervtbl =
+{
+    mediatype_handler_QueryInterface,
+    mediatype_handler_AddRef,
+    mediatype_handler_Release,
+    mediatype_handler_IsMediaTypeSupported,
+    mediatype_handler_GetMediaTypeCount,
+    mediatype_handler_GetMediaTypeByIndex,
+    mediatype_handler_SetCurrentMediaType,
+    mediatype_handler_GetCurrentMediaType,
+    mediatype_handler_GetMajorType,
+};
+
 /***********************************************************************
  *      MFCreateStreamDescriptor (mfplat.@)
  */
@@ -676,6 +773,7 @@ HRESULT WINAPI MFCreateStreamDescriptor(DWORD identifier, DWORD count,
 
     init_attribute_object(&object->attributes, 0);
     object->IMFStreamDescriptor_iface.lpVtbl = &streamdescriptorvtbl;
+    object->IMFMediaTypeHandler_iface.lpVtbl = &mediatypehandlervtbl;
     *descriptor = &object->IMFStreamDescriptor_iface;
 
     return S_OK;
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 4405bd9282..ad608ac77f 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -1429,6 +1429,84 @@ static void test_event_queue(void)
     ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
 }
 
+static void test_stream_descriptor(void)
+{
+    IMFMediaType *media_types[2], *media_type;
+    IMFMediaTypeHandler *type_handler;
+    IMFStreamDescriptor *stream_desc;
+    GUID major_type;
+    DWORD id, count;
+    unsigned int i;
+    HRESULT hr;
+
+    for (i = 0; i < ARRAY_SIZE(media_types); ++i)
+    {
+        hr = MFCreateMediaType(&media_types[i]);
+        ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
+    }
+
+    hr = MFCreateStreamDescriptor(123, 0, media_types, &stream_desc);
+todo_wine
+    ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
+
+    hr = MFCreateStreamDescriptor(123, ARRAY_SIZE(media_types), media_types, &stream_desc);
+    ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFStreamDescriptor_GetStreamIdentifier(stream_desc, &id);
+todo_wine {
+    ok(hr == S_OK, "Failed to get descriptor id, hr %#x.\n", hr);
+    ok(id == 123, "Unexpected id %#x.\n", id);
+}
+    hr = IMFStreamDescriptor_GetMediaTypeHandler(stream_desc, &type_handler);
+    ok(hr == S_OK, "Failed to get type handler, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count);
+todo_wine {
+    ok(hr == S_OK, "Failed to get type count, hr %#x.\n", hr);
+    ok(count == ARRAY_SIZE(media_types), "Unexpected type count.\n");
+}
+    hr = IMFMediaTypeHandler_GetCurrentMediaType(type_handler, &media_type);
+todo_wine
+    ok(hr == MF_E_NOT_INITIALIZED, "Unexpected hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_GetMajorType(type_handler, &major_type);
+todo_wine
+    ok(hr == MF_E_ATTRIBUTENOTFOUND, "Unexpected hr %#x.\n", hr);
+
+    for (i = 0; i < ARRAY_SIZE(media_types); ++i)
+    {
+        hr = IMFMediaTypeHandler_GetMediaTypeByIndex(type_handler, i, &media_type);
+todo_wine {
+        ok(hr == S_OK, "Failed to get media type, hr %#x.\n", hr);
+        ok(media_type == media_types[i], "Unexpected object.\n");
+}
+        if (SUCCEEDED(hr))
+            IMFMediaType_Release(media_type);
+    }
+
+    hr = IMFMediaTypeHandler_GetMediaTypeByIndex(type_handler, 2, &media_type);
+todo_wine
+    ok(hr == MF_E_NO_MORE_TYPES, "Unexpected hr %#x.\n", hr);
+
+    hr = MFCreateMediaType(&media_type);
+    ok(hr == S_OK, "Failed to create media type, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_SetCurrentMediaType(type_handler, media_type);
+todo_wine
+    ok(hr == S_OK, "Failed to set current type, hr %#x.\n", hr);
+
+    hr = IMFMediaTypeHandler_GetMediaTypeCount(type_handler, &count);
+todo_wine {
+    ok(hr == S_OK, "Failed to get type count, hr %#x.\n", hr);
+    ok(count == ARRAY_SIZE(media_types), "Unexpected type count.\n");
+}
+    IMFMediaType_Release(media_type);
+
+    IMFMediaTypeHandler_Release(type_handler);
+
+    IMFStreamDescriptor_Release(stream_desc);
+}
+
 START_TEST(mfplat)
 {
     CoInitialize(NULL);
@@ -1454,6 +1532,7 @@ START_TEST(mfplat)
     test_serial_queue();
     test_periodic_callback();
     test_event_queue();
+    test_stream_descriptor();
 
     CoUninitialize();
 }
-- 
2.20.1




More information about the wine-devel mailing list