[SCM] libav/experimental: WMA: fix loop unrolling in decode_exp_vlc()

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Jun 30 16:52:09 UTC 2013


The following commit has been merged in the experimental branch:
commit 0e71841b0555e54691431f6d319f2cb17e208c6a
Author: Måns Rullgård <mans at mansr.com>
Date:   Tue Sep 29 12:48:24 2009 +0000

    WMA: fix loop unrolling in decode_exp_vlc()
    
    The count can be a non-multiple of 4 after all.
    
    Originally committed as revision 20081 to svn://svn.ffmpeg.org/ffmpeg/trunk

diff --git a/libavcodec/wmadec.c b/libavcodec/wmadec.c
index e216de7..5a31963 100644
--- a/libavcodec/wmadec.c
+++ b/libavcodec/wmadec.c
@@ -330,12 +330,12 @@ static int decode_exp_vlc(WMACodecContext *s, int ch)
         iv = iptab[last_exp];
         max_scale = v;
         n = *ptr++;
-        do {
-            *q++ = iv;
-            *q++ = iv;
-            *q++ = iv;
-            *q++ = iv;
-        } while (n -= 4);
+        switch (n & 3) do {
+        case 0: *q++ = iv;
+        case 3: *q++ = iv;
+        case 2: *q++ = iv;
+        case 1: *q++ = iv;
+        } while ((n -= 4) > 0);
     }else
         last_exp = 36;
 
@@ -352,12 +352,12 @@ static int decode_exp_vlc(WMACodecContext *s, int ch)
         if (v > max_scale)
             max_scale = v;
         n = *ptr++;
-        do {
-            *q++ = iv;
-            *q++ = iv;
-            *q++ = iv;
-            *q++ = iv;
-        } while (n -= 4);
+        switch (n & 3) do {
+        case 0: *q++ = iv;
+        case 3: *q++ = iv;
+        case 2: *q++ = iv;
+        case 1: *q++ = iv;
+        } while ((n -= 4) > 0);
     }
     s->max_exponent[ch] = max_scale;
     return 0;

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list