Nikolay Sivov : mf: Implement stream flushing for sample grabber.

Alexandre Julliard julliard at winehq.org
Mon Jun 10 13:43:53 CDT 2019


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

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Fri Jun  7 16:09:00 2019 +0300

mf: Implement stream flushing for sample grabber.

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

---

 dlls/mf/samplegrabber.c | 41 +++++++++++++++++++++++++++++++++--------
 1 file changed, 33 insertions(+), 8 deletions(-)

diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index ed07116..9cf9465 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -171,7 +171,7 @@ static ULONG WINAPI sample_grabber_stream_AddRef(IMFStreamSink *iface)
     return refcount;
 }
 
-static void stream_release_pending_item(struct sample_grabber_stream *stream, struct scheduled_item *item)
+static void stream_release_pending_item(struct scheduled_item *item)
 {
     list_remove(&item->entry);
     switch (item->type)
@@ -211,7 +211,7 @@ static ULONG WINAPI sample_grabber_stream_Release(IMFStreamSink *iface)
         }
         LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &stream->items, struct scheduled_item, entry)
         {
-            stream_release_pending_item(stream, item);
+            stream_release_pending_item(item);
         }
         DeleteCriticalSection(&stream->cs);
         heap_free(stream);
@@ -392,7 +392,7 @@ static HRESULT stream_queue_sample(struct sample_grabber_stream *stream, IMFSamp
     if (SUCCEEDED(hr))
         list_add_tail(&stream->items, &item->entry);
     else
-        stream_release_pending_item(stream, item);
+        stream_release_pending_item(item);
 
     return hr;
 }
@@ -459,7 +459,7 @@ static HRESULT stream_place_marker(struct sample_grabber_stream *stream, MFSTREA
     if (SUCCEEDED(hr))
         list_add_tail(&stream->items, &item->entry);
     else
-        stream_release_pending_item(stream, item);
+        stream_release_pending_item(item);
 
     return hr;
 }
@@ -487,9 +487,34 @@ static HRESULT WINAPI sample_grabber_stream_PlaceMarker(IMFStreamSink *iface, MF
 
 static HRESULT WINAPI sample_grabber_stream_Flush(IMFStreamSink *iface)
 {
-    FIXME("%p.\n", iface);
+    struct sample_grabber_stream *stream = impl_from_IMFStreamSink(iface);
+    struct scheduled_item *item, *next_item;
 
-    return E_NOTIMPL;
+    TRACE("%p.\n", iface);
+
+    if (!stream->sink)
+        return MF_E_STREAMSINK_REMOVED;
+
+    EnterCriticalSection(&stream->cs);
+
+    LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &stream->items, struct scheduled_item, entry)
+    {
+        /* Samples are discarded, markers are processed immediately. */
+        switch (item->type)
+        {
+            case ITEM_TYPE_SAMPLE:
+                break;
+            case ITEM_TYPE_MARKER:
+                sample_grabber_stream_report_marker(stream, &item->u.marker.context, E_ABORT);
+                break;
+        }
+
+        stream_release_pending_item(item);
+    }
+
+    LeaveCriticalSection(&stream->cs);
+
+    return S_OK;
 }
 
 static const IMFStreamSinkVtbl sample_grabber_stream_vtbl =
@@ -706,7 +731,7 @@ static HRESULT WINAPI sample_grabber_stream_timer_callback_Invoke(IMFAsyncCallba
                 case ITEM_TYPE_SAMPLE:
                     if (FAILED(hr = sample_grabber_report_sample(stream->sink, item->u.sample)))
                         WARN("Failed to report a sample, hr %#x.\n", hr);
-                    stream_release_pending_item(stream, item);
+                    stream_release_pending_item(item);
                     item = stream_get_next_item(stream);
                     if (item && item->type == ITEM_TYPE_SAMPLE)
                     {
@@ -718,7 +743,7 @@ static HRESULT WINAPI sample_grabber_stream_timer_callback_Invoke(IMFAsyncCallba
                     break;
                 case ITEM_TYPE_MARKER:
                     sample_grabber_stream_report_marker(stream, &item->u.marker.context, S_OK);
-                    stream_release_pending_item(stream, item);
+                    stream_release_pending_item(item);
                     item = stream_get_next_item(stream);
                     break;
             }




More information about the wine-cvs mailing list