oggdemux: Extract tags from OGM text streams and don't push them downstream
authorSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 23 Jan 2010 21:03:18 +0000 (22:03 +0100)
committerSebastian Dröge <sebastian.droege@collabora.co.uk>
Sat, 23 Jan 2010 21:10:08 +0000 (22:10 +0100)
ext/ogg/gstoggdemux.c

index 25cf128..7713fd9 100644 (file)
@@ -41,6 +41,7 @@
 #endif
 #include <string.h>
 #include <gst/gst-i18n-plugin.h>
+#include <gst/tag/tag.h>
 
 #include "gstoggdemux.h"
 
@@ -501,6 +502,32 @@ gst_ogg_demux_chain_peer (GstOggPad * pad, ogg_packet * packet)
       /* We don't push header packets for OGM */
       cret = gst_ogg_demux_combine_flows (ogg, pad, GST_FLOW_OK);
       goto done;
+    } else if (data[0] & 3 && pad->map.is_ogm_text) {
+      GstTagList *tags;
+
+      /* We don't push comment packets either for text streams,
+       * other streams will handle the comment packets in the
+       * decoder */
+      buf = gst_buffer_new ();
+
+      GST_BUFFER_DATA (buf) = (guint8 *) data;
+      GST_BUFFER_SIZE (buf) = bytes;
+
+      tags = gst_tag_list_from_vorbiscomment_buffer (buf,
+          (guint8 *) "\003vorbis", 7, NULL);
+      gst_buffer_unref (buf);
+      buf = NULL;
+
+      if (tags) {
+        GST_DEBUG_OBJECT (ogg, "tags = %" GST_PTR_FORMAT, tags);
+        gst_element_found_tags_for_pad (GST_ELEMENT (ogg), GST_PAD_CAST (pad),
+            tags);
+      } else {
+        GST_DEBUG_OBJECT (ogg, "failed to extract tags from vorbis comment");
+      }
+
+      cret = gst_ogg_demux_combine_flows (ogg, pad, GST_FLOW_OK);
+      goto done;
     }
 
     offset = 1 + (((data[0] & 0xc0) >> 6) | ((data[0] & 0x02) << 1));