From patchwork Wed Aug 10 16:25:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37217 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012761pzi; Wed, 10 Aug 2022 09:27:25 -0700 (PDT) X-Google-Smtp-Source: AA6agR4xC5zcTnraxl/J/BusNdcjuEC+otv8c+QvMW4pSS2ELP+m3SKOe4lKPkQ+CUEjd/RF7yzA X-Received: by 2002:a05:6402:4504:b0:43b:4ec7:2ec1 with SMTP id ez4-20020a056402450400b0043b4ec72ec1mr26693830edb.7.1660148845565; Wed, 10 Aug 2022 09:27:25 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148845; cv=none; d=google.com; s=arc-20160816; b=jt8bnF4xD5Xc284Imb1makftOP5YZrZ6opyJ5E+ru13UyNPT2kaIQd2XF6VRP6BXil 7SqR7lmVdIIKbX9RTd4p8Czk4/VEW9uYlx4DxEB1JV+FPdVQkjahQKO2vipWX4+cHvQ7 WlIJB/dxgmhfHq0mPAsY7zXu7+3sCsoBAt/AcylVvcoW5m3hmNPaMx7PAPJzYRyyA7Zp Mn+b9HSmwW/VfY1taK5gkjhmH2BFAk3S4NMa87YMVXNadmmLBVpKwQaHyxo5aEbPDzEJ opGUUH9GSJUCBK5NDU7P57p6i61K1FR69UhrRflprfQMD5rWCs09QuLIbVsCV1eFtBos cfvQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:reply-to:list-subscribe :list-help:list-post:list-archive:list-unsubscribe:list-id :precedence:subject:mime-version:references:in-reply-to:message-id :date:to:from:delivered-to; bh=Vj0+tihjUmT1yb3bruVNj8KMa96LV2yAGN5xAKus7tg=; b=Lxu0QvaYLc9L1wRhNS0hitjhNWy6K0FY8jJNZU9rRWrtxUvoYAe4U0pNIEVce76jrY 6N7UQD2N/kOVnFjQVODx6GU2AectxGsTxrYFU2qbRdTG+WxRlxBQxynUtI/y33LvCeiR eSQqcohrvtt3dYn2MR4M2bUZwM2ULKg5yy+XYHQwMp8tXlBZnW4CcUKauNWzl2m7hDu/ zye27u2FaAVOUMM5Fg+ZWnoA6l5UW1e1LcGlvYVC7JqplAFJMlGamT/PIM3cwe1T6Czw Yq6at67Wm6ANNuTdhuoCP9ojj3mIRg3NXrY1uIGz3VeJWlqIQrQy9fTeYvXHcRZ929Pc avrw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id hu8-20020a170907a08800b007313bdfb98bsi4948299ejc.18.2022.08.10.09.27.16; Wed, 10 Aug 2022 09:27:25 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6775968B8D9; Wed, 10 Aug 2022 19:26:12 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail0.khirnov.net (red.khirnov.net [176.97.15.12]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F1BF968B89E for ; Wed, 10 Aug 2022 19:26:03 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id BA3742404FE for ; Wed, 10 Aug 2022 18:25:59 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 1XM67KFJ8G6W for ; Wed, 10 Aug 2022 18:25:59 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:2a00:c500:561:201::7]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256 client-signature RSA-PSS (2048 bits) client-digest SHA256) (Client CN "libav.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id 4177B240507 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 3CD013A041E; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:41 +0200 Message-Id: <20220810162545.21382-5-anton@khirnov.net> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20220810162545.21382-1-anton@khirnov.net> References: <20220810162545.21382-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 5/9] fftools/ffmpeg: move timestamp discontinuity correction out of process_input() 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: Vd/wmTA+rSqt --- fftools/ffmpeg.c | 103 ++++++++++++++++++++++++++--------------------- 1 file changed, 56 insertions(+), 47 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index b895f85e75..0332528d57 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3693,6 +3693,59 @@ static void decode_flush(InputFile *ifile) } } +static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, + AVPacket *pkt) +{ + const int fmt_is_discont = ifile->ctx->iformat->flags & AVFMT_TS_DISCONT; + int disable_discontinuity_correction = copy_ts; + int64_t pkt_dts = av_rescale_q_rnd(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q, + AV_ROUND_NEAR_INF | AV_ROUND_PASS_MINMAX); + + if (copy_ts && ist->next_dts != AV_NOPTS_VALUE && + fmt_is_discont && ist->st->pts_wrap_bits < 60) { + int64_t wrap_dts = av_rescale_q_rnd(pkt->dts + (1LL<st->pts_wrap_bits), + ist->st->time_base, AV_TIME_BASE_Q, + AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); + if (FFABS(wrap_dts - ist->next_dts) < FFABS(pkt_dts - ist->next_dts)/10) + disable_discontinuity_correction = 0; + } + + if (ist->next_dts != AV_NOPTS_VALUE && !disable_discontinuity_correction) { + int64_t delta = pkt_dts - ist->next_dts; + if (fmt_is_discont) { + if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE || + delta > 1LL*dts_delta_threshold*AV_TIME_BASE || + pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) { + ifile->ts_offset -= delta; + av_log(NULL, AV_LOG_DEBUG, + "timestamp discontinuity for stream #%d:%d " + "(id=%d, type=%s): %"PRId64", new offset= %"PRId64"\n", + ist->file_index, ist->st->index, ist->st->id, + av_get_media_type_string(ist->st->codecpar->codec_type), + delta, ifile->ts_offset); + pkt->dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); + } + } else { + if (delta < -1LL*dts_error_threshold*AV_TIME_BASE || + delta > 1LL*dts_error_threshold*AV_TIME_BASE) { + av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt->dts, ist->next_dts, pkt->stream_index); + pkt->dts = AV_NOPTS_VALUE; + } + if (pkt->pts != AV_NOPTS_VALUE){ + int64_t pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q); + delta = pkt_pts - ist->next_dts; + if (delta < -1LL*dts_error_threshold*AV_TIME_BASE || + delta > 1LL*dts_error_threshold*AV_TIME_BASE) { + av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt->pts, ist->next_dts, pkt->stream_index); + pkt->pts = AV_NOPTS_VALUE; + } + } + } + } +} + /* * Return * - 0 -- one packet was read and processed @@ -3709,7 +3762,6 @@ static int process_input(int file_index) int ret, i, j; int64_t duration; int64_t pkt_dts; - int disable_discontinuity_correction = copy_ts; is = ifile->ctx; ret = ifile_get_packet(ifile, &pkt); @@ -3853,54 +3905,11 @@ static int process_input(int file_index) if (pkt->dts != AV_NOPTS_VALUE) pkt->dts += duration; - pkt_dts = av_rescale_q_rnd(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); - - if (copy_ts && pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && - (is->iformat->flags & AVFMT_TS_DISCONT) && ist->st->pts_wrap_bits < 60) { - int64_t wrap_dts = av_rescale_q_rnd(pkt->dts + (1LL<st->pts_wrap_bits), - ist->st->time_base, AV_TIME_BASE_Q, - AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX); - if (FFABS(wrap_dts - ist->next_dts) < FFABS(pkt_dts - ist->next_dts)/10) - disable_discontinuity_correction = 0; - } - + // detect and correct timestamp discontinuities for audio/video if ((ist->st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO || ist->st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) && - pkt_dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && - !disable_discontinuity_correction) { - int64_t delta = pkt_dts - ist->next_dts; - if (is->iformat->flags & AVFMT_TS_DISCONT) { - if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE || - delta > 1LL*dts_delta_threshold*AV_TIME_BASE || - pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) { - ifile->ts_offset -= delta; - av_log(NULL, AV_LOG_DEBUG, - "timestamp discontinuity for stream #%d:%d " - "(id=%d, type=%s): %"PRId64", new offset= %"PRId64"\n", - ist->file_index, ist->st->index, ist->st->id, - av_get_media_type_string(ist->st->codecpar->codec_type), - delta, ifile->ts_offset); - pkt->dts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); - if (pkt->pts != AV_NOPTS_VALUE) - pkt->pts -= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base); - } - } else { - if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE || - delta > 1LL*dts_error_threshold*AV_TIME_BASE) { - av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt->dts, ist->next_dts, pkt->stream_index); - pkt->dts = AV_NOPTS_VALUE; - } - if (pkt->pts != AV_NOPTS_VALUE){ - int64_t pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q); - delta = pkt_pts - ist->next_dts; - if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE || - delta > 1LL*dts_error_threshold*AV_TIME_BASE) { - av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt->pts, ist->next_dts, pkt->stream_index); - pkt->pts = AV_NOPTS_VALUE; - } - } - } - } + pkt->dts != AV_NOPTS_VALUE) + ts_discontinuity_process(ifile, ist, pkt); if (pkt->dts != AV_NOPTS_VALUE) ifile->last_ts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);