ext/wavpack/gstwavpackdec.c: Post audio codec and average bitrate tags on bus (#344472).
authorSebastian Dröge <slomo@circular-chaos.org>
Thu, 24 Aug 2006 09:24:11 +0000 (09:24 +0000)
committerTim-Philipp Müller <tim@centricular.net>
Thu, 24 Aug 2006 09:24:11 +0000 (09:24 +0000)
Original commit message from CVS:
Patch by: Sebastian Dröge <slomo at circular-chaos.org>
* ext/wavpack/gstwavpackdec.c: (gst_wavpack_dec_post_tags),
(gst_wavpack_dec_chain):
Post audio codec and average bitrate tags on bus (#344472).
* ext/wavpack/gstwavpackparse.c: (gst_wavpack_parse_base_init),
(gst_wavpack_parse_src_query):
Forward queries in other formats (BYTE format in particular)
upstream; add Sebastian to authors.

ext/wavpack/gstwavpackdec.c
ext/wavpack/gstwavpackparse.c

index 1962c9b..88074e8 100644 (file)
@@ -236,6 +236,33 @@ gst_wavpack_dec_clip_outgoing_buffer (GstWavpackDec * dec, GstBuffer * buf)
   return TRUE;
 }
 
+static void
+gst_wavpack_dec_post_tags (GstWavpackDec * dec, WavpackHeader * wph)
+{
+  GstTagList *list;
+  GstFormat format_time = GST_FORMAT_TIME, format_bytes = GST_FORMAT_BYTES;
+  gint64 duration, size;
+
+  list = gst_tag_list_new ();
+
+  gst_tag_list_add (list, GST_TAG_MERGE_REPLACE,
+      GST_TAG_AUDIO_CODEC, "Wavpack", NULL);
+
+  /* try to estimate the average bitrate */
+  if (gst_pad_query_peer_duration (dec->sinkpad, &format_bytes, &size) &&
+      gst_pad_query_peer_duration (dec->sinkpad, &format_time, &duration) &&
+      size > 0 && duration > 0) {
+    guint64 bitrate;
+
+    bitrate = gst_util_uint64_scale (size, 8 * GST_SECOND, duration);
+    gst_tag_list_add (list, GST_TAG_MERGE_REPLACE, GST_TAG_BITRATE,
+        (guint) bitrate, NULL);
+  }
+
+  gst_element_post_message (GST_ELEMENT (dec),
+      gst_message_new_tag (GST_OBJECT (dec), list));
+}
+
 static GstFlowReturn
 gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buf)
 {
@@ -314,6 +341,10 @@ gst_wavpack_dec_chain (GstPad * pad, GstBuffer * buf)
     /* should always succeed */
     gst_pad_set_caps (dec->srcpad, caps);
     gst_caps_unref (caps);
+
+    /* send GST_TAG_AUDIO_CODEC and GST_TAG_BITRATE tags before something
+     * is decoded or after the format has changed */
+    gst_wavpack_dec_post_tags (dec, &wph);
   }
 
   unpacked_size = wph.block_samples * (dec->width / 8) * dec->channels;
index d252ccf..30a5d78 100644 (file)
@@ -97,7 +97,8 @@ gst_wavpack_parse_base_init (gpointer klass)
       GST_ELEMENT_DETAILS ("WavePack parser",
       "Codec/Demuxer/Audio",
       "Parses Wavpack files",
-      "Arwed v. Merkatz <v.merkatz@gmx.net>");
+      "Arwed v. Merkatz <v.merkatz@gmx.net>, "
+      "Sebastian Dröge <slomo@circular-chaos.org>");
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
 
   gst_element_class_add_pad_template (element_class,
@@ -292,7 +293,8 @@ gst_wavpack_parse_src_query (GstPad * pad, GstQuery * query)
           break;
         default:
           GST_DEBUG_OBJECT (parse, "cannot handle position query in "
-              "%s format", gst_format_get_name (format));
+              "%s format. Forwarding upstream.", gst_format_get_name (format));
+          ret = gst_pad_query_default (pad, query);
           break;
       }
       break;
@@ -327,7 +329,8 @@ gst_wavpack_parse_src_query (GstPad * pad, GstQuery * query)
           break;
         default:
           GST_DEBUG_OBJECT (parse, "cannot handle duration query in "
-              "%s format", gst_format_get_name (format));
+              "%s format. Forwarding upstream.", gst_format_get_name (format));
+          ret = gst_pad_query_default (pad, query);
           break;
       }
       break;