more trivial optimizations
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 30 May 2005 20:34:05 +0000 (20:34 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 30 May 2005 20:34:05 +0000 (20:34 +0000)
Originally committed as revision 4326 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavcodec/vorbis.c

index a6bbd28..9728931 100644 (file)
@@ -37,7 +37,8 @@
 #define AV_DEBUG(...)
 #endif
 
-
+#undef NDEBUG
+#include <assert.h>
 
 /* Helper functions */
 
@@ -1099,10 +1100,11 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa
 
                         AV_DEBUG("Classword: %d \n", temp);
 
+                        assert(vr->classifications > 1 && vr->classifications<256 && temp<=65536); //needed for inverse[]
                         for(i=0;i<c_p_c;++i) {
                             uint_fast32_t temp2;
 
-                            temp2=temp/vr->classifications;
+                            temp2=(((uint_fast64_t)temp) * inverse[vr->classifications])>>32;
                             classifs[j_times_ptns_to_read+partition_count+c_p_c-1-i]=temp-temp2*vr->classifications;
                             temp=temp2;
                         }
@@ -1120,41 +1122,40 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa
 
                         if (vqbook>=0) {
                             uint_fast16_t coffs;
+                            uint_fast16_t step=vr->partition_size/vc->codebooks[vqbook].dimensions;
+                            vorbis_codebook codebook= vc->codebooks[vqbook];
 
                             if (vr->type==0) {
-                                uint_fast16_t step=vr->partition_size/vc->codebooks[vqbook].dimensions;
 
                                 voffs=voffset+j*vlen;
                                 for(k=0;k<step;++k) {
-                                    coffs=get_vlc2(gb, vc->codebooks[vqbook].vlc.table,
-                                    V_NB_BITS, 3) * vc->codebooks[vqbook].dimensions;
-                                    for(l=0;l<vc->codebooks[vqbook].dimensions;++l) {
-                                        vec[voffs+k+l*step]+=vc->codebooks[vqbook].codevectors[coffs+l];  // FPMATH
+                                    coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions;
+                                    for(l=0;l<codebook.dimensions;++l) {
+                                        vec[voffs+k+l*step]+=codebook.codevectors[coffs+l];  // FPMATH
                                     }
                                 }
                             }
                             else if (vr->type==1) {
                                 voffs=voffset+j*vlen;
-                                for(k=0;k<vr->partition_size/vc->codebooks[vqbook].dimensions;++k) {
-                                    coffs=get_vlc2(gb, vc->codebooks[vqbook].vlc.table,
-                                    V_NB_BITS, 3) * vc->codebooks[vqbook].dimensions;
-                                    for(l=0;l<vc->codebooks[vqbook].dimensions;++l, ++voffs) {
-                                        vec[voffs]+=vc->codebooks[vqbook].codevectors[coffs+l];  // FPMATH
+                                for(k=0;k<step;++k) {
+                                    coffs=get_vlc2(gb, codebook.vlc.table, V_NB_BITS, 3) * codebook.dimensions;
+                                    for(l=0;l<codebook.dimensions;++l, ++voffs) {
+                                        vec[voffs]+=codebook.codevectors[coffs+l];  // FPMATH
 
-                                        AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d  \n", pass, voffs, vec[voffs], vc->codebooks[vqbook].codevectors[coffs+l], coffs);
+                                        AV_DEBUG(" pass %d offs: %d curr: %f change: %f cv offs.: %d  \n", pass, voffs, vec[voffs], codebook.codevectors[coffs+l], coffs);
                                     }
                                 }
                             }
-                            else if (vr->type==2 && ch==2) { // most frequent case optimized
-                                voffs=voffset;
+                            else if (vr->type==2 && ch==2 && (voffset&1)==0 && (codebook.dimensions&1)==0) { // most frequent case optimized
+                                voffs=voffset>>1;
 
-                                for(k=0;k<vr->partition_size/vc->codebooks[vqbook].dimensions;++k) {
-                                    coffs=get_vlc2(gb, vc->codebooks[vqbook].vlc.table,
-                                    V_NB_BITS, 3) * vc->codebooks[vqbook].dimensions;
-                                    for(l=0;l<vc->codebooks[vqbook].dimensions;++l, ++voffs) {
-                                        vec[(voffs>>1)+((voffs&1) ? vlen : 0)]+=vc->codebooks[vqbook].codevectors[coffs+l];  // FPMATH
+                                for(k=0;k<step;++k) {
+                                    coffs=get_vlc2(gb, codebook.vlc.table, V_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
 
-                                        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], vc->codebooks[vqbook].codevectors[coffs+l], coffs, l);
+                                        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,13 +1163,12 @@ static int vorbis_residue_decode(vorbis_context *vc, vorbis_residue *vr, uint_fa
                             else if (vr->type==2) {
                                 voffs=voffset;
 
-                                for(k=0;k<vr->partition_size/vc->codebooks[vqbook].dimensions;++k) {
-                                    coffs=get_vlc2(gb, vc->codebooks[vqbook].vlc.table,
-                                    V_NB_BITS, 3) * vc->codebooks[vqbook].dimensions;
-                                    for(l=0;l<vc->codebooks[vqbook].dimensions;++l, ++voffs) {
-                                        vec[voffs/ch+(voffs%ch)*vlen]+=vc->codebooks[vqbook].codevectors[coffs+l];  // FPMATH FIXME use if and counter instead of / and %
+                                for(k=0;k<step;++k) {
+                                    coffs=get_vlc2(gb, codebook.vlc.table, V_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 %
 
-                                        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], vc->codebooks[vqbook].codevectors[coffs+l], coffs, l);
+                                        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);
                                     }
                                 }
                             } else {