summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Schleef <ds@schleef.org>2013-02-08 15:31:28 -0800
committerDavid Schleef <ds@schleef.org>2013-02-11 11:57:08 -0800
commit31312d586e2f5282aa95fa7abbf9413c7f1bda34 (patch)
treee6506ca96a769674fe9d8f121c7609f02fe6b59f
parentceb6585d265cda1b82bda8305815f3f605f2d73e (diff)
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.
-rw-r--r--gst-libs/gst/video/gstvideodecoder.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/gst-libs/gst/video/gstvideodecoder.c b/gst-libs/gst/video/gstvideodecoder.c
index 8e935c3b3..0383682b7 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;