Coverage Report

Created: 2026-03-31 06:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/encoder/ixheaace_mps_nlc_enc.c
Line
Count
Source
1
/******************************************************************************
2
 *                                                                            *
3
 * Copyright (C) 2023 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
21
#include <string.h>
22
#include <stdlib.h>
23
#include <math.h>
24
#include "ixheaac_type_def.h"
25
#include "ixheaac_error_standards.h"
26
#include "ixheaace_error_codes.h"
27
#include "ixheaace_mps_common_fix.h"
28
#include "ixheaace_mps_defines.h"
29
#include "ixheaace_mps_common_define.h"
30
#include "ixheaace_bitbuffer.h"
31
#include "ixheaace_mps_nlc_enc.h"
32
#include "ixheaace_mps_huff_tab.h"
33
#include "ixheaace_mps_param_extract.h"
34
#include "ixheaace_mps_sac_nlc_enc.h"
35
#include "ixheaace_mps_bitstream.h"
36
#include "ixheaace_mps_struct_def.h"
37
#include "ixheaace_mps_sac_polyphase.h"
38
#include "ixheaace_mps_sac_nlc_enc.h"
39
#include "ixheaace_mps_sac_hybfilter.h"
40
#include "ixheaace_mps_spatial_bitstream.h"
41
#include "ixheaace_mps_tree.h"
42
#include "ixheaace_mps_rom.h"
43
#include "ixheaace_common_utils.h"
44
#include "ixheaac_constants.h"
45
#include "ixheaac_basic_ops32.h"
46
#include "ixheaac_basic_ops40.h"
47
#include "ixheaac_basic_ops.h"
48
49
static UWORD8 ixheaace_mps_212_sym_check(WORD16 data[2], const WORD16 lav,
50
1.09M
                                         WORD16 *const p_sym_bits) {
51
1.09M
  UWORD8 sym_bits = 0;
52
1.09M
  UWORD8 num_sbits = 0;
53
1.09M
  WORD16 sum_val = data[0] + data[1];
54
1.09M
  WORD16 diff_val = data[0] - data[1];
55
56
1.09M
  if (sum_val != 0) {
57
475k
    WORD8 sum_neg = (sum_val < 0) ? 1 : 0;
58
475k
    if (sum_neg) {
59
230k
      sum_val = -sum_val;
60
230k
      diff_val = -diff_val;
61
230k
    }
62
475k
    sym_bits = (sym_bits << 1) | sum_neg;
63
475k
    num_sbits++;
64
475k
  }
65
66
1.09M
  if (diff_val != 0) {
67
408k
    WORD8 diff_neg = (diff_val < 0) ? 1 : 0;
68
408k
    if (diff_neg) {
69
203k
      diff_val = -diff_val;
70
203k
    }
71
408k
    sym_bits = (sym_bits << 1) | diff_neg;
72
408k
    num_sbits++;
73
408k
  }
74
1.09M
  *p_sym_bits = sym_bits;
75
76
1.09M
  if (!(sum_val % 2)) {
77
806k
    data[0] = (sum_val / 2);
78
806k
    data[1] = (diff_val / 2);
79
806k
  } else {
80
287k
    data[0] = (lav - sum_val / 2);
81
287k
    data[1] = (lav - diff_val / 2);
82
287k
  }
83
84
1.09M
  return num_sbits;
85
1.09M
}
86
87
42.2k
static WORD16 ixheaace_mps_212_calc_pcm_bits(const WORD16 num_val, const WORD16 n_levels) {
88
42.2k
  WORD16 num_complete_chunks = 0, rest_chunk_size = 0;
89
42.2k
  WORD16 max_grp_len = 0, bits_pcm = 0;
90
42.2k
  WORD32 chunk_levels, lvl;
91
92
42.2k
  switch (n_levels) {
93
0
    case 7:
94
0
      max_grp_len = 6;
95
0
      break;
96
0
    case 3:
97
0
    case 6:
98
0
      max_grp_len = 5;
99
0
      break;
100
0
    case 13:
101
3
    case 19:
102
3
    case 51:
103
3
      max_grp_len = 4;
104
3
      break;
105
0
    case 25:
106
0
      max_grp_len = 3;
107
0
      break;
108
1
    case 11:
109
1
      max_grp_len = 2;
110
1
      break;
111
42.2k
    default:
112
42.2k
      max_grp_len = 1;
113
42.2k
  }
114
115
42.2k
  num_complete_chunks = num_val / max_grp_len;
116
42.2k
  rest_chunk_size = num_val % max_grp_len;
117
118
42.2k
  chunk_levels = 1;
119
84.5k
  for (lvl = 1; lvl <= max_grp_len; lvl++) {
120
42.2k
    chunk_levels *= n_levels;
121
42.2k
  }
122
42.2k
  bits_pcm = (WORD16)(round(log(chunk_levels) / log(2)) * num_complete_chunks);
123
42.2k
  bits_pcm += (WORD16)(round(log(chunk_levels) / log(2)) * rest_chunk_size);
124
125
42.2k
  return bits_pcm;
126
42.2k
}
127
128
static VOID ixheaace_mps_212_apply_pcm_coding(ixheaace_bit_buf_handle pstr_bit_buf,
129
                                              const WORD16 *const in_data_1,
130
                                              const WORD16 *const in_data_2, const WORD16 offset,
131
4.63k
                                              const WORD16 num_val, const WORD16 n_levels) {
132
4.63k
  WORD16 val = 0, lvl = 0, idx = 0;
133
4.63k
  WORD16 max_grp_len = 0, grp_len = 0, next_val = 0;
134
4.63k
  WORD32 grp_val = 0, chunk_levels = 0;
135
4.63k
  UWORD8 pcm_block_size[7] = {0};
136
137
4.63k
  switch (n_levels) {
138
0
    case 7:
139
0
      max_grp_len = 6;
140
0
      break;
141
0
    case 3:
142
0
    case 6:
143
0
    case 9:
144
0
      max_grp_len = 5;
145
0
      break;
146
0
    case 13:
147
3
    case 19:
148
3
    case 51:
149
3
      max_grp_len = 4;
150
3
      break;
151
0
    case 5:
152
0
    case 25:
153
0
      max_grp_len = 3;
154
0
      break;
155
1
    case 11:
156
1
      max_grp_len = 2;
157
1
      break;
158
4.62k
    default:
159
4.62k
      max_grp_len = 1;
160
4.63k
  }
161
162
4.63k
  chunk_levels = 1;
163
9.27k
  for (lvl = 1; lvl <= max_grp_len; lvl++) {
164
4.64k
    chunk_levels *= n_levels;
165
4.64k
    pcm_block_size[lvl] = (UWORD8)round(log(chunk_levels) / log(2));
166
4.64k
  }
167
168
106k
  for (val = 0; val < num_val; val += max_grp_len) {
169
102k
    grp_len = MIN(max_grp_len, num_val - val);
170
102k
    grp_val = 0;
171
204k
    for (lvl = 0; lvl < grp_len; lvl++) {
172
102k
      idx = val + lvl;
173
102k
      next_val = (in_data_2 == NULL)
174
102k
                     ? in_data_1[idx]
175
102k
                     : (in_data_1 == NULL)
176
2.25k
                           ? in_data_2[idx]
177
2.25k
                           : ((idx & 01) ? in_data_2[idx >> 1] : in_data_1[idx >> 1]);
178
102k
      grp_val = grp_val * n_levels + next_val + offset;
179
102k
    }
180
102k
    ixheaace_write_bits(pstr_bit_buf, grp_val, pcm_block_size[grp_len]);
181
102k
  }
182
4.63k
}
183
184
static IA_ERRORCODE ixheaace_mps_212_huff_enc_1_d(ixheaace_bit_buf_handle pstr_bit_buf,
185
                                                  const WORD32 data_type, const WORD32 dim_1,
186
                                                  WORD16 *const in_data, const WORD16 num_bands,
187
                                                  const WORD16 part_0_flag,
188
136k
                                                  UWORD16 *huff_code_bits) {
189
136k
  WORD32 band, offset = 0;
190
136k
  UWORD16 huff_bits = 0;
191
136k
  ixheaace_mps_huff_entry part0;
192
136k
  const ixheaace_mps_huff_entry *p_huff_tab = NULL;
193
194
136k
  *huff_code_bits = 0;
195
136k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
196
66.0k
    p_huff_tab = ixheaace_mps_212_huff_icc_tab.h1_d[dim_1];
197
70.0k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
198
70.0k
    p_huff_tab = ixheaace_mps_212_huff_cld_tab.h1_d[dim_1];
199
70.0k
  } else {
200
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
201
0
  }
202
203
136k
  if (part_0_flag) {
204
55.6k
    if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
205
23.6k
      part0 = ixheaace_mps_212_huff_part_0_tab.icc[in_data[0]];
206
31.9k
    } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
207
31.9k
      part0 = ixheaace_mps_212_huff_part_0_tab.cld[in_data[0]];
208
31.9k
    } else {
209
0
      return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
210
0
    }
211
55.6k
    huff_bits += ixheaace_write_bits(pstr_bit_buf, part0.value, part0.length);
212
55.6k
    offset = 1;
213
55.6k
  }
214
215
2.31M
  for (band = offset; band < num_bands; band++) {
216
2.18M
    WORD32 id_sign = 0;
217
2.18M
    WORD32 id = in_data[band];
218
219
2.18M
    if (id != 0) {
220
819k
      id_sign = 0;
221
819k
      if (id < 0) {
222
401k
        id = -id;
223
401k
        id_sign = 1;
224
401k
      }
225
819k
    }
226
227
2.18M
    huff_bits += ixheaace_write_bits(pstr_bit_buf, p_huff_tab[id].value, p_huff_tab[id].length);
228
229
2.18M
    if (id != 0) {
230
819k
      huff_bits += ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
231
819k
    }
232
2.18M
  }
233
234
136k
  *huff_code_bits = huff_bits;
235
136k
  return IA_NO_ERROR;
236
136k
}
237
238
static VOID ixheaace_mps_212_get_huff_entry(const WORD32 lav, const WORD32 data_type,
239
                                            const WORD32 band, WORD16 tab_idx_2_d[2],
240
                                            WORD16 in_data[][2],
241
                                            ixheaace_mps_huff_entry *const pstr_huff_entry,
242
1.09M
                                            ixheaace_mps_huff_entry *const pstr_huff_escape) {
243
1.09M
  const ixheaace_mps_huff_cld_tab_2d *pstr_huff_cld_tab_2d =
244
1.09M
      &ixheaace_mps_212_huff_cld_tab.h2_d[tab_idx_2_d[0]][tab_idx_2_d[1]];
245
1.09M
  const ixheaace_mps_huff_icc_tab_2d *pstr_huff_icc_tab_2d =
246
1.09M
      &ixheaace_mps_212_huff_icc_tab.h2_d[tab_idx_2_d[0]][tab_idx_2_d[1]];
247
248
1.09M
  switch (lav) {
249
11.1k
    case 9: {
250
11.1k
      *pstr_huff_entry = pstr_huff_cld_tab_2d->lav9.entry[in_data[band][0]][in_data[band][1]];
251
11.1k
      *pstr_huff_escape = pstr_huff_cld_tab_2d->lav9.escape;
252
11.1k
    } break;
253
84.0k
    case 7: {
254
84.0k
      switch (data_type) {
255
23.8k
        case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
256
23.8k
          *pstr_huff_entry = pstr_huff_cld_tab_2d->lav7.entry[in_data[band][0]][in_data[band][1]];
257
23.8k
          *pstr_huff_escape = pstr_huff_cld_tab_2d->lav7.escape;
258
23.8k
          break;
259
60.2k
        case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
260
60.2k
          *pstr_huff_entry = pstr_huff_icc_tab_2d->lav7.entry[in_data[band][0]][in_data[band][1]];
261
60.2k
          *pstr_huff_escape = pstr_huff_icc_tab_2d->lav7.escape;
262
60.2k
          break;
263
84.0k
      }
264
84.0k
    } break;
265
167k
    case 5: {
266
167k
      switch (data_type) {
267
49.7k
        case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
268
49.7k
          *pstr_huff_entry = pstr_huff_cld_tab_2d->lav5.entry[in_data[band][0]][in_data[band][1]];
269
49.7k
          *pstr_huff_escape = pstr_huff_cld_tab_2d->lav5.escape;
270
49.7k
          break;
271
118k
        case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
272
118k
          *pstr_huff_entry = pstr_huff_icc_tab_2d->lav5.entry[in_data[band][0]][in_data[band][1]];
273
118k
          *pstr_huff_escape = pstr_huff_icc_tab_2d->lav5.escape;
274
118k
          break;
275
167k
      }
276
167k
    } break;
277
575k
    case 3: {
278
575k
      switch (data_type) {
279
436k
        case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
280
436k
          *pstr_huff_entry = pstr_huff_cld_tab_2d->lav3.entry[in_data[band][0]][in_data[band][1]];
281
436k
          *pstr_huff_escape = pstr_huff_cld_tab_2d->lav3.escape;
282
436k
          break;
283
138k
        case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
284
138k
          *pstr_huff_entry = pstr_huff_icc_tab_2d->lav3.entry[in_data[band][0]][in_data[band][1]];
285
138k
          *pstr_huff_escape = pstr_huff_icc_tab_2d->lav3.escape;
286
138k
          break;
287
575k
      }
288
575k
    } break;
289
575k
    case 1: {
290
256k
      *pstr_huff_entry = pstr_huff_icc_tab_2d->lav1.entry[in_data[band][0]][in_data[band][1]];
291
256k
      *pstr_huff_escape = pstr_huff_icc_tab_2d->lav1.escape;
292
256k
    } break;
293
1.09M
  }
294
1.09M
}
295
296
static IA_ERRORCODE ixheaace_mps_212_huff_enc_2_d(ixheaace_bit_buf_handle pstr_bit_buf,
297
                                                  const WORD32 data_type, WORD16 tab_idx_2_d[2],
298
                                                  WORD16 lav_idx, WORD16 in_data[][2],
299
                                                  WORD16 num_bands, WORD16 stride,
300
87.9k
                                                  WORD16 *p_0_data[2], UWORD16 *huff_bits) {
301
87.9k
  WORD16 band = 0, lav = 0, sym_bits = 0, esc_idx = 0;
302
87.9k
  UWORD8 num_sbits = 0;
303
87.9k
  WORD16 esc_data[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
304
305
87.9k
  *huff_bits = 0;
306
87.9k
  const ixheaace_mps_huff_entry *pstr_huff_entry = NULL;
307
87.9k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
308
46.2k
    lav = 2 * lav_idx + 1;
309
46.2k
    pstr_huff_entry = ixheaace_mps_212_huff_part_0_tab.icc;
310
46.2k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
311
41.6k
    lav = 2 * lav_idx + 3;
312
41.6k
    pstr_huff_entry = ixheaace_mps_212_huff_part_0_tab.cld;
313
41.6k
  } else {
314
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
315
0
  }
316
317
87.9k
  if (p_0_data[0] != NULL) {
318
54.8k
    ixheaace_mps_huff_entry entry = pstr_huff_entry[*p_0_data[0]];
319
54.8k
    *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
320
54.8k
  }
321
87.9k
  if (p_0_data[1] != NULL) {
322
0
    ixheaace_mps_huff_entry entry = pstr_huff_entry[*p_0_data[1]];
323
0
    *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
324
0
  }
325
326
1.18M
  for (band = 0; band < num_bands; band += stride) {
327
1.09M
    ixheaace_mps_huff_entry entry = {0};
328
1.09M
    ixheaace_mps_huff_entry escape = {0};
329
330
1.09M
    esc_data[0][esc_idx] = in_data[band][0] + lav;
331
1.09M
    esc_data[1][esc_idx] = in_data[band][1] + lav;
332
333
1.09M
    num_sbits = ixheaace_mps_212_sym_check(in_data[band], lav, &sym_bits);
334
335
1.09M
    ixheaace_mps_212_get_huff_entry(lav, data_type, band, tab_idx_2_d, in_data, &entry, &escape);
336
337
1.09M
    *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
338
339
1.09M
    if ((entry.value == escape.value) && (entry.length == escape.length)) {
340
1.12k
      esc_idx++;
341
1.09M
    } else {
342
1.09M
      *huff_bits += ixheaace_write_bits(pstr_bit_buf, sym_bits, num_sbits);
343
1.09M
    }
344
1.09M
  }
345
87.9k
  if (esc_idx > 0) {
346
843
    *huff_bits += ixheaace_mps_212_calc_pcm_bits(2 * esc_idx, (2 * lav + 1));
347
843
    ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, esc_data[0], esc_data[1], 0, 2 * esc_idx,
348
843
                                      (2 * lav + 1));
349
843
  }
350
351
87.9k
  return IA_NO_ERROR;
352
87.9k
}
353
354
67.9k
static WORD8 ixheaace_mps_212_get_next_lav_step(const WORD32 lav, const WORD32 data_type) {
355
67.9k
  WORD8 lav_step = 0;
356
67.9k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
357
33.6k
    lav_step = (lav > 7) ? -1 : lav_step_icc[lav];
358
34.2k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
359
34.2k
    lav_step = (lav > 9) ? -1 : lav_step_cld[lav];
360
34.2k
  } else {
361
0
    lav_step = 0;
362
0
  }
363
364
67.9k
  return lav_step;
365
67.9k
}
366
367
static IA_ERRORCODE ixheaace_mps_212_calc_huff_bits(
368
    WORD16 *in_data_1, WORD16 *in_data_2, const WORD32 data_type, const WORD32 diff_type_1,
369
    const WORD32 diff_type_2, const WORD16 num_bands, WORD16 *const lav_idx, WORD16 *bit_count,
370
67.9k
    WORD16 *const huff_dim, WORD16 *const huff_pair_type) {
371
67.9k
  IA_ERRORCODE error;
372
67.9k
  WORD16 band = 0;
373
67.9k
  WORD16 bit_count_1_d = 0;
374
67.9k
  WORD16 bit_count_2_d_freq = 0;
375
67.9k
  WORD16 bit_count_min = 0;
376
67.9k
  WORD16 num_band_short_data_1 = 0;
377
67.9k
  WORD16 num_band_short_data_2 = 0;
378
67.9k
  UWORD16 huff_bits;
379
67.9k
  WORD16 tab_idx_2_d[2][2] = {{0}};
380
67.9k
  WORD16 tab_idx_1_d[2] = {0};
381
67.9k
  WORD16 df_rest_flag[2] = {0};
382
67.9k
  WORD16 part_0_flag[2] = {0};
383
67.9k
  WORD16 lav_fp[2] = {0};
384
67.9k
  WORD16 pair_vec[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS][2] = {{0}};
385
67.9k
  WORD16 *part_0_data_1[2] = {NULL};
386
67.9k
  WORD16 *part_0_data_2[2] = {NULL};
387
67.9k
  WORD16 *in_short_data_1 = NULL;
388
67.9k
  WORD16 *in_short_data_2 = NULL;
389
390
67.9k
  bit_count_1_d = 1;
391
67.9k
  bit_count_2_d_freq = 1;
392
67.9k
  num_band_short_data_1 = num_bands;
393
67.9k
  num_band_short_data_2 = num_bands;
394
395
67.9k
  tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
396
67.9k
  tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
397
398
67.9k
  part_0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
399
67.9k
  part_0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
400
401
67.9k
  if (in_data_1 != NULL) {
402
67.9k
    in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
403
67.9k
    error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[0], in_short_data_1,
404
67.9k
                                          num_band_short_data_1, part_0_flag[0], &huff_bits);
405
67.9k
    if (error) {
406
0
      return error;
407
0
    }
408
67.9k
    bit_count_1_d += huff_bits;
409
67.9k
  }
410
67.9k
  if (in_data_2 != NULL) {
411
0
    in_short_data_2 = in_data_2 + (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
412
0
    error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[1], in_short_data_2,
413
0
                                          num_band_short_data_2, part_0_flag[1], &huff_bits);
414
0
    if (error) {
415
0
      return error;
416
0
    }
417
0
    bit_count_1_d += huff_bits;
418
0
  }
419
420
67.9k
  bit_count_min = bit_count_1_d;
421
67.9k
  *huff_dim = IXHEAACE_MPS_SAC_HUFF_1D;
422
67.9k
  lav_idx[0] = lav_idx[1] = -1;
423
424
67.9k
  if (in_data_1 != NULL) {
425
67.9k
    if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
426
41.4k
      part_0_data_1[0] = &in_data_1[0];
427
41.4k
      part_0_data_1[1] = NULL;
428
429
41.4k
      num_band_short_data_1 -= 1;
430
41.4k
      in_short_data_1 += 1;
431
41.4k
    }
432
433
67.9k
    df_rest_flag[0] = num_band_short_data_1 % 2;
434
435
67.9k
    if (df_rest_flag[0]) {
436
39.3k
      num_band_short_data_1 -= 1;
437
39.3k
    }
438
439
913k
    for (band = 0; band < num_band_short_data_1 - 1; band += 2) {
440
845k
      pair_vec[band][0] = in_short_data_1[band];
441
845k
      pair_vec[band][1] = in_short_data_1[band + 1];
442
443
845k
      lav_fp[0] = (WORD16)MAX(lav_fp[0], abs(pair_vec[band][0]));
444
845k
      lav_fp[0] = (WORD16)MAX(lav_fp[0], abs(pair_vec[band][1]));
445
845k
    }
446
447
67.9k
    tab_idx_2_d[0][0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
448
67.9k
    tab_idx_2_d[0][1] = 0;
449
450
67.9k
    tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
451
452
67.9k
    lav_fp[0] = ixheaace_mps_212_get_next_lav_step(lav_fp[0], data_type);
453
454
67.9k
    if (lav_fp[0] != -1) {
455
66.3k
      bit_count_2_d_freq += lav_huff_len[lav_fp[0]];
456
66.3k
    }
457
67.9k
  }
458
459
67.9k
  if (in_data_2 != NULL) {
460
0
    if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
461
0
      part_0_data_2[0] = NULL;
462
0
      part_0_data_2[1] = &in_data_2[0];
463
464
0
      num_band_short_data_2 -= 1;
465
0
      in_short_data_2 += 1;
466
0
    }
467
468
0
    df_rest_flag[1] = num_band_short_data_2 % 2;
469
470
0
    if (df_rest_flag[1]) {
471
0
      num_band_short_data_2 -= 1;
472
0
    }
473
474
0
    for (band = 0; band < num_band_short_data_2 - 1; band += 2) {
475
0
      pair_vec[band + 1][0] = in_short_data_2[band];
476
0
      pair_vec[band + 1][1] = in_short_data_2[band + 1];
477
478
0
      lav_fp[1] = (WORD16)MAX(lav_fp[1], abs(pair_vec[band + 1][0]));
479
0
      lav_fp[1] = (WORD16)MAX(lav_fp[1], abs(pair_vec[band + 1][1]));
480
0
    }
481
482
0
    tab_idx_2_d[1][0] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
483
0
    tab_idx_2_d[1][1] = 0;
484
485
0
    tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
486
487
0
    lav_fp[1] = ixheaace_mps_212_get_next_lav_step(lav_fp[1], data_type);
488
489
0
    if (lav_fp[1] != -1) bit_count_2_d_freq += lav_huff_len[lav_fp[1]];
490
0
  }
491
492
67.9k
  if ((lav_fp[0] != -1) && (lav_fp[1] != -1)) {
493
66.3k
    if (in_data_1 != NULL) {
494
66.3k
      error = ixheaace_mps_212_huff_enc_2_d(NULL, data_type, tab_idx_2_d[0], lav_fp[0], pair_vec,
495
66.3k
                                            num_band_short_data_1, 2, part_0_data_1, &huff_bits);
496
66.3k
      if (error) {
497
0
        return error;
498
0
      }
499
500
66.3k
      bit_count_2_d_freq += huff_bits;
501
66.3k
    }
502
66.3k
    if (in_data_2 != NULL) {
503
0
      error =
504
0
          ixheaace_mps_212_huff_enc_2_d(NULL, data_type, tab_idx_2_d[1], lav_fp[1], pair_vec + 1,
505
0
                                        num_band_short_data_2, 2, part_0_data_2, &huff_bits);
506
0
      if (error) {
507
0
        return error;
508
0
      }
509
0
      bit_count_2_d_freq += huff_bits;
510
0
    }
511
66.3k
    if (in_data_1 != NULL) {
512
66.3k
      if (df_rest_flag[0]) {
513
39.0k
        error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[0],
514
39.0k
                                              in_short_data_1 + num_band_short_data_1, 1, 0,
515
39.0k
                                              &huff_bits);
516
39.0k
        if (error) {
517
0
          return error;
518
0
        }
519
39.0k
        bit_count_2_d_freq += huff_bits;
520
39.0k
      }
521
66.3k
    }
522
66.3k
    if (in_data_2 != NULL) {
523
0
      if (df_rest_flag[1]) {
524
0
        error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[1],
525
0
                                              in_short_data_2 + num_band_short_data_2, 1, 0,
526
0
                                              &huff_bits);
527
0
        if (error) {
528
0
          return error;
529
0
        }
530
0
        bit_count_2_d_freq += huff_bits;
531
0
      }
532
0
    }
533
534
66.3k
    if (bit_count_2_d_freq < bit_count_min) {
535
34.5k
      bit_count_min = bit_count_2_d_freq;
536
34.5k
      *huff_dim = IXHEAACE_MPS_SAC_HUFF_2D;
537
34.5k
      *huff_pair_type = IXHEAACE_MPS_SAC_FREQ_PAIR;
538
34.5k
      lav_idx[0] = lav_fp[0];
539
34.5k
      lav_idx[1] = lav_fp[1];
540
34.5k
    }
541
66.3k
  }
542
543
67.9k
  *bit_count = bit_count_min;
544
67.9k
  return IA_NO_ERROR;
545
67.9k
}
546
547
static IA_ERRORCODE ixheaace_mps_212_apply_huff_coding(
548
    ixheaace_bit_buf_handle pstr_bit_buf, WORD16 *const in_data_1, WORD16 *const in_data_2,
549
    const WORD32 data_type, const WORD32 diff_type_1, const WORD32 diff_type_2,
550
37.6k
    const WORD16 bands, const WORD16 *const lav_idx, WORD16 huff_dim, WORD16 huff_pair_type) {
551
37.6k
  IA_ERRORCODE error;
552
37.6k
  WORD16 band = 0;
553
37.6k
  WORD16 num_band_short_data_1 = bands;
554
37.6k
  WORD16 num_band_short_data_2 = bands;
555
37.6k
  UWORD16 huff_bits;
556
557
37.6k
  WORD16 df_rest_flag[2] = {0};
558
37.6k
  WORD16 part_0_flag[2] = {0};
559
37.6k
  WORD16 tab_idx_1_d[2] = {0};
560
37.6k
  WORD16 tab_idx_2_d[2][2] = {{0}};
561
37.6k
  WORD16 pair_vec[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS][2] = {{0}};
562
563
37.6k
  WORD16 *part_0_data_1[2] = {NULL};
564
37.6k
  WORD16 *part_0_data_2[2] = {NULL};
565
37.6k
  WORD16 *in_short_data_1 = NULL;
566
37.6k
  WORD16 *in_short_data_2 = NULL;
567
568
37.6k
  ixheaace_write_bits(pstr_bit_buf, huff_dim, 1);
569
37.6k
  if (huff_dim == IXHEAACE_MPS_SAC_HUFF_1D) {
570
15.9k
    part_0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
571
15.9k
    part_0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
572
573
15.9k
    tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
574
15.9k
    tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
575
576
15.9k
    if (in_data_1 != NULL) {
577
15.9k
      in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
578
15.9k
      error =
579
15.9k
          ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[0], in_short_data_1,
580
15.9k
                                        num_band_short_data_1, part_0_flag[0], &huff_bits);
581
15.9k
      if (error) {
582
0
        return error;
583
0
      }
584
15.9k
    }
585
15.9k
    if (in_data_2 != NULL) {
586
0
      in_short_data_2 = in_data_2 + (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
587
0
      error =
588
0
          ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[1], in_short_data_2,
589
0
                                        num_band_short_data_2, part_0_flag[1], &huff_bits);
590
0
      if (error) {
591
0
        return error;
592
0
      }
593
0
    }
594
21.6k
  } else {
595
21.6k
    if (huff_pair_type == IXHEAACE_MPS_SAC_FREQ_PAIR) {
596
21.6k
      if (in_data_1 != NULL) {
597
21.6k
        in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
598
21.6k
        if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
599
13.7k
          part_0_data_1[0] = &in_data_1[0];
600
13.7k
          part_0_data_1[1] = NULL;
601
602
13.7k
          num_band_short_data_1 -= 1;
603
13.7k
          in_short_data_1 += 1;
604
13.7k
        }
605
606
21.6k
        df_rest_flag[0] = num_band_short_data_1 % 2;
607
608
21.6k
        if (df_rest_flag[0]) num_band_short_data_1 -= 1;
609
610
291k
        for (band = 0; band < num_band_short_data_1 - 1; band += 2) {
611
270k
          pair_vec[band][0] = in_short_data_1[band];
612
270k
          pair_vec[band][1] = in_short_data_1[band + 1];
613
270k
        }
614
615
21.6k
        tab_idx_2_d[0][0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
616
21.6k
        tab_idx_2_d[0][1] = 0;
617
618
21.6k
        tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
619
21.6k
      }
620
21.6k
      if (in_data_2 != NULL) {
621
0
        in_short_data_2 = in_data_2 + (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
622
0
        if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
623
0
          part_0_data_2[0] = NULL;
624
0
          part_0_data_2[1] = &in_data_2[0];
625
626
0
          num_band_short_data_2 -= 1;
627
0
          in_short_data_2 += 1;
628
0
        }
629
630
0
        df_rest_flag[1] = num_band_short_data_2 % 2;
631
632
0
        if (df_rest_flag[1]) num_band_short_data_2 -= 1;
633
634
0
        for (band = 0; band < num_band_short_data_2 - 1; band += 2) {
635
0
          pair_vec[band + 1][0] = in_short_data_2[band];
636
0
          pair_vec[band + 1][1] = in_short_data_2[band + 1];
637
0
        }
638
639
0
        tab_idx_2_d[1][0] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
640
0
        tab_idx_2_d[1][1] = 0;
641
642
0
        tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
643
0
      }
644
21.6k
      if (in_data_1 != NULL) {
645
21.6k
        ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[0]], lav_huff_len[lav_idx[0]]);
646
21.6k
        error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[0], lav_idx[0],
647
21.6k
                                              pair_vec, num_band_short_data_1, 2, part_0_data_1,
648
21.6k
                                              &huff_bits);
649
21.6k
        if (error) {
650
0
          return error;
651
0
        }
652
21.6k
        if (df_rest_flag[0]) {
653
13.1k
          error = ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[0],
654
13.1k
                                                in_short_data_1 + num_band_short_data_1, 1, 0,
655
13.1k
                                                &huff_bits);
656
13.1k
          if (error) {
657
0
            return error;
658
0
          }
659
13.1k
        }
660
21.6k
      }
661
21.6k
      if (in_data_2 != NULL) {
662
0
        ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[1]], lav_huff_len[lav_idx[1]]);
663
0
        error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[1], lav_idx[1],
664
0
                                              pair_vec + 1, num_band_short_data_2, 2,
665
0
                                              part_0_data_2, &huff_bits);
666
0
        if (error) {
667
0
          return error;
668
0
        }
669
0
        if (df_rest_flag[1]) {
670
0
          error = ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[1],
671
0
                                                in_short_data_2 + num_band_short_data_2, 1, 0,
672
0
                                                &huff_bits);
673
0
          if (error) {
674
0
            return error;
675
0
          }
676
0
        }
677
0
      }
678
21.6k
    } else {
679
0
      if (in_data_1 == NULL || in_data_2 == NULL || in_short_data_1 == NULL ||
680
0
          in_short_data_2 == NULL) {
681
0
        return IA_EXHEAACE_EXE_FATAL_MPS_NULL_DATA_HANDLE;
682
0
      }
683
684
0
      if ((diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ||
685
0
          (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ)) {
686
0
        part_0_data_1[0] = &in_data_1[0];
687
0
        part_0_data_1[1] = &in_data_2[0];
688
689
0
        in_short_data_1 += 1;
690
0
        in_short_data_2 += 1;
691
692
0
        num_band_short_data_1 -= 1;
693
0
      }
694
695
0
      for (band = 0; band < num_band_short_data_1; band++) {
696
0
        pair_vec[band][0] = in_short_data_1[band];
697
0
        pair_vec[band][1] = in_short_data_2[band];
698
0
      }
699
0
      tab_idx_2_d[0][0] = ((diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ||
700
0
                           (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME))
701
0
                              ? 1
702
0
                              : 0;
703
0
      tab_idx_2_d[0][1] = 1;
704
0
      ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[0]], lav_huff_len[lav_idx[0]]);
705
0
      error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[0], lav_idx[0],
706
0
                                            pair_vec, num_band_short_data_1, 1, part_0_data_1,
707
0
                                            &huff_bits);
708
0
      if (error) {
709
0
        return error;
710
0
      }
711
0
    }
712
21.6k
  }
713
37.6k
  return IA_NO_ERROR;
714
37.6k
}
715
716
static WORD32 ixheaace_mps_515_split_lsb(WORD32 *in_data, WORD32 offset, WORD32 num_lsb,
717
                                         WORD32 num_val, WORD32 *out_data_lsb,
718
160k
                                         WORD32 *out_data_msb) {
719
160k
  WORD32 i = 0, val = 0, lsb = 0, msb = 0;
720
721
160k
  UWORD32 mask = (1 << num_lsb) - 1;
722
160k
  WORD32 no_lsb_bits = 0;
723
724
2.98M
  for (i = 0; i < num_val; i++) {
725
2.82M
    val = in_data[i] + offset;
726
727
2.82M
    lsb = val & mask;
728
2.82M
    msb = val >> num_lsb;
729
730
2.82M
    if (out_data_lsb != NULL) out_data_lsb[i] = lsb;
731
2.82M
    if (out_data_msb != NULL) out_data_msb[i] = msb;
732
733
2.82M
    no_lsb_bits += num_lsb;
734
2.82M
  }
735
736
160k
  return no_lsb_bits;
737
160k
}
738
739
static VOID ixheaace_mps_515_apply_lsb_coding(ixheaace_bit_buf_handle pstr_bit_buf,
740
                                              WORD32 *in_data_lsb, UWORD8 num_lsb,
741
0
                                              WORD32 num_val) {
742
0
  WORD32 i = 0;
743
744
0
  for (i = 0; i < num_val; i++) {
745
0
    ixheaace_write_bits(pstr_bit_buf, in_data_lsb[i], num_lsb);
746
0
  }
747
0
}
748
749
160k
static VOID ixheaace_mps_515_calc_diff_freq(WORD32 *in_data, WORD32 *out_data, WORD32 num_val) {
750
160k
  WORD32 i = 0;
751
752
160k
  out_data[0] = in_data[0];
753
754
2.82M
  for (i = 1; i < num_val; i++) {
755
2.66M
    out_data[i] = in_data[i] - in_data[i - 1];
756
2.66M
  }
757
160k
}
758
759
static VOID ixheaace_mps_515_calc_diff_time(WORD32 *in_data, WORD32 *prev_data, WORD32 *out_data,
760
0
                                            WORD32 direction, WORD32 num_val) {
761
0
  WORD32 i = 0;
762
763
0
  out_data[-1] = (direction == IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS) ? in_data[0] : prev_data[0];
764
765
0
  for (i = 0; i < num_val; i++) {
766
0
    out_data[i] = in_data[i] - prev_data[i];
767
0
  }
768
0
}
769
770
160k
static WORD32 ixheaace_mps_515_calc_pcm_bits(WORD32 num_val, WORD32 n_levels) {
771
160k
  WORD32 num_complete_chunks = 0, rest_chunk_size = 0;
772
160k
  WORD32 max_grp_len = 0, bits_pcm = 0;
773
774
160k
  FLOAT32 num_ld_levels = 0.f;
775
776
160k
  switch (n_levels) {
777
0
    case 3:
778
0
      max_grp_len = 5;
779
0
      break;
780
0
    case 7:
781
0
      max_grp_len = 6;
782
0
      break;
783
0
    case 11:
784
0
      max_grp_len = 2;
785
0
      break;
786
0
    case 13:
787
0
      max_grp_len = 4;
788
0
      break;
789
0
    case 19:
790
0
      max_grp_len = 4;
791
0
      break;
792
0
    case 25:
793
0
      max_grp_len = 3;
794
0
      break;
795
0
    case 51:
796
0
      max_grp_len = 4;
797
0
      break;
798
799
0
    case 4:
800
56.4k
    case 8:
801
56.4k
    case 15:
802
56.4k
    case 26:
803
160k
    case 31:
804
160k
      max_grp_len = 1;
805
160k
      break;
806
0
    default:
807
0
      return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_LEVELS;
808
160k
  }
809
810
160k
  num_ld_levels = (FLOAT32)(log((FLOAT32)n_levels) / log(2.f));
811
812
160k
  num_complete_chunks = num_val / max_grp_len;
813
160k
  rest_chunk_size = num_val % max_grp_len;
814
815
160k
  bits_pcm = ((WORD32)ceil((FLOAT32)(max_grp_len)*num_ld_levels)) * num_complete_chunks;
816
160k
  bits_pcm += (WORD32)ceil((FLOAT32)(rest_chunk_size)*num_ld_levels);
817
818
160k
  return bits_pcm;
819
160k
}
820
821
static VOID ixheaace_mps_515_apply_pcm_coding(ixheaace_bit_buf_handle pstr_bit_buf,
822
                                              WORD32 *in_data_1, WORD32 *in_data_2, WORD32 offset,
823
11.9k
                                              WORD32 num_val, WORD32 n_levels) {
824
11.9k
  WORD32 i = 0, j = 0, idx = 0;
825
11.9k
  WORD32 max_grp_len = 1, grp_len = 0, next_val = 0, grp_val = 0;
826
827
11.9k
  FLOAT32 num_ld_levels = 0.f;
828
829
11.9k
  UWORD8 pcm_block_size[7] = {0};
830
11.9k
  switch (n_levels) {
831
0
    case 4:
832
0
      num_ld_levels = 2.00000000f;
833
0
      break;
834
3.60k
    case 8:
835
3.60k
      num_ld_levels = 3.00000000f;
836
3.60k
      break;
837
0
    case 15:
838
0
      num_ld_levels = 3.90689060f;
839
0
      break;
840
0
    case 26:
841
0
      num_ld_levels = 4.70043972f;
842
0
      break;
843
8.34k
    case 31:
844
8.34k
      num_ld_levels = 4.95419645f;
845
8.34k
      break;
846
0
    case 51:
847
0
      max_grp_len = 4;
848
0
      num_ld_levels = 5.67242534f;
849
0
      break;
850
11.9k
  }
851
852
23.9k
  for (i = 1; i <= max_grp_len; i++) {
853
11.9k
    pcm_block_size[i] = (UWORD8)ceil((FLOAT32)(i)*num_ld_levels);
854
11.9k
  }
855
856
102k
  for (i = 0; i < num_val; i += max_grp_len) {
857
90.2k
    grp_len = MIN(max_grp_len, num_val - i);
858
90.2k
    grp_val = 0;
859
180k
    for (j = 0; j < grp_len; j++) {
860
90.2k
      idx = i + j;
861
90.2k
      next_val = (in_data_2 == NULL)
862
90.2k
                     ? in_data_1[idx]
863
90.2k
                     : (in_data_1 == NULL)
864
0
                           ? in_data_2[idx]
865
0
                           : ((idx & 01) ? in_data_2[idx >> 1] : in_data_1[idx >> 1]);
866
90.2k
      grp_val = grp_val * n_levels + next_val + offset;
867
90.2k
    }
868
869
90.2k
    ixheaace_write_bits(pstr_bit_buf, grp_val, pcm_block_size[grp_len]);
870
90.2k
  }
871
11.9k
}
872
873
static WORD32 ixheaace_mps_515_count_huff_cld(
874
    const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_pt0,
875
    const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_diff, WORD32 *in_data, WORD32 num_val,
876
207k
    WORD32 p0_flag) {
877
207k
  WORD32 i = 0, id = 0;
878
207k
  WORD32 huff_bits = 0;
879
207k
  WORD32 offset = 0;
880
207k
  if (p0_flag) {
881
207k
    huff_bits += pstr_huff_cld_tab_pt0->length[in_data[0]];
882
207k
    offset = 1;
883
207k
  }
884
885
3.39M
  for (i = offset; i < num_val; i++) {
886
3.19M
    id = in_data[i];
887
888
3.19M
    if (id != 0) {
889
359k
      if (id < 0) {
890
181k
        id = -id;
891
181k
      }
892
359k
      huff_bits += 1;
893
359k
    }
894
895
3.19M
    huff_bits += pstr_huff_cld_tab_diff->length[id];
896
3.19M
  }
897
898
207k
  return huff_bits;
899
207k
}
900
901
static WORD32 ixheaace_mps_515_count_huff_icc(
902
    const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_pt0,
903
    const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_diff, WORD32 *in_data, WORD32 num_val,
904
112k
    WORD32 p0_flag) {
905
112k
  WORD32 i = 0, id = 0;
906
112k
  WORD32 huff_bits = 0;
907
112k
  WORD32 offset = 0;
908
909
112k
  if (p0_flag) {
910
112k
    huff_bits += pstr_huff_icc_tab_pt0->length[in_data[0]];
911
112k
    offset = 1;
912
112k
  }
913
914
2.25M
  for (i = offset; i < num_val; i++) {
915
2.14M
    id = in_data[i];
916
917
2.14M
    if (id != 0) {
918
198k
      if (id < 0) {
919
75.8k
        id = -id;
920
75.8k
      }
921
198k
      huff_bits += 1;
922
198k
    }
923
924
2.14M
    huff_bits += pstr_huff_icc_tab_diff->length[id];
925
2.14M
  }
926
927
112k
  return huff_bits;
928
112k
}
929
930
static WORD32 ixheaace_mps_515_count_huff_cpc(
931
    const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_pt0,
932
    const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_diff, WORD32 *in_data, WORD32 num_val,
933
0
    WORD32 p0_flag) {
934
0
  WORD32 i = 0, id = 0;
935
0
  WORD32 huff_bits = 0;
936
0
  WORD32 offset = 0;
937
938
0
  if (p0_flag) {
939
0
    huff_bits += pstr_huff_cpc_tab_pt0->length[in_data[0]];
940
0
    offset = 1;
941
0
  }
942
943
0
  for (i = offset; i < num_val; i++) {
944
0
    id = in_data[i];
945
946
0
    if (id != 0) {
947
0
      if (id < 0) {
948
0
        id = -id;
949
0
      }
950
0
      huff_bits += 1;
951
0
    }
952
953
0
    huff_bits += pstr_huff_cpc_tab_diff->length[id];
954
0
  }
955
956
0
  return huff_bits;
957
0
}
958
959
static VOID ixheaace_mps_515_huff_enc_cld(
960
    ixheaace_bit_buf_handle pstr_bit_buf,
961
    const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_pt0,
962
    const ixheaace_mps_sac_huff_cld_tab *pstr_huff_cld_tab_diff, WORD32 *in_data, WORD32 num_val,
963
95.2k
    WORD32 p0_flag) {
964
95.2k
  WORD32 i = 0, id = 0, id_sign = 0;
965
95.2k
  WORD32 offset = 0;
966
967
95.2k
  if (p0_flag) {
968
95.2k
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_cld_tab_pt0->value[in_data[0]],
969
95.2k
                        pstr_huff_cld_tab_pt0->length[in_data[0]]);
970
95.2k
    offset = 1;
971
95.2k
  }
972
973
1.68M
  for (i = offset; i < num_val; i++) {
974
1.58M
    id = in_data[i];
975
976
1.58M
    if (id != 0) {
977
178k
      id_sign = 0;
978
178k
      if (id < 0) {
979
89.9k
        id = -id;
980
89.9k
        id_sign = 1;
981
89.9k
      }
982
178k
    }
983
984
1.58M
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_cld_tab_diff->value[id],
985
1.58M
                        pstr_huff_cld_tab_diff->length[id]);
986
987
1.58M
    if (id != 0) {
988
178k
      ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
989
178k
    }
990
1.58M
  }
991
95.2k
}
992
993
static VOID ixheaace_mps_515_huff_enc_icc(
994
    ixheaace_bit_buf_handle pstr_bit_buf,
995
    const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_pt0,
996
    const ixheaace_mps_sac_huff_icc_tab *pstr_huff_icc_tab_diff, WORD32 *in_data, WORD32 num_val,
997
52.8k
    WORD32 p0_flag) {
998
52.8k
  WORD32 i = 0, id = 0, id_sign = 0;
999
52.8k
  WORD32 offset = 0;
1000
1001
52.8k
  if (p0_flag) {
1002
52.8k
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_icc_tab_pt0->value[in_data[0]],
1003
52.8k
                        pstr_huff_icc_tab_pt0->length[in_data[0]]);
1004
52.8k
    offset = 1;
1005
52.8k
  }
1006
1007
1.05M
  for (i = offset; i < num_val; i++) {
1008
1.00M
    id = in_data[i];
1009
1010
1.00M
    if (id != 0) {
1011
53.8k
      id_sign = 0;
1012
53.8k
      if (id < 0) {
1013
19.3k
        id = -id;
1014
19.3k
        id_sign = 1;
1015
19.3k
      }
1016
53.8k
    }
1017
1018
1.00M
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_icc_tab_diff->value[id],
1019
1.00M
                        pstr_huff_icc_tab_diff->length[id]);
1020
1021
1.00M
    if (id != 0) {
1022
53.8k
      ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
1023
53.8k
    }
1024
1.00M
  }
1025
52.8k
}
1026
1027
static VOID ixheaace_mps_515_huff_enc_cpc(
1028
    ixheaace_bit_buf_handle pstr_bit_buf,
1029
    const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_pt0,
1030
    const ixheaace_mps_sac_huff_cpc_tab *pstr_huff_cpc_tab_diff, WORD32 *in_data, WORD32 num_val,
1031
0
    WORD32 p0_flag) {
1032
0
  WORD32 i = 0, id = 0, id_sign = 0;
1033
0
  WORD32 offset = 0;
1034
1035
0
  if (p0_flag) {
1036
0
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_cpc_tab_pt0->value[in_data[0]],
1037
0
                        pstr_huff_cpc_tab_pt0->length[in_data[0]]);
1038
0
    offset = 1;
1039
0
  }
1040
1041
0
  for (i = offset; i < num_val; i++) {
1042
0
    id = in_data[i];
1043
1044
0
    if (id != 0) {
1045
0
      id_sign = 0;
1046
0
      if (id < 0) {
1047
0
        id = -id;
1048
0
        id_sign = 1;
1049
0
      }
1050
0
    }
1051
1052
0
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_cpc_tab_diff->value[id],
1053
0
                        pstr_huff_cpc_tab_diff->length[id]);
1054
1055
0
    if (id != 0) {
1056
0
      ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
1057
0
    }
1058
0
  }
1059
0
}
1060
1061
static WORD32 ixheaace_mps_515_calc_huff_bits(WORD32 *in_data_1, WORD32 *in_data_2,
1062
                                              WORD32 data_type, WORD32 diff_type_1,
1063
320k
                                              WORD32 diff_type_2, WORD32 num_val) {
1064
320k
  WORD32 p0_flag[2];
1065
1066
320k
  WORD32 offset_1 = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
1067
320k
  WORD32 offset_2 = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
1068
1069
320k
  WORD32 bit_count_huff = 0;
1070
1071
320k
  WORD32 num_val_1_int = 0;
1072
320k
  WORD32 num_val_2_int = 0;
1073
1074
320k
  WORD32 *in_data_1_int = in_data_1 + offset_1;
1075
320k
  WORD32 *in_data_2_int = in_data_2 + offset_2;
1076
1077
320k
  bit_count_huff = 1;
1078
1079
320k
  num_val_1_int = num_val;
1080
320k
  num_val_2_int = num_val;
1081
1082
320k
  p0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1083
320k
  p0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1084
1085
320k
  switch (data_type) {
1086
207k
    case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1087
207k
      if (in_data_1 != NULL)
1088
207k
        bit_count_huff +=
1089
207k
            ixheaace_mps_515_count_huff_cld(&ixheaace_mps_515_huff_cld_tab.huff_pt0,
1090
207k
                                            &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_1],
1091
207k
                                            in_data_1_int, num_val_1_int, p0_flag[0]);
1092
207k
      if (in_data_2 != NULL)
1093
0
        bit_count_huff +=
1094
0
            ixheaace_mps_515_count_huff_cld(&ixheaace_mps_515_huff_cld_tab.huff_pt0,
1095
0
                                            &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_2],
1096
0
                                            in_data_2_int, num_val_2_int, p0_flag[1]);
1097
207k
      break;
1098
1099
112k
    case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1100
112k
      if (in_data_1 != NULL)
1101
112k
        bit_count_huff +=
1102
112k
            ixheaace_mps_515_count_huff_icc(&ixheaace_mps_515_huff_icc_tab.huff_pt0,
1103
112k
                                            &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_1],
1104
112k
                                            in_data_1_int, num_val_1_int, p0_flag[0]);
1105
112k
      if (in_data_2 != NULL)
1106
0
        bit_count_huff +=
1107
0
            ixheaace_mps_515_count_huff_icc(&ixheaace_mps_515_huff_icc_tab.huff_pt0,
1108
0
                                            &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_2],
1109
0
                                            in_data_2_int, num_val_2_int, p0_flag[1]);
1110
112k
      break;
1111
1112
0
    case IXHEAACE_MPS_SAC_DATA_TYPE_CPC:
1113
0
      if (in_data_1 != NULL)
1114
0
        bit_count_huff +=
1115
0
            ixheaace_mps_515_count_huff_cpc(&ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1116
0
                                            &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_1],
1117
0
                                            in_data_1_int, num_val_1_int, p0_flag[0]);
1118
0
      if (in_data_2 != NULL)
1119
0
        bit_count_huff +=
1120
0
            ixheaace_mps_515_count_huff_cpc(&ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1121
0
                                            &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_2],
1122
0
                                            in_data_2_int, num_val_2_int, p0_flag[1]);
1123
0
      break;
1124
1125
0
    default:
1126
0
      break;
1127
320k
  }
1128
1129
320k
  return bit_count_huff;
1130
320k
}
1131
1132
static VOID ixheaace_mps_515_apply_huff_coding(ixheaace_bit_buf_handle pstr_bit_buf,
1133
                                               WORD32 *in_data_1, WORD32 *in_data_2,
1134
                                               WORD32 data_type, WORD32 diff_type_1,
1135
148k
                                               WORD32 diff_type_2, WORD32 num_val) {
1136
148k
  WORD32 p0_flag[2];
1137
1138
148k
  WORD32 num_val_1_int = num_val;
1139
148k
  WORD32 num_val_2_int = num_val;
1140
1141
148k
  WORD32 *in_data_1_int = in_data_1;
1142
148k
  WORD32 *in_data_2_int = in_data_2;
1143
1144
148k
  if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) in_data_1_int += 1;
1145
148k
  if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) in_data_2_int += 1;
1146
1147
148k
  ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_HUFF_1D, 1);
1148
1149
148k
  p0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1150
148k
  p0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1151
1152
148k
  switch (data_type) {
1153
95.2k
    case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1154
95.2k
      if (in_data_1 != NULL)
1155
95.2k
        ixheaace_mps_515_huff_enc_cld(pstr_bit_buf, &ixheaace_mps_515_huff_cld_tab.huff_pt0,
1156
95.2k
                                      &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_1],
1157
95.2k
                                      in_data_1_int, num_val_1_int, p0_flag[0]);
1158
95.2k
      if (in_data_2 != NULL)
1159
0
        ixheaace_mps_515_huff_enc_cld(pstr_bit_buf, &ixheaace_mps_515_huff_cld_tab.huff_pt0,
1160
0
                                      &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_2],
1161
0
                                      in_data_2_int, num_val_2_int, p0_flag[1]);
1162
95.2k
      break;
1163
1164
52.8k
    case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1165
52.8k
      if (in_data_1 != NULL)
1166
52.8k
        ixheaace_mps_515_huff_enc_icc(pstr_bit_buf, &ixheaace_mps_515_huff_icc_tab.huff_pt0,
1167
52.8k
                                      &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_1],
1168
52.8k
                                      in_data_1_int, num_val_1_int, p0_flag[0]);
1169
52.8k
      if (in_data_2 != NULL)
1170
0
        ixheaace_mps_515_huff_enc_icc(pstr_bit_buf, &ixheaace_mps_515_huff_icc_tab.huff_pt0,
1171
0
                                      &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_2],
1172
0
                                      in_data_2_int, num_val_2_int, p0_flag[1]);
1173
52.8k
      break;
1174
1175
0
    case IXHEAACE_MPS_SAC_DATA_TYPE_CPC:
1176
0
      if (in_data_1 != NULL)
1177
0
        ixheaace_mps_515_huff_enc_cpc(pstr_bit_buf, &ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1178
0
                                      &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_1],
1179
0
                                      in_data_1_int, num_val_1_int, p0_flag[0]);
1180
0
      if (in_data_2 != NULL)
1181
0
        ixheaace_mps_515_huff_enc_cpc(pstr_bit_buf, &ixheaace_mps_515_huff_cpc_tab.huff_pt0,
1182
0
                                      &ixheaace_mps_515_huff_cpc_tab.huff_diff[diff_type_2],
1183
0
                                      in_data_2_int, num_val_2_int, p0_flag[1]);
1184
0
      break;
1185
1186
0
    default:
1187
0
      break;
1188
148k
  }
1189
148k
}
1190
1191
IA_ERRORCODE ixheaace_mps_212_ec_data_pair_enc(
1192
    ixheaace_bit_buf_handle pstr_bit_buf, WORD16 pp_in_data[][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],
1193
    WORD16 p_in_data[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS], const WORD32 data_type,
1194
    const WORD32 set_idx, const WORD32 start_band, const WORD16 data_bands,
1195
0
    const WORD32 coarse_flag, const WORD32 independency_flag) {
1196
0
  IA_ERRORCODE error;
1197
0
  WORD16 band = 0;
1198
0
  WORD16 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1199
0
  WORD16 pcm_coding_flag = 0;
1200
0
  WORD16 min_bits_all = 0;
1201
0
  WORD16 min_found = 0;
1202
0
  WORD16 huff_dim_df_df = 0;
1203
0
  WORD16 huff_pair_type_df_df = 0;
1204
0
  WORD16 huff_dim_df_dt = 0;
1205
0
  WORD16 huff_pair_type_df_dt = 0;
1206
0
  WORD16 huff_dim_dtbw_df = 0;
1207
0
  WORD16 huff_pair_type_dtbw_df = 0;
1208
0
  WORD16 huff_dim_dt_dt = 0;
1209
0
  WORD16 huff_pair_type_dt_dt = 0;
1210
0
  WORD16 num_pcm_bits = -1;
1211
0
  WORD16 min_bits_df_df = -1;
1212
0
  WORD16 min_bits_df_dt = -1;
1213
0
  WORD16 min_bits_dtbw_df = -1;
1214
0
  WORD16 min_bits_dt_dt = -1;
1215
0
  WORD16 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1216
1217
0
  WORD16 quant_data_msb[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
1218
0
  WORD16 quant_data_hist_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1219
0
  WORD16 data_diff_freq[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
1220
0
  WORD16 data_diff_time[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS + 2];
1221
0
  WORD16 lav_df_df[2] = {-1, -1};
1222
0
  WORD16 lav_df_dt[2] = {-1, -1};
1223
0
  WORD16 lav_dtbw_df[2] = {-1, -1};
1224
0
  WORD16 lav_dt_dt[2] = {-1, -1};
1225
0
  WORD16 *p_quant_data_msb[2] = {NULL, NULL};
1226
0
  WORD16 *p_quant_data_hist_msb = NULL;
1227
1228
0
  if (data_bands <= 0) {
1229
0
    return IA_EXHEAACE_EXE_NONFATAL_MPS_INVALID_DATA_BANDS;
1230
0
  }
1231
1232
0
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
1233
0
    if (coarse_flag) {
1234
0
      quant_levels = 4;
1235
0
      quant_offset = 0;
1236
0
    } else {
1237
0
      quant_levels = 8;
1238
0
      quant_offset = 0;
1239
0
    }
1240
0
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
1241
0
    if (coarse_flag) {
1242
0
      quant_levels = 15;
1243
0
      quant_offset = 7;
1244
0
    } else {
1245
0
      quant_levels = 31;
1246
0
      quant_offset = 15;
1247
0
    }
1248
0
  } else {
1249
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
1250
0
  }
1251
0
  if (quant_offset != 0) {
1252
0
    for (band = 0; band < data_bands; band++) {
1253
0
      quant_data_msb[0][band] = pp_in_data[set_idx][start_band + band] + quant_offset;
1254
0
      quant_data_msb[1][band] = pp_in_data[set_idx + 1][start_band + band] + quant_offset;
1255
0
    }
1256
0
    p_quant_data_msb[0] = quant_data_msb[0];
1257
0
    p_quant_data_msb[1] = quant_data_msb[1];
1258
0
  } else {
1259
0
    p_quant_data_msb[0] = pp_in_data[set_idx] + start_band;
1260
0
    p_quant_data_msb[1] = pp_in_data[set_idx + 1] + start_band;
1261
0
  }
1262
1263
0
  if (allow_diff_time_back_flag) {
1264
0
    if (quant_offset != 0) {
1265
0
      for (band = 0; band < data_bands; band++) {
1266
0
        quant_data_hist_msb[band] = p_in_data[start_band + band] + quant_offset;
1267
0
      }
1268
0
      p_quant_data_hist_msb = quant_data_hist_msb;
1269
0
    } else {
1270
0
      p_quant_data_hist_msb = p_in_data + start_band;
1271
0
    }
1272
0
  }
1273
1274
0
  data_diff_freq[0][0] = p_quant_data_msb[0][0];
1275
0
  data_diff_freq[1][0] = p_quant_data_msb[1][0];
1276
1277
0
  for (band = 1; band < data_bands; band++) {
1278
0
    data_diff_freq[0][band] = p_quant_data_msb[0][band] - p_quant_data_msb[0][band - 1];
1279
0
    data_diff_freq[1][band] = p_quant_data_msb[1][band] - p_quant_data_msb[1][band - 1];
1280
0
  }
1281
1282
0
  if (allow_diff_time_back_flag) {
1283
0
    data_diff_time[0][0] = p_quant_data_msb[0][0];
1284
0
    data_diff_time[0][1] = p_quant_data_hist_msb[0];
1285
1286
0
    for (band = 0; band < data_bands; band++) {
1287
0
      data_diff_time[0][band + 2] = p_quant_data_msb[0][band] - p_quant_data_hist_msb[band];
1288
0
    }
1289
0
  }
1290
1291
0
  data_diff_time[1][0] = p_quant_data_msb[1][0];
1292
0
  data_diff_time[1][1] = p_quant_data_msb[0][0];
1293
1294
0
  for (band = 0; band < data_bands; band++) {
1295
0
    data_diff_time[1][band + 2] = p_quant_data_msb[1][band] - p_quant_data_msb[0][band];
1296
0
  }
1297
1298
0
  num_pcm_bits = ixheaace_mps_212_calc_pcm_bits((WORD16)(2 * data_bands), quant_levels);
1299
0
  num_pcm_val = (WORD16)(2 * data_bands);
1300
1301
0
  min_bits_all = num_pcm_bits;
1302
1303
0
  error = ixheaace_mps_212_calc_huff_bits(data_diff_freq[0], data_diff_freq[1], data_type,
1304
0
                                          IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ,
1305
0
                                          data_bands, lav_df_df, &min_bits_df_df, &huff_dim_df_df,
1306
0
                                          &huff_pair_type_df_df);
1307
0
  if (error) {
1308
0
    return error;
1309
0
  }
1310
1311
0
  min_bits_df_df += 2;
1312
1313
0
  if (min_bits_df_df < min_bits_all) {
1314
0
    min_bits_all = min_bits_df_df;
1315
0
  }
1316
0
  error = ixheaace_mps_212_calc_huff_bits(data_diff_freq[0], data_diff_time[1], data_type,
1317
0
                                          IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_TIME,
1318
0
                                          data_bands, lav_df_dt, &min_bits_df_dt, &huff_dim_df_dt,
1319
0
                                          &huff_pair_type_df_dt);
1320
0
  if (error) {
1321
0
    return error;
1322
0
  }
1323
1324
0
  min_bits_df_dt += 2;
1325
1326
0
  if (min_bits_df_dt < min_bits_all) {
1327
0
    min_bits_all = min_bits_df_dt;
1328
0
  }
1329
1330
0
  if (allow_diff_time_back_flag) {
1331
0
    error = ixheaace_mps_212_calc_huff_bits(
1332
0
        data_diff_time[0], data_diff_freq[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1333
0
        IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_dtbw_df, &min_bits_dtbw_df, &huff_dim_dtbw_df,
1334
0
        &huff_pair_type_dtbw_df);
1335
0
    if (error) {
1336
0
      return error;
1337
0
    }
1338
1339
0
    min_bits_dtbw_df += 2;
1340
1341
0
    if (min_bits_dtbw_df < min_bits_all) {
1342
0
      min_bits_all = min_bits_dtbw_df;
1343
0
    }
1344
1345
0
    error = ixheaace_mps_212_calc_huff_bits(
1346
0
        data_diff_time[0], data_diff_time[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1347
0
        IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt_dt, &min_bits_dt_dt, &huff_dim_dt_dt,
1348
0
        &huff_pair_type_dt_dt);
1349
0
    if (error) {
1350
0
      return error;
1351
0
    }
1352
1353
0
    min_bits_dt_dt += 2;
1354
1355
0
    if (min_bits_dt_dt < min_bits_all) {
1356
0
      min_bits_all = min_bits_dt_dt;
1357
0
    }
1358
0
  }
1359
1360
0
  pcm_coding_flag = (min_bits_all == num_pcm_bits);
1361
1362
0
  ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1363
1364
0
  if (pcm_coding_flag) {
1365
0
    ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, pp_in_data[set_idx] + start_band,
1366
0
                                      pp_in_data[set_idx + 1] + start_band, quant_offset,
1367
0
                                      num_pcm_val, quant_levels);
1368
0
  } else {
1369
0
    min_found = 0;
1370
1371
0
    if (min_bits_all == min_bits_df_df) {
1372
0
      ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1373
0
      ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1374
1375
0
      error = ixheaace_mps_212_apply_huff_coding(
1376
0
          pstr_bit_buf, data_diff_freq[0], data_diff_freq[1], data_type,
1377
0
          IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_df_df,
1378
0
          huff_dim_df_df, huff_pair_type_df_df);
1379
0
      if (error) {
1380
0
        return error;
1381
0
      }
1382
0
      min_found = 1;
1383
0
    }
1384
1385
0
    if (!min_found && (min_bits_all == min_bits_df_dt)) {
1386
0
      ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1387
0
      ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1388
1389
0
      error = ixheaace_mps_212_apply_huff_coding(
1390
0
          pstr_bit_buf, data_diff_freq[0], data_diff_time[1], data_type,
1391
0
          IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_df_dt,
1392
0
          huff_dim_df_dt, huff_pair_type_df_dt);
1393
0
      if (error) {
1394
0
        return error;
1395
0
      }
1396
0
      min_found = 1;
1397
0
    }
1398
1399
0
    if (allow_diff_time_back_flag) {
1400
0
      if (!min_found && (min_bits_all == min_bits_dtbw_df)) {
1401
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1402
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1403
1404
0
        error = ixheaace_mps_212_apply_huff_coding(
1405
0
            pstr_bit_buf, data_diff_time[0], data_diff_freq[1], data_type,
1406
0
            IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_dtbw_df,
1407
0
            huff_dim_dtbw_df, huff_pair_type_dtbw_df);
1408
0
        if (error) {
1409
0
          return error;
1410
0
        }
1411
0
        min_found = 1;
1412
0
      }
1413
0
      if (!min_found && (min_bits_all == min_bits_dt_dt)) {
1414
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1415
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1416
1417
0
        error = ixheaace_mps_212_apply_huff_coding(
1418
0
            pstr_bit_buf, data_diff_time[0], data_diff_time[1], data_type,
1419
0
            IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt_dt,
1420
0
            huff_dim_dt_dt, huff_pair_type_dt_dt);
1421
0
        if (error) {
1422
0
          return error;
1423
0
        }
1424
0
      }
1425
0
    }
1426
0
  }
1427
1428
0
  return IA_NO_ERROR;
1429
0
}
1430
1431
IA_ERRORCODE ixheaace_mps_212_ec_data_single_enc(
1432
    ixheaace_bit_buf_handle pstr_bit_buf, WORD16 pp_in_data[][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS],
1433
    WORD16 p_in_data[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS], const WORD32 data_type,
1434
    const WORD32 set_idx, const WORD32 start_band, const WORD16 data_bands,
1435
41.4k
    const WORD32 coarse_flag, const WORD32 independency_flag) {
1436
41.4k
  IA_ERRORCODE error;
1437
41.4k
  WORD16 band = 0;
1438
41.4k
  WORD16 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1439
41.4k
  WORD16 pcm_coding_flag = 0;
1440
41.4k
  WORD16 min_bits_all = 0;
1441
41.4k
  WORD16 min_found = 0;
1442
41.4k
  WORD16 huff_dim_df = 0;
1443
41.4k
  WORD16 huff_pair_type_df = 0;
1444
41.4k
  WORD16 huff_dim_dt = 0;
1445
41.4k
  WORD16 huff_pair_type_dt = 0;
1446
41.4k
  WORD16 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1447
41.4k
  WORD16 num_pcm_bits = -1;
1448
41.4k
  WORD16 min_bits_df = -1;
1449
41.4k
  WORD16 min_bits_dt = -1;
1450
1451
41.4k
  WORD16 quant_data_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1452
41.4k
  WORD16 quant_data_hist_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1453
41.4k
  WORD16 data_diff_freq[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1454
41.4k
  WORD16 data_diff_time[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS + 2] = {0};
1455
41.4k
  WORD16 *p_quant_data_msb;
1456
41.4k
  WORD16 *p_quant_data_hist_msb = NULL;
1457
41.4k
  WORD16 lav_df[2] = {-1, -1};
1458
41.4k
  WORD16 lav_dt[2] = {-1, -1};
1459
1460
41.4k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
1461
20.5k
    if (coarse_flag) {
1462
0
      quant_levels = 4;
1463
0
      quant_offset = 0;
1464
20.5k
    } else {
1465
20.5k
      quant_levels = 8;
1466
20.5k
      quant_offset = 0;
1467
20.5k
    }
1468
20.8k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
1469
20.8k
    if (coarse_flag) {
1470
0
      quant_levels = 15;
1471
0
      quant_offset = 7;
1472
20.8k
    } else {
1473
20.8k
      quant_levels = 31;
1474
20.8k
      quant_offset = 15;
1475
20.8k
    }
1476
20.8k
  } else {
1477
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
1478
0
  }
1479
41.4k
  if (quant_offset != 0) {
1480
566k
    for (band = 0; band < data_bands; band++) {
1481
545k
      quant_data_msb[band] = pp_in_data[set_idx][start_band + band] + quant_offset;
1482
545k
    }
1483
20.8k
    p_quant_data_msb = quant_data_msb;
1484
20.8k
  } else {
1485
20.5k
    p_quant_data_msb = pp_in_data[set_idx] + start_band;
1486
20.5k
  }
1487
1488
41.4k
  if (allow_diff_time_back_flag) {
1489
26.5k
    if (quant_offset != 0) {
1490
363k
      for (band = 0; band < data_bands; band++) {
1491
349k
        quant_data_hist_msb[band] = p_in_data[start_band + band] + quant_offset;
1492
349k
      }
1493
13.3k
      p_quant_data_hist_msb = quant_data_hist_msb;
1494
13.3k
    } else {
1495
13.1k
      p_quant_data_hist_msb = p_in_data + start_band;
1496
13.1k
    }
1497
26.5k
  }
1498
1499
41.4k
  data_diff_freq[0] = p_quant_data_msb[0];
1500
1501
1.08M
  for (band = 1; band < data_bands; band++) {
1502
1.04M
    data_diff_freq[band] = p_quant_data_msb[band] - p_quant_data_msb[band - 1];
1503
1.04M
  }
1504
1505
41.4k
  if (allow_diff_time_back_flag) {
1506
26.5k
    data_diff_time[0] = p_quant_data_msb[0];
1507
26.5k
    data_diff_time[1] = p_quant_data_hist_msb[0];
1508
1509
717k
    for (band = 0; band < data_bands; band++) {
1510
690k
      data_diff_time[band + 2] = p_quant_data_msb[band] - p_quant_data_hist_msb[band];
1511
690k
    }
1512
26.5k
  }
1513
1514
41.4k
  num_pcm_bits = ixheaace_mps_212_calc_pcm_bits(data_bands, quant_levels);
1515
41.4k
  num_pcm_val = data_bands;
1516
41.4k
  min_bits_all = num_pcm_bits;
1517
1518
41.4k
  error = ixheaace_mps_212_calc_huff_bits(
1519
41.4k
      data_diff_freq, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ,
1520
41.4k
      data_bands, lav_df, &min_bits_df, &huff_dim_df, &huff_pair_type_df);
1521
41.4k
  if (error) {
1522
0
    return error;
1523
0
  }
1524
1525
41.4k
  if (allow_diff_time_back_flag) min_bits_df += 1;
1526
1527
41.4k
  if (min_bits_df < min_bits_all) {
1528
35.2k
    min_bits_all = min_bits_df;
1529
35.2k
  }
1530
41.4k
  if (allow_diff_time_back_flag) {
1531
26.5k
    error = ixheaace_mps_212_calc_huff_bits(
1532
26.5k
        data_diff_time, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME,
1533
26.5k
        data_bands, lav_dt, &min_bits_dt, &huff_dim_dt, &huff_pair_type_dt);
1534
26.5k
    if (error) {
1535
0
      return error;
1536
0
    }
1537
1538
26.5k
    min_bits_dt += 1;
1539
1540
26.5k
    if (min_bits_dt < min_bits_all) {
1541
9.60k
      min_bits_all = min_bits_dt;
1542
9.60k
    }
1543
26.5k
  }
1544
41.4k
  pcm_coding_flag = (min_bits_all == num_pcm_bits);
1545
1546
41.4k
  ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1547
1548
41.4k
  if (pcm_coding_flag) {
1549
3.78k
    ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, pp_in_data[set_idx] + start_band, NULL,
1550
3.78k
                                      quant_offset, num_pcm_val, quant_levels);
1551
37.6k
  } else {
1552
37.6k
    min_found = 0;
1553
37.6k
    if (min_bits_all == min_bits_df) {
1554
28.0k
      if (allow_diff_time_back_flag) {
1555
15.2k
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1556
15.2k
      }
1557
1558
28.0k
      error = ixheaace_mps_212_apply_huff_coding(
1559
28.0k
          pstr_bit_buf, data_diff_freq, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1560
28.0k
          IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_df, huff_dim_df, huff_pair_type_df);
1561
28.0k
      if (error) {
1562
0
        return error;
1563
0
      }
1564
28.0k
      min_found = 1;
1565
28.0k
    }
1566
1567
37.6k
    if (allow_diff_time_back_flag) {
1568
24.8k
      if (!min_found && (min_bits_all == min_bits_dt)) {
1569
9.60k
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1570
1571
9.60k
        error = ixheaace_mps_212_apply_huff_coding(
1572
9.60k
            pstr_bit_buf, data_diff_time, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1573
9.60k
            IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt, huff_dim_dt, huff_pair_type_dt);
1574
9.60k
        if (error) {
1575
0
          return error;
1576
0
        }
1577
9.60k
      }
1578
24.8k
    }
1579
37.6k
  }
1580
1581
41.4k
  return IA_NO_ERROR;
1582
41.4k
}
1583
1584
VOID ixheaace_mps_515_ec_data_pair_enc(ixheaace_bit_buf_handle pstr_bit_buf,
1585
                                         WORD32 pp_in_data[][MAXBANDS],
1586
                                         WORD32 p_in_data[MAXBANDS], WORD32 data_type,
1587
                                         WORD32 set_idx, WORD32 start_band, WORD32 data_bands,
1588
                                         WORD32 pair_flag, WORD32 coarse_flag,
1589
160k
                                         WORD32 independency_flag) {
1590
160k
  WORD32 dummy = 0;
1591
160k
  WORD32 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1592
1593
160k
  WORD32 split_lsb_flag = 0;
1594
160k
  WORD32 pcm_coding_flag = 0;
1595
1596
160k
  WORD32 min_bits_df_df = -1;
1597
160k
  WORD32 min_bits_df_dt = -1;
1598
160k
  WORD32 min_bits_dtbw_df = -1;
1599
160k
  WORD32 min_bits_dtfw_df = -1;
1600
1601
160k
  WORD32 min_bits_dt_dt = -1;
1602
160k
  WORD32 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1603
1604
160k
  WORD32 num_lsb_bits[2] = {0, 0};
1605
160k
  WORD32 num_pcm_bits = 0;
1606
1607
160k
  WORD32 a_data_hist[MAXBANDS] = {0};
1608
160k
  WORD32 aa_data_pair[2][MAXBANDS] = {{0}};
1609
1610
160k
  WORD32 quant_data_lsb[2][MAXBANDS] = {{0}};
1611
160k
  WORD32 quant_data_msb[2][MAXBANDS] = {{0}};
1612
1613
160k
  WORD32 quant_data_hist_lsb[MAXBANDS] = {0};
1614
160k
  WORD32 quant_data_hist_msb[MAXBANDS] = {0};
1615
1616
160k
  WORD32 data_diff_freq[2][MAXBANDS] = {{0}};
1617
160k
  WORD32 data_diff_time_bw[2][MAXBANDS + 1] = {{0}};
1618
160k
  WORD32 data_diff_time_fw[MAXBANDS + 1] = {0};
1619
1620
160k
  WORD32 *p_data_pcm[2] = {NULL};
1621
160k
  WORD32 *p_data_diff_freq[2] = {NULL};
1622
160k
  WORD32 *p_data_diff_time_bw[2] = {NULL};
1623
160k
  WORD32 *p_data_diff_time_fw = NULL;
1624
1625
160k
  WORD32 min_bits_all = 0;
1626
160k
  WORD32 min_found = 0;
1627
1628
160k
  switch (data_type) {
1629
103k
    case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1630
103k
      if (coarse_flag) {
1631
0
        split_lsb_flag = 0;
1632
0
        quant_levels = 15;
1633
0
        quant_offset = 7;
1634
103k
      } else {
1635
103k
        split_lsb_flag = 0;
1636
103k
        quant_levels = 31;
1637
103k
        quant_offset = 15;
1638
103k
      }
1639
1640
103k
      break;
1641
1642
56.4k
    case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1643
56.4k
      if (coarse_flag) {
1644
0
        split_lsb_flag = 0;
1645
0
        quant_levels = 4;
1646
0
        quant_offset = 0;
1647
56.4k
      } else {
1648
56.4k
        split_lsb_flag = 0;
1649
56.4k
        quant_levels = 8;
1650
56.4k
        quant_offset = 0;
1651
56.4k
      }
1652
1653
56.4k
      break;
1654
1655
0
    case IXHEAACE_MPS_SAC_DATA_TYPE_CPC:
1656
0
      if (coarse_flag) {
1657
0
        split_lsb_flag = 0;
1658
0
        quant_levels = 26;
1659
0
        quant_offset = 0;
1660
0
      } else {
1661
0
        split_lsb_flag = 1;
1662
0
        quant_levels = 51;
1663
0
        quant_offset = 0;
1664
0
      }
1665
1666
0
      break;
1667
1668
0
    default:
1669
0
      return;
1670
160k
  }
1671
1672
160k
  memcpy(a_data_hist, p_in_data + start_band, sizeof(WORD32) * data_bands);
1673
1674
160k
  memcpy(aa_data_pair[0], pp_in_data[set_idx] + start_band, sizeof(int) * data_bands);
1675
160k
  p_data_pcm[0] = aa_data_pair[0];
1676
160k
  if (pair_flag) {
1677
0
    memcpy(aa_data_pair[1], pp_in_data[set_idx + 1] + start_band, sizeof(int) * data_bands);
1678
0
    p_data_pcm[1] = aa_data_pair[1];
1679
0
  }
1680
1681
160k
  num_lsb_bits[0] =
1682
160k
      ixheaace_mps_515_split_lsb(aa_data_pair[0], quant_offset, split_lsb_flag ? 1 : 0,
1683
160k
                                 data_bands, quant_data_lsb[0], quant_data_msb[0]);
1684
1685
160k
  if (pair_flag) {
1686
0
    num_lsb_bits[1] =
1687
0
        ixheaace_mps_515_split_lsb(aa_data_pair[1], quant_offset, split_lsb_flag ? 1 : 0,
1688
0
                                   data_bands, quant_data_lsb[1], quant_data_msb[1]);
1689
0
  }
1690
160k
  (VOID) num_lsb_bits;
1691
160k
  if (allow_diff_time_back_flag) {
1692
0
    dummy = ixheaace_mps_515_split_lsb(a_data_hist, quant_offset, split_lsb_flag ? 1 : 0,
1693
0
                                       data_bands, quant_data_hist_lsb, quant_data_hist_msb);
1694
0
    (VOID) dummy;
1695
0
  }
1696
1697
160k
  ixheaace_mps_515_calc_diff_freq(quant_data_msb[0], data_diff_freq[0], data_bands);
1698
160k
  p_data_diff_freq[0] = data_diff_freq[0];
1699
1700
160k
  if (pair_flag) {
1701
0
    ixheaace_mps_515_calc_diff_freq(quant_data_msb[1], data_diff_freq[1], data_bands);
1702
0
    p_data_diff_freq[1] = data_diff_freq[1];
1703
0
  }
1704
1705
160k
  if (allow_diff_time_back_flag) {
1706
0
    ixheaace_mps_515_calc_diff_time(quant_data_msb[0], quant_data_hist_msb,
1707
0
                                    data_diff_time_bw[0] + 1,
1708
0
                                    IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS, data_bands);
1709
0
    p_data_diff_time_bw[0] = data_diff_time_bw[0];
1710
0
  }
1711
1712
160k
  if (pair_flag) {
1713
0
    ixheaace_mps_515_calc_diff_time(quant_data_msb[1], quant_data_msb[0],
1714
0
                                    data_diff_time_bw[1] + 1,
1715
0
                                    IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS, data_bands);
1716
0
    p_data_diff_time_bw[1] = data_diff_time_bw[1];
1717
1718
0
    ixheaace_mps_515_calc_diff_time(quant_data_msb[1], quant_data_msb[0], data_diff_time_fw + 1,
1719
0
                                    IXHEAACE_MPS_SAC_DIRECTION_FORWARDS, data_bands);
1720
0
    p_data_diff_time_fw = data_diff_time_fw;
1721
0
  }
1722
1723
160k
  if (pair_flag) {
1724
0
    num_pcm_bits = ixheaace_mps_515_calc_pcm_bits(2 * data_bands, quant_levels);
1725
0
    num_pcm_val = 2 * data_bands;
1726
160k
  } else {
1727
160k
    num_pcm_bits = ixheaace_mps_515_calc_pcm_bits(data_bands, quant_levels);
1728
160k
    num_pcm_val = data_bands;
1729
160k
  }
1730
1731
160k
  min_bits_all = num_pcm_bits;
1732
1733
160k
  if ((p_data_diff_freq[0] != NULL) || (p_data_diff_freq[1] != NULL)) {
1734
160k
    min_bits_df_df = ixheaace_mps_515_calc_huff_bits(p_data_diff_freq[0], p_data_diff_freq[1],
1735
160k
                                                     data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1736
160k
                                                     IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1737
1738
160k
    if (pair_flag || allow_diff_time_back_flag) min_bits_df_df += 1;
1739
160k
    if (pair_flag) min_bits_df_df += 1;
1740
1741
160k
    if (min_bits_df_df < min_bits_all) {
1742
148k
      min_bits_all = min_bits_df_df;
1743
148k
    }
1744
160k
  }
1745
1746
160k
  if ((p_data_diff_freq[0] != NULL) || (p_data_diff_time_bw[1] != NULL)) {
1747
160k
    min_bits_df_dt = ixheaace_mps_515_calc_huff_bits(p_data_diff_freq[0], p_data_diff_time_bw[1],
1748
160k
                                                     data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1749
160k
                                                     IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1750
1751
160k
    if (pair_flag || allow_diff_time_back_flag) min_bits_df_dt += 1;
1752
160k
    if (pair_flag) min_bits_df_dt += 1;
1753
1754
160k
    if (min_bits_df_dt < min_bits_all) {
1755
0
      min_bits_all = min_bits_df_dt;
1756
0
    }
1757
160k
  }
1758
1759
160k
  if ((p_data_diff_time_fw != NULL) || (p_data_diff_freq[1] != NULL)) {
1760
0
    min_bits_dtfw_df = ixheaace_mps_515_calc_huff_bits(p_data_diff_time_fw, p_data_diff_freq[1],
1761
0
                                                       data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1762
0
                                                       IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1763
1764
0
    if (pair_flag || allow_diff_time_back_flag) min_bits_dtfw_df += 1;
1765
0
    if (pair_flag && allow_diff_time_back_flag) min_bits_dtfw_df += 1;
1766
1767
0
    if (pair_flag && allow_diff_time_back_flag) {
1768
0
      min_bits_dtfw_df += 1;
1769
0
    }
1770
1771
0
    if (min_bits_dtfw_df < min_bits_all) {
1772
0
      min_bits_all = min_bits_dtfw_df;
1773
0
    }
1774
0
  }
1775
1776
160k
  if (allow_diff_time_back_flag) {
1777
0
    if ((p_data_diff_time_bw[0] != NULL) || (p_data_diff_freq[1] != NULL)) {
1778
0
      min_bits_dtbw_df = ixheaace_mps_515_calc_huff_bits(
1779
0
          p_data_diff_time_bw[0], p_data_diff_freq[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1780
0
          IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1781
1782
0
      min_bits_dtbw_df += 1;
1783
0
      if (pair_flag) {
1784
0
        min_bits_dtbw_df += 2;
1785
0
      }
1786
1787
0
      if (min_bits_dtbw_df < min_bits_all) {
1788
0
        min_bits_all = min_bits_dtbw_df;
1789
0
      }
1790
0
    }
1791
1792
0
    if ((p_data_diff_time_bw[0] != NULL) || (p_data_diff_time_bw[1] != NULL)) {
1793
0
      min_bits_dt_dt = ixheaace_mps_515_calc_huff_bits(
1794
0
          p_data_diff_time_bw[0], p_data_diff_time_bw[1], data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1795
0
          IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1796
1797
0
      min_bits_dt_dt += 1;
1798
0
      if (pair_flag) min_bits_dt_dt += 1;
1799
1800
0
      if (min_bits_dt_dt < min_bits_all) {
1801
0
        min_bits_all = min_bits_dt_dt;
1802
0
      }
1803
0
    }
1804
0
  }
1805
1806
160k
  pcm_coding_flag = (min_bits_all == num_pcm_bits);
1807
1808
160k
  ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1809
1810
160k
  if (pcm_coding_flag) {
1811
11.9k
    if (data_bands >= PBC_MIN_BANDS) {
1812
3.68k
      ixheaace_write_bits(pstr_bit_buf, 0, 1);
1813
3.68k
    }
1814
1815
11.9k
    ixheaace_mps_515_apply_pcm_coding(pstr_bit_buf, p_data_pcm[0], p_data_pcm[1], quant_offset,
1816
11.9k
                                      num_pcm_val, quant_levels);
1817
148k
  } else {
1818
148k
    min_found = 0;
1819
1820
148k
    if (min_bits_all == min_bits_df_df) {
1821
148k
      if (pair_flag || allow_diff_time_back_flag) {
1822
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1823
0
      }
1824
1825
148k
      if (pair_flag) {
1826
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1827
0
      }
1828
1829
148k
      ixheaace_mps_515_apply_huff_coding(pstr_bit_buf, p_data_diff_freq[0], p_data_diff_freq[1],
1830
148k
                                         data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1831
148k
                                         IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1832
1833
148k
      min_found = 1;
1834
148k
    }
1835
1836
148k
    if (!min_found && (min_bits_all == min_bits_df_dt)) {
1837
0
      if (pair_flag || allow_diff_time_back_flag) {
1838
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1839
0
      }
1840
1841
0
      if (pair_flag) {
1842
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1843
0
      }
1844
1845
0
      ixheaace_mps_515_apply_huff_coding(
1846
0
          pstr_bit_buf, p_data_diff_freq[0], p_data_diff_time_bw[1], data_type,
1847
0
          IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1848
1849
0
      min_found = 1;
1850
0
    }
1851
1852
148k
    if (!min_found && (min_bits_all == min_bits_dtfw_df)) {
1853
0
      if (pair_flag || allow_diff_time_back_flag) {
1854
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1855
0
      }
1856
1857
0
      if (pair_flag && allow_diff_time_back_flag) {
1858
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1859
0
      }
1860
1861
0
      ixheaace_mps_515_apply_huff_coding(pstr_bit_buf, p_data_diff_time_fw, p_data_diff_freq[1],
1862
0
                                         data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1863
0
                                         IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1864
1865
0
      if (pair_flag && allow_diff_time_back_flag) {
1866
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIRECTION_FORWARDS, 1);
1867
0
      }
1868
1869
0
      min_found = 1;
1870
0
    }
1871
1872
148k
    if (allow_diff_time_back_flag) {
1873
0
      if (!min_found && (min_bits_all == min_bits_dtbw_df)) {
1874
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1875
1876
0
        if (pair_flag) {
1877
0
          ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1878
0
        }
1879
1880
0
        ixheaace_mps_515_apply_huff_coding(
1881
0
            pstr_bit_buf, p_data_diff_time_bw[0], p_data_diff_freq[1], data_type,
1882
0
            IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1883
1884
0
        if (pair_flag) {
1885
0
          ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIRECTION_BACKWARDS, 1);
1886
0
        }
1887
1888
0
        min_found = 1;
1889
0
      }
1890
1891
0
      if (!min_found && (min_bits_all == min_bits_dt_dt)) {
1892
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1893
1894
0
        if (pair_flag) {
1895
0
          ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1896
0
        }
1897
1898
0
        ixheaace_mps_515_apply_huff_coding(
1899
0
            pstr_bit_buf, p_data_diff_time_bw[0], p_data_diff_time_bw[1], data_type,
1900
0
            IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1901
0
      }
1902
0
    }
1903
1904
148k
    if (split_lsb_flag) {
1905
0
      ixheaace_mps_515_apply_lsb_coding(pstr_bit_buf, quant_data_lsb[0], 1, data_bands);
1906
1907
0
      if (pair_flag) {
1908
0
        ixheaace_mps_515_apply_lsb_coding(pstr_bit_buf, quant_data_lsb[1], 1, data_bands);
1909
0
      }
1910
0
    }
1911
148k
  }
1912
1913
160k
  return;
1914
160k
}