changeset 3610:d97b4709aaf0 libavcodec

optimizing high freq decode
author michael
date Thu, 24 Aug 2006 01:01:39 +0000
parents 6560c84eef72
children a20d179c79c3
files mpegaudiodec.c
diffstat 1 files changed, 14 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/mpegaudiodec.c	Thu Aug 24 00:03:51 2006 +0000
+++ b/mpegaudiodec.c	Thu Aug 24 01:01:39 2006 +0000
@@ -1741,22 +1741,22 @@
         }
         last_gb= s->gb;
 
-        code = get_vlc2(&s->gb, vlc->table, vlc->bits, 2);
+        code = get_vlc2(&s->gb, vlc->table, vlc->bits, 1);
         dprintf("t=%d code=%d\n", g->count1table_select, code);
-        if (code < 0)
-            return -1;
-        for(i=0;i<4;i++) {
-            if (code & (8 >> i)) {
-                /* non zero value. Could use a hand coded function for
-                   'one' value */
-                v = l3_unscale(1, exponents[s_index]);
-                if(get_bits1(&s->gb))
-                    v = -v;
-            } else {
-                v = 0;
-            }
-            g->sb_hybrid[s_index++] = v;
+        g->sb_hybrid[s_index+0]=
+        g->sb_hybrid[s_index+1]=
+        g->sb_hybrid[s_index+2]=
+        g->sb_hybrid[s_index+3]= 0;
+        while(code){
+            const static int idxtab[16]={3,3,2,2,1,1,1,1,0,0,0,0,0,0,0,0};
+            int pos= s_index+idxtab[code];
+            code ^= 8>>idxtab[code];
+            v = l3_unscale(1, exponents[pos]);
+            if(get_bits1(&s->gb))
+                v = -v;
+            g->sb_hybrid[pos] = v;
         }
+        s_index+=4;
     }
     memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index));
     return 0;