diff options
author | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2020-09-01 15:33:47 +0100 |
---|---|---|
committer | Derek Buitenhuis <derek.buitenhuis@gmail.com> | 2020-09-03 19:04:29 +0100 |
commit | 97fa669a6f8f3ecee458a51d38f14429e2d67024 (patch) | |
tree | 755aa30720578ea9a2abca9c49eea130e45406a2 /libavformat/mov.c | |
parent | 19064a36e39a113568cb4ea2d581747fd43e055a (diff) | |
download | ffmpeg-97fa669a6f8f3ecee458a51d38f14429e2d67024.tar.gz |
avformat/mov: Only read the mfra size once during sidx parsing
On files with more than one sidx box, like live fragmented MP4
files, it was previously re-reading and seeking on every singl
sidx box, leading to extremely poor performance on larger files,
especially over the network.
Only do it on the first one, and stash its result.
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Diffstat (limited to 'libavformat/mov.c')
-rw-r--r-- | libavformat/mov.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index 49c2d05d21..e33031f158 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -5097,14 +5097,16 @@ static int mov_read_sidx(MOVContext *c, AVIOContext *pb, MOVAtom atom) if (!is_complete && (pb->seekable & AVIO_SEEKABLE_NORMAL)) { int64_t ret; int64_t original_pos = avio_tell(pb); - int32_t mfra_size; - if ((ret = avio_seek(pb, stream_size - 4, SEEK_SET)) < 0) - return ret; - mfra_size = avio_rb32(pb); - if (offset + mfra_size == stream_size) + if (!c->have_read_mfra_size) { + if ((ret = avio_seek(pb, stream_size - 4, SEEK_SET)) < 0) + return ret; + c->mfra_size = avio_rb32(pb); + c->have_read_mfra_size = 1; + if ((ret = avio_seek(pb, original_pos, SEEK_SET)) < 0) + return ret; + } + if (offset + c->mfra_size == stream_size) is_complete = 1; - if ((ret = avio_seek(pb, original_pos, SEEK_SET)) < 0) - return ret; } if (is_complete) { |