[PATCH] mfreadwrite: Return IMFSourceReaderEx interface for source reader.

Alistair Leslie-Hughes leslie_alistair at hotmail.com
Sat Feb 19 23:19:53 CST 2022


Windows 8 and above return an IMFSourceReaderEx interface by default.

Signed-off-by: Alistair Leslie-Hughes <leslie_alistair at hotmail.com>
---
 dlls/mfreadwrite/reader.c       | 108 +++++++++++++++++++++-----------
 dlls/mfreadwrite/tests/mfplat.c |   6 ++
 2 files changed, 78 insertions(+), 36 deletions(-)

diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c
index bdf2e7f5a6f..133403f77d3 100644
--- a/dlls/mfreadwrite/reader.c
+++ b/dlls/mfreadwrite/reader.c
@@ -150,7 +150,7 @@ enum source_reader_flags
 
 struct source_reader
 {
-    IMFSourceReader IMFSourceReader_iface;
+    IMFSourceReaderEx IMFSourceReaderEx_iface;
     IMFAsyncCallback source_events_callback;
     IMFAsyncCallback stream_events_callback;
     IMFAsyncCallback async_commands_callback;
@@ -176,9 +176,9 @@ struct source_reader
     CONDITION_VARIABLE stop_event;
 };
 
-static inline struct source_reader *impl_from_IMFSourceReader(IMFSourceReader *iface)
+static inline struct source_reader *impl_from_IMFSourceReaderEx(IMFSourceReaderEx *iface)
 {
-    return CONTAINING_RECORD(iface, struct source_reader, IMFSourceReader_iface);
+    return CONTAINING_RECORD(iface, struct source_reader, IMFSourceReaderEx_iface);
 }
 
 static struct source_reader *impl_from_source_callback_IMFAsyncCallback(IMFAsyncCallback *iface)
@@ -1360,16 +1360,17 @@ static const IMFAsyncCallbackVtbl async_commands_callback_vtbl =
     source_reader_async_commands_callback_Invoke,
 };
 
-static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReader *iface, REFIID riid, void **out)
+static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReaderEx *iface, REFIID riid, void **out)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
 
     TRACE("%p, %s, %p.\n", iface, debugstr_guid(riid), out);
 
     if(IsEqualGUID(riid, &IID_IUnknown) ||
-       IsEqualGUID(riid, &IID_IMFSourceReader))
+       IsEqualGUID(riid, &IID_IMFSourceReader) ||
+       IsEqualGUID(riid, &IID_IMFSourceReaderEx))
     {
-        *out = &reader->IMFSourceReader_iface;
+        *out = &reader->IMFSourceReaderEx_iface;
     }
     else
     {
@@ -1382,9 +1383,9 @@ static HRESULT WINAPI src_reader_QueryInterface(IMFSourceReader *iface, REFIID r
     return S_OK;
 }
 
-static ULONG WINAPI src_reader_AddRef(IMFSourceReader *iface)
+static ULONG WINAPI src_reader_AddRef(IMFSourceReaderEx *iface)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     ULONG refcount = InterlockedIncrement(&reader->public_refcount);
 
     TRACE("%p, refcount %lu.\n", iface, refcount);
@@ -1408,9 +1409,9 @@ static BOOL source_reader_is_source_stopped(const struct source_reader *reader)
     return TRUE;
 }
 
-static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
+static ULONG WINAPI src_reader_Release(IMFSourceReaderEx *iface)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     ULONG refcount = InterlockedDecrement(&reader->public_refcount);
 
     TRACE("%p, refcount %lu.\n", iface, refcount);
@@ -1436,9 +1437,9 @@ static ULONG WINAPI src_reader_Release(IMFSourceReader *iface)
     return refcount;
 }
 
-static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReader *iface, DWORD index, BOOL *selected)
+static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReaderEx *iface, DWORD index, BOOL *selected)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
 
     TRACE("%p, %#lx, %p.\n", iface, index, selected);
 
@@ -1457,9 +1458,9 @@ static HRESULT WINAPI src_reader_GetStreamSelection(IMFSourceReader *iface, DWOR
     return source_reader_get_stream_selection(reader, index, selected);
 }
 
-static HRESULT WINAPI src_reader_SetStreamSelection(IMFSourceReader *iface, DWORD index, BOOL selection)
+static HRESULT WINAPI src_reader_SetStreamSelection(IMFSourceReaderEx *iface, DWORD index, BOOL selection)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     HRESULT hr = S_OK;
     BOOL selection_changed = FALSE, selected;
     unsigned int i;
