Nikolay Sivov : evr/mixer: Send sample requests when switching to streaming mode.

Alexandre Julliard julliard at winehq.org
Fri Oct 23 14:27:19 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Oct 23 14:33:29 2020 +0300

evr/mixer: Send sample requests when switching to streaming mode.

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

---

 dlls/evr/mixer.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/dlls/evr/mixer.c b/dlls/evr/mixer.c
index 48875a200fd..c0d46ce5331 100644
--- a/dlls/evr/mixer.c
+++ b/dlls/evr/mixer.c
@@ -28,6 +28,7 @@
 
 #include "initguid.h"
 #include "evr9.h"
+#include "evcode.h"
 
 #include "wine/debug.h"
 #include "wine/heap.h"
@@ -44,6 +45,7 @@ struct input_stream
     MFVideoNormalizedRect rect;
     unsigned int zorder;
     IMFSample *sample;
+    unsigned int sample_requested : 1;
 };
 
 struct rt_format
@@ -995,6 +997,15 @@ static HRESULT WINAPI video_mixer_transform_ProcessEvent(IMFTransform *iface, DW
     return E_NOTIMPL;
 }
 
+static void video_mixer_request_sample(struct video_mixer *mixer, unsigned int idx)
+{
+    if (!mixer->event_sink || mixer->inputs[idx].sample_requested)
+        return;
+
+    IMediaEventSink_Notify(mixer->event_sink, EC_SAMPLE_NEEDED, idx, 0);
+    mixer->inputs[idx].sample_requested = 1;
+}
+
 static HRESULT WINAPI video_mixer_transform_ProcessMessage(IMFTransform *iface, MFT_MESSAGE_TYPE message, ULONG_PTR param)
 {
     struct video_mixer *mixer = impl_from_IMFTransform(iface);
@@ -1039,6 +1050,12 @@ static HRESULT WINAPI video_mixer_transform_ProcessMessage(IMFTransform *iface,
 
             EnterCriticalSection(&mixer->cs);
 
+            if (!mixer->is_streaming)
+            {
+                for (i = 0; i < mixer->input_count; ++i)
+                    video_mixer_request_sample(mixer, i);
+            }
+
             mixer->is_streaming = message == MFT_MESSAGE_NOTIFY_BEGIN_STREAMING;
 
             LeaveCriticalSection(&mixer->cs);
@@ -1078,6 +1095,7 @@ static HRESULT WINAPI video_mixer_transform_ProcessInput(IMFTransform *iface, DW
         else
         {
             mixer->is_streaming = 1;
+            input->sample_requested = 0;
             input->sample = sample;
             IMFSample_AddRef(input->sample);
         }




More information about the wine-cvs mailing list