Mercurial > libavcodec.hg
comparison vorbis.c @ 2744:12436597cc0c libavcodec
decrease V_NB_BITS if possible
author | michael |
---|---|
date | Mon, 30 May 2005 22:02:00 +0000 |
parents | 9f469a5d3a33 |
children | fde28cb7e3d5 |
comparison
equal
deleted
inserted
replaced
2743:9f469a5d3a33 | 2744:12436597cc0c |
---|---|
28 #include "bitstream.h" | 28 #include "bitstream.h" |
29 #include "dsputil.h" | 29 #include "dsputil.h" |
30 | 30 |
31 #include "vorbis.h" | 31 #include "vorbis.h" |
32 | 32 |
33 #define V_NB_BITS 11 | 33 #define V_NB_BITS 8 |
34 #define V_NB_BITS2 11 | |
34 #define V_MAX_VLCS (1<<16) | 35 #define V_MAX_VLCS (1<<16) |
35 | 36 |
36 #ifndef V_DEBUG | 37 #ifndef V_DEBUG |
37 #define AV_DEBUG(...) | 38 #define AV_DEBUG(...) |
38 #endif | 39 #endif |
359 } | 360 } |
360 codebook_setup->maxdepth=0; | 361 codebook_setup->maxdepth=0; |
361 for(t=0;t<entries;++t) | 362 for(t=0;t<entries;++t) |
362 if (tmp_vlc_bits[t]>=codebook_setup->maxdepth) codebook_setup->maxdepth=tmp_vlc_bits[t]; | 363 if (tmp_vlc_bits[t]>=codebook_setup->maxdepth) codebook_setup->maxdepth=tmp_vlc_bits[t]; |
363 | 364 |
364 codebook_setup->maxdepth=(codebook_setup->maxdepth+V_NB_BITS-1)/V_NB_BITS; | 365 if(codebook_setup->maxdepth > 3*V_NB_BITS) codebook_setup->nb_bits=V_NB_BITS2; |
365 | 366 else codebook_setup->nb_bits=V_NB_BITS; |
366 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)) { | 367 |
368 codebook_setup->maxdepth=(codebook_setup->maxdepth+codebook_setup->nb_bits-1)/codebook_setup->nb_bits; | |
369 | |
370 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)) { | |
367 av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n"); | 371 av_log(vc->avccontext, AV_LOG_ERROR, " Error generating vlc tables. \n"); |
368 goto error; | 372 goto error; |
369 } | 373 } |
370 } | 374 } |
371 | 375 |
897 | 901 |
898 AV_DEBUG("Cbits %d \n", cbits); | 902 AV_DEBUG("Cbits %d \n", cbits); |
899 | 903 |
900 if (cbits) { // this reads all subclasses for this partition's class | 904 if (cbits) { // this reads all subclasses for this partition's class |
901 cval=get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table, | 905 cval=get_vlc2(gb, vc->codebooks[vf->class_masterbook[class_]].vlc.table, |
902 V_NB_BITS, 3); | 906 vc->codebooks[vf->class_masterbook[class_]].nb_bits, 3); |
903 } | 907 } |
904 | 908 |
905 for(j=0;j<cdim;++j) { | 909 for(j=0;j<cdim;++j) { |
906 book=vf->subclass_books[class_][cval & csub]; | 910 book=vf->subclass_books[class_][cval & csub]; |
907 | 911 |
908 AV_DEBUG("book %d Cbits %d cval %d bits:%d \n", book, cbits, cval, get_bits_count(gb)); | 912 AV_DEBUG("book %d Cbits %d cval %d bits:%d \n", book, cbits, cval, get_bits_count(gb)); |
909 | 913 |
910 cval=cval>>cbits; | 914 cval=cval>>cbits; |
911 if (book>0) { | 915 if (book>0) { |
912 floor1_Y[offset+j]=get_vlc2(gb, vc->codebooks[book].vlc.table, | 916 floor1_Y[offset+j]=get_vlc2(gb, vc->codebooks[book].vlc.table, |
913 V_NB_BITS, 3); | 917 vc->codebooks[book].nb_bits, 3); |
914 } else { | 918 } else { |
915 floor1_Y[offset+j]=0; | 919 floor1_Y[offset+j]=0; |
916 } | 920 } |
917 | 921 |
918 AV_DEBUG(" floor(%d) = %d \n", vf->x_list[offset+j], floor1_Y[offset+j]); | 922 AV_DEBUG(" floor(%d) = %d \n", vf->x_list[offset+j], floor1_Y[offset+j]); |
1094 for(partition_count=0;partition_count<ptns_to_read;) { // SPEC error | 1098 for(partition_count=0;partition_count<ptns_to_read;) { // SPEC error |
1095 if (!pass) { | 1099 if (!pass) { |
1096 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) { | 1100 for(j_times_ptns_to_read=0, j=0;j<ch_used;++j) { |
1097 if (!do_not_decode[j]) { | 1101 if (!do_not_decode[j]) { |
1098 uint_fast32_t temp=get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table, | 1102 uint_fast32_t temp=get_vlc2(gb, vc->codebooks[vr->classbook].vlc.table, |
1099 V_NB_BITS, 3); | 1103 vc->codebooks[vr->classbook].nb_bits, 3); |
1100 | 1104 |
1101 AV_DEBUG("Classword: %d \n", temp); | 1105 AV_DEBUG("Classword: %d \n", temp); |
1102 | 1106 |
1103 assert(vr->classifications > 1 && vr->classifications<256 && temp<=65536); //needed for inverse[] | 1107 assert(vr->classifications > 1 && vr->classifications<256 && temp<=65536); //needed for inverse[] |
1104 for(i=0;i<c_p_c;++i) { | 1108 for(i=0;i<c_p_c;++i) { |
1127 | 1131 |
1128 if (vr->type==0) { | 1132 if (vr->type==0) { |
1129 | 1133 |
1130 voffs=voffset+j*vlen; | 1134 voffs=voffset+j*vlen; |
1131 for(k=0;k<step;++k) { | 1135 for(k=0;k<step;++k) { |
1132 coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; | 1136 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; |
1133 for(l=0;l<codebook.dimensions;++l) { | 1137 for(l=0;l<codebook.dimensions;++l) { |
1134 vec[voffs+k+l*step]+=codebook.codevectors[coffs+l]; // FPMATH | 1138 vec[voffs+k+l*step]+=codebook.codevectors[coffs+l]; // FPMATH |
1135 } | 1139 } |
1136 } | 1140 } |
1137 } | 1141 } |
1138 else if (vr->type==1) { | 1142 else if (vr->type==1) { |
1139 voffs=voffset+j*vlen; | 1143 voffs=voffset+j*vlen; |
1140 for(k=0;k<step;++k) { | 1144 for(k=0;k<step;++k) { |
1141 coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; | 1145 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; |
1142 for(l=0;l<codebook.dimensions;++l, ++voffs) { | 1146 for(l=0;l<codebook.dimensions;++l, ++voffs) { |
1143 vec[voffs]+=codebook.codevectors[coffs+l]; // FPMATH | 1147 vec[voffs]+=codebook.codevectors[coffs+l]; // FPMATH |
1144 | 1148 |
1145 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d \n", pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs); | 1149 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d \n", pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs); |
1146 } | 1150 } |
1148 } | 1152 } |
1149 else if (vr->type==2 && ch==2 && (voffset&1)==0 && (codebook.dimensions&1)==0) { // most frequent case optimized | 1153 else if (vr->type==2 && ch==2 && (voffset&1)==0 && (codebook.dimensions&1)==0) { // most frequent case optimized |
1150 voffs=voffset>>1; | 1154 voffs=voffset>>1; |
1151 | 1155 |
1152 for(k=0;k<step;++k) { | 1156 for(k=0;k<step;++k) { |
1153 coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; | 1157 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; |
1154 for(l=0;l<codebook.dimensions;l+=2, voffs++) { | 1158 for(l=0;l<codebook.dimensions;l+=2, voffs++) { |
1155 vec[voffs ]+=codebook.codevectors[coffs+l ]; // FPMATH | 1159 vec[voffs ]+=codebook.codevectors[coffs+l ]; // FPMATH |
1156 vec[voffs+vlen]+=codebook.codevectors[coffs+l+1]; // FPMATH | 1160 vec[voffs+vlen]+=codebook.codevectors[coffs+l+1]; // FPMATH |
1157 | 1161 |
1158 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", pass, voffset/ch+(voffs%ch)*vlen, vec[voffset/ch+(voffs%ch)*vlen], codebook.codevectors[coffs+l], coffs, l); | 1162 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", pass, voffset/ch+(voffs%ch)*vlen, vec[voffset/ch+(voffs%ch)*vlen], codebook.codevectors[coffs+l], coffs, l); |
1162 } | 1166 } |
1163 else if (vr->type==2) { | 1167 else if (vr->type==2) { |
1164 voffs=voffset; | 1168 voffs=voffset; |
1165 | 1169 |
1166 for(k=0;k<step;++k) { | 1170 for(k=0;k<step;++k) { |
1167 coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions; | 1171 coffs=get_vlc2(gb, codebook.vlc.table, codebook.nb_bits, 3) * codebook.dimensions; |
1168 for(l=0;l<codebook.dimensions;++l, ++voffs) { | 1172 for(l=0;l<codebook.dimensions;++l, ++voffs) { |
1169 vec[voffs/ch+(voffs%ch)*vlen]+=codebook.codevectors[coffs+l]; // FPMATH FIXME use if and counter instead of / and % | 1173 vec[voffs/ch+(voffs%ch)*vlen]+=codebook.codevectors[coffs+l]; // FPMATH FIXME use if and counter instead of / and % |
1170 | 1174 |
1171 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", pass, voffset/ch+(voffs%ch)*vlen, vec[voffset/ch+(voffs%ch)*vlen], codebook.codevectors[coffs+l], coffs, l); | 1175 AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d+%d \n", pass, voffset/ch+(voffs%ch)*vlen, vec[voffset/ch+(voffs%ch)*vlen], codebook.codevectors[coffs+l], coffs, l); |
1172 } | 1176 } |