gst/qtdemux/qtdemux.c: Add support for tmpo tag (BPM).
authorStefan Kost <ensonic@users.sourceforge.net>
Mon, 4 Aug 2008 07:05:33 +0000 (07:05 +0000)
committerStefan Kost <ensonic@users.sourceforge.net>
Mon, 4 Aug 2008 07:05:33 +0000 (07:05 +0000)
Original commit message from CVS:
* gst/qtdemux/qtdemux.c:
Add support for tmpo tag (BPM).

ChangeLog
gst/qtdemux/qtdemux.c

index 890ca15411e027cdac7f026cce6b4762ca7ad806..298e47eec944e11fe6bc5d7081631c718181fd0c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2008-08-04  Stefan Kost  <ensonic@users.sf.net>
+
+       * gst/qtdemux/qtdemux.c:
+         Add support for tmpo tag (BPM).
+
 2008-08-03  Sebastian Dröge  <sebastian.droege@collabora.co.uk>
 
        * ext/flac/gstflacenc.c: (gst_flac_enc_query_peer_total_samples),
index 2c99d55e285b8e9d84a98067b80775f6e9e95771..e940bafdf4ed2f87ad3678a12aac6b7e120328c0 100644 (file)
@@ -3815,6 +3815,32 @@ qtdemux_tag_add_num (GstQTDemux * qtdemux, const char *tag1,
   }
 }
 
+static void
+qtdemux_tag_add_tmpo (GstQTDemux * qtdemux, const char *tag1, GNode * node)
+{
+  GNode *data;
+  int len;
+  int type;
+  int n1;
+
+  data = qtdemux_tree_get_child_by_type (node, FOURCC_data);
+  if (data) {
+    len = QT_UINT32 (data->data);
+    type = QT_UINT32 ((guint8 *) data->data + 8);
+    GST_DEBUG_OBJECT (qtdemux, "have tempo tag, type=%d,len=%d", type, len);
+    /* some files wrongly have a type 0x0f=15, but it should be 0x15 */
+    if ((type == 0x00000015 || type == 0x0000000f) && len >= 16) {
+      n1 = QT_UINT16 ((guint8 *) data->data + 16);
+      if (n1) {
+        /* do not add bpm=0 */
+        GST_DEBUG_OBJECT (qtdemux, "adding tag %d", n1);
+        gst_tag_list_add (qtdemux->tag_list, GST_TAG_MERGE_REPLACE,
+            tag1, (gdouble) n1, NULL);
+      }
+    }
+  }
+}
+
 static void
 qtdemux_tag_add_date (GstQTDemux * qtdemux, const char *tag, GNode * node)
 {
@@ -4002,6 +4028,11 @@ qtdemux_parse_udta (GstQTDemux * qtdemux, GNode * udta)
       qtdemux_tag_add_str (qtdemux, GST_TAG_GENRE, node);
     }
   }
+
+  node = qtdemux_tree_get_child_by_type (ilst, FOURCC_tmpo);
+  if (node) {
+    qtdemux_tag_add_tmpo (qtdemux, GST_TAG_BEATS_PER_MINUTE, node);
+  }
 }
 
 typedef struct