Signed-off-by: Nikolay Sivov nsivov@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(); }