Nikolay Sivov : mfreadwrite: Handle async reads when flush is in progress.

Alexandre Julliard julliard at winehq.org
Fri Apr 3 14:55:39 CDT 2020


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Apr  3 19:25:09 2020 +0300

mfreadwrite: Handle async reads when flush is in progress.

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

---

 dlls/mfreadwrite/reader.c | 45 +++++++++++++++++++++++++++++++--------------
 1 file changed, 31 insertions(+), 14 deletions(-)

diff --git a/dlls/mfreadwrite/reader.c b/dlls/mfreadwrite/reader.c
index a8df4da763..df921307e9 100644
--- a/dlls/mfreadwrite/reader.c
+++ b/dlls/mfreadwrite/reader.c
@@ -1658,29 +1658,46 @@ static HRESULT source_reader_read_sample(struct source_reader *reader, DWORD ind
     return hr;
 }
 
-static HRESULT WINAPI src_reader_ReadSample(IMFSourceReader *iface, DWORD index, DWORD flags, DWORD *actual_index,
-        DWORD *stream_flags, LONGLONG *timestamp, IMFSample **sample)
+static HRESULT source_reader_read_sample_async(struct source_reader *reader, unsigned int index, unsigned int flags,
+        unsigned int *actual_index, unsigned int *stream_flags, LONGLONG *timestamp, IMFSample **sample)
 {
-    struct source_reader *reader = impl_from_IMFSourceReader(iface);
     struct source_reader_async_command *command;
     HRESULT hr;
 
-    TRACE("%p, %#x, %#x, %p, %p, %p, %p\n", iface, index, flags, actual_index, stream_flags, timestamp, sample);
+    if (actual_index || stream_flags || timestamp || sample)
+        return E_INVALIDARG;
 
-    if (reader->async_callback)
+    EnterCriticalSection(&reader->cs);
+
+    if (reader->flags & SOURCE_READER_FLUSHING)
+        hr = MF_E_NOTACCEPTING;
+    else
     {
-        if (actual_index || stream_flags || timestamp || sample)
-            return E_INVALIDARG;
+        if (SUCCEEDED(hr = source_reader_create_async_op(SOURCE_READER_ASYNC_READ, &command)))
+        {
+            command->stream_index = index;
+            command->flags = flags;
 
-        if (FAILED(hr = source_reader_create_async_op(SOURCE_READER_ASYNC_READ, &command)))
-            return hr;
+            hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &reader->async_commands_callback, &command->IUnknown_iface);
+            IUnknown_Release(&command->IUnknown_iface);
+        }
+    }
+
+    LeaveCriticalSection(&reader->cs);
 
-        command->stream_index = index;
-        command->flags = flags;
+    return hr;
+}
 
-        hr = MFPutWorkItem(MFASYNC_CALLBACK_QUEUE_STANDARD, &reader->async_commands_callback, &command->IUnknown_iface);
-        IUnknown_Release(&command->IUnknown_iface);
-    }
+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);
+
+    if (reader->async_callback)
+        hr = source_reader_read_sample_async(reader, index, flags, actual_index, stream_flags, timestamp, sample);
     else
         hr = source_reader_read_sample(reader, index, flags, actual_index, stream_flags, timestamp, sample);
 




More information about the wine-cvs mailing list