Commit ec097bc1 authored by Nikolay Sivov's avatar Nikolay Sivov Committed by Alexandre Julliard

mf/samplegrabber: Consistently check for shutdown flag within a lock.

parent 568b4bc9
...@@ -507,32 +507,29 @@ static HRESULT WINAPI sample_grabber_stream_Flush(IMFStreamSink *iface) ...@@ -507,32 +507,29 @@ static HRESULT WINAPI sample_grabber_stream_Flush(IMFStreamSink *iface)
{ {
struct sample_grabber *grabber = impl_from_IMFStreamSink(iface); struct sample_grabber *grabber = impl_from_IMFStreamSink(iface);
struct scheduled_item *item, *next_item; struct scheduled_item *item, *next_item;
HRESULT hr = S_OK;
TRACE("%p.\n", iface); TRACE("%p.\n", iface);
if (grabber->is_shut_down)
return MF_E_STREAMSINK_REMOVED;
EnterCriticalSection(&grabber->cs); 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. */ LIST_FOR_EACH_ENTRY_SAFE(item, next_item, &grabber->items, struct scheduled_item, entry)
switch (item->type)
{ {
case ITEM_TYPE_SAMPLE: /* Samples are discarded, markers are processed immediately. */
break; if (item->type == ITEM_TYPE_MARKER)
case ITEM_TYPE_MARKER:
sample_grabber_stream_report_marker(grabber, &item->u.marker.context, E_ABORT); 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); LeaveCriticalSection(&grabber->cs);
return S_OK; return hr;
} }
static const IMFStreamSinkVtbl sample_grabber_stream_vtbl = static const IMFStreamSinkVtbl sample_grabber_stream_vtbl =
...@@ -924,9 +921,6 @@ static HRESULT WINAPI sample_grabber_sink_GetStreamSinkByIndex(IMFMediaSink *ifa ...@@ -924,9 +921,6 @@ static HRESULT WINAPI sample_grabber_sink_GetStreamSinkByIndex(IMFMediaSink *ifa
TRACE("%p, %lu, %p.\n", iface, index, stream); TRACE("%p, %lu, %p.\n", iface, index, stream);
if (grabber->is_shut_down)
return MF_E_SHUTDOWN;
EnterCriticalSection(&grabber->cs); EnterCriticalSection(&grabber->cs);
if (grabber->is_shut_down) if (grabber->is_shut_down)
...@@ -1057,18 +1051,22 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface) ...@@ -1057,18 +1051,22 @@ static HRESULT WINAPI sample_grabber_sink_Shutdown(IMFMediaSink *iface)
TRACE("%p.\n", iface); TRACE("%p.\n", iface);
if (grabber->is_shut_down)
return MF_E_SHUTDOWN;
EnterCriticalSection(&grabber->cs); EnterCriticalSection(&grabber->cs);
grabber->is_shut_down = TRUE;
sample_grabber_release_pending_items(grabber); if (grabber->is_shut_down)
if (SUCCEEDED(hr = IMFSampleGrabberSinkCallback_OnShutdown(sample_grabber_get_callback(grabber)))) hr = MF_E_SHUTDOWN;
else
{ {
sample_grabber_set_presentation_clock(grabber, NULL); grabber->is_shut_down = TRUE;
IMFMediaEventQueue_Shutdown(grabber->stream_event_queue); sample_grabber_release_pending_items(grabber);
IMFMediaEventQueue_Shutdown(grabber->event_queue); 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); LeaveCriticalSection(&grabber->cs);
return hr; return hr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment