[PATCH 4/6] mfreadwrite: Request one sample at a time from the stream.

Nikolay Sivov nsivov at codeweavers.com
Mon Mar 23 08:22:14 CDT 2020


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfreadwrite/main.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/dlls/mfreadwrite/main.c b/dlls/mfreadwrite/main.c
index 315ff8332b..5cb3af84f5 100644
--- a/dlls/mfreadwrite/main.c
+++ b/dlls/mfreadwrite/main.c
@@ -94,6 +94,11 @@ enum media_source_state
     SOURCE_STATE_STARTED,
 };
 
+enum media_stream_flags
+{
+    STREAM_FLAG_SAMPLE_REQUESTED = 0x1,
+};
+
 struct media_stream
 {
     IMFMediaStream *stream;
@@ -107,6 +112,7 @@ struct media_stream
     enum media_stream_state state;
     BOOL selected;
     BOOL presented;
+    DWORD flags;
 };
 
 struct source_reader
@@ -503,6 +509,7 @@ static HRESULT source_reader_media_sample_handler(struct source_reader *reader,
         {
             EnterCriticalSection(&reader->streams[i].cs);
 
+            reader->streams[i].flags &= ~STREAM_FLAG_SAMPLE_REQUESTED;
             hr = source_reader_process_sample(&reader->streams[i], sample);
 
             LeaveCriticalSection(&reader->streams[i].cs);
@@ -1231,10 +1238,12 @@ static HRESULT source_reader_read_sample(struct source_reader *reader, DWORD ind
         {
             while (list_empty(&stream->responses) && stream->state != STREAM_STATE_EOS)
             {
-                if (stream->stream)
+                if (stream->stream && !(stream->flags & STREAM_FLAG_SAMPLE_REQUESTED))
                 {
                     if (FAILED(hr = IMFMediaStream_RequestSample(stream->stream, NULL)))
                         WARN("Sample request failed, hr %#x.\n", hr);
+                    else
+                        stream->flags |= STREAM_FLAG_SAMPLE_REQUESTED;
                 }
                 SleepConditionVariableCS(&stream->sample_event, &stream->cs, INFINITE);
             }
-- 
2.25.1




More information about the wine-devel mailing list