@@ -1562,19 +1563,19 @@ static HRESULT source_reader_get_native_media_type(struct source_reader *reader,
     return hr;
 }
 
-static HRESULT WINAPI src_reader_GetNativeMediaType(IMFSourceReader *iface, DWORD index, DWORD type_index,
+static HRESULT WINAPI src_reader_GetNativeMediaType(IMFSourceReaderEx *iface, DWORD index, DWORD type_index,
             IMFMediaType **type)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
 
     TRACE("%p, %#lx, %#lx, %p.\n", iface, index, type_index, type);
 
     return source_reader_get_native_media_type(reader, index, type_index, type);
 }
 
-static HRESULT WINAPI src_reader_GetCurrentMediaType(IMFSourceReader *iface, DWORD index, IMFMediaType **type)
+static HRESULT WINAPI src_reader_GetCurrentMediaType(IMFSourceReaderEx *iface, DWORD index, IMFMediaType **type)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     HRESULT hr;
 
     TRACE("%p, %#lx, %p.\n", iface, index, type);
@@ -1832,10 +1833,10 @@ static HRESULT source_reader_create_decoder_for_stream(struct source_reader *rea
     return MF_E_TOPO_CODEC_NOT_FOUND;
 }
 
-static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReader *iface, DWORD index, DWORD *reserved,
+static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReaderEx *iface, DWORD index, DWORD *reserved,
         IMFMediaType *type)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     HRESULT hr;
 
     TRACE("%p, %#lx, %p, %p.\n", iface, index, reserved, type);
@@ -1870,9 +1871,9 @@ static HRESULT WINAPI src_reader_SetCurrentMediaType(IMFSourceReader *iface, DWO
     return hr;
 }
 
-static HRESULT WINAPI src_reader_SetCurrentPosition(IMFSourceReader *iface, REFGUID format, REFPROPVARIANT position)
+static HRESULT WINAPI src_reader_SetCurrentPosition(IMFSourceReaderEx *iface, REFGUID format, REFPROPVARIANT position)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     struct source_reader_async_command *command;
     unsigned int i;
     DWORD flags;
@@ -2017,10 +2018,10 @@ static HRESULT source_reader_read_sample_async(struct source_reader *reader, uns
     return hr;
 }
 
-static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index, DWORD flags, DWORD *actual_index,
+static HRESULT WINAPI src_reader_ReadSample(IMFSourceReaderEx *iface, DWORD index, DWORD flags, DWORD *actual_index,
         DWORD *stream_flags, LONGLONG *timestamp, IMFSample **sample)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     HRESULT hr;
 
     TRACE("%p, %#lx, %#lx, %p, %p, %p, %p\n", iface, index, flags, actual_index, stream_flags, timestamp, sample);
@@ -2079,9 +2080,9 @@ static HRESULT source_reader_flush_async(struct source_reader *reader, unsigned
     return hr;
 }
 
-static HRESULT WINAPI src_reader_Flush(IMFSourceReader *iface, DWORD index)
+static HRESULT WINAPI src_reader_Flush(IMFSourceReaderEx *iface, DWORD index)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     HRESULT hr;
 
     TRACE("%p, %#lx.\n", iface, index);
@@ -2098,10 +2099,10 @@ static HRESULT WINAPI src_reader_Flush(IMFSourceReader *iface, DWORD index)
     return hr;
 }
 
-static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWORD index, REFGUID service,
+static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReaderEx *iface, DWORD index, REFGUID service,
         REFIID riid, void **object)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     IUnknown *obj = NULL;
     HRESULT hr = S_OK;
 
@@ -2160,10 +2161,10 @@ static HRESULT WINAPI src_reader_GetServiceForStream(IMFSourceReader *iface, DWO
     return hr;
 }
 
-static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReader *iface, DWORD index,
+static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReaderEx *iface, DWORD index,
         REFGUID guid, PROPVARIANT *value)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct source_reader *reader = impl_from_IMFSourceReaderEx(iface);
     IMFStreamDescriptor *sd;
     BOOL selected;
     HRESULT hr;
@@ -2208,7 +2209,38 @@ static HRESULT WINAPI src_reader_GetPresentationAttribute(IMFSourceReader *iface
     return hr;
 }
 
