Coverage Report

Created: 2026-08-14 06:54

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.24M
                                         WORD16 *const p_sym_bits) {
51
1.24M
  UWORD8 sym_bits = 0;
52
1.24M
  UWORD8 num_sbits = 0;
53
1.24M
  WORD16 sum_val = data[0] + data[1];
54
1.24M
  WORD16 diff_val = data[0] - data[1];
55
56
1.24M
  if (sum_val != 0) {
57
556k
    WORD8 sum_neg = (sum_val < 0) ? 1 : 0;
58
556k
    if (sum_neg) {
59
271k
      sum_val = -sum_val;
60
271k
      diff_val = -diff_val;
61
271k
    }
62
556k
    sym_bits = (sym_bits << 1) | sum_neg;
63
556k
    num_sbits++;
64
556k
  }
65
66
1.24M
  if (diff_val != 0) {
67
472k
    WORD8 diff_neg = (diff_val < 0) ? 1 : 0;
68
472k
    if (diff_neg) {
69
231k
      diff_val = -diff_val;
70
231k
    }
71
472k
    sym_bits = (sym_bits << 1) | diff_neg;
72
472k
    num_sbits++;
73
472k
  }
74
1.24M
  *p_sym_bits = sym_bits;
75
76
1.24M
  if (!(sum_val % 2)) {
77
907k
    data[0] = (sum_val / 2);
78
907k
    data[1] = (diff_val / 2);
79
907k
  } else {
80
336k
    data[0] = (lav - sum_val / 2);
81
336k
    data[1] = (lav - diff_val / 2);
82
336k
  }
83
84
1.24M
  return num_sbits;
85
1.24M
}
86
87
45.2k
static WORD16 ixheaace_mps_212_calc_pcm_bits(const WORD16 num_val, const WORD16 n_levels) {
88
45.2k
  WORD16 num_complete_chunks = 0, rest_chunk_size = 0;
89
45.2k
  WORD16 max_grp_len = 0, bits_pcm = 0;
90
45.2k
  WORD32 chunk_levels, lvl;
91
92
45.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
4
    case 19:
102
4
    case 51:
103
4
      max_grp_len = 4;
104
4
      break;
105
0
    case 25:
106
0
      max_grp_len = 3;
107
0
      break;
108
12
    case 11:
109
12
      max_grp_len = 2;
110
12
      break;
111
45.2k
    default:
112
45.2k
      max_grp_len = 1;
113
45.2k
  }
114
115
45.2k
  num_complete_chunks = num_val / max_grp_len;
116
45.2k
  rest_chunk_size = num_val % max_grp_len;
117
118
45.2k
  chunk_levels = 1;
119
90.5k
  for (lvl = 1; lvl <= max_grp_len; lvl++) {
120
45.2k
    chunk_levels *= n_levels;
121
45.2k
  }
122
45.2k
  bits_pcm = (WORD16)(round(log(chunk_levels) / log(2)) * num_complete_chunks);
123
45.2k
  bits_pcm += (WORD16)(round(log(chunk_levels) / log(2)) * rest_chunk_size);
124
125
45.2k
  return bits_pcm;
126
45.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.43k
                                              const WORD16 num_val, const WORD16 n_levels) {
132
4.43k
  WORD16 val = 0, lvl = 0, idx = 0;
133
4.43k
  WORD16 max_grp_len = 0, grp_len = 0, next_val = 0;
134
4.43k
  WORD32 grp_val = 0, chunk_levels = 0;
135
4.43k
  UWORD8 pcm_block_size[7] = {0};
136
137
4.43k
  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
4
    case 19:
148
4
    case 51:
149
4
      max_grp_len = 4;
150
4
      break;
151
0
    case 5:
152
0
    case 25:
153
0
      max_grp_len = 3;
154
0
      break;
155
12
    case 11:
156
12
      max_grp_len = 2;
157
12
      break;
158
4.42k
    default:
159
4.42k
      max_grp_len = 1;
160
4.43k
  }
161
162
4.43k
  chunk_levels = 1;
163
8.90k
  for (lvl = 1; lvl <= max_grp_len; lvl++) {
164
4.46k
    chunk_levels *= n_levels;
165
4.46k
    pcm_block_size[lvl] = (UWORD8)round(log(chunk_levels) / log(2));
166
4.46k
  }
167
168
97.4k
  for (val = 0; val < num_val; val += max_grp_len) {
169
93.0k
    grp_len = MIN(max_grp_len, num_val - val);
170
93.0k
    grp_val = 0;
171
186k
    for (lvl = 0; lvl < grp_len; lvl++) {
172
93.0k
      idx = val + lvl;
173
93.0k
      next_val = (in_data_2 == NULL)
174
93.0k
                     ? in_data_1[idx]
175
93.0k
                     : (in_data_1 == NULL)
176
2.91k
                           ? in_data_2[idx]
177
2.91k
                           : ((idx & 01) ? in_data_2[idx >> 1] : in_data_1[idx >> 1]);
178
93.0k
      grp_val = grp_val * n_levels + next_val + offset;
179
93.0k
    }
180
93.0k
    ixheaace_write_bits(pstr_bit_buf, grp_val, pcm_block_size[grp_len]);
181
93.0k
  }
182
4.43k
}
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
148k
                                                  UWORD16 *huff_code_bits) {
189
148k
  WORD32 band, offset = 0;
190
148k
  UWORD16 huff_bits = 0;
191
148k
  ixheaace_mps_huff_entry part0;
192
148k
  const ixheaace_mps_huff_entry *p_huff_tab = NULL;
193
194
148k
  *huff_code_bits = 0;
195
148k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
196
72.3k
    p_huff_tab = ixheaace_mps_212_huff_icc_tab.h1_d[dim_1];
197
76.1k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
198
76.1k
    p_huff_tab = ixheaace_mps_212_huff_cld_tab.h1_d[dim_1];
199
76.1k
  } else {
200
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
201
0
  }
202
203
148k
  if (part_0_flag) {
204
59.4k
    if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
205
25.2k
      part0 = ixheaace_mps_212_huff_part_0_tab.icc[in_data[0]];
206
34.1k
    } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
207
34.1k
      part0 = ixheaace_mps_212_huff_part_0_tab.cld[in_data[0]];
208
34.1k
    } else {
209
0
      return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
210
0
    }
211
59.4k
    huff_bits += ixheaace_write_bits(pstr_bit_buf, part0.value, part0.length);
212
59.4k
    offset = 1;
213
59.4k
  }
