Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/evr/tests/Makefile.in | 3 +- dlls/evr/tests/evr.c | 337 +------------------------------- dlls/evr/tests/filter.c | 390 +++++++++++++++++++++++++++++++++++++ 3 files changed, 394 insertions(+), 336 deletions(-) create mode 100644 dlls/evr/tests/filter.c
diff --git a/dlls/evr/tests/Makefile.in b/dlls/evr/tests/Makefile.in index c5db2226ebc..45440da90e8 100644 --- a/dlls/evr/tests/Makefile.in +++ b/dlls/evr/tests/Makefile.in @@ -2,4 +2,5 @@ TESTDLL = evr.dll IMPORTS = dxva2 mfplat mfuuid mf strmiids uuid dxguid ole32 oleaut32 evr d3d9 user32
C_SRCS = \ - evr.c + evr.c \ + filter.c diff --git a/dlls/evr/tests/evr.c b/dlls/evr/tests/evr.c index 5bf03fa49f8..f56ec156be4 100644 --- a/dlls/evr/tests/evr.c +++ b/dlls/evr/tests/evr.c @@ -1,7 +1,7 @@ /* - * Enhanced Video Renderer filter unit tests + * Enhanced Video Renderer mixer and presenter unit tests * - * Copyright 2018 Zebediah Figura + * Copyright 2020-2021 Nikolay Sivov * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -29,8 +29,6 @@ #include "initguid.h" #include "evr9.h"
-static const WCHAR sink_id[] = L"EVR Input0"; - static void set_rect(MFVideoNormalizedRect *rect, float left, float top, float right, float bottom) { rect->left = left; @@ -75,15 +73,6 @@ static IDirect3DDevice9 *create_device(HWND focus_window) return device; }
-static IBaseFilter *create_evr(void) -{ - IBaseFilter *filter = NULL; - HRESULT hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, NULL, CLSCTX_INPROC_SERVER, - &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#x.\n", hr); - return filter; -} - static ULONG get_refcount(void *iface) { IUnknown *unknown = iface; @@ -91,137 +80,6 @@ static ULONG get_refcount(void *iface) return IUnknown_Release(unknown); }
-static const GUID test_iid = {0x33333333}; -static LONG outer_ref = 1; - -static HRESULT WINAPI outer_QueryInterface(IUnknown *iface, REFIID iid, void **out) -{ - if (IsEqualGUID(iid, &IID_IUnknown) - || IsEqualGUID(iid, &IID_IBaseFilter) - || IsEqualGUID(iid, &test_iid)) - { - *out = (IUnknown *)0xdeadbeef; - return S_OK; - } - ok(0, "unexpected call %s\n", wine_dbgstr_guid(iid)); - return E_NOINTERFACE; -} - -static ULONG WINAPI outer_AddRef(IUnknown *iface) -{ - return InterlockedIncrement(&outer_ref); -} - -static ULONG WINAPI outer_Release(IUnknown *iface) -{ - return InterlockedDecrement(&outer_ref); -} - -static const IUnknownVtbl outer_vtbl = -{ - outer_QueryInterface, - outer_AddRef, - outer_Release, -}; - -static IUnknown test_outer = {&outer_vtbl}; - -static void test_aggregation(void) -{ - IBaseFilter *filter, *filter2; - IMFVideoPresenter *presenter; - IUnknown *unk, *unk2; - IMFTransform *mixer; - HRESULT hr; - ULONG ref; - - filter = (IBaseFilter *)0xdeadbeef; - hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, - &IID_IBaseFilter, (void **)&filter); - ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); - ok(!filter, "Got interface %p.\n", filter); - - hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, - &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); - ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); - ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - - ref = IUnknown_AddRef(unk); - ok(ref == 2, "Got unexpected refcount %d.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); - - ref = IUnknown_Release(unk); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); - - hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); - IUnknown_Release(unk2); - - hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); - - hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); - - hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); - ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); - ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); - - hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); - - IBaseFilter_Release(filter); - ref = IUnknown_Release(unk); - ok(!ref, "Got unexpected refcount %d.\n", ref); - ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); - - /* Default presenter. */ - presenter = (void *)0xdeadbeef; - hr = CoCreateInstance(&CLSID_MFVideoPresenter9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IMFVideoPresenter, - (void **)&presenter); - ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); - ok(!presenter, "Got interface %p.\n", presenter); - - hr = CoCreateInstance(&CLSID_MFVideoPresenter9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK || broken(hr == E_FAIL) /* WinXP */, "Unexpected hr %#x.\n", hr); - if (SUCCEEDED(hr)) - { - ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); - ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); - ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - - IUnknown_Release(unk); - } - - /* Default mixer. */ - presenter = (void *)0xdeadbeef; - hr = CoCreateInstance(&CLSID_MFVideoMixer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IMFTransform, - (void **)&mixer); - ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); - ok(!mixer, "Got interface %p.\n", mixer); - - hr = CoCreateInstance(&CLSID_MFVideoMixer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); - ok(hr == S_OK, "Unexpected hr %#x.\n", hr); - ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); - ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); - ref = get_refcount(unk); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - - IUnknown_Release(unk); -} - #define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) { @@ -252,192 +110,6 @@ static void check_service_interface_(unsigned int line, void *iface_ptr, REFGUID IUnknown_Release(unk); }
-static void test_interfaces(void) -{ - IBaseFilter *filter = create_evr(); - ULONG ref; - - todo_wine check_interface(filter, &IID_IAMFilterMiscFlags, TRUE); - check_interface(filter, &IID_IBaseFilter, TRUE); - check_interface(filter, &IID_IEVRFilterConfig, TRUE); - check_interface(filter, &IID_IMediaFilter, TRUE); - check_interface(filter, &IID_IMediaPosition, TRUE); - check_interface(filter, &IID_IMediaSeeking, TRUE); - check_interface(filter, &IID_IPersist, TRUE); - check_interface(filter, &IID_IUnknown, TRUE); - - check_interface(filter, &IID_IBasicAudio, FALSE); - check_interface(filter, &IID_IBasicVideo, FALSE); - check_interface(filter, &IID_IDirectXVideoMemoryConfiguration, FALSE); - check_interface(filter, &IID_IMemInputPin, FALSE); - check_interface(filter, &IID_IPersistPropertyBag, FALSE); - check_interface(filter, &IID_IPin, FALSE); - check_interface(filter, &IID_IReferenceClock, FALSE); - check_interface(filter, &IID_IVideoWindow, FALSE); - - ref = IBaseFilter_Release(filter); - ok(!ref, "Got unexpected refcount %d.\n", ref); -} - -static void test_enum_pins(void) -{ - IBaseFilter *filter = create_evr(); - IEnumPins *enum1, *enum2; - ULONG count, ref; - IPin *pins[2]; - HRESULT hr; - - ref = get_refcount(filter); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - - hr = IBaseFilter_EnumPins(filter, NULL); - ok(hr == E_POINTER, "Got hr %#x.\n", hr); - - hr = IBaseFilter_EnumPins(filter, &enum1); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %d.\n", ref); - ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - - hr = IEnumPins_Next(enum1, 1, NULL, NULL); - ok(hr == E_POINTER, "Got hr %#x.\n", hr); - - hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %d.\n", ref); - ref = get_refcount(pins[0]); - ok(ref == 3, "Got unexpected refcount %d.\n", ref); - ref = get_refcount(enum1); - ok(ref == 1, "Got unexpected refcount %d.\n", ref); - IPin_Release(pins[0]); - ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %d.\n", ref); - - hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#x.\n", hr); - - hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(count == 1, "Got count %u.\n", count); - IPin_Release(pins[0]); - - hr = IEnumPins_Next(enum1, 1, pins, &count); - ok(hr == S_FALSE, "Got hr %#x.\n", hr); - ok(!count, "Got count %u.\n", count); - - hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IEnumPins_Next(enum1, 2, pins, NULL); - ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); - - hr = IEnumPins_Next(enum1, 2, pins, &count); - ok(hr == S_FALSE, "Got hr %#x.\n", hr); - ok(count == 1, "Got count %u.\n", count); - IPin_Release(pins[0]); - - hr = IEnumPins_Reset(enum1); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IEnumPins_Clone(enum1, &enum2); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IEnumPins_Skip(enum1, 2); - ok(hr == S_FALSE, "Got hr %#x.\n", hr); - - hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IEnumPins_Skip(enum1, 1); - ok(hr == S_FALSE, "Got hr %#x.\n", hr); - - hr = IEnumPins_Next(enum1, 1, pins, NULL); - ok(hr == S_FALSE, "Got hr %#x.\n", hr); - - hr = IEnumPins_Next(enum2, 1, pins, NULL); - ok(hr == S_OK, "Got hr %#x.\n", hr); - IPin_Release(pins[0]); - - IEnumPins_Release(enum2); - IEnumPins_Release(enum1); - ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %d.\n", ref); -} - -static void test_find_pin(void) -{ - IBaseFilter *filter = create_evr(); - IEnumPins *enum_pins; - IPin *pin, *pin2; - HRESULT hr; - ULONG ref; - - hr = IBaseFilter_EnumPins(filter, &enum_pins); - ok(hr == S_OK, "Got hr %#x.\n", hr); - - hr = IBaseFilter_FindPin(filter, sink_id, &pin); - ok(hr == S_OK, "Got hr %#x.\n", hr); - hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(pin2 == pin, "Expected pin %p, got %p.\n", pin, pin2); - IPin_Release(pin2); - IPin_Release(pin); - - IEnumPins_Release(enum_pins); - ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %d.\n", ref); -} - -static void test_pin_info(void) -{ - IBaseFilter *filter = create_evr(); - PIN_DIRECTION dir; - PIN_INFO info; - HRESULT hr; - WCHAR *id; - ULONG ref; - IPin *pin; - - hr = IBaseFilter_FindPin(filter, sink_id, &pin); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ref = get_refcount(filter); - ok(ref == 2, "Got unexpected refcount %d.\n", ref); - ref = get_refcount(pin); - ok(ref == 2, "Got unexpected refcount %d.\n", ref); - - hr = IPin_QueryPinInfo(pin, &info); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); - ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); - ok(!lstrcmpW(info.achName, sink_id), "Got name %s.\n", wine_dbgstr_w(info.achName)); - ref = get_refcount(filter); - ok(ref == 3, "Got unexpected refcount %d.\n", ref); - ref = get_refcount(pin); - ok(ref == 3, "Got unexpected refcount %d.\n", ref); - IBaseFilter_Release(info.pFilter); - - hr = IPin_QueryDirection(pin, &dir); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); - - hr = IPin_QueryId(pin, &id); - ok(hr == S_OK, "Got hr %#x.\n", hr); - ok(!lstrcmpW(id, sink_id), "Got id %s.\n", wine_dbgstr_w(id)); - CoTaskMemFree(id); - - hr = IPin_QueryInternalConnections(pin, NULL, NULL); - ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); - - IPin_Release(pin); - ref = IBaseFilter_Release(filter); - ok(!ref, "Got outstanding refcount %d.\n", ref); -} - static IMFMediaType * create_video_type(const GUID *subtype) { IMFMediaType *video_type; @@ -2768,11 +2440,6 @@ START_TEST(evr) { CoInitialize(NULL);
- test_aggregation(); - test_interfaces(); - test_enum_pins(); - test_find_pin(); - test_pin_info(); test_default_mixer(); test_default_mixer_type_negotiation(); test_surface_sample(); diff --git a/dlls/evr/tests/filter.c b/dlls/evr/tests/filter.c new file mode 100644 index 00000000000..4f52dd5c238 --- /dev/null +++ b/dlls/evr/tests/filter.c @@ -0,0 +1,390 @@ +/* + * Enhanced Video Renderer filter unit tests + * + * Copyright 2018 Zebediah Figura + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#define COBJMACROS + +#include "dshow.h" +#include "wine/test.h" +#include "d3d9.h" +#include "evr.h" +#include "evr9.h" + +static const WCHAR sink_id[] = L"EVR Input0"; + +static IBaseFilter *create_evr(void) +{ + IBaseFilter *filter = NULL; + HRESULT hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, NULL, CLSCTX_INPROC_SERVER, + &IID_IBaseFilter, (void **)&filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + return filter; +} + +static ULONG get_refcount(void *iface) +{ + IUnknown *unknown = iface; + IUnknown_AddRef(unknown); + return IUnknown_Release(unknown); +} + +static const GUID test_iid = {0x33333333}; +static LONG outer_ref = 1; + +static HRESULT WINAPI outer_QueryInterface(IUnknown *iface, REFIID iid, void **out) +{ + if (IsEqualGUID(iid, &IID_IUnknown) + || IsEqualGUID(iid, &IID_IBaseFilter) + || IsEqualGUID(iid, &test_iid)) + { + *out = (IUnknown *)0xdeadbeef; + return S_OK; + } + ok(0, "unexpected call %s\n", wine_dbgstr_guid(iid)); + return E_NOINTERFACE; +} + +static ULONG WINAPI outer_AddRef(IUnknown *iface) +{ + return InterlockedIncrement(&outer_ref); +} + +static ULONG WINAPI outer_Release(IUnknown *iface) +{ + return InterlockedDecrement(&outer_ref); +} + +static const IUnknownVtbl outer_vtbl = +{ + outer_QueryInterface, + outer_AddRef, + outer_Release, +}; + +static IUnknown test_outer = {&outer_vtbl}; + +static void test_aggregation(void) +{ + IBaseFilter *filter, *filter2; + IMFVideoPresenter *presenter; + IUnknown *unk, *unk2; + IMFTransform *mixer; + HRESULT hr; + ULONG ref; + + filter = (IBaseFilter *)0xdeadbeef; + hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, + &IID_IBaseFilter, (void **)&filter); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); + ok(!filter, "Got interface %p.\n", filter); + + hr = CoCreateInstance(&CLSID_EnhancedVideoRenderer, &test_outer, CLSCTX_INPROC_SERVER, + &IID_IUnknown, (void **)&unk); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); + ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); + ref = get_refcount(unk); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + ref = IUnknown_AddRef(unk); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); + + ref = IUnknown_Release(unk); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); + + hr = IUnknown_QueryInterface(unk, &IID_IUnknown, (void **)&unk2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(unk2 == unk, "Got unexpected IUnknown %p.\n", unk2); + IUnknown_Release(unk2); + + hr = IUnknown_QueryInterface(unk, &IID_IBaseFilter, (void **)&filter); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_QueryInterface(filter, &IID_IUnknown, (void **)&unk2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); + + hr = IBaseFilter_QueryInterface(filter, &IID_IBaseFilter, (void **)&filter2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(filter2 == (IBaseFilter *)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2); + + hr = IUnknown_QueryInterface(unk, &test_iid, (void **)&unk2); + ok(hr == E_NOINTERFACE, "Got hr %#x.\n", hr); + ok(!unk2, "Got unexpected IUnknown %p.\n", unk2); + + hr = IBaseFilter_QueryInterface(filter, &test_iid, (void **)&unk2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(unk2 == (IUnknown *)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2); + + IBaseFilter_Release(filter); + ref = IUnknown_Release(unk); + ok(!ref, "Got unexpected refcount %d.\n", ref); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); + + /* Default presenter. */ + presenter = (void *)0xdeadbeef; + hr = CoCreateInstance(&CLSID_MFVideoPresenter9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IMFVideoPresenter, + (void **)&presenter); + ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); + ok(!presenter, "Got interface %p.\n", presenter); + + hr = CoCreateInstance(&CLSID_MFVideoPresenter9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); + ok(hr == S_OK || broken(hr == E_FAIL) /* WinXP */, "Unexpected hr %#x.\n", hr); + if (SUCCEEDED(hr)) + { + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); + ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); + ref = get_refcount(unk); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + IUnknown_Release(unk); + } + + /* Default mixer. */ + presenter = (void *)0xdeadbeef; + hr = CoCreateInstance(&CLSID_MFVideoMixer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IMFTransform, + (void **)&mixer); + ok(hr == E_NOINTERFACE, "Unexpected hr %#x.\n", hr); + ok(!mixer, "Got interface %p.\n", mixer); + + hr = CoCreateInstance(&CLSID_MFVideoMixer9, &test_outer, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void **)&unk); + ok(hr == S_OK, "Unexpected hr %#x.\n", hr); + ok(outer_ref == 1, "Got unexpected refcount %d.\n", outer_ref); + ok(unk != &test_outer, "Returned IUnknown should not be outer IUnknown.\n"); + ref = get_refcount(unk); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + IUnknown_Release(unk); +} + +#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c) +static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported) +{ + IUnknown *iface = iface_ptr; + HRESULT hr, expected_hr; + IUnknown *unk; + + expected_hr = supported ? S_OK : E_NOINTERFACE; + + hr = IUnknown_QueryInterface(iface, iid, (void **)&unk); + ok_(__FILE__, line)(hr == expected_hr, "Got hr %#x, expected %#x.\n", hr, expected_hr); + if (SUCCEEDED(hr)) + IUnknown_Release(unk); +} + +static void test_interfaces(void) +{ + IBaseFilter *filter = create_evr(); + ULONG ref; + + todo_wine check_interface(filter, &IID_IAMFilterMiscFlags, TRUE); + check_interface(filter, &IID_IBaseFilter, TRUE); + check_interface(filter, &IID_IEVRFilterConfig, TRUE); + check_interface(filter, &IID_IMediaFilter, TRUE); + check_interface(filter, &IID_IMediaPosition, TRUE); + check_interface(filter, &IID_IMediaSeeking, TRUE); + check_interface(filter, &IID_IPersist, TRUE); + check_interface(filter, &IID_IUnknown, TRUE); + + check_interface(filter, &IID_IBasicAudio, FALSE); + check_interface(filter, &IID_IBasicVideo, FALSE); + check_interface(filter, &IID_IDirectXVideoMemoryConfiguration, FALSE); + check_interface(filter, &IID_IMemInputPin, FALSE); + check_interface(filter, &IID_IPersistPropertyBag, FALSE); + check_interface(filter, &IID_IPin, FALSE); + check_interface(filter, &IID_IReferenceClock, FALSE); + check_interface(filter, &IID_IVideoWindow, FALSE); + + ref = IBaseFilter_Release(filter); + ok(!ref, "Got unexpected refcount %d.\n", ref); +} + +static void test_enum_pins(void) +{ + IBaseFilter *filter = create_evr(); + IEnumPins *enum1, *enum2; + ULONG count, ref; + IPin *pins[2]; + HRESULT hr; + + ref = get_refcount(filter); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + hr = IBaseFilter_EnumPins(filter, NULL); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + + hr = IBaseFilter_EnumPins(filter, &enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = get_refcount(filter); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(enum1); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + + hr = IEnumPins_Next(enum1, 1, NULL, NULL); + ok(hr == E_POINTER, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = get_refcount(filter); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(pins[0]); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(enum1); + ok(ref == 1, "Got unexpected refcount %d.\n", ref); + IPin_Release(pins[0]); + ref = get_refcount(filter); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 1, pins, &count); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); + IPin_Release(pins[0]); + + hr = IEnumPins_Next(enum1, 1, pins, &count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(!count, "Got count %u.\n", count); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 2, pins, NULL); + ok(hr == E_INVALIDARG, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 2, pins, &count); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + ok(count == 1, "Got count %u.\n", count); + IPin_Release(pins[0]); + + hr = IEnumPins_Reset(enum1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Clone(enum1, &enum2); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Skip(enum1, 2); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Skip(enum1, 1); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IEnumPins_Skip(enum1, 1); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum1, 1, pins, NULL); + ok(hr == S_FALSE, "Got hr %#x.\n", hr); + + hr = IEnumPins_Next(enum2, 1, pins, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + IPin_Release(pins[0]); + + IEnumPins_Release(enum2); + IEnumPins_Release(enum1); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + +static void test_find_pin(void) +{ + IBaseFilter *filter = create_evr(); + IEnumPins *enum_pins; + IPin *pin, *pin2; + HRESULT hr; + ULONG ref; + + hr = IBaseFilter_EnumPins(filter, &enum_pins); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IBaseFilter_FindPin(filter, sink_id, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + hr = IEnumPins_Next(enum_pins, 1, &pin2, NULL); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(pin2 == pin, "Expected pin %p, got %p.\n", pin, pin2); + IPin_Release(pin2); + IPin_Release(pin); + + IEnumPins_Release(enum_pins); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + +static void test_pin_info(void) +{ + IBaseFilter *filter = create_evr(); + PIN_DIRECTION dir; + PIN_INFO info; + HRESULT hr; + WCHAR *id; + ULONG ref; + IPin *pin; + + hr = IBaseFilter_FindPin(filter, sink_id, &pin); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ref = get_refcount(filter); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(pin); + ok(ref == 2, "Got unexpected refcount %d.\n", ref); + + hr = IPin_QueryPinInfo(pin, &info); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(info.pFilter == filter, "Expected filter %p, got %p.\n", filter, info.pFilter); + ok(info.dir == PINDIR_INPUT, "Got direction %d.\n", info.dir); + ok(!lstrcmpW(info.achName, sink_id), "Got name %s.\n", wine_dbgstr_w(info.achName)); + ref = get_refcount(filter); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + ref = get_refcount(pin); + ok(ref == 3, "Got unexpected refcount %d.\n", ref); + IBaseFilter_Release(info.pFilter); + + hr = IPin_QueryDirection(pin, &dir); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(dir == PINDIR_INPUT, "Got direction %d.\n", dir); + + hr = IPin_QueryId(pin, &id); + ok(hr == S_OK, "Got hr %#x.\n", hr); + ok(!lstrcmpW(id, sink_id), "Got id %s.\n", wine_dbgstr_w(id)); + CoTaskMemFree(id); + + hr = IPin_QueryInternalConnections(pin, NULL, NULL); + ok(hr == E_NOTIMPL, "Got hr %#x.\n", hr); + + IPin_Release(pin); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + +START_TEST(filter) +{ + CoInitialize(NULL); + + test_aggregation(); + test_interfaces(); + test_enum_pins(); + test_find_pin(); + test_pin_info(); + + CoUninitialize(); +}
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/evr/Makefile.in | 2 +- dlls/evr/{evr.c => filter.c} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename dlls/evr/{evr.c => filter.c} (100%)
diff --git a/dlls/evr/Makefile.in b/dlls/evr/Makefile.in index d5d78252113..134de1652dc 100644 --- a/dlls/evr/Makefile.in +++ b/dlls/evr/Makefile.in @@ -6,7 +6,7 @@ DELAYIMPORTS = mfplat EXTRADLLFLAGS = -Wb,--prefer-native
C_SRCS = \ - evr.c \ + filter.c \ main.c \ mixer.c \ presenter.c \ diff --git a/dlls/evr/evr.c b/dlls/evr/filter.c similarity index 100% rename from dlls/evr/evr.c rename to dlls/evr/filter.c
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- MAINTAINERS | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS index ea27dc41af3..7fe9f599b52 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -103,6 +103,8 @@ M: Zebediah Figura z.figura12@gmail.com P: Andrew Eikum aeikum@codeweavers.com F: dlls/amstream/ F: dlls/devenum/ +F: dlls/evr/filter.c +F: dlls/evr/tests/filter.c F: dlls/mciqtz32/ F: dlls/qasf/ F: dlls/qcap/ @@ -325,6 +327,10 @@ F: dlls/wmiutils/
Windows Media Foundation M: Nikolay Sivov nsivov@codeweavers.com +F: dlls/evr/mixer.c +F: dlls/evr/presenter.c +F: dlls/evr/sample.c +F: dlls/evr/tests/evr.c F: dlls/mf/ F: dlls/mferror/ F: dlls/mfmediaengine/
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/evr/tests/filter.c | 104 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+)
diff --git a/dlls/evr/tests/filter.c b/dlls/evr/tests/filter.c index 4f52dd5c238..f185db40ee7 100644 --- a/dlls/evr/tests/filter.c +++ b/dlls/evr/tests/filter.c @@ -37,6 +37,15 @@ static IBaseFilter *create_evr(void) return filter; }
+static IFilterGraph2 *create_graph(void) +{ + IFilterGraph2 *ret; + HRESULT hr; + hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); + return ret; +} + static ULONG get_refcount(void *iface) { IUnknown *unknown = iface; @@ -376,6 +385,100 @@ static void test_pin_info(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG expected_code, LONG_PTR expected1, LONG_PTR expected2) +{ + LONG_PTR param1, param2; + unsigned int ret = 0; + HRESULT hr; + LONG code; + + while ((hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, timeout)) == S_OK) + { + if (code == expected_code) + { + ok(param1 == expected1, "Got param1 %#lx.\n", param1); + ok(param2 == expected2, "Got param2 %#lx.\n", param2); + ret++; + } + IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); + timeout = 0; + } + ok(hr == E_ABORT, "Got hr %#x.\n", hr); + + return ret; +} + +static unsigned int check_ec_complete(IMediaEvent *eventsrc, DWORD timeout) +{ + return check_event_code(eventsrc, timeout, EC_COMPLETE, S_OK, 0); +} + +static void test_unconnected_eos(void) +{ + IBaseFilter *filter = create_evr(); + IFilterGraph2 *graph = create_graph(); + IMediaControl *control; + IMediaEvent *eventsrc; + unsigned int ret; + HRESULT hr; + ULONG ref; + + hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + IMediaControl_Release(control); + IMediaEvent_Release(eventsrc); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(filter) { CoInitialize(NULL); @@ -385,6 +488,7 @@ START_TEST(filter) test_enum_pins(); test_find_pin(); test_pin_info(); + test_unconnected_eos();
CoUninitialize(); }
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=100862
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
evr: filter.c:159: Test failed: Unexpected hr 0x80070057. filter.c:439: Test failed: Got hr 0x80070057. filter.c:445: Test failed: Got hr 0x80070057. filter.c:448: Test failed: Got 0 EC_COMPLETE events. filter.c:451: Test failed: Got hr 0x80070057. filter.c:457: Test failed: Got hr 0x80070057. filter.c:460: Test failed: Got 0 EC_COMPLETE events. filter.c:469: Test failed: Got hr 0x80070057. filter.c:472: Test failed: Got 0 EC_COMPLETE events.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/quartz/tests/dsoundrender.c | 76 +++++++++++++++++++++++++ dlls/quartz/tests/videorenderer.c | 67 ++++++++++++++++++++++ dlls/quartz/tests/vmr7.c | 95 +++++++++++++++++++++++++++++++ dlls/quartz/tests/vmr9.c | 67 ++++++++++++++++++++++ 4 files changed, 305 insertions(+)
diff --git a/dlls/quartz/tests/dsoundrender.c b/dlls/quartz/tests/dsoundrender.c index fdc23d2b48c..9107828b9df 100644 --- a/dlls/quartz/tests/dsoundrender.c +++ b/dlls/quartz/tests/dsoundrender.c @@ -40,6 +40,15 @@ static IBaseFilter *create_dsound_render(void) return filter; }
+static IFilterGraph2 *create_graph(void) +{ + IFilterGraph2 *ret; + HRESULT hr; + hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); + return ret; +} + 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)) @@ -1314,6 +1323,72 @@ static void test_media_types(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static void test_unconnected_eos(void) +{ + IBaseFilter *filter = create_dsound_render(); + IFilterGraph2 *graph = create_graph(); + IMediaControl *control; + IMediaEvent *eventsrc; + unsigned int ret; + HRESULT hr; + ULONG ref; + + hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + IMediaControl_Release(control); + IMediaEvent_Release(eventsrc); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(dsoundrender) { IBaseFilter *filter; @@ -1343,6 +1418,7 @@ START_TEST(dsoundrender) test_unconnected_filter_state(); test_media_types(); test_connect_pin(); + test_unconnected_eos();
CoUninitialize(); } diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c index 8d0003cf12e..0ce24884200 100644 --- a/dlls/quartz/tests/videorenderer.c +++ b/dlls/quartz/tests/videorenderer.c @@ -2865,6 +2865,72 @@ static void test_basic_video(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static void test_unconnected_eos(void) +{ + IBaseFilter *filter = create_video_renderer(); + IFilterGraph2 *graph = create_graph(); + IMediaControl *control; + IMediaEvent *eventsrc; + unsigned int ret; + HRESULT hr; + ULONG ref; + + hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + IMediaControl_Release(control); + IMediaEvent_Release(eventsrc); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(videorenderer) { CoInitialize(NULL); @@ -2881,6 +2947,7 @@ START_TEST(videorenderer) test_overlay(); test_video_window(); test_basic_video(); + test_unconnected_eos();
CoUninitialize(); } diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index 688770a8501..1214d5dcbb7 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -1236,6 +1236,34 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IMediaControl *control ok(hr == S_OK, "Got hr %#x.\n", hr); }
+static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG expected_code, LONG_PTR expected1, LONG_PTR expected2) +{ + LONG_PTR param1, param2; + unsigned int ret = 0; + HRESULT hr; + LONG code; + + while ((hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, timeout)) == S_OK) + { + if (code == expected_code) + { + ok(param1 == expected1, "Got param1 %#lx.\n", param1); + ok(param2 == expected2, "Got param2 %#lx.\n", param2); + ret++; + } + IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); + timeout = 0; + } + ok(hr == E_ABORT, "Got hr %#x.\n", hr); + + return ret; +} + +static unsigned int check_ec_complete(IMediaEvent *eventsrc, DWORD timeout) +{ + return check_event_code(eventsrc, timeout, EC_COMPLETE, S_OK, 0); +} + static void test_current_image(IBaseFilter *filter, IMemInputPin *input, IMediaControl *control, const BITMAPINFOHEADER *req_bih) { @@ -3041,6 +3069,72 @@ out: DestroyWindow(window); }
+static void test_unconnected_eos(void) +{ + IFilterGraph2 *graph = create_graph(); + IBaseFilter *filter = create_vmr7(0); + IMediaControl *control; + IMediaEvent *eventsrc; + unsigned int ret; + HRESULT hr; + ULONG ref; + + hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + IMediaControl_Release(control); + IMediaEvent_Release(eventsrc); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(vmr7) { CoInitialize(NULL); @@ -3059,6 +3153,7 @@ START_TEST(vmr7) test_video_window(); test_basic_video(); test_windowless_size(); + test_unconnected_eos();
CoUninitialize(); } diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 154b6a6b99e..618669595cb 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -4170,6 +4170,72 @@ static void test_mixing_prefs(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static void test_unconnected_eos(void) +{ + IFilterGraph2 *graph = create_graph(); + IBaseFilter *filter = create_vmr9(0); + IMediaControl *control; + IMediaEvent *eventsrc; + unsigned int ret; + HRESULT hr; + ULONG ref; + + hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + IMediaControl_Release(control); + IMediaEvent_Release(eventsrc); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(vmr9) { IBaseFilter *filter; @@ -4205,6 +4271,7 @@ START_TEST(vmr9) test_basic_video(); test_windowless_size(); test_mixing_prefs(); + test_unconnected_eos();
CoUninitialize(); }
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=100863
Your paranoid android.
=== w10pro64_ar (64 bit report) ===
quartz: videorenderer.c:1096: Test failed: Wait failed. videorenderer.c:1098: Test failed: Got hr 0x103. videorenderer.c:1154: Test failed: Got hr 0x80004005.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/qedit/tests/nullrenderer.c | 104 ++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+)
diff --git a/dlls/qedit/tests/nullrenderer.c b/dlls/qedit/tests/nullrenderer.c index 1800f4dad4c..b4003f43cf4 100644 --- a/dlls/qedit/tests/nullrenderer.c +++ b/dlls/qedit/tests/nullrenderer.c @@ -32,6 +32,15 @@ static IBaseFilter *create_null_renderer(void) return filter; }
+static IFilterGraph2 *create_graph(void) +{ + IFilterGraph2 *ret; + HRESULT hr; + hr = CoCreateInstance(&CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, &IID_IFilterGraph2, (void **)&ret); + ok(hr == S_OK, "Failed to create FilterGraph: %#x\n", hr); + return ret; +} + static ULONG get_refcount(void *iface) { IUnknown *unknown = iface; @@ -791,6 +800,34 @@ static void test_flushing(IPin *pin, IMemInputPin *input, IFilterGraph2 *graph) IMediaControl_Release(control); }
+static unsigned int check_event_code(IMediaEvent *eventsrc, DWORD timeout, LONG expected_code, LONG_PTR expected1, LONG_PTR expected2) +{ + LONG_PTR param1, param2; + unsigned int ret = 0; + HRESULT hr; + LONG code; + + while ((hr = IMediaEvent_GetEvent(eventsrc, &code, ¶m1, ¶m2, timeout)) == S_OK) + { + if (code == expected_code) + { + ok(param1 == expected1, "Got param1 %#lx.\n", param1); + ok(param2 == expected2, "Got param2 %#lx.\n", param2); + ret++; + } + IMediaEvent_FreeEventParams(eventsrc, code, param1, param2); + timeout = 0; + } + ok(hr == E_ABORT, "Got hr %#x.\n", hr); + + return ret; +} + +static unsigned int check_ec_complete(IMediaEvent *eventsrc, DWORD timeout) +{ + return check_event_code(eventsrc, timeout, EC_COMPLETE, S_OK, 0); +} + static void test_connect_pin(void) { static const AM_MEDIA_TYPE req_mt = @@ -900,6 +937,72 @@ static void test_connect_pin(void) ok(!ref, "Got outstanding refcount %d.\n", ref); }
+static void test_unconnected_eos(void) +{ + IBaseFilter *filter = create_null_renderer(); + IFilterGraph2 *graph = create_graph(); + IMediaControl *control; + IMediaEvent *eventsrc; + unsigned int ret; + HRESULT hr; + ULONG ref; + + hr = IFilterGraph2_AddFilter(graph, filter, L"renderer"); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaControl, (void **)&control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + hr = IFilterGraph2_QueryInterface(graph, &IID_IMediaEvent, (void **)&eventsrc); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Pause(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Stop(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + ok(!ret, "Got %u EC_COMPLETE events.\n", ret); + + hr = IMediaControl_Run(control); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + ret = check_ec_complete(eventsrc, 0); + todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + + IMediaControl_Release(control); + IMediaEvent_Release(eventsrc); + ref = IFilterGraph2_Release(graph); + ok(!ref, "Got outstanding refcount %d.\n", ref); + ref = IBaseFilter_Release(filter); + ok(!ref, "Got outstanding refcount %d.\n", ref); +} + START_TEST(nullrenderer) { IBaseFilter *filter; @@ -924,6 +1027,7 @@ START_TEST(nullrenderer) test_media_types(); test_enum_media_types(); test_connect_pin(); + test_unconnected_eos();
CoUninitialize(); }
From: Andrew Eikum aeikum@codeweavers.com
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- Resent with tests split and reordered; also added tests for dsoundrender and vmr7, and ported the fix to dsoundrender.
dlls/evr/tests/filter.c | 6 +++--- dlls/qedit/tests/nullrenderer.c | 6 +++--- dlls/quartz/tests/videorenderer.c | 6 +++--- dlls/quartz/tests/vmr7.c | 6 +++--- dlls/quartz/tests/vmr9.c | 6 +++--- dlls/strmbase/renderer.c | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-)
diff --git a/dlls/evr/tests/filter.c b/dlls/evr/tests/filter.c index f185db40ee7..09eb303617b 100644 --- a/dlls/evr/tests/filter.c +++ b/dlls/evr/tests/filter.c @@ -445,7 +445,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Pause(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -457,7 +457,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Stop(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -469,7 +469,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
IMediaControl_Release(control); IMediaEvent_Release(eventsrc); diff --git a/dlls/qedit/tests/nullrenderer.c b/dlls/qedit/tests/nullrenderer.c index b4003f43cf4..cfbf1d37c2f 100644 --- a/dlls/qedit/tests/nullrenderer.c +++ b/dlls/qedit/tests/nullrenderer.c @@ -969,7 +969,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Pause(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -981,7 +981,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Stop(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -993,7 +993,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
IMediaControl_Release(control); IMediaEvent_Release(eventsrc); diff --git a/dlls/quartz/tests/videorenderer.c b/dlls/quartz/tests/videorenderer.c index 0ce24884200..5625971426b 100644 --- a/dlls/quartz/tests/videorenderer.c +++ b/dlls/quartz/tests/videorenderer.c @@ -2897,7 +2897,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Pause(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -2909,7 +2909,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Stop(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -2921,7 +2921,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
IMediaControl_Release(control); IMediaEvent_Release(eventsrc); diff --git a/dlls/quartz/tests/vmr7.c b/dlls/quartz/tests/vmr7.c index 1214d5dcbb7..efc876a845c 100644 --- a/dlls/quartz/tests/vmr7.c +++ b/dlls/quartz/tests/vmr7.c @@ -3101,7 +3101,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Pause(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -3113,7 +3113,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Stop(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -3125,7 +3125,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
IMediaControl_Release(control); IMediaEvent_Release(eventsrc); diff --git a/dlls/quartz/tests/vmr9.c b/dlls/quartz/tests/vmr9.c index 618669595cb..a0ccb4898a9 100644 --- a/dlls/quartz/tests/vmr9.c +++ b/dlls/quartz/tests/vmr9.c @@ -4202,7 +4202,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Pause(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -4214,7 +4214,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Stop(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -4226,7 +4226,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
IMediaControl_Release(control); IMediaEvent_Release(eventsrc); diff --git a/dlls/strmbase/renderer.c b/dlls/strmbase/renderer.c index a879917b169..da257555a19 100644 --- a/dlls/strmbase/renderer.c +++ b/dlls/strmbase/renderer.c @@ -252,7 +252,7 @@ static HRESULT renderer_start_stream(struct strmbase_filter *iface, REFERENCE_TI if (filter->sink.pin.peer && filter->ops->renderer_start_stream) filter->ops->renderer_start_stream(filter);
- if (filter->eos && graph + if ((filter->eos || !filter->sink.pin.peer) && graph && SUCCEEDED(IFilterGraph_QueryInterface(graph, &IID_IMediaEventSink, (void **)&event_sink))) {
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=100865
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
evr: filter.c:159: Test failed: Unexpected hr 0x80070057. filter.c:439: Test failed: Got hr 0x80070057. filter.c:445: Test failed: Got hr 0x80070057. filter.c:448: Test failed: Got 0 EC_COMPLETE events. filter.c:451: Test failed: Got hr 0x80070057. filter.c:457: Test failed: Got hr 0x80070057. filter.c:460: Test failed: Got 0 EC_COMPLETE events. filter.c:469: Test failed: Got hr 0x80070057. filter.c:472: Test failed: Got 0 EC_COMPLETE events.
=== w10pro64_ar (64 bit report) ===
quartz: videorenderer.c:1153: Test failed: Wait failed. videorenderer.c:1154: Test failed: Got hr 0x103.
=== w10pro64_ar (64 bit report) ===
quartz: vmr9.c:1435: Test failed: Wait failed. vmr9.c:1436: Test failed: Got hr 0x103.
Signed-off-by: Zebediah Figura zfigura@codeweavers.com --- dlls/quartz/dsoundrender.c | 2 +- dlls/quartz/tests/dsoundrender.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index 51a66ac5d30..df40d1254ee 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -608,7 +608,7 @@ static HRESULT dsound_render_start_stream(struct strmbase_filter *iface, REFEREN if (filter->sink.pin.peer) IDirectSoundBuffer_Play(filter->dsbuffer, 0, 0, DSBPLAY_LOOPING);
- if (filter->eos && graph + if ((filter->eos || !filter->sink.pin.peer) && graph && SUCCEEDED(IFilterGraph_QueryInterface(graph, &IID_IMediaEventSink, (void **)&event_sink))) { diff --git a/dlls/quartz/tests/dsoundrender.c b/dlls/quartz/tests/dsoundrender.c index 9107828b9df..03e6b8413d5 100644 --- a/dlls/quartz/tests/dsoundrender.c +++ b/dlls/quartz/tests/dsoundrender.c @@ -1355,7 +1355,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Pause(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -1367,7 +1367,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
hr = IMediaControl_Stop(control); ok(hr == S_OK, "Got hr %#x.\n", hr); @@ -1379,7 +1379,7 @@ static void test_unconnected_eos(void) ok(hr == S_OK, "Got hr %#x.\n", hr);
ret = check_ec_complete(eventsrc, 0); - todo_wine ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret); + ok(ret == 1, "Got %u EC_COMPLETE events.\n", ret);
IMediaControl_Release(control); IMediaEvent_Release(eventsrc);
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=100860
Your paranoid android.
=== w7u_2qxl (32 bit report) ===
evr: filter.c:150: Test failed: Unexpected hr 0x80070057.
On 10/27/21 8:08 PM, Zebediah Figura wrote:
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
dlls/evr/tests/Makefile.in | 3 +- dlls/evr/tests/evr.c | 337 +------------------------------- dlls/evr/tests/filter.c | 390 +++++++++++++++++++++++++++++++++++++ 3 files changed, 394 insertions(+), 336 deletions(-) create mode 100644 dlls/evr/tests/filter.c
I don't care that much, but I also don't see a point of splitting it like that. Same for rename in next patch.
On 10/31/21 16:16, Nikolay Sivov wrote:
On 10/27/21 8:08 PM, Zebediah Figura wrote:
Signed-off-by: Zebediah Figura zfigura@codeweavers.com
dlls/evr/tests/Makefile.in | 3 +- dlls/evr/tests/evr.c | 337 +------------------------------- dlls/evr/tests/filter.c | 390 +++++++++++++++++++++++++++++++++++++ 3 files changed, 394 insertions(+), 336 deletions(-) create mode 100644 dlls/evr/tests/filter.c
I don't care that much, but I also don't see a point of splitting it like that. Same for rename in next patch.
I suppose it's a difference in code style (I can't stand mfplat.c...) but I guess I'm willing to leave this one alone.
At the very least it can wait until more tests for the EVR filter become necessary.