[PATCH v4 1/6] qasf: Implement ASF Reader filter pin_get_media_type.

Rémi Bernon wine at gitlab.winehq.org
Wed Jun 15 01:58:19 CDT 2022


From: Rémi Bernon <rbernon at codeweavers.com>

And name pins accordingly.

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/qasf/asfreader.c       | 58 ++++++++++++++++++++++++++++++++++++-
 dlls/qasf/tests/asfreader.c |  4 +--
 2 files changed, 58 insertions(+), 4 deletions(-)

diff --git a/dlls/qasf/asfreader.c b/dlls/qasf/asfreader.c
index 13b6e2d7bbe..8c042e72773 100644
--- a/dlls/qasf/asfreader.c
+++ b/dlls/qasf/asfreader.c
@@ -48,6 +48,52 @@ struct asf_reader
     struct asf_stream streams[16];
 };
 
+static inline struct asf_stream *impl_from_strmbase_pin(struct strmbase_pin *iface)
+{
+    return CONTAINING_RECORD(iface, struct asf_stream, source.pin);
+}
+
+static inline struct asf_reader *asf_reader_from_asf_stream(struct asf_stream *stream)
+{
+    return CONTAINING_RECORD(stream, struct asf_reader, streams[stream->index]);
+}
+
+static HRESULT asf_stream_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *media_type)
+{
+    struct asf_stream *stream = impl_from_strmbase_pin(iface);
+    struct asf_reader *filter = asf_reader_from_asf_stream(stream);
+    IWMOutputMediaProps *props;
+    AM_MEDIA_TYPE *mt;
+    DWORD size;
+    HRESULT hr;
+
+    TRACE("iface %p, index %u, media_type %p.\n", iface, index, media_type);
+
+    if (FAILED(IWMReader_GetOutputFormat(filter->reader, stream->index, index, &props)))
+        return VFW_S_NO_MORE_ITEMS;
+
+    if (FAILED(hr = IWMOutputMediaProps_GetMediaType(props, NULL, &size)))
+    {
+        IWMOutputMediaProps_Release(props);
+        return hr;
+    }
+
+    if (!(mt = malloc(size)))
+    {
+        IWMOutputMediaProps_Release(props);
+        return E_OUTOFMEMORY;
+    }
+
+    hr = IWMOutputMediaProps_GetMediaType(props, (WM_MEDIA_TYPE *)mt, &size);
+    if (SUCCEEDED(hr))
+        hr = CopyMediaType(media_type, mt);
+
+    free(mt);
+
+    IWMOutputMediaProps_Release(props);
+    return hr;
+}
+
 static inline struct asf_reader *impl_from_strmbase_filter(struct strmbase_filter *iface)
 {
     return CONTAINING_RECORD(iface, struct asf_reader, filter);
@@ -120,6 +166,7 @@ static HRESULT WINAPI asf_reader_DecideBufferSize(struct strmbase_source *iface,
 
 static const struct strmbase_source_ops source_ops =
 {
+    .base.pin_get_media_type = asf_stream_get_media_type,
     .pfnDecideAllocator = BaseOutputPinImpl_DecideAllocator,
     .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection,
     .pfnDecideBufferSize = asf_reader_DecideBufferSize,
@@ -275,6 +322,7 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA
         WMT_ATTR_DATATYPE type, BYTE *value, void *context)
 {
     struct asf_reader *filter = impl_from_IWMReaderCallback(iface)->filter;
+    AM_MEDIA_TYPE stream_media_type = {0};
     DWORD i, stream_count;
     WCHAR name[MAX_PATH];
 
@@ -304,7 +352,15 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA
             for (i = 0; i < stream_count; ++i)
             {
                 struct asf_stream *stream = filter->streams + i;
-                swprintf(name, ARRAY_SIZE(name), L"Raw Stream %u", stream->index);
+
+                if (FAILED(hr = asf_stream_get_media_type(&stream->source.pin, 0, &stream_media_type)))
+                    WARN("Failed to get stream media type, hr %#lx.\n", hr);
+                if (IsEqualGUID(&stream_media_type.majortype, &MEDIATYPE_Video))
+                    swprintf(name, ARRAY_SIZE(name), L"Raw Video %u", stream->index);
+                else
+                    swprintf(name, ARRAY_SIZE(name), L"Raw Audio %u", stream->index);
+                FreeMediaType(&stream_media_type);
+
                 strmbase_source_init(&stream->source, &filter->filter, name, &source_ops);
             }
             filter->stream_count = stream_count;
diff --git a/dlls/qasf/tests/asfreader.c b/dlls/qasf/tests/asfreader.c
index 494d0384ac8..ed78a856003 100644
--- a/dlls/qasf/tests/asfreader.c
+++ b/dlls/qasf/tests/asfreader.c
@@ -231,13 +231,11 @@ static void check_pin(IPin *pin, IBaseFilter *expect_filter, PIN_DIRECTION expec
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
     ok(info.pFilter == expect_filter, "Got filter %p.\n", info.pFilter);
     ok(info.dir == expect_dir, "Got dir %#x.\n", info.dir);
-    todo_wine
     ok(!wcscmp(info.achName, expect_name), "Got name %s.\n", debugstr_w(info.achName));
     IBaseFilter_Release(info.pFilter);
 
     hr = IPin_QueryId(pin, &id);
     ok(hr == S_OK, "Got hr %#lx.\n", hr);
-    todo_wine
     ok(!wcscmp(id, expect_id), "Got id %s.\n", debugstr_w(id));
     CoTaskMemFree(id);
 
@@ -253,7 +251,7 @@ static void check_pin(IPin *pin, IBaseFilter *expect_filter, PIN_DIRECTION expec
         FreeMediaType(mt);
         CoTaskMemFree(mt);
     }
-    todo_wine
+    todo_wine_if(IsEqualGUID(&expect_mt[0].majortype, &MEDIATYPE_Video))
     ok(i == expect_mt_count, "Got %u types.\n", i);
     ok(hr == S_FALSE, "Got hr %#lx.\n", hr);
     IEnumMediaTypes_Release(enum_mt);
-- 
GitLab


https://gitlab.winehq.org/wine/wine/-/merge_requests/140



More information about the wine-devel mailing list