214
215
2.60M
  for (band = offset; band < num_bands; band++) {
216
2.45M
    WORD32 id_sign = 0;
217
2.45M
    WORD32 id = in_data[band];
218
219
2.45M
    if (id != 0) {
220
940k
      id_sign = 0;
221
940k
      if (id < 0) {
222
462k
        id = -id;
223
462k
        id_sign = 1;
224
462k
      }
225
940k
    }
226
227
2.45M
    huff_bits += ixheaace_write_bits(pstr_bit_buf, p_huff_tab[id].value, p_huff_tab[id].length);
228
229
2.45M
    if (id != 0) {
230
940k
      huff_bits += ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
231
940k
    }
232
2.45M
  }
233
234
148k
  *huff_code_bits = huff_bits;
235
148k
  return IA_NO_ERROR;
236
148k
}
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.24M
                                            ixheaace_mps_huff_entry *const pstr_huff_escape) {
243
1.24M
  const ixheaace_mps_huff_cld_tab_2d *pstr_huff_cld_tab_2d =
244
1.24M
      &ixheaace_mps_212_huff_cld_tab.h2_d[tab_idx_2_d[0]][tab_idx_2_d[1]];
245
1.24M
  const ixheaace_mps_huff_icc_tab_2d *pstr_huff_icc_tab_2d =
246
1.24M
      &ixheaace_mps_212_huff_icc_tab.h2_d[tab_idx_2_d[0]][tab_idx_2_d[1]];
247
248
1.24M
  switch (lav) {
249
13.0k
    case 9: {
250
13.0k
      *pstr_huff_entry = pstr_huff_cld_tab_2d->lav9.entry[in_data[band][0]][in_data[band][1]];
251
13.0k
      *pstr_huff_escape = pstr_huff_cld_tab_2d->lav9.escape;
252
13.0k
    } break;
253
99.4k
    case 7: {
254
99.4k
      switch (data_type) {
255
28.8k
        case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
256
28.8k
          *pstr_huff_entry = pstr_huff_cld_tab_2d->lav7.entry[in_data[band][0]][in_data[band][1]];
257
28.8k
          *pstr_huff_escape = pstr_huff_cld_tab_2d->lav7.escape;
258
28.8k
          break;
259
70.6k
        case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
260
70.6k
          *pstr_huff_entry = pstr_huff_icc_tab_2d->lav7.entry[in_data[band][0]][in_data[band][1]];
261
70.6k
          *pstr_huff_escape = pstr_huff_icc_tab_2d->lav7.escape;
262
70.6k
          break;
263
99.4k
      }
264
99.4k
    } break;
265
190k
    case 5: {
266
190k
      switch (data_type) {
267
63.1k
        case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
268
63.1k
          *pstr_huff_entry = pstr_huff_cld_tab_2d->lav5.entry[in_data[band][0]][in_data[band][1]];
269
63.1k
          *pstr_huff_escape = pstr_huff_cld_tab_2d->lav5.escape;
270
63.1k
          break;
271
126k
        case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
272
126k
          *pstr_huff_entry = pstr_huff_icc_tab_2d->lav5.entry[in_data[band][0]][in_data[band][1]];
273
126k
          *pstr_huff_escape = pstr_huff_icc_tab_2d->lav5.escape;
274
126k
          break;
275
190k
      }
276
190k
    } break;
277
659k
    case 3: {
278
659k
      switch (data_type) {
279
490k
        case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
280
490k
          *pstr_huff_entry = pstr_huff_cld_tab_2d->lav3.entry[in_data[band][0]][in_data[band][1]];
281
490k
          *pstr_huff_escape = pstr_huff_cld_tab_2d->lav3.escape;
282
490k
          break;
283
169k
        case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
284
169k
          *pstr_huff_entry = pstr_huff_icc_tab_2d->lav3.entry[in_data[band][0]][in_data[band][1]];
285
169k
          *pstr_huff_escape = pstr_huff_icc_tab_2d->lav3.escape;
286
169k
          break;
287
659k
      }
288
659k
    } break;
289
659k
    case 1: {
290
281k
      *pstr_huff_entry = pstr_huff_icc_tab_2d->lav1.entry[in_data[band][0]][in_data[band][1]];
291
281k
      *pstr_huff_escape = pstr_huff_icc_tab_2d->lav1.escape;
292
281k
    } break;
293
1.24M
  }
294
1.24M
}
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
97.1k
                                                  WORD16 *p_0_data[2], UWORD16 *huff_bits) {
301
97.1k
  WORD16 band = 0, lav = 0, sym_bits = 0, esc_idx = 0;
302
97.1k
  UWORD8 num_sbits = 0;
303
97.1k
  WORD16 esc_data[2][IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {{0}};
304
305
97.1k
  *huff_bits = 0;
306
97.1k
  const ixheaace_mps_huff_entry *pstr_huff_entry = NULL;
307
97.1k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
308
50.8k
    lav = 2 * lav_idx + 1;
309
50.8k
    pstr_huff_entry = ixheaace_mps_212_huff_part_0_tab.icc;
310
50.8k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
311
46.3k
    lav = 2 * lav_idx + 3;
312
46.3k
    pstr_huff_entry = ixheaace_mps_212_huff_part_0_tab.cld;
313
46.3k
  } else {
314
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
315
0
  }
316
317
97.1k
  if (p_0_data[0] != NULL) {
318
58.2k
    ixheaace_mps_huff_entry entry = pstr_huff_entry[*p_0_data[0]];
319
58.2k
    *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
320
58.2k
  }
321
97.1k
  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.34M
  for (band = 0; band < num_bands; band += stride) {
327
1.24M
    ixheaace_mps_huff_entry entry = {0};
328
1.24M
    ixheaace_mps_huff_entry escape = {0};
329
330
1.24M
    esc_data[0][esc_idx] = in_data[band][0] + lav;
331
1.24M
    esc_data[1][esc_idx] = in_data[band][1] + lav;
332
333
1.24M
    num_sbits = ixheaace_mps_212_sym_check(in_data[band], lav, &sym_bits);
334
335
1.24M
    ixheaace_mps_212_get_huff_entry(lav, data_type, band, tab_idx_2_d, in_data, &entry, &escape);
336
337
1.24M
    *huff_bits += ixheaace_write_bits(pstr_bit_buf, entry.value, entry.length);
338
339
1.24M
    if ((entry.value == escape.value) && (entry.length == escape.length)) {
340
1.45k
      esc_idx++;
341
1.24M
    } else {
342
1.24M
      *huff_bits += ixheaace_write_bits(pstr_bit_buf, sym_bits, num_sbits);
343
1.24M
    }
344
1.24M
  }
345
97.1k
  if (esc_idx > 0) {
346
1.06k
    *huff_bits += ixheaace_mps_212_calc_pcm_bits(2 * esc_idx, (2 * lav + 1));
347
1.06k
    ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, esc_data[0], esc_data[1], 0, 2 * esc_idx,
348
1.06k
                                      (2 * lav + 1));
349
1.06k
  }
