vorbisdec: keep timestamps when no decoded output
authorWim Taymans <wim.taymans@collabora.co.uk>
Tue, 21 Dec 2010 12:37:41 +0000 (13:37 +0100)
committerWim Taymans <wim.taymans@collabora.co.uk>
Tue, 21 Dec 2010 12:39:27 +0000 (13:39 +0100)
Keep track of the timestamps even when we didn't generate decodable output.

ext/vorbis/gstvorbisdec.c

index e607ce1..33f4184 100644 (file)
@@ -840,8 +840,15 @@ vorbis_do_timestamps (GstVorbisDec * vd, GstBuffer * buf, gboolean reverse,
   if (vd->last_timestamp != -1 && duration != -1 && !reverse)
     vd->last_timestamp += duration;
 
-  GST_BUFFER_TIMESTAMP (buf) = timestamp;
-  GST_BUFFER_DURATION (buf) = duration;
+  GST_LOG_OBJECT (vd,
+      "keeping timestamp %" GST_TIME_FORMAT " ts %" GST_TIME_FORMAT " dur %"
+      GST_TIME_FORMAT, GST_TIME_ARGS (vd->last_timestamp),
+      GST_TIME_ARGS (timestamp), GST_TIME_ARGS (duration));
+
+  if (buf) {
+    GST_BUFFER_TIMESTAMP (buf) = timestamp;
+    GST_BUFFER_DURATION (buf) = duration;
+  }
 }
 
 static GstFlowReturn
@@ -850,7 +857,7 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
 {
   vorbis_sample_t **pcm;
   guint sample_count;
-  GstBuffer *out;
+  GstBuffer *out = NULL;
   GstFlowReturn result;
   gint size;
 
@@ -910,6 +917,10 @@ vorbis_handle_data_packet (GstVorbisDec * vd, ogg_packet * packet,
     result = vorbis_dec_push_reverse (vd, out);
 
 done:
+  if (out == NULL) {
+    /* no output, still keep track of timestamps */
+    vorbis_do_timestamps (vd, NULL, FALSE, timestamp, duration);
+  }
   vorbis_synthesis_read (&vd->vd, sample_count);
 
   return result;