[PATCH 1/2] mf/evr: Pass stream start/end messages to the mixer.

Nikolay Sivov nsivov at codeweavers.com
Thu May 6 08:08:48 CDT 2021


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mf/evr.c | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

diff --git a/dlls/mf/evr.c b/dlls/mf/evr.c
index 292e84ddd6b..046f5cb3ca3 100644
--- a/dlls/mf/evr.c
+++ b/dlls/mf/evr.c
@@ -48,6 +48,7 @@ enum video_stream_flags
     EVR_STREAM_PREROLLING = 0x1,
     EVR_STREAM_PREROLLED = 0x2,
     EVR_STREAM_SAMPLE_NEEDED = 0x4,
+    EVR_STREAM_STARTED = 0x8,
 };
 
 struct video_renderer;
@@ -406,6 +407,12 @@ static HRESULT WINAPI video_stream_sink_ProcessSample(IMFStreamSink *iface, IMFS
     }
     else if (stream->parent->state == EVR_STATE_RUNNING || stream->flags & EVR_STREAM_PREROLLING)
     {
+        if (!(stream->flags & EVR_STREAM_STARTED))
+        {
+            IMFTransform_ProcessMessage(stream->parent->mixer, MFT_MESSAGE_NOTIFY_START_OF_STREAM, stream->id);
+            stream->flags |= EVR_STREAM_STARTED;
+        }
+
         if (SUCCEEDED(IMFTransform_ProcessInput(stream->parent->mixer, stream->id, sample, 0)))
             IMFVideoPresenter_ProcessMessage(stream->parent->presenter, MFVP_MESSAGE_PROCESSINPUTNOTIFY, 0);
 
@@ -422,12 +429,34 @@ static HRESULT WINAPI video_stream_sink_ProcessSample(IMFStreamSink *iface, IMFS
     return hr;
 }
 
+static void video_stream_end_of_stream(struct video_stream *stream)
+{
+    if (!(stream->flags & EVR_STREAM_STARTED))
+        return;
+
+    IMFTransform_ProcessMessage(stream->parent->mixer, MFT_MESSAGE_NOTIFY_END_OF_STREAM, stream->id);
+    stream->flags &= ~EVR_STREAM_STARTED;
+}
+
 static HRESULT WINAPI video_stream_sink_PlaceMarker(IMFStreamSink *iface, MFSTREAMSINK_MARKER_TYPE marker_type,
         const PROPVARIANT *marker_value, const PROPVARIANT *context_value)
 {
-    FIXME("%p, %d, %p, %p.\n", iface, marker_type, marker_value, context_value);
+    struct video_stream *stream = impl_from_IMFStreamSink(iface);
+    HRESULT hr = S_OK;
 
-    return E_NOTIMPL;
+    TRACE("%p, %d, %p, %p.\n", iface, marker_type, marker_value, context_value);
+
+    EnterCriticalSection(&stream->cs);
+    if (!stream->parent)
+        hr = MF_E_STREAMSINK_REMOVED;
+    else
+    {
+        if (marker_type == MFSTREAMSINK_MARKER_ENDOFSEGMENT)
+            video_stream_end_of_stream(stream);
+    }
+    LeaveCriticalSection(&stream->cs);
+
+    return hr;
 }
 
 static HRESULT WINAPI video_stream_sink_Flush(IMFStreamSink *iface)
-- 
2.30.2




More information about the wine-devel mailing list