[PATCH 1/3] mfreadwrite: Use separate helpers for sync/async ReadSample().

Nikolay Sivov nsivov at codeweavers.com
Tue Nov 5 05:09:42 CST 2019


Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
 dlls/mfreadwrite/main.c         | 114 ++++++++++++++++++--------------
 dlls/mfreadwrite/tests/mfplat.c |   4 --
 2 files changed, 65 insertions(+), 53 deletions(-)

diff --git a/dlls/mfreadwrite/main.c b/dlls/mfreadwrite/main.c
index 3467746bb8..6fb00b4d37 100644
--- a/dlls/mfreadwrite/main.c
+++ b/dlls/mfreadwrite/main.c
@@ -778,14 +778,17 @@ static IMFSample *media_stream_pop_sample(struct media_stream *stream, DWORD *st
     return ret;
 }
 
-static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index, DWORD flags, DWORD *actual_index,
+static HRESULT source_reader_read_sample(struct source_reader *reader, DWORD index, DWORD flags, DWORD *actual_index,
         DWORD *stream_flags, LONGLONG *timestamp, IMFSample **sample)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    struct media_stream *stream;
     DWORD stream_index;
-    HRESULT hr;
+    HRESULT hr = S_OK;
 
-    TRACE("%p, %#x, %#x, %p, %p, %p, %p\n", iface, index, flags, actual_index, stream_flags, timestamp, sample);
+    if (!stream_flags || !sample)
+        return E_POINTER;
+
+    *sample = NULL;
 
     switch (index)
     {
@@ -802,68 +805,81 @@ static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index,
             stream_index = index;
     }
 
-    /* FIXME: probably should happen once */
-    IMFMediaSource_Start(reader->source, reader->descriptor, NULL, NULL);
-
-    if (reader->async_callback)
+    if (stream_index >= reader->stream_count)
     {
-        FIXME("Async mode is not implemented.\n");
-        return E_NOTIMPL;
+        *stream_flags = MF_SOURCE_READERF_ERROR;
+        if (actual_index)
+            *actual_index = index;
+        return MF_E_INVALIDSTREAMNUMBER;
     }
-    else
-    {
-        struct media_stream *stream;
 
-        if (!stream_flags || !sample)
-            return E_POINTER;
+    if (actual_index)
+        *actual_index = stream_index;
 
-        *sample = NULL;
+    stream = &reader->streams[stream_index];
 
-        if (stream_index >= reader->stream_count)
+    EnterCriticalSection(&stream->cs);
+
+    if (!(flags & MF_SOURCE_READER_CONTROLF_DRAIN))
+    {
+        while (list_empty(&stream->samples) && stream->state != STREAM_STATE_EOS)
         {
-            *stream_flags = MF_SOURCE_READERF_ERROR;
-            if (actual_index)
-                *actual_index = index;
-            return MF_E_INVALIDSTREAMNUMBER;
+            if (stream->stream)
+            {
+                if (FAILED(hr = IMFMediaStream_RequestSample(stream->stream, NULL)))
+                    WARN("Sample request failed, hr %#x.\n", hr);
+            }
+            SleepConditionVariableCS(&stream->sample_event, &stream->cs, INFINITE);
         }
+    }
 
-        if (actual_index)
-            *actual_index = stream_index;
+    *sample = media_stream_pop_sample(stream, stream_flags);
 
-        stream = &reader->streams[stream_index];
+    LeaveCriticalSection(&stream->cs);
 
-        EnterCriticalSection(&stream->cs);
+    TRACE("Got sample %p.\n", *sample);
 
-        if (!(flags & MF_SOURCE_READER_CONTROLF_DRAIN))
-        {
-            while (list_empty(&stream->samples) && stream->state != STREAM_STATE_EOS)
-            {
-                if (stream->stream)
-                {
-                    if (FAILED(hr = IMFMediaStream_RequestSample(stream->stream, NULL)))
-                        WARN("Sample request failed, hr %#x.\n", hr);
-                }
-                SleepConditionVariableCS(&stream->sample_event, &stream->cs, INFINITE);
-            }
-        }
+    if (timestamp)
+    {
+        /* TODO: it's possible timestamp has to be set for some events.
+           For MEEndOfStream it's correct to return 0. */
+        *timestamp = 0;
+        if (*sample)
+            IMFSample_GetSampleTime(*sample, timestamp);
+    }
 
-        *sample = media_stream_pop_sample(stream, stream_flags);
+    return hr;
+}
 
-        LeaveCriticalSection(&stream->cs);
+static HRESULT source_reader_read_sample_async(struct source_reader *reader, DWORD index, DWORD flags)
+{
+    FIXME("Async mode is not implemented.\n");
 
-        TRACE("Got sample %p.\n", *sample);
+    return E_NOTIMPL;
+}
 
-        if (timestamp)
-        {
-            /* TODO: it's possible timestamp has to be set for some events.
-               For MEEndOfStream it's correct to return 0. */
-            *timestamp = 0;
-            if (*sample)
-                IMFSample_GetSampleTime(*sample, timestamp);
-        }
+static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index, DWORD flags, DWORD *actual_index,
+        DWORD *stream_flags, LONGLONG *timestamp, IMFSample **sample)
+{
+    struct source_reader *reader = impl_from_IMFSourceReader(iface);
+    HRESULT hr;
+
+    TRACE("%p, %#x, %#x, %p, %p, %p, %p\n", iface, index, flags, actual_index, stream_flags, timestamp, sample);
+
+    /* FIXME: probably should happen once */
+    IMFMediaSource_Start(reader->source, reader->descriptor, NULL, NULL);
+
+    if (reader->async_callback)
+    {
+        if (actual_index || stream_flags || timestamp || sample)
+            return E_INVALIDARG;
+
+        hr = source_reader_read_sample_async(reader, index, flags);
     }
+    else
+        hr = source_reader_read_sample(reader, index, flags, actual_index, stream_flags, timestamp, sample);
 
-    return S_OK;
+    return hr;
 }
 
 static HRESULT WINAPI src_reader_Flush(IMFSourceReader *iface, DWORD index)
diff --git a/dlls/mfreadwrite/tests/mfplat.c b/dlls/mfreadwrite/tests/mfplat.c
index 27ceb0faf1..16bb92b80e 100644
--- a/dlls/mfreadwrite/tests/mfplat.c
+++ b/dlls/mfreadwrite/tests/mfplat.c
@@ -894,19 +894,15 @@ todo_wine
 
     /* Return values are delivered to callback only. */
     hr = IMFSourceReader_ReadSample(reader, 0, 0, &actual_index, &stream_flags, &timestamp, &sample);
-todo_wine
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
     hr = IMFSourceReader_ReadSample(reader, 0, 0, NULL, &stream_flags, &timestamp, &sample);
-todo_wine
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
     hr = IMFSourceReader_ReadSample(reader, 0, 0, NULL, NULL, &timestamp, &sample);
-todo_wine
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
     hr = IMFSourceReader_ReadSample(reader, 0, 0, NULL, NULL, NULL, &sample);
-todo_wine
     ok(hr == E_INVALIDARG, "Unexpected hr %#x.\n", hr);
 
     IMFSourceReader_Release(reader);
-- 
2.24.0.rc1




More information about the wine-devel mailing list