[PATCH v6 3/7] qasf: Implement ASF Reader filter init_stream and cleanup_stream.

Rémi Bernon wine at gitlab.winehq.org
Tue Jul 5 06:03:06 CDT 2022


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

Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
---
 dlls/qasf/asfreader.c | 69 +++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/dlls/qasf/asfreader.c b/dlls/qasf/asfreader.c
index 4fa9136982d..db976f36752 100644
--- a/dlls/qasf/asfreader.c
+++ b/dlls/qasf/asfreader.c
@@ -150,11 +150,66 @@ static HRESULT asf_reader_query_interface(struct strmbase_filter *iface, REFIID
     return E_NOINTERFACE;
 }
 
+static HRESULT asf_reader_init_stream(struct strmbase_filter *iface)
+{
+    struct asf_reader *filter = impl_from_strmbase_filter(iface);
+    HRESULT hr;
+    int i;
+
+    TRACE("iface %p\n", iface);
+
+    for (i = 0; i < filter->stream_count; ++i)
+    {
+        struct asf_stream *stream = filter->streams + i;
+
+        if (!stream->source.pin.peer)
+            continue;
+
+        hr = IMemAllocator_Commit(stream->source.pAllocator);
+        if (FAILED(hr))
+        {
+            WARN("Failed to commit stream %u allocator, hr %#lx\n", i, hr);
+            continue;
+        }
+
+        hr = IPin_NewSegment(stream->source.pin.peer, 0, 0, 1);
+        if (FAILED(hr))
+        {
+            WARN("Failed to start stream %u new segment, hr %#lx\n", i, hr);
+            continue;
+        }
+    }
+
+    return IWMReader_Start(filter->reader, 0, 0, 1, NULL);
+}
+
+static HRESULT asf_reader_cleanup_stream(struct strmbase_filter *iface)
+{
+    struct asf_reader *filter = impl_from_strmbase_filter(iface);
+    int i;
+
+    TRACE("iface %p\n", iface);
+
+    for (i = 0; i < filter->stream_count; ++i)
+    {
+        struct asf_stream *stream = filter->streams + i;
+
+        if (!stream->source.pin.peer)
+            continue;
+
+        IMemAllocator_Decommit(stream->source.pAllocator);
+    }
+
+    return S_OK;
+}
+
 static const struct strmbase_filter_ops filter_ops =
 {
     .filter_get_pin = asf_reader_get_pin,
     .filter_destroy = asf_reader_destroy,
     .filter_query_interface = asf_reader_query_interface,
+    .filter_init_stream = asf_reader_init_stream,
+    .filter_cleanup_stream = asf_reader_cleanup_stream,
 };
 
 static HRESULT WINAPI asf_reader_DecideBufferSize(struct strmbase_source *iface,
@@ -390,6 +445,20 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA
             BaseFilterImpl_IncrementPinVersion(&filter->filter);
             break;
 
+        case WMT_END_OF_STREAMING:
+            EnterCriticalSection(&filter->filter.filter_cs);
+            for (i = 0; i < filter->stream_count; ++i)
+            {
+                struct asf_stream *stream = filter->streams + i;
+
+                if (!stream->source.pin.peer)
+                    continue;
+
+                IPin_EndOfStream(stream->source.pin.peer);
+            }
+            LeaveCriticalSection(&filter->filter.filter_cs);
+            break;
+
         default:
             WARN("Ignoring status %#x.\n", status);
             break;
-- 
GitLab


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



More information about the wine-devel mailing list