[PATCH 4/5] winegstreamer: Move the IWMHeaderInfo3 implementation to the wm_reader object.

Zebediah Figura zfigura at codeweavers.com
Wed Oct 20 11:09:48 CDT 2021


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/winegstreamer/gst_private.h    |   1 +
 dlls/winegstreamer/wm_asyncreader.c | 227 ----------------------------
 dlls/winegstreamer/wm_reader.c      | 215 +++++++++++++++++++++++++-
 dlls/wmvcore/tests/wmvcore.c        |   6 +-
 4 files changed, 218 insertions(+), 231 deletions(-)

diff --git a/dlls/winegstreamer/gst_private.h b/dlls/winegstreamer/gst_private.h
index 6c86031897e..71d3bb2b509 100644
--- a/dlls/winegstreamer/gst_private.h
+++ b/dlls/winegstreamer/gst_private.h
@@ -115,6 +115,7 @@ HRESULT audio_converter_create(REFIID riid, void **ret) DECLSPEC_HIDDEN;
 
 struct wm_reader
 {
+    IWMHeaderInfo3 IWMHeaderInfo3_iface;
     IWMProfile3 IWMProfile3_iface;
     LONG refcount;
 
diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c
index 3e341ec41e9..1361b20932f 100644
--- a/dlls/winegstreamer/wm_asyncreader.c
+++ b/dlls/winegstreamer/wm_asyncreader.c
@@ -32,7 +32,6 @@ struct async_reader
     IWMReaderTypeNegotiation IWMReaderTypeNegotiation_iface;
     IWMReaderTimecode IWMReaderTimecode_iface;
     IWMReaderPlaylistBurn IWMReaderPlaylistBurn_iface;
-    IWMHeaderInfo3 IWMHeaderInfo3_iface;
     IWMLanguageList IWMLanguageList_iface;
     IReferenceClock IReferenceClock_iface;
     IWMPacketSize2 IWMPacketSize2_iface;
@@ -1258,226 +1257,6 @@ static const IWMReaderPlaylistBurnVtbl WMReaderPlaylistBurnVtbl =
     playlist_EndPlaylistBurn
 };
 
