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