Coverage Report

Created: 2025-10-27 06:23

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libxaac/decoder/ixheaacd_ld_mps_config.c
Line
Count
Source
1
/******************************************************************************
2
*                                                                            *
3
* Copyright (C) 2018 The Android Open Source Project
4
*
5
* Licensed under the Apache License, Version 2.0 (the "License");
6
* you may not use this file except in compliance with the License.
7
* You may obtain a copy of the License at:
8
*
9
* http://www.apache.org/licenses/LICENSE-2.0
10
*
11
* Unless required by applicable law or agreed to in writing, software
12
* distributed under the License is distributed on an "AS IS" BASIS,
13
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
* See the License for the specific language governing permissions and
15
* limitations under the License.
16
*
17
*****************************************************************************
18
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19
*/
20
#include "ixheaac_type_def.h"
21
#include "ixheaac_constants.h"
22
#include "ixheaac_error_standards.h"
23
24
#include "ixheaacd_bitbuffer.h"
25
#include "ixheaacd_config.h"
26
27
#include <assert.h>
28
29
#ifndef sign
30
#define sign(a) (((a) > 0) ? 1 : ((a) < 0) ? -1 : 0)
31
#endif
32
33
typedef struct {
34
  WORD32 num_input_chan;
35
  WORD32 num_output_chan;
36
  WORD32 num_ott_boxes;
37
  WORD32 num_ttt_boxes;
38
  WORD32 ott_mode_lfe[MAX_NUM_OTT];
39
} ia_ld_mps_dec_tree_properties_struct;
40
41
static WORD32 ixheaacd_freq_res_table[] = {0, 23, 15, 12, 9, 7, 5, 4};
42
43
static WORD32 ixheaacd_hrtf_freq_res_table[][8] = {{0, 28, 20, 14, 10, 7, 5, 4},
44
                                          {0, 13, 13, 8, 7, 4, 3, 3}};
45
46
static ia_ld_mps_dec_tree_properties_struct ixheaacd_tree_property_table[] = {
47
    {1, 6, 5, 0, {0, 0, 0, 0, 1}}, {1, 6, 5, 0, {0, 0, 1, 0, 0}}, {2, 6, 3, 1, {1, 0, 0, 0, 0}},
48
    {2, 8, 5, 1, {1, 0, 0, 0, 0}}, {2, 8, 5, 1, {1, 0, 0, 0, 0}}, {6, 8, 2, 0, {0, 0, 0, 0, 0}},
49
    {6, 8, 2, 0, {0, 0, 0, 0, 0}}, {1, 2, 1, 0, {0, 0, 0, 0, 0}}};
