[PATCH v4 4/9] qedit/tests: Add tests for put_Filter with a custom filter.

Gabriel Ivăncescu gabrielopcode at gmail.com
Tue Apr 21 07:19:28 CDT 2020


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/qedit/tests/mediadet.c | 192 +++++++++++++++++++++++++++++++++++-
 1 file changed, 191 insertions(+), 1 deletion(-)

diff --git a/dlls/qedit/tests/mediadet.c b/dlls/qedit/tests/mediadet.c
index ea10f57..067adf1 100644
--- a/dlls/qedit/tests/mediadet.c
+++ b/dlls/qedit/tests/mediadet.c
@@ -24,6 +24,7 @@
 #include "ole2.h"
 #include "vfwmsgs.h"
 #include "uuids.h"
+#include "wine/strmbase.h"
 #include "wine/test.h"
 #include "qedit.h"
 #include "control.h"
@@ -71,6 +72,108 @@ static const IUnknownVtbl outer_vtbl =
 
 static IUnknown test_outer = {&outer_vtbl};
 
+struct testfilter
+{
+    struct strmbase_filter filter;
+    struct strmbase_source source;
+};
+
+static inline struct testfilter *impl_from_BaseFilter(struct strmbase_filter *iface)
+{
+    return CONTAINING_RECORD(iface, struct testfilter, filter);
+}
+
+static struct strmbase_pin *testfilter_get_pin(struct strmbase_filter *iface, unsigned int index)
+{
+    struct testfilter *filter = impl_from_BaseFilter(iface);
+
+    return index ? NULL : &filter->source.pin;
+}
+
+static void testfilter_destroy(struct strmbase_filter *iface)
+{
+    struct testfilter *filter = impl_from_BaseFilter(iface);
+
+    strmbase_source_cleanup(&filter->source);
+    strmbase_filter_cleanup(&filter->filter);
+    free(filter);
+}
+
+static const struct strmbase_filter_ops testfilter_ops =
+{
+    .filter_get_pin = testfilter_get_pin,
+    .filter_destroy = testfilter_destroy
+};
+
+static inline struct testfilter *impl_from_Pin(struct strmbase_pin *iface)
+{
+    return CONTAINING_RECORD(iface, struct testfilter, source.pin);
+}
+
+static HRESULT testsource_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt)
+{
+    return S_OK;
+}
+
+static HRESULT testsource_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt)
+{
+    static const VIDEOINFOHEADER source_format =
+    {
+        .bmiHeader.biSize = sizeof(BITMAPINFOHEADER),
+        .bmiHeader.biWidth = 640,
+        .bmiHeader.biHeight = 480,
+        .bmiHeader.biPlanes = 1,
+        .bmiHeader.biBitCount = 24,
+        .bmiHeader.biCompression = BI_RGB,
+        .bmiHeader.biSizeImage = 640 * 480 * 3
+    };
+
+    if (index)
+        return S_FALSE;
+
+    mt->majortype = MEDIATYPE_Video;
+    mt->subtype = MEDIASUBTYPE_RGB24;
+    mt->bFixedSizeSamples = TRUE;
+    mt->bTemporalCompression = FALSE;
+    mt->lSampleSize = source_format.bmiHeader.biSizeImage;
+    mt->formattype = FORMAT_VideoInfo;
+    mt->pUnk = NULL;
+    mt->cbFormat = sizeof(source_format);
+    mt->pbFormat = CoTaskMemAlloc(mt->cbFormat);
+    memcpy(mt->pbFormat, &source_format, mt->cbFormat);
+    return S_OK;
+}
+
+static HRESULT WINAPI testsource_decide_allocator(struct strmbase_source *iface,
+    IMemInputPin *peer, IMemAllocator **allocator)
+{
+    return S_OK;
+}
+
+static const struct strmbase_source_ops testsource_ops =
+{
+    .base.pin_query_accept = testsource_query_accept,
+    .base.pin_get_media_type = testsource_get_media_type,
+    .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection,
+    .pfnDecideAllocator = testsource_decide_allocator
+};
+
+static struct testfilter *create_testfilter(void)
+{
+    static const GUID clsid = {0xabacab};
+    struct testfilter *filter = malloc(sizeof(*filter));
+
+    strmbase_filter_init(&filter->filter, NULL, &clsid, &testfilter_ops);
+    strmbase_source_init(&filter->source, &filter->filter, L"", &testsource_ops);
+
+    return filter;
+}
+
+static void release_testfilter(struct testfilter *filter)
+{
+    IBaseFilter_Release(&filter->filter.IBaseFilter_iface);
+}
+
 static void test_aggregation(void)
 {
     IMediaDet *detector, *detector2;
@@ -188,12 +291,14 @@ static BOOL init_tests(void)
 static void test_mediadet(void)
 {
     HRESULT hr;
+    struct testfilter *testfilter;
+    IBaseFilter *filter, *filter2;
     FILTER_INFO filter_info;
     AM_MEDIA_TYPE mt, *pmt;
     IEnumMediaTypes *type;
     IMediaDet *pM = NULL;
     BSTR filename = NULL;
-    IBaseFilter *filter;
+    IFilterGraph *graph;
     IEnumPins *enumpins;
     LONG nstrms = 0;
     IUnknown *unk;
@@ -270,6 +375,48 @@ static void test_mediadet(void)
     ok(hr == S_FALSE, "Got hr %#x.\n", hr);
     ok(!unk, "Got filter %p.\n", unk);
 
+    hr = IMediaDet_put_Filter(pM, NULL);
+    ok(hr == E_POINTER, "Got hr %#x.\n", hr);
+
+    testfilter = create_testfilter();
+    hr = IMediaDet_put_Filter(pM, (IUnknown*)&testfilter->filter.IBaseFilter_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaDet_get_Filter(pM, &unk);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!!unk, "Expected a non-NULL filter.\n");
+    hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void**)&filter);
+    IUnknown_Release(unk);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(filter == &testfilter->filter.IBaseFilter_iface, "Expected the same filter.\n");
+    IBaseFilter_Release(filter);
+
+    ok(!wcscmp(testfilter->filter.name, L"Source"), "Got name %s.\n", wine_dbgstr_w(testfilter->filter.name));
+    IFilterGraph_AddRef(graph = testfilter->filter.graph);
+    release_testfilter(testfilter);
+
+    testfilter = create_testfilter();
+    hr = IMediaDet_put_Filter(pM, (IUnknown*)&testfilter->filter.IBaseFilter_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaDet_get_Filter(pM, &unk);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!!unk, "Expected a non-NULL filter.\n");
+    hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void**)&filter);
+    IUnknown_Release(unk);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(filter == &testfilter->filter.IBaseFilter_iface, "Expected the same filter.\n");
+    IBaseFilter_Release(filter);
+
+    ok(graph != testfilter->filter.graph, "Expected a different filter graph.\n");
+    release_testfilter(testfilter);
+    IFilterGraph_Release(graph);
+
+    strm = -1;
+    hr = IMediaDet_get_CurrentStream(pM, &strm);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(strm == 0, "strm is %i\n", strm);
+
     filename = SysAllocString(test_avi_filename);
     hr = IMediaDet_put_Filename(pM, filename);
     ok(hr == S_OK, "IMediaDet_put_Filename failed: %08x\n", hr);
