[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