2 * Copyright 2011 Vincent Povirk for CodeWeavers
3 * Copyright 2012 Dmitry Timoshkov
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
29 #include "wincodecsdk.h"
30 #include "wine/test.h"
32 #define expect_blob(propvar, data, length) do { \
33 ok((propvar).vt == VT_BLOB, "unexpected vt: %i\n", (propvar).vt); \
34 if ((propvar).vt == VT_BLOB) { \
35 ok(U(propvar).blob.cbSize == (length), "expected size %u, got %u\n", (ULONG)(length), U(propvar).blob.cbSize); \
36 if (U(propvar).blob.cbSize == (length)) { \
37 ok(!memcmp(U(propvar).blob.pBlobData, (data), (length)), "unexpected data\n"); \
44 #define IFD_RATIONAL 5
63 USHORT number_of_entries;
64 struct IFD_entry entry[6];
66 struct IFD_rational xres;
71 { 0xfe, IFD_SHORT, 1, 1 }, /* NEWSUBFILETYPE */
72 { 0x100, IFD_LONG, 1, 222 }, /* IMAGEWIDTH */
73 { 0x101, IFD_LONG, 1, 333 }, /* IMAGELENGTH */
74 { 0x102, IFD_SHORT, 1, 24 }, /* BITSPERSAMPLE */
75 { 0x103, IFD_LONG, 1, 32773 }, /* COMPRESSION: packbits */
76 { 0x11a, IFD_RATIONAL, 1, /* XRESOLUTION */
77 sizeof(USHORT) + sizeof(struct IFD_entry) * 6 + sizeof(ULONG) }
84 static const char metadata_unknown[] = "lalala";
86 static const char metadata_tEXt[] = {
87 0,0,0,14, /* chunk length */
88 't','E','X','t', /* chunk type */
89 'w','i','n','e','t','e','s','t',0, /* keyword */
90 'v','a','l','u','e', /* text */
91 0x3f,0x64,0x19,0xf3 /* chunk CRC */
94 static const char pngimage[285] = {
95 0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,
96 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x02,0x00,0x00,0x00,0x90,0x77,0x53,
97 0xde,0x00,0x00,0x00,0x09,0x70,0x48,0x59,0x73,0x00,0x00,0x0b,0x13,0x00,0x00,0x0b,
98 0x13,0x01,0x00,0x9a,0x9c,0x18,0x00,0x00,0x00,0x07,0x74,0x49,0x4d,0x45,0x07,0xd5,
99 0x06,0x03,0x0f,0x07,0x2d,0x12,0x10,0xf0,0xfd,0x00,0x00,0x00,0x0c,0x49,0x44,0x41,
100 0x54,0x08,0xd7,0x63,0xf8,0xff,0xff,0x3f,0x00,0x05,0xfe,0x02,0xfe,0xdc,0xcc,0x59,
101 0xe7,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82
104 static const char *debugstr_guid(REFIID riid)
111 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
112 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
113 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
114 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
119 static IStream *create_stream(const char *data, int data_size)
126 hdata = GlobalAlloc(GMEM_MOVEABLE, data_size);
127 ok(hdata != 0, "GlobalAlloc failed\n");
128 if (!hdata) return NULL;
130 locked_data = GlobalLock(hdata);
131 memcpy(locked_data, data, data_size);
134 hr = CreateStreamOnHGlobal(hdata, TRUE, &stream);
135 ok(hr == S_OK, "CreateStreamOnHGlobal failed, hr=%x\n", hr);
140 static void load_stream(IUnknown *reader, const char *data, int data_size)
143 IWICPersistStream *persist;
146 stream = create_stream(data, data_size);
150 hr = IUnknown_QueryInterface(reader, &IID_IWICPersistStream, (void**)&persist);
151 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
155 hr = IWICPersistStream_LoadEx(persist, stream, NULL, WICPersistOptionsDefault);
156 ok(hr == S_OK, "LoadEx failed, hr=%x\n", hr);
158 IWICPersistStream_Release(persist);
161 IStream_Release(stream);
164 static void test_metadata_unknown(void)
167 IWICMetadataReader *reader;
168 IWICEnumMetadataItem *enumerator;
169 IWICMetadataBlockReader *blockreader;
170 PROPVARIANT schema, id, value;
171 ULONG items_returned;
173 hr = CoCreateInstance(&CLSID_WICUnknownMetadataReader, NULL, CLSCTX_INPROC_SERVER,
174 &IID_IWICMetadataReader, (void**)&reader);
175 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
176 if (FAILED(hr)) return;
178 load_stream((IUnknown*)reader, metadata_unknown, sizeof(metadata_unknown));
180 hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
181 ok(hr == S_OK, "GetEnumerator failed, hr=%x\n", hr);
185 PropVariantInit(&schema);
186 PropVariantInit(&id);
187 PropVariantInit(&value);
189 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
190 ok(hr == S_OK, "Next failed, hr=%x\n", hr);
191 ok(items_returned == 1, "unexpected item count %i\n", items_returned);
193 if (hr == S_OK && items_returned == 1)
195 ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt);
196 ok(id.vt == VT_EMPTY, "unexpected vt: %i\n", id.vt);
197 expect_blob(value, metadata_unknown, sizeof(metadata_unknown));
199 PropVariantClear(&schema);
200 PropVariantClear(&id);
201 PropVariantClear(&value);
204 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
205 ok(hr == S_FALSE, "Next failed, hr=%x\n", hr);
206 ok(items_returned == 0, "unexpected item count %i\n", items_returned);
208 IWICEnumMetadataItem_Release(enumerator);
211 hr = IWICMetadataReader_QueryInterface(reader, &IID_IWICMetadataBlockReader, (void**)&blockreader);
212 ok(hr == E_NOINTERFACE, "QueryInterface failed, hr=%x\n", hr);
215 IWICMetadataBlockReader_Release(blockreader);
217 IWICMetadataReader_Release(reader);
220 static void test_metadata_tEXt(void)
223 IWICMetadataReader *reader;
224 IWICEnumMetadataItem *enumerator;
225 PROPVARIANT schema, id, value;
226 ULONG items_returned, count;
229 PropVariantInit(&schema);
230 PropVariantInit(&id);
231 PropVariantInit(&value);
233 hr = CoCreateInstance(&CLSID_WICPngTextMetadataReader, NULL, CLSCTX_INPROC_SERVER,
234 &IID_IWICMetadataReader, (void**)&reader);
235 todo_wine ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
236 if (FAILED(hr)) return;
238 hr = IWICMetadataReader_GetCount(reader, NULL);
239 ok(hr == E_INVALIDARG, "GetCount failed, hr=%x\n", hr);
241 hr = IWICMetadataReader_GetCount(reader, &count);
242 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
243 ok(count == 0, "unexpected count %i\n", count);
245 load_stream((IUnknown*)reader, metadata_tEXt, sizeof(metadata_tEXt));
247 hr = IWICMetadataReader_GetCount(reader, &count);
248 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
249 ok(count == 1, "unexpected count %i\n", count);
251 hr = IWICMetadataReader_GetEnumerator(reader, NULL);
252 ok(hr == E_INVALIDARG, "GetEnumerator failed, hr=%x\n", hr);
254 hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
255 ok(hr == S_OK, "GetEnumerator failed, hr=%x\n", hr);
259 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
260 ok(hr == S_OK, "Next failed, hr=%x\n", hr);
261 ok(items_returned == 1, "unexpected item count %i\n", items_returned);
263 if (hr == S_OK && items_returned == 1)
265 ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt);
266 ok(id.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
267 ok(!strcmp(U(id).pszVal, "winetest"), "unexpected id: %s\n", U(id).pszVal);
268 ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", value.vt);
269 ok(!strcmp(U(value).pszVal, "value"), "unexpected value: %s\n", U(value).pszVal);
271 PropVariantClear(&schema);
272 PropVariantClear(&id);
273 PropVariantClear(&value);
276 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
277 ok(hr == S_FALSE, "Next failed, hr=%x\n", hr);
278 ok(items_returned == 0, "unexpected item count %i\n", items_returned);
280 IWICEnumMetadataItem_Release(enumerator);
283 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
284 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
285 ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "unexpected format %s\n", debugstr_guid(&format));
287 hr = IWICMetadataReader_GetMetadataFormat(reader, NULL);
288 ok(hr == E_INVALIDARG, "GetMetadataFormat failed, hr=%x\n", hr);
291 U(id).pszVal = CoTaskMemAlloc(strlen("winetest") + 1);
292 strcpy(U(id).pszVal, "winetest");
294 hr = IWICMetadataReader_GetValue(reader, NULL, &id, NULL);
295 ok(hr == S_OK, "GetValue failed, hr=%x\n", hr);
297 hr = IWICMetadataReader_GetValue(reader, &schema, NULL, &value);
298 ok(hr == E_INVALIDARG, "GetValue failed, hr=%x\n", hr);
300 hr = IWICMetadataReader_GetValue(reader, &schema, &id, &value);
301 ok(hr == S_OK, "GetValue failed, hr=%x\n", hr);
302 ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
303 ok(!strcmp(U(value).pszVal, "value"), "unexpected value: %s\n", U(value).pszVal);
304 PropVariantClear(&value);
306 strcpy(U(id).pszVal, "test");
308 hr = IWICMetadataReader_GetValue(reader, &schema, &id, &value);
309 ok(hr == WINCODEC_ERR_PROPERTYNOTFOUND, "GetValue failed, hr=%x\n", hr);
311 PropVariantClear(&id);
313 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, NULL);
314 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
316 hr = IWICMetadataReader_GetValueByIndex(reader, 0, &schema, NULL, NULL);
317 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
318 ok(schema.vt == VT_EMPTY, "unexpected vt: %i\n", schema.vt);
320 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &id, NULL);
321 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
322 ok(id.vt == VT_LPSTR, "unexpected vt: %i\n", id.vt);
323 ok(!strcmp(U(id).pszVal, "winetest"), "unexpected id: %s\n", U(id).pszVal);
324 PropVariantClear(&id);
326 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value);
327 ok(hr == S_OK, "GetValueByIndex failed, hr=%x\n", hr);
328 ok(value.vt == VT_LPSTR, "unexpected vt: %i\n", value.vt);
329 ok(!strcmp(U(value).pszVal, "value"), "unexpected value: %s\n", U(value).pszVal);
330 PropVariantClear(&value);
332 hr = IWICMetadataReader_GetValueByIndex(reader, 1, NULL, NULL, NULL);
333 ok(hr == E_INVALIDARG, "GetValueByIndex failed, hr=%x\n", hr);
335 IWICMetadataReader_Release(reader);
338 static void test_metadata_IFD(void)
340 static const struct test_data
347 { VT_UI4, 0x100, 222 },
348 { VT_UI4, 0x101, 333 },
349 { VT_UI2, 0x102, 24 },
350 { VT_UI4, 0x103, 32773 },
351 { VT_UI8, 0x11a, ((LONGLONG)3 << 32) | 900 }
354 IWICMetadataReader *reader;
355 IWICMetadataBlockReader *blockreader;
356 IWICEnumMetadataItem *enumerator;
357 PROPVARIANT schema, id, value;
358 ULONG items_returned, count, i;
361 PropVariantInit(&schema);
362 PropVariantInit(&id);
363 PropVariantInit(&value);
365 hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER,
366 &IID_IWICMetadataReader, (void**)&reader);
367 ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
369 hr = IWICMetadataReader_GetCount(reader, NULL);
370 ok(hr == E_INVALIDARG, "GetCount error %#x\n", hr);
372 hr = IWICMetadataReader_GetCount(reader, &count);
373 ok(hr == S_OK, "GetCount error %#x\n", hr);
374 ok(count == 0, "unexpected count %u\n", count);
376 load_stream((IUnknown*)reader, (const char *)&IFD_data, sizeof(IFD_data));
378 hr = IWICMetadataReader_GetCount(reader, &count);
379 ok(hr == S_OK, "GetCount error %#x\n", hr);
381 ok(count == 6, "unexpected count %u\n", count);
383 hr = IWICMetadataReader_GetEnumerator(reader, NULL);
384 ok(hr == E_INVALIDARG, "GetEnumerator error %#x\n", hr);
386 hr = IWICMetadataReader_GetEnumerator(reader, &enumerator);
387 ok(hr == S_OK, "GetEnumerator error %#x\n", hr);
389 for (i = 0; i < count; i++)
391 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
392 ok(hr == S_OK, "Next error %#x\n", hr);
393 ok(items_returned == 1, "unexpected item count %u\n", items_returned);
395 ok(schema.vt == VT_EMPTY, "%u: unexpected vt: %u\n", i, schema.vt);
396 ok(id.vt == VT_UI2, "%u: unexpected vt: %u\n", i, id.vt);
397 ok(U(id).uiVal == td[i].id, "%u: unexpected id: %#x\n", i, U(id).uiVal);
398 ok(value.vt == td[i].type, "%u: unexpected vt: %u\n", i, value.vt);
399 ok(U(value).uhVal.QuadPart == td[i].value, "%u: unexpected id: %d/%d\n", i, U(value).uhVal.u.LowPart, U(value).uhVal.u.HighPart);
401 PropVariantClear(&schema);
402 PropVariantClear(&id);
403 PropVariantClear(&value);
406 hr = IWICEnumMetadataItem_Next(enumerator, 1, &schema, &id, &value, &items_returned);
407 ok(hr == S_FALSE, "Next should fail\n");
408 ok(items_returned == 0, "unexpected item count %u\n", items_returned);
410 IWICEnumMetadataItem_Release(enumerator);
412 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
414 ok(hr == S_OK, "GetMetadataFormat error %#x\n", hr);
416 ok(IsEqualGUID(&format, &GUID_MetadataFormatIfd), "unexpected format %s\n", debugstr_guid(&format));
418 hr = IWICMetadataReader_GetMetadataFormat(reader, NULL);
419 ok(hr == E_INVALIDARG, "GetMetadataFormat should fail\n");
421 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, NULL);
423 ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
426 IWICMetadataReader_Release(reader);
430 hr = IWICMetadataReader_GetValueByIndex(reader, count - 1, NULL, NULL, NULL);
431 ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
433 hr = IWICMetadataReader_GetValueByIndex(reader, 0, &schema, NULL, NULL);
434 ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
435 ok(schema.vt == VT_EMPTY, "unexpected vt: %u\n", schema.vt);
437 hr = IWICMetadataReader_GetValueByIndex(reader, count - 1, &schema, NULL, NULL);
438 ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
439 ok(schema.vt == VT_EMPTY, "unexpected vt: %u\n", schema.vt);
441 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, &id, NULL);
442 ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
443 ok(id.vt == VT_UI2, "unexpected vt: %u\n", id.vt);
444 ok(U(id).uiVal == 0xfe, "unexpected id: %#x\n", U(id).uiVal);
445 PropVariantClear(&id);
447 hr = IWICMetadataReader_GetValueByIndex(reader, 0, NULL, NULL, &value);
448 ok(hr == S_OK, "GetValueByIndex error %#x\n", hr);
449 ok(value.vt == VT_UI2, "unexpected vt: %u\n", value.vt);
450 ok(U(value).ulVal == 1, "unexpected id: %u\n", U(value).ulVal);
451 PropVariantClear(&value);
453 hr = IWICMetadataReader_GetValueByIndex(reader, count, &schema, NULL, NULL);
454 ok(hr == E_INVALIDARG, "GetValueByIndex should fail\n");
456 hr = IWICMetadataReader_QueryInterface(reader, &IID_IWICMetadataBlockReader, (void**)&blockreader);
457 ok(hr == E_NOINTERFACE, "QueryInterface failed, hr=%x\n", hr);
460 IWICMetadataBlockReader_Release(blockreader);
462 IWICMetadataReader_Release(reader);
465 static void test_metadata_Exif(void)
468 IWICMetadataReader *reader;
469 IWICMetadataBlockReader *blockreader;
472 hr = CoCreateInstance(&CLSID_WICExifMetadataReader, NULL, CLSCTX_INPROC_SERVER,
473 &IID_IWICMetadataReader, (void**)&reader);
474 todo_wine ok(hr == S_OK, "CoCreateInstance error %#x\n", hr);
475 if (FAILED(hr)) return;
477 hr = IWICMetadataReader_GetCount(reader, NULL);
478 ok(hr == E_INVALIDARG, "GetCount error %#x\n", hr);
480 hr = IWICMetadataReader_GetCount(reader, &count);
481 ok(hr == S_OK, "GetCount error %#x\n", hr);
482 ok(count == 0, "unexpected count %u\n", count);
484 hr = IWICMetadataReader_QueryInterface(reader, &IID_IWICMetadataBlockReader, (void**)&blockreader);
485 ok(hr == E_NOINTERFACE, "QueryInterface failed, hr=%x\n", hr);
488 IWICMetadataBlockReader_Release(blockreader);
490 IWICMetadataReader_Release(reader);
493 static void test_create_reader(void)
496 IWICComponentFactory *factory;
498 IWICMetadataReader *reader;
502 hr = CoCreateInstance(&CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER,
503 &IID_IWICComponentFactory, (void**)&factory);
504 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
506 stream = create_stream(metadata_tEXt, sizeof(metadata_tEXt));
508 hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
509 &GUID_ContainerFormatPng, NULL, WICPersistOptionsDefault,
512 ok(hr == S_OK, "CreateMetadataReaderFromContainer failed, hr=%x\n", hr);
513 if (FAILED(hr)) return;
517 hr = IWICMetadataReader_GetCount(reader, &count);
518 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
519 ok(count == 1, "unexpected count %i\n", count);
521 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
522 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
523 ok(IsEqualGUID(&format, &GUID_MetadataFormatChunktEXt), "unexpected format %s\n", debugstr_guid(&format));
525 IWICMetadataReader_Release(reader);
528 hr = IWICComponentFactory_CreateMetadataReaderFromContainer(factory,
529 &GUID_ContainerFormatWmp, NULL, WICPersistOptionsDefault,
531 ok(hr == S_OK, "CreateMetadataReaderFromContainer failed, hr=%x\n", hr);
535 hr = IWICMetadataReader_GetCount(reader, &count);
536 ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
537 ok(count == 1, "unexpected count %i\n", count);
539 hr = IWICMetadataReader_GetMetadataFormat(reader, &format);
540 ok(hr == S_OK, "GetMetadataFormat failed, hr=%x\n", hr);
541 ok(IsEqualGUID(&format, &GUID_MetadataFormatUnknown), "unexpected format %s\n", debugstr_guid(&format));
543 IWICMetadataReader_Release(reader);
546 IStream_Release(stream);
548 IWICComponentFactory_Release(factory);
551 static void test_metadata_png(void)
554 IWICBitmapDecoder *decoder;
555 IWICBitmapFrameDecode *frame;
556 IWICMetadataBlockReader *blockreader;
557 IWICMetadataReader *reader;
558 GUID containerformat;
562 hr = CoCreateInstance(&CLSID_WICPngDecoder, NULL, CLSCTX_INPROC_SERVER,
563 &IID_IWICBitmapDecoder, (void**)&decoder);
564 ok(hr == S_OK, "CoCreateInstance failed, hr=%x\n", hr);
566 if (FAILED(hr)) return;
568 stream = create_stream(pngimage, sizeof(pngimage));
570 hr = IWICBitmapDecoder_Initialize(decoder, stream, WICDecodeMetadataCacheOnLoad);
571 ok(hr == S_OK, "Initialize failed, hr=%x\n", hr);
573 hr = IWICBitmapDecoder_QueryInterface(decoder, &IID_IWICMetadataBlockReader, (void**)&blockreader);
574 ok(hr == E_NOINTERFACE, "QueryInterface failed, hr=%x\n", hr);
576 hr = IWICBitmapDecoder_GetFrame(decoder, 0, &frame);
577 ok(hr == S_OK, "GetFrame failed, hr=%x\n", hr);
579 hr = IWICBitmapFrameDecode_QueryInterface(frame, &IID_IWICMetadataBlockReader, (void**)&blockreader);
580 ok(hr == S_OK, "QueryInterface failed, hr=%x\n", hr);
584 hr = IWICMetadataBlockReader_GetContainerFormat(blockreader, NULL);
585 ok(hr == E_INVALIDARG, "GetContainerFormat failed, hr=%x\n", hr);
587 hr = IWICMetadataBlockReader_GetContainerFormat(blockreader, &containerformat);
588 ok(hr == S_OK, "GetContainerFormat failed, hr=%x\n", hr);
589 ok(IsEqualGUID(&containerformat, &GUID_ContainerFormatPng), "unexpected container format\n");
591 hr = IWICMetadataBlockReader_GetCount(blockreader, NULL);
592 todo_wine ok(hr == E_INVALIDARG, "GetCount failed, hr=%x\n", hr);
594 hr = IWICMetadataBlockReader_GetCount(blockreader, &count);
595 todo_wine ok(hr == S_OK, "GetCount failed, hr=%x\n", hr);
596 todo_wine ok(count == 1, "unexpected count %d\n", count);
600 /* Crashes on Windows XP */
601 hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 0, NULL);
602 ok(hr == E_INVALIDARG, "GetReaderByIndex failed, hr=%x\n", hr);
605 hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 0, &reader);
606 todo_wine ok(hr == S_OK, "GetReaderByIndex failed, hr=%x\n", hr);
610 hr = IWICMetadataReader_GetMetadataFormat(reader, &containerformat);
611 ok(IsEqualGUID(&containerformat, &GUID_MetadataFormatChunktIME) ||
612 broken(IsEqualGUID(&containerformat, &GUID_MetadataFormatUnknown)) /* Windows XP */,
613 "unexpected container format\n");
615 IWICMetadataReader_Release(reader);
618 hr = IWICMetadataBlockReader_GetReaderByIndex(blockreader, 1, &reader);
619 todo_wine ok(hr == WINCODEC_ERR_VALUEOUTOFRANGE, "GetReaderByIndex failed, hr=%x\n", hr);
621 IWICMetadataBlockReader_Release(blockreader);
624 IWICBitmapFrameDecode_Release(frame);
626 IWICBitmapDecoder_Release(decoder);
628 IWICStream_Release(stream);
633 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
635 test_metadata_unknown();
636 test_metadata_tEXt();
638 test_metadata_Exif();
639 test_create_reader();