From: Tim-Philipp Müller Date: Fri, 9 Mar 2012 20:54:00 +0000 (+0000) Subject: riff: extract track number and album artist tags from INFO chunks X-Git-Tag: 1.19.3~511^2~6555^2~41 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b2d066f49cd07a590440d009b05a1b1bd6d703bc;p=platform%2Fupstream%2Fgstreamer.git riff: extract track number and album artist tags from INFO chunks https://bugzilla.gnome.org/show_bug.cgi?id=670286 --- diff --git a/gst-libs/gst/riff/riff-ids.h b/gst-libs/gst/riff/riff-ids.h index 106f71a..afe8770 100644 --- a/gst-libs/gst/riff/riff-ids.h +++ b/gst-libs/gst/riff/riff-ids.h @@ -104,6 +104,9 @@ G_BEGIN_DECLS #define GST_RIFF_INFO_ISRF GST_MAKE_FOURCC ('I','S','R','F') /* source form */ #define GST_RIFF_INFO_ITCH GST_MAKE_FOURCC ('I','T','C','H') /* technician(s) */ +#define GST_RIFF_INFO_IAAR GST_MAKE_FOURCC ('I','A','A','R') /* album artist */ +#define GST_RIFF_INFO_ITRK GST_MAKE_FOURCC ('I','T','R','K') /* track number */ + /*********Chunk Names***************/ #define GST_RIFF_FF00 GST_MAKE_FOURCC (0xFF,0xFF,0x00,0x00) #define GST_RIFF_00 GST_MAKE_FOURCC ('0', '0',0x00,0x00) diff --git a/gst-libs/gst/riff/riff-read.c b/gst-libs/gst/riff/riff-read.c index d73832d..512f31a 100644 --- a/gst-libs/gst/riff/riff-read.c +++ b/gst-libs/gst/riff/riff-read.c @@ -620,6 +620,9 @@ gst_riff_parse_info (GstElement * element, while (size > 8) { tag = GST_READ_UINT32_LE (data); tsize = GST_READ_UINT32_LE (data + 4); + + GST_MEMDUMP_OBJECT (element, "tag chunk", data, MIN (tsize + 8, size)); + size -= 8; data += 8; @@ -640,6 +643,9 @@ gst_riff_parse_info (GstElement * element, case GST_RIFF_INFO_IARL: type = GST_TAG_LOCATION; break; + case GST_RIFF_INFO_IAAR: + type = GST_TAG_ALBUM_ARTIST; + break; case GST_RIFF_INFO_IART: type = GST_TAG_ARTIST; break; @@ -706,6 +712,9 @@ gst_riff_parse_info (GstElement * element, case GST_RIFF_INFO_ITCH: type = NULL; /*"Technician"; */ break; + case GST_RIFF_INFO_ITRK: + type = GST_TAG_TRACK_NUMBER; + break; default: type = NULL; GST_WARNING_OBJECT (element, @@ -718,12 +727,31 @@ gst_riff_parse_info (GstElement * element, static const gchar *env_vars[] = { "GST_AVI_TAG_ENCODING", "GST_RIFF_TAG_ENCODING", "GST_TAG_ENCODING", NULL }; + GType tag_type; gchar *val; + GST_DEBUG_OBJECT (element, "mapped tag %" GST_FOURCC_FORMAT " to tag %s", + GST_FOURCC_ARGS (tag), type); + + tag_type = gst_tag_get_type (type); val = gst_tag_freeform_string_to_utf8 ((gchar *) data, tsize, env_vars); - if (val) { - gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, val, NULL); + if (val != NULL) { + if (tag_type == G_TYPE_STRING) { + gst_tag_list_add (taglist, GST_TAG_MERGE_APPEND, type, val, NULL); + } else { + GValue tag_val = { 0, }; + + g_value_init (&tag_val, tag_type); + if (gst_value_deserialize (&tag_val, val)) { + gst_tag_list_add_value (taglist, GST_TAG_MERGE_APPEND, type, + &tag_val); + } else { + GST_WARNING_OBJECT (element, "could not deserialize '%s' into a " + "tag %s of type %s", val, type, g_type_name (tag_type)); + } + g_value_unset (&tag_val); + } g_free (val); } else { GST_WARNING_OBJECT (element, "could not extract %s tag", type); @@ -741,6 +769,7 @@ gst_riff_parse_info (GstElement * element, } if (!gst_tag_list_is_empty (taglist)) { + GST_INFO_OBJECT (element, "extracted tags: %" GST_PTR_FORMAT, taglist); *_taglist = taglist; } else { *_taglist = NULL;