diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2005-05-30 22:02:00 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2005-05-30 22:02:00 +0000 |
commit | 5a408f91e6371991f2c1134c2ddbf0684bb24854 (patch) | |
tree | 64186155e4560057ace9ab803c6af6880bbe1140 /libavcodec | |
parent | f4e61cd194ea84719bc81b06ebc6383e44f1a6ca (diff) | |
download | ffmpeg-5a408f91e6371991f2c1134c2ddbf0684bb24854.tar.gz |
decrease V_NB_BITS if possible
Originally committed as revision 4327 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r-- | libavcodec/vorbis.c | 24 | ||||
-rw-r--r-- | libavcodec/vorbis.h | 1 |
2 files changed, 15 insertions, 10 deletions
diff --git a/libavcodec/vorbis.c b/libavcodec/vorbis.c index 97289318f4..3cc81520ae 100644 --- a/libavcodec/vorbis.c +++ b/libavcodec/vorbis.c @@ -30,7 +30,8 @@ #include "vorbis.h" -#define V_NB_BITS 11 +#define V_NB_BITS 8 +#define V_NB_BITS2 11 #define V_MAX_VLCS (1<<16) #ifndef V_DEBUG @@ -361,9 +362,12 @@ static int vorbis_parse_setup_hdr_codebooks(vorbis_context *vc) { for(t=0;t<entries;++t) if (tmp_vlc_bits[t]>=codebook_setup->maxdepth) codebook_setup->maxdepth=tmp_vlc_bits[t]; - codebook_setup->maxdepth=(codebook_setup->maxdepth+V_NB_BITS-1)/V_NB_BITS; + if(codebook_setup->maxdepth > 3*V_NB_BITS) codebook_setup->nb_bits=V_NB_BITS2; + else codebook_setup->nb_bits=V_NB_BITS; - if (init_vlc(&codebook_setup->vlc, V_NB_BITS, entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), sizeof(*tmp_vlc_bits), tmp_vlc_codes, sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), INIT_VLC_LE)) { + codebook_setup->maxdepth=(codebook_setup->maxdepth+codebook_setup->nb_bits-1)/codebook_setup->nb_bits; + + if (init_vlc(&codebook_setup->vlc, codebook_setup->nb_bits, entries, tmp_vlc_bits, sizeof(*tmp_vlc_bits), sizeof(*tmp_vlc_bits), tmp_vlc_codes, sizeof(*tmp_vlc_codes), sizeof(*tmp_vlc_codes), INIT_VLC_LE)) { av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n"); goto error; } @@ -899,7 +903,7 @@ static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc, vorbis_floor *vf, f if (cbits) { // this reads all subclasses for this partition's class cval=get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table, - V_NB_BITS, 3); + vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3); } for(j=0;j<cdim;++j) { @@ -910,7 +914,7 @@ static uint_fast8_t vorbis_floor1_decode(vorbis_context *vc, vorbis_floor *vf, f cval=cval>>cbits; if (book>0) { floor1_Y[offset+j]=get_vlc2(gb, vc->codebooks[book].vlc.table, - V_NB_BITS, 3); + vc->codebooks[book].nb_bits, 3); } else { floor1_Y[offset+j]=0; } @@ -1096,7 +1100,7 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) { if (!do_not_decode[j]) { uint_fast32_t temp=get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table, - V_NB_BITS, 3); + vc->codebooks[vr->classbook].nb_bits, 3); AV_DEBUG("Classword: %d \n", temp); @@ -1129,7 +1133,7 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa voffs=voffset+j*vlen; for(k=0;k<step;++k) { - coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; + coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; for(l=0;l<codebook.dimensions;++l) { vec[voffs+k+l*step]+=codebook.codevectors[coffs+l]; // FPMATH } @@ -1138,7 +1142,7 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa else if (vr->type==1) { voffs=voffset+j*vlen; for(k=0;k<step;++k) { - coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; + coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; for(l=0;l<codebook.dimensions;++l, ++voffs) { vec[voffs]+=codebook.codevectors[coffs+l]; // FPMATH @@ -1150,7 +1154,7 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa voffs=voffset>>1; for(k=0;k<step;++k) { - coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; + coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; for(l=0;l<codebook.dimensions;l+=2, voffs++) { vec[voffs ]+=codebook.codevectors[coffs+l ]; // FPMATH vec[voffs+vlen]+=codebook.codevectors[coffs+l+1]; // FPMATH @@ -1164,7 +1168,7 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa voffs=voffset; for(k=0;k<step;++k) { - coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; + coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; for(l=0;l<codebook.dimensions;++l, ++voffs) { vec[voffs/ch+(voffs%ch)*vlen]+=codebook.codevectors[coffs+l]; // FPMATH FIXME use if and counter instead of / and % diff --git a/libavcodec/vorbis.h b/libavcodec/vorbis.h index a9e88cbd65..27274a126e 100644 --- a/libavcodec/vorbis.h +++ b/libavcodec/vorbis.h @@ -9,6 +9,7 @@ typedef struct { uint_fast8_t maxdepth; VLC vlc; float *codevectors; + unsigned int nb_bits; } vorbis_codebook; typedef struct { |