3 * unit tests for the tag support library
5 * Copyright (C) 2006-2011 Tim-Philipp Müller <tim centricular net>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 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 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
27 #include <gst/check/gstcheck.h>
29 #include <gst/tag/tag.h>
30 #include <gst/base/gstbytewriter.h>
34 GST_START_TEST (test_parse_extended_comment)
36 gchar *key, *val, *lang;
38 /* first check the g_return_val_if_fail conditions */
39 ASSERT_CRITICAL (gst_tag_parse_extended_comment (NULL, NULL, NULL, NULL,
41 ASSERT_CRITICAL (gst_tag_parse_extended_comment ("\377\000", NULL, NULL, NULL,
44 key = val = lang = NULL;
45 fail_unless (gst_tag_parse_extended_comment ("a=b", &key, &lang, &val,
47 fail_unless (key != NULL);
48 fail_unless (lang == NULL);
49 fail_unless (val != NULL);
50 fail_unless_equals_string (key, "a");
51 fail_unless_equals_string (val, "b");
56 key = val = lang = NULL;
57 fail_unless (gst_tag_parse_extended_comment ("a[l]=b", &key, &lang, &val,
59 fail_unless (key != NULL);
60 fail_unless (lang != NULL);
61 fail_unless (val != NULL);
62 fail_unless_equals_string (key, "a");
63 fail_unless_equals_string (lang, "l");
64 fail_unless_equals_string (val, "b");
69 key = val = lang = NULL;
70 fail_unless (gst_tag_parse_extended_comment ("foo=bar", &key, &lang, &val,
72 fail_unless (key != NULL);
73 fail_unless (lang == NULL);
74 fail_unless (val != NULL);
75 fail_unless_equals_string (key, "foo");
76 fail_unless_equals_string (val, "bar");
81 key = val = lang = NULL;
82 fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", &key, &lang, &val,
84 fail_unless (key != NULL);
85 fail_unless (lang != NULL);
86 fail_unless (val != NULL);
87 fail_unless_equals_string (key, "foo");
88 fail_unless_equals_string (lang, "fr");
89 fail_unless_equals_string (val, "bar");
94 key = val = lang = NULL;
95 fail_unless (gst_tag_parse_extended_comment ("foo=[fr]bar", &key, &lang, &val,
97 fail_unless (key != NULL);
98 fail_unless (lang == NULL);
99 fail_unless (val != NULL);
100 fail_unless_equals_string (key, "foo");
101 fail_unless_equals_string (val, "[fr]bar");
106 /* test NULL for output locations */
107 fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", NULL, NULL, NULL,
110 /* test strict mode (key must be specified) */
111 fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", NULL, NULL, NULL,
113 fail_unless (gst_tag_parse_extended_comment ("foo=bar", NULL, NULL, NULL,
115 fail_unless (gst_tag_parse_extended_comment ("foobar", NULL, NULL, NULL,
118 /* test non-strict mode (if there's no key, that's fine too) */
119 fail_unless (gst_tag_parse_extended_comment ("foobar", NULL, NULL, NULL,
121 fail_unless (gst_tag_parse_extended_comment ("[fr]bar", NULL, NULL, NULL,
124 key = val = lang = NULL;
125 fail_unless (gst_tag_parse_extended_comment ("[fr]bar", &key, &lang, &val,
127 fail_unless (key == NULL);
128 fail_unless (lang == NULL);
129 fail_unless (val != NULL);
130 fail_unless_equals_string (val, "[fr]bar");
138 #define ASSERT_TAG_LIST_HAS_STRING(list,field,string) \
140 gboolean got_match = FALSE; \
143 fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \
144 size = gst_tag_list_get_tag_size (list,field); \
145 for (i = 0; i < size; ++i) { \
146 gchar *___s = NULL; \
148 fail_unless (gst_tag_list_get_string_index (list, field, i, &___s)); \
149 fail_unless (___s != NULL); \
150 if (g_str_equal (___s, string)) { \
157 fail_unless (got_match); \
160 #define ASSERT_TAG_LIST_HAS_UINT(list,field,num) \
164 fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \
165 fail_unless (gst_tag_list_get_tag_size (list,field) == 1); \
166 fail_unless (gst_tag_list_get_uint_index (list, field, 0, &___n)); \
167 fail_unless_equals_int (___n, num); \
170 #define MATCH_DOUBLE(p1, p2) ((p1 < p2 + 1e-6) && (p2 < p1 + 1e-6))
171 #define ASSERT_TAG_LIST_HAS_DOUBLE(list,field,d) \
175 fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \
176 fail_unless (gst_tag_list_get_tag_size (list,field) == 1); \
177 fail_unless (gst_tag_list_get_double_index (list, field, 0, &___d)); \
178 fail_unless (MATCH_DOUBLE (d, ___d), \
179 "%f does not match expected %f", ___d, d); \
182 GST_START_TEST (test_musicbrainz_tag_registration)
186 gst_tag_register_musicbrainz_tags ();
188 list = gst_tag_list_new_empty ();
190 /* musicbrainz tags aren't registered yet */
191 gst_vorbis_tag_add (list, "MUSICBRAINZ_TRACKID", "123456");
192 gst_vorbis_tag_add (list, "MUSICBRAINZ_ARTISTID", "234567");
193 gst_vorbis_tag_add (list, "MUSICBRAINZ_ALBUMID", "345678");
194 gst_vorbis_tag_add (list, "MUSICBRAINZ_ALBUMARTISTID", "4567890");
195 gst_vorbis_tag_add (list, "MUSICBRAINZ_TRMID", "5678901");
196 /* MUSICBRAINZ_SORTNAME = GST_TAG_ARTIST_SORTNAME now */
197 gst_vorbis_tag_add (list, "MUSICBRAINZ_SORTNAME", "Five, 678901");
199 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_TRACKID, "123456");
200 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ARTISTID, "234567");
201 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ALBUMID, "345678");
202 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ALBUMARTISTID,
204 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_TRMID, "5678901");
205 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST_SORTNAME, "Five, 678901");
207 gst_tag_list_unref (list);
212 GST_START_TEST (test_vorbis_tags)
216 list = gst_tag_list_new_empty ();
218 /* NULL pointers aren't allowed */
219 ASSERT_CRITICAL (gst_vorbis_tag_add (NULL, "key", "value"));
220 ASSERT_CRITICAL (gst_vorbis_tag_add (list, NULL, "value"));
221 ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key", NULL));
224 ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key", "v\377lue"));
225 ASSERT_CRITICAL (gst_vorbis_tag_add (list, "k\377y", "value"));
227 /* key can't have a '=' in it */
228 ASSERT_CRITICAL (gst_vorbis_tag_add (list, "k=y", "value"));
229 ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key=", "value"));
231 /* should be allowed in values though */
232 gst_vorbis_tag_add (list, "keeey", "va=ue");
235 gst_vorbis_tag_add (list, "TITLE", "Too");
236 gst_vorbis_tag_add (list, "ALBUM", "Aoo");
237 gst_vorbis_tag_add (list, "ARTIST", "Alboo");
238 gst_vorbis_tag_add (list, "PERFORMER", "Perfoo");
239 gst_vorbis_tag_add (list, "COPYRIGHT", "Copyfoo");
240 gst_vorbis_tag_add (list, "DESCRIPTION", "Descoo");
241 gst_vorbis_tag_add (list, "LICENSE", "Licoo");
242 gst_vorbis_tag_add (list, "LICENSE",
243 "http://creativecommons.org/licenses/by/3.0/");
244 gst_vorbis_tag_add (list, "LOCATION", "Bristol, UK");
245 gst_vorbis_tag_add (list, "ORGANIZATION", "Orgoo");
246 gst_vorbis_tag_add (list, "GENRE", "Goo");
247 gst_vorbis_tag_add (list, "CONTACT", "Coo");
248 gst_vorbis_tag_add (list, "COMMENT", "Stroodle is good");
249 gst_vorbis_tag_add (list, "COMMENT", "Peroxysulfid stroodles the brain");
251 gst_vorbis_tag_add (list, "TRACKNUMBER", "5");
252 gst_vorbis_tag_add (list, "TRACKTOTAL", "77");
253 gst_vorbis_tag_add (list, "DISCNUMBER", "1");
254 gst_vorbis_tag_add (list, "DISCTOTAL", "2");
255 gst_vorbis_tag_add (list, "DATE", "1954-12-31");
257 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_TITLE, "Too");
258 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ALBUM, "Aoo");
259 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "Alboo");
260 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_PERFORMER, "Perfoo");
261 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COPYRIGHT, "Copyfoo");
262 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_DESCRIPTION, "Descoo");
263 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LICENSE, "Licoo");
264 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LICENSE_URI,
265 "http://creativecommons.org/licenses/by/3.0/");
266 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_GEO_LOCATION_NAME, "Bristol, UK");
267 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ORGANIZATION, "Orgoo");
268 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_GENRE, "Goo");
269 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_CONTACT, "Coo");
270 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COMMENT,
271 "Peroxysulfid stroodles the brain");
272 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COMMENT, "Stroodle is good");
273 ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_TRACK_NUMBER, 5);
274 ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_TRACK_COUNT, 77);
275 ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_ALBUM_VOLUME_NUMBER, 1);
276 ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_ALBUM_VOLUME_COUNT, 2);
279 GstDateTime *dt = NULL;
281 fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt));
282 fail_unless (dt != NULL);
283 fail_unless (gst_date_time_get_day (dt) == 31);
284 fail_unless (gst_date_time_get_month (dt) == 12);
285 fail_unless (gst_date_time_get_year (dt) == 1954);
286 fail_unless (!gst_date_time_has_time (dt));
288 gst_date_time_unref (dt);
291 /* unknown vorbis comments should go into a GST_TAG_EXTENDED_COMMENT */
292 gst_vorbis_tag_add (list, "CoEdSub_ID", "98172AF-973-10-B");
293 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_EXTENDED_COMMENT,
294 "CoEdSub_ID=98172AF-973-10-B");
295 gst_vorbis_tag_add (list, "RuBuWuHash", "1337BA42F91");
296 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_EXTENDED_COMMENT,
297 "RuBuWuHash=1337BA42F91");
299 gst_vorbis_tag_add (list, "REPLAYGAIN_REFERENCE_LOUDNESS", "89.");
300 ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_REFERENCE_LEVEL, 89.);
301 gst_vorbis_tag_add (list, "REPLAYGAIN_TRACK_GAIN", "+12.36");
302 ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_TRACK_GAIN, +12.36);
303 gst_vorbis_tag_add (list, "REPLAYGAIN_TRACK_PEAK", "0.96349");
304 ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_TRACK_PEAK, 0.96349);
305 gst_vorbis_tag_add (list, "REPLAYGAIN_ALBUM_GAIN", "+10.12");
306 ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_ALBUM_GAIN, +10.12);
307 /* now check that we can parse floating point numbers with any separator
308 * (',' or '.') regardless of the current locale */
309 gst_vorbis_tag_add (list, "REPLAYGAIN_ALBUM_PEAK", "0,98107");
310 ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_ALBUM_PEAK, 0.98107);
311 gst_vorbis_tag_add (list, "LICENSE", "http://foo.com/license-1.html");
313 /* make sure we can convert back and forth without loss */
315 GstTagList *new_list, *even_newer_list;
316 GstBuffer *buf, *buf2;
317 gchar *vendor_id = NULL;
319 buf = gst_tag_list_to_vorbiscomment_buffer (list,
320 (const guint8 *) "\003vorbis", 7, "libgstunittest");
321 fail_unless (buf != NULL);
322 new_list = gst_tag_list_from_vorbiscomment_buffer (buf,
323 (const guint8 *) "\003vorbis", 7, &vendor_id);
324 fail_unless (new_list != NULL);
325 fail_unless (vendor_id != NULL);
329 GST_LOG ("new_list = %" GST_PTR_FORMAT, new_list);
330 fail_unless (gst_tag_list_is_equal (list, new_list));
332 buf2 = gst_tag_list_to_vorbiscomment_buffer (new_list,
333 (const guint8 *) "\003vorbis", 7, "libgstunittest");
334 fail_unless (buf2 != NULL);
335 even_newer_list = gst_tag_list_from_vorbiscomment_buffer (buf2,
336 (const guint8 *) "\003vorbis", 7, &vendor_id);
337 fail_unless (even_newer_list != NULL);
338 fail_unless (vendor_id != NULL);
342 GST_LOG ("even_newer_list = %" GST_PTR_FORMAT, even_newer_list);
343 fail_unless (gst_tag_list_is_equal (new_list, even_newer_list));
345 gst_tag_list_unref (new_list);
346 gst_tag_list_unref (even_newer_list);
347 gst_buffer_unref (buf);
348 gst_buffer_unref (buf2);
351 /* there can only be one language per taglist ... */
352 gst_tag_list_unref (list);
353 list = gst_tag_list_new_empty ();
354 gst_vorbis_tag_add (list, "LANGUAGE", "fr");
355 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr");
357 gst_tag_list_unref (list);
358 list = gst_tag_list_new_empty ();
359 gst_vorbis_tag_add (list, "LANGUAGE", "[fr]");
360 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr");
362 gst_tag_list_unref (list);
363 list = gst_tag_list_new_empty ();
364 gst_vorbis_tag_add (list, "LANGUAGE", "French [fr]");
365 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr");
367 gst_tag_list_unref (list);
368 list = gst_tag_list_new_empty ();
369 gst_vorbis_tag_add (list, "LANGUAGE", "[eng] English");
370 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng");
372 gst_tag_list_unref (list);
373 list = gst_tag_list_new_empty ();
374 gst_vorbis_tag_add (list, "LANGUAGE", "eng");
375 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng");
377 gst_tag_list_unref (list);
378 list = gst_tag_list_new_empty ();
379 gst_vorbis_tag_add (list, "LANGUAGE", "[eng]");
380 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng");
382 /* free-form *sigh* */
383 gst_tag_list_unref (list);
384 list = gst_tag_list_new_empty ();
385 gst_vorbis_tag_add (list, "LANGUAGE", "English");
386 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "English");
388 /* now, while we still have a taglist, test _to_vorbiscomment_buffer() */
390 GstBuffer *buf1, *buf2;
391 GstMapInfo map1, map2;
393 ASSERT_CRITICAL (gst_tag_list_to_vorbiscomment_buffer (NULL,
394 (const guint8 *) "x", 1, "x"));
396 buf1 = gst_tag_list_to_vorbiscomment_buffer (list, NULL, 0, NULL);
397 fail_unless (buf1 != NULL);
399 buf2 = gst_tag_list_to_vorbiscomment_buffer (list,
400 (const guint8 *) "foo", 3, NULL);
401 fail_unless (buf2 != NULL);
403 gst_buffer_map (buf1, &map1, GST_MAP_READ);
404 gst_buffer_map (buf2, &map2, GST_MAP_READ);
406 fail_unless (memcmp (map1.data, map2.data + 3, map1.size) == 0);
408 gst_buffer_unmap (buf2, &map2);
409 gst_buffer_unmap (buf1, &map1);
411 gst_buffer_unref (buf1);
412 gst_buffer_unref (buf2);
415 gst_tag_list_unref (list);
417 /* make sure gst_tag_list_from_vorbiscomment_buffer() works with an
418 * empty ID (for Speex) */
420 const guint8 speex_comments_buf1[] = { 0x03, 0x00, 0x00, 0x00, 'f', 'o',
421 'o', 0x00, 0x00, 0x00, 0x00
424 gchar *vendor = NULL;
426 buf = gst_buffer_new ();
427 gst_buffer_append_memory (buf,
428 gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
429 (gpointer) speex_comments_buf1,
430 sizeof (speex_comments_buf1), 0, sizeof (speex_comments_buf1), NULL,
433 /* make sure it doesn't memcmp over the end of the buffer */
434 fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
435 (const guint8 *) "averylongstringbrownfoxjumpoverthefence", 39,
437 fail_unless (vendor == NULL);
439 /* make sure it bails out if the ID doesn't match */
440 fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
441 (guint8 *) "short", 4, &vendor) == NULL);
442 fail_unless (vendor == NULL);
444 /* now read properly */
445 list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, &vendor);
446 fail_unless (vendor != NULL);
447 fail_unless_equals_string (vendor, "foo");
448 fail_unless (list != NULL);
449 fail_unless (gst_tag_list_n_tags (list) == 0);
451 gst_tag_list_unref (list);
453 /* now again without vendor */
454 list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, NULL);
455 fail_unless (list != NULL);
456 fail_unless (gst_tag_list_n_tags (list) == 0);
457 gst_tag_list_unref (list);
459 gst_buffer_unref (buf);
462 /* the same with an ID */
464 const guint8 vorbis_comments_buf[] = { 0x03, 'v', 'o', 'r', 'b', 'i', 's',
465 0x03, 0x00, 0x00, 0x00, 'f', 'o', 'o', 0x01, 0x00, 0x00, 0x00,
466 strlen ("ARTIST=foo bar"), 0x00, 0x00, 0x00, 'A', 'R', 'T', 'I', 'S',
467 'T', '=', 'f', 'o', 'o', ' ', 'b', 'a', 'r'
470 gchar *vendor = NULL;
472 buf = gst_buffer_new ();
473 gst_buffer_append_memory (buf,
474 gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY,
475 (gpointer) vorbis_comments_buf,
476 sizeof (vorbis_comments_buf), 0, sizeof (vorbis_comments_buf), NULL,
479 /* make sure it doesn't memcmp over the end of the buffer */
480 fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
481 (const guint8 *) "averylongstringbrownfoxjumpoverthefence", 39,
483 fail_unless (vendor == NULL);
485 /* make sure it bails out if the ID doesn't match */
486 fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf,
487 (guint8 *) "short", 4, &vendor) == NULL);
488 fail_unless (vendor == NULL);
490 /* now read properly */
491 list = gst_tag_list_from_vorbiscomment_buffer (buf,
492 (guint8 *) "\003vorbis", 7, &vendor);
493 fail_unless (vendor != NULL);
494 fail_unless_equals_string (vendor, "foo");
495 fail_unless (list != NULL);
496 fail_unless (gst_tag_list_n_tags (list) == 1);
497 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "foo bar");
499 gst_tag_list_unref (list);
501 /* now again without vendor */
502 list = gst_tag_list_from_vorbiscomment_buffer (buf,
503 (guint8 *) "\003vorbis", 7, NULL);
504 fail_unless (list != NULL);
505 fail_unless (gst_tag_list_n_tags (list) == 1);
506 ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "foo bar");
507 gst_tag_list_unref (list);
509 gst_buffer_unref (buf);
512 /* check date with time */
514 GstDateTime *dt = NULL;
516 list = gst_tag_list_new_empty ();
517 gst_vorbis_tag_add (list, "DATE", "2006-09-25 22:02:38");
519 fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt));
520 fail_unless (dt != NULL);
521 fail_unless (gst_date_time_get_day (dt) == 25);
522 fail_unless (gst_date_time_get_month (dt) == 9);
523 fail_unless (gst_date_time_get_year (dt) == 2006);
524 fail_unless (gst_date_time_has_time (dt));
526 gst_date_time_unref (dt);
527 gst_tag_list_unref (list);
530 /* check date with month/day of 00-00 */
532 GstDateTime *dt = NULL;
534 list = gst_tag_list_new_empty ();
535 gst_vorbis_tag_add (list, "DATE", "1992-00-00");
537 fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt));
538 fail_unless (dt != NULL);
539 fail_unless (gst_date_time_get_year (dt) == 1992);
540 fail_unless (!gst_date_time_has_month (dt));
541 fail_unless (!gst_date_time_has_day (dt));
542 fail_unless (!gst_date_time_has_time (dt));
544 gst_date_time_unref (dt);
545 gst_tag_list_unref (list);
548 /* check date with valid month, but day of 00 */
550 GstDateTime *dt = NULL;
552 list = gst_tag_list_new_empty ();
553 gst_vorbis_tag_add (list, "DATE", "1992-05-00");
555 fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt));
556 fail_unless (dt != NULL);
557 fail_unless (gst_date_time_get_year (dt) == 1992);
558 fail_unless (gst_date_time_get_month (dt) == 5);
559 fail_unless (!gst_date_time_has_day (dt));
560 fail_unless (!gst_date_time_has_time (dt));
562 gst_date_time_unref (dt);
563 gst_tag_list_unref (list);
569 GST_START_TEST (test_id3_tags)
573 fail_unless (gst_tag_id3_genre_count () > 0);
575 for (i = 0; i < gst_tag_id3_genre_count (); ++i) {
578 genre = gst_tag_id3_genre_get (i);
579 GST_LOG ("genre: %s", genre);
580 fail_unless (genre != NULL);
584 /* TODO: GstTagList *gst_tag_list_new_from_id3v1 (const guint8 *data) */
587 /* gst_tag_from_id3_tag */
588 fail_unless (gst_tag_from_id3_tag ("TALB") != NULL);
589 ASSERT_CRITICAL (gst_tag_from_id3_tag (NULL));
590 fail_unless (gst_tag_from_id3_tag ("R2D2") == NULL);
591 fail_unless_equals_string (gst_tag_from_id3_tag ("WCOP"),
592 GST_TAG_COPYRIGHT_URI);
594 /* gst_tag_from_id3_user_tag */
595 ASSERT_CRITICAL (gst_tag_from_id3_user_tag (NULL, "foo"));
596 ASSERT_CRITICAL (gst_tag_from_id3_user_tag ("foo", NULL));
597 fail_unless (gst_tag_from_id3_user_tag ("R2D2", "R2D2") == NULL);
599 /* gst_tag_to_id3_tag */
600 ASSERT_CRITICAL (gst_tag_to_id3_tag (NULL));
601 fail_unless (gst_tag_to_id3_tag ("R2D2") == NULL);
602 fail_unless (gst_tag_to_id3_tag (GST_TAG_ARTIST) != NULL);
603 fail_unless_equals_string (gst_tag_to_id3_tag (GST_TAG_COPYRIGHT_URI),
606 fail_unless (GST_TYPE_TAG_IMAGE_TYPE != 0);
607 fail_unless (g_type_name (GST_TYPE_TAG_IMAGE_TYPE) != NULL);
613 GST_START_TEST (test_id3v1_utf8_tag)
615 const guint8 id3v1[128] = {
618 /* title (30 bytes) */
619 'D', 0xc3, 0xad, 'v', 'k', 'a', ' ', 's',
620 ' ', 'p', 'e', 'r', 'l', 'a', 'm', 'i',
621 ' ', 'v', 'e', ' ', 'v', 'l', 'a', 's',
622 'e', 'c', 'h', 0, 0, 0,
623 /* artist (30 bytes) */
624 'A', 'l', 'e', 0xc5, 0xa1, ' ', 'B', 'r', 'i', 'c', 'h', 't', 'a',
625 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
626 /* album (30 bytes) */
627 'B', 'e', 's', 't', ' ', 'o', 'f', ' ', '(', 'P', 'r', 'o', 's', 't',
628 0xc4, 0x9b, ' ', 0xc3, 0xba, 0xc5, 0xbe, 'a', 's', 'n', 0xc3, 0xbd, ')',
632 /* comment (28 bytes) */
633 '-', '-', '-', ' ', 0xc4, 0x8d, 'e', 's', 'k', 0xc3, 0xa9, ' ', 'p',
634 0xc3, 0xad, 's', 'n', 'i', 0xc4, 0x8d, 'k', 'y', ' ', '-', '-', '-',
645 /* set this, to make sure UTF-8 strings are really interpreted properly
646 * as UTF-8, regardless of the locale set */
647 g_setenv ("GST_ID3V1_TAG_ENCODING", "WINDOWS-1250", TRUE);
649 tags = gst_tag_list_new_from_id3v1 (id3v1);
650 fail_unless (tags != NULL);
652 GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags);
655 fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s));
656 fail_unless (s != NULL);
657 fail_unless_equals_string (s, "Dívka s perlami ve vlasech");
661 fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s));
662 fail_unless (s != NULL);
663 fail_unless_equals_string (s, "Aleš Brichta");
667 fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s));
668 fail_unless (s != NULL);
669 fail_unless_equals_string (s, "Best of (Prostě úžasný)");
673 fail_unless (gst_tag_list_get_date_time (tags, GST_TAG_DATE_TIME, &dt));
674 fail_unless (dt != NULL);
675 fail_unless_equals_int (gst_date_time_get_year (dt), 2000);
676 fail_if (gst_date_time_has_month (dt));
677 fail_if (gst_date_time_has_day (dt));
678 fail_if (gst_date_time_has_time (dt));
679 gst_date_time_unref (dt);
682 gst_tag_list_unref (tags);
684 g_unsetenv ("GST_ID3V1_TAG_ENCODING");
689 GST_START_TEST (test_id3v2_priv_tag)
691 const guint8 id3v2[] = {
692 0x49, 0x44, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00,
693 0x00, 0x3f, 0x50, 0x52, 0x49, 0x56, 0x00, 0x00,
694 0x00, 0x35, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x2e,
695 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x73, 0x74,
696 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x2e,
697 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72,
698 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54,
699 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
700 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xbb,
703 const GstStructure *s;
705 GstSample *sample = NULL;
710 buf = gst_buffer_new_allocate (NULL, sizeof (id3v2), NULL);
711 gst_buffer_fill (buf, 0, id3v2, sizeof (id3v2));
713 tags = gst_tag_list_from_id3v2_tag (buf);
714 gst_buffer_unref (buf);
716 fail_if (tags == NULL, "Failed to parse ID3 tag");
718 GST_LOG ("tags: %" GST_PTR_FORMAT, tags);
720 if (!gst_tag_list_get_sample (tags, GST_TAG_PRIVATE_DATA, &sample))
721 g_error ("Failed to get PRIVATE_DATA tag");
723 s = gst_sample_get_info (sample);
724 buf = gst_sample_get_buffer (sample);
726 if (!gst_structure_has_name (s, "ID3PrivateFrame"))
727 g_error ("wrong info name");
729 gst_structure_get (s, "owner", G_TYPE_STRING, &owner, NULL);
730 fail_unless (owner != NULL);
732 fail_unless_equals_string (owner,
733 "com.apple.streaming.transportStreamTimestamp");
735 fail_unless_equals_int (gst_buffer_get_size (buf), 8);
737 gst_buffer_map (buf, &map, GST_MAP_READ);
738 GST_MEMDUMP ("private data", map.data, map.size);
739 fail_unless_equals_uint64 (GST_READ_UINT64_BE (map.data), 0x0dbba0);
740 gst_buffer_unmap (buf, &map);
743 gst_sample_unref (sample);
744 gst_tag_list_unref (tags);
750 parse_id3v2_tag_from_data (const guint8 * id3v2, gsize id3v2_size)
755 GST_MEMDUMP ("id3v2 tag", id3v2, id3v2_size);
757 buf = gst_buffer_new_allocate (NULL, id3v2_size, NULL);
758 gst_buffer_fill (buf, 0, id3v2, id3v2_size);
759 tags = gst_tag_list_from_id3v2_tag (buf);
760 gst_buffer_unref (buf);
765 GST_START_TEST (test_id3v2_extended_header)
767 const guint8 id3v24_exthdr[1024] = {
768 0x49, 0x44, 0x33, 0x04, 0x00, 0x40, 0x00, 0x00, 0x07, 0x76,
769 0x00, 0x00, 0x00, 0x0c, 0x01, 0x20, 0x05, 0x0b, 0x7f, 0x06,
770 0x43, 0x22, 0x54, 0x53, 0x53, 0x45, 0x00, 0x00, 0x00, 0x0e,
771 0x00, 0x00, 0x03, 0x4c, 0x61, 0x76, 0x66, 0x35, 0x37, 0x2e,
772 0x37, 0x31, 0x2e, 0x31, 0x30, 0x30, 0x54, 0x49, 0x54, 0x32,
773 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x53, 0x69, 0x6c,
774 0x65, 0x6e, 0x63, 0x65, 0x54, 0x50, 0x45, 0x31, 0x00, 0x00,
775 0x00, 0x07, 0x00, 0x00, 0x03, 0x4e, 0x6f, 0x20, 0x6f, 0x6e,
776 0x65, 0x54, 0x50, 0x45, 0x32, 0x00, 0x00, 0x00, 0x05, 0x00,
777 0x00, 0x03, 0x4e, 0x6f, 0x6e, 0x65, 0x54, 0x41, 0x4c, 0x42,
778 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x03, 0x4e, 0x65, 0x69,
779 0x74, 0x68, 0x65, 0x72, 0x54, 0x44, 0x52, 0x43, 0x00, 0x00,
780 0x00, 0x05, 0x00, 0x00, 0x03, 0x32, 0x30, 0x31, 0x38, 0x54,
781 0x52, 0x43, 0x4b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03,
782 0x30, 0x31, 0x2f, 0x30, 0x31, 0x54, 0x43, 0x4f, 0x4e, 0x00,
783 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x28, 0x31, 0x34, 0x38,
786 const guint8 id3v2_exthdr[] = {
787 0x49, 0x44, 0x33, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00, 0x1b,
788 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 0x54, 0x50, 0x45, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
790 0x00, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x65
792 const guint8 id3v2_no_exthdr[] = {
793 0x49, 0x44, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11,
794 0x54, 0x50, 0x45, 0x31, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
795 0x00, 0x47, 0x65, 0x6f, 0x72, 0x67, 0x65
799 tags = parse_id3v2_tag_from_data (id3v2_exthdr, sizeof (id3v2_exthdr));
800 fail_if (tags == NULL, "Failed to parse ID3 v2.3 tag with extension header");
801 GST_LOG ("tags: %" GST_PTR_FORMAT, tags);
802 fail_unless_equals_int (gst_tag_list_n_tags (tags), 1);
803 gst_tag_list_unref (tags);
805 tags = parse_id3v2_tag_from_data (id3v24_exthdr, sizeof (id3v24_exthdr));
806 fail_if (tags == NULL, "Failed to parse ID3 v2.4 tag with extension header");
807 GST_LOG ("tags: %" GST_PTR_FORMAT, tags);
808 fail_unless_equals_int (gst_tag_list_n_tags (tags), 9);
809 gst_tag_list_unref (tags);
811 tags = parse_id3v2_tag_from_data (id3v2_no_exthdr, sizeof (id3v2_no_exthdr));
812 fail_if (tags == NULL, "Failed to parse ID3 tag without extension header");
813 GST_LOG ("tags: %" GST_PTR_FORMAT, tags);
814 fail_unless_equals_int (gst_tag_list_n_tags (tags), 1);
815 gst_tag_list_unref (tags);
820 GST_START_TEST (test_id3v2_string_list_utf16)
822 const guint8 id3v2[] = {
823 0x49, 0x44, 0x33, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
824 0x43, 0x4f, 0x4d, 0x4d, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00,
825 0x01, 0x65, 0x6e, 0x67, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xfe,
826 0x4e, 0x00, 0x61, 0x00, 0x69, 0x00, 0x6d, 0x00, 0x20, 0x00,
827 0x4d, 0x00, 0x50, 0x00, 0x33, 0x00, 0x20, 0x00, 0x4d, 0x00,
828 0x75, 0x00, 0x73, 0x00, 0x69, 0x00, 0x63, 0x00, 0x20, 0x00,
829 0x4c, 0x00, 0x69, 0x00, 0x62, 0x00, 0x72, 0x00, 0x61, 0x00,
830 0x72, 0x00, 0x79, 0x00
833 gchar *comment = NULL;
835 tags = parse_id3v2_tag_from_data (id3v2, sizeof (id3v2));
836 fail_if (tags == NULL,
837 "Failed to parse ID3 tag with UTF-16 strings and BOMs");
839 GST_LOG ("tags: %" GST_PTR_FORMAT, tags);
841 gst_tag_list_get_string (tags, GST_TAG_COMMENT, &comment);
842 fail_unless (comment != NULL, "Expected comment tag");
843 GST_MEMDUMP ("comment string UTF-8", (guint8 *) comment, strlen (comment));
844 fail_unless_equals_string (comment, "Naim MP3 Music Library");
846 gst_tag_list_unref (tags);
851 GST_START_TEST (test_language_utils)
853 gchar **lang_codes, **c;
855 #define ASSERT_STRINGS_EQUAL fail_unless_equals_string
857 lang_codes = gst_tag_get_language_codes ();
858 fail_unless (lang_codes != NULL);
859 fail_unless (*lang_codes != NULL);
861 for (c = lang_codes; c != NULL && *c != NULL; ++c) {
862 const gchar *lang_name, *c1, *c2t, *c2b;
864 lang_name = gst_tag_get_language_name (*c);
865 fail_unless (lang_name != NULL);
866 fail_unless (g_utf8_validate (lang_name, -1, NULL));
868 c1 = gst_tag_get_language_code_iso_639_1 (*c);
869 fail_unless (c1 != NULL);
870 fail_unless (g_utf8_validate (c1, -1, NULL));
872 c2t = gst_tag_get_language_code_iso_639_2T (*c);
873 fail_unless (c2t != NULL);
874 fail_unless (g_utf8_validate (c2t, -1, NULL));
876 c2b = gst_tag_get_language_code_iso_639_2B (*c);
877 fail_unless (c2b != NULL);
878 fail_unless (g_utf8_validate (c2b, -1, NULL));
880 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (*c), *c);
881 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (c2t), *c);
882 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (c2b), *c);
884 GST_DEBUG ("[%s] %s %s %s : %s", *c, c1, c2t, c2b, lang_name);
887 g_strfreev (lang_codes);
889 fail_unless (gst_tag_get_language_name ("de") != NULL);
890 fail_unless (gst_tag_get_language_name ("deu") != NULL);
891 fail_unless (gst_tag_get_language_name ("ger") != NULL);
892 fail_unless_equals_string (gst_tag_get_language_name ("deu"),
893 gst_tag_get_language_name ("ger"));
894 fail_unless_equals_string (gst_tag_get_language_name ("de"),
895 gst_tag_get_language_name ("ger"));
896 fail_unless (gst_tag_get_language_name ("de") !=
897 gst_tag_get_language_name ("fr"));
899 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("deu"), "de");
900 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("de"), "de");
901 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("ger"), "de");
903 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("deu"), "de");
904 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("de"), "de");
905 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("ger"), "de");
907 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("de"), "deu");
908 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("deu"), "deu");
909 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("ger"), "deu");
911 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("de"), "ger");
912 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("deu"), "ger");
913 ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("ger"), "ger");
915 fail_unless (gst_tag_check_language_code ("de"));
916 fail_unless (gst_tag_check_language_code ("deu"));
917 fail_unless (gst_tag_check_language_code ("ger"));
918 fail_if (gst_tag_check_language_code ("xxx"));
919 fail_if (gst_tag_check_language_code ("und"));
920 fail_if (gst_tag_check_language_code ("un"));
921 fail_if (gst_tag_check_language_code (""));
922 fail_if (gst_tag_check_language_code ("\377"));
923 fail_if (gst_tag_check_language_code ("deutsch"));
928 #define SPECIFIC_L "http://creativecommons.org/licenses/by-nc-sa/2.5/scotland/"
929 #define GENERIC_L "http://creativecommons.org/licenses/by/1.0/"
930 #define DERIVED_L "http://creativecommons.org/licenses/sampling+/1.0/tw/"
932 GST_START_TEST (test_license_utils)
936 gchar **liblicense_refs, **r;
938 gchar *path, *data = NULL;
941 gst_debug_set_threshold_for_name ("tag-licenses", GST_LEVEL_NONE);
943 /* test jurisdiction-specific license */
944 fail_unless_equals_int (gst_tag_get_license_flags (SPECIFIC_L), 0x01010703);
945 fail_unless_equals_string (gst_tag_get_license_nick (SPECIFIC_L),
946 "CC BY-NC-SA 2.5 SCOTLAND");
947 fail_unless_equals_string (gst_tag_get_license_version (SPECIFIC_L), "2.5");
948 fail_unless_equals_string (gst_tag_get_license_jurisdiction (SPECIFIC_L),
951 g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE);
952 fail_unless_equals_string (gst_tag_get_license_title (SPECIFIC_L),
953 "Attribution-NonCommercial-ShareAlike");
954 fail_unless (gst_tag_get_license_description (SPECIFIC_L) == NULL);
956 /* test generic license */
957 fail_unless_equals_int (gst_tag_get_license_flags (GENERIC_L), 0x01000307);
958 fail_unless_equals_string (gst_tag_get_license_nick (GENERIC_L), "CC BY 1.0");
959 fail_unless_equals_string (gst_tag_get_license_version (GENERIC_L), "1.0");
960 fail_unless (gst_tag_get_license_jurisdiction (GENERIC_L) == NULL);
962 g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE);
963 fail_unless_equals_string (gst_tag_get_license_title (GENERIC_L),
965 fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L),
966 "You must attribute the work in the manner specified by the author or licensor.");
969 g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "fr", TRUE);
970 fail_unless_equals_string (gst_tag_get_license_title (GENERIC_L),
972 fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L),
973 "L'offrant autorise les autres à reproduire, distribuer et communiquer cette création au public. En échange, les personnes qui acceptent ce contrat doivent citer le nom de l'auteur original.");
976 /* test derived (for a certain jurisdiction) license */
977 fail_unless_equals_int (gst_tag_get_license_flags (DERIVED_L), 0x0100030d);
978 fail_unless_equals_string (gst_tag_get_license_nick (DERIVED_L),
979 "CC SAMPLING+ 1.0 TW");
980 fail_unless_equals_string (gst_tag_get_license_version (DERIVED_L), "1.0");
981 fail_unless_equals_string (gst_tag_get_license_jurisdiction (DERIVED_L),
984 g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE);
985 fail_unless_equals_string (gst_tag_get_license_title (DERIVED_L),
987 fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L),
988 "You must attribute the work in the manner specified by the author or licensor.");
990 /* test all we know about */
991 lrefs = gst_tag_get_licenses ();
992 fail_unless (lrefs != NULL);
993 fail_unless (*lrefs != NULL);
995 GST_INFO ("%d licenses", g_strv_length (lrefs));
996 fail_unless (g_strv_length (lrefs) >= 376);
998 ht = g_hash_table_new (g_str_hash, g_str_equal);
1000 for (l = lrefs; l != NULL && *l != NULL; ++l) {
1001 const gchar *ref, *nick, *title, *desc G_GNUC_UNUSED;
1003 ref = (const gchar *) *l;
1004 nick = gst_tag_get_license_nick (ref);
1005 title = gst_tag_get_license_title (ref);
1006 desc = gst_tag_get_license_description (ref);
1007 fail_unless (nick != NULL, "no nick for license '%s'", ref);
1008 fail_unless (title != NULL, "no title for license '%s'", ref);
1009 GST_LOG ("ref: %s [nick %s]", ref, (nick) ? nick : "none");
1010 GST_TRACE (" %s : %s", title, (desc) ? desc : "(no description)");
1012 /* make sure the list contains no duplicates */
1013 fail_if (g_hash_table_lookup (ht, (gpointer) ref) != NULL);
1014 g_hash_table_insert (ht, (gpointer) ref, (gpointer) "meep");
1016 g_hash_table_destroy (ht);
1018 /* trailing slash shouldn't make a difference */
1019 fail_unless_equals_int (gst_tag_get_license_flags
1020 ("http://creativecommons.org/licenses/by-nd/1.0/"),
1021 gst_tag_get_license_flags
1022 ("http://creativecommons.org/licenses/by-nd/1.0"));
1023 fail_unless_equals_string (gst_tag_get_license_nick
1024 ("http://creativecommons.org/licenses/by-nd/1.0/"),
1025 gst_tag_get_license_nick
1026 ("http://creativecommons.org/licenses/by-nd/1.0"));
1027 fail_unless_equals_int (gst_tag_get_license_flags
1028 ("http://creativecommons.org/licenses/by-nd/2.5/ca/"),
1029 gst_tag_get_license_flags
1030 ("http://creativecommons.org/licenses/by-nd/2.5/ca"));
1031 fail_unless_equals_string (gst_tag_get_license_nick
1032 ("http://creativecommons.org/licenses/by-nd/2.5/ca/"),
1033 gst_tag_get_license_nick
1034 ("http://creativecommons.org/licenses/by-nd/2.5/ca"));
1036 /* unknown licenses */
1037 fail_unless (gst_tag_get_license_nick
1038 ("http://creativecommons.org/licenses/by-nd/25/ca/") == NULL);
1039 fail_unless (gst_tag_get_license_flags
1040 ("http://creativecommons.org/licenses/by-nd/25/ca") == 0);
1041 fail_unless (gst_tag_get_license_jurisdiction
1042 ("http://creativecommons.org/licenses/by-nd/25/ca/") == NULL);
1043 fail_unless (gst_tag_get_license_jurisdiction
1044 ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL);
1045 fail_unless (gst_tag_get_license_title
1046 ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL);
1047 fail_unless (gst_tag_get_license_jurisdiction
1048 ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL);
1050 /* unknown prefixes even */
1051 fail_unless (gst_tag_get_license_nick
1052 ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
1053 fail_unless (gst_tag_get_license_flags
1054 ("http://copycats.org/licenses/by-nd/2.5/ca") == 0);
1055 fail_unless (gst_tag_get_license_jurisdiction
1056 ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
1057 fail_unless (gst_tag_get_license_title
1058 ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
1059 fail_unless (gst_tag_get_license_description
1060 ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL);
1062 /* read list of liblicense refs from file */
1063 path = g_build_filename (GST_TEST_FILES_PATH, "license-uris", NULL);
1064 GST_LOG ("reading file '%s'", path);
1065 if (!g_file_get_contents (path, &data, &data_len, &err)) {
1066 g_error ("error loading test file: %s", err->message);
1069 while (data_len > 0 && data[data_len - 1] == '\n') {
1070 data[--data_len] = '\0';
1073 liblicense_refs = g_strsplit (data, "\n", -1);
1077 fail_unless (g_strv_length (lrefs) >= g_strv_length (liblicense_refs));
1079 for (r = liblicense_refs; r != NULL && *r != NULL; ++r) {
1080 GstTagLicenseFlags flags;
1081 const gchar *version, *nick, *jur;
1082 const gchar *ref = *r;
1084 GST_LOG ("liblicense ref: %s", ref);
1086 version = gst_tag_get_license_version (ref);
1087 if (strstr (ref, "publicdomain") != NULL)
1088 fail_unless (version == NULL);
1090 fail_unless (version != NULL, "expected version for license %s", ref);
1092 flags = gst_tag_get_license_flags (ref);
1093 fail_unless (flags != 0, "expected non-zero flags for license %s", ref);
1095 nick = gst_tag_get_license_nick (ref);
1096 fail_unless (nick != NULL, "expected nick for license %s", ref);
1098 jur = gst_tag_get_license_jurisdiction (ref);
1099 if (g_str_has_suffix (ref, "de/")) {
1100 fail_unless_equals_string (jur, "de");
1101 } else if (g_str_has_suffix (ref, "scotland")) {
1102 fail_unless_equals_string (jur, "scotland");
1103 } else if (g_str_has_suffix (ref, ".0") || g_str_has_suffix (ref, ".1")) {
1104 fail_unless (jur == NULL);
1108 g_strfreev (liblicense_refs);
1114 GST_START_TEST (test_xmp_formatting)
1123 list = gst_tag_list_new (GST_TAG_TITLE, "test title",
1124 GST_TAG_DESCRIPTION, "test decription",
1125 GST_TAG_KEYWORDS, "keyword1", GST_TAG_KEYWORDS, "keyword2", NULL);
1127 buf = gst_tag_list_to_xmp_buffer (list, FALSE, NULL);
1128 fail_unless (buf != NULL);
1130 gst_buffer_map (buf, &map, GST_MAP_READ);
1131 text = (gchar *) map.data;
1134 /* check the content */
1135 fail_unless (g_strrstr_len (text, len, "<?xpacket begin") == text);
1136 fail_unless (g_strrstr_len (text, len, ">test title<") != NULL);
1137 fail_unless (g_strrstr_len (text, len, ">test decription<") != NULL);
1138 fail_unless (g_strrstr_len (text, len, ">keyword1<") != NULL);
1139 fail_unless (g_strrstr_len (text, len, ">keyword2<") != NULL);
1140 fail_unless (g_strrstr_len (text, len, "<?xpacket end") != NULL);
1141 gst_buffer_unmap (buf, &map);
1143 gst_buffer_unref (buf);
1144 gst_tag_list_unref (list);
1150 GST_START_TEST (test_xmp_parsing)
1154 guint i, j, result_size;
1156 const gchar *xmp_header =
1157 "<?xpacket begin=\"\xEF\xBB\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>"
1158 "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"GStreamer\">"
1159 "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">";
1161 /* We used to write an extra trailing \n after the footer, keep compatibility
1162 * with our old generated media by checking that it still can be parsed */
1163 const gchar *xmp_footers[] = {
1164 "</rdf:RDF>" "</x:xmpmeta>" "<?xpacket end=\"r\"?>",
1165 "</rdf:RDF>" "</x:xmpmeta>" "<?xpacket end=\"r\"?>\n",
1171 const gchar *xmp_data;
1177 "<rdf:Description rdf:about=\"\" />", 0, -1}, {
1178 "<rdf:Description rdf:about=\"\"></rdf:Description>", 0, -1}, {
1179 "<rdf:Description rdf:about=\"\" ></rdf:Description>", 0, -1}, {
1180 "<rdf:Description rdf:about=\"\"><dc:description>test</dc:description></rdf:Description>",
1182 "<rdf:Description rdf:about=\"\" dc:description=\"test\"></rdf:Description>",
1190 while (xmp_footers[j]) {
1191 while (test_data[i].xmp_data) {
1194 GST_DEBUG ("trying test-data %u", i);
1197 g_strconcat (xmp_header, test_data[i].xmp_data, xmp_footers[j], NULL);
1199 buf = gst_buffer_new ();
1200 len = strlen (text) + 1;
1201 gst_buffer_append_memory (buf,
1202 gst_memory_new_wrapped (0, text, len, 0, len, NULL, NULL));
1204 list = gst_tag_list_from_xmp_buffer (buf);
1205 if (test_data[i].result_size >= 0) {
1206 fail_unless (list != NULL);
1208 result_size = gst_tag_list_n_tags (list);
1209 fail_unless (result_size == test_data[i].result_size);
1211 /* check the taglist content */
1212 switch (test_data[i].result_test) {
1214 ASSERT_TAG_LIST_HAS_STRING (list, "description", "test");
1221 gst_tag_list_unref (list);
1223 gst_buffer_unref (buf);
1234 do_xmp_tag_serialization_deserialization (GstTagList * taglist,
1235 const gchar ** schemas)
1237 GstTagList *taglist2;
1240 buf = gst_tag_list_to_xmp_buffer (taglist, TRUE, schemas);
1241 taglist2 = gst_tag_list_from_xmp_buffer (buf);
1243 fail_unless (gst_tag_list_is_equal (taglist, taglist2));
1245 gst_buffer_unref (buf);
1246 gst_tag_list_unref (taglist2);
1250 do_simple_xmp_tag_serialization_deserialization (const gchar * gsttag,
1253 GstTagList *taglist = gst_tag_list_new_empty ();
1255 gst_tag_list_add_value (taglist, GST_TAG_MERGE_REPLACE, gsttag, value);
1257 do_xmp_tag_serialization_deserialization (taglist, NULL);
1258 gst_tag_list_unref (taglist);
1261 GST_START_TEST (test_xmp_tags_serialization_deserialization)
1263 GValue value = { 0 };
1264 GstDateTime *datetime;
1266 gst_tag_register_musicbrainz_tags ();
1268 g_value_init (&value, G_TYPE_STRING);
1269 g_value_set_static_string (&value, "my string");
1270 do_simple_xmp_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
1271 do_simple_xmp_tag_serialization_deserialization (GST_TAG_COPYRIGHT, &value);
1272 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DESCRIPTION, &value);
1273 do_simple_xmp_tag_serialization_deserialization (GST_TAG_KEYWORDS, &value);
1274 do_simple_xmp_tag_serialization_deserialization (GST_TAG_TITLE, &value);
1275 do_simple_xmp_tag_serialization_deserialization (GST_TAG_VIDEO_CODEC, &value);
1276 do_simple_xmp_tag_serialization_deserialization (GST_TAG_GEO_LOCATION_COUNTRY,
1278 do_simple_xmp_tag_serialization_deserialization (GST_TAG_GEO_LOCATION_CITY,
1280 do_simple_xmp_tag_serialization_deserialization
1281 (GST_TAG_GEO_LOCATION_SUBLOCATION, &value);
1282 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DEVICE_MANUFACTURER,
1284 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DEVICE_MODEL,
1286 do_simple_xmp_tag_serialization_deserialization (GST_TAG_APPLICATION_NAME,
1289 g_value_set_static_string (&value, "rotate-0");
1290 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1292 g_value_set_static_string (&value, "flip-rotate-0");
1293 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1295 g_value_set_static_string (&value, "rotate-180");
1296 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1298 g_value_set_static_string (&value, "flip-rotate-180");
1299 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1301 g_value_set_static_string (&value, "flip-rotate-270");
1302 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1304 g_value_set_static_string (&value, "rotate-90");
1305 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1307 g_value_set_static_string (&value, "flip-rotate-90");
1308 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1310 g_value_set_static_string (&value, "rotate-270");
1311 do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1314 g_value_unset (&value);
1315 g_value_init (&value, G_TYPE_DOUBLE);
1317 g_value_set_double (&value, 0.0);
1318 do_simple_xmp_tag_serialization_deserialization
1319 (GST_TAG_GEO_LOCATION_LATITUDE, &value);
1320 do_simple_xmp_tag_serialization_deserialization
1321 (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
1322 g_value_set_double (&value, 10.5);
1323 do_simple_xmp_tag_serialization_deserialization
1324 (GST_TAG_GEO_LOCATION_LATITUDE, &value);
1325 do_simple_xmp_tag_serialization_deserialization
1326 (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
1327 g_value_set_double (&value, -32.375);
1328 do_simple_xmp_tag_serialization_deserialization
1329 (GST_TAG_GEO_LOCATION_LATITUDE, &value);
1330 do_simple_xmp_tag_serialization_deserialization
1331 (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
1333 g_value_set_double (&value, 0);
1334 do_simple_xmp_tag_serialization_deserialization
1335 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1336 g_value_set_double (&value, 100);
1337 do_simple_xmp_tag_serialization_deserialization
1338 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1339 g_value_set_double (&value, 500.25);
1340 do_simple_xmp_tag_serialization_deserialization
1341 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1342 g_value_set_double (&value, -12.75);
1343 do_simple_xmp_tag_serialization_deserialization
1344 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1346 g_value_set_double (&value, 0.0);
1347 do_simple_xmp_tag_serialization_deserialization
1348 (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
1349 g_value_set_double (&value, 10.0);
1350 do_simple_xmp_tag_serialization_deserialization
1351 (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
1352 g_value_set_double (&value, 786.125);
1353 do_simple_xmp_tag_serialization_deserialization
1354 (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
1355 g_value_set_double (&value, -2.5);
1356 do_simple_xmp_tag_serialization_deserialization
1357 (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
1359 g_value_set_double (&value, 0.0);
1360 do_simple_xmp_tag_serialization_deserialization
1361 (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
1362 g_value_set_double (&value, 180.0);
1363 do_simple_xmp_tag_serialization_deserialization
1364 (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
1365 g_value_set_double (&value, 359.99);
1366 do_simple_xmp_tag_serialization_deserialization
1367 (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
1369 g_value_set_double (&value, 0.0);
1370 do_simple_xmp_tag_serialization_deserialization
1371 (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
1372 g_value_set_double (&value, 90.0);
1373 do_simple_xmp_tag_serialization_deserialization
1374 (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
1375 g_value_set_double (&value, 359.99);
1376 do_simple_xmp_tag_serialization_deserialization
1377 (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
1379 g_value_set_double (&value, 0.0);
1380 do_simple_xmp_tag_serialization_deserialization
1381 (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
1382 g_value_set_double (&value, 1.0);
1383 do_simple_xmp_tag_serialization_deserialization
1384 (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
1385 g_value_set_double (&value, -2.5);
1386 do_simple_xmp_tag_serialization_deserialization
1387 (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
1388 g_value_unset (&value);
1390 g_value_init (&value, GST_TYPE_DATE_TIME);
1391 datetime = gst_date_time_new_ymd (2010, 3, 22);
1392 g_value_take_boxed (&value, datetime);
1393 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1394 g_value_unset (&value);
1396 g_value_init (&value, G_TYPE_UINT);
1397 g_value_set_uint (&value, 0);
1398 do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value);
1399 g_value_set_uint (&value, 100);
1400 do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value);
1401 g_value_set_uint (&value, 22);
1402 do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value);
1403 g_value_unset (&value);
1405 g_value_init (&value, GST_TYPE_DATE_TIME);
1406 datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10);
1407 g_value_set_boxed (&value, datetime);
1408 gst_date_time_unref (datetime);
1409 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1410 datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.000125);
1411 g_value_set_boxed (&value, datetime);
1412 gst_date_time_unref (datetime);
1413 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1414 datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.000001);
1415 g_value_set_boxed (&value, datetime);
1416 gst_date_time_unref (datetime);
1417 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1418 datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.123456);
1419 g_value_set_boxed (&value, datetime);
1420 gst_date_time_unref (datetime);
1421 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1422 datetime = gst_date_time_new (-3, 2010, 6, 22, 12, 5, 10.123456);
1423 g_value_set_boxed (&value, datetime);
1424 gst_date_time_unref (datetime);
1425 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1426 datetime = gst_date_time_new (5, 2010, 6, 22, 12, 5, 10.123456);
1427 g_value_set_boxed (&value, datetime);
1428 gst_date_time_unref (datetime);
1429 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1430 datetime = gst_date_time_new_local_time (2010, 12, 2, 12, 5, 10.000043);
1431 g_value_set_boxed (&value, datetime);
1432 gst_date_time_unref (datetime);
1433 do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1434 g_value_unset (&value);
1440 GST_START_TEST (test_xmp_compound_tags)
1442 const gchar *schemas[] = { "Iptc4xmpExt", NULL };
1443 GstTagList *taglist = gst_tag_list_new_empty ();
1445 gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_KEYWORDS, "k1",
1446 GST_TAG_KEYWORDS, "k2", GST_TAG_TITLE, "title", GST_TAG_KEYWORDS, "k3",
1448 do_xmp_tag_serialization_deserialization (taglist, NULL);
1449 gst_tag_list_unref (taglist);
1451 taglist = gst_tag_list_new_empty ();
1452 gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_GEO_LOCATION_COUNTRY,
1453 "Brazil", GST_TAG_GEO_LOCATION_CITY, "Campina Grande", NULL);
1454 do_xmp_tag_serialization_deserialization (taglist, schemas);
1455 gst_tag_list_unref (taglist);
1461 GST_START_TEST (test_exif_parsing)
1463 GstTagList *taglist;
1465 GstByteWriter writer;
1466 gboolean res = TRUE;
1467 const gchar *str = NULL;
1469 gst_byte_writer_init (&writer);
1473 res &= gst_byte_writer_put_uint16_le (&writer, 1);
1477 res &= gst_byte_writer_put_uint16_le (&writer, 0x8298);
1479 res &= gst_byte_writer_put_uint16_le (&writer, 0x2);
1481 res &= gst_byte_writer_put_uint32_le (&writer, strlen ("my copyright") + 1);
1483 res &= gst_byte_writer_put_uint32_le (&writer, 8 + 14);
1486 res &= gst_byte_writer_put_string (&writer, "my copyright");
1488 fail_unless (res, "Failed to write tag");
1490 buf = gst_byte_writer_reset_and_get_buffer (&writer);
1492 taglist = gst_tag_list_from_exif_buffer (buf, G_LITTLE_ENDIAN, 8);
1494 fail_unless (gst_tag_list_get_tag_size (taglist, GST_TAG_COPYRIGHT) == 1);
1495 gst_tag_list_peek_string_index (taglist, GST_TAG_COPYRIGHT, 0, &str);
1496 fail_unless_equals_string (str, "my copyright");
1498 gst_tag_list_unref (taglist);
1499 gst_buffer_unref (buf);
1506 do_exif_tag_serialization_deserialization (GstTagList * taglist)
1508 GstTagList *taglist2;
1512 buf = gst_tag_list_to_exif_buffer (taglist, G_LITTLE_ENDIAN, 0);
1513 taglist2 = gst_tag_list_from_exif_buffer (buf, G_LITTLE_ENDIAN, 0);
1514 gst_buffer_unref (buf);
1516 fail_unless (gst_tag_list_is_equal (taglist, taglist2));
1517 gst_tag_list_unref (taglist2);
1520 buf = gst_tag_list_to_exif_buffer (taglist, G_BIG_ENDIAN, 0);
1521 taglist2 = gst_tag_list_from_exif_buffer (buf, G_BIG_ENDIAN, 0);
1522 gst_buffer_unref (buf);
1524 fail_unless (gst_tag_list_is_equal (taglist, taglist2));
1525 gst_tag_list_unref (taglist2);
1528 buf = gst_tag_list_to_exif_buffer_with_tiff_header (taglist);
1529 taglist2 = gst_tag_list_from_exif_buffer_with_tiff_header (buf);
1530 gst_buffer_unref (buf);
1532 fail_unless (gst_tag_list_is_equal (taglist, taglist2));
1533 gst_tag_list_unref (taglist2);
1537 do_simple_exif_tag_serialization_deserialization (const gchar * gsttag,
1540 GstTagList *taglist = gst_tag_list_new_empty ();
1542 gst_tag_list_add_value (taglist, GST_TAG_MERGE_REPLACE, gsttag, value);
1543 do_exif_tag_serialization_deserialization (taglist);
1545 gst_tag_list_unref (taglist);
1549 * Adds tags from multiple ifd tables and tries serializing them
1551 GST_START_TEST (test_exif_multiple_tags)
1553 GstTagList *taglist;
1554 GstDateTime *datetime;
1555 GValue value = { 0 };
1557 gst_tag_register_musicbrainz_tags ();
1559 taglist = gst_tag_list_new (GST_TAG_ARTIST, "artist",
1560 GST_TAG_DEVICE_MANUFACTURER, "make",
1561 GST_TAG_DEVICE_MODEL, "model", GST_TAG_GEO_LOCATION_LATITUDE, 45.5,
1562 GST_TAG_GEO_LOCATION_LONGITUDE, -10.25,
1563 GST_TAG_IMAGE_HORIZONTAL_PPI, 300.0,
1564 GST_TAG_IMAGE_VERTICAL_PPI, 300.0, NULL);
1566 g_value_init (&value, GST_TYPE_DATE_TIME);
1567 datetime = gst_date_time_new_local_time (2010, 6, 22, 12, 5, 10);
1568 g_value_set_boxed (&value, datetime);
1569 gst_date_time_unref (datetime);
1570 gst_tag_list_add_value (taglist, GST_TAG_MERGE_APPEND, GST_TAG_DATE_TIME,
1572 g_value_unset (&value);
1574 do_exif_tag_serialization_deserialization (taglist);
1576 gst_tag_list_unref (taglist);
1582 GST_START_TEST (test_exif_tags_serialization_deserialization)
1584 GValue value = { 0 };
1585 GstDateTime *datetime = NULL;
1586 GstBuffer *buf = NULL;
1588 GstTagList *taglist;
1592 gst_tag_register_musicbrainz_tags ();
1594 g_value_init (&value, G_TYPE_STRING);
1595 g_value_set_static_string (&value, "my string");
1596 do_simple_exif_tag_serialization_deserialization (GST_TAG_COPYRIGHT, &value);
1597 g_value_set_static_string (&value, "ty");
1598 do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
1599 g_value_set_static_string (&value, "Company Software 1.2b (info)");
1600 do_simple_exif_tag_serialization_deserialization (GST_TAG_APPLICATION_NAME,
1603 /* non ascii chars */
1604 g_value_set_static_string (&value, "AaÄäEeËëIiÏïOoÖöUuÜü");
1605 do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
1606 g_value_set_static_string (&value, "Äë");
1607 do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value);
1609 /* image orientation tests */
1610 g_value_set_static_string (&value, "rotate-0");
1611 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1613 g_value_set_static_string (&value, "flip-rotate-0");
1614 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1616 g_value_set_static_string (&value, "rotate-180");
1617 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1619 g_value_set_static_string (&value, "flip-rotate-180");
1620 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1622 g_value_set_static_string (&value, "flip-rotate-270");
1623 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1625 g_value_set_static_string (&value, "rotate-90");
1626 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1628 g_value_set_static_string (&value, "flip-rotate-90");
1629 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1631 g_value_set_static_string (&value, "rotate-270");
1632 do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION,
1635 /* exposure program */
1636 g_value_set_static_string (&value, "undefined");
1637 do_simple_exif_tag_serialization_deserialization
1638 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1639 g_value_set_static_string (&value, "manual");
1640 do_simple_exif_tag_serialization_deserialization
1641 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1642 g_value_set_static_string (&value, "normal");
1643 do_simple_exif_tag_serialization_deserialization
1644 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1645 g_value_set_static_string (&value, "aperture-priority");
1646 do_simple_exif_tag_serialization_deserialization
1647 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1648 g_value_set_static_string (&value, "shutter-priority");
1649 do_simple_exif_tag_serialization_deserialization
1650 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1651 g_value_set_static_string (&value, "creative");
1652 do_simple_exif_tag_serialization_deserialization
1653 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1654 g_value_set_static_string (&value, "action");
1655 do_simple_exif_tag_serialization_deserialization
1656 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1657 g_value_set_static_string (&value, "portrait");
1658 do_simple_exif_tag_serialization_deserialization
1659 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1660 g_value_set_static_string (&value, "landscape");
1661 do_simple_exif_tag_serialization_deserialization
1662 (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value);
1665 g_value_set_static_string (&value, "auto-exposure");
1666 do_simple_exif_tag_serialization_deserialization
1667 (GST_TAG_CAPTURING_EXPOSURE_MODE, &value);
1668 g_value_set_static_string (&value, "manual-exposure");
1669 do_simple_exif_tag_serialization_deserialization
1670 (GST_TAG_CAPTURING_EXPOSURE_MODE, &value);
1671 g_value_set_static_string (&value, "auto-bracket");
1672 do_simple_exif_tag_serialization_deserialization
1673 (GST_TAG_CAPTURING_EXPOSURE_MODE, &value);
1675 /* scene capture type */
1676 g_value_set_static_string (&value, "standard");
1677 do_simple_exif_tag_serialization_deserialization
1678 (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
1679 g_value_set_static_string (&value, "portrait");
1680 do_simple_exif_tag_serialization_deserialization
1681 (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
1682 g_value_set_static_string (&value, "landscape");
1683 do_simple_exif_tag_serialization_deserialization
1684 (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
1685 g_value_set_static_string (&value, "night-scene");
1686 do_simple_exif_tag_serialization_deserialization
1687 (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value);
1689 g_value_set_static_string (&value, "none");
1690 do_simple_exif_tag_serialization_deserialization
1691 (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
1692 g_value_set_static_string (&value, "high-gain-up");
1693 do_simple_exif_tag_serialization_deserialization
1694 (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
1695 g_value_set_static_string (&value, "low-gain-up");
1696 do_simple_exif_tag_serialization_deserialization
1697 (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
1698 g_value_set_static_string (&value, "high-gain-down");
1699 do_simple_exif_tag_serialization_deserialization
1700 (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
1701 g_value_set_static_string (&value, "low-gain-down");
1702 do_simple_exif_tag_serialization_deserialization
1703 (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value);
1705 g_value_set_static_string (&value, "auto");
1706 do_simple_exif_tag_serialization_deserialization
1707 (GST_TAG_CAPTURING_WHITE_BALANCE, &value);
1708 g_value_set_static_string (&value, "manual");
1709 do_simple_exif_tag_serialization_deserialization
1710 (GST_TAG_CAPTURING_WHITE_BALANCE, &value);
1712 g_value_set_static_string (&value, "normal");
1713 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST,
1715 g_value_set_static_string (&value, "hard");
1716 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST,
1718 g_value_set_static_string (&value, "soft");
1719 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST,
1722 g_value_set_static_string (&value, "normal");
1723 do_simple_exif_tag_serialization_deserialization
1724 (GST_TAG_CAPTURING_SATURATION, &value);
1725 g_value_set_static_string (&value, "low-saturation");
1726 do_simple_exif_tag_serialization_deserialization
1727 (GST_TAG_CAPTURING_SATURATION, &value);
1728 g_value_set_static_string (&value, "high-saturation");
1729 do_simple_exif_tag_serialization_deserialization
1730 (GST_TAG_CAPTURING_SATURATION, &value);
1732 g_value_set_static_string (&value, "normal");
1733 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS,
1735 g_value_set_static_string (&value, "hard");
1736 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS,
1738 g_value_set_static_string (&value, "soft");
1739 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS,
1742 g_value_set_static_string (&value, "unknown");
1743 do_simple_exif_tag_serialization_deserialization
1744 (GST_TAG_CAPTURING_METERING_MODE, &value);
1745 g_value_set_static_string (&value, "average");
1746 do_simple_exif_tag_serialization_deserialization
1747 (GST_TAG_CAPTURING_METERING_MODE, &value);
1748 g_value_set_static_string (&value, "center-weighted-average");
1749 do_simple_exif_tag_serialization_deserialization
1750 (GST_TAG_CAPTURING_METERING_MODE, &value);
1751 g_value_set_static_string (&value, "spot");
1752 do_simple_exif_tag_serialization_deserialization
1753 (GST_TAG_CAPTURING_METERING_MODE, &value);
1754 g_value_set_static_string (&value, "multi-spot");
1755 do_simple_exif_tag_serialization_deserialization
1756 (GST_TAG_CAPTURING_METERING_MODE, &value);
1757 g_value_set_static_string (&value, "pattern");
1758 do_simple_exif_tag_serialization_deserialization
1759 (GST_TAG_CAPTURING_METERING_MODE, &value);
1760 g_value_set_static_string (&value, "partial");
1761 do_simple_exif_tag_serialization_deserialization
1762 (GST_TAG_CAPTURING_METERING_MODE, &value);
1763 g_value_set_static_string (&value, "other");
1764 do_simple_exif_tag_serialization_deserialization
1765 (GST_TAG_CAPTURING_METERING_MODE, &value);
1767 g_value_set_static_string (&value, "dsc");
1768 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
1770 g_value_set_static_string (&value, "other");
1771 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
1773 g_value_set_static_string (&value, "transparent-scanner");
1774 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
1776 g_value_set_static_string (&value, "reflex-scanner");
1777 do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE,
1779 g_value_unset (&value);
1781 g_value_init (&value, G_TYPE_DOUBLE);
1782 g_value_set_double (&value, 40.3456784);
1783 do_simple_exif_tag_serialization_deserialization
1784 (GST_TAG_GEO_LOCATION_LATITUDE, &value);
1785 g_value_set_double (&value, -12.1250865);
1787 do_simple_exif_tag_serialization_deserialization
1788 (GST_TAG_GEO_LOCATION_LATITUDE, &value);
1789 g_value_set_double (&value, 0);
1790 do_simple_exif_tag_serialization_deserialization
1791 (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
1792 g_value_set_double (&value, 65.0);
1793 do_simple_exif_tag_serialization_deserialization
1794 (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
1795 g_value_set_double (&value, -0.75);
1796 do_simple_exif_tag_serialization_deserialization
1797 (GST_TAG_GEO_LOCATION_LONGITUDE, &value);
1799 g_value_set_double (&value, 0.0);
1800 do_simple_exif_tag_serialization_deserialization
1801 (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
1802 g_value_set_double (&value, 180.5);
1803 do_simple_exif_tag_serialization_deserialization
1804 (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value);
1805 g_value_set_double (&value, 0.12345);
1806 do_simple_exif_tag_serialization_deserialization
1807 (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
1808 g_value_set_double (&value, 359.9);
1809 do_simple_exif_tag_serialization_deserialization
1810 (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value);
1812 g_value_set_double (&value, 0.0);
1813 do_simple_exif_tag_serialization_deserialization
1814 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1815 g_value_set_double (&value, 321.456);
1816 do_simple_exif_tag_serialization_deserialization
1817 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1818 g_value_set_double (&value, -12.56);
1819 do_simple_exif_tag_serialization_deserialization
1820 (GST_TAG_GEO_LOCATION_ELEVATION, &value);
1822 g_value_set_double (&value, 0);
1823 do_simple_exif_tag_serialization_deserialization
1824 (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
1825 g_value_set_double (&value, 100 / 3.6);
1826 do_simple_exif_tag_serialization_deserialization
1827 (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value);
1829 g_value_set_double (&value, 0);
1830 do_simple_exif_tag_serialization_deserialization
1831 (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, &value);
1832 g_value_set_double (&value, 50.25);
1833 do_simple_exif_tag_serialization_deserialization
1834 (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, &value);
1836 g_value_set_double (&value, 0);
1837 do_simple_exif_tag_serialization_deserialization
1838 (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value);
1839 g_value_set_double (&value, 2.5);
1840 do_simple_exif_tag_serialization_deserialization
1841 (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value);
1842 g_value_set_double (&value, 8.75);
1843 do_simple_exif_tag_serialization_deserialization
1844 (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value);
1846 g_value_set_double (&value, 20.0);
1847 do_simple_exif_tag_serialization_deserialization
1848 (GST_TAG_CAPTURING_FOCAL_LENGTH, &value);
1849 g_value_set_double (&value, 5.5);
1850 do_simple_exif_tag_serialization_deserialization
1851 (GST_TAG_CAPTURING_FOCAL_LENGTH, &value);
1853 g_value_set_double (&value, 16);
1854 do_simple_exif_tag_serialization_deserialization
1855 (GST_TAG_CAPTURING_FOCAL_RATIO, &value);
1856 g_value_set_double (&value, 2.7);
1857 do_simple_exif_tag_serialization_deserialization
1858 (GST_TAG_CAPTURING_FOCAL_LENGTH, &value);
1860 g_value_set_double (&value, 96.0);
1861 do_simple_exif_tag_serialization_deserialization
1862 (GST_TAG_IMAGE_HORIZONTAL_PPI, &value);
1863 g_value_set_double (&value, 300.0);
1864 do_simple_exif_tag_serialization_deserialization
1865 (GST_TAG_IMAGE_HORIZONTAL_PPI, &value);
1866 g_value_set_double (&value, 87.5);
1867 do_simple_exif_tag_serialization_deserialization
1868 (GST_TAG_IMAGE_VERTICAL_PPI, &value);
1869 g_value_set_double (&value, 600.0);
1870 do_simple_exif_tag_serialization_deserialization
1871 (GST_TAG_IMAGE_VERTICAL_PPI, &value);
1873 g_value_set_double (&value, 0.0);
1874 do_simple_exif_tag_serialization_deserialization
1875 (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
1876 g_value_set_double (&value, 1.0);
1877 do_simple_exif_tag_serialization_deserialization
1878 (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
1879 g_value_set_double (&value, -2.5);
1880 do_simple_exif_tag_serialization_deserialization
1881 (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value);
1883 g_value_set_double (&value, 50.0);
1884 do_simple_exif_tag_serialization_deserialization
1885 (GST_TAG_CAPTURING_FOCAL_LENGTH_35_MM, &value);
1886 g_value_unset (&value);
1888 g_value_init (&value, G_TYPE_INT);
1889 g_value_set_int (&value, 400);
1890 do_simple_exif_tag_serialization_deserialization
1891 (GST_TAG_CAPTURING_ISO_SPEED, &value);
1892 g_value_set_int (&value, 1600);
1893 do_simple_exif_tag_serialization_deserialization
1894 (GST_TAG_CAPTURING_ISO_SPEED, &value);
1895 g_value_unset (&value);
1897 g_value_init (&value, GST_TYPE_DATE_TIME);
1898 datetime = gst_date_time_new_local_time (2010, 6, 22, 12, 5, 10);
1899 g_value_set_boxed (&value, datetime);
1900 gst_date_time_unref (datetime);
1901 do_simple_exif_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value);
1902 g_value_unset (&value);
1904 g_value_init (&value, GST_TYPE_SAMPLE);
1905 buf = gst_buffer_new_and_alloc (1024);
1906 gst_buffer_map (buf, &map, GST_MAP_WRITE);
1908 for (i = 0; i < 1024; i++)
1910 gst_buffer_unmap (buf, &map);
1911 gst_value_take_sample (&value, gst_sample_new (buf, NULL, NULL, NULL));
1912 gst_buffer_unref (buf);
1913 do_simple_exif_tag_serialization_deserialization (GST_TAG_APPLICATION_DATA,
1915 g_value_unset (&value);
1917 g_value_init (&value, GST_TYPE_FRACTION);
1918 gst_value_set_fraction (&value, 1, 1);
1919 do_simple_exif_tag_serialization_deserialization
1920 (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
1921 gst_value_set_fraction (&value, 1, 30);
1922 do_simple_exif_tag_serialization_deserialization
1923 (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
1924 gst_value_set_fraction (&value, 1, 200);
1925 do_simple_exif_tag_serialization_deserialization
1926 (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
1927 gst_value_set_fraction (&value, 1, 8000);
1928 do_simple_exif_tag_serialization_deserialization
1929 (GST_TAG_CAPTURING_SHUTTER_SPEED, &value);
1930 g_value_unset (&value);
1932 /* flash is a little bit more tricky, because 2 tags are merged into 1 in
1934 taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, FALSE,
1935 GST_TAG_CAPTURING_FLASH_MODE, "auto", NULL);
1936 do_exif_tag_serialization_deserialization (taglist);
1937 gst_tag_list_unref (taglist);
1939 taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, TRUE,
1940 GST_TAG_CAPTURING_FLASH_MODE, "auto", NULL);
1941 do_exif_tag_serialization_deserialization (taglist);
1942 gst_tag_list_unref (taglist);
1944 taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, FALSE,
1945 GST_TAG_CAPTURING_FLASH_MODE, "never", NULL);
1946 do_exif_tag_serialization_deserialization (taglist);
1947 gst_tag_list_unref (taglist);
1949 taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, TRUE,
1950 GST_TAG_CAPTURING_FLASH_MODE, "always", NULL);
1951 do_exif_tag_serialization_deserialization (taglist);
1952 gst_tag_list_unref (taglist);
1960 Suite *s = suite_create ("tag support library");
1961 TCase *tc_chain = tcase_create ("general");
1963 suite_add_tcase (s, tc_chain);
1964 tcase_add_test (tc_chain, test_musicbrainz_tag_registration);
1965 tcase_add_test (tc_chain, test_parse_extended_comment);
1966 tcase_add_test (tc_chain, test_vorbis_tags);
1967 tcase_add_test (tc_chain, test_id3_tags);
1968 tcase_add_test (tc_chain, test_id3v1_utf8_tag);
1969 tcase_add_test (tc_chain, test_id3v2_priv_tag);
1970 tcase_add_test (tc_chain, test_id3v2_extended_header);
1971 tcase_add_test (tc_chain, test_id3v2_string_list_utf16);
1972 tcase_add_test (tc_chain, test_language_utils);
1973 tcase_add_test (tc_chain, test_license_utils);
1974 tcase_add_test (tc_chain, test_xmp_formatting);
1975 tcase_add_test (tc_chain, test_xmp_parsing);
1976 tcase_add_test (tc_chain, test_xmp_tags_serialization_deserialization);
1977 tcase_add_test (tc_chain, test_xmp_compound_tags);
1978 tcase_add_test (tc_chain, test_exif_parsing);
1979 tcase_add_test (tc_chain, test_exif_tags_serialization_deserialization);
1980 tcase_add_test (tc_chain, test_exif_multiple_tags);
1984 GST_CHECK_MAIN (tag);