50
51
static IA_ERRORCODE ixheaacd_ld_spatial_extension_config(
52
    ia_bit_buf_struct *it_bit_buff, ia_usac_dec_mps_config_struct *config,
53
1.46k
    WORD32 bits_available) {
54
1.46k
  WORD32 j, ch, idx, tmp, tmp_open, sac_ext_len, bits_read, n_fill_bits;
55
1.46k
  UWORD32 i;
56
1.46k
  WORD32 ba = bits_available;
57
58
1.46k
  config->sac_ext_cnt = 0;
59
60
1.46k
  tmp = it_bit_buff->cnt_bits;
61
62
10.1k
  while (ba >= 8) {
63
8.74k
    if (config->sac_ext_cnt >= MAX_NUM_EXT_TYPES) return IA_FATAL_ERROR;
64
65
8.74k
    config->bs_sac_ext_type[config->sac_ext_cnt] =
66
8.74k
        ixheaacd_read_bits_buf(it_bit_buff, 4);
67
8.74k
    ba -= 4;
68
69
8.74k
    sac_ext_len = ixheaacd_read_bits_buf(it_bit_buff, 4);
70
8.74k
    ba -= 4;
71
72
8.74k
    if ((ba >= 6) && (sac_ext_len > 0)) {
73
5.38k
      if (sac_ext_len == 15) {
74
2.86k
        sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 8);
75
2.86k
        ba -= 8;
76
2.86k
        if (sac_ext_len == 15 + 255) {
77
968
          sac_ext_len += ixheaacd_read_bits_buf(it_bit_buff, 16);
78
968
          ba -= 16;
79
968
        }
80
2.86k
      }
81
82
5.38k
      switch (config->bs_sac_ext_type[config->sac_ext_cnt]) {
83
57
        case 0:
84
57
          config->bs_residual_coding = 1;
85
86
57
          config->bs_residual_sampling_freq_index =
87
57
              ixheaacd_read_bits_buf(it_bit_buff, 4);
88
57
          if (config->bs_residual_sampling_freq_index > MAX_RES_SAMP_FREQ_IDX) {
89
2
            return IA_FATAL_ERROR;
90
2
          }
91
55
          config->bs_residual_frames_per_spatial_frame =
92
55
              ixheaacd_read_bits_buf(it_bit_buff, 2);
93
94
55
          if ((config->num_ott_boxes + config->num_ttt_boxes) >
95
55
              MAX_RESIDUAL_CHANNELS)
96
3
            return IA_FATAL_ERROR;
97
126
          for (j = 0; j < config->num_ott_boxes + config->num_ttt_boxes; j++) {
98
75
            config->bs_residual_present[j] =
99
75
                ixheaacd_read_bits_buf(it_bit_buff, 1);
100
75
            if (config->bs_residual_present[j]) {
101
32
              config->bs_residual_bands_ld_mps[j] =
102
32
                  ixheaacd_read_bits_buf(it_bit_buff, 5);
103
32
              if (config->bs_residual_bands_ld_mps[j] > MAX_PARAMETER_BANDS)
104
1
              {
105
1
                return IA_FATAL_ERROR;
106
1
              }
107
32
            }
108
75
          }
109
51
          break;
110
111
65
        case 1:
112
65
          config->bs_arbitrary_downmix = 2;
113
114
65
          config->bs_arbitrary_downmix_residual_sampling_freq_index =
115
65
              ixheaacd_read_bits_buf(it_bit_buff, 4);
116
65
          if (config->bs_arbitrary_downmix_residual_sampling_freq_index > MAX_RES_SAMP_FREQ_IDX) {
117
1
            return IA_FATAL_ERROR;
118
1
          }
119
64
          config->bs_arbitrary_downmix_residual_frames_per_spatial_frame =
120
64
              ixheaacd_read_bits_buf(it_bit_buff, 2);
121
64
          config->bs_arbitrary_downmix_residual_bands =
122
64
              ixheaacd_read_bits_buf(it_bit_buff, 5);
123
64
          if (config->bs_arbitrary_downmix_residual_bands >=
124
64
              ixheaacd_freq_res_table[config->bs_freq_res]) {
125
4
            return IA_FATAL_ERROR;
126
4
          }
127
128
60
          break;
129
130
259
        case 2:
131
259
          config->num_out_chan_AT = 0;
132
259
          config->num_ott_boxes_AT = 0;
133
259
          if (config->num_output_channels > MAX_OUTPUT_CHANNELS)
134
1
            return IA_FATAL_ERROR;
135
1.60k
          for (ch = 0; ch < config->num_output_channels; ch++) {
136
1.34k
            tmp_open = 1;
137
1.34k
            idx = 0;
138
5.72k
            while ((tmp_open > 0) && (idx < MAX_ARBITRARY_TREE_INDEX)) {
139
4.37k
              config->bs_ott_box_present_AT[ch][idx] =
140
4.37k
                  ixheaacd_read_bits_buf(it_bit_buff, 1);
141
4.37k
              if (config->bs_ott_box_present_AT[ch][idx]) {
142
3.11k
                config->num_ott_boxes_AT++;
143
3.11k
                tmp_open++;
144
3.11k
              } else {
145
1.26k
                config->num_out_chan_AT++;
146
1.26k
                tmp_open--;
147
1.26k
              }
148
4.37k
              idx++;
149
4.37k
            }
150
1.34k
          }
151
152
3.26k
          for (i = 0; i < config->num_ott_boxes_AT; i++) {
153
3.00k
            config->bs_ott_default_cld_AT[i] =
154
3.00k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
155
3.00k
            config->bs_ott_mode_lfe_AT[i] =
156
3.00k
                ixheaacd_read_bits_buf(it_bit_buff, 1);
157
3.00k
            if (config->bs_ott_mode_lfe_AT[i]) {
158
1.22k
              config->bs_ott_bands_AT[i] =
159
1.22k
                  ixheaacd_read_bits_buf(it_bit_buff, 5);
160
1.77k
            } else {
161
1.77k
              config->bs_ott_bands_AT[i] = ixheaacd_freq_res_table[config->bs_freq_res];
162
1.77k
            }
163
3.00k
          }
164
165
1.43k
          for (i = 0; i < config->num_out_chan_AT; i++) {
166
1.17k
            config->bs_output_channel_pos_AT[i] =
167
1.17k
                ixheaacd_read_bits_buf(it_bit_buff, 5);
168
1.17k
          }
169
170
258
          break;
171
172
4.99k
        default:;
173
5.38k
      }
174
5.38k
    }
175
176
8.70k
    bits_read = tmp - it_bit_buff->cnt_bits;
177
8.70k
    n_fill_bits = 8 * sac_ext_len - bits_read;
178
179
1.78M
    while (n_fill_bits > 7) {
180
1.77M
      ixheaacd_read_bits_buf(it_bit_buff, 8);
181
1.77M
      n_fill_bits -= 8;
182
1.77M
    }
183
8.70k
    if (n_fill_bits > 0) {
184
236
      ixheaacd_read_bits_buf(it_bit_buff, n_fill_bits);
185
236
    }
186
187
8.70k
    ba -= 8 * sac_ext_len;
188
8.70k
    config->sac_ext_cnt++;
189
8.70k
  }
