From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 0D45647130 for ; Mon, 28 Aug 2023 08:07:08 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E04A868C4A6; Mon, 28 Aug 2023 11:07:04 +0300 (EEST) 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: 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, \ -- 2.25.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".