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 }