From: "\"zhilizhao(赵志立)\"" <quinkblack@foxmail.com> To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org> Subject: Re: [FFmpeg-devel] [PATCH v3] avformat/mov: add interleaved_read option Date: Thu, 14 Sep 2023 12:09:03 +0800 Message-ID: <tencent_9D99819E35BB3E3B56379DD4E14C5A123409@qq.com> (raw) In-Reply-To: <CADxeRwnF3T-N6LT34A29bEBKX5sErFBji1HSWZGRx5mwqs=h2g@mail.gmail.com> > On Sep 14, 2023, at 09:41, Steven Liu <lingjiujianke@gmail.com> wrote: > > Zhao Zhili <quinkblack@foxmail.com> 于2023年9月12日周二 01:10写道: >> >> From: Zhao Zhili <zhilizhao@tencent.com> >> >> 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. Disable this option when you don't need the >> demuxer level interleave, and want to avoid the IO penalizes. >> >> Co-authored-by: Derek Buitenhuis <derek.buitenhuis@gmail.com> >> Signed-off-by: Zhao Zhili <zhilizhao@tencent.com> >> --- >> v3: update doc >> v2: rename option >> >> This issue is well known. Two samples can be found at here >> http://ffmpeg.org/pipermail/ffmpeg-devel/2022-December/304951.html >> >> doc/demuxers.texi | 7 +++++++ >> libavformat/isom.h | 1 + >> libavformat/mov.c | 5 ++++- >> libavformat/version.h | 2 +- >> 4 files changed, 13 insertions(+), 2 deletions(-) >> >> diff --git a/doc/demuxers.texi b/doc/demuxers.texi >> index 2d33b47a56..ca1563abb0 100644 >> --- a/doc/demuxers.texi >> +++ b/doc/demuxers.texi >> @@ -779,6 +779,13 @@ 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 interleaved_read >> +Interleave packets from multiple tracks at demuxer level. For badly interleaved files, this prevents playback issues >> +caused by large gaps between packets in different tracks, as MOV/MP4 do not have packet placement requirements. >> +However, this can cause excessive seeking on very badly interleaved files, due to seeking between tracks, so disabling >> +it may prevent I/O issues, at the expense of playback. >> + >> @end table >> >> @subsection Audible AAX >> diff --git a/libavformat/isom.h b/libavformat/isom.h >> index 4b1cd42f0f..3d375d7a46 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 interleaved_read; >> } MOVContext; >> >> int ff_mp4_read_descr_len(AVIOContext *pb); >> diff --git a/libavformat/mov.c b/libavformat/mov.c >> index aa1d9e4ccc..8ad5f0b646 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 no_interleave = !mov->interleaved_read || !(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 || (no_interleave && 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 }, >> + { "interleaved_read", "Manually interleave between multiple tracks", OFFSET(interleaved_read), AV_OPT_TYPE_BOOL, {.i64 = 1 }, 0, 1, .flags = AV_OPT_FLAG_DECODING_PARAM }, >> >> { NULL }, >> }; >> diff --git a/libavformat/version.h b/libavformat/version.h >> index cb67e0a1f8..e41362ac9d 100644 >> --- a/libavformat/version.h >> +++ b/libavformat/version.h >> @@ -32,7 +32,7 @@ >> #include "version_major.h" >> >> #define LIBAVFORMAT_VERSION_MINOR 12 >> -#define LIBAVFORMAT_VERSION_MICRO 100 >> +#define LIBAVFORMAT_VERSION_MICRO 101 >> >> #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \ >> LIBAVFORMAT_VERSION_MINOR, \ >> -- >> 2.34.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". > > > lgtm Pushed with a little modification on the option description. Thanks! > > Thanks > Steven > _______________________________________________ > 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". _______________________________________________ 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".
prev parent reply other threads:[~2023-09-14 4:09 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2023-09-11 17:03 Zhao Zhili 2023-09-14 1:41 ` Steven Liu 2023-09-14 4:09 ` "zhilizhao(赵志立)" [this message]
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=tencent_9D99819E35BB3E3B56379DD4E14C5A123409@qq.com \ --to=quinkblack@foxmail.com \ --cc=ffmpeg-devel@ffmpeg.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel This inbox may be cloned and mirrored by anyone: git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \ ffmpegdev@gitmailbox.com public-inbox-index ffmpegdev Example config snippet for mirrors. AGPL code for this site: git clone https://public-inbox.org/public-inbox.git