From: Paul Gofman pgofman@codeweavers.com
--- dlls/mf/samplegrabber.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
diff --git a/dlls/mf/samplegrabber.c b/dlls/mf/samplegrabber.c index 2d9f8109aca..a8791b698c7 100644 --- a/dlls/mf/samplegrabber.c +++ b/dlls/mf/samplegrabber.c @@ -85,6 +85,7 @@ struct sample_grabber UINT64 sample_time_offset; enum sink_state state; CRITICAL_SECTION cs; + BOOL received_sample_while_paused; };
static IMFSampleGrabberSinkCallback *sample_grabber_get_callback(const struct sample_grabber *sink) @@ -422,6 +423,8 @@ static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface,
EnterCriticalSection(&grabber->cs);
+ grabber->received_sample_while_paused = FALSE; + if (grabber->is_shut_down) hr = MF_E_STREAMSINK_REMOVED; else if (grabber->state == SINK_STATE_RUNNING) @@ -442,6 +445,10 @@ static HRESULT WINAPI sample_grabber_stream_ProcessSample(IMFStreamSink *iface, hr = stream_queue_sample(grabber, sample); } } + else if (grabber->state == SINK_STATE_PAUSED) + { + grabber->received_sample_while_paused = TRUE; + }
LeaveCriticalSection(&grabber->cs);
@@ -1136,6 +1143,12 @@ static HRESULT sample_grabber_set_state(struct sample_grabber *grabber, enum sin for (i = 0; i < 4; ++i) sample_grabber_stream_request_sample(grabber); } + else if (state == SINK_STATE_RUNNING && grabber->state == SINK_STATE_PAUSED + && grabber->received_sample_while_paused) + { + grabber->received_sample_while_paused = FALSE; + sample_grabber_stream_request_sample(grabber); + } do_callback = state != grabber->state || state != SINK_STATE_PAUSED; if (do_callback) IMFStreamSink_QueueEvent(&grabber->IMFStreamSink_iface, events[state], &GUID_NULL, S_OK, NULL);