From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 290B640BCC for ; Tue, 28 Dec 2021 16:44:22 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9628168AF98; Tue, 28 Dec 2021 18:44:21 +0200 (EET) Received: from mout-p-101.mailbox.org (mout-p-101.mailbox.org [80.241.56.151]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 15CEC68AE3E for ; Tue, 28 Dec 2021 18:44:15 +0200 (EET) Received: from smtp202.mailbox.org (smtp202.mailbox.org [80.241.60.245]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-384) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mout-p-101.mailbox.org (Postfix) with ESMTPS id 4JNgNZ4x86zQlMZ for ; Tue, 28 Dec 2021 17:44:14 +0100 (CET) X-Virus-Scanned: amavisd-new at heinlein-support.de From: Gyan Doshi To: ffmpeg-devel@ffmpeg.org Date: Tue, 28 Dec 2021 22:13:47 +0530 Message-Id: <20211228164347.632-1-ffmpeg@gyani.pro> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v2] avformat/mov: adjust 0 values in stts X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: As per ISO 14496-12, sample duration of 0 is invalid except for the last entry. However, some files may use it to stall dts progress in order to recover from a desync. In addition, catch and fix 0 value for sample count. --- v2: adjust dts if 0 duration is encountered libavformat/mov.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/libavformat/mov.c b/libavformat/mov.c index 351ecde770..7e90e24bd5 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2970,16 +2970,22 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) av_log(c->fc, AV_LOG_TRACE, "sample_count=%u, sample_duration=%u\n", sample_count, sample_duration); + if (!sample_count) { + av_log(c->fc, AV_LOG_WARNING, "invalid sample count of 0 in stts for st %d at entry %u; changing to 1.\n", + c->fc->nb_streams-1, i); + sc->stts_data[i].count = sample_count = 1; + } + /* STTS sample offsets are uint32 but some files store it as int32 * with negative values used to correct DTS delays. There may be abnormally large values as well. */ - if (sample_duration > c->max_stts_delta) { + if (sample_duration > c->max_stts_delta || !sample_duration) { // assume high delta is a correction if negative when cast as int32 int32_t delta_magnitude = (int32_t)sample_duration; - av_log(c->fc, AV_LOG_WARNING, "Too large sample offset %u in stts entry %u with count %u in st:%d. Clipping to 1.\n", + av_log(c->fc, AV_LOG_WARNING, "Too large or zero sample offset %u in stts entry %u with count %u in st:%d. Setting to 1.\n", sample_duration, i, sample_count, st->index); sc->stts_data[i].duration = 1; - corrected_dts += (delta_magnitude < 0 ? (int64_t)delta_magnitude : 1) * sample_count; + corrected_dts += (delta_magnitude <= 0 ? (int64_t)delta_magnitude : 1) * sample_count; } else { corrected_dts += sample_duration * sample_count; } @@ -2987,7 +2993,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom) current_dts += sc->stts_data[i].duration * sample_count; if (current_dts > corrected_dts) { - int64_t drift = (current_dts - corrected_dts)/FFMAX(sample_count, 1); + int64_t drift = (current_dts - corrected_dts)/sample_count; uint32_t correction = (sc->stts_data[i].duration > drift) ? drift : sc->stts_data[i].duration - 1; current_dts -= correction * sample_count; sc->stts_data[i].duration -= correction; -- 2.33.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".