quartz: Make dwSamplesProcessed a longlong.
[wine] / dlls / qedit / tests / mediadet.c
1 /*
2  * Unit tests for Media Detector
3  *
4  * Copyright (C) 2008 Google (Lei Zhang, Dan Hipschman)
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include <assert.h>
22
23 #define COBJMACROS
24
25 #include "ole2.h"
26 #include "vfwmsgs.h"
27 #include "uuids.h"
28 #include "wine/test.h"
29 #include "qedit.h"
30 #include "rc.h"
31
32 static WCHAR test_avi_filename[MAX_PATH];
33 static WCHAR test_sound_avi_filename[MAX_PATH];
34
35 static BOOL unpack_avi_file(int id, WCHAR name[MAX_PATH])
36 {
37     static WCHAR temp_path[MAX_PATH];
38     static WCHAR prefix[] = {'D','E','S',0};
39     static WCHAR avi[] = {'a','v','i',0};
40     HRSRC res;
41     HGLOBAL data;
42     char *mem;
43     DWORD size, written;
44     HANDLE fh;
45
46     res = FindResourceW(NULL, (LPWSTR) id, (LPWSTR) AVI_RES_TYPE);
47     if (!res)
48         return FALSE;
49
50     data = LoadResource(NULL, res);
51     if (!data)
52         return FALSE;
53
54     mem = LockResource(data);
55     if (!mem)
56         return FALSE;
57
58     size = SizeofResource(NULL, res);
59     if (size == 0)
60         return FALSE;
61
62     if (!GetTempPathW(MAX_PATH, temp_path))
63         return FALSE;
64
65     /* We might end up relying on the extension here, so .TMP is no good.  */
66     if (!GetTempFileNameW(temp_path, prefix, 0, name))
67         return FALSE;
68
69     DeleteFileW(name);
70     lstrcpyW(name + lstrlenW(name) - 3, avi);
71
72     fh = CreateFileW(name, GENERIC_WRITE, 0, NULL, CREATE_NEW,
73                      FILE_ATTRIBUTE_NORMAL, NULL);
74     if (fh == INVALID_HANDLE_VALUE)
75         return FALSE;
76
77     if (!WriteFile(fh, mem, size, &written, NULL) || written != size)
78         return FALSE;
79
80     CloseHandle(fh);
81
82     return TRUE;
83 }
84
85 static BOOL init_tests(void)
86 {
87     return unpack_avi_file(TEST_AVI_RES, test_avi_filename)
88         && unpack_avi_file(TEST_SOUND_AVI_RES, test_sound_avi_filename);
89 }
90
91 static void test_mediadet(void)
92 {
93     HRESULT hr;
94     IMediaDet *pM = NULL;
95     BSTR filename = NULL;
96     long nstrms = 0;
97     long strm;
98     AM_MEDIA_TYPE mt;
99     double fps;
100     int flags;
101     int i;
102
103     /* test.avi has one video stream.  */
104     hr = CoCreateInstance(&CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER,
105             &IID_IMediaDet, (LPVOID*)&pM);
106     ok(hr == S_OK, "CoCreateInstance failed with %x\n", hr);
107     ok(pM != NULL, "pM is NULL\n");
108
109     filename = NULL;
110     hr = IMediaDet_get_Filename(pM, &filename);
111     /* Despite what MSDN claims, this returns S_OK.  */
112     ok(hr == S_OK, "IMediaDet_get_Filename\n");
113     ok(filename == NULL, "IMediaDet_get_Filename\n");
114
115     filename = (BSTR) -1;
116     hr = IMediaDet_get_Filename(pM, &filename);
117     /* Despite what MSDN claims, this returns S_OK.  */
118     ok(hr == S_OK, "IMediaDet_get_Filename\n");
119     ok(filename == NULL, "IMediaDet_get_Filename\n");
120
121     nstrms = -1;
122     hr = IMediaDet_get_OutputStreams(pM, &nstrms);
123     ok(hr == E_INVALIDARG, "IMediaDet_get_OutputStreams\n");
124     ok(nstrms == -1, "IMediaDet_get_OutputStreams\n");
125
126     strm = -1;
127     /* The stream defaults to 0, even without a file!  */
128     hr = IMediaDet_get_CurrentStream(pM, &strm);
129     ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
130     ok(strm == 0, "IMediaDet_get_CurrentStream\n");
131
132     hr = IMediaDet_get_CurrentStream(pM, NULL);
133     ok(hr == E_POINTER, "IMediaDet_get_CurrentStream\n");
134
135     /* But put_CurrentStream doesn't.  */
136     hr = IMediaDet_put_CurrentStream(pM, 0);
137     ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
138
139     hr = IMediaDet_put_CurrentStream(pM, -1);
140     ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
141
142     hr = IMediaDet_get_StreamMediaType(pM, &mt);
143     ok(hr == E_INVALIDARG, "IMediaDet_get_StreamMediaType\n");
144
145     hr = IMediaDet_get_StreamMediaType(pM, NULL);
146     ok(hr == E_POINTER, "IMediaDet_get_StreamMediaType\n");
147
148     filename = SysAllocString(test_avi_filename);
149     hr = IMediaDet_put_Filename(pM, filename);
150     ok(hr == S_OK, "IMediaDet_put_Filename -> %x\n", hr);
151     SysFreeString(filename);
152
153     strm = -1;
154     /* The stream defaults to 0.  */
155     hr = IMediaDet_get_CurrentStream(pM, &strm);
156     ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
157     ok(strm == 0, "IMediaDet_get_CurrentStream\n");
158
159     ZeroMemory(&mt, sizeof mt);
160     hr = IMediaDet_get_StreamMediaType(pM, &mt);
161     ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
162     CoTaskMemFree(mt.pbFormat);
163
164     /* Even before get_OutputStreams.  */
165     hr = IMediaDet_put_CurrentStream(pM, 1);
166     ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
167
168     hr = IMediaDet_get_OutputStreams(pM, &nstrms);
169     ok(hr == S_OK, "IMediaDet_get_OutputStreams\n");
170     ok(nstrms == 1, "IMediaDet_get_OutputStreams\n");
171
172     filename = NULL;
173     hr = IMediaDet_get_Filename(pM, &filename);
174     ok(hr == S_OK, "IMediaDet_get_Filename\n");
175     ok(lstrcmpW(filename, test_avi_filename) == 0,
176        "IMediaDet_get_Filename\n");
177     SysFreeString(filename);
178
179     hr = IMediaDet_get_Filename(pM, NULL);
180     ok(hr == E_POINTER, "IMediaDet_get_Filename\n");
181
182     strm = -1;
183     hr = IMediaDet_get_CurrentStream(pM, &strm);
184     ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
185     ok(strm == 0, "IMediaDet_get_CurrentStream\n");
186
187     hr = IMediaDet_get_CurrentStream(pM, NULL);
188     ok(hr == E_POINTER, "IMediaDet_get_CurrentStream\n");
189
190     hr = IMediaDet_put_CurrentStream(pM, -1);
191     ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
192
193     hr = IMediaDet_put_CurrentStream(pM, 1);
194     ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
195
196     /* Try again.  */
197     strm = -1;
198     hr = IMediaDet_get_CurrentStream(pM, &strm);
199     ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
200     ok(strm == 0, "IMediaDet_get_CurrentStream\n");
201
202     hr = IMediaDet_put_CurrentStream(pM, 0);
203     ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
204
205     strm = -1;
206     hr = IMediaDet_get_CurrentStream(pM, &strm);
207     ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
208     ok(strm == 0, "IMediaDet_get_CurrentStream\n");
209
210     ZeroMemory(&mt, sizeof mt);
211     hr = IMediaDet_get_StreamMediaType(pM, &mt);
212     ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
213     ok(IsEqualGUID(&mt.majortype, &MEDIATYPE_Video),
214                  "IMediaDet_get_StreamMediaType\n");
215     CoTaskMemFree(mt.pbFormat);
216
217     hr = IMediaDet_get_FrameRate(pM, NULL);
218     ok(hr == E_POINTER, "IMediaDet_get_FrameRate\n");
219
220     hr = IMediaDet_get_FrameRate(pM, &fps);
221     ok(hr == S_OK, "IMediaDet_get_FrameRate\n");
222     ok(fps == 10.0, "IMediaDet_get_FrameRate\n");
223
224     hr = IMediaDet_Release(pM);
225     ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
226
227     DeleteFileW(test_avi_filename);
228
229     /* test_sound.avi has one video stream and one audio stream.  */
230     hr = CoCreateInstance(&CLSID_MediaDet, NULL, CLSCTX_INPROC_SERVER,
231             &IID_IMediaDet, (LPVOID*)&pM);
232     ok(hr == S_OK, "CoCreateInstance failed with %x\n", hr);
233     ok(pM != NULL, "pM is NULL\n");
234
235     filename = SysAllocString(test_sound_avi_filename);
236     hr = IMediaDet_put_Filename(pM, filename);
237     ok(hr == S_OK, "IMediaDet_put_Filename -> %x\n", hr);
238     SysFreeString(filename);
239
240     hr = IMediaDet_get_OutputStreams(pM, &nstrms);
241     ok(hr == S_OK, "IMediaDet_get_OutputStreams\n");
242     ok(nstrms == 2, "IMediaDet_get_OutputStreams\n");
243
244     filename = NULL;
245     hr = IMediaDet_get_Filename(pM, &filename);
246     ok(hr == S_OK, "IMediaDet_get_Filename\n");
247     ok(lstrcmpW(filename, test_sound_avi_filename) == 0,
248        "IMediaDet_get_Filename\n");
249     SysFreeString(filename);
250
251     /* I don't know if the stream order is deterministic.  Just check
252        for both an audio and video stream.  */
253     flags = 0;
254
255     for (i = 0; i < 2; ++i)
256     {
257         hr = IMediaDet_put_CurrentStream(pM, i);
258         ok(hr == S_OK, "IMediaDet_put_CurrentStream\n");
259
260         strm = -1;
261         hr = IMediaDet_get_CurrentStream(pM, &strm);
262         ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
263         ok(strm == i, "IMediaDet_get_CurrentStream\n");
264
265         ZeroMemory(&mt, sizeof mt);
266         hr = IMediaDet_get_StreamMediaType(pM, &mt);
267         ok(hr == S_OK, "IMediaDet_get_StreamMediaType\n");
268         flags += (IsEqualGUID(&mt.majortype, &MEDIATYPE_Video)
269                   ? 1
270                   : (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio)
271                      ? 2
272                      : 0));
273
274         if (IsEqualGUID(&mt.majortype, &MEDIATYPE_Audio))
275         {
276             hr = IMediaDet_get_FrameRate(pM, &fps);
277             ok(hr == VFW_E_INVALIDMEDIATYPE, "IMediaDet_get_FrameRate\n");
278         }
279
280         CoTaskMemFree(mt.pbFormat);
281     }
282     ok(flags == 3, "IMediaDet_get_StreamMediaType\n");
283
284     hr = IMediaDet_put_CurrentStream(pM, 2);
285     ok(hr == E_INVALIDARG, "IMediaDet_put_CurrentStream\n");
286
287     strm = -1;
288     hr = IMediaDet_get_CurrentStream(pM, &strm);
289     ok(hr == S_OK, "IMediaDet_get_CurrentStream\n");
290     ok(strm == 1, "IMediaDet_get_CurrentStream\n");
291
292     hr = IMediaDet_Release(pM);
293     ok(hr == 0, "IMediaDet_Release returned: %x\n", hr);
294
295     DeleteFileW(test_sound_avi_filename);
296 }
297
298 START_TEST(mediadet)
299 {
300     if (!init_tests())
301     {
302         skip("Couldn't initialize tests!\n");
303         return;
304     }
305
306     CoInitialize(NULL);
307     test_mediadet();
308     CoUninitialize();
309 }