From b6a7a3851e1a4c35476286b1d3b7cc8f42ae3a69 Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Wed, 17 Aug 2022 01:34:50 +0300 Subject: [PATCH] mfreadwrite/writer: Update some stats on MEStreamSinkRequestSample. Signed-off-by: Nikolay Sivov --- 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); -- 2.11.4.GIT