summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorMathieu Duponchelle <mathieu@centricular.com>2020-10-26 23:17:59 +0100
committerMathieu Duponchelle <mathieu@centricular.com>2020-10-27 01:58:32 +0100
commitfc5cd9591a3fe09458342cfedfff88d57bc330c7 (patch)
tree622478ace6282207955d31d19bb24ee722629dad /libs
parent41677a526b83bb2493087af1d93b50c297cf97cd (diff)
downloadgstreamer-fc5cd9591a3fe09458342cfedfff88d57bc330c7.tar.gz
baseparse: always use incoming DTS
When parsing interlaced video streams, ignoring incoming DTS could cause the parser to end up with PTS < DTS output buffers, for example when increasing next_dts using the duration of the last pushed buffer. Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/681>
Diffstat (limited to 'libs')
-rw-r--r--libs/gst/base/gstbaseparse.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/libs/gst/base/gstbaseparse.c b/libs/gst/base/gstbaseparse.c
index 31916fee7d..4e3cc9f292 100644
--- a/libs/gst/base/gstbaseparse.c
+++ b/libs/gst/base/gstbaseparse.c
@@ -242,7 +242,6 @@ struct _GstBaseParsePrivate
GstClockTime next_pts;
GstClockTime next_dts;
GstClockTime prev_pts;
- GstClockTime prev_dts;
gboolean prev_dts_from_pts;
GstClockTime frame_duration;
gboolean seen_keyframe;
@@ -1366,7 +1365,6 @@ gst_base_parse_sink_event_default (GstBaseParse * parse, GstEvent * event)
parse->priv->last_pts = GST_CLOCK_TIME_NONE;
parse->priv->last_dts = GST_CLOCK_TIME_NONE;
parse->priv->prev_pts = GST_CLOCK_TIME_NONE;
- parse->priv->prev_dts = GST_CLOCK_TIME_NONE;
parse->priv->prev_dts_from_pts = FALSE;
parse->priv->discont = TRUE;
parse->priv->seen_keyframe = FALSE;
@@ -2863,7 +2861,6 @@ gst_base_parse_start_fragment (GstBaseParse * parse)
parse->priv->next_pts = GST_CLOCK_TIME_NONE;
parse->priv->prev_pts = GST_CLOCK_TIME_NONE;
parse->priv->next_dts = GST_CLOCK_TIME_NONE;
- parse->priv->prev_dts = GST_CLOCK_TIME_NONE;
parse->priv->prev_dts_from_pts = FALSE;
/* prevent it hanging around stop all the time */
parse->segment.position = GST_CLOCK_TIME_NONE;
@@ -3266,8 +3263,8 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
updated_prev_pts = TRUE;
}
- if (GST_CLOCK_TIME_IS_VALID (dts) && (parse->priv->prev_dts != dts)) {
- parse->priv->prev_dts = parse->priv->next_dts = dts;
+ if (GST_CLOCK_TIME_IS_VALID (dts)) {
+ parse->priv->next_dts = dts;
parse->priv->prev_dts_from_pts = FALSE;
}
@@ -3277,10 +3274,9 @@ gst_base_parse_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
if (parse->priv->infer_ts &&
parse->priv->pts_interpolate &&
!GST_CLOCK_TIME_IS_VALID (dts) &&
- (!GST_CLOCK_TIME_IS_VALID (parse->priv->prev_dts)
- || (parse->priv->prev_dts_from_pts && updated_prev_pts))
- && GST_CLOCK_TIME_IS_VALID (pts)) {
- parse->priv->prev_dts = parse->priv->next_dts = pts;
+ parse->priv->prev_dts_from_pts &&
+ updated_prev_pts && GST_CLOCK_TIME_IS_VALID (pts)) {
+ parse->priv->next_dts = pts;
parse->priv->prev_dts_from_pts = TRUE;
}
@@ -4983,8 +4979,8 @@ gst_base_parse_set_ts_at_offset (GstBaseParse * parse, gsize offset)
if (GST_CLOCK_TIME_IS_VALID (pts) && (parse->priv->prev_pts != pts))
parse->priv->prev_pts = parse->priv->next_pts = pts;
- if (GST_CLOCK_TIME_IS_VALID (dts) && (parse->priv->prev_dts != dts)) {
- parse->priv->prev_dts = parse->priv->next_dts = dts;
+ if (GST_CLOCK_TIME_IS_VALID (dts)) {
+ parse->priv->next_dts = dts;
parse->priv->prev_dts_from_pts = FALSE;
}
}