350
351
97.1k
  return IA_NO_ERROR;
352
97.1k
}
353
354
75.0k
static WORD8 ixheaace_mps_212_get_next_lav_step(const WORD32 lav, const WORD32 data_type) {
355
75.0k
  WORD8 lav_step = 0;
356
75.0k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
357
37.0k
    lav_step = (lav > 7) ? -1 : lav_step_icc[lav];
358
38.0k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
359
38.0k
    lav_step = (lav > 9) ? -1 : lav_step_cld[lav];
360
38.0k
  } else {
361
0
    lav_step = 0;
362
0
  }
363
364
75.0k
  return lav_step;
365
75.0k
}
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
75.0k
    WORD16 *const huff_dim, WORD16 *const huff_pair_type) {
371
75.0k
  IA_ERRORCODE error;
372
75.0k
  WORD16 band = 0;
373
75.0k
  WORD16 bit_count_1_d = 0;
374
75.0k
  WORD16 bit_count_2_d_freq = 0;
375
75.0k
  WORD16 bit_count_min = 0;
376
75.0k
  WORD16 num_band_short_data_1 = 0;
377
75.0k
  WORD16 num_band_short_data_2 = 0;
378
75.0k
  UWORD16 huff_bits;
379
75.0k
  WORD16 tab_idx_2_d[2][2] = {{0}};
380
75.0k
  WORD16 tab_idx_1_d[2] = {0};
381
75.0k
  WORD16 df_rest_flag[2] = {0};
382
75.0k
  WORD16 part_0_flag[2] = {0};
383
75.0k
  WORD16 lav_fp[2] = {0};
384
75.0k
  WORD16 pair_vec[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS][2] = {{0}};
385
75.0k
  WORD16 *part_0_data_1[2] = {NULL};
386
75.0k
  WORD16 *part_0_data_2[2] = {NULL};
387
75.0k
  WORD16 *in_short_data_1 = NULL;
388
75.0k
  WORD16 *in_short_data_2 = NULL;
389
390
75.0k
  bit_count_1_d = 1;
391
75.0k
  bit_count_2_d_freq = 1;
392
75.0k
  num_band_short_data_1 = num_bands;
393
75.0k
  num_band_short_data_2 = num_bands;
394
395
75.0k
  tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
396
75.0k
  tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
397
398
75.0k
  part_0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
399
75.0k
  part_0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
400
401
75.0k
  if (in_data_1 != NULL) {
402
75.0k
    in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
403
75.0k
    error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[0], in_short_data_1,
404
75.0k
                                          num_band_short_data_1, part_0_flag[0], &huff_bits);
405
75.0k
    if (error) {
406
0
      return error;
407
0
    }
408
75.0k
    bit_count_1_d += huff_bits;
409
75.0k
  }
410
75.0k
  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
75.0k
  bit_count_min = bit_count_1_d;
421
75.0k
  *huff_dim = IXHEAACE_MPS_SAC_HUFF_1D;
422
75.0k
  lav_idx[0] = lav_idx[1] = -1;
423
424
75.0k
  if (in_data_1 != NULL) {
425
75.0k
    if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
426
44.1k
      part_0_data_1[0] = &in_data_1[0];
427
44.1k
      part_0_data_1[1] = NULL;
428
429
44.1k
      num_band_short_data_1 -= 1;
430
44.1k
      in_short_data_1 += 1;
431
44.1k
    }
432
433
75.0k
    df_rest_flag[0] = num_band_short_data_1 % 2;
434
435
75.0k
    if (df_rest_flag[0]) {
436
42.8k
      num_band_short_data_1 -= 1;
437
42.8k
    }
438
439
1.03M
    for (band = 0; band < num_band_short_data_1 - 1; band += 2) {
440
959k
      pair_vec[band][0] = in_short_data_1[band];
441
959k
      pair_vec[band][1] = in_short_data_1[band + 1];
442
443
959k
      lav_fp[0] = (WORD16)MAX(lav_fp[0], abs(pair_vec[band][0]));
444
959k
      lav_fp[0] = (WORD16)MAX(lav_fp[0], abs(pair_vec[band][1]));
445
959k
    }
446
447
75.0k
    tab_idx_2_d[0][0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
448
75.0k
    tab_idx_2_d[0][1] = 0;
449
450
75.0k
    tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
451
452
75.0k
    lav_fp[0] = ixheaace_mps_212_get_next_lav_step(lav_fp[0], data_type);
453
454
75.0k
    if (lav_fp[0] != -1) {
455
73.3k
      bit_count_2_d_freq += lav_huff_len[lav_fp[0]];
456
73.3k
    }
457
75.0k
  }
458
459
75.0k
  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
75.0k
  if ((lav_fp[0] != -1) && (lav_fp[1] != -1)) {
493
73.3k
    if (in_data_1 != NULL) {
494
73.3k
      error = ixheaace_mps_212_huff_enc_2_d(NULL, data_type, tab_idx_2_d[0], lav_fp[0], pair_vec,
495
73.3k
                                            num_band_short_data_1, 2, part_0_data_1, &huff_bits);
496
73.3k
      if (error) {
497
0
        return error;
498
0
      }
499
500
73.3k
      bit_count_2_d_freq += huff_bits;
501
73.3k
    }
502
73.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
73.3k
    if (in_data_1 != NULL) {
512
73.3k
      if (df_rest_flag[0]) {
513
42.4k
        error = ixheaace_mps_212_huff_enc_1_d(NULL, data_type, tab_idx_1_d[0],
514
42.4k
                                              in_short_data_1 + num_band_short_data_1, 1, 0,
515
42.4k
                                              &huff_bits);
516
42.4k
        if (error) {
517
0
          return error;
518
0
        }
519
42.4k
        bit_count_2_d_freq += huff_bits;
520
42.4k
      }
521
73.3k
    }
522
73.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
73.3k
    if (bit_count_2_d_freq < bit_count_min) {
535
39.4k
      bit_count_min = bit_count_2_d_freq;
536
39.4k
      *huff_dim = IXHEAACE_MPS_SAC_HUFF_2D;
537
39.4k
      *huff_pair_type = IXHEAACE_MPS_SAC_FREQ_PAIR;
538
39.4k
      lav_idx[0] = lav_fp[0];
539
39.4k
      lav_idx[1] = lav_fp[1];
540
39.4k
    }
541
73.3k
  }
