2 * MPEG audio decoder filter unit tests
4 * Copyright 2022 Anton Baskanov
5 * Copyright 2018 Zebediah Figura
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include "wine/test.h"
26 static IBaseFilter
*create_mpeg_audio_codec(void)
28 IBaseFilter
*filter
= NULL
;
29 HRESULT hr
= CoCreateInstance(&CLSID_CMpegAudioCodec
, NULL
, CLSCTX_INPROC_SERVER
,
30 &IID_IBaseFilter
, (void **)&filter
);
31 todo_wine
ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
35 static ULONG
get_refcount(void *iface
)
37 IUnknown
*unknown
= iface
;
38 IUnknown_AddRef(unknown
);
39 return IUnknown_Release(unknown
);
42 #define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
43 static void check_interface_(unsigned int line
, void *iface_ptr
, REFIID iid
, BOOL supported
)
45 IUnknown
*iface
= iface_ptr
;
46 HRESULT hr
, expected_hr
;
49 expected_hr
= supported
? S_OK
: E_NOINTERFACE
;
51 hr
= IUnknown_QueryInterface(iface
, iid
, (void **)&unk
);
52 ok_(__FILE__
, line
)(hr
== expected_hr
, "Got hr %#lx, expected %#lx.\n", hr
, expected_hr
);
54 IUnknown_Release(unk
);
57 static void test_interfaces(void)
62 filter
= create_mpeg_audio_codec();
65 skip("Failed to create MPEG audio decoder instance, skipping tests.\n");
69 check_interface(filter
, &IID_IBaseFilter
, TRUE
);
70 check_interface(filter
, &IID_IMediaFilter
, TRUE
);
71 check_interface(filter
, &IID_IPersist
, TRUE
);
72 check_interface(filter
, &IID_IUnknown
, TRUE
);
74 check_interface(filter
, &IID_IAMFilterMiscFlags
, FALSE
);
75 check_interface(filter
, &IID_IBasicAudio
, FALSE
);
76 check_interface(filter
, &IID_IBasicVideo
, FALSE
);
77 check_interface(filter
, &IID_IKsPropertySet
, FALSE
);
78 check_interface(filter
, &IID_IMediaPosition
, FALSE
);
79 check_interface(filter
, &IID_IMediaSeeking
, FALSE
);
80 check_interface(filter
, &IID_IPin
, FALSE
);
81 check_interface(filter
, &IID_IQualityControl
, FALSE
);
82 check_interface(filter
, &IID_IQualProp
, FALSE
);
83 check_interface(filter
, &IID_IReferenceClock
, FALSE
);
84 check_interface(filter
, &IID_IVideoWindow
, FALSE
);
85 check_interface(filter
, &IID_IPersistPropertyBag
, FALSE
);
87 IBaseFilter_FindPin(filter
, L
"In", &pin
);
89 check_interface(pin
, &IID_IMemInputPin
, TRUE
);
90 check_interface(pin
, &IID_IPin
, TRUE
);
91 todo_wine
check_interface(pin
, &IID_IQualityControl
, TRUE
);
92 check_interface(pin
, &IID_IUnknown
, TRUE
);
94 check_interface(pin
, &IID_IMediaPosition
, FALSE
);
95 check_interface(pin
, &IID_IMediaSeeking
, FALSE
);
99 IBaseFilter_FindPin(filter
, L
"Out", &pin
);
101 check_interface(pin
, &IID_IPin
, TRUE
);
102 todo_wine
check_interface(pin
, &IID_IMediaPosition
, TRUE
);
103 todo_wine
check_interface(pin
, &IID_IMediaSeeking
, TRUE
);
104 todo_wine
check_interface(pin
, &IID_IQualityControl
, TRUE
);
105 check_interface(pin
, &IID_IUnknown
, TRUE
);
107 check_interface(pin
, &IID_IAsyncReader
, FALSE
);
111 IBaseFilter_Release(filter
);
114 static const GUID test_iid
= {0x33333333};
115 static LONG outer_ref
= 1;
117 static HRESULT WINAPI
outer_QueryInterface(IUnknown
*iface
, REFIID iid
, void **out
)
119 if (IsEqualGUID(iid
, &IID_IUnknown
)
120 || IsEqualGUID(iid
, &IID_IBaseFilter
)
121 || IsEqualGUID(iid
, &test_iid
))
123 *out
= (IUnknown
*)0xdeadbeef;
126 ok(0, "unexpected call %s\n", wine_dbgstr_guid(iid
));
127 return E_NOINTERFACE
;
130 static ULONG WINAPI
outer_AddRef(IUnknown
*iface
)
132 return InterlockedIncrement(&outer_ref
);
135 static ULONG WINAPI
outer_Release(IUnknown
*iface
)
137 return InterlockedDecrement(&outer_ref
);
140 static const IUnknownVtbl outer_vtbl
=
142 outer_QueryInterface
,
147 static IUnknown test_outer
= {&outer_vtbl
};
149 static void test_aggregation(void)
151 IBaseFilter
*filter
, *filter2
;
152 IUnknown
*unk
, *unk2
;
156 filter
= (IBaseFilter
*)0xdeadbeef;
157 hr
= CoCreateInstance(&CLSID_CMpegAudioCodec
, &test_outer
, CLSCTX_INPROC_SERVER
,
158 &IID_IBaseFilter
, (void **)&filter
);
159 todo_wine
ok(hr
== E_NOINTERFACE
, "Got hr %#lx.\n", hr
);
160 ok(!filter
, "Got interface %p.\n", filter
);
162 hr
= CoCreateInstance(&CLSID_CMpegAudioCodec
, &test_outer
, CLSCTX_INPROC_SERVER
,
163 &IID_IUnknown
, (void **)&unk
);
164 todo_wine
ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
167 skip("Failed to create MPEG audio decoder instance, skipping tests.\n");
170 ok(outer_ref
== 1, "Got unexpected refcount %ld.\n", outer_ref
);
171 ok(unk
!= &test_outer
, "Returned IUnknown should not be outer IUnknown.\n");
172 ref
= get_refcount(unk
);
173 ok(ref
== 1, "Got unexpected refcount %ld.\n", ref
);
175 ref
= IUnknown_AddRef(unk
);
176 ok(ref
== 2, "Got unexpected refcount %ld.\n", ref
);
177 ok(outer_ref
== 1, "Got unexpected refcount %ld.\n", outer_ref
);
179 ref
= IUnknown_Release(unk
);
180 ok(ref
== 1, "Got unexpected refcount %ld.\n", ref
);
181 ok(outer_ref
== 1, "Got unexpected refcount %ld.\n", outer_ref
);
183 hr
= IUnknown_QueryInterface(unk
, &IID_IUnknown
, (void **)&unk2
);
184 ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
185 ok(unk2
== unk
, "Got unexpected IUnknown %p.\n", unk2
);
186 IUnknown_Release(unk2
);
188 hr
= IUnknown_QueryInterface(unk
, &IID_IBaseFilter
, (void **)&filter
);
189 ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
191 hr
= IBaseFilter_QueryInterface(filter
, &IID_IUnknown
, (void **)&unk2
);
192 ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
193 ok(unk2
== (IUnknown
*)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2
);
195 hr
= IBaseFilter_QueryInterface(filter
, &IID_IBaseFilter
, (void **)&filter2
);
196 ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
197 ok(filter2
== (IBaseFilter
*)0xdeadbeef, "Got unexpected IBaseFilter %p.\n", filter2
);
199 hr
= IUnknown_QueryInterface(unk
, &test_iid
, (void **)&unk2
);
200 ok(hr
== E_NOINTERFACE
, "Got hr %#lx.\n", hr
);
201 ok(!unk2
, "Got unexpected IUnknown %p.\n", unk2
);
203 hr
= IBaseFilter_QueryInterface(filter
, &test_iid
, (void **)&unk2
);
204 ok(hr
== S_OK
, "Got hr %#lx.\n", hr
);
205 ok(unk2
== (IUnknown
*)0xdeadbeef, "Got unexpected IUnknown %p.\n", unk2
);
207 IBaseFilter_Release(filter
);
208 ref
= IUnknown_Release(unk
);
209 ok(!ref
, "Got unexpected refcount %ld.\n", ref
);
210 ok(outer_ref
== 1, "Got unexpected refcount %ld.\n", outer_ref
);
213 START_TEST(mpegaudio
)