From 9ebb8e11248f85cb9a93aca6e2f91696f0621a89 Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Mon, 20 Sep 2004 13:47:47 +0000 Subject: [PATCH] check if the user specified timestamps are strictly monotone timestamp guess code 10l fix Originally committed as revision 3483 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/h263.c | 2 ++ libavcodec/mpegvideo.c | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/libavcodec/h263.c b/libavcodec/h263.c index 3eec00504c..f7421ca0c6 100644 --- a/libavcodec/h263.c +++ b/libavcodec/h263.c @@ -2112,11 +2112,13 @@ void ff_set_mpeg4_time(MpegEncContext * s, int picture_number){ if(s->pict_type==B_TYPE){ s->pb_time= s->pp_time - (s->last_non_b_time - s->time); + assert(s->pb_time > 0 && s->pb_time < s->pp_time); }else{ s->last_time_base= s->time_base; s->time_base= time_div; s->pp_time= s->time - s->last_non_b_time; s->last_non_b_time= s->time; + assert(s->pp_time > 0); } } diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index d050cb9c0e..eef8346df9 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -902,6 +902,7 @@ int MPV_encode_init(AVCodecContext *avctx) s->mpeg_quant= avctx->mpeg_quant; s->rtp_mode= !!avctx->rtp_payload_size; s->intra_dc_precision= avctx->intra_dc_precision; + s->user_specified_pts = AV_NOPTS_VALUE; if (s->gop_size <= 1) { s->intra_only = 1; @@ -1962,16 +1963,26 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg){ copy_picture_attributes(s, pic, pic_arg); pic->display_picture_number= s->input_picture_number++; + if(pic->pts != AV_NOPTS_VALUE){ - s->user_specified_pts= pic->pts; + if(s->user_specified_pts != AV_NOPTS_VALUE){ + int64_t time= av_rescale(pic->pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE); + int64_t last= av_rescale(s->user_specified_pts, s->avctx->frame_rate, s->avctx->frame_rate_base*(int64_t)AV_TIME_BASE); + + if(time <= last){ + av_log(s->avctx, AV_LOG_ERROR, "Error, Invalid timestamp=%Ld, last=%Ld\n", pic->pts, s->user_specified_pts); + return -1; + } + } }else{ - if(s->user_specified_pts){ + if(s->user_specified_pts != AV_NOPTS_VALUE){ pic->pts= s->user_specified_pts + AV_TIME_BASE*(int64_t)s->avctx->frame_rate_base / s->avctx->frame_rate; av_log(s->avctx, AV_LOG_INFO, "Warning: AVFrame.pts=? trying to guess (%Ld)\n", pic->pts); }else{ pic->pts= av_rescale(pic->display_picture_number*(int64_t)s->avctx->frame_rate_base, AV_TIME_BASE, s->avctx->frame_rate); } } + s->user_specified_pts= pic->pts; } /* shift buffer entries */ @@ -2139,7 +2150,8 @@ int MPV_encode_picture(AVCodecContext *avctx, s->picture_in_gop_number++; - load_input_picture(s, pic_arg); + if(load_input_picture(s, pic_arg) < 0) + return -1; select_input_picture(s);