542
543
75.0k
  *bit_count = bit_count_min;
544
75.0k
  return IA_NO_ERROR;
545
75.0k
}
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
40.8k
    const WORD16 bands, const WORD16 *const lav_idx, WORD16 huff_dim, WORD16 huff_pair_type) {
551
40.8k
  IA_ERRORCODE error;
552
40.8k
  WORD16 band = 0;
553
40.8k
  WORD16 num_band_short_data_1 = bands;
554
40.8k
  WORD16 num_band_short_data_2 = bands;
555
40.8k
  UWORD16 huff_bits;
556
557
40.8k
  WORD16 df_rest_flag[2] = {0};
558
40.8k
  WORD16 part_0_flag[2] = {0};
559
40.8k
  WORD16 tab_idx_1_d[2] = {0};
560
40.8k
  WORD16 tab_idx_2_d[2][2] = {{0}};
561
40.8k
  WORD16 pair_vec[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS][2] = {{0}};
562
563
40.8k
  WORD16 *part_0_data_1[2] = {NULL};
564
40.8k
  WORD16 *part_0_data_2[2] = {NULL};
565
40.8k
  WORD16 *in_short_data_1 = NULL;
566
40.8k
  WORD16 *in_short_data_2 = NULL;
567
568
40.8k
  ixheaace_write_bits(pstr_bit_buf, huff_dim, 1);
569
40.8k
  if (huff_dim == IXHEAACE_MPS_SAC_HUFF_1D) {
570
17.0k
    part_0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
571
17.0k
    part_0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
572
573
17.0k
    tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
574
17.0k
    tab_idx_1_d[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
575
576
17.0k
    if (in_data_1 != NULL) {
577
17.0k
      in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
578
17.0k
      error =
579
17.0k
          ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[0], in_short_data_1,
580
17.0k
                                        num_band_short_data_1, part_0_flag[0], &huff_bits);
581
17.0k
      if (error) {
582
0
        return error;
583
0
      }
584
17.0k
    }
585
17.0k
    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
23.7k
  } else {
595
23.7k
    if (huff_pair_type == IXHEAACE_MPS_SAC_FREQ_PAIR) {
596
23.7k
      if (in_data_1 != NULL) {
597
23.7k
        in_short_data_1 = in_data_1 + (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME ? 2 : 0);
598
23.7k
        if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) {
599
14.3k
          part_0_data_1[0] = &in_data_1[0];
600
14.3k
          part_0_data_1[1] = NULL;
601
602
14.3k
          num_band_short_data_1 -= 1;
603
14.3k
          in_short_data_1 += 1;
604
14.3k
        }
605
606
23.7k
        df_rest_flag[0] = num_band_short_data_1 % 2;
607
608
23.7k
        if (df_rest_flag[0]) num_band_short_data_1 -= 1;
609
610
329k
        for (band = 0; band < num_band_short_data_1 - 1; band += 2) {
611
305k
          pair_vec[band][0] = in_short_data_1[band];
612
305k
          pair_vec[band][1] = in_short_data_1[band + 1];
613
305k
        }
614
615
23.7k
        tab_idx_2_d[0][0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
616
23.7k
        tab_idx_2_d[0][1] = 0;
617
618
23.7k
        tab_idx_1_d[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ) ? 0 : 1;
619
23.7k
      }
620
23.7k
      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
23.7k
      if (in_data_1 != NULL) {
645
23.7k
        ixheaace_write_bits(pstr_bit_buf, lav_huff_val[lav_idx[0]], lav_huff_len[lav_idx[0]]);
646
23.7k
        error = ixheaace_mps_212_huff_enc_2_d(pstr_bit_buf, data_type, tab_idx_2_d[0], lav_idx[0],
647
23.7k
                                              pair_vec, num_band_short_data_1, 2, part_0_data_1,
648
23.7k
                                              &huff_bits);
649
23.7k
        if (error) {
650
0
          return error;
651
0
        }
652
23.7k
        if (df_rest_flag[0]) {
653
13.8k
          error = ixheaace_mps_212_huff_enc_1_d(pstr_bit_buf, data_type, tab_idx_1_d[0],
654
13.8k
                                                in_short_data_1 + num_band_short_data_1, 1, 0,
655
13.8k
                                                &huff_bits);
656
13.8k
          if (error) {
657
0
            return error;
658
0
          }
659
13.8k
        }
660
23.7k
      }
661
23.7k
      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
23.7k
    } 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
23.7k
  }
713
40.8k
  return IA_NO_ERROR;
714
40.8k
}
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
162k
                                         WORD32 *out_data_msb) {
719
162k
  WORD32 i = 0, val = 0, lsb = 0, msb = 0;
720
721
162k
  UWORD32 mask = (1 << num_lsb) - 1;
722
162k
  WORD32 no_lsb_bits = 0;
723
724
3.02M
  for (i = 0; i < num_val; i++) {
725
2.86M
    val = in_data[i] + offset;
726
727
2.86M
    lsb = val & mask;
728
2.86M
    msb = val >> num_lsb;
729
730
2.86M
    if (out_data_lsb != NULL) out_data_lsb[i] = lsb;
731
2.86M
    if (out_data_msb != NULL) out_data_msb[i] = msb;
732
733
2.86M
    no_lsb_bits += num_lsb;
734
2.86M
  }
735
736
162k
  return no_lsb_bits;
737
162k
}
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
162k
static VOID ixheaace_mps_515_calc_diff_freq(WORD32 *in_data, WORD32 *out_data, WORD32 num_val) {
750
162k
  WORD32 i = 0;
751
752
162k
  out_data[0] = in_data[0];
753
754
2.86M
  for (i = 1; i < num_val; i++) {
755
2.70M
    out_data[i] = in_data[i] - in_data[i - 1];
756
2.70M
  }
757
162k
}
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
162k
static WORD32 ixheaace_mps_515_calc_pcm_bits(WORD32 num_val, WORD32 n_levels) {
771
162k
  WORD32 num_complete_chunks = 0, rest_chunk_size = 0;
772
162k
  WORD32 max_grp_len = 0, bits_pcm = 0;
773
774
162k
  FLOAT32 num_ld_levels = 0.f;
775
776
162k
  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.8k
    case 8:
801
56.8k
    case 15:
802
56.8k
    case 26:
803
162k
    case 31:
804
162k
      max_grp_len = 1;
805
162k
      break;
806
0
    default:
807
0
      return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_LEVELS;
808
162k
  }
