[PATCH 2/5] quartz/tests: Improve tests for AVI splitter filter state.

Zebediah Figura z.figura12 at gmail.com
Tue Feb 4 22:43:09 CST 2020


Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
 dlls/quartz/tests/avisplit.c | 300 +++++++----------------------------
 1 file changed, 57 insertions(+), 243 deletions(-)

diff --git a/dlls/quartz/tests/avisplit.c b/dlls/quartz/tests/avisplit.c
index 23b7c5b9150..e3c20140bc1 100644
--- a/dlls/quartz/tests/avisplit.c
+++ b/dlls/quartz/tests/avisplit.c
@@ -1015,6 +1015,58 @@ static void testfilter_init(struct testfilter *filter)
     filter->IAsyncReader_iface.lpVtbl = &async_reader_vtbl;
 }
 
+static void test_filter_state(IMediaControl *control)
+{
+    OAFilterState state;
+    HRESULT hr;
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Stopped, "Got state %u.\n", state);
+
+    hr = IMediaControl_Pause(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Paused, "Got state %u.\n", state);
+
+    hr = IMediaControl_Run(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Running, "Got state %u.\n", state);
+
+    hr = IMediaControl_Pause(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Paused, "Got state %u.\n", state);
+
+    hr = IMediaControl_Stop(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Stopped, "Got state %u.\n", state);
+
+    hr = IMediaControl_Run(control);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Running, "Got state %u.\n", state);
+
+    hr = IMediaControl_Stop(control);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Stopped, "Got state %u.\n", state);
+}
+
 static void test_connect_pin(void)
 {
     AM_MEDIA_TYPE req_mt =
@@ -1030,6 +1082,7 @@ static void test_connect_pin(void)
     AM_MEDIA_TYPE mt, *source_mt;
     IPin *sink, *source, *peer;
     IEnumMediaTypes *enummt;
+    IMediaControl *control;
     IFilterGraph2 *graph;
     HRESULT hr;
     ULONG ref;
@@ -1043,6 +1096,7 @@ static void test_connect_pin(void)
     IFilterGraph2_AddFilter(graph, &testsource.filter.IBaseFilter_iface, L"source");
     IFilterGraph2_AddFilter(graph, filter, L"splitter");
     IBaseFilter_FindPin(filter, L"input pin", &sink);
+    IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control);
 
     CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER,
             &IID_IBaseFilter, (void **)&reader);
@@ -1108,6 +1162,8 @@ static void test_connect_pin(void)
     hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
 
+    test_filter_state(control);
+
     hr = IPin_ConnectedTo(source, &peer);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     ok(peer == &testsink.sink.pin.IPin_iface, "Got peer %p.\n", peer);
@@ -1235,6 +1291,7 @@ static void test_connect_pin(void)
 
     IAsyncReader_Release(testsource.reader);
     IPin_Release(sink);
+    IMediaControl_Release(control);
     ref = IFilterGraph2_Release(graph);
     ok(!ref, "Got outstanding refcount %d.\n", ref);
     ref = IBaseFilter_Release(reader);
@@ -1249,248 +1306,6 @@ static void test_connect_pin(void)
     ok(ret, "Failed to delete file, error %u.\n", GetLastError());
 }
 
