Ignore:
Timestamp:
04/23/07 16:47:30 (17 years ago)
Author:
r2d
Message:

improved decoder speed using LUT for huffman decoding. profiling/bench needed (see LUT_DEPTH parameter in huffman.h)

File:
1 edited

Legend:

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

    r288 r290  
    4646
    4747//SV7 tables
    48 extern const mpc_huffman*   mpc_table_HuffQ [2] [8];
    49 extern const mpc_huffman    mpc_table_HuffHdr  [10];
     48extern const mpc_lut_data   mpc_HuffQ [7] [2];
     49extern const mpc_lut_data   mpc_HuffHdr;
    5050extern const mpc_huffman    mpc_table_HuffSCFI [ 4];
    51 extern const mpc_huffman    mpc_table_HuffDSCF [16];
     51extern const mpc_lut_data   mpc_HuffDSCF;
    5252
    5353//SV8 tables
    54 extern const mpc_huffman mpc_table_HuffRes [2][17];
    55 extern const mpc_huffman * mpc_table_HuffQ_8 [2][8];
    56 extern const mpc_huffman mpc_table_HuffQ9up_8 [256];
    57 extern const mpc_huffman mpc_table_HuffBands [33];
    58 extern const mpc_huffman mpc_table_HuffSCFI_1 [4];
    59 extern const mpc_huffman mpc_table_HuffSCFI_2 [16];
    60 extern const mpc_huffman mpc_table_HuffDSCF_1 [64];
    61 extern const mpc_huffman mpc_table_HuffDSCF_2 [65];
     54extern const mpc_huffman mpc_table_HuffBands[33];
     55extern const mpc_lut_data mpc_HuffRes [2];
     56extern const mpc_lut_data mpc_HuffQ_8 [8][2];
     57extern const mpc_lut_data mpc_HuffQ9up_8;
     58extern const mpc_lut_data mpc_HuffSCFI_1;
     59extern const mpc_lut_data mpc_HuffSCFI_2;
     60extern const mpc_lut_data mpc_HuffDSCF_1;
     61extern const mpc_lut_data mpc_HuffDSCF_2;
    6262
    6363//------------------------------------------------------------------------------
     
    131131                mpc_decoder_setup(p_tmp);
    132132                mpc_decoder_set_streaminfo(p_tmp, si);
     133                huff_init_lut(LUT_DEPTH); // FIXME : this needs to be called only once when the library is loaded
    133134        }
    134135
     
    372373    // consecutive subbands
    373374        for ( n = 1; n <= d->max_band; n++ ) {
    374                 idx   = mpc_bits_huff_dec(r, mpc_table_HuffHdr);
     375                idx   = mpc_bits_huff_lut(r, & mpc_HuffHdr);
    375376                d->Res_L[n] = (idx!=4) ? d->Res_L[n - 1] + idx : (int) mpc_bits_read(r, 4);
    376377
    377                 idx   = mpc_bits_huff_dec(r, mpc_table_HuffHdr);
     378                idx   = mpc_bits_huff_lut(r, & mpc_HuffHdr);
    378379                d->Res_R[n] = (idx!=4) ? d->Res_R[n - 1] + idx : (int) mpc_bits_read(r, 4);
    379380
     
    400401                                switch (SCFI) {
    401402                                        case 1:
    402                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     403                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    403404                                                SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
    404                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     405                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    405406                                                SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6);
    406407                                                SCF[2] = SCF[1];
    407408                                                break;
    408409                                        case 3:
    409                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     410                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    410411                                                SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
    411412                                                SCF[1] = SCF[0];
     
    413414                                                break;
    414415                                        case 2:
    415                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     416                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    416417                                                SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
    417418                                                SCF[1] = SCF[0];
    418                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     419                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    419420                                                SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6);
    420421                                                break;
    421422                                        case 0:
    422                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     423                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    423424                                                SCF[0] = (idx!=8) ? SCF[2] + idx : (int) mpc_bits_read(r, 6);
    424                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     425                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    425426                                                SCF[1] = (idx!=8) ? SCF[0] + idx : (int) mpc_bits_read(r, 6);
    426                                                 idx  = mpc_bits_huff_dec(r, mpc_table_HuffDSCF);
     427                                                idx  = mpc_bits_huff_lut(r, & mpc_HuffDSCF);
    427428                                                SCF[2] = (idx!=8) ? SCF[1] + idx : (int) mpc_bits_read(r, 6);
    428429                                                break;
     
    450451                do {
    451452                        mpc_int32_t k;
    452                         const mpc_huffman *Table;
     453                        const mpc_lut_data *Table;
    453454                        switch (Res) {
    454455                                case  -2: case  -3: case  -4: case  -5: case  -6: case  -7: case  -8: case  -9:
     
    462463                                        break;
    463464                                case 1:
    464                                         Table = mpc_table_HuffQ[mpc_bits_read(r, 1)][1];
     465                                        Table = & mpc_HuffQ[0][mpc_bits_read(r, 1)];
    465466                                        for ( k = 0; k < 36; k += 3) {
    466                                                 idx = mpc_bits_huff_dec(r, Table);
     467                                                idx = mpc_bits_huff_lut(r, Table);
    467468                                                q[k] = idx30[idx];
    468469                                                q[k + 1] = idx31[idx];
     
    471472                                        break;
    472473                                case 2:
    473                                         Table = mpc_table_HuffQ[mpc_bits_read(r, 1)][2];
     474                                        Table = & mpc_HuffQ[1][mpc_bits_read(r, 1)];
    474475                                        for ( k = 0; k < 36; k += 2) {
    475                                                 idx = mpc_bits_huff_dec(r, Table);
     476                                                idx = mpc_bits_huff_lut(r, Table);
    476477                                                q[k] = idx50[idx];
    477478                                                q[k + 1] = idx51[idx];
     
    483484                                case 6:
    484485                                case 7:
    485                                         Table = mpc_table_HuffQ[mpc_bits_read(r, 1)][Res];
     486                                        Table = & mpc_HuffQ[Res - 1][mpc_bits_read(r, 1)];
    486487                                        for ( k = 0; k < 36; k++ )
    487                                                 q[k] = mpc_bits_huff_dec(r, Table);
     488                                                q[k] = mpc_bits_huff_lut(r, Table);
    488489                                        break;
    489490                                case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: case 16: case 17:
     
    508509
    509510        mpc_int32_t n, Max_used_Band;
    510         const mpc_huffman *Table, *Tables[2];
     511        const mpc_lut_data * Table, * Tables[2];
    511512
    512513        /***************************** Header *****************************/
     
    521522
    522523        if (Max_used_Band) {
    523                 d->Res_L[Max_used_Band-1] = mpc_bits_huff_dec(r, mpc_table_HuffRes[0]);
    524                 d->Res_R[Max_used_Band-1] = mpc_bits_huff_dec(r, mpc_table_HuffRes[0]);
     524                d->Res_L[Max_used_Band-1] = mpc_bits_huff_lut(r, & mpc_HuffRes[0]);
     525                d->Res_R[Max_used_Band-1] = mpc_bits_huff_lut(r, & mpc_HuffRes[0]);
    525526                if (d->Res_L[Max_used_Band-1] > 15) d->Res_L[Max_used_Band-1] -= 17;
    526527                if (d->Res_R[Max_used_Band-1] > 15) d->Res_R[Max_used_Band-1] -= 17;
    527528                for ( n = Max_used_Band - 2; n >= 0; n--) {
    528                         d->Res_L[n] = mpc_bits_huff_dec(r, mpc_table_HuffRes[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1];
     529                        d->Res_L[n] = mpc_bits_huff_lut(r, & mpc_HuffRes[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1];
    529530                        if (d->Res_L[n] > 15) d->Res_L[n] -= 17;
    530                         d->Res_R[n] = mpc_bits_huff_dec(r, mpc_table_HuffRes[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1];
     531                        d->Res_R[n] = mpc_bits_huff_lut(r, & mpc_HuffRes[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1];
    531532                        if (d->Res_R[n] > 15) d->Res_R[n] -= 17;
    532533                }
     
    561562        }
    562563
    563         Tables[0] = mpc_table_HuffSCFI_1;
    564         Tables[1] = mpc_table_HuffSCFI_2;
     564        Tables[0] = & mpc_HuffSCFI_1;
     565        Tables[1] = & mpc_HuffSCFI_2;
    565566        for ( n = 0; n < Max_used_Band; n++ ) {
    566567                int tmp = 0, cnt = -1;
     
    568569                if (d->Res_R[n]) cnt++;
    569570                if (cnt >= 0) {
    570                         tmp = mpc_bits_huff_dec(r, Tables[cnt]);
     571                        tmp = mpc_bits_huff_lut(r, Tables[cnt]);
    571572                        if (d->Res_L[n]) d->SCFI_L[n] = tmp >> (2 * cnt);
    572573                        if (d->Res_R[n]) d->SCFI_R[n] = tmp & 3;
     
    588589                                        *DSCF_Flag = 0;
    589590                                } else {
    590                                         mpc_uint_t tmp = mpc_bits_huff_dec(r, mpc_table_HuffDSCF_2);
     591                                        mpc_uint_t tmp = mpc_bits_huff_lut(r, & mpc_HuffDSCF_2);
    591592                                        if (tmp == 64)
    592593                                                tmp += mpc_bits_read(r, 6);
     
    595596                                for( m = 0; m < 2; m++){
    596597                                        if (((SCFI << m) & 2) == 0) {
    597                                                 mpc_uint_t tmp = mpc_bits_huff_dec(r, mpc_table_HuffDSCF_1);
     598                                                mpc_uint_t tmp = mpc_bits_huff_lut(r, & mpc_HuffDSCF_1);
    598599                                                if (tmp == 31)
    599600                                                        tmp = 64 + mpc_bits_read(r, 6);
     
    620621                        if (Res != 0) {
    621622                                if (Res == 2) {
    622                                         Tables[0] = mpc_table_HuffQ_8 [0][1];
    623                                         Tables[1] = mpc_table_HuffQ_8 [1][1];
     623                                        Tables[0] = & mpc_HuffQ_8 [1][0];
     624                                        Tables[1] = & mpc_HuffQ_8 [1][1];
    624625                                        idx = 2 * thres[Res];
    625626                                        for ( ; k < 36; k += 3) {
    626                                                 int tmp = mpc_bits_huff_dec(r, Tables[idx > thres[Res]]);
     627                                                int tmp = mpc_bits_huff_lut(r, Tables[idx > thres[Res]]);
    627628                                                q[k] = idx50[tmp];
    628629                                                q[k + 1] = idx51[tmp];
     
    631632                                        }
    632633                                } else if (Res == 1) {
    633                                         Table = mpc_table_HuffQ_8 [0][0];
     634                                        Table = & mpc_HuffQ_8 [0][0];
    634635                                        for( ; k < 36; ){
    635636                                                int kmax = k + 18;
    636                                                 mpc_uint_t cnt = mpc_bits_huff_dec(r, Table);
     637                                                mpc_uint_t cnt = mpc_bits_huff_lut(r, Table);
    637638                                                idx = 0;
    638639                                                if (cnt > 0 && cnt < 18)
     
    652653                                        }
    653654                                } else if (Res <= 4) {
    654                                         Table = mpc_table_HuffQ_8[0][Res - 1];
     655                                        Table = & mpc_HuffQ_8[Res - 1][0];
    655656                                        for ( ; k < 36; k += 2 ) {
    656657                                                union {
     
    658659                                                        struct { mpc_int8_t s1:4, s2:4; };
    659660                                                } tmp;
    660                                                 tmp.sym = mpc_bits_huff_dec(r, Table);
     661                                                tmp.sym = mpc_bits_huff_lut(r, Table);
    661662                                                q[k] = tmp.s1;
    662663                                                q[k + 1] = tmp.s2;
    663664                                        }
    664665                                } else if (Res <= 8) {
    665                                         Tables[0] = mpc_table_HuffQ_8 [0][Res - 1];
    666                                         Tables[1] = mpc_table_HuffQ_8 [1][Res - 1];
     666                                        Tables[0] = & mpc_HuffQ_8 [Res - 1][0];
     667                                        Tables[1] = & mpc_HuffQ_8 [Res - 1][1];
    667668                                        idx = 2 * thres[Res];
    668669                                        for ( ; k < 36; k++ ) {
    669                                                 q[k] = mpc_bits_huff_dec(r, Tables[idx > thres[Res]]);
     670                                                q[k] = mpc_bits_huff_lut(r, Tables[idx > thres[Res]]);
    670671                                                idx = (idx >> 1) + absi(q[k]);
    671672                                        }
    672673                                } else {
    673674                                        for ( ; k < 36; k++ ) {
    674                                                 q[k] = (unsigned char) mpc_bits_huff_dec(r, mpc_table_HuffQ9up_8);
     675                                                q[k] = (unsigned char) mpc_bits_huff_lut(r, & mpc_HuffQ9up_8);
    675676                                                if (Res != 9)
    676677                                                        q[k] = (q[k] << (Res - 9)) | mpc_bits_read(r, Res - 9);
Note: See TracChangeset for help on using the changeset viewer.