809
810
162k
  num_ld_levels = (FLOAT32)(log((FLOAT32)n_levels) / log(2.f));
811
812
162k
  num_complete_chunks = num_val / max_grp_len;
813
162k
  rest_chunk_size = num_val % max_grp_len;
814
815
162k
  bits_pcm = ((WORD32)ceil((FLOAT32)(max_grp_len)*num_ld_levels)) * num_complete_chunks;
816
162k
  bits_pcm += (WORD32)ceil((FLOAT32)(rest_chunk_size)*num_ld_levels);
817
818
162k
  return bits_pcm;
819
162k
}
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.7k
                                              WORD32 num_val, WORD32 n_levels) {
824
11.7k
  WORD32 i = 0, j = 0, idx = 0;
825
11.7k
  WORD32 max_grp_len = 1, grp_len = 0, next_val = 0, grp_val = 0;
826
827
11.7k
  FLOAT32 num_ld_levels = 0.f;
828
829
11.7k
  UWORD8 pcm_block_size[7] = {0};
830
11.7k
  switch (n_levels) {
831
0
    case 4:
832
0
      num_ld_levels = 2.00000000f;
833
0
      break;
834
3.50k
    case 8:
835
3.50k
      num_ld_levels = 3.00000000f;
836
3.50k
      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.23k
    case 31:
844
8.23k
      num_ld_levels = 4.95419645f;
845
8.23k
      break;
846
0
    case 51:
847
0
      max_grp_len = 4;
848
0
      num_ld_levels = 5.67242534f;
849
0
      break;
850
11.7k
  }
851
852
23.4k
  for (i = 1; i <= max_grp_len; i++) {
853
11.7k
    pcm_block_size[i] = (UWORD8)ceil((FLOAT32)(i)*num_ld_levels);
854
11.7k
  }
855
856
99.4k
  for (i = 0; i < num_val; i += max_grp_len) {
857
87.7k
    grp_len = MIN(max_grp_len, num_val - i);
858
87.7k
    grp_val = 0;
859
175k
    for (j = 0; j < grp_len; j++) {
860
87.7k
      idx = i + j;
861
87.7k
      next_val = (in_data_2 == NULL)
862
87.7k
                     ? in_data_1[idx]
863
87.7k
                     : (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
87.7k
      grp_val = grp_val * n_levels + next_val + offset;
867
87.7k
    }
868
869
87.7k
    ixheaace_write_bits(pstr_bit_buf, grp_val, pcm_block_size[grp_len]);
870
87.7k
  }
871
11.7k
}
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
210k
    WORD32 p0_flag) {
877
210k
  WORD32 i = 0, id = 0;
878
210k
  WORD32 huff_bits = 0;
879
210k
  WORD32 offset = 0;
880
210k
  if (p0_flag) {
881
210k
    huff_bits += pstr_huff_cld_tab_pt0->length[in_data[0]];
882
210k
    offset = 1;
883
210k
  }
884
885
3.45M
  for (i = offset; i < num_val; i++) {
886
3.24M
    id = in_data[i];
887
888
3.24M
    if (id != 0) {
889
364k
      if (id < 0) {
890
184k
        id = -id;
891
184k
      }
892
364k
      huff_bits += 1;
893
364k
    }
894
895
3.24M
    huff_bits += pstr_huff_cld_tab_diff->length[id];
896
3.24M
  }
897
898
210k
  return huff_bits;
899
210k
}
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
113k
    WORD32 p0_flag) {
905
113k
  WORD32 i = 0, id = 0;
906
113k
  WORD32 huff_bits = 0;
907
113k
  WORD32 offset = 0;
908
909
113k
  if (p0_flag) {
910
113k
    huff_bits += pstr_huff_icc_tab_pt0->length[in_data[0]];
911
113k
    offset = 1;
912
113k
  }
913
914
2.27M
  for (i = offset; i < num_val; i++) {
915
2.15M
    id = in_data[i];
916
917
2.15M
    if (id != 0) {
918
210k
      if (id < 0) {
919
79.3k
        id = -id;
920
79.3k
      }
921
210k
      huff_bits += 1;
922
210k
    }
923
924
2.15M
    huff_bits += pstr_huff_icc_tab_diff->length[id];
925
2.15M
  }
926
927
113k
  return huff_bits;
928
113k
}
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
97.1k
    WORD32 p0_flag) {
964
97.1k
  WORD32 i = 0, id = 0, id_sign = 0;
965
97.1k
  WORD32 offset = 0;
966
967
97.1k
  if (p0_flag) {
968
97.1k
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_cld_tab_pt0->value[in_data[0]],
969
97.1k
                        pstr_huff_cld_tab_pt0->length[in_data[0]]);
970
97.1k
    offset = 1;
971
97.1k
  }
972
973
1.71M
  for (i = offset; i < num_val; i++) {
974
1.61M
    id = in_data[i];
975
976
1.61M
    if (id != 0) {
977
180k
      id_sign = 0;
978
180k
      if (id < 0) {
979
91.1k
        id = -id;
980
91.1k
        id_sign = 1;
981
91.1k
      }
982
180k
    }
983
984
1.61M
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_cld_tab_diff->value[id],
985
1.61M
                        pstr_huff_cld_tab_diff->length[id]);
986
987
1.61M
    if (id != 0) {
988
180k
      ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
989
180k
    }
990
1.61M
  }
991
97.1k
}
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
53.3k
    WORD32 p0_flag) {
998
53.3k
  WORD32 i = 0, id = 0, id_sign = 0;
999
53.3k
  WORD32 offset = 0;
1000
1001
53.3k
  if (p0_flag) {
1002
53.3k
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_icc_tab_pt0->value[in_data[0]],
1003
53.3k
                        pstr_huff_icc_tab_pt0->length[in_data[0]]);
1004
53.3k
    offset = 1;
1005
53.3k
  }
1006
1007
1.06M
  for (i = offset; i < num_val; i++) {
1008
1.01M
    id = in_data[i];
1009
1010
1.01M
    if (id != 0) {
1011
61.4k
      id_sign = 0;
1012
61.4k
      if (id < 0) {
1013
21.6k
        id = -id;
1014
21.6k
        id_sign = 1;
1015
21.6k
      }
1016
61.4k
    }
1017
1018
1.01M
    ixheaace_write_bits(pstr_bit_buf, pstr_huff_icc_tab_diff->value[id],
1019
1.01M
                        pstr_huff_icc_tab_diff->length[id]);
1020
1021
1.01M
    if (id != 0) {
1022
61.4k
      ixheaace_write_bits(pstr_bit_buf, id_sign, 1);
1023
61.4k
    }
1024
1.01M
  }
