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.

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

index bc5e2c7be5297b8036535c3ba129227bbe19c232..4f5465f0bef6ce13665def178d42c7485c6264ea 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2006-08-24  Tim-Philipp Müller  <tim at centricular dot net>
+
+       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.
+
 2006-08-23  Edgard Lima <edgard.lima@indt.org.br>
 
        * sys/v4l2/gstv4l2src.c:
@@ -5,7 +18,6 @@
        * sys/v4l2/v4l2src_calls.h:
        Fix set_caps to set width and height to the values the driver is
        really working with.
-       
 
 2006-08-23  Tim-Philipp Müller  <tim at centricular dot net>
 
index 1962c9b9a7de9ef1ac5bd8d2e412bea984544820..88074e8083e52f7c86f3f8cab60e1bb6e5e72a67 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 d252ccfb5e2be8a4d39a5ac570daa1d0269d159a..30a5d78d84cbf55f74cc4d45dc17e2930d0a5872 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;