From patchwork Mon Aug 28 16:06:44 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhao Zhili X-Patchwork-Id: 43365 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7194:b0:149:dfde:5c0a with SMTP id s20csp1207826pzb; Mon, 28 Aug 2023 01:07:10 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGza7JjqKXYMFTz4Y3h/J/Iq6MDdLWoV+Po2KGR8Q6dPAlVrXEZ5sicml0ELk0KVA2RX+7e X-Received: by 2002:aa7:c98c:0:b0:528:925f:413e with SMTP id c12-20020aa7c98c000000b00528925f413emr18745034edt.12.1693210030163; Mon, 28 Aug 2023 01:07:10 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1693210030; cv=none; d=google.com; s=arc-20160816; b=SJJ+7jeh9I6eF0CX0Z0C+wO/puQslA5WAO+4QeGhZZ6gsFkn/YXyUffju9xuctD/kc BUALeRBWfx243BDEqkDPXHKJraKzEmdChgJArsQ/df9vaW7pCh7sBSn1L0N2Qux1BiPb eUSGfZ5hT+T4ijyf++oNBNw80WPYjSrLEHIS6TkLcNEC+0h4TdCf0A1Z5pg4JGrWjSqM zK70HWi0z/ywVBlWYP20wuDwTJqASq5BWG3xOhyGXjnOaSbkqAAfqV3oryqACWeH8Jdq GAf+vcOpfKkRzjxjh47AgiEMW+gjA6+J9ik6EaFG8hGsSBK0Z1MijAezoYIM9OgS0lGH wogA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:date:to:from:message-id :dkim-signature:delivered-to; bh=nnXVabbe0T/8kCz5oVzONcK08kwEkSi3styZ9EndqGk=; fh=HnHYuZ9XgUo86ZRXTLWWmQxhslYEI9B9taZ5X1DLFfc=; b=ML+kPfjx5lKmcMss/j7ZHuNhAePc1zFL1FJZgOU+U6PR7pFokO+z8tOnIU8bTN5GpT X9TP4SzeI6KoIPbtXUrvsqL/5+ODtjWVBjvMgrlX97VQFP2dcONK5jNkuaZR56izyPiB CzzZPR0vkXr4JaEfkJUONNFxRbOCFcTXpOjPp8bsS83KXG3rymjnoarRmFa3zkQYL2s7 iIebfAZYTJJEYd3o2dSM2rDtKtYW9/zV69Z95yhGvOqLaw+dGPPV9SMq8Ngs0DTaJtIx 9o1Rer/hxWXdNm3/oJIN6H/QZIjHVg08g5WQF5Tvo4Oc/CRrlGc9vqnA7TGHB1qJIO5U ahXw== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=nLr8ucas; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=foxmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id w2-20020aa7da42000000b0052545f962cbsi2228725eds.640.2023.08.28.01.07.09; Mon, 28 Aug 2023 01:07:10 -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; dkim=neutral (body hash did not verify) header.i=@foxmail.com header.s=s201512 header.b=nLr8ucas; 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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=foxmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 20E4C68C4AC; Mon, 28 Aug 2023 11:07:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out162-62-57-64.mail.qq.com (out162-62-57-64.mail.qq.com [162.62.57.64]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7CB1768AEB3 for ; Mon, 28 Aug 2023 11:06:56 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=foxmail.com; s=s201512; t=1693210006; bh=jJQf8FrfsPRMNfOO/WqVvfUsvyH1nDks+QtHvuwC4Dg=; h=From:To:Cc:Subject:Date; b=nLr8ucasOXpwcmEH61ttXqcrT9tij+aT5q6E9pGi4jPsOXmsfjiGoEPKZf/Cf6hET dfYaRhFNtl8GS74638D4xIDqUR4W++r7Ju0ze7OdY7xDKH83ifCyJMUnGBnmTxRw+U UqrQP+fjhjjKGCWQJv5VXzhj9b+TETtZBO2qshyw= Received: from localhost.localdomain ([119.147.10.189]) by newxmesmtplogicsvrszb6-0.qq.com (NewEsmtp) with SMTP id 1AD8D23D; Mon, 28 Aug 2023 16:06:45 +0800 X-QQ-mid: xmsmtpt1693210005t4g13edol Message-ID: X-QQ-XMAILINFO: OZZSS56D9fAjRQzFW/NdoW/ubfnjAYqDsOsLlnSpXo1Rckfxl7CQIHhdECxBi2 p6ECZS8gZMYTSJJExvh7ft8kLY72wLKwrQm2+ZYmmlgY2AFuPc47Qu/aBiEmsWZGUrGHJsJHFHP3 p6Si7M8M2pnmPkKmAHx55OgCpYpno5/jIEXA7lpzucYbvXYvHxSNRjCcQEhkiQmDlALCcX0h7dNl AMKSRlXYauWl47VbWx6i3ctocj9H8loZ43673C07+Mc3mvZNFrAyF7fEKEogK+R82a2dd5NNIrXf 6nQldnYyp/l34QFYVrO1KnanKI8ayvhmvz6ozrpzGmAiJapjSR7w1YbFfTIx57VY5v+DKEOIw5RA wLeGRdhmFViOeOyOCHiMPESxLly6jQ9NV8ycHf0FXdOKwd1E6wHQZoLgzF9H2LTRNWivrMwCF8Iy gSS6r8q6z5zf5wWsht8Om8iDPgfQPrrHocOILzIqTpqK84n7OngwABqb1muRKxFYZeNOXSYtGG6A Cio59OFeNu8yrotgGfw7Wz6tGhWhd1tTu/eL7qYOBnw0tj2roObKxkk8bquqddjLj9+NsdqpfnBu m9bkH4K1ejFyR3Q51EZVUV0rjX1E5K5WeEQLoCiOBuTQJ2xQDP+GGjmDsjqAenylGx2rZqJ8tkF5 mOuoAwBkVR5UyVsU5IZzi0hl0xKsgz1aVycaZqEfCdz1yJOwk8cICb/HU6x4sLD89JaKQBO6iFUd xnyFkmb+2jCUJ9gYjDNSViyHDCvGP4351A4vqhYPMHLbIelxggf47F4JTiJJnuYamJH3Fekq/3wG MFYOvhmFkqVQIFoMumgT7r5DR50GtUurZ2W5RX0klWXlF66ojAAvO7SEZ8gdwyYnSA7ubKDKKWgJ 1pB4jcnBvkaNzSK+v+fS8rXJlgRNBcFg0o8gh1AHOwGk5np6udGqddbRisLZLmjz3Vgo554KkIbp BIusu8AuBZxwQ3vE9teYZbTbU4tCm6ZcsHy25w/cnJJUSC5h04PK9kCiccjG47 X-QQ-XMRINFO: OD9hHCdaPRBwq3WW+NvGbIU= From: Zhao Zhili To: ffmpeg-devel@ffmpeg.org Date: Tue, 29 Aug 2023 00:06:44 +0800 X-OQ-MSGID: <20230828160644.577523-1-quinkblack@foxmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] avformat/mov: add io_order option to disable demuxer level interleave 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 Cc: Zhao Zhili Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: AXFZyWtLjZB7 From: Zhao Zhili For bad interleaved files, manually interleave multiple tracks at the demuxer level can trigger seeking back and forth, which can be dramatically slow depending on the protocol. Demuxer level interleave can be useless sometimes, e.g., reading mp4 via http and then transcoding/remux to DASH. Enable this option when you don't need the demuxer level interleave, and want to avoid the IO penalizes. This issue is well known. Two samples can be found at here http://ffmpeg.org/pipermail/ffmpeg-devel/2022-December/304951.html Signed-off-by: Zhao Zhili --- doc/demuxers.texi | 6 ++++++ libavformat/isom.h | 1 + libavformat/mov.c | 5 ++++- libavformat/version.h | 2 +- 4 files changed, 12 insertions(+), 2 deletions(-) diff --git a/doc/demuxers.texi b/doc/demuxers.texi index 2d33b47a56..11366875f0 100644 --- a/doc/demuxers.texi +++ b/doc/demuxers.texi @@ -779,6 +779,12 @@ cast to int32 are used to adjust onward dts. Unit is the track time scale. Range is 0 to UINT_MAX. Default is @code{UINT_MAX - 48000*10} which allows upto a 10 second dts correction for 48 kHz audio streams while accommodating 99.9% of @code{uint32} range. + +@item io_order +Force reading in IO order. For bad interleaved files, manually interleave multiple tracks at the demuxer level can +trigger seeking back and forth, which can be dramatically slow depending on the protocol. Enable this option when +you don't need the demuxer level interleave, and want to avoid the IO penalizes. + @end table @subsection Audible AAX diff --git a/libavformat/isom.h b/libavformat/isom.h index 4b1cd42f0f..843ea2b2e5 100644 --- a/libavformat/isom.h +++ b/libavformat/isom.h @@ -327,6 +327,7 @@ typedef struct MOVContext { int64_t extent_offset; } *avif_info; int avif_info_size; + int force_io_order; } MOVContext; int ff_mp4_read_descr_len(AVIOContext *pb); diff --git a/libavformat/mov.c b/libavformat/mov.c index be9975f297..5ce9b83262 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -8780,6 +8780,8 @@ static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st) AVIndexEntry *sample = NULL; int64_t best_dts = INT64_MAX; int i; + MOVContext *mov = s->priv_data; + int force_io_order = mov->force_io_order || !(s->pb->seekable & AVIO_SEEKABLE_NORMAL); for (i = 0; i < s->nb_streams; i++) { AVStream *avst = s->streams[i]; FFStream *const avsti = ffstream(avst); @@ -8788,7 +8790,7 @@ static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st) AVIndexEntry *current_sample = &avsti->index_entries[msc->current_sample]; int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale); av_log(s, AV_LOG_TRACE, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts); - if (!sample || (!(s->pb->seekable & AVIO_SEEKABLE_NORMAL) && current_sample->pos < sample->pos) || + if (!sample || (force_io_order && current_sample->pos < sample->pos) || ((s->pb->seekable & AVIO_SEEKABLE_NORMAL) && ((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb && dts != AV_NOPTS_VALUE && ((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) || @@ -9282,6 +9284,7 @@ static const AVOption mov_options[] = { { "enable_drefs", "Enable external track support.", OFFSET(enable_drefs), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, FLAGS }, { "max_stts_delta", "treat offsets above this value as invalid", OFFSET(max_stts_delta), AV_OPT_TYPE_INT, {.i64 = UINT_MAX-48000*10 }, 0, UINT_MAX, .flags = AV_OPT_FLAG_DECODING_PARAM }, + { "io_order", "Force reading in IO order, disable manually interleave between multiple tracks", OFFSET(force_io_order), AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1, .flags = AV_OPT_FLAG_DECODING_PARAM }, { NULL }, }; diff --git a/libavformat/version.h b/libavformat/version.h index 787ee8c90b..248cce002b 100644 --- a/libavformat/version.h +++ b/libavformat/version.h @@ -32,7 +32,7 @@ #include "version_major.h" #define LIBAVFORMAT_VERSION_MINOR 10 -#define LIBAVFORMAT_VERSION_MICRO 101 +#define LIBAVFORMAT_VERSION_MICRO 102 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ LIBAVFORMAT_VERSION_MINOR, \