From: Jan Schmidt Date: Thu, 13 Sep 2012 05:44:37 +0000 (-0700) Subject: baseparse: Add a mode/flag for disabling PTS interpolation X-Git-Tag: RELEASE-0.11.94~10 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=196caf5ed6f9ed5b81a3b7c00d055eb0ce2dc1c3;p=platform%2Fupstream%2Fgstreamer.git baseparse: Add a mode/flag for disabling PTS interpolation To be used by sub-classes implementing video formats with reordering such as MPEG. --- diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c index 5e09dfa..4ab3d5c 100644 --- a/libs/gst/base/gstbaseparse.c +++ b/libs/gst/base/gstbaseparse.c @@ -246,6 +246,7 @@ struct _GstBaseParsePrivate guint min_frame_size; gboolean passthrough; + gboolean pts_interpolate; gboolean syncable; gboolean has_timing_info; guint fps_num, fps_den; @@ -725,6 +726,7 @@ gst_base_parse_reset (GstBaseParse * parse) parse->priv->next_dts = 0; parse->priv->syncable = TRUE; parse->priv->passthrough = FALSE; + parse->priv->pts_interpolate = TRUE; parse->priv->has_timing_info = FALSE; parse->priv->post_min_bitrate = TRUE; parse->priv->post_avg_bitrate = TRUE; @@ -1910,7 +1912,7 @@ gst_base_parse_handle_and_push_frame (GstBaseParse * parse, if (GST_BUFFER_DTS_IS_VALID (buffer) && GST_BUFFER_DURATION_IS_VALID (buffer)) { parse->priv->next_dts = GST_BUFFER_DTS (buffer) + GST_BUFFER_DURATION (buffer); - if (GST_BUFFER_PTS_IS_VALID (buffer)) { + if (parse->priv->pts_interpolate && GST_BUFFER_PTS_IS_VALID (buffer)) { GstClockTime next_pts = GST_BUFFER_PTS (buffer) + GST_BUFFER_DURATION (buffer); if (next_pts >= parse->priv->next_dts) @@ -3337,6 +3339,25 @@ gst_base_parse_set_passthrough (GstBaseParse * parse, gboolean passthrough) } /** + * gst_base_parse_set_pts_interpolation: + * @parse: a #GstBaseParse + * @passthrough: %TRUE if parser should interpolate PTS timestamps + * + * By default, the base class will guess PTS timestamps using a simple + * interpolation (previous timestamp + duration), which is incorrect for + * data streams with reordering, where PTS can go backward. Sub-classes + * implementing such formats should disable PTS interpolation. + */ +void +gst_base_parse_set_pts_interpolation (GstBaseParse * parse, + gboolean pts_interpolate) +{ + parse->priv->pts_interpolate = pts_interpolate; + GST_INFO_OBJECT (parse, "PTS interpolation: %s", + (pts_interpolate) ? "yes" : "no"); +} + +/** * gst_base_parse_set_latency: * @parse: a #GstBaseParse * @min_latency: minimum parse latency