ext/lame/gstlame.*: Make lame timestamp flushed eos buffer by some additional timesta...
authorWim Taymans <wim.taymans@gmail.com>
Tue, 14 Nov 2006 10:29:37 +0000 (10:29 +0000)
committerWim Taymans <wim.taymans@gmail.com>
Tue, 14 Nov 2006 10:29:37 +0000 (10:29 +0000)
Original commit message from CVS:
* ext/lame/gstlame.c: (gst_lame_sink_event), (gst_lame_chain),
(gst_lame_change_state):
* ext/lame/gstlame.h:
Make lame timestamp flushed eos buffer by some additional timestamp
accounting. Fixes #374760.

ext/lame/gstlame.c
ext/lame/gstlame.h

index ea12fc050eefd1b1e2e8ea59155387fea8813297..dfbebabee5a54a641045ddbe3f7deff50250610f 100644 (file)
@@ -898,6 +898,21 @@ gst_lame_sink_event (GstPad * pad, GstEvent * event)
         size = lame_encode_flush (lame->lgf, GST_BUFFER_DATA (buf), 7200);
 
         if (size > 0) {
+          gint64 duration;
+
+          duration = gst_util_uint64_scale_int (size, GST_SECOND,
+              2 * lame->samplerate * lame->num_channels);
+
+          if (lame->last_ts == GST_CLOCK_TIME_NONE) {
+            lame->last_ts = lame->eos_ts;
+            lame->last_duration = duration;
+          } else {
+            lame->last_duration += duration;
+          }
+
+          GST_BUFFER_TIMESTAMP (buf) = lame->last_ts;
+          GST_BUFFER_DURATION (buf) = lame->last_duration;
+          lame->last_ts = GST_CLOCK_TIME_NONE;
           GST_BUFFER_SIZE (buf) = size;
           GST_DEBUG_OBJECT (lame, "pushing final packet of %u bytes", size);
           gst_buffer_set_caps (buf, GST_PAD_CAPS (lame->srcpad));
@@ -1027,6 +1042,10 @@ gst_lame_chain (GstPad * pad, GstBuffer * buf)
       GST_DEBUG_OBJECT (lame, "flow return: %s", gst_flow_get_name (result));
     }
 
+    if (GST_CLOCK_TIME_IS_VALID (lame->last_ts))
+      lame->eos_ts = lame->last_ts + lame->last_duration;
+    else
+      lame->eos_ts = GST_CLOCK_TIME_NONE;
     lame->last_ts = GST_CLOCK_TIME_NONE;
   } else {
     g_free (mp3_data);
@@ -1148,6 +1167,7 @@ gst_lame_change_state (GstElement * element, GstStateChange transition)
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       lame->last_ts = GST_CLOCK_TIME_NONE;
+      lame->eos_ts = GST_CLOCK_TIME_NONE;
       break;
     default:
       break;
index 8c980e47b8efb4edcfbb443767814092f3efb74d..ebbc7e4d1ef643d7ca43f21202a310bf1d170b2c 100644 (file)
@@ -94,7 +94,7 @@ struct _GstLame {
   lame_global_flags *lgf;
 
   /* time tracker */
-  guint64 last_ts, last_offs, last_duration;
+  guint64 last_ts, last_offs, last_duration, eos_ts;
 };
 
 struct _GstLameClass {