ac3parse: improve handling of dependent substream frames
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Thu, 27 Jan 2011 15:52:34 +0000 (16:52 +0100)
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>
Fri, 28 Jan 2011 11:16:59 +0000 (12:16 +0100)
In particular, timestamps of these should track main-stream timestamps.

gst/audioparsers/gstac3parse.c

index 0c7fba3..e001bc3 100644 (file)
@@ -466,8 +466,17 @@ gst_ac3_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
   GST_LOG_OBJECT (parse, "size: %u, rate: %u, chans: %u", fsize, rate, chans);
 
   if (G_UNLIKELY (sid)) {
+    /* dependent frame, no need to (ac)count for or consider further */
     GST_LOG_OBJECT (parse, "sid: %d", sid);
     frame->flags |= GST_BASE_PARSE_FRAME_FLAG_NO_FRAME;
+    /* TODO maybe also mark as DELTA_UNIT,
+     * if that does not surprise baseparse elsewhere */
+    /* occupies same time space as previous base frame */
+    if (G_LIKELY (GST_BUFFER_TIMESTAMP (buf) >= GST_BUFFER_DURATION (buf)))
+      GST_BUFFER_TIMESTAMP (buf) -= GST_BUFFER_DURATION (buf);
+    /* only return if we already arranged for caps */
+    if (G_LIKELY (ac3parse->sample_rate > 0))
+      return GST_FLOW_OK;
   }
 
   if (G_UNLIKELY (ac3parse->sample_rate != rate || ac3parse->channels != chans