The index creation is O(N^2) with number of entries (typically thousands). On a Raspberry Pi this can take more than 60 seconds to execute for a recording of a few hours. By replacing with an O(N) loop, this takes virtually zero time
This patch has been in all Pi builds of Kodi for the last couple of years, so it is quite widely tested. No change in FATE output.
From 4bad5dbd752e96a6dfcb7e46aff1d64996d08ed1 Mon Sep 17 00:00:00 2001 From: popcornmix <popcorn...@gmail.com> Date: Fri, 29 Jan 2016 20:27:00 +0000 Subject: [PATCH] wtv: Speed up wtv index creation The index creation is O(N^2) with number of entries (typically thousands). On a Pi this can take more than 60 seconds to execute for a recording of a few hours. By replacing with an O(N) loop, this takes virtually zero time --- libavformat/wtvdec.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c index e8f6196..b329b7c 100644 --- a/libavformat/wtvdec.c +++ b/libavformat/wtvdec.c @@ -1028,21 +1028,23 @@ static int read_header(AVFormatContext *s) pb = wtvfile_open(s, root, root_size, ff_timeline_table_0_entries_Events_le16); if (pb) { int i; + AVIndexEntry *e = wtv->index_entries; + AVIndexEntry *e_end = wtv->index_entries + wtv->nb_index_entries - 1; + uint64_t last_position = 0; while (1) { uint64_t frame_nb = avio_rl64(pb); uint64_t position = avio_rl64(pb); + while (frame_nb > e->size && e <= e_end) { + e->pos = last_position; + e++; + } if (avio_feof(pb)) break; - for (i = wtv->nb_index_entries - 1; i >= 0; i--) { - AVIndexEntry *e = wtv->index_entries + i; - if (frame_nb > e->size) - break; - if (position > e->pos) - e->pos = position; - } + last_position = position; } + e_end->pos = last_position; wtvfile_close(pb); - st->duration = wtv->index_entries[wtv->nb_index_entries - 1].timestamp; + st->duration = e_end->timestamp; } } } -- 2.5.0
_______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel