From patchwork Sat Aug 26 15:11:30 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 43349 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a17:906:4f0f:b0:99c:ff93:59c5 with SMTP id t15csp997037eju; Sat, 26 Aug 2023 08:15:48 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEKy2bbAaHw7FDRtThv7p/EoOsNBngH90MPQ9YEc2w7deapVUioCWmB5H5XpUOsQyKsV3A5 X-Received: by 2002:a17:906:8a61:b0:9a1:aea8:d7cd with SMTP id hy1-20020a1709068a6100b009a1aea8d7cdmr10690407ejc.46.1693062947852; Sat, 26 Aug 2023 08:15:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693062947; cv=none; d=google.com; s=arc-20160816; b=aJzYFq5HF5OApf9ppogX7TXxE12yqp5GHdxgb+ZjvBjCjURQ0Xo65KQJVkYJK7oo57 tbC+SRep53OsMm9yaH7tRWvHmj0aFW7B8amM5cjtOgkIBkFg5Vl3ozduQnNRGwawT/Cd L1tzxPuHD+OyZYC2LaqPAPAEDNHvcEjnlyiKW1JhOCGmMgtZlycyM4eBtIZOkgx1u2D0 vFup5v4f1pZpMqLupnDquTkGU9T2wH/pp0jAGB09LNpW+b68MM+V3IVx5MH57ZXTC3i9 k/DfD1CyBWfatnrzNJ8Qox34QomqQm6pzW0JsP4/NMu4dasQsjnpuEieTetAJs62KBhd 5iSw== 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=vBZtn0ViaRsLe5oSUPm9h7XFbLE3kbdxorCRLoQyFdc=; fh=YOA8vD9MJZuwZ71F/05pj6KdCjf6jQRmzLS+CATXUQk=; b=WQeFo+N2ApxPskeExJJUKfvly2HZ0jx0JhpFrCDOVSq9Kh1ffy5g1fYBvr0Ilo+mD3 ePJbiuROXpRIKjASXiNYeo/i3z5z+WumnhU9O4a+4aO8/c5urV/b3pX4XQiEl4Cf/0TD fZy4eyspcQPMOugSDv1f5z0C4C9EozUg4lvS9FxnqNfRffNr3QYSlvJdVNYUgHo2wrvE BwNxVL4YDcbF7OGzKv/UyCc40OdVJ1+tVHRg+JKYLSD4oy5w8qnZghzsE+2fOfnblCll y/oSiTpAY5N07LrC9chtcrls6GHL8x/4bFQZFLTZ7+o5PpMgYLG80ZfQ5yoX+FdkYt3e qYOQ== 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 z11-20020a170906944b00b0099cd06f391bsi324827ejx.985.2023.08.26.08.15.47; Sat, 26 Aug 2023 08:15:47 -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 CACF168C737; Sat, 26 Aug 2023 18:13:31 +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 6A17068C5D1 for ; Sat, 26 Aug 2023 18:13:16 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 29D7424018E for ; Sat, 26 Aug 2023 17:13:13 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id gN4-CkzeiUuP for ; Sat, 26 Aug 2023 17:13:12 +0200 (CEST) Received: from mail1.khirnov.net (mail1.khirnov.net [IPv6:2a00:c500:561:206::5]) (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 "mail1.khirnov.net", Issuer "smtp.khirnov.net SMTP CA" (verified OK)) by mail0.khirnov.net (Postfix) with ESMTPS id BAD1C2401F9 for ; Sat, 26 Aug 2023 17:13:11 +0200 (CEST) Received: from localhost (mail1.khirnov.net [IPv6:::1]) by mail1.khirnov.net (Postfix) with ESMTP id 3A8C540F8 for ; Sat, 26 Aug 2023 17:15:15 +0200 (CEST) Received: from mail1.khirnov.net ([IPv6:::1]) by localhost (mail1.khirnov.net [IPv6:::1]) (amavis, port 10024) with ESMTP id KMj1R5mEuf5R for ; Sat, 26 Aug 2023 17:15:14 +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 mail1.khirnov.net (Postfix) with ESMTPS id 60130410C for ; Sat, 26 Aug 2023 17:15:05 +0200 (CEST) Received: from libav.khirnov.net (libav.khirnov.net [IPv6:::1]) by libav.khirnov.net (Postfix) with ESMTP id 5E6A53A1043 for ; Sat, 26 Aug 2023 17:11:52 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Sat, 26 Aug 2023 17:11:30 +0200 Message-Id: <20230826151144.24858-4-anton@khirnov.net> X-Mailer: git-send-email 2.40.1 In-Reply-To: <20230826151144.24858-1-anton@khirnov.net> References: <20230826151144.24858-1-anton@khirnov.net> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 04/18] fftools/ffmpeg_mux: stop rescaling timestamps in of_streamcopy() 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: tmSAA7XvCAAW This function converts packet timestamps from the input stream timebase to OutputStream.mux_timebase, which may or may not be equal to the actual output AVStream timebase (and even when it is, this may not always be the optimal choice due to bitstream filtering). Just keep the timestamps in input stream timebase, they will be rescaled as needed before bitstream filtering and/or sending the packet to the muxer. Drop now-unused OutputStream.mux_timebase. --- fftools/ffmpeg.h | 2 -- fftools/ffmpeg_enc.c | 2 -- fftools/ffmpeg_mux.c | 21 +++++++-------------- fftools/ffmpeg_mux_init.c | 2 -- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index d53181e427..ef5bb13908 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -523,8 +523,6 @@ typedef struct OutputStream { /* dts of the last packet sent to the muxing queue, in AV_TIME_BASE_Q */ int64_t last_mux_dts; - // the timebase of the packets sent to the muxer - AVRational mux_timebase; AVRational enc_timebase; Encoder *enc; diff --git a/fftools/ffmpeg_enc.c b/fftools/ffmpeg_enc.c index 96424272bf..3c9fdd3237 100644 --- a/fftools/ffmpeg_enc.c +++ b/fftools/ffmpeg_enc.c @@ -463,8 +463,6 @@ int enc_open(OutputStream *ost, AVFrame *frame) if (ost->st->time_base.num <= 0 || ost->st->time_base.den <= 0) ost->st->time_base = av_add_q(ost->enc_ctx->time_base, (AVRational){0, 1}); - ost->mux_timebase = enc_ctx->time_base; - ret = of_stream_init(of, ost); if (ret < 0) return ret; diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index ab9bb398c1..076c6afabd 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -392,7 +392,7 @@ int of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts) OutputFile *of = output_files[ost->file_index]; MuxStream *ms = ms_from_ost(ost); int64_t start_time = (of->start_time == AV_NOPTS_VALUE) ? 0 : of->start_time; - int64_t ost_tb_start_time = av_rescale_q(start_time, AV_TIME_BASE_Q, ost->mux_timebase); + int64_t ts_offset; AVPacket *opkt = ms->pkt; int ret; @@ -425,10 +425,10 @@ int of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts) if (ret < 0) return ret; - opkt->time_base = ost->mux_timebase; + ts_offset = av_rescale_q(start_time, AV_TIME_BASE_Q, opkt->time_base); if (pkt->pts != AV_NOPTS_VALUE) - opkt->pts = av_rescale_q(pkt->pts, pkt->time_base, opkt->time_base) - ost_tb_start_time; + opkt->pts -= ts_offset; if (pkt->dts == AV_NOPTS_VALUE) { opkt->dts = av_rescale_q(dts, AV_TIME_BASE_Q, opkt->time_base); @@ -436,16 +436,13 @@ int of_streamcopy(OutputStream *ost, const AVPacket *pkt, int64_t dts) int duration = av_get_audio_frame_duration2(ost->par_in, pkt->size); if(!duration) duration = ost->par_in->frame_size; - opkt->dts = av_rescale_delta(pkt->time_base, pkt->dts, + opkt->dts = av_rescale_delta(opkt->time_base, pkt->dts, (AVRational){1, ost->par_in->sample_rate}, duration, &ms->ts_rescale_delta_last, opkt->time_base); /* dts will be set immediately afterwards to what pts is now */ - opkt->pts = opkt->dts - ost_tb_start_time; - } else - opkt->dts = av_rescale_q(pkt->dts, pkt->time_base, opkt->time_base); - opkt->dts -= ost_tb_start_time; - - opkt->duration = av_rescale_q(pkt->duration, pkt->time_base, opkt->time_base); + opkt->pts = opkt->dts - ts_offset; + } + opkt->dts -= ts_offset; { int ret = trigger_fix_sub_duration_heartbeat(ost, pkt); @@ -511,10 +508,6 @@ static int thread_start(Muxer *mux) MuxStream *ms = ms_from_ost(ost); AVPacket *pkt; - /* try to improve muxing time_base (only possible if nothing has been written yet) */ - if (!av_fifo_can_read(ms->muxing_queue)) - ost->mux_timebase = ost->st->time_base; - while (av_fifo_read(ms->muxing_queue, &pkt, 1) >= 0) { ret = thread_submit_packet(mux, ost, pkt); if (pkt) { diff --git a/fftools/ffmpeg_mux_init.c b/fftools/ffmpeg_mux_init.c index 0289cdabad..cf4cd2d5b7 100644 --- a/fftools/ffmpeg_mux_init.c +++ b/fftools/ffmpeg_mux_init.c @@ -1090,8 +1090,6 @@ static int streamcopy_init(const Muxer *mux, OutputStream *ost) } } - ost->mux_timebase = ist->st->time_base; - fail: avcodec_free_context(&codec_ctx); av_dict_free(&codec_opts);