From patchwork Tue Sep 27 04:40:56 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gyan Doshi X-Patchwork-Id: 38379 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3b1c:b0:96:9ee8:5cfd with SMTP id c28csp266933pzh; Mon, 26 Sep 2022 21:41:36 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6r53mEp/sj3ToMdiqDEMhpxc95izvYf22j6t0de+2aXV1A/VNxBwmh+JBJrBCWZgk8USOe X-Received: by 2002:a17:906:ef8b:b0:77f:2b14:6eef with SMTP id ze11-20020a170906ef8b00b0077f2b146eefmr21394692ejb.612.1664253696541; Mon, 26 Sep 2022 21:41:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1664253696; cv=none; d=google.com; s=arc-20160816; b=R6nlYWDMCPJW5laWfNHiY0ZK3EgUW3FkavFNHovxz1OoJnBYa/56nQ1ME/dfJofspq dbeyUZ7/Pw6/RONlEiFGEIkHz7fgEIPu/hGLmubL0usF5CfTsfzEsGFXNNOaSUE09h3A fByrDDbUekRq5vw2nIWd2S5/ECtpdgK1ZMlSkPR1RcSRKAQRIeksF70zyeA4Bdxaahql tiDIThaKu7qRVIrIkSUimuarrDP1/K0NyiG4udKgCx+is90PAOjZnGxk1veVj/TsCb0Y PRg1nQrZw35Z+Z/CAxdgaZ4G+ZZbWIkcPWIz2Qoihr5XtgNULFF0+2ZnqBmJ78eomKfj HLeQ== 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:message-id:date:to:from :delivered-to; bh=GNENjhFTDhDslGPjyPl9q2sWJy8r9V52ULZFvKgR4XQ=; b=Ac97G1d/cnBAjFABVos2k3EogBEnrmPAMbrRENjWYlYQUWa59ensQq7PcCKUSku2Rp EfxRPkSfGt2FIY4ucRKGmDdONhj0hhYQcRenVLGiskeUVCqDEsJq1bA9YSsbDa3hkl6n VU/jjzbyew+v54fiXOEMSiGZC4RnRKTbOsTyF2OtUbKBRgICAn6mCdCcPBBQCGJcEx85 QSXfkTsfGWOh3qS9pMiFk2PBLkGM44YsaI1BMAw6C5w0zsCiCF8KyMqmWs+N4Bhc6+vj lJ/YDd90BEJ5Rc3Rm5kQIhb9T961AERipl2ff/w44aqG+TrhKbuvl5pHP2AiyiW+pvfX xc1A== 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 n6-20020a170906724600b00783af0d1ed8si176348ejk.243.2022.09.26.21.41.35; Mon, 26 Sep 2022 21:41:36 -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 56E6668BA2B; Tue, 27 Sep 2022 07:41:32 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mout-p-103.mailbox.org (mout-p-103.mailbox.org [80.241.56.161]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4070368B5C8 for ; Tue, 27 Sep 2022 07:41:24 +0300 (EEST) Received: from smtp2.mailbox.org (smtp2.mailbox.org [IPv6:2001:67c:2050:b231:465::2]) (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-103.mailbox.org (Postfix) with ESMTPS id 4Mc6QV1LLCz9sQQ for ; Tue, 27 Sep 2022 06:41:22 +0200 (CEST) From: Gyan Doshi To: ffmpeg-devel@ffmpeg.org Date: Tue, 27 Sep 2022 10:10:56 +0530 Message-Id: <20220927044056.2154-1-ffmpeg@gyani.pro> MIME-Version: 1.0 X-Rspamd-Queue-Id: 4Mc6QV1LLCz9sQQ Subject: [FFmpeg-devel] [PATCH] ffmpeg: fix implementation of updated input start time 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: 51UXoTYRaAsN The current adjustment of input start times just adjusts the tsoffset. And it does so, by resetting the tsoffset to nullify the new start time. This leads to breakage of -copyts, ignoring of user_ts_offset, breaking of -isync as well as breaking wrap correction. Fixed by taking cognizance of these parameters, and by correcting start times just before sync offsets are applied. --- fftools/ffmpeg.c | 24 +------------------- fftools/ffmpeg.h | 5 ++++- fftools/ffmpeg_demux.c | 4 ++-- fftools/ffmpeg_opt.c | 50 +++++++++++++++++++++++++++++++++++++----- 4 files changed, 52 insertions(+), 31 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 0e1477299d..fabb0fb952 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1898,7 +1898,7 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p start_time = 0; if (copy_ts) { start_time += f->start_time != AV_NOPTS_VALUE ? f->start_time : 0; - start_time += start_at_zero ? 0 : f->ctx->start_time; + start_time += start_at_zero ? 0 : f->enabled_start_time; } if (ist->pts >= f->recording_time + start_time) { close_output_stream(ost); @@ -3323,28 +3323,6 @@ static int transcode_init(void) input_streams[j + ifile->ist_index]->start = av_gettime_relative(); } - // Correct starttime based on the enabled streams - for (i = 0; i < nb_input_files; i++) { - InputFile *ifile = input_files[i]; - AVFormatContext *is = ifile->ctx; - int64_t new_start_time = INT64_MAX; - - if (is->start_time == AV_NOPTS_VALUE || - !(is->iformat->flags & AVFMT_TS_DISCONT)) - continue; - - for (int j = 0; j < is->nb_streams; j++) { - AVStream *st = is->streams[j]; - if(st->discard == AVDISCARD_ALL || st->start_time == AV_NOPTS_VALUE) - continue; - new_start_time = FFMIN(new_start_time, av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q)); - } - if (new_start_time > is->start_time) { - av_log(is, AV_LOG_VERBOSE, "Correcting start time by %"PRId64"\n", new_start_time - is->start_time); - ifile->ts_offset = -new_start_time; - } - } - /* init input streams */ for (i = 0; i < nb_input_streams; i++) if ((ret = init_input_stream(i, error, sizeof(error))) < 0) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index ede0b2bd96..b93c2427b6 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -439,7 +439,10 @@ typedef struct InputFile { AVRational time_base; /* time base of the duration */ int64_t input_ts_offset; int input_sync_ref; - + /** + * Effective format start time based on enabled streams. + */ + int64_t enabled_start_time; int64_t ts_offset; /** * Extra timestamp offset added by discontinuity handling. diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index 6e89f5999a..6125181f81 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -120,7 +120,7 @@ static int seek_to_start(InputFile *ifile) static void ts_fixup(InputFile *ifile, AVPacket *pkt, int *repeat_pict) { InputStream *ist = input_streams[ifile->ist_index + pkt->stream_index]; - const int64_t start_time = ifile->ctx->start_time; + const int64_t start_time = ifile->enabled_start_time; int64_t duration; if (debug_ts) { @@ -367,7 +367,7 @@ int ifile_get_packet(InputFile *f, AVPacket **pkt) if (f->readrate || f->rate_emu) { int i; int64_t file_start = copy_ts * ( - (f->ctx->start_time != AV_NOPTS_VALUE ? f->ctx->start_time * !start_at_zero : 0) + + (f->enabled_start_time != AV_NOPTS_VALUE ? f->enabled_start_time * !start_at_zero : 0) + (f->start_time != AV_NOPTS_VALUE ? f->start_time : 0) ); float scale = f->rate_emu ? 1.0 : f->readrate; diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c index 5febe319e4..8df322c31c 100644 --- a/fftools/ffmpeg_opt.c +++ b/fftools/ffmpeg_opt.c @@ -293,6 +293,44 @@ static int parse_and_set_vsync(const char *arg, int *vsync_var, int file_idx, in return 0; } +/* Correct input file start times based on enabled streams */ +static int correct_input_start_times(void) +{ + for (int i = 0; i < nb_input_files; i++) { + InputFile *ifile = input_files[i]; + AVFormatContext *is = ifile->ctx; + int64_t new_start_time = INT64_MAX, diff, abs_start_seek; + + ifile->enabled_start_time = is->start_time; + + if (is->start_time == AV_NOPTS_VALUE || + !(is->iformat->flags & AVFMT_TS_DISCONT)) + continue; + + for (int j = 0; j < is->nb_streams; j++) { + AVStream *st = is->streams[j]; + if(st->discard == AVDISCARD_ALL || st->start_time == AV_NOPTS_VALUE) + continue; + new_start_time = FFMIN(new_start_time, av_rescale_q(st->start_time, st->time_base, AV_TIME_BASE_Q)); + } + + diff = new_start_time - is->start_time; + if (diff) { + av_log(NULL, AV_LOG_VERBOSE, "Correcting start time of Input #%d by %"PRId64" us.\n", i, diff); + ifile->enabled_start_time = new_start_time; + if (copy_ts && start_at_zero) + ifile->ts_offset = -new_start_time; + else if (!copy_ts) { + abs_start_seek = is->start_time + (ifile->start_time != AV_NOPTS_VALUE) ? ifile->start_time : 0; + ifile->ts_offset = abs_start_seek > new_start_time ? -abs_start_seek : -new_start_time; + } + ifile->ts_offset += ifile->input_ts_offset; + } + } + + return 0; +} + static int apply_sync_offsets(void) { for (int i = 0; i < nb_input_files; i++) { @@ -321,9 +359,9 @@ static int apply_sync_offsets(void) if (self->ctx->start_time_realtime != AV_NOPTS_VALUE && ref->ctx->start_time_realtime != AV_NOPTS_VALUE) { self_start_time = self->ctx->start_time_realtime; ref_start_time = ref->ctx->start_time_realtime; - } else if (self->ctx->start_time != AV_NOPTS_VALUE && ref->ctx->start_time != AV_NOPTS_VALUE) { - self_start_time = self->ctx->start_time; - ref_start_time = ref->ctx->start_time; + } else if (self->enabled_start_time != AV_NOPTS_VALUE && ref->enabled_start_time != AV_NOPTS_VALUE) { + self_start_time = self->enabled_start_time; + ref_start_time = ref->enabled_start_time; } else { start_times_set = 0; } @@ -3747,8 +3785,6 @@ int ffmpeg_parse_options(int argc, char **argv) goto fail; } - apply_sync_offsets(); - /* create the complex filtergraphs */ ret = init_complex_filters(); if (ret < 0) { @@ -3763,6 +3799,10 @@ int ffmpeg_parse_options(int argc, char **argv) goto fail; } + correct_input_start_times(); + + apply_sync_offsets(); + check_filter_outputs(); fail: