Zebediah Figura : quartz/tests: Add some tests for IFilterGraph:: SetDefaultSyncSource().

Alexandre Julliard julliard at winehq.org
Tue May 21 16:45:22 CDT 2019


Module: wine
Branch: master
Commit: f4cbb2de238441ccbab08e231a61f2d5b32a3bb0
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f4cbb2de238441ccbab08e231a61f2d5b32a3bb0

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Mon May 20 17:44:02 2019 -0500

quartz/tests: Add some tests for IFilterGraph::SetDefaultSyncSource().

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/tests/filtergraph.c | 143 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 143 insertions(+)

diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index 79841e6..0842029 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -1171,6 +1171,8 @@ struct testfilter
     BOOL support_testguid;
     LONGLONG seek_duration, seek_current, seek_stop;
     double seek_rate;
+
+    IReferenceClock IReferenceClock_iface;
 };
 
 static inline struct testfilter *impl_from_IEnumPins(IEnumPins *iface)
@@ -1278,6 +1280,12 @@ static HRESULT WINAPI testfilter_QueryInterface(IBaseFilter *iface, REFIID iid,
         IMediaSeeking_AddRef(*out);
         return S_OK;
     }
+    else if (IsEqualGUID(iid, &IID_IReferenceClock) && filter->IReferenceClock_iface.lpVtbl)
+    {
+        *out = &filter->IReferenceClock_iface;
+        IMediaSeeking_AddRef(*out);
+        return S_OK;
+    }
 
     *out = NULL;
     return E_NOINTERFACE;
@@ -1672,6 +1680,66 @@ static const IMediaSeekingVtbl testseek_vtbl =
     testseek_GetPreroll,
 };
 
+static struct testfilter *impl_from_IReferenceClock(IReferenceClock *iface)
+{
+    return CONTAINING_RECORD(iface, struct testfilter, IReferenceClock_iface);
+}
+
+static HRESULT WINAPI testclock_QueryInterface(IReferenceClock *iface, REFIID iid, void **out)
+{
+    struct testfilter *filter = impl_from_IReferenceClock(iface);
+    return IBaseFilter_QueryInterface(&filter->IBaseFilter_iface, iid, out);
+}
+
+static ULONG WINAPI testclock_AddRef(IReferenceClock *iface)
+{
+    struct testfilter *filter = impl_from_IReferenceClock(iface);
+    return InterlockedIncrement(&filter->ref);
+}
+
+static ULONG WINAPI testclock_Release(IReferenceClock *iface)
+{
+    struct testfilter *filter = impl_from_IReferenceClock(iface);
+    return InterlockedDecrement(&filter->ref);
+}
+
+static HRESULT WINAPI testclock_GetTime(IReferenceClock *iface, REFERENCE_TIME *time)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testclock_AdviseTime(IReferenceClock *iface,
+        REFERENCE_TIME base, REFERENCE_TIME offset, HEVENT event, DWORD_PTR *cookie)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testclock_AdvisePeriodic(IReferenceClock *iface,
+        REFERENCE_TIME start, REFERENCE_TIME period, HSEMAPHORE semaphore, DWORD_PTR *cookie)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static HRESULT WINAPI testclock_Unadvise(IReferenceClock *iface, DWORD_PTR cookie)
+{
+    ok(0, "Unexpected call.\n");
+    return E_NOTIMPL;
+}
+
+static const IReferenceClockVtbl testclock_vtbl =
+{
+    testclock_QueryInterface,
+    testclock_AddRef,
+    testclock_Release,
+    testclock_GetTime,
+    testclock_AdviseTime,
+    testclock_AdvisePeriodic,
+    testclock_Unadvise,
+};
+
 struct testfilter_cf
 {
     IClassFactory IClassFactory_iface;
@@ -3629,6 +3697,80 @@ static void test_graph_seeking(void)
     ok(filter2.ref == 1, "Got outstanding refcount %d.\n", filter2.ref);
 }
 
+static void test_default_sync_source(void)
+{
+    struct testpin source_pin, sink1_pin, sink2_pin;
+    struct testfilter source, sink1, sink2;
+
+    IFilterGraph2 *graph = create_graph();
+    IReferenceClock *clock;
+    IMediaFilter *filter;
+    HRESULT hr;
+    ULONG ref;
+
+    testsink_init(&sink1_pin);
+    testsink_init(&sink2_pin);
+    testsource_init(&source_pin, NULL, 0);
+    testfilter_init(&source, &source_pin, 1);
+    testfilter_init(&sink1, &sink1_pin, 1);
+    testfilter_init(&sink2, &sink2_pin, 1);
+
+    IFilterGraph2_AddFilter(graph, &sink1.IBaseFilter_iface, NULL);
+    IFilterGraph2_AddFilter(graph, &sink2.IBaseFilter_iface, NULL);
+    IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, NULL);
+    IFilterGraph2_ConnectDirect(graph, &source_pin.IPin_iface, &sink1_pin.IPin_iface, NULL);
+
+    IFilterGraph2_QueryInterface(graph, &IID_IMediaFilter, (void **)&filter);
+
+    hr = IFilterGraph2_SetDefaultSyncSource(graph);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaFilter_GetSyncSource(filter, &clock);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!!clock, "Reference clock not set.\n");
+    IReferenceClock_Release(clock);
+
+    source.IReferenceClock_iface.lpVtbl = &testclock_vtbl;
+
+    hr = IFilterGraph2_SetDefaultSyncSource(graph);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaFilter_GetSyncSource(filter, &clock);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(clock == &source.IReferenceClock_iface, "Got unexpected clock.\n");
+    IReferenceClock_Release(clock);
+
+    /* The documentation says that connected filters are preferred, but this
+     * does not in fact seem to be the case. */
+
+    sink2.IReferenceClock_iface.lpVtbl = &testclock_vtbl;
+
+    hr = IFilterGraph2_SetDefaultSyncSource(graph);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaFilter_GetSyncSource(filter, &clock);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(clock == &sink2.IReferenceClock_iface, "Got unexpected clock.\n");
+    IReferenceClock_Release(clock);
+
+    sink1.IReferenceClock_iface.lpVtbl = &testclock_vtbl;
+
+    hr = IFilterGraph2_SetDefaultSyncSource(graph);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaFilter_GetSyncSource(filter, &clock);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(clock == &sink1.IReferenceClock_iface, "Got unexpected clock.\n");
+    IReferenceClock_Release(clock);
+
+    IMediaFilter_Release(filter);
+    ref = IFilterGraph2_Release(graph);
+    ok(!ref, "Got outstanding refcount %d.\n", ref);
+    ok(sink1.ref == 1, "Got outstanding refcount %d.\n", sink1.ref);
+    ok(sink2.ref == 1, "Got outstanding refcount %d.\n", sink2.ref);
+    ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref);
+}
+
 START_TEST(filtergraph)
 {
     CoInitializeEx(NULL, COINIT_MULTITHREADED);
@@ -3649,6 +3791,7 @@ START_TEST(filtergraph)
     test_filter_state();
     test_ec_complete();
     test_graph_seeking();
+    test_default_sync_source();
 
     CoUninitialize();
     test_render_with_multithread();




More information about the wine-cvs mailing list