xref: /aosp_15_r20/external/libxaac/decoder/ixheaacd_multichannel.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 <string.h>
21*15dc779aSAndroid Build Coastguard Worker 
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
24*15dc779aSAndroid Build Coastguard Worker 
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker 
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
32*15dc779aSAndroid Build Coastguard Worker 
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_memory_standards.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
37*15dc779aSAndroid Build Coastguard Worker 
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
41*15dc779aSAndroid Build Coastguard Worker 
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
44*15dc779aSAndroid Build Coastguard Worker 
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
51*15dc779aSAndroid Build Coastguard Worker 
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
57*15dc779aSAndroid Build Coastguard Worker 
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_bitdec.h"
61*15dc779aSAndroid Build Coastguard Worker 
62*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
63*15dc779aSAndroid Build Coastguard Worker 
64*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
65*15dc779aSAndroid Build Coastguard Worker 
66*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
67*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
68*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_block.h"
69*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channel.h"
70*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
71*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_latmdemux.h"
72*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aacdec.h"
73*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_config.h"
74*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
75*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
76*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_qmf_dec.h"
77*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_polyphase.h"
78*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_macro_def.h"
79*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_struct_def.h"
80*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_res_rom.h"
81*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_aac_struct.h"
82*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_dec.h"
83*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_mps_interface.h"
84*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_struct_def.h"
85*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_headerdecode.h"
86*15dc779aSAndroid Build Coastguard Worker 
87*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_multichannel.h"
88*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
89*15dc779aSAndroid Build Coastguard Worker 
cblock_decode_huff_symbol(UWORD8 * ptr_read_next,WORD32 bit_pos,const UWORD16 * huff_ori,WORD16 * input,WORD32 * readword)90*15dc779aSAndroid Build Coastguard Worker WORD cblock_decode_huff_symbol(UWORD8 *ptr_read_next, WORD32 bit_pos,
91*15dc779aSAndroid Build Coastguard Worker                                const UWORD16 *huff_ori, WORD16 *input,
92*15dc779aSAndroid Build Coastguard Worker                                WORD32 *readword)
93*15dc779aSAndroid Build Coastguard Worker 
94*15dc779aSAndroid Build Coastguard Worker {
95*15dc779aSAndroid Build Coastguard Worker   const UWORD16 *h;
96*15dc779aSAndroid Build Coastguard Worker   WORD tot_bits;
97*15dc779aSAndroid Build Coastguard Worker   {
98*15dc779aSAndroid Build Coastguard Worker     UWORD16 first_offset;
99*15dc779aSAndroid Build Coastguard Worker     WORD16 sign_ret_val;
100*15dc779aSAndroid Build Coastguard Worker     UWORD32 read_word1;
101*15dc779aSAndroid Build Coastguard Worker 
102*15dc779aSAndroid Build Coastguard Worker     read_word1 = *readword << bit_pos;
103*15dc779aSAndroid Build Coastguard Worker 
104*15dc779aSAndroid Build Coastguard Worker     h = (UWORD16 *)(huff_ori);
105*15dc779aSAndroid Build Coastguard Worker     first_offset = 7;
106*15dc779aSAndroid Build Coastguard Worker 
107*15dc779aSAndroid Build Coastguard Worker     h += (read_word1) >> (32 - first_offset);
108*15dc779aSAndroid Build Coastguard Worker     sign_ret_val = *h;
109*15dc779aSAndroid Build Coastguard Worker     tot_bits = 0;
110*15dc779aSAndroid Build Coastguard Worker 
111*15dc779aSAndroid Build Coastguard Worker     while (sign_ret_val > 0) {
112*15dc779aSAndroid Build Coastguard Worker       tot_bits += first_offset;
113*15dc779aSAndroid Build Coastguard Worker       bit_pos += first_offset;
114*15dc779aSAndroid Build Coastguard Worker 
115*15dc779aSAndroid Build Coastguard Worker       if ((bit_pos -= 8) >= 0) {
116*15dc779aSAndroid Build Coastguard Worker         *readword = (*readword << 8) | *ptr_read_next;
117*15dc779aSAndroid Build Coastguard Worker         ptr_read_next++;
118*15dc779aSAndroid Build Coastguard Worker       } else {
119*15dc779aSAndroid Build Coastguard Worker         bit_pos += 8;
120*15dc779aSAndroid Build Coastguard Worker       }
121*15dc779aSAndroid Build Coastguard Worker 
122*15dc779aSAndroid Build Coastguard Worker       read_word1 = (read_word1) << (first_offset);
123*15dc779aSAndroid Build Coastguard Worker 
124*15dc779aSAndroid Build Coastguard Worker       first_offset = (sign_ret_val >> 11);
125*15dc779aSAndroid Build Coastguard Worker       h += sign_ret_val & (0x07FF);
126*15dc779aSAndroid Build Coastguard Worker 
127*15dc779aSAndroid Build Coastguard Worker       h += (read_word1) >> (32 - first_offset);
128*15dc779aSAndroid Build Coastguard Worker       sign_ret_val = *h;
129*15dc779aSAndroid Build Coastguard Worker     }
130*15dc779aSAndroid Build Coastguard Worker 
131*15dc779aSAndroid Build Coastguard Worker     tot_bits += ((sign_ret_val & 0x7fff) >> 11);
132*15dc779aSAndroid Build Coastguard Worker     bit_pos += ((sign_ret_val & 0x7fff) >> 11);
133*15dc779aSAndroid Build Coastguard Worker     if ((bit_pos - 8) >= 0) {
134*15dc779aSAndroid Build Coastguard Worker       *readword = (*readword << 8) | *ptr_read_next;
135*15dc779aSAndroid Build Coastguard Worker     }
136*15dc779aSAndroid Build Coastguard Worker 
137*15dc779aSAndroid Build Coastguard Worker     *input = (sign_ret_val & (0x07FF)) - 60;
138*15dc779aSAndroid Build Coastguard Worker   }
139*15dc779aSAndroid Build Coastguard Worker 
140*15dc779aSAndroid Build Coastguard Worker   return tot_bits;
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_coupling_channel_element(ia_bit_buf_struct * it_bit_buf,ia_aac_decoder_struct * aac_handle,WORD32 samp_rate_idx,ia_aac_dec_tables_struct * ptr_aac_tables,ixheaacd_misc_tables * common_tables_ptr,WORD * element_index_order,ia_enhaacplus_dec_ind_cc * ind_channel_info,WORD32 total_channels,WORD32 frame_size,WORD32 audio_object_type,ia_eld_specific_config_struct eld_specific_config,WORD32 ele_type)143*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_coupling_channel_element(
144*15dc779aSAndroid Build Coastguard Worker     ia_bit_buf_struct *it_bit_buf, ia_aac_decoder_struct *aac_handle,
145*15dc779aSAndroid Build Coastguard Worker     WORD32 samp_rate_idx, ia_aac_dec_tables_struct *ptr_aac_tables,
146*15dc779aSAndroid Build Coastguard Worker     ixheaacd_misc_tables *common_tables_ptr, WORD *element_index_order,
147*15dc779aSAndroid Build Coastguard Worker     ia_enhaacplus_dec_ind_cc *ind_channel_info, WORD32 total_channels,
148*15dc779aSAndroid Build Coastguard Worker     WORD32 frame_size, WORD32 audio_object_type,
149*15dc779aSAndroid Build Coastguard Worker     ia_eld_specific_config_struct eld_specific_config, WORD32 ele_type) {
150*15dc779aSAndroid Build Coastguard Worker   WORD32 element_instance_tag;
151*15dc779aSAndroid Build Coastguard Worker   LOOPIDX c;
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker   WORD ind_sw_cce_flag, num_coupled_elements;
154*15dc779aSAndroid Build Coastguard Worker 
155*15dc779aSAndroid Build Coastguard Worker   WORD num_gain_element_lists = 0;
156*15dc779aSAndroid Build Coastguard Worker   WORD gain_element_scale;
157*15dc779aSAndroid Build Coastguard Worker 
158*15dc779aSAndroid Build Coastguard Worker   const UWORD16 *hcod_sf =
159*15dc779aSAndroid Build Coastguard Worker       ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl;
160*15dc779aSAndroid Build Coastguard Worker   const UWORD32 *table_idx =
161*15dc779aSAndroid Build Coastguard Worker       ptr_aac_tables->pstr_huffmann_tables->huffman_code_book_scl_index;
162*15dc779aSAndroid Build Coastguard Worker   WORD16 index, length;
163*15dc779aSAndroid Build Coastguard Worker 
164*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE error_status = IA_NO_ERROR;
165*15dc779aSAndroid Build Coastguard Worker 
166*15dc779aSAndroid Build Coastguard Worker   element_instance_tag = ixheaacd_read_bits_buf(it_bit_buf, 4);
167*15dc779aSAndroid Build Coastguard Worker   element_index_order[0] = element_instance_tag;
168*15dc779aSAndroid Build Coastguard Worker 
169*15dc779aSAndroid Build Coastguard Worker   ind_sw_cce_flag = ixheaacd_read_bits_buf(it_bit_buf, 1);
170*15dc779aSAndroid Build Coastguard Worker   num_coupled_elements = ixheaacd_read_bits_buf(it_bit_buf, 3);
171*15dc779aSAndroid Build Coastguard Worker 
172*15dc779aSAndroid Build Coastguard Worker   for (c = 0; c < MAX_BS_ELEMENT; c++)
173*15dc779aSAndroid Build Coastguard Worker     ind_channel_info->elements_coupled[c] = -1;
174*15dc779aSAndroid Build Coastguard Worker 
175*15dc779aSAndroid Build Coastguard Worker   ind_channel_info->num_coupled_elements = num_coupled_elements;
176*15dc779aSAndroid Build Coastguard Worker 
177*15dc779aSAndroid Build Coastguard Worker   for (c = 0; c < (num_coupled_elements + 1); c++) {
178*15dc779aSAndroid Build Coastguard Worker     num_gain_element_lists++;
179*15dc779aSAndroid Build Coastguard Worker 
180*15dc779aSAndroid Build Coastguard Worker     ind_channel_info->cc_target_is_cpe[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
181*15dc779aSAndroid Build Coastguard Worker     ind_channel_info->cc_target_tag_select[c] = ixheaacd_read_bits_buf(it_bit_buf, 4);
182*15dc779aSAndroid Build Coastguard Worker     if (ind_channel_info->cc_target_is_cpe[c]) {
183*15dc779aSAndroid Build Coastguard Worker       ind_channel_info->cc_l[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
184*15dc779aSAndroid Build Coastguard Worker       ind_channel_info->cc_r[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
185*15dc779aSAndroid Build Coastguard Worker       if (ind_channel_info->cc_l[c] && ind_channel_info->cc_r[c])
186*15dc779aSAndroid Build Coastguard Worker         num_gain_element_lists++;
187*15dc779aSAndroid Build Coastguard Worker       ind_channel_info->elements_coupled[c] = 1;
188*15dc779aSAndroid Build Coastguard Worker     } else
189*15dc779aSAndroid Build Coastguard Worker       ind_channel_info->elements_coupled[c] = 0;
190*15dc779aSAndroid Build Coastguard Worker   }
191*15dc779aSAndroid Build Coastguard Worker   if ((ind_sw_cce_flag == 0) && (num_gain_element_lists > MAX_BS_ELEMENT)) {
192*15dc779aSAndroid Build Coastguard Worker     return IA_FATAL_ERROR;
193*15dc779aSAndroid Build Coastguard Worker   }
194*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_bits_buf(it_bit_buf, 1);/*cc_domain*/
195*15dc779aSAndroid Build Coastguard Worker   ixheaacd_read_bits_buf(it_bit_buf, 1);/*gain_element_sign*/
196*15dc779aSAndroid Build Coastguard Worker   gain_element_scale = ixheaacd_read_bits_buf(it_bit_buf, 2);
197*15dc779aSAndroid Build Coastguard Worker 
198*15dc779aSAndroid Build Coastguard Worker   aac_handle->pstr_aac_dec_ch_info[0]->str_ics_info.num_swb_window = 0;
199*15dc779aSAndroid Build Coastguard Worker   aac_handle->pstr_aac_dec_ch_info[0]->str_ics_info.sampling_rate_index =
200*15dc779aSAndroid Build Coastguard Worker       samp_rate_idx;
201*15dc779aSAndroid Build Coastguard Worker 
202*15dc779aSAndroid Build Coastguard Worker   aac_handle->pstr_aac_dec_ch_info[0]->common_window = 0;
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker   error_status = ixheaacd_individual_ch_stream(
205*15dc779aSAndroid Build Coastguard Worker       it_bit_buf, aac_handle, 1, frame_size, total_channels, audio_object_type,
206*15dc779aSAndroid Build Coastguard Worker       eld_specific_config, ele_type);
207*15dc779aSAndroid Build Coastguard Worker 
208*15dc779aSAndroid Build Coastguard Worker   if (error_status) return error_status;
209*15dc779aSAndroid Build Coastguard Worker 
210*15dc779aSAndroid Build Coastguard Worker   ind_channel_info->cc_gain[0] = 1 << 29;
211*15dc779aSAndroid Build Coastguard Worker   for (c = 1; c < num_gain_element_lists; c++) {
212*15dc779aSAndroid Build Coastguard Worker     WORD cge;
213*15dc779aSAndroid Build Coastguard Worker     WORD common_gain_element_present[MAX_BS_ELEMENT];
214*15dc779aSAndroid Build Coastguard Worker     WORD16 norm_value;
215*15dc779aSAndroid Build Coastguard Worker 
216*15dc779aSAndroid Build Coastguard Worker     if (ind_sw_cce_flag)
217*15dc779aSAndroid Build Coastguard Worker       cge = 1;
218*15dc779aSAndroid Build Coastguard Worker     else {
219*15dc779aSAndroid Build Coastguard Worker       common_gain_element_present[c] = ixheaacd_read_bits_buf(it_bit_buf, 1);
220*15dc779aSAndroid Build Coastguard Worker       cge = common_gain_element_present[c];
221*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
222*15dc779aSAndroid Build Coastguard Worker     }
223*15dc779aSAndroid Build Coastguard Worker     if (cge) {
224*15dc779aSAndroid Build Coastguard Worker       UWORD8 *ptr_read_next = it_bit_buf->ptr_read_next;
225*15dc779aSAndroid Build Coastguard Worker       WORD32 bit_pos = 7 - it_bit_buf->bit_pos;
226*15dc779aSAndroid Build Coastguard Worker       WORD32 read_word =
227*15dc779aSAndroid Build Coastguard Worker           ixheaacd_aac_showbits_32(it_bit_buf->ptr_read_next, it_bit_buf->cnt_bits, NULL);
228*15dc779aSAndroid Build Coastguard Worker       UWORD32 read_word1;
229*15dc779aSAndroid Build Coastguard Worker 
230*15dc779aSAndroid Build Coastguard Worker       read_word1 = read_word << bit_pos;
231*15dc779aSAndroid Build Coastguard Worker       ixheaacd_huffman_decode(read_word1, &index, &length, hcod_sf, table_idx);
232*15dc779aSAndroid Build Coastguard Worker 
233*15dc779aSAndroid Build Coastguard Worker       bit_pos += length;
234*15dc779aSAndroid Build Coastguard Worker 
235*15dc779aSAndroid Build Coastguard Worker       ixheaacd_aac_read_byte(&ptr_read_next, &bit_pos, &read_word);
236*15dc779aSAndroid Build Coastguard Worker       while (bit_pos > 8)
237*15dc779aSAndroid Build Coastguard Worker         ixheaacd_aac_read_byte(&ptr_read_next, &bit_pos, &read_word);
238*15dc779aSAndroid Build Coastguard Worker 
239*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->ptr_read_next = ptr_read_next;
240*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->bit_pos = 7 - bit_pos;
241*15dc779aSAndroid Build Coastguard Worker       it_bit_buf->cnt_bits -= length;
242*15dc779aSAndroid Build Coastguard Worker 
243*15dc779aSAndroid Build Coastguard Worker       norm_value = index - 60;
244*15dc779aSAndroid Build Coastguard Worker       if (norm_value == -1)
245*15dc779aSAndroid Build Coastguard Worker         ind_channel_info->cc_gain[c] =
246*15dc779aSAndroid Build Coastguard Worker             common_tables_ptr->cc_gain_scale[gain_element_scale];
247*15dc779aSAndroid Build Coastguard Worker       else {
248*15dc779aSAndroid Build Coastguard Worker         int i;
249*15dc779aSAndroid Build Coastguard Worker         ind_channel_info->cc_gain[c] =
250*15dc779aSAndroid Build Coastguard Worker             common_tables_ptr->cc_gain_scale[gain_element_scale];
251*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < (-norm_value) - 1; i++) {
252*15dc779aSAndroid Build Coastguard Worker           ind_channel_info->cc_gain[c] = ixheaac_mul32_sh(
253*15dc779aSAndroid Build Coastguard Worker               ind_channel_info->cc_gain[c],
254*15dc779aSAndroid Build Coastguard Worker               common_tables_ptr->cc_gain_scale[gain_element_scale], 29);
255*15dc779aSAndroid Build Coastguard Worker         }
256*15dc779aSAndroid Build Coastguard Worker       }
257*15dc779aSAndroid Build Coastguard Worker     } else {
258*15dc779aSAndroid Build Coastguard Worker       return IA_XHEAAC_DEC_EXE_FATAL_UNIMPLEMENTED_CCE;
259*15dc779aSAndroid Build Coastguard Worker     }
260*15dc779aSAndroid Build Coastguard Worker   }
261*15dc779aSAndroid Build Coastguard Worker   if (it_bit_buf->cnt_bits < 0) {
262*15dc779aSAndroid Build Coastguard Worker     return IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES;
263*15dc779aSAndroid Build Coastguard Worker   }
264*15dc779aSAndroid Build Coastguard Worker   return error_status;
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_couple_channel(WORD32 * p_time_data,WORD32 * out_samp_cc,WORD16 frame_size,WORD total_channels,WORD16 gain_cc)267*15dc779aSAndroid Build Coastguard Worker void ixheaacd_dec_couple_channel(WORD32 *p_time_data, WORD32 *out_samp_cc,
268*15dc779aSAndroid Build Coastguard Worker                                  WORD16 frame_size, WORD total_channels,
269*15dc779aSAndroid Build Coastguard Worker                                  WORD16 gain_cc)
270*15dc779aSAndroid Build Coastguard Worker 
271*15dc779aSAndroid Build Coastguard Worker {
272*15dc779aSAndroid Build Coastguard Worker   WORD i;
273*15dc779aSAndroid Build Coastguard Worker   WORD32 out_cc;
274*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_out_samp = &out_samp_cc[0];
275*15dc779aSAndroid Build Coastguard Worker   for (i = frame_size - 1; i >= 0; i--) {
276*15dc779aSAndroid Build Coastguard Worker     out_cc = (ixheaac_shl32_sat(
277*15dc779aSAndroid Build Coastguard Worker         ixheaac_mult32x16in32(*ptr_out_samp++, gain_cc), 3));
278*15dc779aSAndroid Build Coastguard Worker     *p_time_data = ixheaac_add32_sat(out_cc, *p_time_data);
279*15dc779aSAndroid Build Coastguard Worker     p_time_data += total_channels;
280*15dc779aSAndroid Build Coastguard Worker   }
281*15dc779aSAndroid Build Coastguard Worker }
282*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_ind_coupling(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,WORD32 * coup_ch_output,WORD16 frame_size,WORD total_channels,VOID * ptr_time_data_tmp)283*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_dec_ind_coupling(
284*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 *coup_ch_output,
285*15dc779aSAndroid Build Coastguard Worker     WORD16 frame_size, WORD total_channels, VOID *ptr_time_data_tmp)
286*15dc779aSAndroid Build Coastguard Worker 
287*15dc779aSAndroid Build Coastguard Worker {
288*15dc779aSAndroid Build Coastguard Worker   WORD c, j, k;
289*15dc779aSAndroid Build Coastguard Worker   WORD l;
290*15dc779aSAndroid Build Coastguard Worker   WORD32 *out_samp_cc, err = 0;
291*15dc779aSAndroid Build Coastguard Worker 
292*15dc779aSAndroid Build Coastguard Worker   ia_enhaacplus_dec_ind_cc *ind_channel_info;
293*15dc779aSAndroid Build Coastguard Worker 
294*15dc779aSAndroid Build Coastguard Worker   WORD32 *ptr_time_data = (WORD32 *)ptr_time_data_tmp;
295*15dc779aSAndroid Build Coastguard Worker 
296*15dc779aSAndroid Build Coastguard Worker   {
297*15dc779aSAndroid Build Coastguard Worker     ind_channel_info = &p_obj_exhaacplus_dec->p_state_aac->ind_cc_info;
298*15dc779aSAndroid Build Coastguard Worker 
299*15dc779aSAndroid Build Coastguard Worker     out_samp_cc = coup_ch_output;
300*15dc779aSAndroid Build Coastguard Worker 
301*15dc779aSAndroid Build Coastguard Worker     if (ind_channel_info->num_coupled_elements > 0 && coup_ch_output == NULL) {
302*15dc779aSAndroid Build Coastguard Worker       if (p_obj_exhaacplus_dec->p_state_aac->ec_enable) {
303*15dc779aSAndroid Build Coastguard Worker         ind_channel_info->num_coupled_elements = 0;
304*15dc779aSAndroid Build Coastguard Worker         p_obj_exhaacplus_dec->aac_config.frame_status = 0;
305*15dc779aSAndroid Build Coastguard Worker       } else {
306*15dc779aSAndroid Build Coastguard Worker         return IA_FATAL_ERROR;
307*15dc779aSAndroid Build Coastguard Worker       }
308*15dc779aSAndroid Build Coastguard Worker     }
309*15dc779aSAndroid Build Coastguard Worker 
310*15dc779aSAndroid Build Coastguard Worker     j = 0;
311*15dc779aSAndroid Build Coastguard Worker     for (c = 0; c < ind_channel_info->num_coupled_elements + 1; c++) {
312*15dc779aSAndroid Build Coastguard Worker       for (l = 0; l < MAX_BS_ELEMENT; l++) {
313*15dc779aSAndroid Build Coastguard Worker         if (p_obj_exhaacplus_dec->aac_config.element_type[l] ==
314*15dc779aSAndroid Build Coastguard Worker                 ind_channel_info->elements_coupled[c] &&
315*15dc779aSAndroid Build Coastguard Worker             p_obj_exhaacplus_dec->aac_config.element_instance_order[l] ==
316*15dc779aSAndroid Build Coastguard Worker                 ind_channel_info->cc_target_tag_select[c]) {
317*15dc779aSAndroid Build Coastguard Worker           break;
318*15dc779aSAndroid Build Coastguard Worker         }
319*15dc779aSAndroid Build Coastguard Worker       }
320*15dc779aSAndroid Build Coastguard Worker       if (l == MAX_BS_ELEMENT) {
321*15dc779aSAndroid Build Coastguard Worker         continue;
322*15dc779aSAndroid Build Coastguard Worker       }
323*15dc779aSAndroid Build Coastguard Worker 
324*15dc779aSAndroid Build Coastguard Worker       k = p_obj_exhaacplus_dec->aac_config.slot_element[l];
325*15dc779aSAndroid Build Coastguard Worker 
326*15dc779aSAndroid Build Coastguard Worker       if (ind_channel_info->cc_target_is_cpe[c] == 0) {
327*15dc779aSAndroid Build Coastguard Worker         WORD32 *p_time_data = &ptr_time_data[k];
328*15dc779aSAndroid Build Coastguard Worker 
329*15dc779aSAndroid Build Coastguard Worker         WORD16 gain_cc = ixheaac_round16(ind_channel_info->cc_gain[j]);
330*15dc779aSAndroid Build Coastguard Worker 
331*15dc779aSAndroid Build Coastguard Worker         ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
332*15dc779aSAndroid Build Coastguard Worker                                     total_channels, gain_cc);
333*15dc779aSAndroid Build Coastguard Worker       }
334*15dc779aSAndroid Build Coastguard Worker       if (ind_channel_info->cc_target_is_cpe[c] == 1) {
335*15dc779aSAndroid Build Coastguard Worker         if (ind_channel_info->cc_l[c] == 1) {
336*15dc779aSAndroid Build Coastguard Worker           WORD32 *p_time_data = &ptr_time_data[k];
337*15dc779aSAndroid Build Coastguard Worker 
338*15dc779aSAndroid Build Coastguard Worker           WORD16 gain_cc = ixheaac_round16(ind_channel_info->cc_gain[j]);
339*15dc779aSAndroid Build Coastguard Worker 
340*15dc779aSAndroid Build Coastguard Worker           ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
341*15dc779aSAndroid Build Coastguard Worker                                       total_channels, gain_cc);
342*15dc779aSAndroid Build Coastguard Worker         }
343*15dc779aSAndroid Build Coastguard Worker 
344*15dc779aSAndroid Build Coastguard Worker         k = p_obj_exhaacplus_dec->aac_config.slot_element[l];
345*15dc779aSAndroid Build Coastguard Worker 
346*15dc779aSAndroid Build Coastguard Worker         if (ind_channel_info->cc_r[c] == 1) {
347*15dc779aSAndroid Build Coastguard Worker           WORD32 *p_time_data = &ptr_time_data[k + 1];
348*15dc779aSAndroid Build Coastguard Worker           WORD16 gain_cc = ixheaac_round16(ind_channel_info->cc_gain[j + 1]);
349*15dc779aSAndroid Build Coastguard Worker 
350*15dc779aSAndroid Build Coastguard Worker           ixheaacd_dec_couple_channel(p_time_data, out_samp_cc, frame_size,
351*15dc779aSAndroid Build Coastguard Worker                                       total_channels, gain_cc);
352*15dc779aSAndroid Build Coastguard Worker         }
353*15dc779aSAndroid Build Coastguard Worker       }
354*15dc779aSAndroid Build Coastguard Worker       if (ind_channel_info->cc_target_is_cpe[c] == 1) {
355*15dc779aSAndroid Build Coastguard Worker         j += 2;
356*15dc779aSAndroid Build Coastguard Worker       } else {
357*15dc779aSAndroid Build Coastguard Worker         j += 1;
358*15dc779aSAndroid Build Coastguard Worker       }
359*15dc779aSAndroid Build Coastguard Worker     }
360*15dc779aSAndroid Build Coastguard Worker   }
361*15dc779aSAndroid Build Coastguard Worker   return err;
362*15dc779aSAndroid Build Coastguard Worker }
363*15dc779aSAndroid Build Coastguard Worker 
ixheaacd_dec_downmix_to_stereo(ia_exhaacplus_dec_api_struct * p_obj_exhaacplus_dec,WORD16 frame_size,WORD total_elements,WORD16 * ptr_time_data,WORD total_channels)364*15dc779aSAndroid Build Coastguard Worker void ixheaacd_dec_downmix_to_stereo(
365*15dc779aSAndroid Build Coastguard Worker     ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD16 frame_size,
366*15dc779aSAndroid Build Coastguard Worker     WORD total_elements, WORD16 *ptr_time_data, WORD total_channels) {
367*15dc779aSAndroid Build Coastguard Worker   LOOPIDX i, j;
368*15dc779aSAndroid Build Coastguard Worker   WORD k = 0;
369*15dc779aSAndroid Build Coastguard Worker   if (5 == total_channels) k = 0;
370*15dc779aSAndroid Build Coastguard Worker   if (6 == total_channels) k = 1;
371*15dc779aSAndroid Build Coastguard Worker   if (7 == total_channels) k = 2;
372*15dc779aSAndroid Build Coastguard Worker   if (8 == total_channels) k = 3;
373*15dc779aSAndroid Build Coastguard Worker 
374*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < frame_size; j++) {
375*15dc779aSAndroid Build Coastguard Worker     WORD16 temp_l = 0, temp_r = 0;
376*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < total_elements; i++) {
377*15dc779aSAndroid Build Coastguard Worker       if (0 == p_obj_exhaacplus_dec->aac_config.element_type[i] ||
378*15dc779aSAndroid Build Coastguard Worker           3 == p_obj_exhaacplus_dec->aac_config.element_type[i]) {
379*15dc779aSAndroid Build Coastguard Worker         temp_l += (WORD16)(
380*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(
381*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->common_tables->down_mix_martix
382*15dc779aSAndroid Build Coastguard Worker                     [k][0][p_obj_exhaacplus_dec->aac_config.slot_element[i]],
383*15dc779aSAndroid Build Coastguard Worker                 ptr_time_data[j * total_channels +
384*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config
385*15dc779aSAndroid Build Coastguard Worker                                   .slot_element[i]]) >>
386*15dc779aSAndroid Build Coastguard Worker             14);
387*15dc779aSAndroid Build Coastguard Worker 
388*15dc779aSAndroid Build Coastguard Worker         temp_r += (WORD16)(
389*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(
390*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->common_tables->down_mix_martix
391*15dc779aSAndroid Build Coastguard Worker                     [k][1][p_obj_exhaacplus_dec->aac_config.slot_element[i]],
392*15dc779aSAndroid Build Coastguard Worker                 ptr_time_data[j * total_channels +
393*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config
394*15dc779aSAndroid Build Coastguard Worker                                   .slot_element[i]]) >>
395*15dc779aSAndroid Build Coastguard Worker             14);
396*15dc779aSAndroid Build Coastguard Worker       }
397*15dc779aSAndroid Build Coastguard Worker       if (1 == p_obj_exhaacplus_dec->aac_config.element_type[i]) {
398*15dc779aSAndroid Build Coastguard Worker         temp_l += (WORD16)(
399*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(
400*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->common_tables->down_mix_martix
401*15dc779aSAndroid Build Coastguard Worker                     [k][0][p_obj_exhaacplus_dec->aac_config.slot_element[i]],
402*15dc779aSAndroid Build Coastguard Worker                 ptr_time_data[j * total_channels +
403*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config
404*15dc779aSAndroid Build Coastguard Worker                                   .slot_element[i]]) >>
405*15dc779aSAndroid Build Coastguard Worker             14);
406*15dc779aSAndroid Build Coastguard Worker 
407*15dc779aSAndroid Build Coastguard Worker         temp_r += (WORD16)(
408*15dc779aSAndroid Build Coastguard Worker             ixheaac_mult32x16in32(
409*15dc779aSAndroid Build Coastguard Worker                 p_obj_exhaacplus_dec->common_tables->down_mix_martix
410*15dc779aSAndroid Build Coastguard Worker                     [k][1]
411*15dc779aSAndroid Build Coastguard Worker                     [p_obj_exhaacplus_dec->aac_config.slot_element[i] + 1],
412*15dc779aSAndroid Build Coastguard Worker                 ptr_time_data[j * total_channels +
413*15dc779aSAndroid Build Coastguard Worker                               p_obj_exhaacplus_dec->aac_config.slot_element[i] +
414*15dc779aSAndroid Build Coastguard Worker                               1]) >>
415*15dc779aSAndroid Build Coastguard Worker             14);
416*15dc779aSAndroid Build Coastguard Worker       }
417*15dc779aSAndroid Build Coastguard Worker     }
418*15dc779aSAndroid Build Coastguard Worker 
419*15dc779aSAndroid Build Coastguard Worker     ptr_time_data[2 * j] = temp_l;
420*15dc779aSAndroid Build Coastguard Worker     ptr_time_data[2 * j + 1] = temp_r;
421*15dc779aSAndroid Build Coastguard Worker   }
422*15dc779aSAndroid Build Coastguard Worker }
423