baseparse: do not overwrite header buffer timestamps
authorThiago Santos <thiagoss@osg.samsung.com>
Fri, 13 Nov 2015 19:31:06 +0000 (16:31 -0300)
committerThiago Santos <thiagoss@osg.samsung.com>
Sat, 14 Nov 2015 13:50:35 +0000 (10:50 -0300)
baseparse tries to preserve timestamps from upstream if
it is running on a time segment and write that to
output buffers. It assumes the first DTS is going to be
segment.start and sets that to the first buffers. In case
the buffer is a header buffer, it had no timestamps and
will have only the DTS set due to this mechanism.

This patch prevents this by skipping this behavior for
header buffers.

https://bugzilla.gnome.org/show_bug.cgi?id=757961

libs/gst/base/gstbaseparse.c

index c9a57c5..f8f4380 100644 (file)
@@ -980,16 +980,17 @@ static GstFlowReturn
 gst_base_parse_parse_frame (GstBaseParse * parse, GstBaseParseFrame * frame)
 {
   GstBuffer *buffer = frame->buffer;
+  gboolean is_header = GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_HEADER);
 
-  if (!GST_BUFFER_PTS_IS_VALID (buffer) &&
+  if (!GST_BUFFER_PTS_IS_VALID (buffer) && !is_header &&
       GST_CLOCK_TIME_IS_VALID (parse->priv->next_pts)) {
     GST_BUFFER_PTS (buffer) = parse->priv->next_pts;
   }
-  if (!GST_BUFFER_DTS_IS_VALID (buffer) &&
+  if (!GST_BUFFER_DTS_IS_VALID (buffer) && !is_header &&
       GST_CLOCK_TIME_IS_VALID (parse->priv->next_dts)) {
     GST_BUFFER_DTS (buffer) = parse->priv->next_dts;
   }
-  if (!GST_BUFFER_DURATION_IS_VALID (buffer) &&
+  if (!GST_BUFFER_DURATION_IS_VALID (buffer) && !is_header &&
       GST_CLOCK_TIME_IS_VALID (parse->priv->frame_duration)) {
     GST_BUFFER_DURATION (buffer) = parse->priv->frame_duration;
   }
@@ -2878,11 +2879,14 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
   gint skip = -1;
   guint min_size, av;
   GstClockTime pts, dts;
+  gboolean is_header;
 
   parse = GST_BASE_PARSE (parent);
   bclass = GST_BASE_PARSE_GET_CLASS (parse);
   GST_DEBUG_OBJECT (parent, "chain");
 
+  is_header = buffer && GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_HEADER);
+
   /* early out for speed, if we need to skip */
   if (buffer && GST_BUFFER_IS_DISCONT (buffer))
     parse->priv->skip = 0;
@@ -3078,7 +3082,7 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
 
     /* already inform subclass what timestamps we have planned,
      * at least if provided by time-based upstream */
-    if (parse->priv->upstream_format == GST_FORMAT_TIME) {
+    if (parse->priv->upstream_format == GST_FORMAT_TIME && !is_header) {
       tmpbuf = gst_buffer_make_writable (tmpbuf);
       GST_BUFFER_PTS (tmpbuf) = parse->priv->next_pts;
       GST_BUFFER_DTS (tmpbuf) = parse->priv->next_dts;