-static struct async_reader *impl_from_IWMHeaderInfo3(IWMHeaderInfo3 *iface)
-{
-    return CONTAINING_RECORD(iface, struct async_reader, IWMHeaderInfo3_iface);
-}
-
-static HRESULT WINAPI headerinfo_QueryInterface(IWMHeaderInfo3 *iface, REFIID riid, void **ppv)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    return IWMReader_QueryInterface(&This->IWMReader_iface, riid, ppv);
-}
-
-static ULONG WINAPI headerinfo_AddRef(IWMHeaderInfo3 *iface)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    return IWMReader_AddRef(&This->IWMReader_iface);
-}
-
-static ULONG WINAPI headerinfo_Release(IWMHeaderInfo3 *iface)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    return IWMReader_Release(&This->IWMReader_iface);
-}
-
-static HRESULT WINAPI headerinfo_GetAttributeCount(IWMHeaderInfo3 *iface, WORD stream_num, WORD *attributes)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %p\n", This, stream_num, attributes);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetAttributeByIndex(IWMHeaderInfo3 *iface, WORD index, WORD *stream_num,
-        WCHAR *name, WORD *name_len, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *length)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %p, %p, %p, %p, %p, %p\n", This, index, stream_num, name, name_len, type,
-            value, length);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetAttributeByName(IWMHeaderInfo3 *iface, WORD *stream_num, LPCWSTR name,
-        WMT_ATTR_DATATYPE *type, BYTE *value, WORD *length)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %p, %s, %p, %p, %p\n", This, stream_num, debugstr_w(name), type, value, length);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_SetAttribute(IWMHeaderInfo3 *iface, WORD stream_num, LPCWSTR name,
-        WMT_ATTR_DATATYPE type, const BYTE *value, WORD length)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %s, %d, %p, %d\n", This, stream_num, debugstr_w(name), type, value, length);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetMarkerCount(IWMHeaderInfo3 *iface, WORD *markers)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %p\n", This, markers);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetMarker(IWMHeaderInfo3 *iface, WORD index, WCHAR *marker_name,
-        WORD *marker_len, QWORD *marker_time)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %p, %p, %p\n", This, index, marker_name, marker_len, marker_time);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_AddMarker(IWMHeaderInfo3 *iface, LPCWSTR_WMSDK_TYPE_SAFE marker_name,
-        QWORD marker_time)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %p, %s\n", This, marker_name, wine_dbgstr_longlong(marker_time));
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_RemoveMarker(IWMHeaderInfo3 *iface, WORD index)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d\n", This, index);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetScriptCount(IWMHeaderInfo3 *iface, WORD *scripts)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %p\n", This, scripts);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetScript(IWMHeaderInfo3 *iface, WORD index, WCHAR *type,
-        WORD *type_len, WCHAR *command, WORD *command_len, QWORD *script_time)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %p, %p, %p, %p, %p\n", This, index, type, type_len, command, command_len, script_time);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_AddScript(IWMHeaderInfo3 *iface, LPCWSTR_WMSDK_TYPE_SAFE type,
-        LPCWSTR_WMSDK_TYPE_SAFE command, QWORD script_time)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %s, %s, %s\n", This, debugstr_w(type), debugstr_w(command), wine_dbgstr_longlong(script_time));
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_RemoveScript(IWMHeaderInfo3 *iface, WORD index)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d\n", This, index);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetCodecInfoCount(IWMHeaderInfo3 *iface, DWORD *codec_infos)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %p\n", This, codec_infos);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetCodecInfo(IWMHeaderInfo3 *iface, DWORD index, WORD *name_len,
-        WCHAR *name, WORD *description_len, WCHAR *description, WMT_CODEC_INFO_TYPE *codec_type,
-        WORD *codec_info_cnt, BYTE *codec_info)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %p, %p, %p, %p, %p, %p, %p\n", This, index, name_len, name, description_len,
-            description, codec_type, codec_info_cnt, codec_info);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetAttributeCountEx(IWMHeaderInfo3 *iface, WORD stream_num, WORD *attributes)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %p\n", This, stream_num, attributes);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetAttributeIndices(IWMHeaderInfo3 *iface, WORD stream_num, LPCWSTR name,
-        WORD *lang_index, WORD *indices, WORD *count)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %s, %p, %p, %p\n", This, stream_num, debugstr_w(name), lang_index, indices, count);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_GetAttributeByIndexEx(IWMHeaderInfo3 *iface, WORD stream_num,
-        WORD index, LPWSTR name, WORD *name_len, WMT_ATTR_DATATYPE *type, WORD *lang_index,
-        BYTE *value, DWORD *data_len)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %d, %s, %p, %p, %p, %p, %p\n", This, stream_num, index, debugstr_w(name), name_len,
-            type, lang_index, value, data_len);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_ModifyAttribute(IWMHeaderInfo3 *iface, WORD stream_num,
-        WORD index, WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD length)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %d, %d, %d, %p, %d\n", This, stream_num, index, type, lang_index, value, length);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_AddAttribute(IWMHeaderInfo3 *iface, WORD stream_num, LPCWSTR name,
-        WORD *index, WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD length)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %s, %p, %d, %d, %p, %d\n", This, stream_num, debugstr_w(name), index,
-            type, lang_index, value, length);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_DeleteAttribute(IWMHeaderInfo3 *iface, WORD stream_num, WORD index)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %d, %d\n", This, stream_num, index);
-    return E_NOTIMPL;
-}
-
-static HRESULT WINAPI headerinfo_AddCodecInfo(IWMHeaderInfo3 *iface, LPCWSTR_WMSDK_TYPE_SAFE name,
-        LPCWSTR_WMSDK_TYPE_SAFE description, WMT_CODEC_INFO_TYPE codec_type, WORD codec_info_cnt,
-        BYTE *codec_info)
-{
-    struct async_reader *This = impl_from_IWMHeaderInfo3(iface);
-    FIXME("%p, %p, %p, %d, %d, %p\n", This, name, description, codec_type, codec_info_cnt,
-            codec_info);
-    return E_NOTIMPL;
-}
-
-static const IWMHeaderInfo3Vtbl WMHeaderInfo3Vtbl =
-{
-    headerinfo_QueryInterface,
-    headerinfo_AddRef,
-    headerinfo_Release,
-    headerinfo_GetAttributeCount,
-    headerinfo_GetAttributeByIndex,
-    headerinfo_GetAttributeByName,
-    headerinfo_SetAttribute,
-    headerinfo_GetMarkerCount,
-    headerinfo_GetMarker,
-    headerinfo_AddMarker,
-    headerinfo_RemoveMarker,
-    headerinfo_GetScriptCount,
-    headerinfo_GetScript,
-    headerinfo_AddScript,
-    headerinfo_RemoveScript,
-    headerinfo_GetCodecInfoCount,
-    headerinfo_GetCodecInfo,
-    headerinfo_GetAttributeCountEx,
-    headerinfo_GetAttributeIndices,
-    headerinfo_GetAttributeByIndexEx,
-    headerinfo_ModifyAttribute,
-    headerinfo_AddAttribute,
-    headerinfo_DeleteAttribute,
-    headerinfo_AddCodecInfo
-};
-
-
 static struct async_reader *impl_from_IWMLanguageList(IWMLanguageList *iface)
 {
     return CONTAINING_RECORD(iface, struct async_reader, IWMLanguageList_iface);
@@ -1676,11 +1455,6 @@ static void *async_reader_query_interface(struct wm_reader *iface, REFIID iid)
     if (IsEqualIID(iid, &IID_IReferenceClock))
         return &reader->IReferenceClock_iface;
 
-    if (IsEqualIID(iid, &IID_IWMHeaderInfo)
-            || IsEqualIID(iid, &IID_IWMHeaderInfo2)
-            || IsEqualIID(iid, &IID_IWMHeaderInfo3))
-        return &reader->IWMHeaderInfo3_iface;
-
     if (IsEqualIID(iid, &IID_IWMLanguageList))
         return &reader->IWMLanguageList_iface;
 
@@ -1748,7 +1522,6 @@ HRESULT WINAPI winegstreamer_create_wm_async_reader(IWMReader **reader)
     wm_reader_init(&object->reader, &async_reader_ops);
 
     object->IReferenceClock_iface.lpVtbl = &ReferenceClockVtbl;
-    object->IWMHeaderInfo3_iface.lpVtbl = &WMHeaderInfo3Vtbl;
     object->IWMLanguageList_iface.lpVtbl = &WMLanguageListVtbl;
     object->IWMPacketSize2_iface.lpVtbl = &WMPacketSize2Vtbl;
     object->IWMReader_iface.lpVtbl = &WMReaderVtbl;
diff --git a/dlls/winegstreamer/wm_reader.c b/dlls/winegstreamer/wm_reader.c
index 2bab6eb462d..bcc5ce41e9b 100644
--- a/dlls/winegstreamer/wm_reader.c
+++ b/dlls/winegstreamer/wm_reader.c
@@ -31,7 +31,13 @@ static HRESULT WINAPI profile_QueryInterface(IWMProfile3 *iface, REFIID iid, voi
 
     TRACE("reader %p, iid %s, out %p.\n", reader, debugstr_guid(iid), out);
 
-    if (IsEqualIID(iid, &IID_IUnknown)
+    if (IsEqualIID(iid, &IID_IWMHeaderInfo)
+            || IsEqualIID(iid, &IID_IWMHeaderInfo2)
+            || IsEqualIID(iid, &IID_IWMHeaderInfo3))
+    {
+        *out = &reader->IWMHeaderInfo3_iface;
+    }
+    else if (IsEqualIID(iid, &IID_IUnknown)
             || IsEqualIID(iid, &IID_IWMProfile)
             || IsEqualIID(iid, &IID_IWMProfile2)
             || IsEqualIID(iid, &IID_IWMProfile3))
@@ -300,8 +306,215 @@ static const IWMProfile3Vtbl profile_vtbl =
     profile_GetExpectedPacketCount,
 };
 
+static struct wm_reader *impl_from_IWMHeaderInfo3(IWMHeaderInfo3 *iface)
+{
+    return CONTAINING_RECORD(iface, struct wm_reader, IWMHeaderInfo3_iface);
+}
+
+static HRESULT WINAPI header_info_QueryInterface(IWMHeaderInfo3 *iface, REFIID iid, void **out)
+{
+    struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface);
+
+    return IWMProfile3_QueryInterface(&reader->IWMProfile3_iface, iid, out);
+}
+
+static ULONG WINAPI header_info_AddRef(IWMHeaderInfo3 *iface)
+{
+    struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface);
+
+    return IWMProfile3_AddRef(&reader->IWMProfile3_iface);
+}
+
+static ULONG WINAPI header_info_Release(IWMHeaderInfo3 *iface)
+{
+    struct wm_reader *reader = impl_from_IWMHeaderInfo3(iface);
+
+    return IWMProfile3_Release(&reader->IWMProfile3_iface);
+}
+
+static HRESULT WINAPI header_info_GetAttributeCount(IWMHeaderInfo3 *iface, WORD stream_number, WORD *count)
+{
+    FIXME("iface %p, stream_number %u, count %p, stub!\n", iface, stream_number, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetAttributeByIndex(IWMHeaderInfo3 *iface, WORD index, WORD *stream_number,
+        WCHAR *name, WORD *name_len, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *size)
+{
+    FIXME("iface %p, index %u, stream_number %p, name %p, name_len %p, type %p, value %p, size %p, stub!\n",
+            iface, index, stream_number, name, name_len, type, value, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetAttributeByName(IWMHeaderInfo3 *iface, WORD *stream_number,
+        const WCHAR *name, WMT_ATTR_DATATYPE *type, BYTE *value, WORD *size)
+{
+    FIXME("iface %p, stream_number %p, name %s, type %p, value %p, size %p, stub!\n",
+            iface, stream_number, debugstr_w(name), type, value, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_SetAttribute(IWMHeaderInfo3 *iface, WORD stream_number,
+        const WCHAR *name, WMT_ATTR_DATATYPE type, const BYTE *value, WORD size)
+{
+    FIXME("iface %p, stream_number %u, name %s, type %#x, value %p, size %u, stub!\n",
+            iface, stream_number, debugstr_w(name), type, value, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetMarkerCount(IWMHeaderInfo3 *iface, WORD *count)
+{
+    FIXME("iface %p, count %p, stub!\n", iface, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetMarker(IWMHeaderInfo3 *iface,
+        WORD index, WCHAR *name, WORD *len, QWORD *time)
+{
+    FIXME("iface %p, index %u, name %p, len %p, time %p, stub!\n", iface, index, name, len, time);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_AddMarker(IWMHeaderInfo3 *iface, const WCHAR *name, QWORD time)
+{
+    FIXME("iface %p, name %s, time %s, stub!\n", iface, debugstr_w(name), debugstr_time(time));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_RemoveMarker(IWMHeaderInfo3 *iface, WORD index)
+{
+    FIXME("iface %p, index %u, stub!\n", iface, index);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetScriptCount(IWMHeaderInfo3 *iface, WORD *count)
+{
+    FIXME("iface %p, count %p, stub!\n", iface, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetScript(IWMHeaderInfo3 *iface, WORD index, WCHAR *type,
+        WORD *type_len, WCHAR *command, WORD *command_len, QWORD *time)
+{
+    FIXME("iface %p, index %u, type %p, type_len %p, command %p, command_len %p, time %p, stub!\n",
+            iface, index, type, type_len, command, command_len, time);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_AddScript(IWMHeaderInfo3 *iface,
+        const WCHAR *type, const WCHAR *command, QWORD time)
+{
+    FIXME("iface %p, type %s, command %s, time %s, stub!\n",
+            iface, debugstr_w(type), debugstr_w(command), debugstr_time(time));
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_RemoveScript(IWMHeaderInfo3 *iface, WORD index)
+{
+    FIXME("iface %p, index %u, stub!\n", iface, index);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetCodecInfoCount(IWMHeaderInfo3 *iface, DWORD *count)
+{
+    FIXME("iface %p, count %p, stub!\n", iface, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetCodecInfo(IWMHeaderInfo3 *iface, DWORD index, WORD *name_len,
+        WCHAR *name, WORD *desc_len, WCHAR *desc, WMT_CODEC_INFO_TYPE *type, WORD *size, BYTE *info)
+{
+    FIXME("iface %p, index %u, name_len %p, name %p, desc_len %p, desc %p, type %p, size %p, info %p, stub!\n",
+            iface, index, name_len, name, desc_len, desc, type, size, info);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetAttributeCountEx(IWMHeaderInfo3 *iface, WORD stream_number, WORD *count)
+{
+    FIXME("iface %p, stream_number %u, count %p, stub!\n", iface, stream_number, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetAttributeIndices(IWMHeaderInfo3 *iface, WORD stream_number,
+        const WCHAR *name, WORD *lang_index, WORD *indices, WORD *count)
+{
+    FIXME("iface %p, stream_number %u, name %s, lang_index %p, indices %p, count %p, stub!\n",
+            iface, stream_number, debugstr_w(name), lang_index, indices, count);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_GetAttributeByIndexEx(IWMHeaderInfo3 *iface,
+        WORD stream_number, WORD index, WCHAR *name, WORD *name_len,
+        WMT_ATTR_DATATYPE *type, WORD *lang_index, BYTE *value, DWORD *size)
+{
+    FIXME("iface %p, stream_number %u, index %u, name %p, name_len %p,"
+            " type %p, lang_index %p, value %p, size %p, stub!\n",
+            iface, stream_number, index, debugstr_w(name), name_len, type, lang_index, value, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_ModifyAttribute(IWMHeaderInfo3 *iface, WORD stream_number,
+        WORD index, WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD size)
+{
+    FIXME("iface %p, stream_number %u, index %u, type %#x, lang_index %u, value %p, size %u, stub!\n",
+            iface, stream_number, index, type, lang_index, value, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_AddAttribute(IWMHeaderInfo3 *iface,
+        WORD stream_number, const WCHAR *name, WORD *index,
+        WMT_ATTR_DATATYPE type, WORD lang_index, const BYTE *value, DWORD size)
+{
+    FIXME("iface %p, stream_number %u, name %s, index %p, type %#x, lang_index %u, value %p, size %u, stub!\n",
+            iface, stream_number, debugstr_w(name), index, type, lang_index, value, size);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_DeleteAttribute(IWMHeaderInfo3 *iface, WORD stream_number, WORD index)
+{
+    FIXME("iface %p, stream_number %u, index %u, stub!\n", iface, stream_number, index);
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI header_info_AddCodecInfo(IWMHeaderInfo3 *iface, const WCHAR *name,
+        const WCHAR *desc, WMT_CODEC_INFO_TYPE type, WORD size, BYTE *info)
+{
+    FIXME("iface %p, name %s, desc %s, type %#x, size %u, info %p, stub!\n",
+            info, debugstr_w(name), debugstr_w(desc), type, size, info);
+    return E_NOTIMPL;
+}
+
+static const IWMHeaderInfo3Vtbl header_info_vtbl =
+{
+    header_info_QueryInterface,
+    header_info_AddRef,
+    header_info_Release,
+    header_info_GetAttributeCount,
+    header_info_GetAttributeByIndex,
+    header_info_GetAttributeByName,
+    header_info_SetAttribute,
+    header_info_GetMarkerCount,
+    header_info_GetMarker,
+    header_info_AddMarker,
+    header_info_RemoveMarker,
+    header_info_GetScriptCount,
+    header_info_GetScript,
+    header_info_AddScript,
+    header_info_RemoveScript,
+    header_info_GetCodecInfoCount,
+    header_info_GetCodecInfo,
+    header_info_GetAttributeCountEx,
+    header_info_GetAttributeIndices,
+    header_info_GetAttributeByIndexEx,
+    header_info_ModifyAttribute,
+    header_info_AddAttribute,
+    header_info_DeleteAttribute,
+    header_info_AddCodecInfo,
+};
+
 void wm_reader_init(struct wm_reader *reader, const struct wm_reader_ops *ops)
 {
+    reader->IWMHeaderInfo3_iface.lpVtbl = &header_info_vtbl;
     reader->IWMProfile3_iface.lpVtbl = &profile_vtbl;
     reader->refcount = 1;
     reader->ops = ops;
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index 2b36c411262..75d1f9e0c35 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -144,9 +144,9 @@ static void test_wmsyncreader_interfaces(void)
     check_interface(reader, &IID_IWMReaderStreamClock, FALSE);
     check_interface(reader, &IID_IWMReaderTypeNegotiation, FALSE);
 
-    todo_wine check_interface(reader, &IID_IWMHeaderInfo, TRUE);
-    todo_wine check_interface(reader, &IID_IWMHeaderInfo2, TRUE);
-    todo_wine check_interface(reader, &IID_IWMHeaderInfo3, TRUE);
+    check_interface(reader, &IID_IWMHeaderInfo, TRUE);
+    check_interface(reader, &IID_IWMHeaderInfo2, TRUE);
+    check_interface(reader, &IID_IWMHeaderInfo3, TRUE);
     todo_wine check_interface(reader, &IID_IWMLanguageList, TRUE);
     todo_wine check_interface(reader, &IID_IWMPacketSize, TRUE);
     todo_wine check_interface(reader, &IID_IWMPacketSize2, TRUE);
-- 
2.33.0




More information about the wine-devel mailing list