Ignore:
Timestamp:
02/17/07 16:14:53 (18 years ago)
Author:
r2d
Message:
  • speed improvements (mainly inlining)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libmpc/branches/r2d/libmpcdec/mpc_decoder.c

    r203 r219  
    3434/// \file mpc_decoder.c
    3535/// Core decoding routines and logic.
    36 #include <string.h>
     36
    3737#include <mpc/mpcdec.h>
    3838#include <mpc/minimax.h>
     
    4242#include "math.h"
    4343#include "requant.h"
    44 
    45 mpc_uint32_t mpc_bits_read(mpc_bits_reader * r, const unsigned int nb_bits);
    46 mpc_int32_t mpc_bits_huff_dec(mpc_bits_reader * r, const mpc_huffman *Table);
    47 mpc_uint32_t mpc_bits_enum_dec(mpc_bits_reader * r, mpc_uint_t k, mpc_uint_t n);
    48 mpc_uint32_t mpc_bits_log_dec(mpc_bits_reader * r, mpc_uint_t max);
     44#include "mpc_bits_reader.h"
    4945
    5046//SV7 tables
     
    233229            if ( d->Res_L [Band] ) {
    234230                if ( d->Res_R [Band] ) {    // M!=0, S!=0
    235                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][0]);
    236                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][0]);
     231                    facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
     232                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
    237233                    for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
    238234                        *YL   = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
    239235                        *YR   = templ - tempr;
    240236                    }
    241                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][1]);
    242                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][1]);
     237                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
     238                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
    243239                    for ( ; n < 24; n++, YL += 32, YR += 32 ) {
    244240                        *YL   = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
    245241                        *YR   = templ - tempr;
    246242                    }
    247                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][2]);
    248                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][2]);
     243                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
     244                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
    249245                    for ( ; n < 36; n++, YL += 32, YR += 32 ) {
    250246                        *YL   = (templ = MPC_MULTIPLY_FLOAT_INT(facL,*L++))+(tempr = MPC_MULTIPLY_FLOAT_INT(facR,*R++));
     
    252248                    }
    253249                } else {    // M!=0, S==0
    254                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][0]);
     250                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
    255251                    for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
    256252                        *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
    257253                    }
    258                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][1]);
     254                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
    259255                    for ( ; n < 24; n++, YL += 32, YR += 32 ) {
    260256                        *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
    261257                    }
    262                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][2]);
     258                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
    263259                    for ( ; n < 36; n++, YL += 32, YR += 32 ) {
    264260                        *YR = *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
     
    268264                if (d->Res_R[Band])    // M==0, S!=0
    269265                {
    270                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][0]);
     266                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
    271267                    for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
    272268                        *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
    273269                    }
    274                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][1]);
     270                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
    275271                    for ( ; n < 24; n++, YL += 32, YR += 32 ) {
    276272                        *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
    277273                    }
    278                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][2]);
     274                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
    279275                    for ( ; n < 36; n++, YL += 32, YR += 32 ) {
    280276                        *YR = - (*YL = MPC_MULTIPLY_FLOAT_INT(facR,*(R++)));
     
    291287            if ( d->Res_L [Band] ) {
    292288                if ( d->Res_R [Band] ) {    // L!=0, R!=0
    293                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][0]);
    294                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][0]);
     289                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
     290                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
    295291                    for (n = 0; n < 12; n++, YL += 32, YR += 32 ) {
    296292                        *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
    297293                        *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
    298294                    }
    299                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][1]);
    300                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][1]);
     295                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
     296                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
    301297                    for (; n < 24; n++, YL += 32, YR += 32 ) {
    302298                        *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
    303299                        *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
    304300                    }
    305                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][2]);
    306                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][2]);
     301                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
     302                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
    307303                    for (; n < 36; n++, YL += 32, YR += 32 ) {
    308304                        *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
     
    310306                    }
    311307                } else {     // L!=0, R==0
    312                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][0]);
     308                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][0] & 0xFF);
    313309                    for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
    314310                        *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
    315311                        *YR = 0;
    316312                    }
    317                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][1]);
     313                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][1] & 0xFF);
    318314                    for ( ; n < 24; n++, YL += 32, YR += 32 ) {
    319315                        *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
    320316                        *YR = 0;
    321317                    }
    322                     facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , (mpc_uint8_t) d->SCF_Index_L[Band][2]);
     318                                        facL = MPC_MULTIPLY_SCF( Cc[d->Res_L[Band]] , d->SCF_Index_L[Band][2] & 0xFF);
    323319                    for ( ; n < 36; n++, YL += 32, YR += 32 ) {
    324320                        *YL = MPC_MULTIPLY_FLOAT_INT(facL,*L++);
     
    329325            else {
    330326                if ( d->Res_R [Band] ) {    // L==0, R!=0
    331                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][0]);
     327                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][0] & 0xFF);
    332328                    for ( n = 0; n < 12; n++, YL += 32, YR += 32 ) {
    333329                        *YL = 0;
    334330                        *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
    335331                    }
    336                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][1]);
     332                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][1] & 0xFF);
    337333                    for ( ; n < 24; n++, YL += 32, YR += 32 ) {
    338334                        *YL = 0;
    339335                        *YR = MPC_MULTIPLY_FLOAT_INT(facR,*R++);
    340336                    }
    341                     facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , (mpc_uint8_t) d->SCF_Index_R[Band][2]);
     337                                        facR = MPC_MULTIPLY_SCF( Cc[d->Res_R[Band]] , d->SCF_Index_R[Band][2] & 0xFF);
    342338                    for ( ; n < 36; n++, YL += 32, YR += 32 ) {
    343339                        *YL = 0;
     
    619615                do {
    620616                        mpc_int32_t k = 0, idx = 1;
    621                         switch (Res) {
    622                                 case -1:
    623                                         for ( ; k<36; k++ ) {
    624                                                 mpc_uint32_t tmp = mpc_random_int(d);
    625                                                 q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >>  8) & 0xFF) + ((tmp >>  0) & 0xFF) - 510;
    626                                         }
    627                                         break;
    628                                 case 0:
    629                                         break;
    630                                 case 1:
    631                                         Table = mpc_table_HuffQ_8 [0][0];
    632                                         for( ; k < 36; ){
    633                                                 int kmax = k + 18;
    634                                                 mpc_uint_t cnt = mpc_bits_huff_dec(r, Table);
    635                                                 idx = 0;
    636                                                 if (cnt > 0 && cnt < 18)
    637                                                                 idx = mpc_bits_enum_dec(r, cnt <= 9 ? cnt : 18 - cnt, 18);
    638                                                 if (cnt > 9) idx = ~idx;
    639                                                 for ( ; k < kmax; k++) {
    640                                                         q[k] = 0;
    641                                                         if ( idx & (1 << 17) )
    642                                                                 q[k] = (mpc_bits_read(r, 1) << 1) - 1;
    643                                                         idx <<= 1;
    644                                                 }
    645                                         }
    646                                         break;
    647                                 case 2:
     617                        if (Res != 0) {
     618                                if (Res == 2) {
    648619                                        Tables[0] = mpc_table_HuffQ_8 [0][1];
    649620                                        Tables[1] = mpc_table_HuffQ_8 [1][1];
     
    656627                                                idx = (idx >> 1) + HuffQ2_var[tmp];
    657628                                        }
    658                                         break;
    659                                 case 3:
    660                                 case 4:
     629                                } else if (Res == 1) {
     630                                        Table = mpc_table_HuffQ_8 [0][0];
     631                                        for( ; k < 36; ){
     632                                                int kmax = k + 18;
     633                                                mpc_uint_t cnt = mpc_bits_huff_dec(r, Table);
     634                                                idx = 0;
     635                                                if (cnt > 0 && cnt < 18)
     636                                                        idx = mpc_bits_enum_dec(r, cnt <= 9 ? cnt : 18 - cnt, 18);
     637                                                if (cnt > 9) idx = ~idx;
     638                                                for ( ; k < kmax; k++) {
     639                                                        q[k] = 0;
     640                                                        if ( idx & (1 << 17) )
     641                                                                q[k] = (mpc_bits_read(r, 1) << 1) - 1;
     642                                                        idx <<= 1;
     643                                                }
     644                                        }
     645                                } else if (Res == -1) {
     646                                        for ( ; k<36; k++ ) {
     647                                                mpc_uint32_t tmp = mpc_random_int(d);
     648                                                q[k] = ((tmp >> 24) & 0xFF) + ((tmp >> 16) & 0xFF) + ((tmp >>  8) & 0xFF) + ((tmp >>  0) & 0xFF) - 510;
     649                                        }
     650                                } else if (Res <= 4) {
    661651                                        Table = mpc_table_HuffQ_8[0][Res - 1];
    662652                                        for ( ; k < 36; k += 2 ) {
     
    669659                                                q[k + 1] = tmp.s2;
    670660                                        }
    671                                         break;
    672                                 case 5:
    673                                 case 6:
    674                                 case 7:
    675                                 case 8:
     661                                } else if (Res <= 8) {
    676662                                        Tables[0] = mpc_table_HuffQ_8 [0][Res - 1];
    677663                                        Tables[1] = mpc_table_HuffQ_8 [1][Res - 1];
     
    681667                                                idx = (idx >> 1) + absi(q[k]);
    682668                                        }
    683                                         break;
    684                                 default :
     669                                } else {
    685670                                        for ( ; k < 36; k++ ) {
    686671                                                q[k] = mpc_bits_huff_dec(r, mpc_table_HuffQ9up_8);
     
    689674                                                q[k] -= Dc[Res];
    690675                                        }
    691                                         break;
     676                                }
    692677                        }
    693678
Note: See TracChangeset for help on using the changeset viewer.