1025
53.3k
}
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
324k
                                              WORD32 diff_type_2, WORD32 num_val) {
1064
324k
  WORD32 p0_flag[2];
1065
1066
324k
  WORD32 offset_1 = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
1067
324k
  WORD32 offset_2 = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) ? 1 : 0;
1068
1069
324k
  WORD32 bit_count_huff = 0;
1070
1071
324k
  WORD32 num_val_1_int = 0;
1072
324k
  WORD32 num_val_2_int = 0;
1073
1074
324k
  WORD32 *in_data_1_int = in_data_1 + offset_1;
1075
324k
  WORD32 *in_data_2_int = in_data_2 + offset_2;
1076
1077
324k
  bit_count_huff = 1;
1078
1079
324k
  num_val_1_int = num_val;
1080
324k
  num_val_2_int = num_val;
1081
1082
324k
  p0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1083
324k
  p0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1084
1085
324k
  switch (data_type) {
1086
210k
    case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1087
210k
      if (in_data_1 != NULL)
1088
210k
        bit_count_huff +=
1089
210k
            ixheaace_mps_515_count_huff_cld(&ixheaace_mps_515_huff_cld_tab.huff_pt0,
1090
210k
                                            &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_1],
1091
210k
                                            in_data_1_int, num_val_1_int, p0_flag[0]);
1092
210k
      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
210k
      break;
1098
1099
113k
    case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1100
113k
      if (in_data_1 != NULL)
1101
113k
        bit_count_huff +=
1102
113k
            ixheaace_mps_515_count_huff_icc(&ixheaace_mps_515_huff_icc_tab.huff_pt0,
1103
113k
                                            &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_1],
1104
113k
                                            in_data_1_int, num_val_1_int, p0_flag[0]);
1105
113k
      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
113k
      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
324k
  }
1128
1129
324k
  return bit_count_huff;
1130
324k
}
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
150k
                                               WORD32 diff_type_2, WORD32 num_val) {
1136
150k
  WORD32 p0_flag[2];
1137
1138
150k
  WORD32 num_val_1_int = num_val;
1139
150k
  WORD32 num_val_2_int = num_val;
1140
1141
150k
  WORD32 *in_data_1_int = in_data_1;
1142
150k
  WORD32 *in_data_2_int = in_data_2;
1143
1144
150k
  if (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_TIME) in_data_1_int += 1;
1145
150k
  if (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_TIME) in_data_2_int += 1;
1146
1147
150k
  ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_HUFF_1D, 1);
