optimizing high freq decode
authorMichael Niedermayer <michaelni@gmx.at>
Thu, 24 Aug 2006 01:01:39 +0000 (01:01 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 24 Aug 2006 01:01:39 +0000 (01:01 +0000)
Originally committed as revision 6060 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/mpegaudiodec.c

index 42da201..0b55ce8 100644 (file)
@@ -1741,22 +1741,22 @@ static int huffman_decode(MPADecodeContext *s, GranuleDef *g,
         }
         last_gb= s->gb;
 
         }
         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);
         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;
     }
     memset(&g->sb_hybrid[s_index], 0, sizeof(*g->sb_hybrid)*(576 - s_index));
     return 0;