Module: wine Branch: master Commit: b6a7a3851e1a4c35476286b1d3b7cc8f42ae3a69 URL: https://gitlab.winehq.org/wine/wine/-/commit/b6a7a3851e1a4c35476286b1d3b7cc8...
Author: Nikolay Sivov nsivov@codeweavers.com Date: Wed Aug 17 01:34:50 2022 +0300
mfreadwrite/writer: Update some stats on MEStreamSinkRequestSample.
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com
---
dlls/mfreadwrite/writer.c | 50 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-)
diff --git a/dlls/mfreadwrite/writer.c b/dlls/mfreadwrite/writer.c index ccd4a92f4c4..ed05b0d3191 100644 --- a/dlls/mfreadwrite/writer.c +++ b/dlls/mfreadwrite/writer.c @@ -60,6 +60,7 @@ struct sink_writer IMFPresentationClock *clock; IMFMediaSink *sink; enum writer_state state; + HRESULT status; MF_SINK_WRITER_STATISTICS stats;
CRITICAL_SECTION cs; @@ -419,7 +420,9 @@ static HRESULT WINAPI sink_writer_GetStatistics(IMFSinkWriter *iface, DWORD inde
EnterCriticalSection(&writer->cs);
- if (index == MF_SINK_WRITER_ALL_STREAMS) + if (FAILED(writer->status)) + hr = writer->status; + else if (index == MF_SINK_WRITER_ALL_STREAMS) *stats = writer->stats; else if ((stream = sink_writer_get_stream(writer, index))) *stats = stream->stats; @@ -483,12 +486,28 @@ static HRESULT WINAPI sink_writer_callback_GetParameters(IMFAsyncCallback *iface return E_NOTIMPL; }
+static struct stream *sink_writer_get_stream_for_stream_sink(struct sink_writer *writer, IMFStreamSink *stream_sink) +{ + size_t i; + + for (i = 0; i < writer->streams.count; ++i) + { + if (writer->streams.items[i].stream_sink == stream_sink) + return &writer->streams.items[i]; + } + + return NULL; +} + static HRESULT WINAPI sink_writer_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result) { + struct sink_writer *writer = impl_from_events_callback_IMFAsyncCallback(iface); IMFStreamSink *stream_sink; MediaEventType event_type; + struct stream *stream; IMFMediaEvent *event; - HRESULT hr; + LONGLONG timestamp; + HRESULT status, hr;
TRACE("%p, %p.\n", iface, result);
@@ -498,9 +517,36 @@ static HRESULT WINAPI sink_writer_events_callback_Invoke(IMFAsyncCallback *iface return hr;
IMFMediaEvent_GetType(event, &event_type); + IMFMediaEvent_GetStatus(event, &status);
TRACE("Got event %lu.\n", event_type);
+ EnterCriticalSection(&writer->cs); + + if (writer->status == S_OK && FAILED(status)) + writer->status = status; + + if (writer->status == S_OK && (stream = sink_writer_get_stream_for_stream_sink(writer, stream_sink))) + { + switch (event_type) + { + case MEStreamSinkRequestSample: + + timestamp = MFGetSystemTime(); + + writer->stats.llLastSinkSampleRequest = timestamp; + writer->stats.dwNumOutstandingSinkSampleRequests++; + stream->stats.llLastSinkSampleRequest = timestamp; + stream->stats.dwNumOutstandingSinkSampleRequests++; + + break; + default: + ; + } + } + + LeaveCriticalSection(&writer->cs); + IMFMediaEvent_Release(event);
IMFStreamSink_BeginGetEvent(stream_sink, iface, (IUnknown *)stream_sink);