Nikolay Sivov : mfmediaengine: Issue MF_MEDIA_ENGINE_EVENT_FIRSTFRAMEREADY on first video sample.

Alexandre Julliard julliard at winehq.org
Tue Nov 3 15:55:55 CST 2020


Module: wine
Branch: master
Commit: 37ffe4444322f2ffaed350dab0a8e47acafc79d5
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=37ffe4444322f2ffaed350dab0a8e47acafc79d5

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Tue Nov  3 15:56:08 2020 +0300

mfmediaengine: Issue MF_MEDIA_ENGINE_EVENT_FIRSTFRAMEREADY on first video sample.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mfmediaengine/main.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/dlls/mfmediaengine/main.c b/dlls/mfmediaengine/main.c
index 8dbbb889288..9da802f0df6 100644
--- a/dlls/mfmediaengine/main.c
+++ b/dlls/mfmediaengine/main.c
@@ -68,6 +68,7 @@ enum media_engine_flags
     FLAGS_ENGINE_MUTED = 0x400,
     FLAGS_ENGINE_HAS_AUDIO = 0x800,
     FLAGS_ENGINE_HAS_VIDEO = 0x1000,
+    FLAGS_ENGINE_FIRST_FRAME = 0x2000,
 };
 
 struct media_engine
@@ -316,6 +317,10 @@ static HRESULT WINAPI media_engine_session_events_Invoke(IMFAsyncCallback *iface
             break;
         case MESessionEnded:
 
+            EnterCriticalSection(&engine->cs);
+            media_engine_set_flag(engine, FLAGS_ENGINE_FIRST_FRAME, FALSE);
+            LeaveCriticalSection(&engine->cs);
+
             IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_ENDED, 0, 0);
             break;
     }
@@ -1351,6 +1356,12 @@ static HRESULT WINAPI media_engine_grabber_callback_OnClockStart(IMFSampleGrabbe
 static HRESULT WINAPI media_engine_grabber_callback_OnClockStop(IMFSampleGrabberSinkCallback *iface,
         MFTIME systime)
 {
+    struct media_engine *engine = impl_from_IMFSampleGrabberSinkCallback(iface);
+
+    EnterCriticalSection(&engine->cs);
+    media_engine_set_flag(engine, FLAGS_ENGINE_FIRST_FRAME, FALSE);
+    LeaveCriticalSection(&engine->cs);
+
     return S_OK;
 }
 
@@ -1382,6 +1393,18 @@ static HRESULT WINAPI media_engine_grabber_callback_OnProcessSample(IMFSampleGra
         REFGUID major_type, DWORD sample_flags, LONGLONG sample_time, LONGLONG sample_duration,
         const BYTE *buffer, DWORD sample_size)
 {
+    struct media_engine *engine = impl_from_IMFSampleGrabberSinkCallback(iface);
+
+    EnterCriticalSection(&engine->cs);
+
+    if (!(engine->flags & FLAGS_ENGINE_FIRST_FRAME))
+    {
+        IMFMediaEngineNotify_EventNotify(engine->callback, MF_MEDIA_ENGINE_EVENT_FIRSTFRAMEREADY, 0, 0);
+        engine->flags |= FLAGS_ENGINE_FIRST_FRAME;
+    }
+
+    LeaveCriticalSection(&engine->cs);
+
     return S_OK;
 }
 




More information about the wine-cvs mailing list