-static void test_filter_graph(void)
-{
-    IFileSourceFilter *pfile = NULL;
-    IBaseFilter *preader = NULL, *pavi = create_avi_splitter();
-    IEnumPins *enumpins = NULL;
-    IPin *filepin = NULL, *avipin = NULL;
-    HRESULT hr;
-    HANDLE file = NULL;
-    PIN_DIRECTION dir = PINDIR_OUTPUT;
-    char buffer[13];
-    DWORD readbytes;
-    FILTER_STATE state;
-
-    WCHAR *filename = load_resource(L"test.avi");
-
-    file = CreateFileW(filename, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,
-        NULL, OPEN_EXISTING, 0, NULL);
-    if (file == INVALID_HANDLE_VALUE)
-    {
-        skip("Could not read test file \"%s\", skipping test\n", wine_dbgstr_w(filename));
-        DeleteFileW(filename);
-        return;
-    }
-
-    memset(buffer, 0, 13);
-    readbytes = 12;
-    ReadFile(file, buffer, readbytes, &readbytes, NULL);
-    CloseHandle(file);
-    if (strncmp(buffer, "RIFF", 4) || strcmp(buffer + 8, "AVI "))
-    {
-        skip("%s is not an avi riff file, not doing the avi splitter test\n",
-            wine_dbgstr_w(filename));
-        DeleteFileW(filename);
-        return;
-    }
-
-    hr = IUnknown_QueryInterface(pavi, &IID_IFileSourceFilter,
-        (void **)&pfile);
-    ok(hr == E_NOINTERFACE,
-        "Avi splitter returns unexpected error: %08x\n", hr);
-    if (pfile)
-        IFileSourceFilter_Release(pfile);
-    pfile = NULL;
-
-    hr = CoCreateInstance(&CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER,
-        &IID_IBaseFilter, (LPVOID*)&preader);
-    ok(hr == S_OK, "Could not create asynchronous reader: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    hr = IBaseFilter_QueryInterface(preader, &IID_IFileSourceFilter,
-        (void**)&pfile);
-    ok(hr == S_OK, "Could not get IFileSourceFilter: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    hr = IFileSourceFilter_Load(pfile, filename, NULL);
-    if (hr != S_OK)
-    {
-        trace("Could not load file: %08x\n", hr);
-        goto fail;
-    }
-
-    hr = IBaseFilter_EnumPins(preader, &enumpins);
-    ok(hr == S_OK, "No enumpins: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    hr = IEnumPins_Next(enumpins, 1, &filepin, NULL);
-    ok(hr == S_OK, "No pin: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    IEnumPins_Release(enumpins);
-    enumpins = NULL;
-
-    hr = IBaseFilter_EnumPins(pavi, &enumpins);
-    ok(hr == S_OK, "No enumpins: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    hr = IEnumPins_Next(enumpins, 1, &avipin, NULL);
-    ok(hr == S_OK, "No pin: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    hr = IPin_Connect(filepin, avipin, NULL);
-    ok(hr == S_OK, "Could not connect: %08x\n", hr);
-    if (hr != S_OK)
-        goto fail;
-
-    IPin_Release(avipin);
-    avipin = NULL;
-
-    IEnumPins_Reset(enumpins);
-
-    /* Windows puts the pins in the order: Outputpins - Inputpin,
-     * wine does the reverse, just don't test it for now
-     * Hate to admit it, but windows way makes more sense
-     */
-    while (IEnumPins_Next(enumpins, 1, &avipin, NULL) == S_OK)
-    {
-        IPin_QueryDirection(avipin, &dir);
-        if (dir == PINDIR_OUTPUT)
-        {
-            /* Well, connect it to a null renderer! */
-            IBaseFilter *pnull = NULL;
-            IEnumPins *nullenum = NULL;
-            IPin *nullpin = NULL;
-
-            hr = CoCreateInstance(&CLSID_NullRenderer, NULL,
-                CLSCTX_INPROC_SERVER, &IID_IBaseFilter, (LPVOID*)&pnull);
-            if (hr == REGDB_E_CLASSNOTREG)
-            {
-                win_skip("Null renderer not registered, skipping\n");
-                break;
-            }
-            ok(hr == S_OK, "Could not create null renderer: %08x\n", hr);
-
-            hr = IBaseFilter_EnumPins(pnull, &nullenum);
-            ok(hr == S_OK, "Failed to enum pins, hr %#x.\n", hr);
-            hr = IEnumPins_Next(nullenum, 1, &nullpin, NULL);
-            ok(hr == S_OK, "Failed to get next pin, hr %#x.\n", hr);
-            IEnumPins_Release(nullenum);
-            IPin_QueryDirection(nullpin, &dir);
-
-            hr = IPin_Connect(avipin, nullpin, NULL);
-            ok(hr == S_OK, "Failed to connect output pin: %08x\n", hr);
-            IPin_Release(nullpin);
-            if (hr != S_OK)
-            {
-                IBaseFilter_Release(pnull);
-                break;
-            }
-            IBaseFilter_Run(pnull, 0);
-        }
-
-        IPin_Release(avipin);
-        avipin = NULL;
-    }
-
-    if (avipin)
-        IPin_Release(avipin);
-    avipin = NULL;
-
-    if (hr != S_OK)
-        goto fail2;
-    /* At this point there is a minimalistic connected avi splitter that can
-     * be used for all sorts of source filter tests. However that still needs
-     * to be written at a later time.
-     *
-     * Interesting tests:
-     * - Can you disconnect an output pin while running?
-     *   Expecting: Yes
-     * - Can you disconnect the pullpin while running?
-     *   Expecting: No
-     * - Is the reference count incremented during playback or when connected?
-     *   Does this happen once for every output pin? Or is there something else
-     *   going on.
-     *   Expecting: You tell me
-     */
-
-    IBaseFilter_Run(preader, 0);
-    IBaseFilter_Run(pavi, 0);
-    IBaseFilter_GetState(pavi, INFINITE, &state);
-
-    IBaseFilter_Pause(pavi);
-    IBaseFilter_Pause(preader);
-    IBaseFilter_Stop(pavi);
-    IBaseFilter_Stop(preader);
-    IBaseFilter_GetState(pavi, INFINITE, &state);
-    IBaseFilter_GetState(preader, INFINITE, &state);
-
-fail2:
-    IEnumPins_Reset(enumpins);
-    while (IEnumPins_Next(enumpins, 1, &avipin, NULL) == S_OK)
-    {
-        IPin *to = NULL;
-
-        IPin_QueryDirection(avipin, &dir);
-        IPin_ConnectedTo(avipin, &to);
-        if (to)
-        {
-            IPin_Release(to);
-
-            if (dir == PINDIR_OUTPUT)
-            {
-                PIN_INFO info;
-
-                hr = IPin_QueryPinInfo(to, &info);
-                ok(hr == S_OK, "Failed to query pin info, hr %#x.\n", hr);
-
-                /* Release twice: Once normal, second from the
-                 * previous while loop
-                 */
-                IBaseFilter_Stop(info.pFilter);
-                IPin_Disconnect(to);
-                IPin_Disconnect(avipin);
-                IBaseFilter_Release(info.pFilter);
-                IBaseFilter_Release(info.pFilter);
-            }
-            else
-            {
-                IPin_Disconnect(to);
-                IPin_Disconnect(avipin);
-            }
-        }
-        IPin_Release(avipin);
-        avipin = NULL;
-    }
-
-fail:
-    if (hr != S_OK)
-        skip("Prerequisites not matched, skipping remainder of test\n");
-    if (enumpins)
-        IEnumPins_Release(enumpins);
-
-    if (avipin)
-        IPin_Release(avipin);
-    if (filepin)
-    {
-        IPin *to = NULL;
-
-        IPin_ConnectedTo(filepin, &to);
-        if (to)
-        {
-            IPin_Disconnect(filepin);
-            IPin_Disconnect(to);
-        }
-        IPin_Release(filepin);
-    }
-
-    if (preader)
-        IBaseFilter_Release(preader);
-    if (pavi)
-        IBaseFilter_Release(pavi);
-    if (pfile)
-        IFileSourceFilter_Release(pfile);
-
-    DeleteFileW(filename);
-}
-
 static void test_unconnected_filter_state(void)
 {
     IBaseFilter *filter = create_avi_splitter();
@@ -1570,7 +1385,6 @@ START_TEST(avisplit)
     test_media_types();
     test_enum_media_types();
     test_unconnected_filter_state();
-    test_filter_graph();
     test_connect_pin();
 
     CoUninitialize();
-- 
2.25.0




More information about the wine-devel mailing list