From 4919b9b99fe20cfb8599b7b827811fdd7937ea9d Mon Sep 17 00:00:00 2001 From: Anton Baskanov Date: Thu, 29 Oct 2020 11:41:01 +0700 Subject: [PATCH] amstream: Implement MediaStreamFilter::Flush. Signed-off-by: Anton Baskanov Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- dlls/amstream/filter.c | 23 ++++++++++++++++++++--- dlls/amstream/tests/amstream.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/dlls/amstream/filter.c b/dlls/amstream/filter.c index 7531265cb8e..5fd5b2afdbc 100644 --- a/dlls/amstream/filter.c +++ b/dlls/amstream/filter.c @@ -750,11 +750,28 @@ static HRESULT WINAPI filter_WaitUntil(IMediaStreamFilter *iface, REFERENCE_TIME return hr; } -static HRESULT WINAPI filter_Flush(IMediaStreamFilter *iface, BOOL bCancelEOS) +static HRESULT WINAPI filter_Flush(IMediaStreamFilter *iface, BOOL cancel_eos) { - FIXME("(%p)->(%d): Stub!\n", iface, bCancelEOS); + struct filter *filter = impl_from_IMediaStreamFilter(iface); + struct event *event; - return E_NOTIMPL; + TRACE("filter %p, cancel_eos %d.\n", iface, cancel_eos); + + EnterCriticalSection(&filter->cs); + + LIST_FOR_EACH_ENTRY(event, &filter->used_events, struct event, entry) + { + if (!event->interrupted) + { + event->interrupted = TRUE; + IReferenceClock_Unadvise(filter->clock, event->cookie); + SetEvent(event->event); + } + } + + LeaveCriticalSection(&filter->cs); + + return S_OK; } static HRESULT WINAPI filter_EndOfStream(IMediaStreamFilter *iface) diff --git a/dlls/amstream/tests/amstream.c b/dlls/amstream/tests/amstream.c index 2f156538e4c..da5ef8f56a1 100644 --- a/dlls/amstream/tests/amstream.c +++ b/dlls/amstream/tests/amstream.c @@ -6839,6 +6839,35 @@ static void test_mediastreamfilter_wait_until(void) ok(!WaitForSingleObject(cookie2.advise_time_called_event, 2000), "Expected AdviseTime to be called.\n"); ok(WaitForSingleObject(thread2, 100) == WAIT_TIMEOUT, "WaitUntil returned prematurely.\n"); + hr = IMediaStreamFilter_Flush(filter, FALSE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ok(cookie1.unadvise_called, "Expected Unadvise to be called.\n"); + ok(cookie2.unadvise_called, "Expected Unadvise to be called.\n"); + + ok(!WaitForSingleObject(thread1, 2000), "Wait timed out.\n"); + CloseHandle(thread1); + ok(!WaitForSingleObject(thread2, 2000), "Wait timed out.\n"); + CloseHandle(thread2); + + clock.advise_time_cookie = &cookie1; + + params1.filter = filter; + params1.time = 23456789; + params1.expected_hr = S_FALSE; + thread1 = CreateThread(NULL, 0, mediastreamfilter_wait_until, ¶ms1, 0, NULL); + ok(!WaitForSingleObject(cookie1.advise_time_called_event, 2000), "Expected AdviseTime to be called.\n"); + ok(WaitForSingleObject(thread1, 100) == WAIT_TIMEOUT, "WaitUntil returned prematurely.\n"); + + clock.advise_time_cookie = &cookie2; + + params2.filter = filter; + params2.time = 23456789; + params2.expected_hr = S_FALSE; + thread2 = CreateThread(NULL, 0, mediastreamfilter_wait_until, ¶ms2, 0, NULL); + ok(!WaitForSingleObject(cookie2.advise_time_called_event, 2000), "Expected AdviseTime to be called.\n"); + ok(WaitForSingleObject(thread2, 100) == WAIT_TIMEOUT, "WaitUntil returned prematurely.\n"); + hr = IMediaStreamFilter_Stop(filter); ok(hr == S_OK, "Got hr %#x.\n", hr);