2 * Unit tests for Direct Show functions
4 * Copyright (C) 2004 Christian Costa
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
25 #include "wine/test.h"
30 static const WCHAR file
[] = {'t','e','s','t','.','a','v','i',0};
32 IGraphBuilder
* pgraph
;
34 static int createfiltergraph(void)
36 return S_OK
== CoCreateInstance(
37 &CLSID_FilterGraph
, NULL
, CLSCTX_INPROC_SERVER
, &IID_IGraphBuilder
, (LPVOID
*)&pgraph
);
40 static void renderfile(void)
44 hr
= IGraphBuilder_RenderFile(pgraph
, file
, NULL
);
45 ok(hr
==S_OK
, "RenderFile returned: %x\n", hr
);
48 static void rungraph(void)
56 hr
= IGraphBuilder_QueryInterface(pgraph
, &IID_IMediaControl
, (LPVOID
*)&pmc
);
57 ok(hr
==S_OK
, "Cannot get IMediaControl interface returned: %x\n", hr
);
59 hr
= IGraphBuilder_QueryInterface(pgraph
, &IID_IMediaFilter
, (LPVOID
*)&pmf
);
60 ok(hr
==S_OK
, "Cannot get IMediaFilter interface returned: %x\n", hr
);
62 IMediaControl_Stop(pmc
);
64 IMediaFilter_SetSyncSource(pmf
, NULL
);
66 IMediaFilter_Release(pmf
);
68 hr
= IMediaControl_Run(pmc
);
69 ok(hr
==S_FALSE
, "Cannot run the graph returned: %x\n", hr
);
73 trace("run -> stop\n");
74 hr
= IMediaControl_Stop(pmc
);
75 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot stop the graph returned: %x\n", hr
);
77 IGraphBuilder_SetDefaultSyncSource(pgraph
);
80 trace("stop -> pause\n");
81 hr
= IMediaControl_Pause(pmc
);
82 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot pause the graph returned: %x\n", hr
);
85 trace("pause -> run\n");
86 hr
= IMediaControl_Run(pmc
);
87 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot start the graph returned: %x\n", hr
);
90 trace("run -> pause\n");
91 hr
= IMediaControl_Pause(pmc
);
92 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot pause the graph returned: %x\n", hr
);
95 trace("pause -> stop\n");
96 hr
= IMediaControl_Stop(pmc
);
97 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot stop the graph returned: %x\n", hr
);
100 trace("pause -> run\n");
101 hr
= IMediaControl_Run(pmc
);
102 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot start the graph returned: %x\n", hr
);
104 trace("run -> stop\n");
105 hr
= IMediaControl_Stop(pmc
);
106 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot stop the graph returned: %x\n", hr
);
108 trace("stop -> run\n");
109 hr
= IMediaControl_Run(pmc
);
110 ok(hr
==S_OK
|| hr
== S_FALSE
, "Cannot start the graph returned: %x\n", hr
);
112 hr
= IGraphBuilder_QueryInterface(pgraph
, &IID_IMediaEvent
, (LPVOID
*)&pme
);
113 ok(hr
==S_OK
, "Cannot get IMediaEvent interface returned: %x\n", hr
);
115 hr
= IMediaEvent_GetEventHandle(pme
, (OAEVENT
*)&hEvent
);
116 ok(hr
==S_OK
, "Cannot get event handle returned: %x\n", hr
);
118 /* WaitForSingleObject(hEvent, INFINITE); */
121 hr
= IMediaEvent_Release(pme
);
122 ok(hr
==2, "Releasing mediaevent returned: %x\n", hr
);
124 hr
= IMediaControl_Stop(pmc
);
125 ok(hr
==S_OK
, "Cannot stop the graph returned: %x\n", hr
);
127 hr
= IMediaControl_Release(pmc
);
128 ok(hr
==1, "Releasing mediacontrol returned: %x\n", hr
);
131 static void releasefiltergraph(void)
135 hr
= IGraphBuilder_Release(pgraph
);
136 ok(hr
==0, "Releasing filtergraph returned: %x\n", hr
);
139 static void test_render_run(void)
143 if (!createfiltergraph())
146 h
= CreateFileW(file
, 0, 0, NULL
, OPEN_EXISTING
, 0, NULL
);
147 if (h
!= INVALID_HANDLE_VALUE
) {
153 releasefiltergraph();
156 static void test_graph_builder(void)
159 IBaseFilter
*pF
= NULL
;
160 IBaseFilter
*pF2
= NULL
;
162 IEnumPins
*pEnum
= NULL
;
164 static const WCHAR testFilterW
[] = {'t','e','s','t','F','i','l','t','e','r',0};
165 static const WCHAR fooBarW
[] = {'f','o','o','B','a','r',0};
167 if (!createfiltergraph())
170 /* create video filter */
171 hr
= CoCreateInstance(&CLSID_VideoRenderer
, NULL
, CLSCTX_INPROC_SERVER
,
172 &IID_IBaseFilter
, (LPVOID
*)&pF
);
173 ok(hr
== S_OK
, "CoCreateInstance failed with %x\n", hr
);
174 ok(pF
!= NULL
, "pF is NULL\n");
176 /* add the two filters to the graph */
177 hr
= IGraphBuilder_AddFilter(pgraph
, pF
, testFilterW
);
178 ok(hr
== S_OK
, "failed to add pF to the graph: %x\n", hr
);
181 hr
= IBaseFilter_EnumPins(pF
, &pEnum
);
182 ok(hr
== S_OK
, "IBaseFilter_EnumPins failed for pF: %x\n", hr
);
183 ok(pEnum
!= NULL
, "pEnum is NULL\n");
184 hr
= IEnumPins_Next(pEnum
, 1, &pIn
, NULL
);
185 ok(hr
== S_OK
, "IEnumPins_Next failed for pF: %x\n", hr
);
186 ok(pIn
!= NULL
, "pIn is NULL\n");
187 hr
= IPin_QueryDirection(pIn
, &dir
);
188 ok(hr
== S_OK
, "IPin_QueryDirection failed: %x\n", hr
);
189 ok(dir
== PINDIR_INPUT
, "pin has wrong direction\n");
191 hr
= IGraphBuilder_FindFilterByName(pgraph
, fooBarW
, &pF2
);
192 ok(hr
== VFW_E_NOT_FOUND
, "IGraphBuilder_FindFilterByName returned %x\n", hr
);
193 ok(pF2
== NULL
, "IGraphBuilder_FindFilterByName returned %p\n", pF2
);
194 hr
= IGraphBuilder_FindFilterByName(pgraph
, testFilterW
, &pF2
);
195 ok(hr
== S_OK
, "IGraphBuilder_FindFilterByName returned %x\n", hr
);
196 ok(pF2
!= NULL
, "IGraphBuilder_FindFilterByName returned NULL\n");
197 hr
= IGraphBuilder_FindFilterByName(pgraph
, testFilterW
, NULL
);
198 ok(hr
== E_POINTER
, "IGraphBuilder_FindFilterByName returned %x\n", hr
);
199 releasefiltergraph();
202 static void test_graph_builder_addfilter(void)
205 IBaseFilter
*pF
= NULL
;
206 static const WCHAR testFilterW
[] = {'t','e','s','t','F','i','l','t','e','r',0};
208 if (!createfiltergraph())
211 hr
= IGraphBuilder_AddFilter(pgraph
, NULL
, testFilterW
);
212 ok(hr
== E_POINTER
, "IGraphBuilder_AddFilter returned: %x\n", hr
);
214 /* create video filter */
215 hr
= CoCreateInstance(&CLSID_VideoRenderer
, NULL
, CLSCTX_INPROC_SERVER
,
216 &IID_IBaseFilter
, (LPVOID
*)&pF
);
217 ok(hr
== S_OK
, "CoCreateInstance failed with %x\n", hr
);
218 ok(pF
!= NULL
, "pF is NULL\n");
220 skip("failed to created filter, skipping\n");
224 hr
= IGraphBuilder_AddFilter(pgraph
, pF
, NULL
);
225 ok(hr
== S_OK
, "IGraphBuilder_AddFilter returned: %x\n", hr
);
226 IMediaFilter_Release(pF
);
229 static void test_mediacontrol(void)
232 LONGLONG pos
= 0xdeadbeef;
233 IMediaSeeking
*seeking
= NULL
;
234 IMediaFilter
*filter
= NULL
;
236 IFilterGraph2_SetDefaultSyncSource(pgraph
);
237 hr
= IFilterGraph2_QueryInterface(pgraph
, &IID_IMediaSeeking
, (void**) &seeking
);
238 ok(hr
== S_OK
, "QueryInterface IMediaControl failed: %08x\n", hr
);
242 hr
= IFilterGraph2_QueryInterface(pgraph
, &IID_IMediaFilter
, (void**) &filter
);
243 ok(hr
== S_OK
, "QueryInterface IMediaFilter failed: %08x\n", hr
);
246 IUnknown_Release(seeking
);
250 hr
= IMediaSeeking_GetCurrentPosition(seeking
, &pos
);
251 ok(hr
== S_OK
, "GetCurrentPosition failed: %08x\n", hr
);
252 ok(pos
== 0, "Position != 0 (%x%08x)\n", (DWORD
)(pos
>> 32), (DWORD
)pos
);
254 IMediaFilter_SetSyncSource(filter
, NULL
);
256 hr
= IMediaSeeking_GetCurrentPosition(seeking
, &pos
);
257 ok(hr
== S_OK
, "GetCurrentPosition failed: %08x\n", hr
);
258 ok(pos
== 0, "Position != 0 (%x%08x)\n", (DWORD
)(pos
>> 32), (DWORD
)pos
);
260 IUnknown_Release(seeking
);
261 IUnknown_Release(filter
);
262 releasefiltergraph();
265 static void test_filter_graph2(void)
268 IFilterGraph2
*pF
= NULL
;
270 hr
= CoCreateInstance(&CLSID_FilterGraph
, NULL
, CLSCTX_INPROC_SERVER
,
271 &IID_IFilterGraph2
, (LPVOID
*)&pF
);
272 ok(hr
== S_OK
, "CoCreateInstance failed with %x\n", hr
);
273 ok(pF
!= NULL
, "pF is NULL\n");
275 hr
= IFilterGraph2_Release(pF
);
276 ok(hr
== 0, "IFilterGraph2_Release returned: %x\n", hr
);
279 START_TEST(filtergraph
)
283 test_graph_builder();
284 test_graph_builder_addfilter();
286 test_filter_graph2();