190
1.41k
  return IA_NO_ERROR;
191
1.46k
}
192
193
IA_ERRORCODE ixheaacd_ld_spatial_specific_config(
194
1.52k
    ia_usac_dec_mps_config_struct *config, ia_bit_buf_struct *it_bit_buff) {
195
1.52k
  WORD32 i, num_header_bits;
196
1.52k
  UWORD32 hc, hb;
197
1.52k
  WORD32 sac_header_len;
198
1.52k
  WORD32 bits_available;
199
1.52k
  WORD32 tmp = it_bit_buff->cnt_bits;
200
1.52k
  WORD32 err = 0;
201
202
1.52k
  sac_header_len = tmp;
203
204
1.52k
  bits_available = sac_header_len;
205
1.52k
  config->bs_sampling_freq_index = ixheaacd_read_bits_buf(it_bit_buff, 4);
206
1.52k
  if (config->bs_sampling_freq_index == 15) {
207
25
    config->bs_fampling_frequency = ixheaacd_read_bits_buf(it_bit_buff, 24);
208
25
  }
209
210
1.52k
  config->bs_frame_length = ixheaacd_read_bits_buf(it_bit_buff, 5);
211
1.52k
  config->bs_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3);
212
1.52k
  config->bs_tree_config = ixheaacd_read_bits_buf(it_bit_buff, 4);
213
214
1.52k
  if (config->bs_tree_config > 7) return IA_FATAL_ERROR;
215
216
1.52k
  if (config->bs_tree_config != 15) {
217
1.52k
    config->num_ott_boxes =
218
1.52k
        ixheaacd_tree_property_table[config->bs_tree_config].num_ott_boxes;
219
1.52k
    config->num_ttt_boxes =
220
1.52k
        ixheaacd_tree_property_table[config->bs_tree_config].num_ttt_boxes;
221
1.52k
    config->num_input_channels =
222
1.52k
        ixheaacd_tree_property_table[config->bs_tree_config].num_input_chan;
223
1.52k
    config->num_output_channels =
224
1.52k
        ixheaacd_tree_property_table[config->bs_tree_config].num_output_chan;
225
9.14k
    for (i = 0; i < MAX_NUM_OTT; i++) {
226
7.62k
      config->ott_mode_lfe[i] =
227
7.62k
          ixheaacd_tree_property_table[config->bs_tree_config].ott_mode_lfe[i];
228
7.62k
    }
229
1.52k
  }
230
1.52k
  config->bs_quant_mode = ixheaacd_read_bits_buf(it_bit_buff, 2);
231
1.52k
  if (config->bs_tree_config != 7) {
232
1.25k
    config->bs_one_icc = ixheaacd_read_bits_buf(it_bit_buff, 1);
233
1.25k
  }
234
1.52k
  config->bs_arbitrary_downmix = ixheaacd_read_bits_buf(it_bit_buff, 1);
235
1.52k
  if (config->bs_tree_config != 7) {
236
1.25k
    config->bs_fixed_gain_sur = ixheaacd_read_bits_buf(it_bit_buff, 3);
237
1.25k
    config->bs_fixed_gain_LFE = ixheaacd_read_bits_buf(it_bit_buff, 3);
238
1.25k
  }
239
1.52k
  config->bs_fixed_gain_dmx = ixheaacd_read_bits_buf(it_bit_buff, 3);
240
1.52k
  if (config->bs_tree_config != 7) {
241
1.25k
    config->bs_matrix_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
242
1.25k
  }
243
1.52k
  config->bs_temp_shape_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
244
1.52k
  config->bs_decorr_config = ixheaacd_read_bits_buf(it_bit_buff, 2);
245
1.52k
  if (config->bs_tree_config != 7) {
246
1.25k
    config->bs_3D_audio_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
247
1.25k
  } else {
248
277
    config->bs_3D_audio_mode = 0;
249
277
  }
250
251
  // ott_config
