From patchwork Wed Aug 10 16:25:37 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37214 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012526pzi; Wed, 10 Aug 2022 09:27:01 -0700 (PDT) X-Google-Smtp-Source: AA6agR6tD+M8dm41wkek3FW9gDuNYFHdxquD3tccpFt238DlXs6I8zvueHzCljT7WFaS0u9uEpTd X-Received: by 2002:a17:907:2c62:b0:730:d9b9:aabb with SMTP id ib2-20020a1709072c6200b00730d9b9aabbmr20096213ejc.84.1660148821138; Wed, 10 Aug 2022 09:27:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148821; cv=none; d=google.com; s=arc-20160816; b=bu6utfSM5D/qTttMe8t/LhL4nKBqPXQ0AO6TFcfRSjiMLxcyBAaqfiSKwsgRRffCkh lzA6auUGI6VrtaZYIrTZ6i9dtVi+Rvm4c7boOQ6wcYmCglJRhDrcfM2ywIBk7nYJZPtI rzw8T+9yeoZMbKoTWEvmA7j8XwXL5yeic7vE4qnkeGGNBse67zoA2ojNlnVftCc5Tvy+ XgJhD4itfFZDfIEDl7w82jpWWjcpmSzyS+pTGwEqFryeZZ5sZCCFGLR60v6rZrI2ovS9 3tsl10iUMHyj6iyw9xY4/cdamN80SloYdq8I3TUzBLJNILrmcH6zJw0v/s0SxUHZx8bv gURg== 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=Xwvnc1uoPJtnruFlXa4vxdFef+busorew0AvTdc+JXQ=; b=ULpYqgs3XilI9oA0zQ5FL5KdsEQxtrOp0jfLPSu9/OiB5DXxDuOAGqm9+vniQFFStW eGYQX3BB06GJQ6sCFEM8PuLLmAXvQ+e5BMNRLDqpX1kpfs3y9tMOM379C/Tezme0wUGI bVxD3zps7t4x2gVdwdio4qr9ELbVYUHrpBtARe8JW4BGmhD729OLjwtOgUiCEVHaqwNd 4IqsvL25o7IDTdLY0Uk/TQcpo69aX0u44FGXkw8FSHkKkcPUcuJncW8MDU9O6jnlISEC cumXrlBtjBcc01inw8P3H3N8T9843Qztv3PzLzKoJKqHboWKf4wtp8/I0s8DzXhOD1TV DXoA== 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 dd16-20020a1709069b9000b0072b3bc0d215si3237767ejc.149.2022.08.10.09.26.46; Wed, 10 Aug 2022 09:27:01 -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 58FB168B8C0; Wed, 10 Aug 2022 19:26:09 +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 1F75E68B45F for ; Wed, 10 Aug 2022 19:25:59 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 9DB42240179 for ; Wed, 10 Aug 2022 18:25:58 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id qhlsUAXmjBG9 for ; Wed, 10 Aug 2022 18:25:58 +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 350962404C7 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 2CB243A03EF; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:37 +0200 Message-Id: <20220810162545.21382-1-anton@khirnov.net> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/9] fftools/ffmpeg: mark all encode sync queues as done before flushing encoders 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: pBZ/Z6cGeVwd --- fftools/ffmpeg.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 0682a6fcc5..16b1ba8af7 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1780,6 +1780,13 @@ static void flush_encoders(void) { int i, ret; + for (i = 0; i < nb_output_streams; i++) { + OutputStream *ost = output_streams[i]; + OutputFile *of = output_files[ost->file_index]; + if (ost->sq_idx_encode >= 0) + sq_send(of->sq_encode, ost->sq_idx_encode, SQFRAME(NULL)); + } + for (i = 0; i < nb_output_streams; i++) { OutputStream *ost = output_streams[i]; AVCodecContext *enc = ost->enc_ctx; From patchwork Wed Aug 10 16:25:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37211 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012238pzi; Wed, 10 Aug 2022 09:26:31 -0700 (PDT) X-Google-Smtp-Source: AA6agR6xR098kCJqxIPQXT/TlUqRnaz6JdNpcMfcTw1IWINJyzT1w3ukTWlSy8/NiJeEopJ/gIbj X-Received: by 2002:a17:906:6a10:b0:730:e9bd:1110 with SMTP id qw16-20020a1709066a1000b00730e9bd1110mr18540348ejc.88.1660148791636; Wed, 10 Aug 2022 09:26:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148791; cv=none; d=google.com; s=arc-20160816; b=z5JClp8VwKNNYFFTueDZKSu0HRDgQUmRnAMRl0xfWYF6jMElc8NAf57AhKDjv01C73 H1AW0NfqPtwk+265mOUHdRfmNZPay06pssFVIe01IX5c5kTSEf6F8Gdd1OG0CnjRufyI i+qAzuaV4vcTXL2BpLnMDw4g414C4bYvF8FLVNJYGRYZ1oBY4PdpG7vlda3IgzvoH05k 9UKP+L6nu+mlTGlMw5a9XNpYD0oP+mTZ/NE/4v2yFJvSzyBXVRSLHJ/Ctc8u8iKN1r9M 1vlqKlEfmZOH4KgWGIQhNpgToRJvEHimHluCTrYJQ9c40mrML1ZHngZWVG9UrOSK8/FO ZgAg== 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=g7FGVj954R+O/+FV7FLEK94m65B72uxkw7N22ZOsz6w=; b=fX5le0L62laSljo1v73zGGWlexTWGbD1ULdpJ4QGG2pq/r0o7Bc/3t7JN94eXjUQxA tpi6HDbupa6pjCZJu3ovTyd1g2sHNBpMmZnbfTKdzchqCVVjWhb63+2UZrNDsC4knXgS mt4pv6Ar3l+z1KSdyruZ4NUE/zXB4+pBlxp2kpwkiJj/KVk85tynz9Y+Nd5Pa1BvXZnp 79NyJamCwoCkmG1QaXc4ew0x5rq2wC4mab72IaO5jlJwRGkmctLfF6tEIW+t1csq7Bb0 4SazOwD24rZzVdjb4Aox+OL6jzofzC3o9oNNIFg27YVekPzAWrY00bLKYXdv5Nif0vtb VAbg== 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 sa38-20020a1709076d2600b006ff78d48b00si4909484ejc.534.2022.08.10.09.26.22; Wed, 10 Aug 2022 09:26:31 -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 2AAAD68B84E; Wed, 10 Aug 2022 19:26:06 +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 B76CF68B4DC for ; Wed, 10 Aug 2022 19:25:58 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id A2DEE240512 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id LQpplWrL2pQr for ; Wed, 10 Aug 2022 18:25:57 +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 26D452400F5 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 2EF723A01D2; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:38 +0200 Message-Id: <20220810162545.21382-2-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 2/9] fftools/ffmpeg_mux: avoid leaking pkt on errors 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: X3AcFdNIv7Rh --- fftools/ffmpeg_mux.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/fftools/ffmpeg_mux.c b/fftools/ffmpeg_mux.c index 08a76f0066..b424ef0021 100644 --- a/fftools/ffmpeg_mux.c +++ b/fftools/ffmpeg_mux.c @@ -97,8 +97,10 @@ static int write_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) fs = filesize(s->pb); atomic_store(&of->mux->last_filesize, fs); - if (fs >= of->mux->limit_filesize) - return AVERROR_EOF; + if (fs >= of->mux->limit_filesize) { + ret = AVERROR_EOF; + goto fail; + } if ((st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && ost->vsync_method == VSYNC_DROP) || (st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0)) @@ -138,8 +140,11 @@ static int write_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) av_log(s, loglevel, "Non-monotonous DTS in output stream " "%d:%d; previous: %"PRId64", current: %"PRId64"; ", ost->file_index, ost->st->index, ms->last_mux_dts, pkt->dts); - if (exit_on_error) - return AVERROR(EINVAL); + if (exit_on_error) { + ret = AVERROR(EINVAL); + goto fail; + } + av_log(s, loglevel, "changing to %"PRId64". This may result " "in incorrect timestamps in the output file.\n", max); @@ -170,10 +175,13 @@ static int write_packet(OutputFile *of, OutputStream *ost, AVPacket *pkt) ret = av_interleaved_write_frame(s, pkt); if (ret < 0) { print_error("av_interleaved_write_frame()", ret); - return ret; + goto fail; } return 0; +fail: + av_packet_unref(pkt); + return ret; } static int sync_queue_process(OutputFile *of, OutputStream *ost, AVPacket *pkt) From patchwork Wed Aug 10 16:25:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37213 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012409pzi; Wed, 10 Aug 2022 09:26:48 -0700 (PDT) X-Google-Smtp-Source: AA6agR5LrzeV3e+FZVkRIbXxkKyGHRBjtby6DNFZZrd4tsTsFSMTqalh4m+rFWwAutO07JBYOULO X-Received: by 2002:a17:907:6092:b0:731:59f0:49ac with SMTP id ht18-20020a170907609200b0073159f049acmr10853046ejc.383.1660148808245; Wed, 10 Aug 2022 09:26:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148808; cv=none; d=google.com; s=arc-20160816; b=chK6nbP311SMa0/p6ENQwgqtDQYz+kITK9gDwU3bP2PZmlrY5tDMeGgJPPkx1cZ7Ch YuDUJKbdKAB4hVJjkFRFLLDCO0X/L3wKxoxhrUryJWUs0b55z5NgoZbYmsacKUyDOSNw u4QB7l1G+fCYovvYHdARjjm2ayv+6T24wfL0U/bxIHRZnc5hP7sqxu6IdPcMHgwpE8E6 /xZ/EiCySQRGnT4so0J56FphOd8IUbDv4aimaVMSjw3jUSPTh4MY17OFMO/cj3CL4V42 Nkka3qC7vr24KDALKJZksI6SnYWdv9P4/VreRDxvenhNNrHwyi4Bi3aBWu8rR/MhkrH6 3xaA== 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=tCij85526CxqxrIhE+eU2BBj5NKBfXdOVaFRIURlo5o=; b=08OiU5hPJqwjaW7GIMFTdE9xenIySMvsZfNE7BCTslhO67gv1oyjKTottMfyGOSVcr Vnkuh47431LfL4tXNvsJlJw45oT17ZcgdHOsxDnHTBRVEx4pKIew+9NCKQFFJi2Dawf8 ZkjbJiRlb2/azrCPIHNN+OKOeksWPmQDCNIrLYR0d6pSaNujhh9zfGu4d50UMQVxXTir T7zj1zJsek0Kj9lhQTpLfWT5EBiLqWmiqiDgPeRDxn60hMZAn2YD8FkAQHs5n8L2T6L5 2k292wh5oIDP9wMiiNaRlZet7IYrhAP1Ypa9e0ynnT6Qq/iS28DwpCreEaIKsONWX31b XS0g== 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 hq16-20020a1709073f1000b0072ed45a17dbsi5385397ejc.267.2022.08.10.09.26.34; Wed, 10 Aug 2022 09:26:48 -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 3E5C468B371; Wed, 10 Aug 2022 19:26:08 +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 ECEFB68B590 for ; Wed, 10 Aug 2022 19:25:58 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 7D2072404AF for ; Wed, 10 Aug 2022 18:25:58 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 8pArh97Tm3TN for ; Wed, 10 Aug 2022 18:25:57 +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 31C67240179 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 339233A03FD; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:39 +0200 Message-Id: <20220810162545.21382-3-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 3/9] fftools/ffmpeg: move stream-dependent starttime correction to transcode_init() 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: sSrAVk7lq68k Currently this code is located in the discontinuity handling block, where it does not belong. --- fftools/ffmpeg.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 16b1ba8af7..6f822de97d 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3313,6 +3313,27 @@ 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->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) @@ -3752,24 +3773,6 @@ static int process_input(int file_index) if(!ist->wrap_correction_done && is->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){ int64_t stime, stime2; - // Correcting starttime based on the enabled streams - // FIXME this ideally should be done before the first use of starttime but we do not know which are the enabled streams at that point. - // so we instead do it here as part of discontinuity handling - if ( ist->next_dts == AV_NOPTS_VALUE - && ifile->ts_offset == -is->start_time - && (is->iformat->flags & AVFMT_TS_DISCONT)) { - int64_t new_start_time = INT64_MAX; - for (i=0; inb_streams; i++) { - AVStream *st = is->streams[i]; - 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; - } - } stime = av_rescale_q(is->start_time, AV_TIME_BASE_Q, ist->st->time_base); stime2= stime + (1ULL<st->pts_wrap_bits); From patchwork Wed Aug 10 16:25:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37216 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012641pzi; Wed, 10 Aug 2022 09:27:14 -0700 (PDT) X-Google-Smtp-Source: AA6agR5pfXRDR+UiIubhH5zoT5BsYYC4C3dtuGZ+noYnxvwh62lcBPTaGWiE9ILXPCFmkgZutAXc X-Received: by 2002:a05:6402:4442:b0:43b:c866:21be with SMTP id o2-20020a056402444200b0043bc86621bemr27849378edb.28.1660148833860; Wed, 10 Aug 2022 09:27:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148833; cv=none; d=google.com; s=arc-20160816; b=OBx9xG1ya4z8h8bDhSAo0Qrm1AbU2voCTI9TJ2BvCi0ecp4YyUX0onBVmeczEhqvGz zfhtKifBPmq5D3aSnyLlCaZ5rXLnlk5rsFKWTppeSdPTPsLO7AMclR1bpSsvk6yfEROf zaw+pg2wL+pQ+6X66QX/PHlD5MbJDi/jiME08WgX2Exumy0H7Vr5r5bcXejfcj5qbrp9 j/gW28mWBmeZ4C43K7Kg1QuIEKtBfQttLPlMXBJ/N36crp3m6WWAknpoW6FGZDjtjBl8 vORhQ4jGYHx+BmvSbthZ/Q5LZOU95uExQWuzl2O8+/AmDFo7fgEMqSAs3g8piuGB59Vh KNSQ== 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=800qE4lZ+W7OY21qDl10fgMITHJYNAhvDIcvAbRT7jE=; b=qtN4W6G27JhmW6/lZmsNiH7Ti/z2Bm+Z+tP9FfokIZIhkl6K2j/UzbC5z5rC/x4bfU 8rfLbcfvU3Zex+IN9iqHjAjYYYtEuiiwjUBg7BIb8vDlmu/8AMdthAwyBx0KmHJMIET5 T/zDAhzn/1D57DfHydIHHKqVQZD8MtTJRMQNAIz/MlicrFKKL1Cyi6K5FL/7vwB77yu8 OvkFTzADCNoRBRjp4KdvX0CHB0mJ5sfcbPyN8hv2XSbGq8BEMidl+0FdUuI5fmPg0Fd5 Fcfru1y743GU+daV4Yh9DeYehnLHEyd3+PxUt+J0JGwvGKHxIYipXLIHqnSUjA9Cg2IJ OHwg== 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 dz10-20020a0564021d4a00b00440e74ec425si6162369edb.540.2022.08.10.09.26.56; Wed, 10 Aug 2022 09:27:13 -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 7178668B895; Wed, 10 Aug 2022 19:26:10 +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 8500868B45F for ; Wed, 10 Aug 2022 19:25:59 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id F3BA62404C7 for ; Wed, 10 Aug 2022 18:25:58 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id hQaIBgftm5kv for ; Wed, 10 Aug 2022 18:25:58 +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 3AEC2240506 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 381AA3A041D; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:40 +0200 Message-Id: <20220810162545.21382-4-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 4/9] fftools/ffmpeg: pre-compute the streamcopy start pts before transcoding starts 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: F+RnCB8NmCof InputFile.ts_offset can change during transcoding, due to discontinuity correction. This should not affect the streamcopy starting timestamp. Cf. bf2590aed3e64d44a5e2430fdbe89f91f5e55bfe --- fftools/ffmpeg.c | 17 ++++++++++++----- fftools/ffmpeg.h | 6 ++++++ 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 6f822de97d..b895f85e75 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -1879,12 +1879,9 @@ static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *p return; if (!ost->streamcopy_started && !ost->copy_prior_start) { - int64_t comp_start = start_time; - if (copy_ts && f->start_time != AV_NOPTS_VALUE) - comp_start = FFMAX(start_time, f->start_time + f->ts_offset); if (pkt->pts == AV_NOPTS_VALUE ? - ist->pts < comp_start : - pkt->pts < av_rescale_q(comp_start, AV_TIME_BASE_Q, ist->st->time_base)) + ist->pts < ost->ts_copy_start : + pkt->pts < av_rescale_q(ost->ts_copy_start, AV_TIME_BASE_Q, ist->st->time_base)) return; } @@ -2741,6 +2738,7 @@ static int init_output_stream_streamcopy(OutputStream *ost) { OutputFile *of = output_files[ost->file_index]; InputStream *ist = get_input_stream(ost); + InputFile *ifile = input_files[ist->file_index]; AVCodecParameters *par = ost->st->codecpar; AVCodecContext *codec_ctx; AVRational sar; @@ -2805,6 +2803,15 @@ static int init_output_stream_streamcopy(OutputStream *ost) if (ost->st->duration <= 0 && ist->st->duration > 0) ost->st->duration = av_rescale_q(ist->st->duration, ist->st->time_base, ost->st->time_base); + if (!ost->copy_prior_start) { + ost->ts_copy_start = (of->start_time == AV_NOPTS_VALUE) ? + 0 : of->start_time; + if (copy_ts && ifile->start_time != AV_NOPTS_VALUE) { + ost->ts_copy_start = FFMAX(ost->ts_copy_start, + ifile->start_time + ifile->ts_offset); + } + } + if (ist->st->nb_side_data) { for (i = 0; i < ist->st->nb_side_data; i++) { const AVPacketSideData *sd_src = &ist->st->side_data[i]; diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 2ac7cbe522..8b2e73d642 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -484,6 +484,12 @@ typedef struct OutputStream { int64_t last_mux_dts; /* pts of the last frame received from the filters, in AV_TIME_BASE_Q */ int64_t last_filter_pts; + + // timestamp from which the streamcopied streams should start, + // in AV_TIME_BASE_Q; + // everything before it should be discarded + int64_t ts_copy_start; + // the timebase of the packets sent to the muxer AVRational mux_timebase; AVRational enc_timebase; 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); From patchwork Wed Aug 10 16:25:42 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37212 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012262pzi; Wed, 10 Aug 2022 09:26:33 -0700 (PDT) X-Google-Smtp-Source: AA6agR641M2TXaPmVLroM7QeeT028hdY9XuavF11TP/5tWy3fhMr1NutPo1YvKLHALUHzDqstU4r X-Received: by 2002:a05:6402:428c:b0:440:8259:7a2b with SMTP id g12-20020a056402428c00b0044082597a2bmr16332149edc.329.1660148793318; Wed, 10 Aug 2022 09:26:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148793; cv=none; d=google.com; s=arc-20160816; b=OpH7NXQFXir9iRX7bUkzOmubLUAxpbm00tyb0SCsUM4ZkpHvehr7sbD2WDGO8zyPHf C8h0276LcrM7fJJV/CjHPSoXSlKncpY33+/oxATBCz7euxgTqsTY6kpDiIPREzrFrtEg UPCv7ROTFZof2iiIQ5yiJkRaHlUN0idQOYiJvaz4PmST3DBr04eAe3KkbDMAc1ECJLV4 XW5aaol2/oX6YOvVZBBdU3nH8j2vhiS3a6TASbeo77fN9sjcik+8GaDGYv1Em/1es3Bg t12MFX+WAKzSD4EW+Gna6VWJogxD/IENZ5xfwxG34DgpFl0wSSB30uCPymTDrherAgfw Q7ag== 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=WYFpheDaP335j2cGSjvXNrHsULWwVv1pZ3KmUAhXGiM=; b=AjCtMoS6GPwIFUBI23zaIkMrBBNy3vhY+DVh5U74GCHuq/zYicsj0Hpq20mY3V0Oag eM+VnG1FIzGikjV1PWCtkZMk6YgBTTiCk6+3UOsjfHVfB/Yj/3W3+okIDttWrVNjnuDt 8Wcf7z7jUwrPrci/pcuBvK12DzlKnAgQcBK0FJZ44J+eF10xONA6AmR5VtEcwnOxmFst 2AAVAkBo6pVFC+/YiOd92x4wxSYq67oxbNH7wHnE2qAIwS0/NwP2dnkiCxt+jmDGkqGg Cnf28nyQyTJI347s6w1mwzFFWK4GnXUAHhp/6dg2aatWrZs8OAkN+Bq59/j12buDXxpo qxyg== 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 hw9-20020a170907a0c900b0073318653cb0si1069741ejc.759.2022.08.10.09.26.09; Wed, 10 Aug 2022 09:26:33 -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 15AFA68B64C; Wed, 10 Aug 2022 19:26:05 +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 B39D668B371 for ; Wed, 10 Aug 2022 19:25:58 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 36A8A2400F5 for ; Wed, 10 Aug 2022 18:25:58 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id bRhn7iTLMfWL for ; Wed, 10 Aug 2022 18:25:57 +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 33C2E2404AF for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4142F3A0449; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:42 +0200 Message-Id: <20220810162545.21382-6-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 6/9] fftools/ffmpeg: move inter-stream ts discontinuity handling to ts_discontinuity_process() 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: Dq4mnSZYp7IF --- fftools/ffmpeg.c | 37 +++++++++++++++---------------------- 1 file changed, 15 insertions(+), 22 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 0332528d57..cacbde27db 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3743,7 +3743,22 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, } } } + } else if (ist->next_dts == AV_NOPTS_VALUE && !copy_ts && + fmt_is_discont && ifile->last_ts != AV_NOPTS_VALUE) { + int64_t delta = pkt_dts - ifile->last_ts; + if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE || + delta > 1LL*dts_delta_threshold*AV_TIME_BASE) { + ifile->ts_offset -= delta; + av_log(NULL, AV_LOG_DEBUG, + "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", + 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); + } } + + ifile->last_ts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q); } /* @@ -3761,7 +3776,6 @@ static int process_input(int file_index) AVPacket *pkt; int ret, i, j; int64_t duration; - int64_t pkt_dts; is = ifile->ctx; ret = ifile_get_packet(ifile, &pkt); @@ -3877,24 +3891,6 @@ static int process_input(int file_index) if (pkt->dts != AV_NOPTS_VALUE) pkt->dts *= ist->ts_scale; - 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 ((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 && !copy_ts - && (is->iformat->flags & AVFMT_TS_DISCONT) && ifile->last_ts != AV_NOPTS_VALUE) { - int64_t delta = pkt_dts - ifile->last_ts; - if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE || - delta > 1LL*dts_delta_threshold*AV_TIME_BASE){ - ifile->ts_offset -= delta; - av_log(NULL, AV_LOG_DEBUG, - "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", - 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); - } - } - duration = av_rescale_q(ifile->duration, ifile->time_base, ist->st->time_base); if (pkt->pts != AV_NOPTS_VALUE) { pkt->pts += duration; @@ -3911,9 +3907,6 @@ static int process_input(int file_index) 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); - if (debug_ts) { av_log(NULL, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s off:%s off_time:%s\n", ifile->ist_index + pkt->stream_index, From patchwork Wed Aug 10 16:25:43 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37218 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012775pzi; Wed, 10 Aug 2022 09:27:27 -0700 (PDT) X-Google-Smtp-Source: AA6agR4prVrFF9/OdNsp1ziThqC7oap6SEiuzyr4tczCAHqAEQDgB/jlepZU1wd06gyRDc0KTSQq X-Received: by 2002:a17:907:2895:b0:730:9711:ad60 with SMTP id em21-20020a170907289500b007309711ad60mr20736523ejc.159.1660148847298; Wed, 10 Aug 2022 09:27:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148847; cv=none; d=google.com; s=arc-20160816; b=0K5xaAw427XRr0zar3t6GmlArwiiS8jMv5q+Ft8u6d6XhhuIKT0lUGkZ5+lvY+0JZW 34mZPwl4P67dchab/PErmSuFWEVeQMJVLRAhAlpjQ37Rv0bx1t45oOJFy22FVCSEMg4j 5MxC55N9hT7meYVqcR9pegCQ+AJ5gaxU84oez1gi6YZomsZMSZ8jwO5VEpdazIuG5RU4 BBdX8v0bJKnNMqNU+DXU2V5N38Rge85e3XPCv7+l34UC+iNRCkDuVLS79ps2n+BwdUAh GlGO564WTdJr1fNF2FaVEGIlM+yOG7cuCu9zVE7EkuoE7tV9Kbn+/iggttiNSi9XferI Qphw== 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=5nk7QdiIpqCKJbMD9EC86IR5QXpphtBf257TC4C21OY=; b=ANZ4OAzcfatBN43ABS0Pfu/9zE8cwLrd7En9Dd5DFSG3UWU5GEcgFeiM8MTylGXbYR b1K9ebfPGCJ0M0O0Z9lvDoXt3huxJX34+7JvRRaHFCO/lRgPCBRRF8Zm+/vFYuSFbdO0 ZprbG1np1IGyTRFJfvXRjXNyk/AMQQro2012Vdc1oFD84l/wD3JdltUFVKEh2hVaVXZ+ AOd2v3DTZDzi5fY9l04jMmY1Nf+rFaPR60aRSUGzirKtKvLB8clgHDG1j90duZWk/WEu q/LxME2trDudFUe8YMJj7/Ps4643Hm6yAjf/hfcAO2Ndy5uOLXlH0yJ+Rj8/MJ65QdYO 8q2A== 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 hp14-20020a1709073e0e00b0072a4a97a5casi5545450ejc.172.2022.08.10.09.27.26; Wed, 10 Aug 2022 09:27:27 -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 7B6F368B8E0; Wed, 10 Aug 2022 19:26:13 +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 0183968B8A2 for ; Wed, 10 Aug 2022 19:26:03 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 5322C240507 for ; Wed, 10 Aug 2022 18:26:00 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id BPpu5atjXEPj 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 535B124050B for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 45B913A0451; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:43 +0200 Message-Id: <20220810162545.21382-7-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 7/9] fftools/ffmpeg: simplify conditions in ts_discontinuity_process 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: qMm/5NDB/69K --- fftools/ffmpeg.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index cacbde27db..dd45cb4516 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3713,8 +3713,7 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, 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 || + if (FFABS(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, @@ -3728,16 +3727,14 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, 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) { + if (FFABS(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) { + if (FFABS(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; } @@ -3746,8 +3743,7 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, } else if (ist->next_dts == AV_NOPTS_VALUE && !copy_ts && fmt_is_discont && ifile->last_ts != AV_NOPTS_VALUE) { int64_t delta = pkt_dts - ifile->last_ts; - if (delta < -1LL*dts_delta_threshold*AV_TIME_BASE || - delta > 1LL*dts_delta_threshold*AV_TIME_BASE) { + if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE) { ifile->ts_offset -= delta; av_log(NULL, AV_LOG_DEBUG, "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", From patchwork Wed Aug 10 16:25:44 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37215 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012575pzi; Wed, 10 Aug 2022 09:27:07 -0700 (PDT) X-Google-Smtp-Source: AA6agR4fNKd+n5sGfDOaED+i6jHpD7IA204sZIEyOqZ69JBH0XXERrEdJVlQzPT8up/pHLBIRXtR X-Received: by 2002:a50:ec91:0:b0:440:9719:72ca with SMTP id e17-20020a50ec91000000b00440971972camr15117213edr.407.1660148827077; Wed, 10 Aug 2022 09:27:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148827; cv=none; d=google.com; s=arc-20160816; b=lhIKOTiAAuZauBGMai/rqiWfhoP10zA+zWZvzcra7etAh6vIHs449SfANkhGPe0aza Qgk5GaKwvNMDzXlAYQf472I4zgFlv8dvae1mfnfabEXXZS+ACMCHCApIikBmVtig3joR nfJ6nt5NpTLV8eqx2jgZZ84O5pZ6hYOgMQ0j7QtYklDggoo/HuTAJb+0x8/Jc0Xg5Now Hhh2Be7m4Sq2cdAtWVxqKpglHONmsz8Kh18c03vhWyQU7cexSjEobTz/wFjSc7XTpz1g Nr64yHKxrZPn3PfIDTs1j2MJBcusJYLCagM+QnVVIPDJc4gekRpvOhB4mFcAPKKKvZxs uLmQ== 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=09SLcR99cETZy2SnTXfVrIhMsrk9Ix0IIZoOx0mR++c=; b=BI8fRHpvRqeaoVtZ/pvpSD3pNe89ktd2lwNAz23arlG48xPQXR7qCeyKql9GWwFiPl o0XTAf/lZTyjMF3HK8an52puelB3hJqbjBFr+0LdCa6VJm2zF8uG8j2Mv4ad2N7Pekzn iQxHoH8I9XnBYouWz7/DCyxVliXOYOIwQF/87SrF5liGdcA/9XetDqsRJmyA7QQBquhR QIyD9XROco6BfAUIK4Tzt6b0Eis3WZF4ndgpOMFXwXYHbKp4QEo8XWXMKaQl9KFtQDSB GhDYq2ADMm83ucEUrEANbkelxForEhVCpMJ7DIsh3e8v/mYUNwZFYs2pQ/J/kUOhPAwz DH9w== 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 nd17-20020a170907629100b0072f22d91836si5697146ejc.541.2022.08.10.09.27.06; Wed, 10 Aug 2022 09:27:07 -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 79DAE68B8CF; Wed, 10 Aug 2022 19:26:11 +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 EA5FE68B89B for ; Wed, 10 Aug 2022 19:26:03 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 47AE0240506 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 uRJ0xQio7yA8 for ; Wed, 10 Aug 2022 18:25:58 +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 3867A2404FE for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4A9A83A046F; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:44 +0200 Message-Id: <20220810162545.21382-8-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 8/9] fftools/ffmpeg: use a separate variable for discontinuity offset 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: Ol/0OfasNWoV This will allow to move normal offset handling to demuxer thread, since discontinuities currently have to be processed in the main thread, as the code uses some decoder-produced values. --- fftools/ffmpeg.c | 39 ++++++++++++++++++++++++++++----------- fftools/ffmpeg.h | 4 ++++ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index dd45cb4516..8d85af1c97 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3693,8 +3693,8 @@ static void decode_flush(InputFile *ifile) } } -static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, - AVPacket *pkt) +static void ts_discontinuity_detect(InputFile *ifile, InputStream *ist, + AVPacket *pkt) { const int fmt_is_discont = ifile->ctx->iformat->flags & AVFMT_TS_DISCONT; int disable_discontinuity_correction = copy_ts; @@ -3715,13 +3715,13 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, if (fmt_is_discont) { if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE || pkt_dts + AV_TIME_BASE/10 < FFMAX(ist->pts, ist->dts)) { - ifile->ts_offset -= delta; + ifile->ts_offset_discont -= 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); + delta, ifile->ts_offset_discont); 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); @@ -3744,10 +3744,10 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, fmt_is_discont && ifile->last_ts != AV_NOPTS_VALUE) { int64_t delta = pkt_dts - ifile->last_ts; if (FFABS(delta) > 1LL * dts_delta_threshold * AV_TIME_BASE) { - ifile->ts_offset -= delta; + ifile->ts_offset_discont -= delta; av_log(NULL, AV_LOG_DEBUG, "Inter stream timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", - delta, ifile->ts_offset); + delta, ifile->ts_offset_discont); 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); @@ -3757,6 +3757,26 @@ static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, ifile->last_ts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q); } +static void ts_discontinuity_process(InputFile *ifile, InputStream *ist, + AVPacket *pkt) +{ + int64_t offset = av_rescale_q(ifile->ts_offset_discont, AV_TIME_BASE_Q, + ist->st->time_base); + + // apply previously-detected timestamp-discontinuity offset + // (to all streams, not just audio/video) + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts += offset; + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts += offset; + + // detect 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) + ts_discontinuity_detect(ifile, ist, pkt); +} + /* * Return * - 0 -- one packet was read and processed @@ -3897,11 +3917,8 @@ static int process_input(int file_index) if (pkt->dts != AV_NOPTS_VALUE) pkt->dts += duration; - // 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) - ts_discontinuity_process(ifile, ist, pkt); + // detect and try to correct for timestamp discontinuities + ts_discontinuity_process(ifile, ist, pkt); if (debug_ts) { av_log(NULL, AV_LOG_INFO, "demuxer+ffmpeg -> ist_index:%d type:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s off:%s off_time:%s\n", diff --git a/fftools/ffmpeg.h b/fftools/ffmpeg.h index 8b2e73d642..6991ba7632 100644 --- a/fftools/ffmpeg.h +++ b/fftools/ffmpeg.h @@ -427,6 +427,10 @@ typedef struct InputFile { int input_sync_ref; int64_t ts_offset; + /** + * Extra timestamp offset added by discontinuity handling. + */ + int64_t ts_offset_discont; int64_t last_ts; int64_t start_time; /* user-specified start time in AV_TIME_BASE or AV_NOPTS_VALUE */ int64_t recording_time; From patchwork Wed Aug 10 16:25:45 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anton Khirnov X-Patchwork-Id: 37219 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:3d0d:b0:8d:a68e:8a0e with SMTP id y13csp1012863pzi; Wed, 10 Aug 2022 09:27:37 -0700 (PDT) X-Google-Smtp-Source: AA6agR5ETIWb4uZd05xfPEzAOMhobFaEXNlJBdawuZULOPAwD2V5SMuIGbdWGrq74OkALa3+c0a4 X-Received: by 2002:a17:907:3f02:b0:6f3:5c42:321a with SMTP id hq2-20020a1709073f0200b006f35c42321amr20840139ejc.521.1660148857633; Wed, 10 Aug 2022 09:27:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660148857; cv=none; d=google.com; s=arc-20160816; b=l4YoyGWZlUtFgBIFjZ0XiYZtI6kIR2wXX/AN96ft3VJK0wE8N7bcAGlp34ZZN7N7+k GfFAzukF0W4S9N677BjwXICgTgKnm4ng5uvrLdnd30xpH8zTA4OrWCs9K0nCCrTVFlXA /139i/BiTOBj8v50jfDGiA6GmB9FzBhJNLZt2NJtK8cYh4WDSb++ChiPcX0rRRZ9m4vJ FGYJEtC5CkP/l3JA6wspHRQrFZHMw5JsQtD9TOaT0gJaMkb8S7lv62QHUNWx2qAqes6a /PZQvb1I6p8aDEEpFeALzPg5nilPcGdFhnWE2r+UPnbPAT3yAN89N4zUVswXIEd5cQ9A CaOQ== 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=ixBB7cgF5Aucz1Et0SVBHn2asGkd1786RLhrCZAc/0g=; b=RMT2eWViFR6X8Yy7qjwSdOrX46fiteLuJJSbgm0UOPQYHY9PKv0Id9leODjNT83syM u2qzCG45BHKnvpPLulXFVh0m59uwQ0fcjRRjswTVy+y0OQ9i21vmUL+/+z2RhKN/Tqj4 YHTapuyDRMxaNmZr/DFdyy6yvIaQY/ThJbKz94O2eDVMHbTZLpMhdZ/yddNYG8cx9XVp 31kSTGh0KU/JSFebm29s/xQrFCO/wafm4gCGWwsiwpZIE/e1YPLaR0B9Oq/7CITclsFp KQbMOSZ9rmL5mIVeaMvLk9+KIQPJLgTSKfW4A0NfMIAO7HD/Jpg+bA3knRm1/qZwgj3I 1W6A== 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 bx1-20020a0564020b4100b0043e2f1b306esi10503327edb.215.2022.08.10.09.27.37; Wed, 10 Aug 2022 09:27:37 -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 8087868B8E9; Wed, 10 Aug 2022 19:26:14 +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 0567268B8B1 for ; Wed, 10 Aug 2022 19:26:04 +0300 (EEST) Received: from localhost (localhost [IPv6:::1]) by mail0.khirnov.net (Postfix) with ESMTP id 8109824050B for ; Wed, 10 Aug 2022 18:26:00 +0200 (CEST) Received: from mail0.khirnov.net ([IPv6:::1]) by localhost (mail0.khirnov.net [IPv6:::1]) (amavisd-new, port 10024) with ESMTP id 7B0mnfta-PRF 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 59FE5240511 for ; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) Received: by libav.khirnov.net (Postfix, from userid 1000) id 4F4873A0470; Wed, 10 Aug 2022 18:25:57 +0200 (CEST) From: Anton Khirnov To: ffmpeg-devel@ffmpeg.org Date: Wed, 10 Aug 2022 18:25:45 +0200 Message-Id: <20220810162545.21382-9-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 9/9] fftools/ffmpeg: move packet timestamp processing to demuxer thread 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: 8T/1+6yd/z9e Discontinuity detection/correction is left in the main thread, as it is entangled with InputStream.next_dts and related variables, which may be set by decoding code. Fixes races e.g. in fate-ffmpeg-streamloop after aae9de0cb2887e6e0bbfda6ffdf85ab77d3390f0. --- fftools/ffmpeg.c | 52 -------------------------------------- fftools/ffmpeg_demux.c | 57 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 52 deletions(-) diff --git a/fftools/ffmpeg.c b/fftools/ffmpeg.c index 8d85af1c97..71a7e0b837 100644 --- a/fftools/ffmpeg.c +++ b/fftools/ffmpeg.c @@ -3791,7 +3791,6 @@ static int process_input(int file_index) InputStream *ist; AVPacket *pkt; int ret, i, j; - int64_t duration; is = ifile->ctx; ret = ifile_get_packet(ifile, &pkt); @@ -3846,37 +3845,6 @@ static int process_input(int file_index) if (ist->discard) goto discard_packet; - if (debug_ts) { - av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s " - "next_dts:%s next_dts_time:%s next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s off:%s off_time:%s\n", - ifile->ist_index + pkt->stream_index, - av_get_media_type_string(ist->st->codecpar->codec_type), - av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &AV_TIME_BASE_Q), - av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &AV_TIME_BASE_Q), - av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ist->st->time_base), - av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ist->st->time_base), - av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, &ist->st->time_base), - av_ts2str(input_files[ist->file_index]->ts_offset), - av_ts2timestr(input_files[ist->file_index]->ts_offset, &AV_TIME_BASE_Q)); - } - - if(!ist->wrap_correction_done && is->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){ - int64_t stime, stime2; - - stime = av_rescale_q(is->start_time, AV_TIME_BASE_Q, ist->st->time_base); - stime2= stime + (1ULL<st->pts_wrap_bits); - ist->wrap_correction_done = 1; - - if(stime2 > stime && pkt->dts != AV_NOPTS_VALUE && pkt->dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { - pkt->dts -= 1ULL<st->pts_wrap_bits; - ist->wrap_correction_done = 0; - } - if(stime2 > stime && pkt->pts != AV_NOPTS_VALUE && pkt->pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { - pkt->pts -= 1ULL<st->pts_wrap_bits; - ist->wrap_correction_done = 0; - } - } - /* add the stream-global side data to the first packet */ if (ist->nb_packets == 1) { for (i = 0; i < ist->st->nb_side_data; i++) { @@ -3897,26 +3865,6 @@ static int process_input(int file_index) } } - if (pkt->dts != AV_NOPTS_VALUE) - pkt->dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); - if (pkt->pts != AV_NOPTS_VALUE) - pkt->pts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); - - if (pkt->pts != AV_NOPTS_VALUE) - pkt->pts *= ist->ts_scale; - if (pkt->dts != AV_NOPTS_VALUE) - pkt->dts *= ist->ts_scale; - - duration = av_rescale_q(ifile->duration, ifile->time_base, ist->st->time_base); - if (pkt->pts != AV_NOPTS_VALUE) { - pkt->pts += duration; - ist->max_pts = FFMAX(pkt->pts, ist->max_pts); - ist->min_pts = FFMIN(pkt->pts, ist->min_pts); - } - - if (pkt->dts != AV_NOPTS_VALUE) - pkt->dts += duration; - // detect and try to correct for timestamp discontinuities ts_discontinuity_process(ifile, ist, pkt); diff --git a/fftools/ffmpeg_demux.c b/fftools/ffmpeg_demux.c index d15cee614d..6dfb5bb35b 100644 --- a/fftools/ffmpeg_demux.c +++ b/fftools/ffmpeg_demux.c @@ -114,6 +114,61 @@ static int seek_to_start(InputFile *ifile) return ret; } +static void ts_fixup(InputFile *ifile, AVPacket *pkt) +{ + InputStream *ist = input_streams[ifile->ist_index + pkt->stream_index]; + const int64_t start_time = ifile->ctx->start_time; + int64_t duration; + + if (debug_ts) { + av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s " + "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s duration:%s duration_time:%s\n", + ifile->ist_index + pkt->stream_index, + av_get_media_type_string(ist->st->codecpar->codec_type), + av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, &ist->st->time_base), + av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, &ist->st->time_base), + av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, &ist->st->time_base)); + } + + if (!ist->wrap_correction_done && start_time != AV_NOPTS_VALUE && + ist->st->pts_wrap_bits < 64) { + int64_t stime, stime2; + + stime = av_rescale_q(start_time, AV_TIME_BASE_Q, ist->st->time_base); + stime2= stime + (1ULL<st->pts_wrap_bits); + ist->wrap_correction_done = 1; + + if(stime2 > stime && pkt->dts != AV_NOPTS_VALUE && pkt->dts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { + pkt->dts -= 1ULL<st->pts_wrap_bits; + ist->wrap_correction_done = 0; + } + if(stime2 > stime && pkt->pts != AV_NOPTS_VALUE && pkt->pts > stime + (1LL<<(ist->st->pts_wrap_bits-1))) { + pkt->pts -= 1ULL<st->pts_wrap_bits; + ist->wrap_correction_done = 0; + } + } + + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts += av_rescale_q(ifile->ts_offset, AV_TIME_BASE_Q, ist->st->time_base); + + if (pkt->pts != AV_NOPTS_VALUE) + pkt->pts *= ist->ts_scale; + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts *= ist->ts_scale; + + duration = av_rescale_q(ifile->duration, ifile->time_base, ist->st->time_base); + if (pkt->pts != AV_NOPTS_VALUE) { + pkt->pts += duration; + ist->max_pts = FFMAX(pkt->pts, ist->max_pts); + ist->min_pts = FFMIN(pkt->pts, ist->min_pts); + } + + if (pkt->dts != AV_NOPTS_VALUE) + pkt->dts += duration; +} + static void *input_thread(void *arg) { InputFile *f = arg; @@ -176,6 +231,8 @@ static void *input_thread(void *arg) } } + ts_fixup(f, pkt); + msg.pkt = av_packet_alloc(); if (!msg.pkt) { av_packet_unref(pkt);