[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