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

Reply via email to