From 31312d586e2f5282aa95fa7abbf9413c7f1bda34 Mon Sep 17 00:00:00 2001 From: David Schleef Date: Fri, 8 Feb 2013 15:31:28 -0800 Subject: [PATCH] videodecoder: Don't blindly assign DTS to PTS DTS and PTS usually have a non-zero offset between them in MPEG-TS, so assigning DTS to PTS is almost always wrong. The other, newer timestamp recovery code does it correctly if we leave it as invalid. --- gst-libs/gst/video/gstvideodecoder.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c index 8e935c3b3c..0383682b7f 100644 --- a/gst-libs/gst/video/gstvideodecoder.c +++ b/gst-libs/gst/video/gstvideodecoder.c @@ -2633,20 +2633,19 @@ gst_video_decoder_decode_frame (GstVideoDecoder * decoder, frame->dts = GST_BUFFER_DTS (frame->input_buffer); frame->duration = GST_BUFFER_DURATION (frame->input_buffer); - /* For keyframes, PTS = DTS */ + /* For keyframes, PTS = DTS + constant_offset, usually 0 to 3 frame + * durations. */ /* FIXME upstream can be quite wrong about the keyframe aspect, * so we could be going off here as well, * maybe let subclass decide if it really is/was a keyframe */ - if (GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame)) { - if (!GST_CLOCK_TIME_IS_VALID (frame->pts)) { - frame->pts = frame->dts; - } else if (GST_CLOCK_TIME_IS_VALID (frame->dts)) { - /* just in case they are not equal as might ideally be, - * e.g. quicktime has a (positive) delta approach */ - priv->pts_delta = frame->pts - frame->dts; - GST_DEBUG_OBJECT (decoder, "PTS delta %d ms", - (gint) (priv->pts_delta / GST_MSECOND)); - } + if (GST_VIDEO_CODEC_FRAME_IS_SYNC_POINT (frame) && + GST_CLOCK_TIME_IS_VALID (frame->pts) + && GST_CLOCK_TIME_IS_VALID (frame->dts)) { + /* just in case they are not equal as might ideally be, + * e.g. quicktime has a (positive) delta approach */ + priv->pts_delta = frame->pts - frame->dts; + GST_DEBUG_OBJECT (decoder, "PTS delta %d ms", + (gint) (priv->pts_delta / GST_MSECOND)); } frame->abidata.ABI.ts = frame->dts;