Ignore:
Timestamp:
04/24/07 15:07:19 (17 years ago)
Author:
r2d
Message:

Improved sv8 huffman decoding using canonical property of the huffman tables. It reduces memory usage for the tables and improves speed (mainly with small LUT size).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libmpc/trunk/libmpcdec/mpc_decoder.c

    r290 r296  
    5252
    5353//SV8 tables
    54 extern const mpc_huffman mpc_table_HuffBands[33];
    55 extern const mpc_lut_data mpc_HuffRes [2];
    56 extern const mpc_lut_data mpc_HuffQ_8 [8][2];
    57 extern const mpc_lut_data mpc_HuffQ9up_8;
    58 extern const mpc_lut_data mpc_HuffSCFI_1;
    59 extern const mpc_lut_data mpc_HuffSCFI_2;
    60 extern const mpc_lut_data mpc_HuffDSCF_1;
    61 extern const mpc_lut_data mpc_HuffDSCF_2;
     54extern const mpc_can_data mpc_can_Bands;
     55extern const mpc_can_data mpc_can_SCFI[2];
     56extern const mpc_can_data mpc_can_DSCF[2];
     57extern const mpc_can_data mpc_can_Res [2];
     58extern const mpc_can_data mpc_can_Q [8][2];
     59extern const mpc_can_data mpc_can_Q1;
     60extern const mpc_can_data mpc_can_Q9up;
    6261
    6362//------------------------------------------------------------------------------
     
    509508
    510509        mpc_int32_t n, Max_used_Band;
    511         const mpc_lut_data * Table, * Tables[2];
     510        const mpc_can_data * Table, * Tables[2];
    512511
    513512        /***************************** Header *****************************/
     
    516515                Max_used_Band = mpc_bits_log_dec(r, d->max_band + 1);
    517516        } else {
    518                 Max_used_Band = d->last_max_band + mpc_bits_huff_dec(r, mpc_table_HuffBands);
     517                Max_used_Band = d->last_max_band + mpc_bits_can_dec(r, & mpc_can_Bands);
    519518                if (Max_used_Band > 32) Max_used_Band -= 33;
    520519        }
     
    522521
    523522        if (Max_used_Band) {
    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]);
     523                d->Res_L[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]);
     524                d->Res_R[Max_used_Band-1] = mpc_bits_can_dec(r, & mpc_can_Res[0]);
    526525                if (d->Res_L[Max_used_Band-1] > 15) d->Res_L[Max_used_Band-1] -= 17;
    527526                if (d->Res_R[Max_used_Band-1] > 15) d->Res_R[Max_used_Band-1] -= 17;
    528527                for ( n = Max_used_Band - 2; n >= 0; n--) {
    529                         d->Res_L[n] = mpc_bits_huff_lut(r, & mpc_HuffRes[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1];
     528                        d->Res_L[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_L[n + 1] > 2]) + d->Res_L[n + 1];
    530529                        if (d->Res_L[n] > 15) d->Res_L[n] -= 17;
    531                         d->Res_R[n] = mpc_bits_huff_lut(r, & mpc_HuffRes[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1];
     530                        d->Res_R[n] = mpc_bits_can_dec(r, & mpc_can_Res[d->Res_R[n + 1] > 2]) + d->Res_R[n + 1];
    532531                        if (d->Res_R[n] > 15) d->Res_R[n] -= 17;
    533532                }
     
    562561        }
    563562
    564         Tables[0] = & mpc_HuffSCFI_1;
    565         Tables[1] = & mpc_HuffSCFI_2;
     563        Tables[0] = & mpc_can_SCFI[0];
     564        Tables[1] = & mpc_can_SCFI[1];
    566565        for ( n = 0; n < Max_used_Band; n++ ) {
    567566                int tmp = 0, cnt = -1;
     
    569568                if (d->Res_R[n]) cnt++;
    570569                if (cnt >= 0) {
    571                         tmp = mpc_bits_huff_lut(r, Tables[cnt]);
     570                        tmp = mpc_bits_can_dec(r, Tables[cnt]);
    572571                        if (d->Res_L[n]) d->SCFI_L[n] = tmp >> (2 * cnt);
    573572                        if (d->Res_R[n]) d->SCFI_R[n] = tmp & 3;
     
    589588                                        *DSCF_Flag = 0;
    590589                                } else {
    591                                         mpc_uint_t tmp = mpc_bits_huff_lut(r, & mpc_HuffDSCF_2);
     590                                        mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[1]);
    592591                                        if (tmp == 64)
    593592                                                tmp += mpc_bits_read(r, 6);
     
    596595                                for( m = 0; m < 2; m++){
    597596                                        if (((SCFI << m) & 2) == 0) {
    598                                                 mpc_uint_t tmp = mpc_bits_huff_lut(r, & mpc_HuffDSCF_1);
     597                                                mpc_uint_t tmp = mpc_bits_can_dec(r, & mpc_can_DSCF[0]);
    599598                                                if (tmp == 31)
    600599                                                        tmp = 64 + mpc_bits_read(r, 6);
     
    621620                        if (Res != 0) {
    622621                                if (Res == 2) {
    623                                         Tables[0] = & mpc_HuffQ_8 [1][0];
    624                                         Tables[1] = & mpc_HuffQ_8 [1][1];
     622                                        Tables[0] = & mpc_can_Q [0][0];
     623                                        Tables[1] = & mpc_can_Q [0][1];
    625624                                        idx = 2 * thres[Res];
    626625                                        for ( ; k < 36; k += 3) {
    627                                                 int tmp = mpc_bits_huff_lut(r, Tables[idx > thres[Res]]);
     626                                                int tmp = mpc_bits_can_dec(r, Tables[idx > thres[Res]]);
    628627                                                q[k] = idx50[tmp];
    629628                                                q[k + 1] = idx51[tmp];
     
    632631                                        }
    633632                                } else if (Res == 1) {
    634                                         Table = & mpc_HuffQ_8 [0][0];
     633                                        Table = & mpc_can_Q1;
    635634                                        for( ; k < 36; ){
    636635                                                int kmax = k + 18;
    637                                                 mpc_uint_t cnt = mpc_bits_huff_lut(r, Table);
     636                                                mpc_uint_t cnt = mpc_bits_can_dec(r, Table);
    638637                                                idx = 0;
    639638                                                if (cnt > 0 && cnt < 18)
     
    653652                                        }
    654653                                } else if (Res <= 4) {
    655                                         Table = & mpc_HuffQ_8[Res - 1][0];
     654                                        Table = & mpc_can_Q[1][Res - 3];
    656655                                        for ( ; k < 36; k += 2 ) {
    657656                                                union {
     
    659658                                                        struct { mpc_int8_t s1:4, s2:4; };
    660659                                                } tmp;
    661                                                 tmp.sym = mpc_bits_huff_lut(r, Table);
     660                                                tmp.sym = mpc_bits_can_dec(r, Table);
    662661                                                q[k] = tmp.s1;
    663662                                                q[k + 1] = tmp.s2;
    664663                                        }
    665664                                } else if (Res <= 8) {
    666                                         Tables[0] = & mpc_HuffQ_8 [Res - 1][0];
    667                                         Tables[1] = & mpc_HuffQ_8 [Res - 1][1];
     665                                        Tables[0] = & mpc_can_Q [Res - 3][0];
     666                                        Tables[1] = & mpc_can_Q [Res - 3][1];
    668667                                        idx = 2 * thres[Res];
    669668                                        for ( ; k < 36; k++ ) {
    670                                                 q[k] = mpc_bits_huff_lut(r, Tables[idx > thres[Res]]);
     669                                                q[k] = mpc_bits_can_dec(r, Tables[idx > thres[Res]]);
    671670                                                idx = (idx >> 1) + absi(q[k]);
    672671                                        }
    673672                                } else {
    674673                                        for ( ; k < 36; k++ ) {
    675                                                 q[k] = (unsigned char) mpc_bits_huff_lut(r, & mpc_HuffQ9up_8);
     674                                                q[k] = (unsigned char) mpc_bits_can_dec(r, & mpc_can_Q9up);
    676675                                                if (Res != 9)
    677676                                                        q[k] = (q[k] << (Res - 9)) | mpc_bits_read(r, Res - 9);
Note: See TracChangeset for help on using the changeset viewer.