2 * Enhanced Video Renderer filter unit tests
4 * Copyright 2018 Zebediah Figura
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 #include "wine/test.h"
28 static IBaseFilter
*create_evr(void)
30 IBaseFilter
*filter
= NULL
;
31 HRESULT hr
= CoCreateInstance(&CLSID_EnhancedVideoRenderer
, NULL
, CLSCTX_INPROC_SERVER
,
32 &IID_IBaseFilter
, (void **)&filter
);
33 ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
37 static ULONG
get_refcount(void *iface
)
39 IUnknown
*unknown
= iface
;
40 IUnknown_AddRef(unknown
);
41 return IUnknown_Release(unknown
);
44 static const GUID test_iid
= {0x33333333};
45 static LONG outer_ref
= 1;
47 static HRESULT WINAPI
outer_QueryInterface(IUnknown
*iface
, REFIID iid
, void **out
)
49 if (IsEqualGUID(iid
, &IID_IUnknown
)
50 || IsEqualGUID(iid
, &IID_IBaseFilter
)
51 || IsEqualGUID(iid
, &test_iid
))
53 *out
= (IUnknown
*)0xdeadbeef;
56 ok(0, "unexpected call %s\n", wine_dbgstr_guid(iid
));
60 static ULONG WINAPI
outer_AddRef(IUnknown
*iface
)
62 return InterlockedIncrement(&outer_ref
);
65 static ULONG WINAPI
outer_Release(IUnknown
*iface
)
67 return InterlockedDecrement(&outer_ref
);
70 static const IUnknownVtbl outer_vtbl
=
77 static IUnknown test_outer
= {&outer_vtbl
};
79 static void test_aggregation(void)
81 IBaseFilter
*filter
, *filter2
;
86 filter
= (IBaseFilter
*)0xdeadbeef;
87 hr
= CoCreateInstance(&CLSID_EnhancedVideoRenderer
, &test_outer
, CLSCTX_INPROC_SERVER
,
88 &IID_IBaseFilter
, (void **)&filter
);
89 ok(hr
== E_NOINTERFACE
, "Got hr %#x.\n", hr
);
90 ok(!filter
, "Got interface %p.\n", filter
);
92 hr
= CoCreateInstance(&CLSID_EnhancedVideoRenderer
, &test_outer
, CLSCTX_INPROC_SERVER
,
93 &IID_IUnknown
, (void **)&unk
);
94 todo_wine
ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
95 if (FAILED(hr
)) return;
96 ok(outer_ref
== 1, "Got unexpected refcount %d.\n", outer_ref
);
97 ok(unk
!= &test_outer
, "Returned IUnknown should not be outer IUnknown.\n");
98 ref
= get_refcount(unk
);
99 ok(ref
== 1, "Got unexpected refcount %d.\n", ref
);
101 ref
= IUnknown_AddRef(unk
);
102 ok(ref
== 2, "Got unexpected refcount %d.\n", ref
);
103 ok(outer_ref
== 1, "Got unexpected refcount %d.\n", outer_ref
);
105 ref
= IUnknown_Release(unk
);
106 ok(ref
== 1, "Got unexpected refcount %d.\n", ref
);
107 ok(outer_ref
== 1, "Got unexpected refcount %d.\n", outer_ref
);
109 hr
= IUnknown_QueryInterface(unk
, &IID_IUnknown
, (void **)&unk2
);
110 ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
111 ok(unk2
== unk
, "Got unexpected IUnknown %p.\n", unk2
);
112 IUnknown_Release(unk2
);
114 hr
= IUnknown_QueryInterface(unk
, &IID_IBaseFilter
, (void **)&filter
);
115 ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
117 hr
= IBaseFilter_QueryInterface(filter
, &IID_IUnknown
, (void **)&unk2
);
118 ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
119 ok(unk2
== (IUnknown
*)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2
);
121 hr
= IBaseFilter_QueryInterface(filter
, &IID_IBaseFilter
, (void **)&filter2
);
122 ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
123 ok(filter2
== (IBaseFilter
*)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2
);
125 hr
= IUnknown_QueryInterface(unk
, &test_iid
, (void **)&unk2
);
126 ok(hr
== E_NOINTERFACE
, "Got hr %#x.\n", hr
);
127 ok(!unk2
, "Got unexpected IUnknown %p.\n", unk2
);
129 hr
= IBaseFilter_QueryInterface(filter
, &test_iid
, (void **)&unk2
);
130 ok(hr
== S_OK
, "Got hr %#x.\n", hr
);
131 ok(unk2
== (IUnknown
*)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2
);
133 IBaseFilter_Release(filter
);
134 ref
= IUnknown_Release(unk
);
135 ok(!ref
, "Got unexpected refcount %d.\n", ref
);
136 ok(outer_ref
== 1, "Got unexpected refcount %d.\n", outer_ref
);
139 #define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
140 static void check_interface_(unsigned int line
, void *iface_ptr
, REFIID iid
, BOOL supported
)
142 IUnknown
*iface
= iface_ptr
;
143 HRESULT hr
, expected_hr
;
146 expected_hr
= supported
? S_OK
: E_NOINTERFACE
;
148 hr
= IUnknown_QueryInterface(iface
, iid
, (void **)&unk
);
149 ok_(__FILE__
, line
)(hr
== expected_hr
, "Got hr %#x, expected %#x.\n", hr
, expected_hr
);
151 IUnknown_Release(unk
);
154 static void test_interfaces(void)
156 IBaseFilter
*filter
= create_evr();
159 todo_wine
check_interface(filter
, &IID_IAMFilterMiscFlags
, TRUE
);
160 check_interface(filter
, &IID_IBaseFilter
, TRUE
);
161 check_interface(filter
, &IID_IMediaFilter
, TRUE
);
162 todo_wine
check_interface(filter
, &IID_IMediaPosition
, TRUE
);
163 todo_wine
check_interface(filter
, &IID_IMediaSeeking
, TRUE
);
164 check_interface(filter
, &IID_IPersist
, TRUE
);
165 check_interface(filter
, &IID_IUnknown
, TRUE
);
167 check_interface(filter
, &IID_IBasicAudio
, FALSE
);
168 check_interface(filter
, &IID_IBasicVideo
, FALSE
);
169 check_interface(filter
, &IID_IDirectXVideoMemoryConfiguration
, FALSE
);
170 check_interface(filter
, &IID_IMemInputPin
, FALSE
);
171 check_interface(filter
, &IID_IPersistPropertyBag
, FALSE
);
172 check_interface(filter
, &IID_IPin
, FALSE
);
173 check_interface(filter
, &IID_IReferenceClock
, FALSE
);
174 check_interface(filter
, &IID_IVideoWindow
, FALSE
);
176 ref
= IBaseFilter_Release(filter
);
177 ok(!ref
, "Got unexpected refcount %d.\n", ref
);