Anton Baskanov : amstream: Implement MediaStreamFilter::Flush.
Alexandre Julliard
julliard at winehq.org
Thu Nov 5 15:37:15 CST 2020
Module: wine
Branch: master
Commit: 4919b9b99fe20cfb8599b7b827811fdd7937ea9d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=4919b9b99fe20cfb8599b7b827811fdd7937ea9d
Author: Anton Baskanov <baskanov at gmail.com>
Date: Thu Oct 29 11:41:01 2020 +0700
amstream: Implement MediaStreamFilter::Flush.
Signed-off-by: Anton Baskanov <baskanov at gmail.com>
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
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);
More information about the wine-cvs
mailing list