Mercurial > libavcodec.hg
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;