[PATCH 3/3] mf/samplegrabber: Consistently check for shutdown flag whitin a lock.
Nikolay Sivov
wine at gitlab.winehq.org
Mon Jul 4 14:06:42 CDT 2022
From: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
---
dlls/mf/samplegrabber.c | 48 ++++++++++++++++++++---------------------
1 file changed, 23 insertions(+), 25 deletions(-)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c
index f711f6d8c44..2d9f8109aca 100644
--- a/dlls/mf/samplegrabber.c
+++ b/dlls/mf/samplegrabber.c
@@ -507,32 +507,29 @@ static HRESULT WINAPI sample_grabber_stream_Flush(IMFStreamSink *iface)
{
struct sample_grabber *grabber = impl_from_IMFStreamSink(iface);
struct scheduled_item *item, *next_item;
+ HRESULT hr = S_OK;
TRACE("%p.\n", iface);
- if (grabber->is_shut_down)
- return MF_E_STREAMSINK_REMOVED;
-
EnterCriticalSection(&grabber->cs);
- LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &grabber->items, struct scheduled_item, entry)
+ if (grabber->is_shut_down)
+ hr = MF_E_STREAMSINK_REMOVED;
+ else
{
- /* Samples are discarded, markers are processed immediately. */
- switch (item->type)
+ LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &grabber->items, struct scheduled_item, entry)
{
- case ITEM_TYPE_SAMPLE:
- break;
- case ITEM_TYPE_MARKER:
+ /* Samples are discarded, markers are processed immediately. */
+ if (item->type == ITEM_TYPE_MARKER)
sample_grabber_stream_report_marker(grabber, &item->u.marker.context, E_ABORT);
- break;
- }
- stream_release_pending_item(item);
+ stream_release_pending_item(item);
+ }
}
LeaveCriticalSection(&grabber->cs);
- return S_OK;
+ return hr;
}
static const IMFStreamSinkVtbl sample_grabber_stream_vtbl =
@@ -924,9 +921,6 @@ static HRESULT WINAPI sample_grabber_sink_GetStreamSinkByIndex(IMFMediaSink *ifa
TRACE("%p, %lu, %p.\n", iface, index, stream);
- if (grabber->is_shut_down)
- return MF_E_SHUTDOWN;
-
EnterCriticalSection(&grabber->cs);
if (grabber->is_shut_down)
@@ -1057,18 +1051,22 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface)
TRACE("%p.\n", iface);
- if (grabber->is_shut_down)
- return MF_E_SHUTDOWN;
-
EnterCriticalSection(&grabber->cs);
- grabber->is_shut_down = TRUE;
- sample_grabber_release_pending_items(grabber);
- if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber))))
+
+ if (grabber->is_shut_down)
+ hr = MF_E_SHUTDOWN;
+ else
{
- sample_grabber_set_presentation_clock(grabber, NULL);
- IMFMediaEventQueue_Shutdown(grabber->stream_event_queue);
- IMFMediaEventQueue_Shutdown(grabber->event_queue);
+ grabber->is_shut_down = TRUE;
+ sample_grabber_release_pending_items(grabber);
+ if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber))))
+ {
+ sample_grabber_set_presentation_clock(grabber, NULL);
+ IMFMediaEventQueue_Shutdown(grabber->stream_event_queue);
+ IMFMediaEventQueue_Shutdown(grabber->event_queue);
+ }
}
+
LeaveCriticalSection(&grabber->cs);
return hr;
--
GitLab
https://gitlab.winehq.org/wine/wine/-/merge_requests/372
More information about the wine-devel
mailing list