Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- v3: fix test failures
dlls/quartz/tests/filtergraph.c | 42 +++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+)
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c index 16d1629fb88..99e13bcd3ae 100644 --- a/dlls/quartz/tests/filtergraph.c +++ b/dlls/quartz/tests/filtergraph.c @@ -4448,6 +4448,47 @@ static void test_window_threading(void) ok(ret, "Failed to delete file, error %u.\n", GetLastError()); }
+/* Hyperdevotion Noire needs to be able to Render() from UYVY. */ +static void test_autoplug_uyvy(void) +{ + static const VIDEOINFOHEADER source_format = + { + .bmiHeader.biSize = sizeof(BITMAPINFOHEADER), + .bmiHeader.biWidth = 600, + .bmiHeader.biHeight = 400, + .bmiHeader.biCompression = mmioFOURCC('U','Y','V','Y'), + .bmiHeader.biBitCount = 16, + }; + AM_MEDIA_TYPE source_type = + { + .majortype = MEDIATYPE_Video, + .subtype = MEDIASUBTYPE_UYVY, + .formattype = FORMAT_VideoInfo, + .cbFormat = sizeof(source_format), + .pbFormat = (BYTE *)&source_format, + }; + + IFilterGraph2 *graph = create_graph(); + struct testpin source_pin; + struct testfilter source; + HRESULT hr; + ULONG ref; + + testsource_init(&source_pin, NULL, 0); + testfilter_init(&source, &source_pin, 1); + source_pin.request_mt = &source_type; + + IFilterGraph2_AddFilter(graph, &source.IBaseFilter_iface, L"source"); + + hr = IFilterGraph2_Render(graph, &source_pin.IPin_iface); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ok(source.ref == 1, "Got outstanding refcount %d.\n", source.ref); + ok(source_pin.ref == 1, "Got outstanding refcount %d.\n", source_pin.ref); +} + START_TEST(filtergraph) { CoInitializeEx(NULL, COINIT_MULTITHREADED); @@ -4471,6 +4512,7 @@ START_TEST(filtergraph) test_default_sync_source(); test_add_source_filter(); test_window_threading(); + test_autoplug_uyvy();
CoUninitialize(); test_render_with_multithread();
From: Zebediah Figura z.figura12@gmail.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/quartz/tests/avidec.c | 516 ++++++++++++++++++++++++++++++++++++- 1 file changed, 512 insertions(+), 4 deletions(-)
diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index 1eafb9b3293..d873c34d63e 100644 --- a/dlls/quartz/tests/avidec.c +++ b/dlls/quartz/tests/avidec.c @@ -21,6 +21,8 @@ #define COBJMACROS #include "dshow.h" #include "vfw.h" +#include "wmcodecdsp.h" +#include "wine/strmbase.h" #include "wine/test.h"
static const DWORD test_handler = mmioFOURCC('w','t','s','t'); @@ -35,6 +37,12 @@ static IBaseFilter *create_avi_dec(void) return filter; }
+static inline BOOL compare_media_types(const AM_MEDIA_TYPE *a, const AM_MEDIA_TYPE *b) +{ + return !memcmp(a, b, offsetof(AM_MEDIA_TYPE, pbFormat)) + && !memcmp(a->pbFormat, b->pbFormat, a->cbFormat); +} + static ULONG get_refcount(void *iface) { IUnknown *unknown = iface; @@ -42,6 +50,8 @@ static ULONG get_refcount(void *iface) return IUnknown_Release(unknown); }
+static BITMAPINFOHEADER sink_bih; + static LRESULT CALLBACK vfw_driver_proc(DWORD_PTR id, HDRVR driver, UINT msg, LPARAM lparam1, LPARAM lparam2) { @@ -51,16 +61,63 @@ static LRESULT CALLBACK vfw_driver_proc(DWORD_PTR id, HDRVR driver, UINT msg,
switch (msg) { + case DRV_LOAD: + case DRV_ENABLE: + case DRV_OPEN: + case DRV_CLOSE: + case DRV_DISABLE: + case DRV_FREE: + return 1; + + case ICM_DECOMPRESS_GET_FORMAT: + { + BITMAPINFOHEADER *out = (BITMAPINFOHEADER *)lparam2; + BITMAPINFOHEADER *in = (BITMAPINFOHEADER *)lparam1; + + if (!out) + return sizeof(BITMAPINFOHEADER); + + ok(!memcmp(in, &sink_bih, sizeof(BITMAPINFOHEADER)), "Input types didn't match.\n"); + + out->biSize = sizeof(BITMAPINFOHEADER); + out->biCompression = mmioFOURCC('I','4','2','0'); + out->biWidth = 32; + out->biHeight = 24; + out->biBitCount = 12; + out->biSizeImage = 32 * 24 * 12 / 8; + + return ICERR_OK; + } + case ICM_DECOMPRESS_QUERY: { + BITMAPINFOHEADER *out = (BITMAPINFOHEADER *)lparam2; BITMAPINFOHEADER *in = (BITMAPINFOHEADER *)lparam1; - return in->biBitCount == 16 ? ICERR_OK : ICERR_BADFORMAT; + + if (in->biCompression != test_handler || in->biBitCount != 16) + return ICERR_BADFORMAT; + + if (out && out->biCompression != mmioFOURCC('I','4','2','0')) + return ICERR_BADFORMAT; + + return ICERR_OK; } - default: - return 1; + + case ICM_DECOMPRESS_GET_PALETTE: + return ICERR_UNSUPPORTED; + + case ICM_GETINFO: + { + ICINFO *info = (ICINFO *)lparam1; + info->fccType = ICTYPE_VIDEO; + info->fccHandler = test_handler; + return sizeof(ICINFO); }
- return 1; + default: + ok(0, "Got unexpected message %#x.\n", msg); + return ICERR_UNSUPPORTED; + } }
#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) @@ -668,6 +725,456 @@ static void test_unconnected_filter_state(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+struct testfilter +{ + struct strmbase_filter filter; + struct strmbase_source source; + struct strmbase_sink sink; + const AM_MEDIA_TYPE *mt; +}; + +static inline struct testfilter *impl_from_strmbase_filter(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_strmbase_filter(iface); + if (!index) + return &filter->source.pin; + else if (index == 1) + return &filter->sink.pin; + return NULL; +} + +static void testfilter_destroy(struct strmbase_filter *iface) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface); + strmbase_source_cleanup(&filter->source); + strmbase_sink_cleanup(&filter->sink); + strmbase_filter_cleanup(&filter->filter); +} + +static const struct strmbase_filter_ops testfilter_ops = +{ + .filter_get_pin = testfilter_get_pin, + .filter_destroy = testfilter_destroy, +}; + +static HRESULT testsource_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + return S_OK; +} + +static HRESULT WINAPI testsource_DecideAllocator(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 = strmbase_pin_get_media_type, + .pfnAttemptConnection = BaseOutputPinImpl_AttemptConnection, + .pfnDecideAllocator = testsource_DecideAllocator, +}; + +static HRESULT testsink_query_interface(struct strmbase_pin *iface, REFIID iid, void **out) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface->filter); + + if (IsEqualGUID(iid, &IID_IMemInputPin)) + *out = &filter->sink.IMemInputPin_iface; + else + return E_NOINTERFACE; + + IUnknown_AddRef((IUnknown *)*out); + return S_OK; +} + +static HRESULT testsink_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface->filter); + if (filter->mt && !compare_media_types(mt, filter->mt)) + return S_FALSE; + return S_OK; +} + +static HRESULT testsink_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface->filter); + if (!index && filter->mt) + { + CopyMediaType(mt, filter->mt); + return S_OK; + } + return VFW_S_NO_MORE_ITEMS; +} + +static HRESULT WINAPI testsink_Receive(struct strmbase_sink *iface, IMediaSample *sample) +{ + struct testfilter *filter = impl_from_strmbase_filter(iface->pin.filter); + Quality q = {Famine, 500, 100 * 10000, 240 * 10000}; + IQualityControl *qc; + HRESULT hr; + + IPin_QueryInterface(filter->sink.pin.peer, &IID_IQualityControl, (void **)&qc); + + hr = IQualityControl_Notify(qc, &filter->filter.IBaseFilter_iface, q); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + IQualityControl_Release(qc); + + return S_OK; +} + +static const struct strmbase_sink_ops testsink_ops = +{ + .base.pin_query_interface = testsink_query_interface, + .base.pin_query_accept = testsink_query_accept, + .base.pin_get_media_type = testsink_get_media_type, + .pfnReceive = testsink_Receive, +}; + +static void testfilter_init(struct testfilter *filter) +{ + static const GUID clsid = {0xabacab}; + memset(filter, 0, sizeof(*filter)); + strmbase_filter_init(&filter->filter, NULL, &clsid, &testfilter_ops); + strmbase_source_init(&filter->source, &filter->filter, L"source", &testsource_ops); + strmbase_sink_init(&filter->sink, &filter->filter, L"sink", &testsink_ops, NULL); +} + +static void test_sink_allocator(IMemInputPin *input) +{ + IMemAllocator *req_allocator, *ret_allocator; + ALLOCATOR_PROPERTIES props, ret_props; + HRESULT hr; + + hr = IMemInputPin_GetAllocatorRequirements(input, &props); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); + + hr = IMemInputPin_GetAllocator(input, &ret_allocator); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + + if (hr == S_OK) + { + hr = IMemAllocator_GetProperties(ret_allocator, &props); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!props.cBuffers, "Got %d buffers.\n", props.cBuffers); + ok(!props.cbBuffer, "Got size %d.\n", props.cbBuffer); + ok(!props.cbAlign, "Got alignment %d.\n", props.cbAlign); + ok(!props.cbPrefix, "Got prefix %d.\n", props.cbPrefix); + + hr = IMemInputPin_NotifyAllocator(input, ret_allocator, TRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IMemAllocator_Release(ret_allocator); + } + + hr = IMemInputPin_NotifyAllocator(input, NULL, TRUE); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + + CoCreateInstance(&CLSID_MemoryAllocator, NULL, CLSCTX_INPROC_SERVER, + &IID_IMemAllocator, (void **)&req_allocator); + + props.cBuffers = 1; + props.cbBuffer = 256; + props.cbAlign = 1; + props.cbPrefix = 0; + hr = IMemAllocator_SetProperties(req_allocator, &props, &ret_props); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMemInputPin_NotifyAllocator(input, req_allocator, TRUE); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IMemInputPin_GetAllocator(input, &ret_allocator); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(ret_allocator == req_allocator, "Allocators didn't match.\n"); + + IMemAllocator_Release(req_allocator); + IMemAllocator_Release(ret_allocator); +} + +static void test_connect_pin(void) +{ + VIDEOINFOHEADER req_format = + { + .bmiHeader.biSize = sizeof(BITMAPINFOHEADER), + .bmiHeader.biCompression = test_handler, + .bmiHeader.biWidth = 32, + .bmiHeader.biHeight = 24, + .bmiHeader.biBitCount = 16, + }; + AM_MEDIA_TYPE req_mt = + { + .majortype = MEDIATYPE_Video, + .subtype = test_subtype, + .formattype = FORMAT_VideoInfo, + .lSampleSize = 888, + .cbFormat = sizeof(req_format), + .pbFormat = (BYTE *)&req_format, + }; + struct testfilter testsource, testsink; + IBaseFilter *filter = create_avi_dec(); + AM_MEDIA_TYPE mt, source_mt, *pmt; + IPin *sink, *source, *peer; + IEnumMediaTypes *enummt; + IMediaControl *control; + IMemInputPin *meminput; + IFilterGraph2 *graph; + unsigned int i; + HRESULT hr; + ULONG ref; + + CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, + &IID_IFilterGraph2, (void **)&graph); + testfilter_init(&testsource); + testfilter_init(&testsink); + IFilterGraph2_AddFilter(graph, &testsink.filter.IBaseFilter_iface, L"sink"); + IFilterGraph2_AddFilter(graph, &testsource.filter.IBaseFilter_iface, L"source"); + IFilterGraph2_AddFilter(graph, filter, L"AVI decoder"); + IBaseFilter_FindPin(filter, L"In", &sink); + IBaseFilter_FindPin(filter, L"Out", &source); + IPin_QueryInterface(sink, &IID_IMemInputPin, (void **)&meminput); + IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + + /* Test sink connection. */ + + peer = (IPin *)0xdeadbeef; + hr = IPin_ConnectedTo(sink, &peer); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + ok(!peer, "Got peer %p.\n", peer); + + hr = IPin_ConnectionMediaType(sink, &mt); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + req_mt.subtype = MEDIASUBTYPE_RGB24; + hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); + req_mt.subtype = test_subtype; + + hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); + todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); + if (hr != S_OK) + goto out; + + hr = IPin_ConnectedTo(sink, &peer); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(peer == &testsource.source.pin.IPin_iface, "Got peer %p.\n", peer); + IPin_Release(peer); + + hr = IPin_ConnectionMediaType(sink, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); + ok(compare_media_types(&testsource.source.pin.mt, &req_mt), "Media types didn't match.\n"); + + hr = IPin_EnumMediaTypes(source, &enummt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + sink_bih = req_format.bmiHeader; + + for (i = 0; i < 9; ++i) + { + static const struct + { + const GUID *subtype; + DWORD compression; + WORD bpp; + } + expect[9] = + { + {&MEDIASUBTYPE_CLJR, mmioFOURCC('C','L','J','R'), 8}, + {&MEDIASUBTYPE_UYVY, mmioFOURCC('U','Y','V','Y'), 16}, + {&MEDIASUBTYPE_YUY2, mmioFOURCC('Y','U','Y','2'), 16}, + {&MEDIASUBTYPE_RGB32, BI_RGB, 32}, + {&MEDIASUBTYPE_RGB24, BI_RGB, 24}, + {&MEDIASUBTYPE_RGB565, BI_BITFIELDS, 16}, + {&MEDIASUBTYPE_RGB555, BI_RGB, 16}, + {&MEDIASUBTYPE_RGB8, BI_RGB, 8}, + {&MEDIASUBTYPE_I420, mmioFOURCC('I','4','2','0'), 12}, + }; + + VIDEOINFOHEADER expect_format = + { + .bmiHeader.biSize = sizeof(BITMAPINFOHEADER), + .bmiHeader.biWidth = 32, + .bmiHeader.biHeight = 24, + .bmiHeader.biBitCount = expect[i].bpp, + .bmiHeader.biCompression = expect[i].compression, + .bmiHeader.biSizeImage = 32 * 24 * expect[i].bpp / 8, + }; + + AM_MEDIA_TYPE expect_mt = + { + .majortype = MEDIATYPE_Video, + .subtype = *expect[i].subtype, + .bFixedSizeSamples = TRUE, + .lSampleSize = 32 * 24 * expect[i].bpp / 8, + .formattype = FORMAT_VideoInfo, + .cbFormat = sizeof(VIDEOINFOHEADER), + .pbFormat = (BYTE *)&expect_format, + }; + + hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!memcmp(pmt, &expect_mt, offsetof(AM_MEDIA_TYPE, cbFormat)), + "%u: Media types didn't match.\n", i); + ok(!memcmp(pmt->pbFormat, &expect_format, sizeof(VIDEOINFOHEADER)), + "%u: Format blocks didn't match.\n", i); + + hr = IPin_QueryAccept(source, pmt); + ok(hr == (i == 8 ? S_OK : S_FALSE), "Got hr %#x.\n", hr); + + if (i == 8) + CopyMediaType(&source_mt, pmt); + + DeleteMediaType(pmt); + } + + hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + IEnumMediaTypes_Release(enummt); + + test_sink_allocator(meminput); + + /* Test source connection. */ + + peer = (IPin *)0xdeadbeef; + hr = IPin_ConnectedTo(source, &peer); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + ok(!peer, "Got peer %p.\n", peer); + + hr = IPin_ConnectionMediaType(source, &mt); + ok(hr == VFW_E_NOT_CONNECTED, "Got hr %#x.\n", hr); + + /* Exact connection. */ + + CopyMediaType(&req_mt, &source_mt); + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + 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); + IPin_Release(peer); + + hr = IPin_ConnectionMediaType(source, &mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); + ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); + + hr = IFilterGraph2_Disconnect(graph, source); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IFilterGraph2_Disconnect(graph, source); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(testsink.sink.pin.peer == source, "Got peer %p.\n", testsink.sink.pin.peer); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.lSampleSize = 999; + req_mt.bTemporalCompression = req_mt.bFixedSizeSamples = TRUE; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&testsink.sink.pin.mt, &req_mt), "Media types didn't match.\n"); + IFilterGraph2_Disconnect(graph, source); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.formattype = FORMAT_None; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == VFW_E_TYPE_NOT_ACCEPTED, "Got hr %#x.\n", hr); + req_mt.formattype = FORMAT_VideoInfo; + + /* Connection with wildcards. */ + + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); + IFilterGraph2_Disconnect(graph, source); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.majortype = GUID_NULL; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); + IFilterGraph2_Disconnect(graph, source); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.subtype = MEDIASUBTYPE_RGB32; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + + req_mt.subtype = GUID_NULL; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); + IFilterGraph2_Disconnect(graph, source); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.formattype = FORMAT_None; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + + req_mt.majortype = MEDIATYPE_Video; + req_mt.subtype = MEDIASUBTYPE_I420; + req_mt.formattype = GUID_NULL; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); + IFilterGraph2_Disconnect(graph, source); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.subtype = MEDIASUBTYPE_RGB32; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + + req_mt.subtype = GUID_NULL; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(compare_media_types(&testsink.sink.pin.mt, &source_mt), "Media types didn't match.\n"); + IFilterGraph2_Disconnect(graph, source); + IFilterGraph2_Disconnect(graph, &testsink.sink.pin.IPin_iface); + + req_mt.majortype = MEDIATYPE_Audio; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, &req_mt); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES, "Got hr %#x.\n", hr); + + /* Our sink's proposed media type is sort of broken, but Windows 8+ returns + * VFW_E_INVALIDMEDIATYPE for even perfectly reasonable ones. */ + testsink.mt = &req_mt; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); + ok(hr == VFW_E_NO_ACCEPTABLE_TYPES + || broken(hr == VFW_E_INVALIDMEDIATYPE) /* Win8+ */, "Got hr %#x.\n", hr); + + req_mt.majortype = MEDIATYPE_Video; + req_mt.subtype = MEDIASUBTYPE_I420; + req_mt.formattype = FORMAT_VideoInfo; + hr = IFilterGraph2_ConnectDirect(graph, source, &testsink.sink.pin.IPin_iface, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_Disconnect(graph, sink); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IFilterGraph2_Disconnect(graph, sink); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(testsource.source.pin.peer == sink, "Got peer %p.\n", testsource.source.pin.peer); + IFilterGraph2_Disconnect(graph, &testsource.source.pin.IPin_iface); + +out: + IMemInputPin_Release(meminput); + IPin_Release(sink); + IPin_Release(source); + IMediaControl_Release(control); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(&testsource.filter.IBaseFilter_iface); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(&testsink.filter.IBaseFilter_iface); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(avidec) { BOOL ret; @@ -685,6 +1192,7 @@ START_TEST(avidec) test_media_types(); test_enum_media_types(); test_unconnected_filter_state(); + test_connect_pin();
CoUninitialize();
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/quartz/avidec.c | 105 +++++++++++++++++++++++++++++++++++-- dlls/quartz/tests/avidec.c | 19 +++++-- 2 files changed, 116 insertions(+), 8 deletions(-)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index 0837ae2b8da..7645b17558b 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -362,12 +362,111 @@ static HRESULT avi_decompressor_source_query_accept(struct strmbase_pin *iface, static HRESULT avi_decompressor_source_get_media_type(struct strmbase_pin *iface, unsigned int index, AM_MEDIA_TYPE *mt) { + static const struct + { + const GUID *subtype; + DWORD compression; + WORD bpp; + } + formats[] = + { + {&MEDIASUBTYPE_CLJR, mmioFOURCC('C','L','J','R'), 8}, + {&MEDIASUBTYPE_UYVY, mmioFOURCC('U','Y','V','Y'), 16}, + {&MEDIASUBTYPE_YUY2, mmioFOURCC('Y','U','Y','2'), 16}, + {&MEDIASUBTYPE_RGB32, BI_RGB, 32}, + {&MEDIASUBTYPE_RGB24, BI_RGB, 24}, + {&MEDIASUBTYPE_RGB565, BI_BITFIELDS, 16}, + {&MEDIASUBTYPE_RGB555, BI_RGB, 16}, + {&MEDIASUBTYPE_RGB8, BI_RGB, 8}, + }; + AVIDecImpl *filter = impl_from_strmbase_filter(iface->filter); + const VIDEOINFOHEADER *sink_format; + VIDEOINFO *format;
- if (index) + if (!filter->sink.pin.peer) return VFW_S_NO_MORE_ITEMS; - CopyMediaType(mt, &filter->mt); - return S_OK; + + sink_format = (VIDEOINFOHEADER *)filter->sink.pin.mt.pbFormat; + + memset(mt, 0, sizeof(AM_MEDIA_TYPE)); + + if (index < ARRAY_SIZE(formats)) + { + if (!(format = CoTaskMemAlloc(offsetof(VIDEOINFO, dwBitMasks[3])))) + return E_OUTOFMEMORY; + memset(format, 0, offsetof(VIDEOINFO, dwBitMasks[3])); + + format->rcSource = sink_format->rcSource; + format->rcTarget = sink_format->rcTarget; + format->dwBitRate = sink_format->dwBitRate; + format->dwBitErrorRate = sink_format->dwBitErrorRate; + format->AvgTimePerFrame = sink_format->AvgTimePerFrame; + + format->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + format->bmiHeader.biWidth = sink_format->bmiHeader.biWidth; + format->bmiHeader.biHeight = sink_format->bmiHeader.biHeight; + format->bmiHeader.biPlanes = sink_format->bmiHeader.biPlanes; + format->bmiHeader.biBitCount = formats[index].bpp; + format->bmiHeader.biCompression = formats[index].compression; + format->bmiHeader.biSizeImage = format->bmiHeader.biWidth + * format->bmiHeader.biHeight * formats[index].bpp / 8; + + if (IsEqualGUID(formats[index].subtype, &MEDIASUBTYPE_RGB565)) + { + format->dwBitMasks[iRED] = 0xf800; + format->dwBitMasks[iGREEN] = 0x07e0; + format->dwBitMasks[iBLUE] = 0x001f; + mt->cbFormat = offsetof(VIDEOINFO, dwBitMasks[3]); + } + else + mt->cbFormat = sizeof(VIDEOINFOHEADER); + + mt->majortype = MEDIATYPE_Video; + mt->subtype = *formats[index].subtype; + mt->bFixedSizeSamples = TRUE; + mt->lSampleSize = format->bmiHeader.biSizeImage; + mt->formattype = FORMAT_VideoInfo; + mt->pbFormat = (BYTE *)format; + + return S_OK; + } + + if (index == ARRAY_SIZE(formats)) + { + size_t size = ICDecompressGetFormatSize(filter->hvid, &sink_format->bmiHeader); + + if (!size) + return VFW_S_NO_MORE_ITEMS; + + mt->cbFormat = offsetof(VIDEOINFOHEADER, bmiHeader) + size; + if (!(format = CoTaskMemAlloc(mt->cbFormat))) + return E_OUTOFMEMORY; + + format->rcSource = sink_format->rcSource; + format->rcTarget = sink_format->rcTarget; + format->dwBitRate = sink_format->dwBitRate; + format->dwBitErrorRate = sink_format->dwBitErrorRate; + format->AvgTimePerFrame = sink_format->AvgTimePerFrame; + + if (ICDecompressGetFormat(filter->hvid, &sink_format->bmiHeader, &format->bmiHeader)) + { + CoTaskMemFree(format); + return VFW_S_NO_MORE_ITEMS; + } + + mt->majortype = MEDIATYPE_Video; + mt->subtype = MEDIATYPE_Video; + mt->subtype.Data1 = format->bmiHeader.biCompression; + mt->bFixedSizeSamples = TRUE; + mt->lSampleSize = format->bmiHeader.biSizeImage; + mt->formattype = FORMAT_VideoInfo; + mt->pbFormat = (BYTE *)format; + + return S_OK; + } + + return VFW_S_NO_MORE_ITEMS; }
static HRESULT WINAPI avi_decompressor_source_DecideBufferSize(struct strmbase_source *iface, diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index d873c34d63e..57e0edd2746 100644 --- a/dlls/quartz/tests/avidec.c +++ b/dlls/quartz/tests/avidec.c @@ -584,7 +584,7 @@ static void test_media_types(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr);
IEnumMediaTypes_Release(enummt); IPin_Release(pin); @@ -639,7 +639,7 @@ static void test_enum_media_types(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr);
hr = IEnumMediaTypes_Next(enum1, 1, mts, &count); ok(hr == S_FALSE, "Got hr %#x.\n", hr); @@ -649,7 +649,7 @@ static void test_enum_media_types(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IEnumMediaTypes_Next(enum1, 1, mts, NULL); - todo_wine ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(hr == S_FALSE, "Got hr %#x.\n", hr);
hr = IEnumMediaTypes_Clone(enum1, &enum2); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -970,11 +970,11 @@ static void test_connect_pin(void) ok(compare_media_types(&mt, &req_mt), "Media types didn't match.\n"); ok(compare_media_types(&testsource.source.pin.mt, &req_mt), "Media types didn't match.\n");
+ sink_bih = req_format.bmiHeader; + hr = IPin_EnumMediaTypes(source, &enummt); ok(hr == S_OK, "Got hr %#x.\n", hr);
- sink_bih = req_format.bmiHeader; - for (i = 0; i < 9; ++i) { static const struct @@ -1023,6 +1023,15 @@ static void test_connect_pin(void) "%u: Media types didn't match.\n", i); ok(!memcmp(pmt->pbFormat, &expect_format, sizeof(VIDEOINFOHEADER)), "%u: Format blocks didn't match.\n", i); + if (i == 5) + { + const VIDEOINFO *format = (VIDEOINFO *)pmt->pbFormat; + + ok(pmt->cbFormat == offsetof(VIDEOINFO, dwBitMasks[3]), "Got format size %u.\n", pmt->cbFormat); + ok(format->dwBitMasks[iRED] == 0xf800, "Got red bit mask %#x.\n", format->dwBitMasks[iRED]); + ok(format->dwBitMasks[iGREEN] == 0x07e0, "Got green bit mask %#x.\n", format->dwBitMasks[iGREEN]); + ok(format->dwBitMasks[iBLUE] == 0x001f, "Got blue bit mask %#x.\n", format->dwBitMasks[iBLUE]); + }
hr = IPin_QueryAccept(source, pmt); ok(hr == (i == 8 ? S_OK : S_FALSE), "Got hr %#x.\n", hr);
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/quartz/avidec.c | 41 +++++++++++++++----------------------- dlls/quartz/tests/avidec.c | 7 +++++++ 2 files changed, 23 insertions(+), 25 deletions(-)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index 7645b17558b..7edad0fc04c 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -47,7 +47,6 @@ typedef struct AVIDecImpl
struct strmbase_sink sink;
- AM_MEDIA_TYPE mt; HIC hvid; BITMAPINFOHEADER* pBihIn; BITMAPINFOHEADER* pBihOut; @@ -238,21 +237,19 @@ static HRESULT avi_decompressor_sink_connect(struct strmbase_sink *iface, IPin * This->hvid = ICLocate(pmt->majortype.Data1, pmt->subtype.Data1, bmi, NULL, ICMODE_DECOMPRESS); if (This->hvid) { - const CLSID* outsubtype; DWORD bih_size; DWORD output_depth = bmi->biBitCount; DWORD result; - FreeMediaType(&This->mt);
switch(bmi->biBitCount) { - case 32: outsubtype = &MEDIASUBTYPE_RGB32; break; - case 24: outsubtype = &MEDIASUBTYPE_RGB24; break; - case 16: outsubtype = &MEDIASUBTYPE_RGB565; break; - case 8: outsubtype = &MEDIASUBTYPE_RGB8; break; + case 32: + case 24: + case 16: + case 8: + break; default: WARN("Non standard input depth %d, forced output depth to 32\n", bmi->biBitCount); - outsubtype = &MEDIASUBTYPE_RGB32; output_depth = 32; break; } @@ -286,17 +283,6 @@ static HRESULT avi_decompressor_sink_connect(struct strmbase_sink *iface, IPin * goto failed; }
- /* Update output media type */ - CopyMediaType(&This->mt, pmt); - This->mt.subtype = *outsubtype; - - if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo)) - memcpy(&(((VIDEOINFOHEADER *)This->mt.pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize); - else if (IsEqualIID(&pmt->formattype, &FORMAT_VideoInfo2)) - memcpy(&(((VIDEOINFOHEADER2 *)This->mt.pbFormat)->bmiHeader), This->pBihOut, This->pBihOut->biSize); - else - assert(0); - TRACE("Connection accepted\n"); return S_OK; } @@ -351,12 +337,18 @@ static HRESULT avi_decompressor_source_query_interface(struct strmbase_pin *ifac static HRESULT avi_decompressor_source_query_accept(struct strmbase_pin *iface, const AM_MEDIA_TYPE *mt) { AVIDecImpl *filter = impl_from_strmbase_filter(iface->filter); + VIDEOINFOHEADER *sink_format, *format;
- if (IsEqualGUID(&mt->majortype, &filter->mt.majortype) - && (IsEqualGUID(&mt->subtype, &filter->mt.subtype) - || IsEqualGUID(&filter->mt.subtype, &GUID_NULL))) - return S_OK; - return S_FALSE; + if (!filter->sink.pin.peer || !IsEqualGUID(&mt->formattype, &FORMAT_VideoInfo)) + return S_FALSE; + + sink_format = (VIDEOINFOHEADER *)filter->sink.pin.mt.pbFormat; + format = (VIDEOINFOHEADER *)mt->pbFormat; + + if (ICDecompressQuery(filter->hvid, &sink_format->bmiHeader, &format->bmiHeader)) + return S_FALSE; + + return S_OK; }
static HRESULT avi_decompressor_source_get_media_type(struct strmbase_pin *iface, @@ -584,7 +576,6 @@ static void avi_decompressor_destroy(struct strmbase_filter *iface)
filter->stream_cs.DebugInfo->Spare[0] = 0; DeleteCriticalSection(&filter->stream_cs); - FreeMediaType(&filter->mt); IUnknown_Release(filter->seeking); strmbase_filter_cleanup(&filter->filter); free(filter); diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index 57e0edd2746..1d435d157f0 100644 --- a/dlls/quartz/tests/avidec.c +++ b/dlls/quartz/tests/avidec.c @@ -586,6 +586,13 @@ static void test_media_types(void) hr = IEnumMediaTypes_Next(enummt, 1, &pmt, NULL); ok(hr == S_FALSE, "Got hr %#x.\n", hr);
+ mt.subtype = MEDIASUBTYPE_RGB24; + vih.bmiHeader.biCompression = BI_RGB; + vih.bmiHeader.biBitCount = 24; + vih.bmiHeader.biSizeImage= 32 * 24 * 3; + hr = IPin_QueryAccept(pin, &mt); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + IEnumMediaTypes_Release(enummt); IPin_Release(pin);
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/quartz/avidec.c | 61 ++++++++++++-------------------------- dlls/quartz/tests/avidec.c | 5 +--- 2 files changed, 20 insertions(+), 46 deletions(-)
diff --git a/dlls/quartz/avidec.c b/dlls/quartz/avidec.c index 7edad0fc04c..97566679068 100644 --- a/dlls/quartz/avidec.c +++ b/dlls/quartz/avidec.c @@ -49,7 +49,6 @@ typedef struct AVIDecImpl
HIC hvid; BITMAPINFOHEADER* pBihIn; - BITMAPINFOHEADER* pBihOut; REFERENCE_TIME late; } AVIDecImpl;
@@ -100,6 +99,7 @@ static int AVIDec_DropSample(AVIDecImpl *This, REFERENCE_TIME tStart) { static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, IMediaSample *pSample) { AVIDecImpl *This = impl_from_strmbase_filter(iface->pin.filter); + VIDEOINFOHEADER *source_format; HRESULT hr; DWORD res; IMediaSample* pOutSample = NULL; @@ -120,6 +120,8 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, return VFW_E_NOT_CONNECTED; }
+ source_format = (VIDEOINFOHEADER *)This->source.pin.mt.pbFormat; + if (This->filter.state == State_Stopped) return VFW_E_WRONG_STATE;
@@ -161,8 +163,9 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, return hr; } cbDstStream = IMediaSample_GetSize(pOutSample); - if (cbDstStream < This->pBihOut->biSizeImage) { - ERR("Sample size is too small %d < %d\n", cbDstStream, This->pBihOut->biSizeImage); + if (cbDstStream < source_format->bmiHeader.biSizeImage) + { + ERR("Sample size is too small (%u < %u).\n", cbDstStream, source_format->bmiHeader.biSizeImage); IMediaSample_Release(pOutSample); LeaveCriticalSection(&This->stream_cs); return E_FAIL; @@ -176,7 +179,7 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, if (hr == S_OK && AVIDec_DropSample(This, tStart)) flags |= ICDECOMPRESS_HURRYUP;
- res = ICDecompress(This->hvid, flags, This->pBihIn, pbSrcStream, This->pBihOut, pbDstStream); + res = ICDecompress(This->hvid, flags, This->pBihIn, pbSrcStream, &source_format->bmiHeader, pbDstStream); if (res != ICERR_OK) ERR("Error occurred during the decompression (%x)\n", res);
@@ -187,7 +190,7 @@ static HRESULT WINAPI avi_decompressor_sink_Receive(struct strmbase_sink *iface, return S_OK; }
- IMediaSample_SetActualDataLength(pOutSample, This->pBihOut->biSizeImage); + IMediaSample_SetActualDataLength(pOutSample, source_format->bmiHeader.biSizeImage);
IMediaSample_SetPreroll(pOutSample, (IMediaSample_IsPreroll(pSample) == S_OK)); IMediaSample_SetDiscontinuity(pOutSample, (IMediaSample_IsDiscontinuity(pSample) == S_OK)); @@ -238,22 +241,8 @@ static HRESULT avi_decompressor_sink_connect(struct strmbase_sink *iface, IPin * if (This->hvid) { DWORD bih_size; - DWORD output_depth = bmi->biBitCount; DWORD result;
- switch(bmi->biBitCount) - { - case 32: - case 24: - case 16: - case 8: - break; - default: - WARN("Non standard input depth %d, forced output depth to 32\n", bmi->biBitCount); - output_depth = 32; - break; - } - /* Copy bitmap header from media type to 1 for input and 1 for output */ bih_size = bmi->biSize + bmi->biClrUsed * 4; This->pBihIn = CoTaskMemAlloc(bih_size); @@ -262,25 +251,12 @@ static HRESULT avi_decompressor_sink_connect(struct strmbase_sink *iface, IPin * hr = E_OUTOFMEMORY; goto failed; } - This->pBihOut = CoTaskMemAlloc(bih_size); - if (!This->pBihOut) - { - hr = E_OUTOFMEMORY; - goto failed; - } memcpy(This->pBihIn, bmi, bih_size); - memcpy(This->pBihOut, bmi, bih_size); - - /* Update output format as non compressed bitmap */ - This->pBihOut->biCompression = 0; - This->pBihOut->biBitCount = output_depth; - This->pBihOut->biSizeImage = This->pBihOut->biWidth * This->pBihOut->biHeight * This->pBihOut->biBitCount / 8; - TRACE("Size: %u\n", This->pBihIn->biSize); - result = ICDecompressQuery(This->hvid, This->pBihIn, This->pBihOut); - if (result != ICERR_OK) + + if ((result = ICDecompressQuery(This->hvid, This->pBihIn, NULL))) { - ERR("Unable to found a suitable output format (%d)\n", result); - goto failed; + WARN("No decompressor found, error %d.\n", result); + return VFW_E_TYPE_NOT_ACCEPTED; }
TRACE("Connection accepted\n"); @@ -302,10 +278,8 @@ static void avi_decompressor_sink_disconnect(struct strmbase_sink *iface) if (filter->hvid) ICClose(filter->hvid); CoTaskMemFree(filter->pBihIn); - CoTaskMemFree(filter->pBihOut); filter->hvid = NULL; filter->pBihIn = NULL; - filter->pBihOut = NULL; }
static const struct strmbase_sink_ops sink_ops = @@ -434,6 +408,7 @@ static HRESULT avi_decompressor_source_get_media_type(struct strmbase_pin *iface mt->cbFormat = offsetof(VIDEOINFOHEADER, bmiHeader) + size; if (!(format = CoTaskMemAlloc(mt->cbFormat))) return E_OUTOFMEMORY; + memset(format, 0, mt->cbFormat);
format->rcSource = sink_format->rcSource; format->rcTarget = sink_format->rcTarget; @@ -464,14 +439,14 @@ static HRESULT avi_decompressor_source_get_media_type(struct strmbase_pin *iface static HRESULT WINAPI avi_decompressor_source_DecideBufferSize(struct strmbase_source *iface, IMemAllocator *pAlloc, ALLOCATOR_PROPERTIES *ppropInputRequest) { - AVIDecImpl *pAVI = impl_from_strmbase_filter(iface->pin.filter); + const VIDEOINFOHEADER *source_format = (VIDEOINFOHEADER *)iface->pin.mt.pbFormat; ALLOCATOR_PROPERTIES actual;
if (!ppropInputRequest->cbAlign) ppropInputRequest->cbAlign = 1;
- if (ppropInputRequest->cbBuffer < pAVI->pBihOut->biSizeImage) - ppropInputRequest->cbBuffer = pAVI->pBihOut->biSizeImage; + if (ppropInputRequest->cbBuffer < source_format->bmiHeader.biSizeImage) + ppropInputRequest->cbBuffer = source_format->bmiHeader.biSizeImage;
if (!ppropInputRequest->cBuffers) ppropInputRequest->cBuffers = 1; @@ -586,11 +561,13 @@ static void avi_decompressor_destroy(struct strmbase_filter *iface) static HRESULT avi_decompressor_init_stream(struct strmbase_filter *iface) { AVIDecImpl *filter = impl_from_strmbase_filter(iface); + VIDEOINFOHEADER *source_format; LRESULT res;
filter->late = -1;
- if ((res = ICDecompressBegin(filter->hvid, filter->pBihIn, filter->pBihOut))) + source_format = (VIDEOINFOHEADER *)filter->sink.pin.mt.pbFormat; + if ((res = ICDecompressBegin(filter->hvid, filter->pBihIn, &source_format->bmiHeader))) { ERR("ICDecompressBegin() failed, error %ld.\n", res); return E_FAIL; diff --git a/dlls/quartz/tests/avidec.c b/dlls/quartz/tests/avidec.c index 1d435d157f0..7b38561c011 100644 --- a/dlls/quartz/tests/avidec.c +++ b/dlls/quartz/tests/avidec.c @@ -963,9 +963,7 @@ static void test_connect_pin(void) req_mt.subtype = test_subtype;
hr = IFilterGraph2_ConnectDirect(graph, &testsource.source.pin.IPin_iface, sink, &req_mt); - todo_wine ok(hr == S_OK, "Got hr %#x.\n", hr); - if (hr != S_OK) - goto out; + ok(hr == S_OK, "Got hr %#x.\n", hr);
hr = IPin_ConnectedTo(sink, &peer); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -1176,7 +1174,6 @@ static void test_connect_pin(void) ok(testsource.source.pin.peer == sink, "Got peer %p.\n", testsource.source.pin.peer); IFilterGraph2_Disconnect(graph, &testsource.source.pin.IPin_iface);
-out: IMemInputPin_Release(meminput); IPin_Release(sink); IPin_Release(source);
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=67935
Your paranoid android.
=== w2008s64 (32 bit report) ===
quartz: filtergraph.c:4459: Test failed: Got hr 0x80040256.
=== w2008s64 (64 bit report) ===
quartz: filtergraph.c:4459: Test failed: Got hr 0x80040256.