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