Home | History | Annotate | Download | only in decoder
      1 /******************************************************************************
      2  *                                                                            *
      3  * Copyright (C) 2018 The Android Open Source Project
      4  *
      5  * Licensed under the Apache License, Version 2.0 (the "License");
      6  * you may not use this file except in compliance with the License.
      7  * You may obtain a copy of the License at:
      8  *
      9  * http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  * Unless required by applicable law or agreed to in writing, software
     12  * distributed under the License is distributed on an "AS IS" BASIS,
     13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  * See the License for the specific language governing permissions and
     15  * limitations under the License.
     16  *
     17  *****************************************************************************
     18  * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
     19 */
     20 #include <stdlib.h>
     21 #include <stdio.h>
     22 
     23 #include <ixheaacd_type_def.h>
     24 
     25 #include "ixheaacd_bitbuffer.h"
     26 
     27 #include "ixheaacd_defines.h"
     28 #include "ixheaacd_memory_standards.h"
     29 #include "ixheaacd_sbrdecsettings.h"
     30 #include "ixheaacd_env_extr_part.h"
     31 #include <ixheaacd_aac_rom.h>
     32 #include "ixheaacd_common_rom.h"
     33 #include <ixheaacd_sbr_rom.h>
     34 #include "ixheaacd_pulsedata.h"
     35 #include "ixheaacd_pns.h"
     36 
     37 #include "ixheaacd_sbr_common.h"
     38 #include "ixheaacd_drc_data_struct.h"
     39 #include "ixheaacd_drc_dec.h"
     40 
     41 #include "ixheaacd_lt_predict.h"
     42 #include "ixheaacd_channelinfo.h"
     43 #include "ixheaacd_channel.h"
     44 #include "ixheaacd_channelinfo.h"
     45 #include "ixheaacd_sbrdecoder.h"
     46 #include "ixheaacd_audioobjtypes.h"
     47 #include "ixheaacd_latmdemux.h"
     48 #include "ixheaacd_aacdec.h"
     49 #include "ixheaacd_sbr_common.h"
     50 
     51 #include "ixheaacd_mps_polyphase.h"
     52 #include "ixheaacd_config.h"
     53 #include "ixheaacd_mps_dec.h"
     54 #include "ixheaacd_mps_interface.h"
     55 #include "ixheaacd_struct_def.h"
     56 
     57 #include "ixheaacd_config.h"
     58 #include "ixheaacd_mps_interface.h"
     59 
     60 #include "ixheaacd_mps_polyphase.h"
     61 
     62 #include "ixheaacd_mps_dec.h"
     63 #include "ixheaacd_mps_process.h"
     64 #include "ixheaacd_mps_decor.h"
     65 #include "ixheaacd_mps_hybfilter.h"
     66 #include "ixheaacd_mps_nlc_dec.h"
     67 #include "ixheaacd_mps_huff_tab.h"
     68 
     69 #include "math.h"
     70 
     71 #include <assert.h>
     72 #include <string.h>
     73 
     74 extern ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes;
     75 extern ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes;
     76 extern ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes;
     77 extern ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes;
     78 extern ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes;
     79 extern ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes;
     80 extern ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes;
     81 
     82 WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len,
     83                            WORD32 residual_coding,
     84                            ia_usac_dec_mps_config_struct* mps212_config) {
     85   WORD32 num_ch;
     86   WORD32 err_code = 0;
     87 
     88   ia_mps_bs_frame bs_frame;
     89 
     90   self->num_parameter_sets = 1;
     91   self->qmf_band_count = 64;
     92 
     93   self->res_ch_count = 0;
     94 
     95   if (mps212_config) {
     96     self->config = mps212_config;
     97     self->frame_length = bs_frame_len;
     98     self->in_ch_count = 1;
     99     self->out_ch_count = 2;
    100     self->residual_coding = residual_coding;
    101     if (self->residual_coding) {
    102       self->bs_residual_present = 1;
    103       self->bs_residual_bands = mps212_config->bs_residual_bands;
    104       if (self->config->bs_phase_coding) {
    105         self->config->bs_phase_coding = 2;
    106       }
    107     }
    108   }
    109 
    110   err_code = ixheaacd_mps_header_decode(self);
    111 
    112   if (err_code != 0) return err_code;
    113 
    114   if ((self->residual_coding) && (self->res_bands > 0)) self->res_ch_count++;
    115 
    116   ixheaacd_mps_env_init(self);
    117 
    118   ixheaacd_mps_synt_create(&self->poly_phase_filt_kernel, self->qmf_band_count);
    119 
    120   for (num_ch = 0; num_ch < self->out_ch_count; num_ch++) {
    121     ixheaacd_mps_synt_init(&self->qmf_filt_state[num_ch]);
    122   }
    123 
    124   ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[0]);
    125 
    126   if ((self->residual_coding) && (self->res_bands > 0))
    127     ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[1]);
    128 
    129   ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count,
    130                           self->config->bs_decorr_config);
    131 
    132   ixheaacd_mps_init_pre_and_post_matrix(self);
    133 
    134   self->parse_nxt_frame = 1;
    135 
    136   bs_frame = self->bs_frame;
    137   memset(bs_frame.cld_idx_pre, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
    138   memset(bs_frame.icc_idx_pre, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
    139   memset(bs_frame.cmp_cld_idx_prev, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
    140   memset(bs_frame.cmp_icc_idx_prev, 0, MAX_PARAMETER_BANDS * sizeof(WORD32));
    141 
    142   self->subband_var.init_flag = 0;
    143   self->subband_var.update_old_ener = 0;
    144   self->subband_var.nrg_dir = 0;
    145   memset(self->subband_var.nrg_diff, 0, 2 * sizeof(FLOAT32));
    146 
    147   memset(self->opd_smooth.smooth_l_phase, 0,
    148          MAX_PARAMETER_BANDS * sizeof(WORD32));
    149   memset(self->opd_smooth.smooth_r_phase, 0,
    150          MAX_PARAMETER_BANDS * sizeof(WORD32));
    151 
    152   return 0;
    153 }
    154 
    155 static FLOAT32 ixheaacd_tsd_mul_re[] = {
    156     1.0f,  0.707106781186548f,  0.0f, -0.707106781186548f,
    157     -1.0f, -0.707106781186548f, 0.0f, 0.707106781186548f};
    158 
    159 static FLOAT32 ixheaacd_tsd_mul_im[] = {
    160     0.0f, 0.707106781186548f,  1.0f,  0.707106781186548f,
    161     0.0f, -0.707106781186548f, -1.0f, -0.707106781186548f};
    162 
    163 VOID ixheaacd_mps_qmf_hyb_analysis(ia_mps_dec_state_struct* self) {
    164   ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[0], self->qmf_in[0],
    165                                    self->qmf_band_count, self->time_slots,
    166                                    self->hyb_in[0]);
    167 
    168   if ((self->residual_coding) && (self->res_bands > 0)) {
    169     ixheaacd_mps_qmf_hybrid_analysis(&self->hyb_filt_state[self->in_ch_count],
    170                                      self->qmf_in[1], self->qmf_band_count,
    171                                      self->time_slots, self->hyb_res);
    172   }
    173 }
    174 
    175 VOID ixheaacd_mps_qmf_hyb_synthesis(ia_mps_dec_state_struct* self) {
    176   WORD32 ch;
    177 
    178   for (ch = 0; ch < self->out_ch_count; ch++) {
    179     ixheaacd_mps_qmf_hybrid_synthesis(self->hyb_dir_out[ch],
    180                                       self->qmf_band_count, self->time_slots,
    181                                       self->qmf_out_dir[ch]);
    182   }
    183 }
    184 
    185 VOID ixheaacd_mps_decor(ia_mps_dec_state_struct* self) {
    186   WORD32 k, sb_sample, idx;
    187 
    188   ia_cmplx_flt_struct(*scratch)[MAX_HYBRID_BANDS_MPS];
    189 
    190   ia_cmplx_flt_struct coeff;
    191   WORD32 band_start = 7;
    192 
    193   scratch = self->scratch;
    194 
    195   for (k = self->dir_sig_count; k < self->dir_sig_count + self->decor_sig_count;
    196        k++) {
    197     if (self->bs_tsd_enable) {
    198       for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) {
    199         if (self->bs_tsd_sep_data[sb_sample]) {
    200           for (idx = band_start; idx < self->mps_decor.num_bins; idx++) {
    201             scratch[sb_sample][idx].re = self->v[k][sb_sample][idx].re;
    202             scratch[sb_sample][idx].im = self->v[k][sb_sample][idx].im;
    203             self->v[k][sb_sample][idx].re = 0.0f;
    204             self->v[k][sb_sample][idx].im = 0.0f;
    205           }
    206         }
    207       }
    208     }
    209 
    210     ixheaacd_mps_decor_apply(&self->mps_decor, self->v[k], self->w_diff[k],
    211                              self->time_slots);
    212 
    213     if (self->bs_tsd_enable) {
    214       for (sb_sample = 0; sb_sample < self->time_slots; sb_sample++) {
    215         if (self->bs_tsd_sep_data[sb_sample]) {
    216           coeff.re = ixheaacd_tsd_mul_re[self->bs_tsd_tr_phase_data[sb_sample]];
    217           coeff.im = ixheaacd_tsd_mul_im[self->bs_tsd_tr_phase_data[sb_sample]];
    218 
    219           for (idx = band_start; idx < self->mps_decor.num_bins; idx++) {
    220             self->w_diff[k][sb_sample][idx].re +=
    221                 coeff.re * scratch[sb_sample][idx].re -
    222                 coeff.im * scratch[sb_sample][idx].im;
    223             self->w_diff[k][sb_sample][idx].im +=
    224                 coeff.im * scratch[sb_sample][idx].re +
    225                 coeff.re * scratch[sb_sample][idx].im;
    226           }
    227         }
    228       }
    229     }
    230   }
    231 }
    232 
    233 VOID ixheaacd_mps_mix_res_decor(ia_mps_dec_state_struct* self) {
    234   WORD32 ts, qs, row, indx;
    235 
    236   for (ts = 0; ts < self->time_slots; ts++) {
    237     for (qs = 0; qs < self->hyb_band_count; qs++) {
    238       indx = self->hyb_band_to_processing_band_table[qs];
    239 
    240       for (row = 0; row < self->dir_sig_count; row++) {
    241         self->w_dir[row][ts][qs].re = self->v[row][ts][qs].re;
    242         self->w_dir[row][ts][qs].im = self->v[row][ts][qs].im;
    243       }
    244 
    245       for (row = self->dir_sig_count;
    246            row < (self->dir_sig_count + self->decor_sig_count); row++) {
    247         if (indx < self->res_bands) {
    248           self->w_dir[row][ts][qs].re = self->hyb_res[ts][qs].re;
    249           self->w_dir[row][ts][qs].im = self->hyb_res[ts][qs].im;
    250         } else {
    251           self->w_dir[row][ts][qs].re = 0.0f;
    252           self->w_dir[row][ts][qs].im = 0.0f;
    253         }
    254       }
    255 
    256       for (row = 0; row < self->dir_sig_count; row++) {
    257         self->w_diff[row][ts][qs].re = 0.0f;
    258         self->w_diff[row][ts][qs].im = 0.0f;
    259       }
    260 
    261       for (row = self->dir_sig_count;
    262            row < (self->dir_sig_count + self->decor_sig_count); row++) {
    263         if (indx < self->res_bands) {
    264           self->w_diff[row][ts][qs].re = 0.0f;
    265           self->w_diff[row][ts][qs].im = 0.0f;
    266         }
    267       }
    268     }
    269   }
    270 }
    271 
    272 VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self) {
    273   ixheaacd_mps_decor(self);
    274   ixheaacd_mps_mix_res_decor(self);
    275 }
    276 WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self,
    277                           FLOAT32** input_buffer[4],
    278                           FLOAT32 (*output_buffer)[4096]) {
    279   WORD32 ch, ts, qs;
    280   WORD32 time_slots = self->time_slots;
    281   WORD32 in_ch_count = self->in_ch_count + self->res_ch_count;
    282   WORD32 err = 0;
    283 
    284   self->output_buffer = output_buffer;
    285 
    286   assert(self->present_time_slot + time_slots <= self->time_slots);
    287 
    288   for (ts = 0; ts < time_slots; ts++) {
    289     for (ch = 0; ch < in_ch_count; ch++) {
    290       for (qs = 0; qs < self->qmf_band_count; qs++) {
    291         self->qmf_in[ch][self->present_time_slot + ts][qs].re =
    292             self->input_gain * input_buffer[2 * ch][ts][qs];
    293         self->qmf_in[ch][self->present_time_slot + ts][qs].im =
    294             self->input_gain * input_buffer[2 * ch + 1][ts][qs];
    295       }
    296     }
    297   }
    298 
    299   self->present_time_slot += time_slots;
    300 
    301   if (self->present_time_slot < self->time_slots) return 0;
    302 
    303   self->present_time_slot = 0;
    304 
    305   err = ixheaacd_mps_frame_decode(self);
    306 
    307   if (err != 0) return err;
    308   ixheaacd_mps_qmf_hyb_analysis(self);
    309 
    310   ixheaacd_pre_and_mix_matrix_calculation(self);
    311 
    312   ixheaacd_mps_pre_matrix_mix_matrix_smoothing(self);
    313 
    314   err = ixheaacd_mps_apply_pre_matrix(self);
    315   if (err < 0) return err;
    316 
    317   ixheaacd_mps_create_w(self);
    318 
    319   err = ixheaacd_mps_apply_mix_matrix(self);
    320   if (err < 0) return err;
    321 
    322   if (self->config->bs_temp_shape_config == 2) {
    323     ixheaacd_mps_time_env_shaping(self);
    324   }
    325 
    326   err = ixheaacd_mps_temp_process(self);
    327   if (err) return err;
    328 
    329   self->parse_nxt_frame = 1;
    330   return 0;
    331 }
    332 
    333 #define min(a, b) (((a) < (b)) ? (a) : (b))
    334 
    335 static WORD32 ixheaacd_mps_pcm_decode(ia_handle_bit_buf_struct it_bit_buff,
    336                                       WORD32* out_data_1, WORD32* out_data_2,
    337                                       WORD32 ixheaacd_drc_offset,
    338                                       WORD32 num_val, WORD32 num_levels) {
    339   WORD32 i = 0, j = 0, idx = 0;
    340   WORD32 max_grp_len = 0, grp_len = 0, next_val = 0, grp_val = 0;
    341   UWORD32 data = 0;
    342 
    343   FLOAT32 ld_nlev = 0.f;
    344 
    345   WORD32 pcm_chunk_size[7] = {0};
    346 
    347   switch (num_levels) {
    348     case 3:
    349       max_grp_len = 5;
    350       break;
    351     case 7:
    352       max_grp_len = 6;
    353       break;
    354     case 11:
    355       max_grp_len = 2;
    356       break;
    357     case 13:
    358       max_grp_len = 4;
    359       break;
    360     case 19:
    361       max_grp_len = 4;
    362       break;
    363     case 25:
    364       max_grp_len = 3;
    365       break;
    366     case 51:
    367       max_grp_len = 4;
    368       break;
    369     case 4:
    370     case 8:
    371     case 15:
    372     case 16:
    373     case 26:
    374     case 31:
    375       max_grp_len = 1;
    376       break;
    377     default:
    378       assert(0);
    379   }
    380 
    381   ld_nlev = (FLOAT32)(log((FLOAT32)num_levels) / log(2.f));
    382 
    383   for (i = 1; i <= max_grp_len; i++) {
    384     pcm_chunk_size[i] = (WORD32)ceil((FLOAT32)(i)*ld_nlev);
    385   }
    386 
    387   for (i = 0; i < num_val; i += max_grp_len) {
    388     grp_len = min(max_grp_len, num_val - i);
    389     data = ixheaacd_read_bits_buf(it_bit_buff, pcm_chunk_size[grp_len]);
    390 
    391     grp_val = data;
    392 
    393     for (j = 0; j < grp_len; j++) {
    394       idx = i + (grp_len - j - 1);
    395       next_val = grp_val % num_levels;
    396 
    397       if (out_data_2 == NULL) {
    398         out_data_1[idx] = next_val - ixheaacd_drc_offset;
    399       } else if (out_data_1 == NULL) {
    400         out_data_2[idx] = next_val - ixheaacd_drc_offset;
    401       } else {
    402         if (idx % 2) {
    403           out_data_2[idx / 2] = next_val - ixheaacd_drc_offset;
    404         } else {
    405           out_data_1[idx / 2] = next_val - ixheaacd_drc_offset;
    406         }
    407       }
    408 
    409       grp_val = (grp_val - next_val) / num_levels;
    410     }
    411   }
    412 
    413   return 1;
    414 }
    415 
    416 static WORD32 ixheaacd_mps_huff_read(ia_handle_bit_buf_struct it_bit_buff,
    417                                      const WORD32 (*node_tab)[][2],
    418                                      WORD32* out_data) {
    419   WORD32 node = 0;
    420   UWORD32 next_bit = 0;
    421 
    422   do {
    423     next_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    424     node = (*node_tab)[node][next_bit];
    425   } while (node > 0);
    426 
    427   *out_data = node;
    428 
    429   return 1;
    430 }
    431 
    432 static WORD32 ixheaacd_mps_huff_read_2d(ia_handle_bit_buf_struct it_bit_buff,
    433                                         const WORD32 (*node_tab)[][2],
    434                                         WORD32 out_data[2], WORD32* escape)
    435 
    436 {
    437   WORD32 huff_2d_8bit = 0;
    438   WORD32 node = 0;
    439 
    440   if (!ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node)) return 0;
    441   *escape = (node == 0);
    442 
    443   if (*escape) {
    444     out_data[0] = 0;
    445     out_data[1] = 1;
    446   } else {
    447     huff_2d_8bit = -(node + 1);
    448     out_data[0] = huff_2d_8bit >> 4;
    449     out_data[1] = huff_2d_8bit & 0xf;
    450   }
    451 
    452   return 1;
    453 }
    454 
    455 static WORD32 ixheaacd_mps_sym_restore(ia_handle_bit_buf_struct it_bit_buff,
    456                                        WORD32 lav, WORD32 data[2]) {
    457   WORD32 tmp = 0;
    458   UWORD32 sym_bit = 0;
    459 
    460   WORD32 sum_val = data[0] + data[1];
    461   WORD32 diff_val = data[0] - data[1];
    462 
    463   if (sum_val > lav) {
    464     data[0] = -sum_val + (2 * lav + 1);
    465     data[1] = -diff_val;
    466   } else {
    467     data[0] = sum_val;
    468     data[1] = diff_val;
    469   }
    470 
    471   if (data[0] + data[1] != 0) {
    472     sym_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    473     if (sym_bit) {
    474       data[0] = -data[0];
    475       data[1] = -data[1];
    476     }
    477   }
    478 
    479   if (data[0] - data[1] != 0) {
    480     sym_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    481     if (sym_bit) {
    482       tmp = data[0];
    483       data[0] = data[1];
    484       data[1] = tmp;
    485     }
    486   }
    487 
    488   return 1;
    489 }
    490 
    491 static WORD32 ixheaacd_mps_sym_restoreipd(ia_handle_bit_buf_struct it_bit_buff,
    492                                           WORD32 lav, WORD32 data[2]) {
    493   WORD32 tmp = 0;
    494   UWORD32 sym_bit = 0;
    495 
    496   WORD32 sum_val = data[0] + data[1];
    497   WORD32 diff_val = data[0] - data[1];
    498 
    499   if (sum_val > lav) {
    500     data[0] = -sum_val + (2 * lav + 1);
    501     data[1] = -diff_val;
    502   } else {
    503     data[0] = sum_val;
    504     data[1] = diff_val;
    505   }
    506 
    507   if (data[0] - data[1] != 0) {
    508     sym_bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
    509     if (sym_bit) {
    510       tmp = data[0];
    511       data[0] = data[1];
    512       data[1] = tmp;
    513     }
    514   }
    515 
    516   return 1;
    517 }
    518 
    519 static WORD32 ixheaacd_mps_huff_dec_pilot(ia_handle_bit_buf_struct it_bit_buff,
    520                                           const WORD32 (*node_tab)[][2],
    521                                           WORD32* pilot_data) {
    522   WORD32 node = 0;
    523 
    524   if (!ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node)) return 0;
    525   *pilot_data = -(node + 1);
    526 
    527   return 1;
    528 }
    529 
    530 static WORD32 ixheaacd_mps_huff_dec_cld_1d(
    531     ia_handle_bit_buf_struct it_bit_buff,
    532     const ia_huff_cld_node_1d_struct* huff_nodes, WORD32* out_data,
    533     WORD32 num_val, WORD32 p0_flag) {
    534   WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
    535   WORD32 od = 0, od_sign = 0;
    536   UWORD32 data = 0;
    537 
    538   if (p0_flag) {
    539     if (!ixheaacd_mps_huff_read(
    540             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld,
    541             &node))
    542       return 0;
    543     out_data[0] = -(node + 1);
    544     ixheaacd_drc_offset = 1;
    545   }
    546 
    547   for (i = ixheaacd_drc_offset; i < num_val; i++) {
    548     if (!ixheaacd_mps_huff_read(
    549             it_bit_buff, (ia_huff_node_struct)&huff_nodes->node_tab, &node))
    550       return 0;
    551     od = -(node + 1);
    552 
    553     if (od != 0) {
    554       data = ixheaacd_read_bits_buf(it_bit_buff, 1);
    555       od_sign = data;
    556 
    557       if (od_sign) od = -od;
    558     }
    559 
    560     out_data[i] = od;
    561   }
    562 
    563   return 1;
    564 }
    565 
    566 static WORD32 ixheaacd_mps_huff_dec_ipd_1d(
    567     ia_handle_bit_buf_struct it_bit_buff,
    568     const ia_huff_ipd_node_1d_struct* huff_nodes, WORD32* out_data,
    569     WORD32 num_val, WORD32 p0_flag) {
    570   WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
    571   WORD32 od = 0;
    572 
    573   if (p0_flag) {
    574     if (!ixheaacd_mps_huff_read(
    575             it_bit_buff,
    576             (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, &node))
    577       return 0;
    578     out_data[0] = -(node + 1);
    579     ixheaacd_drc_offset = 1;
    580   }
    581 
    582   for (i = ixheaacd_drc_offset; i < num_val; i++) {
    583     if (!ixheaacd_mps_huff_read(
    584             it_bit_buff, (ia_huff_node_struct)&huff_nodes->node_tab, &node))
    585       return 0;
    586     od = -(node + 1);
    587     out_data[i] = od;
    588   }
    589 
    590   return 1;
    591 }
    592 
    593 static WORD32 ixheaacd_mps_huff_dec_icc_1d(
    594     ia_handle_bit_buf_struct it_bit_buff,
    595     const ia_huff_icc_node_1d_struct* huff_nodes, WORD32* out_data,
    596     WORD32 num_val, WORD32 p0_flag) {
    597   WORD32 i = 0, node = 0, ixheaacd_drc_offset = 0;
    598   WORD32 od = 0, od_sign = 0;
    599   UWORD32 data = 0;
    600 
    601   if (p0_flag) {
    602     if (!ixheaacd_mps_huff_read(
    603             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc,
    604             &node))
    605       return 0;
    606     out_data[0] = -(node + 1);
    607     ixheaacd_drc_offset = 1;
    608   }
    609 
    610   for (i = ixheaacd_drc_offset; i < num_val; i++) {
    611     if (!ixheaacd_mps_huff_read(
    612             it_bit_buff, (ia_huff_node_struct)&huff_nodes->node_tab, &node))
    613       return 0;
    614     od = -(node + 1);
    615 
    616     if (od != 0) {
    617       data = ixheaacd_read_bits_buf(it_bit_buff, 1);
    618       od_sign = data;
    619 
    620       if (od_sign) od = -od;
    621     }
    622 
    623     out_data[i] = od;
    624   }
    625 
    626   return 1;
    627 }
    628 
    629 static WORD32 ixheaacd_mps_huff_dec_cld_2d(
    630     ia_handle_bit_buf_struct it_bit_buff,
    631     const ia_huff_cld_node_2d_struct* huff_nodes, WORD32 out_data[][2],
    632     WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
    633   WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
    634   WORD32 node = 0;
    635   UWORD32 data = 0;
    636 
    637   WORD32 esc_data[MAXBANDS][2] = {{0}};
    638   WORD32 esc_idx[MAXBANDS] = {0};
    639 
    640   if (!ixheaacd_mps_huff_read(
    641           it_bit_buff,
    642           (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, &node))
    643     return 0;
    644   data = -(node + 1);
    645 
    646   lav = 2 * data + 3;
    647 
    648   if (p0_data[0] != NULL) {
    649     if (!ixheaacd_mps_huff_read(
    650             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld,
    651             &node))
    652       return 0;
    653     *p0_data[0] = -(node + 1);
    654   }
    655   if (p0_data[1] != NULL) {
    656     if (!ixheaacd_mps_huff_read(
    657             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld,
    658             &node))
    659       return 0;
    660     *p0_data[1] = -(node + 1);
    661   }
    662 
    663   for (i = 0; i < num_val; i += ch_fac) {
    664     switch (lav) {
    665       case 3:
    666         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    667                                        (ia_huff_node_struct)&huff_nodes->lav3,
    668                                        out_data[i], &escape))
    669           return 0;
    670         break;
    671       case 5:
    672         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    673                                        (ia_huff_node_struct)&huff_nodes->lav5,
    674                                        out_data[i], &escape))
    675           return 0;
    676         break;
    677       case 7:
    678         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    679                                        (ia_huff_node_struct)&huff_nodes->lav7,
    680                                        out_data[i], &escape))
    681           return 0;
    682         break;
    683       case 9:
    684         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    685                                        (ia_huff_node_struct)&huff_nodes->lav9,
    686                                        out_data[i], &escape))
    687           return 0;
    688         break;
    689       default:
    690         break;
    691     }
    692 
    693     if (escape) {
    694       esc_idx[esc_contrl++] = i;
    695     } else {
    696       if (!ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i])) return 0;
    697     }
    698   }
    699 
    700   if (esc_contrl > 0) {
    701     if (!ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0,
    702                                  2 * esc_contrl, (2 * lav + 1)))
    703       return 0;
    704 
    705     for (i = 0; i < esc_contrl; i++) {
    706       out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
    707       out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
    708     }
    709   }
    710 
    711   return 1;
    712 }
    713 
    714 static WORD32 ixheaacd_mps_huff_dec_icc_2d(
    715     ia_handle_bit_buf_struct it_bit_buff,
    716     const ia_huff_icc_node_2d_struct* huff_nodes, WORD32 out_data[][2],
    717     WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
    718   WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
    719   WORD32 node = 0;
    720   UWORD32 data = 0;
    721 
    722   WORD32 esc_data[2][MAXBANDS] = {{0}};
    723   WORD32 esc_idx[MAXBANDS] = {0};
    724 
    725   if (!ixheaacd_mps_huff_read(
    726           it_bit_buff,
    727           (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, &node))
    728     return 0;
    729   data = -(node + 1);
    730 
    731   lav = 2 * data + 1;
    732 
    733   if (p0_data[0] != NULL) {
    734     if (!ixheaacd_mps_huff_read(
    735             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc,
    736             &node))
    737       return 0;
    738     *p0_data[0] = -(node + 1);
    739   }
    740   if (p0_data[1] != NULL) {
    741     if (!ixheaacd_mps_huff_read(
    742             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc,
    743             &node))
    744       return 0;
    745     *p0_data[1] = -(node + 1);
    746   }
    747 
    748   for (i = 0; i < num_val; i += ch_fac) {
    749     switch (lav) {
    750       case 1:
    751         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    752                                        (ia_huff_node_struct)&huff_nodes->lav1,
    753                                        out_data[i], &escape))
    754           return 0;
    755         break;
    756       case 3:
    757         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    758                                        (ia_huff_node_struct)&huff_nodes->lav3,
    759                                        out_data[i], &escape))
    760           return 0;
    761         break;
    762       case 5:
    763         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    764                                        (ia_huff_node_struct)&huff_nodes->lav5,
    765                                        out_data[i], &escape))
    766           return 0;
    767         break;
    768       case 7:
    769         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    770                                        (ia_huff_node_struct)&huff_nodes->lav7,
    771                                        out_data[i], &escape))
    772           return 0;
    773         break;
    774     }
    775 
    776     if (escape) {
    777       esc_idx[esc_contrl++] = i;
    778     } else {
    779       if (!ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i])) return 0;
    780     }
    781   }
    782 
    783   if (esc_contrl > 0) {
    784     if (!ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0,
    785                                  2 * esc_contrl, (2 * lav + 1)))
    786       return 0;
    787 
    788     for (i = 0; i < esc_contrl; i++) {
    789       out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
    790       out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
    791     }
    792   }
    793 
    794   return 1;
    795 }
    796 
    797 static WORD32 ixheaacd_mps_huff_dec_ipd_2d(
    798     ia_handle_bit_buf_struct it_bit_buff,
    799     const ia_huff_ipd_node_2d_struct* huff_nodes, WORD32 out_data[][2],
    800     WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) {
    801   WORD32 i = 0, lav = 0, escape = 0, esc_contrl = 0;
    802   WORD32 node = 0;
    803   UWORD32 data = 0;
    804 
    805   WORD32 esc_data[2][MAXBANDS] = {{0}};
    806   WORD32 esc_idx[MAXBANDS] = {0};
    807 
    808   if (!ixheaacd_mps_huff_read(
    809           it_bit_buff,
    810           (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, &node))
    811     return 0;
    812 
    813   data = -(node + 1);
    814   if (data == 0)
    815     data = 3;
    816   else
    817     data--;
    818 
    819   lav = 2 * data + 1;
    820 
    821   if (p0_data[0] != NULL) {
    822     if (!ixheaacd_mps_huff_read(
    823             it_bit_buff,
    824             (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, &node))
    825       return 0;
    826     *p0_data[0] = -(node + 1);
    827   }
    828   if (p0_data[1] != NULL) {
    829     if (!ixheaacd_mps_huff_read(
    830             it_bit_buff,
    831             (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, &node))
    832       return 0;
    833     *p0_data[1] = -(node + 1);
    834   }
    835 
    836   for (i = 0; i < num_val; i += ch_fac) {
    837     switch (lav) {
    838       case 1:
    839         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    840                                        (ia_huff_node_struct)&huff_nodes->lav1,
    841                                        out_data[i], &escape))
    842           return 0;
    843         break;
    844       case 3:
    845         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    846                                        (ia_huff_node_struct)&huff_nodes->lav3,
    847                                        out_data[i], &escape))
    848           return 0;
    849         break;
    850       case 5:
    851         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    852                                        (ia_huff_node_struct)&huff_nodes->lav5,
    853                                        out_data[i], &escape))
    854           return 0;
    855         break;
    856       case 7:
    857         if (!ixheaacd_mps_huff_read_2d(it_bit_buff,
    858                                        (ia_huff_node_struct)&huff_nodes->lav7,
    859                                        out_data[i], &escape))
    860           return 0;
    861         break;
    862     }
    863 
    864     if (escape) {
    865       esc_idx[esc_contrl++] = i;
    866     } else {
    867       if (!ixheaacd_mps_sym_restoreipd(it_bit_buff, lav, out_data[i])) return 0;
    868     }
    869   }
    870 
    871   if (esc_contrl > 0) {
    872     if (!ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0,
    873                                  2 * esc_contrl, (2 * lav + 1)))
    874       return 0;
    875 
    876     for (i = 0; i < esc_contrl; i++) {
    877       out_data[esc_idx[i]][0] = esc_data[0][i] - lav;
    878       out_data[esc_idx[i]][1] = esc_data[1][i] - lav;
    879     }
    880   }
    881 
    882   return 1;
    883 }
    884 
    885 static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff,
    886                                    WORD32* out_data_1, WORD32* out_data_2,
    887                                    WORD32 data_type, WORD32 diff_type_1,
    888                                    WORD32 diff_type_2, WORD32 pilot_coding_flag,
    889                                    WORD32* pilot_data, WORD32 num_val,
    890                                    WORD32* cdg_scheme) {
    891   WORD32 diff_type;
    892 
    893   WORD32 i = 0;
    894   UWORD32 data = 0;
    895 
    896   WORD32 pair_vec[MAXBANDS][2];
    897 
    898   WORD32* p0_data_1[2] = {NULL, NULL};
    899   WORD32* p0_data_2[2] = {NULL, NULL};
    900 
    901   WORD32 p0_flag[2];
    902 
    903   WORD32 num_val_1_int = num_val;
    904   WORD32 num_val_2_int = num_val;
    905 
    906   WORD32* out_data_1_int = out_data_1;
    907   WORD32* out_data_2_int = out_data_2;
    908 
    909   WORD32 df_rest_flag_1 = 0;
    910   WORD32 df_rest_flag_2 = 0;
    911 
    912   WORD32 huff_yy_1;
    913   WORD32 huff_yy_2;
    914   WORD32 huff_yy;
    915 
    916   if (pilot_coding_flag) {
    917     switch (data_type) {
    918       case CLD:
    919         if (out_data_1 != NULL) {
    920           if (!ixheaacd_mps_huff_dec_pilot(
    921                   it_bit_buff,
    922                   (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.cld,
    923                   pilot_data))
    924             return 0;
    925         }
    926         break;
    927 
    928       case ICC:
    929         if (out_data_1 != NULL) {
    930           if (!ixheaacd_mps_huff_dec_pilot(
    931                   it_bit_buff,
    932                   (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.icc,
    933                   pilot_data))
    934             return 0;
    935         }
    936         break;
    937 
    938       default:
    939         if (out_data_1 != NULL) {
    940           return 0;
    941         }
    942         break;
    943     }
    944   }
    945 
    946   data = ixheaacd_read_bits_buf(it_bit_buff, 1);
    947   *cdg_scheme = data << PAIR_SHIFT;
    948 
    949   if (*cdg_scheme >> PAIR_SHIFT == HUFF_2D) {
    950     if ((out_data_1 != NULL) && (out_data_2 != NULL)) {
    951       data = ixheaacd_read_bits_buf(it_bit_buff, 1);
    952       *cdg_scheme |= data;
    953     } else {
    954       *cdg_scheme |= FREQ_PAIR;
    955     }
    956   }
    957 
    958   if (pilot_coding_flag) {
    959     huff_yy_1 = PCM_PLT;
    960     huff_yy_2 = PCM_PLT;
    961   } else {
    962     huff_yy_1 = diff_type_1;
    963     huff_yy_2 = diff_type_2;
    964   }
    965 
    966   switch (*cdg_scheme >> PAIR_SHIFT) {
    967     case HUFF_1D:
    968 
    969       p0_flag[0] = (diff_type_1 == DIFF_FREQ) && !pilot_coding_flag;
    970       p0_flag[1] = (diff_type_2 == DIFF_FREQ) && !pilot_coding_flag;
    971 
    972       switch (data_type) {
    973         case CLD:
    974           if (out_data_1 != NULL) {
    975             if (!ixheaacd_mps_huff_dec_cld_1d(
    976                     it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1],
    977                     out_data_1, num_val_1_int, p0_flag[0]))
    978               return 0;
    979           }
    980           if (out_data_2 != NULL) {
    981             if (!ixheaacd_mps_huff_dec_cld_1d(
    982                     it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2],
    983                     out_data_2, num_val_2_int, p0_flag[1]))
    984               return 0;
    985           }
    986 
    987           break;
    988 
    989         case ICC:
    990           if (out_data_1 != NULL) {
    991             if (!ixheaacd_mps_huff_dec_icc_1d(
    992                     it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1],
    993                     out_data_1, num_val_1_int, p0_flag[0]))
    994               return 0;
    995           }
    996           if (out_data_2 != NULL) {
    997             if (!ixheaacd_mps_huff_dec_icc_1d(
    998                     it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2],
    999                     out_data_2, num_val_2_int, p0_flag[1]))
   1000               return 0;
   1001           }
   1002 
   1003           break;
   1004 
   1005         case IPD:
   1006           if (out_data_1 != NULL) {
   1007             if (!ixheaacd_mps_huff_dec_ipd_1d(
   1008                     it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1],
   1009                     out_data_1, num_val_1_int, p0_flag[0]))
   1010               return 0;
   1011           }
   1012           if (out_data_2 != NULL) {
   1013             if (!ixheaacd_mps_huff_dec_ipd_1d(
   1014                     it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2],
   1015                     out_data_2, num_val_2_int, p0_flag[1]))
   1016               return 0;
   1017           }
   1018 
   1019           break;
   1020 
   1021         default:
   1022           break;
   1023       }
   1024 
   1025       break;
   1026 
   1027     case HUFF_2D:
   1028 
   1029       switch (*cdg_scheme & PAIR_MASK) {
   1030         case FREQ_PAIR:
   1031 
   1032           if (out_data_1 != NULL) {
   1033             if (!pilot_coding_flag && diff_type_1 == DIFF_FREQ) {
   1034               p0_data_1[0] = &out_data_1[0];
   1035               p0_data_1[1] = NULL;
   1036 
   1037               num_val_1_int -= 1;
   1038               out_data_1_int += 1;
   1039             }
   1040             df_rest_flag_1 = num_val_1_int % 2;
   1041             if (df_rest_flag_1) num_val_1_int -= 1;
   1042           }
   1043           if (out_data_2 != NULL) {
   1044             if (!pilot_coding_flag && diff_type_2 == DIFF_FREQ) {
   1045               p0_data_2[0] = NULL;
   1046               p0_data_2[1] = &out_data_2[0];
   1047 
   1048               num_val_2_int -= 1;
   1049               out_data_2_int += 1;
   1050             }
   1051             df_rest_flag_2 = num_val_2_int % 2;
   1052             if (df_rest_flag_2) num_val_2_int -= 1;
   1053           }
   1054 
   1055           switch (data_type) {
   1056             case CLD:
   1057 
   1058               if (out_data_1 != NULL) {
   1059                 if (!ixheaacd_mps_huff_dec_cld_2d(
   1060                         it_bit_buff,
   1061                         &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_1][FREQ_PAIR],
   1062                         pair_vec, num_val_1_int, 2, p0_data_1))
   1063                   return 0;
   1064                 if (df_rest_flag_1) {
   1065                   if (!ixheaacd_mps_huff_dec_cld_1d(
   1066                           it_bit_buff,
   1067                           &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1],
   1068                           out_data_1_int + num_val_1_int, 1, 0))
   1069                     return 0;
   1070                 }
   1071               }
   1072               if (out_data_2 != NULL) {
   1073                 if (!ixheaacd_mps_huff_dec_cld_2d(
   1074                         it_bit_buff,
   1075                         &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_2][FREQ_PAIR],
   1076                         pair_vec + 1, num_val_2_int, 2, p0_data_2))
   1077                   return 0;
   1078                 if (df_rest_flag_2) {
   1079                   if (!ixheaacd_mps_huff_dec_cld_1d(
   1080                           it_bit_buff,
   1081                           &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2],
   1082                           out_data_2_int + num_val_2_int, 1, 0))
   1083                     return 0;
   1084                 }
   1085               }
   1086               break;
   1087 
   1088             case ICC:
   1089               if (out_data_1 != NULL) {
   1090                 if (!ixheaacd_mps_huff_dec_icc_2d(
   1091                         it_bit_buff,
   1092                         &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_1][FREQ_PAIR],
   1093                         pair_vec, num_val_1_int, 2, p0_data_1))
   1094                   return 0;
   1095                 if (df_rest_flag_1) {
   1096                   if (!ixheaacd_mps_huff_dec_icc_1d(
   1097                           it_bit_buff,
   1098                           &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1],
   1099                           out_data_1_int + num_val_1_int, 1, 0))
   1100                     return 0;
   1101                 }
   1102               }
   1103               if (out_data_2 != NULL) {
   1104                 if (!ixheaacd_mps_huff_dec_icc_2d(
   1105                         it_bit_buff,
   1106                         &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_2][FREQ_PAIR],
   1107                         pair_vec + 1, num_val_2_int, 2, p0_data_2))
   1108                   return 0;
   1109                 if (df_rest_flag_2) {
   1110                   if (!ixheaacd_mps_huff_dec_icc_1d(
   1111                           it_bit_buff,
   1112                           &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2],
   1113                           out_data_2_int + num_val_2_int, 1, 0))
   1114                     return 0;
   1115                 }
   1116               }
   1117               break;
   1118 
   1119             case IPD:
   1120               if (out_data_1 != NULL) {
   1121                 if (!ixheaacd_mps_huff_dec_ipd_2d(
   1122                         it_bit_buff,
   1123                         &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_1][FREQ_PAIR],
   1124                         pair_vec, num_val_1_int, 2, p0_data_1))
   1125                   return 0;
   1126                 if (df_rest_flag_1) {
   1127                   if (!ixheaacd_mps_huff_dec_ipd_1d(
   1128                           it_bit_buff,
   1129                           &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1],
   1130                           out_data_1_int + num_val_1_int, 1, 0))
   1131                     return 0;
   1132                 }
   1133               }
   1134               if (out_data_2 != NULL) {
   1135                 if (!ixheaacd_mps_huff_dec_ipd_2d(
   1136                         it_bit_buff,
   1137                         &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_2][FREQ_PAIR],
   1138                         pair_vec + 1, num_val_2_int, 2, p0_data_2))
   1139                   return 0;
   1140                 if (df_rest_flag_2) {
   1141                   if (!ixheaacd_mps_huff_dec_ipd_1d(
   1142                           it_bit_buff,
   1143                           &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2],
   1144                           out_data_2_int + num_val_2_int, 1, 0))
   1145                     return 0;
   1146                 }
   1147               }
   1148               break;
   1149 
   1150             default:
   1151               break;
   1152           }
   1153 
   1154           if (out_data_1 != NULL) {
   1155             for (i = 0; i < num_val_1_int - 1; i += 2) {
   1156               out_data_1_int[i] = pair_vec[i][0];
   1157               out_data_1_int[i + 1] = pair_vec[i][1];
   1158             }
   1159           }
   1160           if (out_data_2 != NULL) {
   1161             for (i = 0; i < num_val_2_int - 1; i += 2) {
   1162               out_data_2_int[i] = pair_vec[i + 1][0];
   1163               out_data_2_int[i + 1] = pair_vec[i + 1][1];
   1164             }
   1165           }
   1166 
   1167           break;
   1168 
   1169         case TIME_PAIR:
   1170 
   1171           if (!pilot_coding_flag &&
   1172               ((diff_type_1 == DIFF_FREQ) || (diff_type_2 == DIFF_FREQ))) {
   1173             p0_data_1[0] = &out_data_1[0];
   1174             p0_data_1[1] = &out_data_2[0];
   1175 
   1176             out_data_1_int += 1;
   1177             out_data_2_int += 1;
   1178 
   1179             num_val_1_int -= 1;
   1180           }
   1181 
   1182           if ((diff_type_1 == DIFF_TIME) || (diff_type_2 == DIFF_TIME)) {
   1183             diff_type = DIFF_TIME;
   1184           } else {
   1185             diff_type = DIFF_FREQ;
   1186           }
   1187           if (pilot_coding_flag) {
   1188             huff_yy = PCM_PLT;
   1189           } else {
   1190             huff_yy = diff_type;
   1191           }
   1192 
   1193           switch (data_type) {
   1194             case CLD:
   1195               if (!ixheaacd_mps_huff_dec_cld_2d(
   1196                       it_bit_buff,
   1197                       &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy][TIME_PAIR],
   1198                       pair_vec, num_val_1_int, 1, p0_data_1))
   1199                 return 0;
   1200               break;
   1201 
   1202             case ICC:
   1203               if (!ixheaacd_mps_huff_dec_icc_2d(
   1204                       it_bit_buff,
   1205                       &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy][TIME_PAIR],
   1206                       pair_vec, num_val_1_int, 1, p0_data_1))
   1207                 return 0;
   1208               break;
   1209 
   1210             case IPD:
   1211               if (!ixheaacd_mps_huff_dec_ipd_2d(
   1212                       it_bit_buff,
   1213                       &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy][TIME_PAIR],
   1214                       pair_vec, num_val_1_int, 1, p0_data_1))
   1215                 return 0;
   1216               break;
   1217 
   1218             default:
   1219               break;
   1220           }
   1221 
   1222           for (i = 0; i < num_val_1_int; i++) {
   1223             out_data_1_int[i] = pair_vec[i][0];
   1224             out_data_2_int[i] = pair_vec[i][1];
   1225           }
   1226 
   1227           break;
   1228 
   1229         default:
   1230           break;
   1231       }
   1232 
   1233       break;
   1234 
   1235     default:
   1236       break;
   1237   }
   1238 
   1239   return 1;
   1240 }
   1241 
   1242 static VOID ixheaacd_diff_freq_decode(WORD32* diff_data, WORD32* out_data,
   1243                                       WORD32 num_val) {
   1244   WORD32 i = 0;
   1245 
   1246   out_data[0] = diff_data[0];
   1247 
   1248   for (i = 1; i < num_val; i++) {
   1249     out_data[i] = out_data[i - 1] + diff_data[i];
   1250   }
   1251 }
   1252 
   1253 static VOID ixheaacd_mps_diff_time_dec_bwd(WORD32* prev_data, WORD32* diff_data,
   1254                                            WORD32* out_data,
   1255                                            WORD32 mixed_diff_type,
   1256                                            WORD32 num_val) {
   1257   WORD32 i = 0;
   1258 
   1259   if (mixed_diff_type) {
   1260     out_data[0] = diff_data[0];
   1261     for (i = 1; i < num_val; i++) {
   1262       out_data[i] = prev_data[i] + diff_data[i];
   1263     }
   1264   } else {
   1265     for (i = 0; i < num_val; i++) {
   1266       out_data[i] = prev_data[i] + diff_data[i];
   1267     }
   1268   }
   1269 }
   1270 
   1271 static VOID ixheaacd_mps_diff_time_dec_fwd(WORD32* prev_data, WORD32* diff_data,
   1272                                            WORD32* out_data,
   1273                                            WORD32 mixed_diff_type,
   1274                                            WORD32 num_val) {
   1275   WORD32 i = 0;
   1276 
   1277   if (mixed_diff_type) {
   1278     out_data[0] = diff_data[0];
   1279     for (i = 1; i < num_val; i++) {
   1280       out_data[i] = prev_data[i] - diff_data[i];
   1281     }
   1282   } else {
   1283     for (i = 0; i < num_val; i++) {
   1284       out_data[i] = prev_data[i] - diff_data[i];
   1285     }
   1286   }
   1287 }
   1288 
   1289 static WORD32 ixheaacd_attach_lsb(ia_handle_bit_buf_struct it_bit_buff,
   1290                                   WORD32* in_data_msb,
   1291                                   WORD32 ixheaacd_drc_offset, WORD32 num_lsb,
   1292                                   WORD32 num_val, WORD32* out_data) {
   1293   WORD32 i = 0, lsb = 0, msb = 0;
   1294   UWORD32 data = 0;
   1295 
   1296   for (i = 0; i < num_val; i++) {
   1297     msb = in_data_msb[i];
   1298 
   1299     if (num_lsb > 0) {
   1300       data = ixheaacd_read_bits_buf(it_bit_buff, num_lsb);
   1301       lsb = data;
   1302 
   1303       out_data[i] = ((msb << num_lsb) | lsb) - ixheaacd_drc_offset;
   1304     } else
   1305       out_data[i] = msb - ixheaacd_drc_offset;
   1306   }
   1307 
   1308   return 0;
   1309 }
   1310 
   1311 WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff,
   1312                                   WORD32 outdata[][MAXBANDS],
   1313                                   WORD32 history[MAXBANDS], WORD32 data_type,
   1314                                   WORD32 set_idx, WORD32 data_bands,
   1315                                   WORD32 pair_flag, WORD32 coarse_flag,
   1316                                   WORD32 independency_flag)
   1317 
   1318 {
   1319   WORD32 diff_time_back_flag = !independency_flag || (set_idx > 0);
   1320   WORD32 attach_lsb_flag = 0;
   1321   WORD32 pcm_coding_flag = 0;
   1322   WORD32 pilot_coding_flag = 0;
   1323   WORD32 pilot_data[2] = {0, 0};
   1324   WORD32 mixed_time_pair = 0, pcm_val = 0;
   1325   WORD32 quant_levels = 0, quant_offset = 0;
   1326   UWORD32 data = 0;
   1327   WORD32 band_start = 0;
   1328 
   1329   WORD32 data_pair[2][MAXBANDS] = {{0}};
   1330   WORD32 data_diff[2][MAXBANDS] = {{0}};
   1331 
   1332   WORD32 msb_state[MAXBANDS] = {0};
   1333 
   1334   WORD32* data_array[2] = {NULL, NULL};
   1335 
   1336   WORD32 diff_type[2] = {DIFF_FREQ, DIFF_FREQ};
   1337   WORD32 cdg_scheme = HUFF_1D;
   1338   WORD32 direction = BACKWARDS;
   1339 
   1340   switch (data_type) {
   1341     case CLD:
   1342       if (coarse_flag) {
   1343         attach_lsb_flag = 0;
   1344         quant_levels = 15;
   1345         quant_offset = 7;
   1346       } else {
   1347         attach_lsb_flag = 0;
   1348         quant_levels = 31;
   1349         quant_offset = 15;
   1350       }
   1351 
   1352       break;
   1353 
   1354     case ICC:
   1355       if (coarse_flag) {
   1356         attach_lsb_flag = 0;
   1357         quant_levels = 4;
   1358         quant_offset = 0;
   1359       } else {
   1360         attach_lsb_flag = 0;
   1361         quant_levels = 8;
   1362         quant_offset = 0;
   1363       }
   1364 
   1365       break;
   1366 
   1367     case IPD:
   1368       if (coarse_flag) {
   1369         attach_lsb_flag = 0;
   1370         quant_levels = 8;
   1371         quant_offset = 0;
   1372       } else {
   1373         attach_lsb_flag = 1;
   1374         quant_levels = 16;
   1375         quant_offset = 0;
   1376       }
   1377       break;
   1378 
   1379     default:
   1380       fprintf(stderr, "Unknown type of data!\n");
   1381       return 0;
   1382   }
   1383 
   1384   data = ixheaacd_read_bits_buf(it_bit_buff, 1);
   1385   pcm_coding_flag = data;
   1386 
   1387   pilot_coding_flag = 0;
   1388 
   1389   if (pcm_coding_flag && !pilot_coding_flag) {
   1390     if (pair_flag) {
   1391       data_array[0] = data_pair[0];
   1392       data_array[1] = data_pair[1];
   1393       pcm_val = 2 * data_bands;
   1394     } else {
   1395       data_array[0] = data_pair[0];
   1396       data_array[1] = NULL;
   1397       pcm_val = data_bands;
   1398     }
   1399 
   1400     if (!ixheaacd_mps_pcm_decode(it_bit_buff, data_array[0], data_array[1],
   1401                                  quant_offset, pcm_val, quant_levels))
   1402       return 0;
   1403 
   1404   } else {
   1405     if (pair_flag) {
   1406       data_array[0] = data_diff[0];
   1407       data_array[1] = data_diff[1];
   1408     } else {
   1409       data_array[0] = data_diff[0];
   1410       data_array[1] = NULL;
   1411     }
   1412 
   1413     diff_type[0] = DIFF_FREQ;
   1414     diff_type[1] = DIFF_FREQ;
   1415 
   1416     direction = BACKWARDS;
   1417 
   1418     if (!pilot_coding_flag) {
   1419       if (pair_flag || diff_time_back_flag) {
   1420         data = ixheaacd_read_bits_buf(it_bit_buff, 1);
   1421         diff_type[0] = data;
   1422       }
   1423 
   1424       if (pair_flag && ((diff_type[0] == DIFF_FREQ) || diff_time_back_flag)) {
   1425         data = ixheaacd_read_bits_buf(it_bit_buff, 1);
   1426         diff_type[1] = data;
   1427       }
   1428     }
   1429 
   1430     if (data_bands <= 0) return -1;
   1431 
   1432     if (!ixheaacd_huff_decode(it_bit_buff, data_array[0], data_array[1],
   1433                               data_type, diff_type[0], diff_type[1],
   1434                               pilot_coding_flag, pilot_data, data_bands,
   1435                               &cdg_scheme)) {
   1436       return 0;
   1437     }
   1438 
   1439     if ((diff_type[0] == DIFF_TIME) || (diff_type[1] == DIFF_TIME)) {
   1440       if (pair_flag) {
   1441         if ((diff_type[0] == DIFF_TIME) && !diff_time_back_flag) {
   1442           direction = FORWARDS;
   1443         } else if (diff_type[1] == DIFF_TIME) {
   1444           direction = BACKWARDS;
   1445         } else {
   1446           data = ixheaacd_read_bits_buf(it_bit_buff, 1);
   1447           direction = data;
   1448         }
   1449       } else {
   1450         direction = BACKWARDS;
   1451       }
   1452     }
   1453 
   1454     mixed_time_pair = (diff_type[0] != diff_type[1]) &&
   1455                       ((cdg_scheme & PAIR_MASK) == TIME_PAIR);
   1456 
   1457     if (direction == BACKWARDS) {
   1458       if (diff_type[0] == DIFF_FREQ) {
   1459         ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
   1460       } else {
   1461         WORD32 i;
   1462         for (i = 0; i < data_bands; i++) {
   1463           msb_state[i] = history[i + band_start] + quant_offset;
   1464           if (attach_lsb_flag) {
   1465             msb_state[i] >>= 1;
   1466           }
   1467         }
   1468         ixheaacd_mps_diff_time_dec_bwd(msb_state, data_diff[0], data_pair[0],
   1469                                        mixed_time_pair, data_bands);
   1470       }
   1471       if (diff_type[1] == DIFF_FREQ) {
   1472         ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
   1473       } else {
   1474         ixheaacd_mps_diff_time_dec_bwd(data_pair[0], data_diff[1], data_pair[1],
   1475                                        mixed_time_pair, data_bands);
   1476       }
   1477     } else {
   1478       ixheaacd_diff_freq_decode(data_diff[1], data_pair[1], data_bands);
   1479 
   1480       if (diff_type[0] == DIFF_FREQ) {
   1481         ixheaacd_diff_freq_decode(data_diff[0], data_pair[0], data_bands);
   1482       } else {
   1483         ixheaacd_mps_diff_time_dec_fwd(data_pair[1], data_diff[0], data_pair[0],
   1484                                        mixed_time_pair, data_bands);
   1485       }
   1486     }
   1487 
   1488     ixheaacd_attach_lsb(it_bit_buff, data_pair[0], quant_offset,
   1489                         attach_lsb_flag ? 1 : 0, data_bands, data_pair[0]);
   1490     if (pair_flag) {
   1491       ixheaacd_attach_lsb(it_bit_buff, data_pair[1], quant_offset,
   1492                           attach_lsb_flag ? 1 : 0, data_bands, data_pair[1]);
   1493     }
   1494   }
   1495 
   1496   memcpy(outdata[set_idx] + band_start, data_pair[0],
   1497          sizeof(WORD32) * data_bands);
   1498   if (pair_flag) {
   1499     memcpy(outdata[set_idx + 1] + band_start, data_pair[1],
   1500            sizeof(WORD32) * data_bands);
   1501   }
   1502 
   1503   return 1;
   1504 }
   1505 
   1506 WORD32 ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct it_bit_buff,
   1507                                 WORD32* out_data, WORD32 num_val) {
   1508   WORD32 val_rcvd = 0, dummy = 0, i = 0, val = 0, len = 0;
   1509   WORD32 rl_data[2] = {0};
   1510 
   1511   while (val_rcvd < num_val) {
   1512     if (!ixheaacd_mps_huff_read_2d(
   1513             it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_reshape_nodes,
   1514             rl_data, &dummy))
   1515       return 0;
   1516     val = rl_data[0];
   1517     len = rl_data[1] + 1;
   1518     for (i = val_rcvd; i < val_rcvd + len; i++) {
   1519       out_data[i] = val;
   1520     }
   1521     val_rcvd += len;
   1522   }
   1523 
   1524   return 1;
   1525 }
   1526