1148
1149
150k
  p0_flag[0] = (diff_type_1 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1150
150k
  p0_flag[1] = (diff_type_2 == IXHEAACE_MPS_SAC_DIFF_FREQ);
1151
1152
150k
  switch (data_type) {
1153
97.1k
    case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1154
97.1k
      if (in_data_1 != NULL)
1155
97.1k
        ixheaace_mps_515_huff_enc_cld(pstr_bit_buf, &ixheaace_mps_515_huff_cld_tab.huff_pt0,
1156
97.1k
                                      &ixheaace_mps_515_huff_cld_tab.huff_diff[diff_type_1],
1157
97.1k
                                      in_data_1_int, num_val_1_int, p0_flag[0]);
1158
97.1k
      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
97.1k
      break;
1163
1164
53.3k
    case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1165
53.3k
      if (in_data_1 != NULL)
1166
53.3k
        ixheaace_mps_515_huff_enc_icc(pstr_bit_buf, &ixheaace_mps_515_huff_icc_tab.huff_pt0,
1167
53.3k
                                      &ixheaace_mps_515_huff_icc_tab.huff_diff[diff_type_1],
1168
53.3k
                                      in_data_1_int, num_val_1_int, p0_flag[0]);
1169
53.3k
      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
53.3k
      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
150k
  }
1189
150k
}
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
44.1k
    const WORD32 coarse_flag, const WORD32 independency_flag) {
1436
44.1k
  IA_ERRORCODE error;
1437
44.1k
  WORD16 band = 0;
1438
44.1k
  WORD16 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1439
44.1k
  WORD16 pcm_coding_flag = 0;
1440
44.1k
  WORD16 min_bits_all = 0;
1441
44.1k
  WORD16 min_found = 0;
1442
44.1k
  WORD16 huff_dim_df = 0;
1443
44.1k
  WORD16 huff_pair_type_df = 0;
1444
44.1k
  WORD16 huff_dim_dt = 0;
1445
44.1k
  WORD16 huff_pair_type_dt = 0;
1446
44.1k
  WORD16 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1447
44.1k
  WORD16 num_pcm_bits = -1;
1448
44.1k
  WORD16 min_bits_df = -1;
1449
44.1k
  WORD16 min_bits_dt = -1;
1450
1451
44.1k
  WORD16 quant_data_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1452
44.1k
  WORD16 quant_data_hist_msb[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1453
44.1k
  WORD16 data_diff_freq[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS] = {0};
1454
44.1k
  WORD16 data_diff_time[IXHEAACE_MPS_SAC_MAX_FREQ_BANDS + 2] = {0};
1455
44.1k
  WORD16 *p_quant_data_msb;
1456
44.1k
  WORD16 *p_quant_data_hist_msb = NULL;
1457
44.1k
  WORD16 lav_df[2] = {-1, -1};
1458
44.1k
  WORD16 lav_dt[2] = {-1, -1};
1459
1460
44.1k
  if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_ICC) {
1461
21.8k
    if (coarse_flag) {
1462
0
      quant_levels = 4;
1463
0
      quant_offset = 0;
1464
21.8k
    } else {
1465
21.8k
      quant_levels = 8;
1466
21.8k
      quant_offset = 0;
1467
21.8k
    }
1468
22.3k
  } else if (data_type == IXHEAACE_MPS_SAC_DATA_TYPE_CLD) {
1469
22.3k
    if (coarse_flag) {
1470
0
      quant_levels = 15;
1471
0
      quant_offset = 7;
1472
22.3k
    } else {
1473
22.3k
      quant_levels = 31;
1474
22.3k
      quant_offset = 15;
1475
22.3k
    }
1476
22.3k
  } else {
1477
0
    return IA_EXHEAACE_EXE_FATAL_MPS_INVALID_HUFF_DATA_TYPE;
1478
0
  }
1479
44.1k
  if (quant_offset != 0) {
1480
620k
    for (band = 0; band < data_bands; band++) {
1481
597k
      quant_data_msb[band] = pp_in_data[set_idx][start_band + band] + quant_offset;
1482
597k
    }
1483
22.3k
    p_quant_data_msb = quant_data_msb;
1484
22.3k
  } else {
1485
21.8k
    p_quant_data_msb = pp_in_data[set_idx] + start_band;
1486
21.8k
  }
1487
1488
44.1k
  if (allow_diff_time_back_flag) {
1489
30.8k
    if (quant_offset != 0) {
1490
435k
      for (band = 0; band < data_bands; band++) {
1491
419k
        quant_data_hist_msb[band] = p_in_data[start_band + band] + quant_offset;
1492
419k
      }
1493
15.6k
      p_quant_data_hist_msb = quant_data_hist_msb;
1494
15.6k
    } else {
1495
15.1k
      p_quant_data_hist_msb = p_in_data + start_band;
1496
15.1k
    }
1497
30.8k
  }
1498
1499
44.1k
  data_diff_freq[0] = p_quant_data_msb[0];
1500
1501
1.18M
  for (band = 1; band < data_bands; band++) {
1502
1.13M
    data_diff_freq[band] = p_quant_data_msb[band] - p_quant_data_msb[band - 1];
1503
1.13M
  }
1504
1505
44.1k
  if (allow_diff_time_back_flag) {
1506
30.8k
    data_diff_time[0] = p_quant_data_msb[0];
1507
30.8k
    data_diff_time[1] = p_quant_data_hist_msb[0];
1508
1509
855k
    for (band = 0; band < data_bands; band++) {
1510
824k
      data_diff_time[band + 2] = p_quant_data_msb[band] - p_quant_data_hist_msb[band];
1511
824k
    }
1512
30.8k
  }
1513
1514
44.1k
  num_pcm_bits = ixheaace_mps_212_calc_pcm_bits(data_bands, quant_levels);
1515
44.1k
  num_pcm_val = data_bands;
1516
44.1k
  min_bits_all = num_pcm_bits;
1517
1518
44.1k
  error = ixheaace_mps_212_calc_huff_bits(
1519
44.1k
      data_diff_freq, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_FREQ, IXHEAACE_MPS_SAC_DIFF_FREQ,
1520
44.1k
      data_bands, lav_df, &min_bits_df, &huff_dim_df, &huff_pair_type_df);
1521
44.1k
  if (error) {
1522
0
    return error;
1523
0
  }
1524
1525
44.1k
  if (allow_diff_time_back_flag) min_bits_df += 1;
1526
1527
44.1k
  if (min_bits_df < min_bits_all) {
1528
38.1k
    min_bits_all = min_bits_df;
1529
38.1k
  }
1530
44.1k
  if (allow_diff_time_back_flag) {
1531
30.8k
    error = ixheaace_mps_212_calc_huff_bits(
1532
30.8k
        data_diff_time, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_TIME, IXHEAACE_MPS_SAC_DIFF_TIME,
1533
30.8k
        data_bands, lav_dt, &min_bits_dt, &huff_dim_dt, &huff_pair_type_dt);
1534
30.8k
    if (error) {
1535
0
      return error;
1536
0
    }
1537
1538
30.8k
    min_bits_dt += 1;
1539
1540
30.8k
    if (min_bits_dt < min_bits_all) {
1541
11.2k
      min_bits_all = min_bits_dt;
1542
11.2k
    }
1543
30.8k
  }
1544
44.1k
  pcm_coding_flag = (min_bits_all == num_pcm_bits);
1545
1546
44.1k
  ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1547
1548
44.1k
  if (pcm_coding_flag) {
1549
3.37k
    ixheaace_mps_212_apply_pcm_coding(pstr_bit_buf, pp_in_data[set_idx] + start_band, NULL,
1550
3.37k
                                      quant_offset, num_pcm_val, quant_levels);
1551
40.8k
  } else {
1552
40.8k
    min_found = 0;
1553
40.8k
    if (min_bits_all == min_bits_df) {
1554
29.5k
      if (allow_diff_time_back_flag) {
1555
17.8k
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1556
17.8k
      }
1557
1558
29.5k
      error = ixheaace_mps_212_apply_huff_coding(
1559
29.5k
          pstr_bit_buf, data_diff_freq, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1560
29.5k
          IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands, lav_df, huff_dim_df, huff_pair_type_df);
1561
29.5k
      if (error) {
1562
0
        return error;
1563
0
      }
1564
29.5k
      min_found = 1;
1565
29.5k
    }
1566
1567
40.8k
    if (allow_diff_time_back_flag) {
1568
29.0k
      if (!min_found && (min_bits_all == min_bits_dt)) {
1569
11.2k
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_TIME, 1);
1570
1571
11.2k
        error = ixheaace_mps_212_apply_huff_coding(
1572
11.2k
            pstr_bit_buf, data_diff_time, NULL, data_type, IXHEAACE_MPS_SAC_DIFF_TIME,
1573
11.2k
            IXHEAACE_MPS_SAC_DIFF_TIME, data_bands, lav_dt, huff_dim_dt, huff_pair_type_dt);
1574
11.2k
        if (error) {
1575
0
          return error;
1576
0
        }
1577
11.2k
      }
1578
29.0k
    }
1579
40.8k
  }
1580
1581
44.1k
  return IA_NO_ERROR;