-static const IMFSourceReaderVtbl srcreader_vtbl =
+static HRESULT WINAPI src_reader_SetNativeMediaType(IMFSourceReaderEx *iface, DWORD stream_index,
+        IMFMediaType *media_type, DWORD *stream_flags)
+{
+    FIXME("%p, %#lx, %p, %p\n", iface, stream_index, media_type, stream_flags);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI src_reader_AddTransformForStream(IMFSourceReaderEx *iface, DWORD stream_index,
+    IUnknown *transform)
+{
+    FIXME("%p, %#lx, %p\n", iface, stream_index, transform);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI src_reader_RemoveAllTransformsForStream(IMFSourceReaderEx *iface, DWORD stream_index)
+{
+    FIXME("%p, %#lx\n", iface, stream_index);
+
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI src_reader_GetTransformForStream(IMFSourceReaderEx *iface, DWORD stream_index,
+    DWORD transform_index, GUID *category, IMFTransform **transform)
+{
+    FIXME("%p, %#lx, %#lx, %p, %p\n", iface, stream_index, transform_index, category, transform);
+
+    return E_NOTIMPL;
+}
+
+static const IMFSourceReaderExVtbl srcreader_vtbl =
 {
     src_reader_QueryInterface,
     src_reader_AddRef,
@@ -2222,7 +2254,11 @@ static const IMFSourceReaderVtbl srcreader_vtbl =
     src_reader_ReadSample,
     src_reader_Flush,
     src_reader_GetServiceForStream,
-    src_reader_GetPresentationAttribute
+    src_reader_GetPresentationAttribute,
+    src_reader_SetNativeMediaType,
+    src_reader_AddTransformForStream,
+    src_reader_RemoveAllTransformsForStream,
+    src_reader_GetTransformForStream
 };
 
 static DWORD reader_get_first_stream_index(IMFPresentationDescriptor *descriptor, const GUID *major)
@@ -2324,7 +2360,7 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
     if (!object)
         return E_OUTOFMEMORY;
 
-    object->IMFSourceReader_iface.lpVtbl = &srcreader_vtbl;
+    object->IMFSourceReaderEx_iface.lpVtbl = &srcreader_vtbl;
     object->source_events_callback.lpVtbl = &source_events_callback_vtbl;
     object->stream_events_callback.lpVtbl = &stream_events_callback_vtbl;
     object->async_commands_callback.lpVtbl = &async_commands_callback_vtbl;
@@ -2445,10 +2481,10 @@ static HRESULT create_source_reader_from_source(IMFMediaSource *source, IMFAttri
         WARN("Failed to acquired shared queue, hr %#lx.\n", hr);
 
     if (SUCCEEDED(hr))
-        hr = IMFSourceReader_QueryInterface(&object->IMFSourceReader_iface, riid, out);
+        hr = IMFSourceReaderEx_QueryInterface(&object->IMFSourceReaderEx_iface, riid, out);
 
 failed:
-    IMFSourceReader_Release(&object->IMFSourceReader_iface);
+    IMFSourceReaderEx_Release(&object->IMFSourceReaderEx_iface);
     return hr;
 }
 
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c
index fcf642859d5..01881bcb387 100644
--- a/dlls/mfreadwrite/tests/mfplat.c
+++ b/dlls/mfreadwrite/tests/mfplat.c
@@ -890,6 +890,7 @@ static void test_source_reader_from_media_source(void)
 {
     struct async_callback *callback;
     IMFSourceReader *reader;
+    IMFSourceReaderEx *readerex;
     IMFMediaSource *source;
     IMFMediaType *media_type;
     HRESULT hr;
@@ -907,6 +908,11 @@ static void test_source_reader_from_media_source(void)
     hr = MFCreateSourceReaderFromMediaSource(source, NULL, &reader);
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
 
+    hr = IMFSourceReader_QueryInterface(reader, &IID_IMFSourceReaderEx, (void**)&readerex);
+    ok(hr == S_OK || broken(hr == E_NOINTERFACE) /* Windows 7 and below.*/, "Unexpected hr %#lx.\n", hr);
+    if (readerex)
+        IMFSourceReaderEx_Release(readerex);
+
     /* MF_SOURCE_READER_ANY_STREAM */
     hr = IMFSourceReader_SetStreamSelection(reader, 0, FALSE);
     ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
-- 
2.34.1




More information about the wine-devel mailing list