252
6.35k
  for (i = 0; i < config->num_ott_boxes; i++) {
253
4.83k
    if (config->ott_mode_lfe[i]) {
254
829
      config->bs_ott_bands[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
255
4.00k
    } else {
256
4.00k
      config->bs_ott_bands[i] = ixheaacd_freq_res_table[config->bs_freq_res];
257
4.00k
    }
258
4.83k
  }
259
260
  // ttt_config
261
1.75k
  for (i = 0; i < config->num_ttt_boxes; i++) {
262
225
    config->bs_ttt_dual_mode[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
263
225
    config->bs_ttt_mode_low[i] = ixheaacd_read_bits_buf(it_bit_buff, 3);
264
225
    if (config->bs_ttt_dual_mode[i]) {
265
15
      config->bs_ttt_mode_high[i] = ixheaacd_read_bits_buf(it_bit_buff, 3);
266
15
      config->bs_ttt_bands_low[i] = ixheaacd_read_bits_buf(it_bit_buff, 5);
267
15
      config->bs_ttt_bands_high[i] = ixheaacd_freq_res_table[config->bs_freq_res];
268
210
    } else {
269
210
      config->bs_ttt_bands_low[i] = ixheaacd_freq_res_table[config->bs_freq_res];
270
210
    }
271
225
  }
272
273
1.52k
  if (config->bs_temp_shape_config == 2) {
274
363
    config->bs_env_quant_mode = ixheaacd_read_bits_buf(it_bit_buff, 1);
275
363
  }
276
277
1.52k
  if (config->bs_3D_audio_mode) {
278
198
    config->bs_3D_audio_HRTF_set = ixheaacd_read_bits_buf(it_bit_buff, 2);
279
    // param_HRTF_set
280
198
    if (config->bs_3D_audio_HRTF_set == 0) {
281
80
      config->bs_HRTF_freq_res = ixheaacd_read_bits_buf(it_bit_buff, 3);
282
80
      config->bs_HRTF_num_chan = 5;
283
80
      config->bs_HRTF_asymmetric = ixheaacd_read_bits_buf(it_bit_buff, 1);
284
285
80
      config->HRTF_num_band = ixheaacd_hrtf_freq_res_table[0][config->bs_HRTF_freq_res];
286
80
      config->HRTF_num_phase = ixheaacd_hrtf_freq_res_table[1][config->bs_HRTF_freq_res];
287
288
335
      for (hc = 0; hc < config->bs_HRTF_num_chan; hc++) {
289
2.12k
        for (hb = 0; hb < config->HRTF_num_band; hb++) {
290
1.87k
          config->bs_HRTF_level_left[hc][hb] =
291
1.87k
              ixheaacd_read_bits_buf(it_bit_buff, 6);
292
1.87k
        }
293
2.04k
        for (hb = 0; hb < config->HRTF_num_band; hb++) {
294
1.79k
          config->bs_HRTF_level_right[hc][hb] =
295
1.79k
              config->bs_HRTF_asymmetric
296
1.79k
                  ? ixheaacd_read_bits_buf(it_bit_buff, 6)
297
1.79k
                  : config->bs_HRTF_level_left[hc][hb];
298
1.79k
        }
299
255
        config->bs_HRTF_phase[hc] = ixheaacd_read_bits_buf(it_bit_buff, 1);
300
1.26k
        for (hb = 0; hb < config->HRTF_num_phase; hb++) {
301
1.00k
          config->bs_HRTF_phase_LR[hc][hb] =
302
1.00k
              config->bs_HRTF_phase[hc] ? ixheaacd_read_bits_buf(it_bit_buff, 6)
303
1.00k
                                        : 0;
304
1.00k
        }
305
255
        config->bs_HRTF_icc[hc] = ixheaacd_read_bits_buf(it_bit_buff, 1);
306
255
        if (config->bs_HRTF_icc[hc]) {
307
562
          for (hb = 0; hb < config->HRTF_num_band; hb++)
308
490
            config->bs_HRTF_icc_LR[hc][hb] =
309
490
                ixheaacd_read_bits_buf(it_bit_buff, 3);
310
72
        }
311
255
      }
312
80
    }
313
198
  }
314
315
  // byte_align
316
1.52k
  i = (it_bit_buff->cnt_bits & 0x7);
317
1.52k
  ixheaacd_read_bits_buf(it_bit_buff, i);
318
319
1.52k
  num_header_bits = tmp - (it_bit_buff->cnt_bits);
320
1.52k
  bits_available -= num_header_bits;
321
322
1.52k
  err =
323
1.52k
      ixheaacd_ld_spatial_extension_config(it_bit_buff, config, bits_available);
324
1.52k
  return err;
325
1.52k
}