1582
44.1k
}
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
162k
                                         WORD32 independency_flag) {
1590
162k
  WORD32 dummy = 0;
1591
162k
  WORD32 quant_levels = 0, quant_offset = 0, num_pcm_val = 0;
1592
1593
162k
  WORD32 split_lsb_flag = 0;
1594
162k
  WORD32 pcm_coding_flag = 0;
1595
1596
162k
  WORD32 min_bits_df_df = -1;
1597
162k
  WORD32 min_bits_df_dt = -1;
1598
162k
  WORD32 min_bits_dtbw_df = -1;
1599
162k
  WORD32 min_bits_dtfw_df = -1;
1600
1601
162k
  WORD32 min_bits_dt_dt = -1;
1602
162k
  WORD32 allow_diff_time_back_flag = !independency_flag || (set_idx > 0);
1603
1604
162k
  WORD32 num_lsb_bits[2] = {0, 0};
1605
162k
  WORD32 num_pcm_bits = 0;
1606
1607
162k
  WORD32 a_data_hist[MAXBANDS] = {0};
1608
162k
  WORD32 aa_data_pair[2][MAXBANDS] = {{0}};
1609
1610
162k
  WORD32 quant_data_lsb[2][MAXBANDS] = {{0}};
1611
162k
  WORD32 quant_data_msb[2][MAXBANDS] = {{0}};
1612
1613
162k
  WORD32 quant_data_hist_lsb[MAXBANDS] = {0};
1614
162k
  WORD32 quant_data_hist_msb[MAXBANDS] = {0};
1615
1616
162k
  WORD32 data_diff_freq[2][MAXBANDS] = {{0}};
1617
162k
  WORD32 data_diff_time_bw[2][MAXBANDS + 1] = {{0}};
1618
162k
  WORD32 data_diff_time_fw[MAXBANDS + 1] = {0};
1619
1620
162k
  WORD32 *p_data_pcm[2] = {NULL};
1621
162k
  WORD32 *p_data_diff_freq[2] = {NULL};
1622
162k
  WORD32 *p_data_diff_time_bw[2] = {NULL};
1623
162k
  WORD32 *p_data_diff_time_fw = NULL;
1624
1625
162k
  WORD32 min_bits_all = 0;
1626
162k
  WORD32 min_found = 0;
1627
1628
162k
  switch (data_type) {
1629
105k
    case IXHEAACE_MPS_SAC_DATA_TYPE_CLD:
1630
105k
      if (coarse_flag) {
1631
0
        split_lsb_flag = 0;
1632
0
        quant_levels = 15;
1633
0
        quant_offset = 7;
1634
105k
      } else {
1635
105k
        split_lsb_flag = 0;
1636
105k
        quant_levels = 31;
1637
105k
        quant_offset = 15;
1638
105k
      }
1639
1640
105k
      break;
1641
1642
56.8k
    case IXHEAACE_MPS_SAC_DATA_TYPE_ICC:
1643
56.8k
      if (coarse_flag) {
1644
0
        split_lsb_flag = 0;
1645
0
        quant_levels = 4;
1646
0
        quant_offset = 0;
1647
56.8k
      } else {
1648
56.8k
        split_lsb_flag = 0;
1649
56.8k
        quant_levels = 8;
1650
56.8k
        quant_offset = 0;
1651
56.8k
      }
1652
1653
56.8k
      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
162k
  }
1671
1672
162k
  memcpy(a_data_hist, p_in_data + start_band, sizeof(WORD32) * data_bands);
1673
1674
162k
  memcpy(aa_data_pair[0], pp_in_data[set_idx] + start_band, sizeof(int) * data_bands);
1675
162k
  p_data_pcm[0] = aa_data_pair[0];
1676
162k
  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
162k
  num_lsb_bits[0] =
1682
162k
      ixheaace_mps_515_split_lsb(aa_data_pair[0], quant_offset, split_lsb_flag ? 1 : 0,
1683
162k
                                 data_bands, quant_data_lsb[0], quant_data_msb[0]);
1684
1685
162k
  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
162k
  (VOID) num_lsb_bits;
1691
162k
  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
162k
  ixheaace_mps_515_calc_diff_freq(quant_data_msb[0], data_diff_freq[0], data_bands);
1698
162k
  p_data_diff_freq[0] = data_diff_freq[0];
1699
1700
162k
  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
162k
  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
162k
  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
162k
  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
162k
  } else {
1727
162k
    num_pcm_bits = ixheaace_mps_515_calc_pcm_bits(data_bands, quant_levels);
1728
162k
    num_pcm_val = data_bands;
1729
162k
  }
1730
1731
162k
  min_bits_all = num_pcm_bits;
1732
1733
162k
  if ((p_data_diff_freq[0] != NULL) || (p_data_diff_freq[1] != NULL)) {
1734
162k
    min_bits_df_df = ixheaace_mps_515_calc_huff_bits(p_data_diff_freq[0], p_data_diff_freq[1],
1735
162k
                                                     data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1736
162k
                                                     IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1737
1738
162k
    if (pair_flag || allow_diff_time_back_flag) min_bits_df_df += 1;
1739
162k
    if (pair_flag) min_bits_df_df += 1;
1740
1741
162k
    if (min_bits_df_df < min_bits_all) {
1742
150k
      min_bits_all = min_bits_df_df;
1743
150k
    }
1744
162k
  }
1745
1746
162k
  if ((p_data_diff_freq[0] != NULL) || (p_data_diff_time_bw[1] != NULL)) {
1747
162k
    min_bits_df_dt = ixheaace_mps_515_calc_huff_bits(p_data_diff_freq[0], p_data_diff_time_bw[1],
1748
162k
                                                     data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1749
162k
                                                     IXHEAACE_MPS_SAC_DIFF_TIME, data_bands);
1750
1751
162k
    if (pair_flag || allow_diff_time_back_flag) min_bits_df_dt += 1;
1752
162k
    if (pair_flag) min_bits_df_dt += 1;
1753
1754
162k
    if (min_bits_df_dt < min_bits_all) {
1755
0
      min_bits_all = min_bits_df_dt;
1756
0
    }
1757
162k
  }
1758
1759
162k
  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
162k
  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
162k
  pcm_coding_flag = (min_bits_all == num_pcm_bits);
1807
1808
162k
  ixheaace_write_bits(pstr_bit_buf, pcm_coding_flag, 1);
1809
1810
162k
  if (pcm_coding_flag) {
1811
11.7k
    if (data_bands >= PBC_MIN_BANDS) {
1812
3.57k
      ixheaace_write_bits(pstr_bit_buf, 0, 1);
1813
3.57k
    }
1814
1815
11.7k
    ixheaace_mps_515_apply_pcm_coding(pstr_bit_buf, p_data_pcm[0], p_data_pcm[1], quant_offset,
1816
11.7k
                                      num_pcm_val, quant_levels);
1817
150k
  } else {
1818
150k
    min_found = 0;
1819
1820
150k
    if (min_bits_all == min_bits_df_df) {
1821
150k
      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
150k
      if (pair_flag) {
1826
0
        ixheaace_write_bits(pstr_bit_buf, IXHEAACE_MPS_SAC_DIFF_FREQ, 1);
1827
0
      }
1828
1829
150k
      ixheaace_mps_515_apply_huff_coding(pstr_bit_buf, p_data_diff_freq[0], p_data_diff_freq[1],
1830
150k
                                         data_type, IXHEAACE_MPS_SAC_DIFF_FREQ,
1831
150k
                                         IXHEAACE_MPS_SAC_DIFF_FREQ, data_bands);
1832
1833
150k
      min_found = 1;
1834
150k
    }
1835
1836
150k
    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
150k
    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
150k
    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
150k
    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
150k
  }
1912
1913
162k
  return;
1914
162k
}