diff options
author | Michael Niedermayer <michael@niedermayer.cc> | 2016-09-16 01:48:36 +0200 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-09-16 11:44:13 +0200 |
commit | 51000b994514e64a6c5039e179f20c9e24f87c45 (patch) | |
tree | f7148f437b05b9a7f8d2774ba27d9028960636ea /libavformat/movenc.c | |
parent | 28343139330f557e00293933a4697c7d0fc19c56 (diff) | |
download | ffmpeg-51000b994514e64a6c5039e179f20c9e24f87c45.tar.gz |
avformat/movenc: Make the packet check more tolerant
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat/movenc.c')
-rw-r--r-- | libavformat/movenc.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/libavformat/movenc.c b/libavformat/movenc.c index b704f49418..aa4a076b30 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -4666,25 +4666,26 @@ static int check_pkt(AVFormatContext *s, AVPacket *pkt) { MOVMuxContext *mov = s->priv_data; MOVTrack *trk = &mov->tracks[pkt->stream_index]; + int64_t ref; + uint64_t duration; if (trk->entry) { - int64_t duration = pkt->dts - trk->cluster[trk->entry - 1].dts; - if (duration < 0 || duration > INT_MAX) { - av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" / timestamp: %"PRId64" is out of range for mov/mp4 format\n", - duration, pkt->dts - ); - - pkt->dts = trk->cluster[trk->entry - 1].dts + 1; - pkt->pts = AV_NOPTS_VALUE; - } - } else if (pkt->dts <= INT_MIN || pkt->dts >= INT_MAX) { - av_log(s, AV_LOG_ERROR, "Application provided initial timestamp: %"PRId64" is out of range for mov/mp4 format\n", - pkt->dts - ); + ref = trk->cluster[trk->entry - 1].dts; + } else if (trk->start_dts != AV_NOPTS_VALUE) { + ref = trk->start_dts + trk->track_duration; + } else + ref = pkt->dts; // Skip tests for the first packet - pkt->dts = 0; - pkt->pts = AV_NOPTS_VALUE; + duration = pkt->dts - ref; + if (pkt->dts < ref || duration >= INT_MAX) { + av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" / timestamp: %"PRId64" is out of range for mov/mp4 format\n", + duration, pkt->dts + ); + + pkt->dts = ref + 1; + pkt->pts = AV_NOPTS_VALUE; } + if (pkt->duration < 0 || pkt->duration > INT_MAX) { av_log(s, AV_LOG_ERROR, "Application provided duration: %"PRId64" is invalid\n", pkt->duration); return AVERROR(EINVAL); |