[SCM] libav/experimental: adpcm: Replace any of the leaf nodes in the heap

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 17:18:57 UTC 2013


The following commit has been merged in the experimental branch:
commit 38b3bda18f07a1a8dd18437105a12427c5a90c1c
Author: Martin Storsjö <martin at martin.st>
Date:   Fri Nov 12 12:30:27 2010 +0000

    adpcm: Replace any of the leaf nodes in the heap
    
    By not looking for the exactly largest node, we avoid an O(n) seek through
    the leaf nodes. Just pick one (not the same one every time) and try replacing
    that node with the new one.
    
    For -trellis 8, this lowers the run time from 190 to 158 seconds,
    for a 30 second 44 kHz mono sample, on my machine.
    
    Originally committed as revision 25733 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/adpcm.c b/libavcodec/adpcm.c
index bdcd985..60adebe 100644
--- a/libavcodec/adpcm.c
+++ b/libavcodec/adpcm.c
@@ -387,18 +387,10 @@ static void adpcm_compress_trellis(AVCodecContext *avctx, const short *samples,
                     if (heap_pos < frontier) {\
                         pos = heap_pos++;\
                     } else {\
-                        /* Find the largest node in the heap, which is one \
-                         * of the leaf nodes. */\
-                        int maxpos = 0;\
-                        uint32_t max_ssd = 0;\
-                        for (k = frontier >> 1; k < frontier; k++) {\
-                            if (nodes_next[k]->ssd > max_ssd) {\
-                                maxpos = k;\
-                                max_ssd = nodes_next[k]->ssd;\
-                            }\
-                        }\
-                        pos = maxpos;\
-                        if (ssd > max_ssd)\
+                        /* Try to replace one of the leaf nodes with the new \
+                         * one, but try a different slot each time. */\
+                        pos = (frontier >> 1) + (heap_pos++ & ((frontier >> 1) - 1));\
+                        if (ssd > nodes_next[pos]->ssd)\
                             goto next_##NAME;\
                     }\
                     u = nodes_next[pos];\

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list