aiffparse: extract ID3 tags embedded in ID3 chunks
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Thu, 24 Nov 2011 13:49:12 +0000 (13:49 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Sun, 27 Nov 2011 23:19:49 +0000 (23:19 +0000)
https://bugzilla.gnome.org/show_bug.cgi?id=664725

gst/aiff/Makefile.am
gst/aiff/aiff.c
gst/aiff/aiffparse.c
gst/aiff/aiffparse.h

index 8c4a1c5..2eb8392 100644 (file)
@@ -7,6 +7,7 @@ libgstaiff_la_CFLAGS = \
        $(GST_BASE_CFLAGS) \
        $(GST_CFLAGS)
 libgstaiff_la_LIBADD = \
+       $(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_MAJORMINOR) \
        $(GST_BASE_LIBS) \
        $(LIBM)
 libgstaiff_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
index 1e9dfe2..ba89e1a 100644 (file)
@@ -22,6 +22,8 @@
 #include "config.h"
 #endif
 
+#include <gst/tag/tag.h>
+
 #include <gst/gst-i18n-plugin.h>
 
 #include "aiffparse.h"
@@ -54,6 +56,8 @@ plugin_init (GstPlugin * plugin)
   ret &= gst_element_register (plugin, "aiffmux", GST_RANK_PRIMARY,
       GST_TYPE_AIFF_MUX);
 
+  gst_tag_register_musicbrainz_tags ();
+
   return ret;
 }
 
index a286dce..575b309 100644 (file)
@@ -57,6 +57,7 @@
 
 #include "aiffparse.h"
 #include <gst/audio/audio.h>
+#include <gst/tag/tag.h>
 #include <gst/gst-i18n-plugin.h>
 
 GST_DEBUG_CATEGORY (aiffparse_debug);
@@ -163,6 +164,11 @@ gst_aiff_parse_reset (GstAiffParse * aiff)
     gst_adapter_clear (aiff->adapter);
     aiff->adapter = NULL;
   }
+
+  if (aiff->tags != NULL) {
+    gst_tag_list_free (aiff->tags);
+    aiff->tags = NULL;
+  }
 }
 
 static void
@@ -892,6 +898,38 @@ gst_aiff_parse_stream_headers (GstAiffParse * aiff)
         }
         break;
       }
+      case GST_MAKE_FOURCC ('I', 'D', '3', ' '):{
+        GstTagList *tags;
+
+        if (aiff->streaming) {
+          if (!gst_aiff_parse_peek_chunk (aiff, &tag, &size))
+            return GST_FLOW_OK;
+
+          gst_adapter_flush (aiff->adapter, 8);
+          aiff->offset += 8;
+
+          buf = gst_adapter_take_buffer (aiff->adapter, size);
+        } else {
+          if ((res = gst_aiff_parse_read_chunk (aiff,
+                      &aiff->offset, &tag, &buf)) != GST_FLOW_OK)
+            return res;
+        }
+
+        GST_LOG_OBJECT (aiff, "ID3 chunk of size %u", GST_BUFFER_SIZE (buf));
+
+        tags = gst_tag_list_from_id3v2_tag (buf);
+        gst_buffer_unref (buf);
+
+        GST_INFO_OBJECT (aiff, "ID3 tags: %" GST_PTR_FORMAT, tags);
+
+        if (aiff->tags == NULL) {
+          aiff->tags = tags;
+        } else {
+          gst_tag_list_insert (aiff->tags, tags, GST_TAG_MERGE_APPEND);
+          gst_tag_list_free (tags);
+        }
+        break;
+      }
       default:
         gst_aiff_parse_ignore_chunk (aiff, buf, tag, size);
     }
@@ -1117,6 +1155,11 @@ iterate_adapter:
     gst_pad_push_event (aiff->srcpad, aiff->start_segment);
     aiff->start_segment = NULL;
   }
+  if (G_UNLIKELY (aiff->tags != NULL)) {
+    gst_element_found_tags_for_pad (GST_ELEMENT_CAST (aiff), aiff->srcpad,
+        aiff->tags);
+    aiff->tags = NULL;
+  }
 
   obtained = GST_BUFFER_SIZE (buf);
 
index b773a15..e7dda17 100644 (file)
@@ -113,6 +113,9 @@ struct _GstAiffParse {
 
   /* discont after seek */
   gboolean discont;
+
+  /* tags */
+  GstTagList *tags;
 };
 
 struct _GstAiffParseClass {