Coverage Report

Created: 2025-09-17 07:02

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