@@ -474,9 +621,52 @@ static void test_mediadet(void)
     hr = IBaseFilter_QueryFilterInfo(filter, &filter_info);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     ok(!wcscmp(filter_info.achName, L"Source"), "Got name %s.\n", debugstr_w(filter_info.achName));
+
+    testfilter = create_testfilter();
+    hr = IMediaDet_put_Filter(pM, (IUnknown*)&testfilter->filter.IBaseFilter_iface);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IMediaDet_get_Filter(pM, &unk);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!!unk, "Expected a non-NULL filter.\n");
+    hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void**)&filter2);
+    IUnknown_Release(unk);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(filter != filter2, "Expected a different filter.\n");
+    ok(filter2 == &testfilter->filter.IBaseFilter_iface, "Expected the same filter.\n");
+    IBaseFilter_Release(filter2);
+
+    ok(!wcscmp(testfilter->filter.name, L"Source"), "Got name %s.\n", wine_dbgstr_w(testfilter->filter.name));
+    ok(filter_info.pGraph != testfilter->filter.graph, "Expected a different filter graph.\n");
     IFilterGraph_Release(filter_info.pGraph);
+    release_testfilter(testfilter);
+
+    filename = NULL;
+    hr = IMediaDet_get_Filename(pM, &filename);
+    todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(!filename, "Got filename %s.\n", debugstr_w(filename));
+    SysFreeString(filename);
+
+    hr = IMediaDet_get_OutputStreams(pM, &nstrms);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(nstrms == 1, "nstrms is %i\n", nstrms);
+
+    /* Now use the filter obtained from put_Filename for put_Filter. */
+    hr = IMediaDet_put_Filter(pM, (IUnknown*)filter);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
     IBaseFilter_Release(filter);
 
+    filename = NULL;
+    hr = IMediaDet_get_Filename(pM, &filename);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    todo_wine ok(!filename, "Got filename %s.\n", debugstr_w(filename));
+    SysFreeString(filename);
+
+    /* It still looks for a downstream source and splits it into video+audio in this case. */
+    hr = IMediaDet_get_OutputStreams(pM, &nstrms);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(nstrms == 2, "nstrms is %i\n", nstrms);
+
     hr = IMediaDet_Release(pM);
     ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
 
-- 
2.21.0




More information about the wine-devel mailing list