| /* GStreamer |
| * |
| * unit tests for the tag support library |
| * |
| * Copyright (C) 2006-2011 Tim-Philipp Müller <tim centricular net> |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Library General Public |
| * License as published by the Free Software Foundation; either |
| * version 2 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Library General Public License for more details. |
| * |
| * You should have received a copy of the GNU Library General Public |
| * License along with this library; if not, write to the |
| * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, |
| * Boston, MA 02110-1301, USA. |
| */ |
| |
| #ifdef HAVE_CONFIG_H |
| #include "config.h" |
| #endif |
| |
| #include <gst/check/gstcheck.h> |
| |
| #include <gst/tag/tag.h> |
| #include <gst/base/gstbytewriter.h> |
| #include <string.h> |
| #include <locale.h> |
| |
| GST_START_TEST (test_parse_extended_comment) |
| { |
| gchar *key, *val, *lang; |
| |
| /* first check the g_return_val_if_fail conditions */ |
| ASSERT_CRITICAL (gst_tag_parse_extended_comment (NULL, NULL, NULL, NULL, |
| FALSE)); |
| ASSERT_CRITICAL (gst_tag_parse_extended_comment ("\377\000", NULL, NULL, NULL, |
| FALSE)); |
| |
| key = val = lang = NULL; |
| fail_unless (gst_tag_parse_extended_comment ("a=b", &key, &lang, &val, |
| FALSE) == TRUE); |
| fail_unless (key != NULL); |
| fail_unless (lang == NULL); |
| fail_unless (val != NULL); |
| fail_unless_equals_string (key, "a"); |
| fail_unless_equals_string (val, "b"); |
| g_free (key); |
| g_free (lang); |
| g_free (val); |
| |
| key = val = lang = NULL; |
| fail_unless (gst_tag_parse_extended_comment ("a[l]=b", &key, &lang, &val, |
| FALSE) == TRUE); |
| fail_unless (key != NULL); |
| fail_unless (lang != NULL); |
| fail_unless (val != NULL); |
| fail_unless_equals_string (key, "a"); |
| fail_unless_equals_string (lang, "l"); |
| fail_unless_equals_string (val, "b"); |
| g_free (key); |
| g_free (lang); |
| g_free (val); |
| |
| key = val = lang = NULL; |
| fail_unless (gst_tag_parse_extended_comment ("foo=bar", &key, &lang, &val, |
| FALSE) == TRUE); |
| fail_unless (key != NULL); |
| fail_unless (lang == NULL); |
| fail_unless (val != NULL); |
| fail_unless_equals_string (key, "foo"); |
| fail_unless_equals_string (val, "bar"); |
| g_free (key); |
| g_free (lang); |
| g_free (val); |
| |
| key = val = lang = NULL; |
| fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", &key, &lang, &val, |
| FALSE) == TRUE); |
| fail_unless (key != NULL); |
| fail_unless (lang != NULL); |
| fail_unless (val != NULL); |
| fail_unless_equals_string (key, "foo"); |
| fail_unless_equals_string (lang, "fr"); |
| fail_unless_equals_string (val, "bar"); |
| g_free (key); |
| g_free (lang); |
| g_free (val); |
| |
| key = val = lang = NULL; |
| fail_unless (gst_tag_parse_extended_comment ("foo=[fr]bar", &key, &lang, &val, |
| FALSE) == TRUE); |
| fail_unless (key != NULL); |
| fail_unless (lang == NULL); |
| fail_unless (val != NULL); |
| fail_unless_equals_string (key, "foo"); |
| fail_unless_equals_string (val, "[fr]bar"); |
| g_free (key); |
| g_free (lang); |
| g_free (val); |
| |
| /* test NULL for output locations */ |
| fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", NULL, NULL, NULL, |
| FALSE) == TRUE); |
| |
| /* test strict mode (key must be specified) */ |
| fail_unless (gst_tag_parse_extended_comment ("foo[fr]=bar", NULL, NULL, NULL, |
| TRUE) == TRUE); |
| fail_unless (gst_tag_parse_extended_comment ("foo=bar", NULL, NULL, NULL, |
| TRUE) == TRUE); |
| fail_unless (gst_tag_parse_extended_comment ("foobar", NULL, NULL, NULL, |
| TRUE) == FALSE); |
| |
| /* test non-strict mode (if there's no key, that's fine too) */ |
| fail_unless (gst_tag_parse_extended_comment ("foobar", NULL, NULL, NULL, |
| FALSE) == TRUE); |
| fail_unless (gst_tag_parse_extended_comment ("[fr]bar", NULL, NULL, NULL, |
| FALSE) == TRUE); |
| |
| key = val = lang = NULL; |
| fail_unless (gst_tag_parse_extended_comment ("[fr]bar", &key, &lang, &val, |
| FALSE) == TRUE); |
| fail_unless (key == NULL); |
| fail_unless (lang == NULL); |
| fail_unless (val != NULL); |
| fail_unless_equals_string (val, "[fr]bar"); |
| g_free (key); |
| g_free (lang); |
| g_free (val); |
| } |
| |
| GST_END_TEST; |
| |
| #define ASSERT_TAG_LIST_HAS_STRING(list,field,string) \ |
| { \ |
| gboolean got_match = FALSE; \ |
| guint i, size; \ |
| \ |
| fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \ |
| size = gst_tag_list_get_tag_size (list,field); \ |
| for (i = 0; i < size; ++i) { \ |
| gchar *___s = NULL; \ |
| \ |
| fail_unless (gst_tag_list_get_string_index (list, field, i, &___s)); \ |
| fail_unless (___s != NULL); \ |
| if (g_str_equal (___s, string)) { \ |
| got_match = TRUE; \ |
| g_free (___s); \ |
| break; \ |
| } \ |
| g_free (___s); \ |
| } \ |
| fail_unless (got_match); \ |
| } |
| |
| #define ASSERT_TAG_LIST_HAS_UINT(list,field,num) \ |
| { \ |
| guint ___n; \ |
| \ |
| fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \ |
| fail_unless (gst_tag_list_get_tag_size (list,field) == 1); \ |
| fail_unless (gst_tag_list_get_uint_index (list, field, 0, &___n)); \ |
| fail_unless_equals_int (___n, num); \ |
| } |
| |
| #define MATCH_DOUBLE(p1, p2) ((p1 < p2 + 1e-6) && (p2 < p1 + 1e-6)) |
| #define ASSERT_TAG_LIST_HAS_DOUBLE(list,field,d) \ |
| { \ |
| gdouble ___d; \ |
| \ |
| fail_unless (gst_tag_list_get_tag_size (list,field) > 0); \ |
| fail_unless (gst_tag_list_get_tag_size (list,field) == 1); \ |
| fail_unless (gst_tag_list_get_double_index (list, field, 0, &___d)); \ |
| fail_unless (MATCH_DOUBLE (d, ___d), \ |
| "%f does not match expected %f", ___d, d); \ |
| } |
| |
| GST_START_TEST (test_musicbrainz_tag_registration) |
| { |
| GstTagList *list; |
| |
| gst_tag_register_musicbrainz_tags (); |
| |
| list = gst_tag_list_new_empty (); |
| |
| /* musicbrainz tags aren't registered yet */ |
| gst_vorbis_tag_add (list, "MUSICBRAINZ_TRACKID", "123456"); |
| gst_vorbis_tag_add (list, "MUSICBRAINZ_ARTISTID", "234567"); |
| gst_vorbis_tag_add (list, "MUSICBRAINZ_ALBUMID", "345678"); |
| gst_vorbis_tag_add (list, "MUSICBRAINZ_ALBUMARTISTID", "4567890"); |
| gst_vorbis_tag_add (list, "MUSICBRAINZ_TRMID", "5678901"); |
| /* MUSICBRAINZ_SORTNAME = GST_TAG_ARTIST_SORTNAME now */ |
| gst_vorbis_tag_add (list, "MUSICBRAINZ_SORTNAME", "Five, 678901"); |
| |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_TRACKID, "123456"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ARTISTID, "234567"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ALBUMID, "345678"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_ALBUMARTISTID, |
| "4567890"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_MUSICBRAINZ_TRMID, "5678901"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST_SORTNAME, "Five, 678901"); |
| |
| gst_tag_list_unref (list); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (test_vorbis_tags) |
| { |
| GstTagList *list; |
| |
| list = gst_tag_list_new_empty (); |
| |
| /* NULL pointers aren't allowed */ |
| ASSERT_CRITICAL (gst_vorbis_tag_add (NULL, "key", "value")); |
| ASSERT_CRITICAL (gst_vorbis_tag_add (list, NULL, "value")); |
| ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key", NULL)); |
| |
| /* must be UTF-8 */ |
| ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key", "v\377lue")); |
| ASSERT_CRITICAL (gst_vorbis_tag_add (list, "k\377y", "value")); |
| |
| /* key can't have a '=' in it */ |
| ASSERT_CRITICAL (gst_vorbis_tag_add (list, "k=y", "value")); |
| ASSERT_CRITICAL (gst_vorbis_tag_add (list, "key=", "value")); |
| |
| /* should be allowed in values though */ |
| gst_vorbis_tag_add (list, "keeey", "va=ue"); |
| |
| /* add some tags */ |
| gst_vorbis_tag_add (list, "TITLE", "Too"); |
| gst_vorbis_tag_add (list, "ALBUM", "Aoo"); |
| gst_vorbis_tag_add (list, "ARTIST", "Alboo"); |
| gst_vorbis_tag_add (list, "PERFORMER", "Perfoo"); |
| gst_vorbis_tag_add (list, "COPYRIGHT", "Copyfoo"); |
| gst_vorbis_tag_add (list, "DESCRIPTION", "Descoo"); |
| gst_vorbis_tag_add (list, "LICENSE", "Licoo"); |
| gst_vorbis_tag_add (list, "LICENSE", |
| "http://creativecommons.org/licenses/by/3.0/"); |
| gst_vorbis_tag_add (list, "LOCATION", "Bristol, UK"); |
| gst_vorbis_tag_add (list, "ORGANIZATION", "Orgoo"); |
| gst_vorbis_tag_add (list, "GENRE", "Goo"); |
| gst_vorbis_tag_add (list, "CONTACT", "Coo"); |
| gst_vorbis_tag_add (list, "COMMENT", "Stroodle is good"); |
| gst_vorbis_tag_add (list, "COMMENT", "Peroxysulfid stroodles the brain"); |
| |
| gst_vorbis_tag_add (list, "TRACKNUMBER", "5"); |
| gst_vorbis_tag_add (list, "TRACKTOTAL", "77"); |
| gst_vorbis_tag_add (list, "DISCNUMBER", "1"); |
| gst_vorbis_tag_add (list, "DISCTOTAL", "2"); |
| gst_vorbis_tag_add (list, "DATE", "1954-12-31"); |
| |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_TITLE, "Too"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ALBUM, "Aoo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "Alboo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_PERFORMER, "Perfoo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COPYRIGHT, "Copyfoo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_DESCRIPTION, "Descoo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LICENSE, "Licoo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LICENSE_URI, |
| "http://creativecommons.org/licenses/by/3.0/"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_GEO_LOCATION_NAME, "Bristol, UK"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ORGANIZATION, "Orgoo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_GENRE, "Goo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_CONTACT, "Coo"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COMMENT, |
| "Peroxysulfid stroodles the brain"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_COMMENT, "Stroodle is good"); |
| ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_TRACK_NUMBER, 5); |
| ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_TRACK_COUNT, 77); |
| ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_ALBUM_VOLUME_NUMBER, 1); |
| ASSERT_TAG_LIST_HAS_UINT (list, GST_TAG_ALBUM_VOLUME_COUNT, 2); |
| |
| { |
| GstDateTime *dt = NULL; |
| |
| fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt)); |
| fail_unless (dt != NULL); |
| fail_unless (gst_date_time_get_day (dt) == 31); |
| fail_unless (gst_date_time_get_month (dt) == 12); |
| fail_unless (gst_date_time_get_year (dt) == 1954); |
| fail_unless (!gst_date_time_has_time (dt)); |
| |
| gst_date_time_unref (dt); |
| } |
| |
| /* unknown vorbis comments should go into a GST_TAG_EXTENDED_COMMENT */ |
| gst_vorbis_tag_add (list, "CoEdSub_ID", "98172AF-973-10-B"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_EXTENDED_COMMENT, |
| "CoEdSub_ID=98172AF-973-10-B"); |
| gst_vorbis_tag_add (list, "RuBuWuHash", "1337BA42F91"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_EXTENDED_COMMENT, |
| "RuBuWuHash=1337BA42F91"); |
| |
| gst_vorbis_tag_add (list, "REPLAYGAIN_REFERENCE_LOUDNESS", "89."); |
| ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_REFERENCE_LEVEL, 89.); |
| gst_vorbis_tag_add (list, "REPLAYGAIN_TRACK_GAIN", "+12.36"); |
| ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_TRACK_GAIN, +12.36); |
| gst_vorbis_tag_add (list, "REPLAYGAIN_TRACK_PEAK", "0.96349"); |
| ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_TRACK_PEAK, 0.96349); |
| gst_vorbis_tag_add (list, "REPLAYGAIN_ALBUM_GAIN", "+10.12"); |
| ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_ALBUM_GAIN, +10.12); |
| /* now check that we can parse floating point numbers with any separator |
| * (',' or '.') regardless of the current locale */ |
| gst_vorbis_tag_add (list, "REPLAYGAIN_ALBUM_PEAK", "0,98107"); |
| ASSERT_TAG_LIST_HAS_DOUBLE (list, GST_TAG_ALBUM_PEAK, 0.98107); |
| gst_vorbis_tag_add (list, "LICENSE", "http://foo.com/license-1.html"); |
| |
| /* make sure we can convert back and forth without loss */ |
| { |
| GstTagList *new_list, *even_newer_list; |
| GstBuffer *buf, *buf2; |
| gchar *vendor_id = NULL; |
| |
| buf = gst_tag_list_to_vorbiscomment_buffer (list, |
| (const guint8 *) "\003vorbis", 7, "libgstunittest"); |
| fail_unless (buf != NULL); |
| new_list = gst_tag_list_from_vorbiscomment_buffer (buf, |
| (const guint8 *) "\003vorbis", 7, &vendor_id); |
| fail_unless (new_list != NULL); |
| fail_unless (vendor_id != NULL); |
| g_free (vendor_id); |
| vendor_id = NULL; |
| |
| GST_LOG ("new_list = %" GST_PTR_FORMAT, new_list); |
| fail_unless (gst_tag_list_is_equal (list, new_list)); |
| |
| buf2 = gst_tag_list_to_vorbiscomment_buffer (new_list, |
| (const guint8 *) "\003vorbis", 7, "libgstunittest"); |
| fail_unless (buf2 != NULL); |
| even_newer_list = gst_tag_list_from_vorbiscomment_buffer (buf2, |
| (const guint8 *) "\003vorbis", 7, &vendor_id); |
| fail_unless (even_newer_list != NULL); |
| fail_unless (vendor_id != NULL); |
| g_free (vendor_id); |
| vendor_id = NULL; |
| |
| GST_LOG ("even_newer_list = %" GST_PTR_FORMAT, even_newer_list); |
| fail_unless (gst_tag_list_is_equal (new_list, even_newer_list)); |
| |
| gst_tag_list_unref (new_list); |
| gst_tag_list_unref (even_newer_list); |
| gst_buffer_unref (buf); |
| gst_buffer_unref (buf2); |
| } |
| |
| /* there can only be one language per taglist ... */ |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "fr"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr"); |
| |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "[fr]"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr"); |
| |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "French [fr]"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "fr"); |
| |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "[eng] English"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng"); |
| |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "eng"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng"); |
| |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "[eng]"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "eng"); |
| |
| /* free-form *sigh* */ |
| gst_tag_list_unref (list); |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "LANGUAGE", "English"); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_LANGUAGE_CODE, "English"); |
| |
| /* now, while we still have a taglist, test _to_vorbiscomment_buffer() */ |
| { |
| GstBuffer *buf1, *buf2; |
| GstMapInfo map1, map2; |
| |
| ASSERT_CRITICAL (gst_tag_list_to_vorbiscomment_buffer (NULL, |
| (const guint8 *) "x", 1, "x")); |
| |
| buf1 = gst_tag_list_to_vorbiscomment_buffer (list, NULL, 0, NULL); |
| fail_unless (buf1 != NULL); |
| |
| buf2 = gst_tag_list_to_vorbiscomment_buffer (list, |
| (const guint8 *) "foo", 3, NULL); |
| fail_unless (buf2 != NULL); |
| |
| gst_buffer_map (buf1, &map1, GST_MAP_READ); |
| gst_buffer_map (buf2, &map2, GST_MAP_READ); |
| |
| fail_unless (memcmp (map1.data, map2.data + 3, map1.size) == 0); |
| |
| gst_buffer_unmap (buf2, &map2); |
| gst_buffer_unmap (buf1, &map1); |
| |
| gst_buffer_unref (buf1); |
| gst_buffer_unref (buf2); |
| } |
| |
| gst_tag_list_unref (list); |
| |
| /* make sure gst_tag_list_from_vorbiscomment_buffer() works with an |
| * empty ID (for Speex) */ |
| { |
| const guint8 speex_comments_buf1[] = { 0x03, 0x00, 0x00, 0x00, 'f', 'o', |
| 'o', 0x00, 0x00, 0x00, 0x00 |
| }; |
| GstBuffer *buf; |
| gchar *vendor = NULL; |
| |
| buf = gst_buffer_new (); |
| gst_buffer_append_memory (buf, |
| gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, |
| (gpointer) speex_comments_buf1, |
| sizeof (speex_comments_buf1), 0, sizeof (speex_comments_buf1), NULL, |
| NULL)); |
| |
| /* make sure it doesn't memcmp over the end of the buffer */ |
| fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf, |
| (const guint8 *) "averylongstringbrownfoxjumpoverthefence", 39, |
| &vendor) == NULL); |
| fail_unless (vendor == NULL); |
| |
| /* make sure it bails out if the ID doesn't match */ |
| fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf, |
| (guint8 *) "short", 4, &vendor) == NULL); |
| fail_unless (vendor == NULL); |
| |
| /* now read properly */ |
| list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, &vendor); |
| fail_unless (vendor != NULL); |
| fail_unless_equals_string (vendor, "foo"); |
| fail_unless (list != NULL); |
| fail_unless (gst_tag_list_n_tags (list) == 0); |
| g_free (vendor); |
| gst_tag_list_unref (list); |
| |
| /* now again without vendor */ |
| list = gst_tag_list_from_vorbiscomment_buffer (buf, NULL, 0, NULL); |
| fail_unless (list != NULL); |
| fail_unless (gst_tag_list_n_tags (list) == 0); |
| gst_tag_list_unref (list); |
| |
| gst_buffer_unref (buf); |
| } |
| |
| /* the same with an ID */ |
| { |
| const guint8 vorbis_comments_buf[] = { 0x03, 'v', 'o', 'r', 'b', 'i', 's', |
| 0x03, 0x00, 0x00, 0x00, 'f', 'o', 'o', 0x01, 0x00, 0x00, 0x00, |
| strlen ("ARTIST=foo bar"), 0x00, 0x00, 0x00, 'A', 'R', 'T', 'I', 'S', |
| 'T', '=', 'f', 'o', 'o', ' ', 'b', 'a', 'r' |
| }; |
| GstBuffer *buf; |
| gchar *vendor = NULL; |
| |
| buf = gst_buffer_new (); |
| gst_buffer_append_memory (buf, |
| gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, |
| (gpointer) vorbis_comments_buf, |
| sizeof (vorbis_comments_buf), 0, sizeof (vorbis_comments_buf), NULL, |
| NULL)); |
| |
| /* make sure it doesn't memcmp over the end of the buffer */ |
| fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf, |
| (const guint8 *) "averylongstringbrownfoxjumpoverthefence", 39, |
| &vendor) == NULL); |
| fail_unless (vendor == NULL); |
| |
| /* make sure it bails out if the ID doesn't match */ |
| fail_unless (gst_tag_list_from_vorbiscomment_buffer (buf, |
| (guint8 *) "short", 4, &vendor) == NULL); |
| fail_unless (vendor == NULL); |
| |
| /* now read properly */ |
| list = gst_tag_list_from_vorbiscomment_buffer (buf, |
| (guint8 *) "\003vorbis", 7, &vendor); |
| fail_unless (vendor != NULL); |
| fail_unless_equals_string (vendor, "foo"); |
| fail_unless (list != NULL); |
| fail_unless (gst_tag_list_n_tags (list) == 1); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "foo bar"); |
| g_free (vendor); |
| gst_tag_list_unref (list); |
| |
| /* now again without vendor */ |
| list = gst_tag_list_from_vorbiscomment_buffer (buf, |
| (guint8 *) "\003vorbis", 7, NULL); |
| fail_unless (list != NULL); |
| fail_unless (gst_tag_list_n_tags (list) == 1); |
| ASSERT_TAG_LIST_HAS_STRING (list, GST_TAG_ARTIST, "foo bar"); |
| gst_tag_list_unref (list); |
| |
| gst_buffer_unref (buf); |
| } |
| |
| /* check date with time */ |
| { |
| GstDateTime *dt = NULL; |
| |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "DATE", "2006-09-25 22:02:38"); |
| |
| fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt)); |
| fail_unless (dt != NULL); |
| fail_unless (gst_date_time_get_day (dt) == 25); |
| fail_unless (gst_date_time_get_month (dt) == 9); |
| fail_unless (gst_date_time_get_year (dt) == 2006); |
| fail_unless (gst_date_time_has_time (dt)); |
| |
| gst_date_time_unref (dt); |
| gst_tag_list_unref (list); |
| } |
| |
| /* check date with month/day of 00-00 */ |
| { |
| GstDateTime *dt = NULL; |
| |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "DATE", "1992-00-00"); |
| |
| fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt)); |
| fail_unless (dt != NULL); |
| fail_unless (gst_date_time_get_year (dt) == 1992); |
| fail_unless (!gst_date_time_has_month (dt)); |
| fail_unless (!gst_date_time_has_day (dt)); |
| fail_unless (!gst_date_time_has_time (dt)); |
| |
| gst_date_time_unref (dt); |
| gst_tag_list_unref (list); |
| } |
| |
| /* check date with valid month, but day of 00 */ |
| { |
| GstDateTime *dt = NULL; |
| |
| list = gst_tag_list_new_empty (); |
| gst_vorbis_tag_add (list, "DATE", "1992-05-00"); |
| |
| fail_unless (gst_tag_list_get_date_time (list, GST_TAG_DATE_TIME, &dt)); |
| fail_unless (dt != NULL); |
| fail_unless (gst_date_time_get_year (dt) == 1992); |
| fail_unless (gst_date_time_get_month (dt) == 5); |
| fail_unless (!gst_date_time_has_day (dt)); |
| fail_unless (!gst_date_time_has_time (dt)); |
| |
| gst_date_time_unref (dt); |
| gst_tag_list_unref (list); |
| } |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (test_id3_tags) |
| { |
| guint i; |
| |
| fail_unless (gst_tag_id3_genre_count () > 0); |
| |
| for (i = 0; i < gst_tag_id3_genre_count (); ++i) { |
| const gchar *genre; |
| |
| genre = gst_tag_id3_genre_get (i); |
| GST_LOG ("genre: %s", genre); |
| fail_unless (genre != NULL); |
| } |
| |
| { |
| /* TODO: GstTagList *gst_tag_list_new_from_id3v1 (const guint8 *data) */ |
| } |
| |
| /* gst_tag_from_id3_tag */ |
| fail_unless (gst_tag_from_id3_tag ("TALB") != NULL); |
| ASSERT_CRITICAL (gst_tag_from_id3_tag (NULL)); |
| fail_unless (gst_tag_from_id3_tag ("R2D2") == NULL); |
| fail_unless_equals_string (gst_tag_from_id3_tag ("WCOP"), |
| GST_TAG_COPYRIGHT_URI); |
| |
| /* gst_tag_from_id3_user_tag */ |
| ASSERT_CRITICAL (gst_tag_from_id3_user_tag (NULL, "foo")); |
| ASSERT_CRITICAL (gst_tag_from_id3_user_tag ("foo", NULL)); |
| fail_unless (gst_tag_from_id3_user_tag ("R2D2", "R2D2") == NULL); |
| |
| /* gst_tag_to_id3_tag */ |
| ASSERT_CRITICAL (gst_tag_to_id3_tag (NULL)); |
| fail_unless (gst_tag_to_id3_tag ("R2D2") == NULL); |
| fail_unless (gst_tag_to_id3_tag (GST_TAG_ARTIST) != NULL); |
| fail_unless_equals_string (gst_tag_to_id3_tag (GST_TAG_COPYRIGHT_URI), |
| "WCOP"); |
| |
| fail_unless (GST_TYPE_TAG_IMAGE_TYPE != 0); |
| fail_unless (g_type_name (GST_TYPE_TAG_IMAGE_TYPE) != NULL); |
| } |
| |
| GST_END_TEST; |
| |
| |
| GST_START_TEST (test_id3v1_utf8_tag) |
| { |
| const guint8 id3v1[128] = { |
| /* marker */ |
| 'T', 'A', 'G', |
| /* title (30 bytes) */ |
| 'D', 0xc3, 0xad, 'v', 'k', 'a', ' ', 's', |
| ' ', 'p', 'e', 'r', 'l', 'a', 'm', 'i', |
| ' ', 'v', 'e', ' ', 'v', 'l', 'a', 's', |
| 'e', 'c', 'h', 0, 0, 0, |
| /* artist (30 bytes) */ |
| 'A', 'l', 'e', 0xc5, 0xa1, ' ', 'B', 'r', 'i', 'c', 'h', 't', 'a', |
| 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| /* album (30 bytes) */ |
| 'B', 'e', 's', 't', ' ', 'o', 'f', ' ', '(', 'P', 'r', 'o', 's', 't', |
| 0xc4, 0x9b, ' ', 0xc3, 0xba, 0xc5, 0xbe, 'a', 's', 'n', 0xc3, 0xbd, ')', |
| 0, 0, 0, |
| /* year (4 bytes) */ |
| '2', '0', '0', '0', |
| /* comment (28 bytes) */ |
| '-', '-', '-', ' ', 0xc4, 0x8d, 'e', 's', 'k', 0xc3, 0xa9, ' ', 'p', |
| 0xc3, 0xad, 's', 'n', 'i', 0xc4, 0x8d, 'k', 'y', ' ', '-', '-', '-', |
| 0, 0, |
| /* track number */ |
| 0, 0, |
| /* genre */ |
| 0x11 |
| }; |
| GstDateTime *dt; |
| GstTagList *tags; |
| gchar *s; |
| |
| /* set this, to make sure UTF-8 strings are really interpreted properly |
| * as UTF-8, regardless of the locale set */ |
| g_setenv ("GST_ID3V1_TAG_ENCODING", "WINDOWS-1250", TRUE); |
| |
| tags = gst_tag_list_new_from_id3v1 (id3v1); |
| fail_unless (tags != NULL); |
| |
| GST_LOG ("Got tags: %" GST_PTR_FORMAT, tags); |
| |
| s = NULL; |
| fail_unless (gst_tag_list_get_string (tags, GST_TAG_TITLE, &s)); |
| fail_unless (s != NULL); |
| fail_unless_equals_string (s, "Dívka s perlami ve vlasech"); |
| g_free (s); |
| |
| s = NULL; |
| fail_unless (gst_tag_list_get_string (tags, GST_TAG_ARTIST, &s)); |
| fail_unless (s != NULL); |
| fail_unless_equals_string (s, "Aleš Brichta"); |
| g_free (s); |
| |
| s = NULL; |
| fail_unless (gst_tag_list_get_string (tags, GST_TAG_ALBUM, &s)); |
| fail_unless (s != NULL); |
| fail_unless_equals_string (s, "Best of (Prostě úžasný)"); |
| g_free (s); |
| |
| dt = NULL; |
| fail_unless (gst_tag_list_get_date_time (tags, GST_TAG_DATE_TIME, &dt)); |
| fail_unless (dt != NULL); |
| fail_unless_equals_int (gst_date_time_get_year (dt), 2000); |
| fail_if (gst_date_time_has_month (dt)); |
| fail_if (gst_date_time_has_day (dt)); |
| fail_if (gst_date_time_has_time (dt)); |
| gst_date_time_unref (dt); |
| dt = NULL; |
| |
| gst_tag_list_unref (tags); |
| |
| g_unsetenv ("GST_ID3V1_TAG_ENCODING"); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (test_id3v2_priv_tag) |
| { |
| const guint8 id3v2[] = { |
| 0x49, 0x44, 0x33, 0x04, 0x00, 0x00, 0x00, 0x00, |
| 0x00, 0x3f, 0x50, 0x52, 0x49, 0x56, 0x00, 0x00, |
| 0x00, 0x35, 0x00, 0x00, 0x63, 0x6f, 0x6d, 0x2e, |
| 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2e, 0x73, 0x74, |
| 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, 0x2e, |
| 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, |
| 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, |
| 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, |
| 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0xbb, |
| 0xa0 |
| }; |
| const GstStructure *s; |
| GstTagList *tags; |
| GstSample *sample = NULL; |
| GstBuffer *buf; |
| GstMapInfo map; |
| gchar *owner = NULL; |
| |
| buf = gst_buffer_new_allocate (NULL, sizeof (id3v2), NULL); |
| gst_buffer_fill (buf, 0, id3v2, sizeof (id3v2)); |
| |
| tags = gst_tag_list_from_id3v2_tag (buf); |
| gst_buffer_unref (buf); |
| |
| fail_if (tags == NULL, "Failed to parse ID3 tag"); |
| |
| GST_LOG ("tags: %" GST_PTR_FORMAT, tags); |
| |
| if (!gst_tag_list_get_sample (tags, GST_TAG_PRIVATE_DATA, &sample)) |
| g_error ("Failed to get PRIVATE_DATA tag"); |
| |
| s = gst_sample_get_info (sample); |
| buf = gst_sample_get_buffer (sample); |
| |
| if (!gst_structure_has_name (s, "ID3PrivateFrame")) |
| g_error ("wrong info name"); |
| |
| gst_structure_get (s, "owner", G_TYPE_STRING, &owner, NULL); |
| fail_unless (owner != NULL); |
| |
| fail_unless_equals_string (owner, |
| "com.apple.streaming.transportStreamTimestamp"); |
| |
| fail_unless_equals_int (gst_buffer_get_size (buf), 8); |
| |
| gst_buffer_map (buf, &map, GST_MAP_READ); |
| GST_MEMDUMP ("private data", map.data, map.size); |
| fail_unless_equals_uint64 (GST_READ_UINT64_BE (map.data), 0x0dbba0); |
| gst_buffer_unmap (buf, &map); |
| g_free (owner); |
| |
| gst_sample_unref (sample); |
| gst_tag_list_unref (tags); |
| } |
| |
| GST_END_TEST |
| GST_START_TEST (test_language_utils) |
| { |
| gchar **lang_codes, **c; |
| |
| #define ASSERT_STRINGS_EQUAL fail_unless_equals_string |
| |
| lang_codes = gst_tag_get_language_codes (); |
| fail_unless (lang_codes != NULL); |
| fail_unless (*lang_codes != NULL); |
| |
| for (c = lang_codes; c != NULL && *c != NULL; ++c) { |
| const gchar *lang_name, *c1, *c2t, *c2b; |
| |
| lang_name = gst_tag_get_language_name (*c); |
| fail_unless (lang_name != NULL); |
| fail_unless (g_utf8_validate (lang_name, -1, NULL)); |
| |
| c1 = gst_tag_get_language_code_iso_639_1 (*c); |
| fail_unless (c1 != NULL); |
| fail_unless (g_utf8_validate (c1, -1, NULL)); |
| |
| c2t = gst_tag_get_language_code_iso_639_2T (*c); |
| fail_unless (c2t != NULL); |
| fail_unless (g_utf8_validate (c2t, -1, NULL)); |
| |
| c2b = gst_tag_get_language_code_iso_639_2B (*c); |
| fail_unless (c2b != NULL); |
| fail_unless (g_utf8_validate (c2b, -1, NULL)); |
| |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (*c), *c); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (c2t), *c); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 (c2b), *c); |
| |
| GST_DEBUG ("[%s] %s %s %s : %s\n", *c, c1, c2t, c2b, lang_name); |
| |
| } |
| g_strfreev (lang_codes); |
| |
| fail_unless (gst_tag_get_language_name ("de") != NULL); |
| fail_unless (gst_tag_get_language_name ("deu") != NULL); |
| fail_unless (gst_tag_get_language_name ("ger") != NULL); |
| fail_unless_equals_string (gst_tag_get_language_name ("deu"), |
| gst_tag_get_language_name ("ger")); |
| fail_unless_equals_string (gst_tag_get_language_name ("de"), |
| gst_tag_get_language_name ("ger")); |
| fail_unless (gst_tag_get_language_name ("de") != |
| gst_tag_get_language_name ("fr")); |
| |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("deu"), "de"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("de"), "de"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code ("ger"), "de"); |
| |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("deu"), "de"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("de"), "de"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_1 ("ger"), "de"); |
| |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("de"), "deu"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("deu"), "deu"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2T ("ger"), "deu"); |
| |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("de"), "ger"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("deu"), "ger"); |
| ASSERT_STRINGS_EQUAL (gst_tag_get_language_code_iso_639_2B ("ger"), "ger"); |
| |
| fail_unless (gst_tag_check_language_code ("de")); |
| fail_unless (gst_tag_check_language_code ("deu")); |
| fail_unless (gst_tag_check_language_code ("ger")); |
| fail_if (gst_tag_check_language_code ("xxx")); |
| fail_if (gst_tag_check_language_code ("und")); |
| fail_if (gst_tag_check_language_code ("un")); |
| fail_if (gst_tag_check_language_code ("")); |
| fail_if (gst_tag_check_language_code ("\377")); |
| fail_if (gst_tag_check_language_code ("deutsch")); |
| } |
| |
| GST_END_TEST; |
| |
| #define SPECIFIC_L "http://creativecommons.org/licenses/by-nc-sa/2.5/scotland/" |
| #define GENERIC_L "http://creativecommons.org/licenses/by/1.0/" |
| #define DERIVED_L "http://creativecommons.org/licenses/sampling+/1.0/tw/" |
| |
| GST_START_TEST (test_license_utils) |
| { |
| GHashTable *ht; |
| GError *err = NULL; |
| gchar **liblicense_refs, **r; |
| gchar **lrefs, **l; |
| gchar *path, *data = NULL; |
| gsize data_len; |
| |
| gst_debug_set_threshold_for_name ("tag-licenses", GST_LEVEL_NONE); |
| |
| /* test jurisdiction-specific license */ |
| fail_unless_equals_int (gst_tag_get_license_flags (SPECIFIC_L), 0x01010703); |
| fail_unless_equals_string (gst_tag_get_license_nick (SPECIFIC_L), |
| "CC BY-NC-SA 2.5 SCOTLAND"); |
| fail_unless_equals_string (gst_tag_get_license_version (SPECIFIC_L), "2.5"); |
| fail_unless_equals_string (gst_tag_get_license_jurisdiction (SPECIFIC_L), |
| "scotland"); |
| |
| g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE); |
| fail_unless_equals_string (gst_tag_get_license_title (SPECIFIC_L), |
| "Attribution-NonCommercial-ShareAlike"); |
| fail_unless (gst_tag_get_license_description (SPECIFIC_L) == NULL); |
| |
| /* test generic license */ |
| fail_unless_equals_int (gst_tag_get_license_flags (GENERIC_L), 0x01000307); |
| fail_unless_equals_string (gst_tag_get_license_nick (GENERIC_L), "CC BY 1.0"); |
| fail_unless_equals_string (gst_tag_get_license_version (GENERIC_L), "1.0"); |
| fail_unless (gst_tag_get_license_jurisdiction (GENERIC_L) == NULL); |
| |
| g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE); |
| fail_unless_equals_string (gst_tag_get_license_title (GENERIC_L), |
| "Attribution"); |
| fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L), |
| "You must attribute the work in the manner specified by the author or licensor."); |
| |
| #ifdef ENABLE_NLS |
| g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "fr", TRUE); |
| fail_unless_equals_string (gst_tag_get_license_title (GENERIC_L), |
| "Paternité"); |
| fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L), |
| "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."); |
| #endif |
| |
| /* test derived (for a certain jurisdiction) license */ |
| fail_unless_equals_int (gst_tag_get_license_flags (DERIVED_L), 0x0100030d); |
| fail_unless_equals_string (gst_tag_get_license_nick (DERIVED_L), |
| "CC SAMPLING+ 1.0 TW"); |
| fail_unless_equals_string (gst_tag_get_license_version (DERIVED_L), "1.0"); |
| fail_unless_equals_string (gst_tag_get_license_jurisdiction (DERIVED_L), |
| "tw"); |
| |
| g_setenv ("GST_TAG_LICENSE_TRANSLATIONS_LANG", "C", TRUE); |
| fail_unless_equals_string (gst_tag_get_license_title (DERIVED_L), |
| "Sampling Plus"); |
| fail_unless_equals_string (gst_tag_get_license_description (GENERIC_L), |
| "You must attribute the work in the manner specified by the author or licensor."); |
| |
| /* test all we know about */ |
| lrefs = gst_tag_get_licenses (); |
| fail_unless (lrefs != NULL); |
| fail_unless (*lrefs != NULL); |
| |
| GST_INFO ("%d licenses", g_strv_length (lrefs)); |
| fail_unless (g_strv_length (lrefs) >= 376); |
| |
| ht = g_hash_table_new (g_str_hash, g_str_equal); |
| |
| for (l = lrefs; l != NULL && *l != NULL; ++l) { |
| const gchar *ref, *nick, *title, *desc G_GNUC_UNUSED; |
| |
| ref = (const gchar *) *l; |
| nick = gst_tag_get_license_nick (ref); |
| title = gst_tag_get_license_title (ref); |
| desc = gst_tag_get_license_description (ref); |
| fail_unless (nick != NULL, "no nick for license '%s'", ref); |
| fail_unless (title != NULL, "no title for license '%s'", ref); |
| GST_LOG ("ref: %s [nick %s]", ref, (nick) ? nick : "none"); |
| GST_TRACE (" %s : %s", title, (desc) ? desc : "(no description)"); |
| |
| /* make sure the list contains no duplicates */ |
| fail_if (g_hash_table_lookup (ht, (gpointer) ref) != NULL); |
| g_hash_table_insert (ht, (gpointer) ref, (gpointer) "meep"); |
| } |
| g_hash_table_destroy (ht); |
| |
| /* trailing slash shouldn't make a difference */ |
| fail_unless_equals_int (gst_tag_get_license_flags |
| ("http://creativecommons.org/licenses/by-nd/1.0/"), |
| gst_tag_get_license_flags |
| ("http://creativecommons.org/licenses/by-nd/1.0")); |
| fail_unless_equals_string (gst_tag_get_license_nick |
| ("http://creativecommons.org/licenses/by-nd/1.0/"), |
| gst_tag_get_license_nick |
| ("http://creativecommons.org/licenses/by-nd/1.0")); |
| fail_unless_equals_int (gst_tag_get_license_flags |
| ("http://creativecommons.org/licenses/by-nd/2.5/ca/"), |
| gst_tag_get_license_flags |
| ("http://creativecommons.org/licenses/by-nd/2.5/ca")); |
| fail_unless_equals_string (gst_tag_get_license_nick |
| ("http://creativecommons.org/licenses/by-nd/2.5/ca/"), |
| gst_tag_get_license_nick |
| ("http://creativecommons.org/licenses/by-nd/2.5/ca")); |
| |
| /* unknown licenses */ |
| fail_unless (gst_tag_get_license_nick |
| ("http://creativecommons.org/licenses/by-nd/25/ca/") == NULL); |
| fail_unless (gst_tag_get_license_flags |
| ("http://creativecommons.org/licenses/by-nd/25/ca") == 0); |
| fail_unless (gst_tag_get_license_jurisdiction |
| ("http://creativecommons.org/licenses/by-nd/25/ca/") == NULL); |
| fail_unless (gst_tag_get_license_jurisdiction |
| ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL); |
| fail_unless (gst_tag_get_license_title |
| ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL); |
| fail_unless (gst_tag_get_license_jurisdiction |
| ("http://creativecommons.org/licenses/by-nd/25/ca") == NULL); |
| |
| /* unknown prefixes even */ |
| fail_unless (gst_tag_get_license_nick |
| ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL); |
| fail_unless (gst_tag_get_license_flags |
| ("http://copycats.org/licenses/by-nd/2.5/ca") == 0); |
| fail_unless (gst_tag_get_license_jurisdiction |
| ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL); |
| fail_unless (gst_tag_get_license_title |
| ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL); |
| fail_unless (gst_tag_get_license_description |
| ("http://copycats.org/licenses/by-nd/2.5/ca/") == NULL); |
| |
| /* read list of liblicense refs from file */ |
| path = g_build_filename (GST_TEST_FILES_PATH, "license-uris", NULL); |
| GST_LOG ("reading file '%s'", path); |
| if (!g_file_get_contents (path, &data, &data_len, &err)) { |
| g_error ("error loading test file: %s", err->message); |
| } |
| |
| while (data_len > 0 && data[data_len - 1] == '\n') { |
| data[--data_len] = '\0'; |
| } |
| |
| liblicense_refs = g_strsplit (data, "\n", -1); |
| g_free (data); |
| g_free (path); |
| |
| fail_unless (g_strv_length (lrefs) >= g_strv_length (liblicense_refs)); |
| |
| for (r = liblicense_refs; r != NULL && *r != NULL; ++r) { |
| GstTagLicenseFlags flags; |
| const gchar *version, *nick, *jur; |
| const gchar *ref = *r; |
| |
| GST_LOG ("liblicense ref: %s", ref); |
| |
| version = gst_tag_get_license_version (ref); |
| if (strstr (ref, "publicdomain") != NULL) |
| fail_unless (version == NULL); |
| else |
| fail_unless (version != NULL, "expected version for license %s", ref); |
| |
| flags = gst_tag_get_license_flags (ref); |
| fail_unless (flags != 0, "expected non-zero flags for license %s", ref); |
| |
| nick = gst_tag_get_license_nick (ref); |
| fail_unless (nick != NULL, "expected nick for license %s", ref); |
| |
| jur = gst_tag_get_license_jurisdiction (ref); |
| if (g_str_has_suffix (ref, "de/")) { |
| fail_unless_equals_string (jur, "de"); |
| } else if (g_str_has_suffix (ref, "scotland")) { |
| fail_unless_equals_string (jur, "scotland"); |
| } else if (g_str_has_suffix (ref, ".0") || g_str_has_suffix (ref, ".1")) { |
| fail_unless (jur == NULL); |
| } |
| } |
| |
| g_strfreev (liblicense_refs); |
| g_strfreev (lrefs); |
| } |
| |
| GST_END_TEST; |
| |
| GST_START_TEST (test_xmp_formatting) |
| { |
| GstTagList *list; |
| GstBuffer *buf; |
| GstMapInfo map; |
| const gchar *text; |
| gsize len; |
| |
| /* test data */ |
| list = gst_tag_list_new (GST_TAG_TITLE, "test title", |
| GST_TAG_DESCRIPTION, "test decription", |
| GST_TAG_KEYWORDS, "keyword1", GST_TAG_KEYWORDS, "keyword2", NULL); |
| |
| buf = gst_tag_list_to_xmp_buffer (list, FALSE, NULL); |
| fail_unless (buf != NULL); |
| |
| gst_buffer_map (buf, &map, GST_MAP_READ); |
| text = (gchar *) map.data; |
| len = map.size; |
| |
| /* check the content */ |
| fail_unless (g_strrstr_len (text, len, "<?xpacket begin") == text); |
| fail_unless (g_strrstr_len (text, len, ">test title<") != NULL); |
| fail_unless (g_strrstr_len (text, len, ">test decription<") != NULL); |
| fail_unless (g_strrstr_len (text, len, ">keyword1<") != NULL); |
| fail_unless (g_strrstr_len (text, len, ">keyword2<") != NULL); |
| fail_unless (g_strrstr_len (text, len, "<?xpacket end") != NULL); |
| gst_buffer_unmap (buf, &map); |
| |
| gst_buffer_unref (buf); |
| gst_tag_list_unref (list); |
| } |
| |
| GST_END_TEST; |
| |
| |
| GST_START_TEST (test_xmp_parsing) |
| { |
| GstTagList *list; |
| GstBuffer *buf; |
| guint i, j, result_size; |
| gchar *text; |
| const gchar *xmp_header = |
| "<?xpacket begin=\"\xEF\xBB\xBF\" id=\"W5M0MpCehiHzreSzNTczkc9d\"?>" |
| "<x:xmpmeta xmlns:x=\"adobe:ns:meta/\" x:xmptk=\"GStreamer\">" |
| "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">"; |
| |
| /* We used to write an extra trailing \n after the footer, keep compatibility |
| * with our old generated media by checking that it still can be parsed */ |
| const gchar *xmp_footers[] = { |
| "</rdf:RDF>" "</x:xmpmeta>" "<?xpacket end=\"r\"?>", |
| "</rdf:RDF>" "</x:xmpmeta>" "<?xpacket end=\"r\"?>\n", |
| NULL |
| }; |
| |
| struct |
| { |
| const gchar *xmp_data; |
| gint result_size; |
| gint result_test; |
| } test_data[] = { |
| { |
| "", -1, -1}, { |
| "<rdf:Description rdf:about=\"\" />", 0, -1}, { |
| "<rdf:Description rdf:about=\"\"></rdf:Description>", 0, -1}, { |
| "<rdf:Description rdf:about=\"\" ></rdf:Description>", 0, -1}, { |
| "<rdf:Description rdf:about=\"\"><dc:description>test</dc:description></rdf:Description>", |
| 1, 0}, { |
| "<rdf:Description rdf:about=\"\" dc:description=\"test\"></rdf:Description>", |
| 1, 0}, { |
| NULL, -1, -1} |
| }; |
| |
| /* test data */ |
| j = 0; |
| i = 0; |
| while (xmp_footers[j]) { |
| while (test_data[i].xmp_data) { |
| gsize len; |
| |
| GST_DEBUG ("trying test-data %u", i); |
| |
| text = |
| g_strconcat (xmp_header, test_data[i].xmp_data, xmp_footers[j], NULL); |
| |
| buf = gst_buffer_new (); |
| len = strlen (text) + 1; |
| gst_buffer_append_memory (buf, |
| gst_memory_new_wrapped (0, text, len, 0, len, NULL, NULL)); |
| |
| list = gst_tag_list_from_xmp_buffer (buf); |
| if (test_data[i].result_size >= 0) { |
| fail_unless (list != NULL); |
| |
| result_size = gst_tag_list_n_tags (list); |
| fail_unless (result_size == test_data[i].result_size); |
| |
| /* check the taglist content */ |
| switch (test_data[i].result_test) { |
| case 0: |
| ASSERT_TAG_LIST_HAS_STRING (list, "description", "test"); |
| break; |
| default: |
| break; |
| } |
| } |
| if (list) |
| gst_tag_list_unref (list); |
| |
| gst_buffer_unref (buf); |
| g_free (text); |
| i++; |
| } |
| j++; |
| } |
| } |
| |
| GST_END_TEST; |
| |
| static void |
| do_xmp_tag_serialization_deserialization (GstTagList * taglist, |
| const gchar ** schemas) |
| { |
| GstTagList *taglist2; |
| GstBuffer *buf; |
| |
| buf = gst_tag_list_to_xmp_buffer (taglist, TRUE, schemas); |
| taglist2 = gst_tag_list_from_xmp_buffer (buf); |
| |
| fail_unless (gst_tag_list_is_equal (taglist, taglist2)); |
| |
| gst_buffer_unref (buf); |
| gst_tag_list_unref (taglist2); |
| } |
| |
| static void |
| do_simple_xmp_tag_serialization_deserialization (const gchar * gsttag, |
| GValue * value) |
| { |
| GstTagList *taglist = gst_tag_list_new_empty (); |
| |
| gst_tag_list_add_value (taglist, GST_TAG_MERGE_REPLACE, gsttag, value); |
| |
| do_xmp_tag_serialization_deserialization (taglist, NULL); |
| gst_tag_list_unref (taglist); |
| } |
| |
| GST_START_TEST (test_xmp_tags_serialization_deserialization) |
| { |
| GValue value = { 0 }; |
| GstDateTime *datetime; |
| |
| gst_tag_register_musicbrainz_tags (); |
| |
| g_value_init (&value, G_TYPE_STRING); |
| g_value_set_static_string (&value, "my string"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_ARTIST, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_COPYRIGHT, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DESCRIPTION, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_KEYWORDS, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_TITLE, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_VIDEO_CODEC, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_GEO_LOCATION_COUNTRY, |
| &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_GEO_LOCATION_CITY, |
| &value); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_SUBLOCATION, &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DEVICE_MANUFACTURER, |
| &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DEVICE_MODEL, |
| &value); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_APPLICATION_NAME, |
| &value); |
| |
| g_value_set_static_string (&value, "rotate-0"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-0"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "rotate-180"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-180"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-270"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "rotate-90"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-90"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "rotate-270"); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| |
| g_value_unset (&value); |
| g_value_init (&value, G_TYPE_DOUBLE); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LATITUDE, &value); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LONGITUDE, &value); |
| g_value_set_double (&value, 10.5); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LATITUDE, &value); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LONGITUDE, &value); |
| g_value_set_double (&value, -32.375); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LATITUDE, &value); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LONGITUDE, &value); |
| |
| g_value_set_double (&value, 0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| g_value_set_double (&value, 100); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| g_value_set_double (&value, 500.25); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| g_value_set_double (&value, -12.75); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value); |
| g_value_set_double (&value, 10.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value); |
| g_value_set_double (&value, 786.125); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value); |
| g_value_set_double (&value, -2.5); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value); |
| g_value_set_double (&value, 180.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value); |
| g_value_set_double (&value, 359.99); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value); |
| g_value_set_double (&value, 90.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value); |
| g_value_set_double (&value, 359.99); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value); |
| g_value_set_double (&value, 1.0); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value); |
| g_value_set_double (&value, -2.5); |
| do_simple_xmp_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, GST_TYPE_DATE_TIME); |
| datetime = gst_date_time_new_ymd (2010, 3, 22); |
| g_value_take_boxed (&value, datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, G_TYPE_UINT); |
| g_value_set_uint (&value, 0); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value); |
| g_value_set_uint (&value, 100); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value); |
| g_value_set_uint (&value, 22); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_USER_RATING, &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, GST_TYPE_DATE_TIME); |
| datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.000125); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.000001); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| datetime = gst_date_time_new (0, 2010, 6, 22, 12, 5, 10.123456); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| datetime = gst_date_time_new (-3, 2010, 6, 22, 12, 5, 10.123456); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| datetime = gst_date_time_new (5, 2010, 6, 22, 12, 5, 10.123456); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| datetime = gst_date_time_new_local_time (2010, 12, 2, 12, 5, 10.000043); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_xmp_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| g_value_unset (&value); |
| } |
| |
| GST_END_TEST; |
| |
| |
| GST_START_TEST (test_xmp_compound_tags) |
| { |
| const gchar *schemas[] = { "Iptc4xmpExt", NULL }; |
| GstTagList *taglist = gst_tag_list_new_empty (); |
| |
| gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_KEYWORDS, "k1", |
| GST_TAG_KEYWORDS, "k2", GST_TAG_TITLE, "title", GST_TAG_KEYWORDS, "k3", |
| NULL); |
| do_xmp_tag_serialization_deserialization (taglist, NULL); |
| gst_tag_list_unref (taglist); |
| |
| taglist = gst_tag_list_new_empty (); |
| gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, GST_TAG_GEO_LOCATION_COUNTRY, |
| "Brazil", GST_TAG_GEO_LOCATION_CITY, "Campina Grande", NULL); |
| do_xmp_tag_serialization_deserialization (taglist, schemas); |
| gst_tag_list_unref (taglist); |
| } |
| |
| GST_END_TEST; |
| |
| |
| GST_START_TEST (test_exif_parsing) |
| { |
| GstTagList *taglist; |
| GstBuffer *buf; |
| GstByteWriter writer; |
| gboolean res = TRUE; |
| const gchar *str = NULL; |
| |
| gst_byte_writer_init (&writer); |
| |
| /* write the IFD */ |
| /* 1 entry */ |
| res &= gst_byte_writer_put_uint16_le (&writer, 1); |
| |
| /* copyright tag */ |
| /* tag id */ |
| res &= gst_byte_writer_put_uint16_le (&writer, 0x8298); |
| /* tag type */ |
| res &= gst_byte_writer_put_uint16_le (&writer, 0x2); |
| /* count */ |
| res &= gst_byte_writer_put_uint32_le (&writer, strlen ("my copyright") + 1); |
| /* offset */ |
| res &= gst_byte_writer_put_uint32_le (&writer, 8 + 14); |
| |
| /* data */ |
| res &= gst_byte_writer_put_string (&writer, "my copyright"); |
| |
| fail_unless (res, "Failed to write tag"); |
| |
| buf = gst_byte_writer_reset_and_get_buffer (&writer); |
| |
| taglist = gst_tag_list_from_exif_buffer (buf, G_LITTLE_ENDIAN, 8); |
| |
| fail_unless (gst_tag_list_get_tag_size (taglist, GST_TAG_COPYRIGHT) == 1); |
| gst_tag_list_peek_string_index (taglist, GST_TAG_COPYRIGHT, 0, &str); |
| fail_unless_equals_string (str, "my copyright"); |
| |
| gst_tag_list_unref (taglist); |
| gst_buffer_unref (buf); |
| } |
| |
| GST_END_TEST; |
| |
| |
| static void |
| do_exif_tag_serialization_deserialization (GstTagList * taglist) |
| { |
| GstTagList *taglist2; |
| GstBuffer *buf; |
| |
| /* LE */ |
| buf = gst_tag_list_to_exif_buffer (taglist, G_LITTLE_ENDIAN, 0); |
| taglist2 = gst_tag_list_from_exif_buffer (buf, G_LITTLE_ENDIAN, 0); |
| gst_buffer_unref (buf); |
| |
| fail_unless (gst_tag_list_is_equal (taglist, taglist2)); |
| gst_tag_list_unref (taglist2); |
| |
| /* BE */ |
| buf = gst_tag_list_to_exif_buffer (taglist, G_BIG_ENDIAN, 0); |
| taglist2 = gst_tag_list_from_exif_buffer (buf, G_BIG_ENDIAN, 0); |
| gst_buffer_unref (buf); |
| |
| fail_unless (gst_tag_list_is_equal (taglist, taglist2)); |
| gst_tag_list_unref (taglist2); |
| |
| /* APP1 */ |
| buf = gst_tag_list_to_exif_buffer_with_tiff_header (taglist); |
| taglist2 = gst_tag_list_from_exif_buffer_with_tiff_header (buf); |
| gst_buffer_unref (buf); |
| |
| fail_unless (gst_tag_list_is_equal (taglist, taglist2)); |
| gst_tag_list_unref (taglist2); |
| } |
| |
| static void |
| do_simple_exif_tag_serialization_deserialization (const gchar * gsttag, |
| GValue * value) |
| { |
| GstTagList *taglist = gst_tag_list_new_empty (); |
| |
| gst_tag_list_add_value (taglist, GST_TAG_MERGE_REPLACE, gsttag, value); |
| do_exif_tag_serialization_deserialization (taglist); |
| |
| gst_tag_list_unref (taglist); |
| } |
| |
| /* |
| * Adds tags from multiple ifd tables and tries serializing them |
| */ |
| GST_START_TEST (test_exif_multiple_tags) |
| { |
| GstTagList *taglist; |
| GstDateTime *datetime; |
| GValue value = { 0 }; |
| |
| gst_tag_register_musicbrainz_tags (); |
| |
| taglist = gst_tag_list_new (GST_TAG_ARTIST, "artist", |
| GST_TAG_DEVICE_MANUFACTURER, "make", |
| GST_TAG_DEVICE_MODEL, "model", GST_TAG_GEO_LOCATION_LATITUDE, 45.5, |
| GST_TAG_GEO_LOCATION_LONGITUDE, -10.25, |
| GST_TAG_IMAGE_HORIZONTAL_PPI, 300.0, |
| GST_TAG_IMAGE_VERTICAL_PPI, 300.0, NULL); |
| |
| g_value_init (&value, GST_TYPE_DATE_TIME); |
| datetime = gst_date_time_new_local_time (2010, 6, 22, 12, 5, 10); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| gst_tag_list_add_value (taglist, GST_TAG_MERGE_APPEND, GST_TAG_DATE_TIME, |
| &value); |
| g_value_unset (&value); |
| |
| do_exif_tag_serialization_deserialization (taglist); |
| |
| gst_tag_list_unref (taglist); |
| } |
| |
| GST_END_TEST; |
| |
| |
| GST_START_TEST (test_exif_tags_serialization_deserialization) |
| { |
| GValue value = { 0 }; |
| GstDateTime *datetime = NULL; |
| GstBuffer *buf = NULL; |
| gint i; |
| GstTagList *taglist; |
| GstMapInfo map; |
| guint8 *data; |
| |
| gst_tag_register_musicbrainz_tags (); |
| |
| g_value_init (&value, G_TYPE_STRING); |
| g_value_set_static_string (&value, "my string"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_COPYRIGHT, &value); |
| g_value_set_static_string (&value, "ty"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value); |
| g_value_set_static_string (&value, "Company Software 1.2b (info)"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_APPLICATION_NAME, |
| &value); |
| |
| /* non ascii chars */ |
| g_value_set_static_string (&value, "AaÄäEeËëIiÏïOoÖöUuÜü"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value); |
| g_value_set_static_string (&value, "Äë"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_ARTIST, &value); |
| |
| /* image orientation tests */ |
| g_value_set_static_string (&value, "rotate-0"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-0"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "rotate-180"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-180"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-270"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "rotate-90"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "flip-rotate-90"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| g_value_set_static_string (&value, "rotate-270"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_IMAGE_ORIENTATION, |
| &value); |
| |
| /* exposure program */ |
| g_value_set_static_string (&value, "undefined"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "manual"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "normal"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "aperture-priority"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "shutter-priority"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "creative"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "action"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "portrait"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| g_value_set_static_string (&value, "landscape"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_PROGRAM, &value); |
| |
| /* exposure mode */ |
| g_value_set_static_string (&value, "auto-exposure"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_MODE, &value); |
| g_value_set_static_string (&value, "manual-exposure"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_MODE, &value); |
| g_value_set_static_string (&value, "auto-bracket"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_MODE, &value); |
| |
| /* scene capture type */ |
| g_value_set_static_string (&value, "standard"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value); |
| g_value_set_static_string (&value, "portrait"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value); |
| g_value_set_static_string (&value, "landscape"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value); |
| g_value_set_static_string (&value, "night-scene"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SCENE_CAPTURE_TYPE, &value); |
| |
| g_value_set_static_string (&value, "none"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value); |
| g_value_set_static_string (&value, "high-gain-up"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value); |
| g_value_set_static_string (&value, "low-gain-up"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value); |
| g_value_set_static_string (&value, "high-gain-down"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value); |
| g_value_set_static_string (&value, "low-gain-down"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_GAIN_ADJUSTMENT, &value); |
| |
| g_value_set_static_string (&value, "auto"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_WHITE_BALANCE, &value); |
| g_value_set_static_string (&value, "manual"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_WHITE_BALANCE, &value); |
| |
| g_value_set_static_string (&value, "normal"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST, |
| &value); |
| g_value_set_static_string (&value, "hard"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST, |
| &value); |
| g_value_set_static_string (&value, "soft"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_CONTRAST, |
| &value); |
| |
| g_value_set_static_string (&value, "normal"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SATURATION, &value); |
| g_value_set_static_string (&value, "low-saturation"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SATURATION, &value); |
| g_value_set_static_string (&value, "high-saturation"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SATURATION, &value); |
| |
| g_value_set_static_string (&value, "normal"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS, |
| &value); |
| g_value_set_static_string (&value, "hard"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS, |
| &value); |
| g_value_set_static_string (&value, "soft"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SHARPNESS, |
| &value); |
| |
| g_value_set_static_string (&value, "unknown"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "average"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "center-weighted-average"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "spot"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "multi-spot"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "pattern"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "partial"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| g_value_set_static_string (&value, "other"); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_METERING_MODE, &value); |
| |
| g_value_set_static_string (&value, "dsc"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE, |
| &value); |
| g_value_set_static_string (&value, "other"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE, |
| &value); |
| g_value_set_static_string (&value, "transparent-scanner"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE, |
| &value); |
| g_value_set_static_string (&value, "reflex-scanner"); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_CAPTURING_SOURCE, |
| &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, G_TYPE_DOUBLE); |
| g_value_set_double (&value, 40.3456784); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LATITUDE, &value); |
| g_value_set_double (&value, -12.1250865); |
| |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LATITUDE, &value); |
| g_value_set_double (&value, 0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LONGITUDE, &value); |
| g_value_set_double (&value, 65.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LONGITUDE, &value); |
| g_value_set_double (&value, -0.75); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_LONGITUDE, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value); |
| g_value_set_double (&value, 180.5); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION, &value); |
| g_value_set_double (&value, 0.12345); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value); |
| g_value_set_double (&value, 359.9); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| g_value_set_double (&value, 321.456); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| g_value_set_double (&value, -12.56); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_ELEVATION, &value); |
| |
| g_value_set_double (&value, 0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value); |
| g_value_set_double (&value, 100 / 3.6); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_MOVEMENT_SPEED, &value); |
| |
| g_value_set_double (&value, 0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, &value); |
| g_value_set_double (&value, 50.25); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR, &value); |
| |
| g_value_set_double (&value, 0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value); |
| g_value_set_double (&value, 2.5); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value); |
| g_value_set_double (&value, 8.75); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_DIGITAL_ZOOM_RATIO, &value); |
| |
| g_value_set_double (&value, 20.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_FOCAL_LENGTH, &value); |
| g_value_set_double (&value, 5.5); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_FOCAL_LENGTH, &value); |
| |
| g_value_set_double (&value, 16); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_FOCAL_RATIO, &value); |
| g_value_set_double (&value, 2.7); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_FOCAL_LENGTH, &value); |
| |
| g_value_set_double (&value, 96.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_IMAGE_HORIZONTAL_PPI, &value); |
| g_value_set_double (&value, 300.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_IMAGE_HORIZONTAL_PPI, &value); |
| g_value_set_double (&value, 87.5); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_IMAGE_VERTICAL_PPI, &value); |
| g_value_set_double (&value, 600.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_IMAGE_VERTICAL_PPI, &value); |
| |
| g_value_set_double (&value, 0.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value); |
| g_value_set_double (&value, 1.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value); |
| g_value_set_double (&value, -2.5); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_EXPOSURE_COMPENSATION, &value); |
| |
| g_value_set_double (&value, 50.0); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_FOCAL_LENGTH_35_MM, &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, G_TYPE_INT); |
| g_value_set_int (&value, 400); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_ISO_SPEED, &value); |
| g_value_set_int (&value, 1600); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_ISO_SPEED, &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, GST_TYPE_DATE_TIME); |
| datetime = gst_date_time_new_local_time (2010, 6, 22, 12, 5, 10); |
| g_value_set_boxed (&value, datetime); |
| gst_date_time_unref (datetime); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_DATE_TIME, &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, GST_TYPE_SAMPLE); |
| buf = gst_buffer_new_and_alloc (1024); |
| gst_buffer_map (buf, &map, GST_MAP_WRITE); |
| data = map.data; |
| for (i = 0; i < 1024; i++) |
| data[i] = i % 255; |
| gst_buffer_unmap (buf, &map); |
| gst_value_take_sample (&value, gst_sample_new (buf, NULL, NULL, NULL)); |
| gst_buffer_unref (buf); |
| do_simple_exif_tag_serialization_deserialization (GST_TAG_APPLICATION_DATA, |
| &value); |
| g_value_unset (&value); |
| |
| g_value_init (&value, GST_TYPE_FRACTION); |
| gst_value_set_fraction (&value, 1, 1); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SHUTTER_SPEED, &value); |
| gst_value_set_fraction (&value, 1, 30); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SHUTTER_SPEED, &value); |
| gst_value_set_fraction (&value, 1, 200); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SHUTTER_SPEED, &value); |
| gst_value_set_fraction (&value, 1, 8000); |
| do_simple_exif_tag_serialization_deserialization |
| (GST_TAG_CAPTURING_SHUTTER_SPEED, &value); |
| g_value_unset (&value); |
| |
| /* flash is a little bit more tricky, because 2 tags are merged into 1 in |
| * exif */ |
| taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, FALSE, |
| GST_TAG_CAPTURING_FLASH_MODE, "auto", NULL); |
| do_exif_tag_serialization_deserialization (taglist); |
| gst_tag_list_unref (taglist); |
| |
| taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, TRUE, |
| GST_TAG_CAPTURING_FLASH_MODE, "auto", NULL); |
| do_exif_tag_serialization_deserialization (taglist); |
| gst_tag_list_unref (taglist); |
| |
| taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, FALSE, |
| GST_TAG_CAPTURING_FLASH_MODE, "never", NULL); |
| do_exif_tag_serialization_deserialization (taglist); |
| gst_tag_list_unref (taglist); |
| |
| taglist = gst_tag_list_new (GST_TAG_CAPTURING_FLASH_FIRED, TRUE, |
| GST_TAG_CAPTURING_FLASH_MODE, "always", NULL); |
| do_exif_tag_serialization_deserialization (taglist); |
| gst_tag_list_unref (taglist); |
| } |
| |
| GST_END_TEST; |
| |
| static Suite * |
| tag_suite (void) |
| { |
| Suite *s = suite_create ("tag support library"); |
| TCase *tc_chain = tcase_create ("general"); |
| |
| suite_add_tcase (s, tc_chain); |
| tcase_add_test (tc_chain, test_musicbrainz_tag_registration); |
| tcase_add_test (tc_chain, test_parse_extended_comment); |
| tcase_add_test (tc_chain, test_vorbis_tags); |
| tcase_add_test (tc_chain, test_id3_tags); |
| tcase_add_test (tc_chain, test_id3v1_utf8_tag); |
| tcase_add_test (tc_chain, test_id3v2_priv_tag); |
| tcase_add_test (tc_chain, test_language_utils); |
| tcase_add_test (tc_chain, test_license_utils); |
| tcase_add_test (tc_chain, test_xmp_formatting); |
| tcase_add_test (tc_chain, test_xmp_parsing); |
| tcase_add_test (tc_chain, test_xmp_tags_serialization_deserialization); |
| tcase_add_test (tc_chain, test_xmp_compound_tags); |
| tcase_add_test (tc_chain, test_exif_parsing); |
| tcase_add_test (tc_chain, test_exif_tags_serialization_deserialization); |
| tcase_add_test (tc_chain, test_exif_multiple_tags); |
| return s; |
| } |
| |
| GST_CHECK_MAIN (tag); |