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 #include <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.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 "ixheaac_basic_op.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_common_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_basic_funcs.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecsettings.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_scale.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lpp_tran.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr_part.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_rom.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_hybrid.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_dec.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_env_extr.h"
48*15dc779aSAndroid Build Coastguard Worker
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_sbr_const.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
51*15dc779aSAndroid Build Coastguard Worker
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pvc_dec.h"
53*15dc779aSAndroid Build Coastguard Worker
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ps_bitdec.h"
55*15dc779aSAndroid Build Coastguard Worker
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
57*15dc779aSAndroid Build Coastguard Worker
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker static const int ixheaacd_ld_env_table_512[LD_ENV_TBL_512][LD_ENV_TBL_SIZE] = {
60*15dc779aSAndroid Build Coastguard Worker {2, 4, -1, 0}, {2, 5, -1, 0}, {3, 2, 6, 1}, {3, 3, 7, 1},
61*15dc779aSAndroid Build Coastguard Worker {3, 4, 8, 1}, {3, 5, 9, 1}, {3, 6, 10, 1}, {3, 7, 11, 1},
62*15dc779aSAndroid Build Coastguard Worker {3, 8, 12, 1}, {3, 9, 13, 1}, {3, 10, 14, 1}, {2, 11, -1, 1},
63*15dc779aSAndroid Build Coastguard Worker {2, 12, -1, 1}, {2, 13, -1, 1}, {2, 14, -1, 1}, {2, 15, -1, 1},
64*15dc779aSAndroid Build Coastguard Worker };
65*15dc779aSAndroid Build Coastguard Worker
66*15dc779aSAndroid Build Coastguard Worker static const int ixheaacd_ld_env_table_480[LD_ENV_TBL_480][LD_ENV_TBL_SIZE] = {
67*15dc779aSAndroid Build Coastguard Worker {2, 4, -1, 0}, {2, 5, -1, 0}, {3, 2, 6, 1}, {3, 3, 7, 1},
68*15dc779aSAndroid Build Coastguard Worker {3, 4, 8, 1}, {3, 5, 9, 1}, {3, 6, 10, 1}, {3, 7, 11, 1},
69*15dc779aSAndroid Build Coastguard Worker {3, 8, 12, 1}, {3, 9, 13, 1}, {2, 10, -1, 1}, {2, 11, -1, 1},
70*15dc779aSAndroid Build Coastguard Worker {2, 12, -1, 1}, {2, 13, -1, 1}, {2, 14, -1, 1},
71*15dc779aSAndroid Build Coastguard Worker };
72*15dc779aSAndroid Build Coastguard Worker
73*15dc779aSAndroid Build Coastguard Worker static const int ixheaacd_ld_env_table_time_slot[LD_ENV_TIME_SLOT] = {
74*15dc779aSAndroid Build Coastguard Worker 8, 5, 0, 0, 0, 0, 0};
75*15dc779aSAndroid Build Coastguard Worker
ixheaacd_cnt_leading_ones(WORD32 a)76*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_cnt_leading_ones(WORD32 a) {
77*15dc779aSAndroid Build Coastguard Worker WORD32 count = 0;
78*15dc779aSAndroid Build Coastguard Worker
79*15dc779aSAndroid Build Coastguard Worker while (a) {
80*15dc779aSAndroid Build Coastguard Worker if (a & 0x80000000)
81*15dc779aSAndroid Build Coastguard Worker count++;
82*15dc779aSAndroid Build Coastguard Worker else
83*15dc779aSAndroid Build Coastguard Worker break;
84*15dc779aSAndroid Build Coastguard Worker a = a << 1;
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker return count;
87*15dc779aSAndroid Build Coastguard Worker }
ixheaacd_huffman_decode(WORD32 it_bit_buff,WORD16 * h_index,WORD16 * len,const UWORD16 * input_table,const UWORD32 * idx_table)88*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len,
89*15dc779aSAndroid Build Coastguard Worker const UWORD16 *input_table,
90*15dc779aSAndroid Build Coastguard Worker const UWORD32 *idx_table) {
91*15dc779aSAndroid Build Coastguard Worker UWORD32 temp = 0;
92*15dc779aSAndroid Build Coastguard Worker UWORD32 temp1 = 0;
93*15dc779aSAndroid Build Coastguard Worker WORD32 found = 0;
94*15dc779aSAndroid Build Coastguard Worker UWORD32 mask = 0x80000000;
95*15dc779aSAndroid Build Coastguard Worker
96*15dc779aSAndroid Build Coastguard Worker WORD32 clo;
97*15dc779aSAndroid Build Coastguard Worker WORD32 MAX_LEN;
98*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_drc_offset = 0;
99*15dc779aSAndroid Build Coastguard Worker WORD32 length;
100*15dc779aSAndroid Build Coastguard Worker UWORD32 cwrd;
101*15dc779aSAndroid Build Coastguard Worker WORD32 len_end;
102*15dc779aSAndroid Build Coastguard Worker
103*15dc779aSAndroid Build Coastguard Worker MAX_LEN = input_table[0];
104*15dc779aSAndroid Build Coastguard Worker mask = mask - (1 << (31 - MAX_LEN));
105*15dc779aSAndroid Build Coastguard Worker mask = mask << 1;
106*15dc779aSAndroid Build Coastguard Worker temp = (UWORD32)(it_bit_buff & mask);
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker len_end = input_table[0];
109*15dc779aSAndroid Build Coastguard Worker clo = ixheaacd_cnt_leading_ones(temp);
110*15dc779aSAndroid Build Coastguard Worker do {
111*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset = (idx_table[clo] >> 20) & 0xff;
112*15dc779aSAndroid Build Coastguard Worker length = input_table[ixheaacd_drc_offset + 1] & 0x1f;
113*15dc779aSAndroid Build Coastguard Worker cwrd = idx_table[clo] & 0xfffff;
114*15dc779aSAndroid Build Coastguard Worker temp1 = temp >> (32 - length);
115*15dc779aSAndroid Build Coastguard Worker if (temp1 <= cwrd) {
116*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset = ixheaacd_drc_offset - (cwrd - temp1);
117*15dc779aSAndroid Build Coastguard Worker found = 1;
118*15dc779aSAndroid Build Coastguard Worker } else {
119*15dc779aSAndroid Build Coastguard Worker len_end = len_end + ((idx_table[clo] >> 28) & 0xf);
120*15dc779aSAndroid Build Coastguard Worker clo = len_end;
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker } while (!found);
123*15dc779aSAndroid Build Coastguard Worker *h_index = input_table[ixheaacd_drc_offset + 1] >> 5;
124*15dc779aSAndroid Build Coastguard Worker *len = length;
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct * ptr_pvc_data,ia_bit_buf_struct * it_bit_buff,WORD32 indepFlag)127*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data,
128*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
129*15dc779aSAndroid Build Coastguard Worker WORD32 indepFlag) {
130*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, k;
131*15dc779aSAndroid Build Coastguard Worker WORD32 fixed_length = 0, num_grid_info = 0, grid_info;
132*15dc779aSAndroid Build Coastguard Worker UWORD8 div_mode, ns_mode;
133*15dc779aSAndroid Build Coastguard Worker UWORD16 pvc_id[PVC_NUM_TIME_SLOTS + 1];
134*15dc779aSAndroid Build Coastguard Worker UWORD8 num_length;
135*15dc779aSAndroid Build Coastguard Worker UWORD8 length;
136*15dc779aSAndroid Build Coastguard Worker UWORD8 reuse_pvc_id;
137*15dc779aSAndroid Build Coastguard Worker WORD32 sum_length = 0;
138*15dc779aSAndroid Build Coastguard Worker WORD32 length_bits = 4;
139*15dc779aSAndroid Build Coastguard Worker UWORD8 pvc_id_bits = PVC_ID_BITS;
140*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
141*15dc779aSAndroid Build Coastguard Worker
142*15dc779aSAndroid Build Coastguard Worker div_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_DIV_MODE_BITS);
143*15dc779aSAndroid Build Coastguard Worker ns_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_NS_MODE_BITS);
144*15dc779aSAndroid Build Coastguard Worker
145*15dc779aSAndroid Build Coastguard Worker if (ptr_pvc_data->pvc_mode == 3) {
146*15dc779aSAndroid Build Coastguard Worker pvc_id_bits = 0;
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker
149*15dc779aSAndroid Build Coastguard Worker if (div_mode <= 3) {
150*15dc779aSAndroid Build Coastguard Worker num_length = div_mode;
151*15dc779aSAndroid Build Coastguard Worker if (indepFlag) {
152*15dc779aSAndroid Build Coastguard Worker reuse_pvc_id = 0;
153*15dc779aSAndroid Build Coastguard Worker } else {
154*15dc779aSAndroid Build Coastguard Worker reuse_pvc_id =
155*15dc779aSAndroid Build Coastguard Worker (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_REUSE_PVC_ID_BITS);
156*15dc779aSAndroid Build Coastguard Worker }
157*15dc779aSAndroid Build Coastguard Worker if (reuse_pvc_id == 1) {
158*15dc779aSAndroid Build Coastguard Worker pvc_id[0] = ptr_pvc_data->prev_pvc_id;
159*15dc779aSAndroid Build Coastguard Worker } else {
160*15dc779aSAndroid Build Coastguard Worker pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
161*15dc779aSAndroid Build Coastguard Worker }
162*15dc779aSAndroid Build Coastguard Worker
163*15dc779aSAndroid Build Coastguard Worker k = 1;
164*15dc779aSAndroid Build Coastguard Worker if (num_length) {
165*15dc779aSAndroid Build Coastguard Worker sum_length = 0;
166*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_length; i++) {
167*15dc779aSAndroid Build Coastguard Worker if (sum_length >= 13) {
168*15dc779aSAndroid Build Coastguard Worker length_bits = 1;
169*15dc779aSAndroid Build Coastguard Worker } else if (sum_length >= 11) {
170*15dc779aSAndroid Build Coastguard Worker length_bits = 2;
171*15dc779aSAndroid Build Coastguard Worker } else if (sum_length >= 7) {
172*15dc779aSAndroid Build Coastguard Worker length_bits = 3;
173*15dc779aSAndroid Build Coastguard Worker } else {
174*15dc779aSAndroid Build Coastguard Worker length_bits = 4;
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker length = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, length_bits);
177*15dc779aSAndroid Build Coastguard Worker length += 1;
178*15dc779aSAndroid Build Coastguard Worker sum_length += length;
179*15dc779aSAndroid Build Coastguard Worker if ((k + length - 1) > PVC_NUM_TIME_SLOTS) {
180*15dc779aSAndroid Build Coastguard Worker return -1;
181*15dc779aSAndroid Build Coastguard Worker }
182*15dc779aSAndroid Build Coastguard Worker for (j = 1; j < length; j++, k++) {
183*15dc779aSAndroid Build Coastguard Worker pvc_id[k] = pvc_id[k - 1];
184*15dc779aSAndroid Build Coastguard Worker }
185*15dc779aSAndroid Build Coastguard Worker pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
186*15dc779aSAndroid Build Coastguard Worker }
187*15dc779aSAndroid Build Coastguard Worker }
188*15dc779aSAndroid Build Coastguard Worker
189*15dc779aSAndroid Build Coastguard Worker for (; k < 16; k++) {
190*15dc779aSAndroid Build Coastguard Worker pvc_id[k] = pvc_id[k - 1];
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker } else {
194*15dc779aSAndroid Build Coastguard Worker switch (div_mode) {
195*15dc779aSAndroid Build Coastguard Worker case 4:
196*15dc779aSAndroid Build Coastguard Worker num_grid_info = 2;
197*15dc779aSAndroid Build Coastguard Worker fixed_length = 8;
198*15dc779aSAndroid Build Coastguard Worker break;
199*15dc779aSAndroid Build Coastguard Worker case 5:
200*15dc779aSAndroid Build Coastguard Worker num_grid_info = 4;
201*15dc779aSAndroid Build Coastguard Worker fixed_length = 4;
202*15dc779aSAndroid Build Coastguard Worker break;
203*15dc779aSAndroid Build Coastguard Worker case 6:
204*15dc779aSAndroid Build Coastguard Worker num_grid_info = 8;
205*15dc779aSAndroid Build Coastguard Worker fixed_length = 2;
206*15dc779aSAndroid Build Coastguard Worker break;
207*15dc779aSAndroid Build Coastguard Worker case 7:
208*15dc779aSAndroid Build Coastguard Worker num_grid_info = 16;
209*15dc779aSAndroid Build Coastguard Worker fixed_length = 1;
210*15dc779aSAndroid Build Coastguard Worker break;
211*15dc779aSAndroid Build Coastguard Worker default:;
212*15dc779aSAndroid Build Coastguard Worker }
213*15dc779aSAndroid Build Coastguard Worker if (indepFlag) {
214*15dc779aSAndroid Build Coastguard Worker grid_info = 1;
215*15dc779aSAndroid Build Coastguard Worker } else {
216*15dc779aSAndroid Build Coastguard Worker grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS);
217*15dc779aSAndroid Build Coastguard Worker }
218*15dc779aSAndroid Build Coastguard Worker if (grid_info) {
219*15dc779aSAndroid Build Coastguard Worker pvc_id[0] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
220*15dc779aSAndroid Build Coastguard Worker } else {
221*15dc779aSAndroid Build Coastguard Worker pvc_id[0] = ptr_pvc_data->prev_pvc_id;
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker for (j = 1, k = 1; j < fixed_length; j++, k++) {
224*15dc779aSAndroid Build Coastguard Worker pvc_id[k] = pvc_id[k - 1];
225*15dc779aSAndroid Build Coastguard Worker }
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < num_grid_info; i++) {
228*15dc779aSAndroid Build Coastguard Worker grid_info = ixheaacd_read_bits_buf(it_bit_buff, PVC_GRID_INFO_BITS);
229*15dc779aSAndroid Build Coastguard Worker if (grid_info == 1) {
230*15dc779aSAndroid Build Coastguard Worker pvc_id[k++] = (UWORD16)ixheaacd_read_bits_buf(it_bit_buff, pvc_id_bits);
231*15dc779aSAndroid Build Coastguard Worker } else {
232*15dc779aSAndroid Build Coastguard Worker pvc_id[k] = pvc_id[k - 1];
233*15dc779aSAndroid Build Coastguard Worker k++;
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker for (j = 1; j < fixed_length; j++, k++) {
236*15dc779aSAndroid Build Coastguard Worker pvc_id[k] = pvc_id[k - 1];
237*15dc779aSAndroid Build Coastguard Worker }
238*15dc779aSAndroid Build Coastguard Worker }
239*15dc779aSAndroid Build Coastguard Worker }
240*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->div_mode = div_mode;
241*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->ns_mode = ns_mode;
242*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < PVC_NUM_TIME_SLOTS; i++) {
243*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->pvc_id[i] = pvc_id[i];
244*15dc779aSAndroid Build Coastguard Worker }
245*15dc779aSAndroid Build Coastguard Worker return err;
246*15dc779aSAndroid Build Coastguard Worker }
247*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pvc_env_dtdf_data(ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff)248*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_pvc_env_dtdf_data(
249*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
250*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
251*15dc779aSAndroid Build Coastguard Worker WORD32 i;
252*15dc779aSAndroid Build Coastguard Worker WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
253*15dc779aSAndroid Build Coastguard Worker WORD32 bs_num_noise = ptr_frame_data->str_frame_info_details.num_noise_env;
254*15dc779aSAndroid Build Coastguard Worker
255*15dc779aSAndroid Build Coastguard Worker if (usac_independency_flag) {
256*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->del_cod_dir_noise_arr[0] = 0;
257*15dc779aSAndroid Build Coastguard Worker } else {
258*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->del_cod_dir_noise_arr[0] =
259*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS);
260*15dc779aSAndroid Build Coastguard Worker }
261*15dc779aSAndroid Build Coastguard Worker
262*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < bs_num_noise; i++) {
263*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->del_cod_dir_noise_arr[i] =
264*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_DOMAIN_BITS);
265*15dc779aSAndroid Build Coastguard Worker }
266*15dc779aSAndroid Build Coastguard Worker }
267*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_sbr_addi_data(ia_sbr_frame_info_data_struct * ptr_frame_data,ia_sbr_header_data_struct * ptr_header_data,ia_bit_buf_struct * it_bit_buff)268*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_read_sbr_addi_data(
269*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
270*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
271*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
272*15dc779aSAndroid Build Coastguard Worker WORD32 i;
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
275*15dc779aSAndroid Build Coastguard Worker
276*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_cur_top =
277*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top;
278*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_cur_top = ptr_frame_data->sin_len_for_next_top;
279*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top = 0;
280*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_next_top = 0;
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker if (flag) {
283*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
284*15dc779aSAndroid Build Coastguard Worker i++) {
285*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->add_harmonics[i] = ixheaacd_read_bits_buf(it_bit_buff, 1);
286*15dc779aSAndroid Build Coastguard Worker }
287*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->pvc_mode != 0) {
288*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sine_position = ESC_SIN_POS;
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->bs_sin_pos_present =
291*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 1);
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->bs_sin_pos_present == 1) {
294*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sine_position = ixheaacd_read_bits_buf(it_bit_buff, 5);
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->var_len > 0) {
297*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->sine_position > 16) {
298*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->sine_position == 31) {
299*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top = 0;
300*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
301*15dc779aSAndroid Build Coastguard Worker } else {
302*15dc779aSAndroid Build Coastguard Worker if ((ptr_frame_data->var_len + 16) ==
303*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sine_position) {
304*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top = 0;
305*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
306*15dc779aSAndroid Build Coastguard Worker } else {
307*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top =
308*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sine_position - 16;
309*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
310*15dc779aSAndroid Build Coastguard Worker }
311*15dc779aSAndroid Build Coastguard Worker }
312*15dc779aSAndroid Build Coastguard Worker } else {
313*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top = 0;
314*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_next_top = ptr_frame_data->var_len;
315*15dc779aSAndroid Build Coastguard Worker }
316*15dc779aSAndroid Build Coastguard Worker } else {
317*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_start_for_next_top = 0;
318*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sin_len_for_next_top = 0;
319*15dc779aSAndroid Build Coastguard Worker }
320*15dc779aSAndroid Build Coastguard Worker }
321*15dc779aSAndroid Build Coastguard Worker }
322*15dc779aSAndroid Build Coastguard Worker return;
323*15dc779aSAndroid Build Coastguard Worker }
324*15dc779aSAndroid Build Coastguard Worker
ixheaacd_ssc_huff_dec(ia_huffman_data_type t_huff,ia_bit_buf_struct * it_bit_buff)325*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type t_huff,
326*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
327*15dc779aSAndroid Build Coastguard Worker WORD32 index;
328*15dc779aSAndroid Build Coastguard Worker WORD32 value, bit;
329*15dc779aSAndroid Build Coastguard Worker WORD16 cw;
330*15dc779aSAndroid Build Coastguard Worker index = 0;
331*15dc779aSAndroid Build Coastguard Worker
332*15dc779aSAndroid Build Coastguard Worker while (index >= 0) {
333*15dc779aSAndroid Build Coastguard Worker cw = t_huff[index];
334*15dc779aSAndroid Build Coastguard Worker
335*15dc779aSAndroid Build Coastguard Worker bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker if (bit) {
338*15dc779aSAndroid Build Coastguard Worker WORD sign = (cw & 0x0080);
339*15dc779aSAndroid Build Coastguard Worker if (sign) {
340*15dc779aSAndroid Build Coastguard Worker index = (cw | 0xffffff80);
341*15dc779aSAndroid Build Coastguard Worker } else {
342*15dc779aSAndroid Build Coastguard Worker index = (cw & 0x007f);
343*15dc779aSAndroid Build Coastguard Worker }
344*15dc779aSAndroid Build Coastguard Worker } else {
345*15dc779aSAndroid Build Coastguard Worker index = (cw >> 8);
346*15dc779aSAndroid Build Coastguard Worker }
347*15dc779aSAndroid Build Coastguard Worker }
348*15dc779aSAndroid Build Coastguard Worker
349*15dc779aSAndroid Build Coastguard Worker value = (index + 64);
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker return (value);
352*15dc779aSAndroid Build Coastguard Worker }
353*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_read_header_data(ia_sbr_header_data_struct * pstr_sbr_header,ia_bit_buf_struct * it_bit_buff,FLAG stereo_flag,ia_sbr_header_data_struct * pstr_sbr_dflt_header)354*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_sbr_read_header_data(
355*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *pstr_sbr_header, ia_bit_buf_struct *it_bit_buff,
356*15dc779aSAndroid Build Coastguard Worker FLAG stereo_flag, ia_sbr_header_data_struct *pstr_sbr_dflt_header) {
357*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct prev_header_info;
358*15dc779aSAndroid Build Coastguard Worker prev_header_info.start_freq = 0;
359*15dc779aSAndroid Build Coastguard Worker prev_header_info.noise_bands = 0;
360*15dc779aSAndroid Build Coastguard Worker FLAG header_extra_1 = 0, header_extra_2 = 0;
361*15dc779aSAndroid Build Coastguard Worker WORD32 tmp;
362*15dc779aSAndroid Build Coastguard Worker WORD32 usac_independency_flag = pstr_sbr_header->usac_independency_flag;
363*15dc779aSAndroid Build Coastguard Worker WORD32 use_dflt_hdr = 0;
364*15dc779aSAndroid Build Coastguard Worker WORD32 header_present = 1;
365*15dc779aSAndroid Build Coastguard Worker WORD32 usac_flag = pstr_sbr_header->usac_flag;
366*15dc779aSAndroid Build Coastguard Worker
367*15dc779aSAndroid Build Coastguard Worker if (!usac_flag) {
368*15dc779aSAndroid Build Coastguard Worker memcpy(&prev_header_info, pstr_sbr_header,
369*15dc779aSAndroid Build Coastguard Worker sizeof(ia_sbr_header_data_struct));
370*15dc779aSAndroid Build Coastguard Worker
371*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(
372*15dc779aSAndroid Build Coastguard Worker it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS + SBR_BEGIN_SAMP_FREQ_BITS +
373*15dc779aSAndroid Build Coastguard Worker SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS);
374*15dc779aSAndroid Build Coastguard Worker
375*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->amp_res = (WORD16)(
376*15dc779aSAndroid Build Coastguard Worker (tmp & 0x0800) >> (SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS +
377*15dc779aSAndroid Build Coastguard Worker SBR_CROSS_OVER_BND_BITS));
378*15dc779aSAndroid Build Coastguard Worker
379*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->start_freq = (WORD16)(
380*15dc779aSAndroid Build Coastguard Worker (tmp & 0x0780) >> (SBR_END_SAMP_FREQ_BITS + SBR_CROSS_OVER_BND_BITS));
381*15dc779aSAndroid Build Coastguard Worker
382*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->stop_freq =
383*15dc779aSAndroid Build Coastguard Worker (WORD16)((tmp & 0x078) >> (SBR_CROSS_OVER_BND_BITS));
384*15dc779aSAndroid Build Coastguard Worker
385*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->xover_band = (WORD16)((tmp & 0x07));
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(
388*15dc779aSAndroid Build Coastguard Worker it_bit_buff,
389*15dc779aSAndroid Build Coastguard Worker SBR_HDR_RESERV_BITS + SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
390*15dc779aSAndroid Build Coastguard Worker header_extra_1 = (FLAG)((tmp & 0x02) >> (SBR_HDR_EXTR_2_BITS));
391*15dc779aSAndroid Build Coastguard Worker header_extra_2 = (FLAG)((tmp & 0x01));
392*15dc779aSAndroid Build Coastguard Worker if (stereo_flag) {
393*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->channel_mode = SBR_STEREO;
394*15dc779aSAndroid Build Coastguard Worker } else {
395*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->channel_mode = SBR_MONO;
396*15dc779aSAndroid Build Coastguard Worker }
397*15dc779aSAndroid Build Coastguard Worker } else {
398*15dc779aSAndroid Build Coastguard Worker WORD32 info_present = 0;
399*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_header->sync_state == SBR_ACTIVE) {
400*15dc779aSAndroid Build Coastguard Worker memcpy(&prev_header_info, pstr_sbr_header,
401*15dc779aSAndroid Build Coastguard Worker sizeof(ia_sbr_header_data_struct));
402*15dc779aSAndroid Build Coastguard Worker }
403*15dc779aSAndroid Build Coastguard Worker if (usac_independency_flag) {
404*15dc779aSAndroid Build Coastguard Worker header_present = 1;
405*15dc779aSAndroid Build Coastguard Worker info_present = 1;
406*15dc779aSAndroid Build Coastguard Worker } else {
407*15dc779aSAndroid Build Coastguard Worker info_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
408*15dc779aSAndroid Build Coastguard Worker if (info_present) {
409*15dc779aSAndroid Build Coastguard Worker header_present = ixheaacd_read_bits_buf(it_bit_buff, 1);
410*15dc779aSAndroid Build Coastguard Worker } else {
411*15dc779aSAndroid Build Coastguard Worker header_present = 0;
412*15dc779aSAndroid Build Coastguard Worker }
413*15dc779aSAndroid Build Coastguard Worker }
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker if (info_present) {
416*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS +
417*15dc779aSAndroid Build Coastguard Worker ESBR_CROSS_OVER_BND_BITS +
418*15dc779aSAndroid Build Coastguard Worker ESBR_PRE_FLAT_BITS);
419*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->amp_res = (WORD16)(
420*15dc779aSAndroid Build Coastguard Worker (tmp & 0x0020) >> (ESBR_CROSS_OVER_BND_BITS + ESBR_PRE_FLAT_BITS));
421*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->xover_band =
422*15dc779aSAndroid Build Coastguard Worker (WORD16)((tmp & 0x001E) >> (ESBR_PRE_FLAT_BITS));
423*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->pre_proc_flag = (WORD16)((tmp & 0x001));
424*15dc779aSAndroid Build Coastguard Worker if (pstr_sbr_header->pvc_flag) {
425*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->pvc_mode =
426*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PVC_MODE_BITS);
427*15dc779aSAndroid Build Coastguard Worker } else {
428*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->pvc_mode = 0;
429*15dc779aSAndroid Build Coastguard Worker }
430*15dc779aSAndroid Build Coastguard Worker }
431*15dc779aSAndroid Build Coastguard Worker
432*15dc779aSAndroid Build Coastguard Worker if (header_present) {
433*15dc779aSAndroid Build Coastguard Worker use_dflt_hdr = ixheaacd_read_bits_buf(it_bit_buff, 1);
434*15dc779aSAndroid Build Coastguard Worker if (use_dflt_hdr) {
435*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->start_freq = pstr_sbr_dflt_header->start_freq;
436*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->stop_freq = pstr_sbr_dflt_header->stop_freq;
437*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->header_extra_1 = pstr_sbr_dflt_header->header_extra_1;
438*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->header_extra_2 = pstr_sbr_dflt_header->header_extra_2;
439*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->freq_scale = pstr_sbr_dflt_header->freq_scale;
440*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->alter_scale = pstr_sbr_dflt_header->alter_scale;
441*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->noise_bands = pstr_sbr_dflt_header->noise_bands;
442*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->limiter_bands = pstr_sbr_dflt_header->limiter_bands;
443*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->limiter_gains = pstr_sbr_dflt_header->limiter_gains;
444*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->interpol_freq = pstr_sbr_dflt_header->interpol_freq;
445*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->smoothing_mode = pstr_sbr_dflt_header->smoothing_mode;
446*15dc779aSAndroid Build Coastguard Worker } else {
447*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(
448*15dc779aSAndroid Build Coastguard Worker it_bit_buff, SBR_BEGIN_SAMP_FREQ_BITS + SBR_END_SAMP_FREQ_BITS +
449*15dc779aSAndroid Build Coastguard Worker SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
450*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->start_freq =
451*15dc779aSAndroid Build Coastguard Worker (tmp & 0x03C0) >> (SBR_END_SAMP_FREQ_BITS + SBR_HDR_EXTR_1_BITS +
452*15dc779aSAndroid Build Coastguard Worker SBR_HDR_EXTR_2_BITS);
453*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->stop_freq =
454*15dc779aSAndroid Build Coastguard Worker (tmp & 0x003C) >> (SBR_HDR_EXTR_1_BITS + SBR_HDR_EXTR_2_BITS);
455*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->header_extra_1 =
456*15dc779aSAndroid Build Coastguard Worker (tmp & 0x0002) >> (SBR_HDR_EXTR_2_BITS);
457*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->header_extra_2 = (tmp & 0x0001);
458*15dc779aSAndroid Build Coastguard Worker header_extra_1 = pstr_sbr_header->header_extra_1;
459*15dc779aSAndroid Build Coastguard Worker header_extra_2 = pstr_sbr_header->header_extra_2;
460*15dc779aSAndroid Build Coastguard Worker }
461*15dc779aSAndroid Build Coastguard Worker }
462*15dc779aSAndroid Build Coastguard Worker }
463*15dc779aSAndroid Build Coastguard Worker
464*15dc779aSAndroid Build Coastguard Worker if (!use_dflt_hdr && header_present) {
465*15dc779aSAndroid Build Coastguard Worker if (header_extra_1) {
466*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(
467*15dc779aSAndroid Build Coastguard Worker it_bit_buff,
468*15dc779aSAndroid Build Coastguard Worker SBR_SAMP_FREQ_LVL_BITS + SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS);
469*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->freq_scale =
470*15dc779aSAndroid Build Coastguard Worker (WORD16)((tmp & 0x018) >> (SBR_CHANGE_LVL_BITS + SBR_NOISE_BND_BITS));
471*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->alter_scale =
472*15dc779aSAndroid Build Coastguard Worker (WORD16)((tmp & 0x04) >> (SBR_NOISE_BND_BITS));
473*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->noise_bands = (WORD16)((tmp & 0x03));
474*15dc779aSAndroid Build Coastguard Worker } else {
475*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->freq_scale = SBR_SAMP_FEQ_LVL_DEF;
476*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->alter_scale = SBR_CHANGE_LVL_DEF;
477*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->noise_bands = SBR_NOISE_BND_DEF;
478*15dc779aSAndroid Build Coastguard Worker }
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker if (header_extra_2) {
481*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(
482*15dc779aSAndroid Build Coastguard Worker it_bit_buff, SBR_BND_LIMIT_BITS + SBR_GAIN_LIMIT_BITS +
483*15dc779aSAndroid Build Coastguard Worker SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS);
484*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->limiter_bands = (WORD16)(
485*15dc779aSAndroid Build Coastguard Worker (tmp & 0x030) >> (SBR_GAIN_LIMIT_BITS + SBR_INTERPOL_SAMP_FREQ_BITS +
486*15dc779aSAndroid Build Coastguard Worker SBR_SMOOTH_LEN_BITS));
487*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->limiter_gains = (WORD16)(
488*15dc779aSAndroid Build Coastguard Worker (tmp & 0x0c) >> (SBR_INTERPOL_SAMP_FREQ_BITS + SBR_SMOOTH_LEN_BITS));
489*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->interpol_freq =
490*15dc779aSAndroid Build Coastguard Worker (WORD16)((tmp & 0x02) >> (SBR_SMOOTH_LEN_BITS));
491*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->smoothing_mode = (WORD16)((tmp & 0x01));
492*15dc779aSAndroid Build Coastguard Worker } else {
493*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->limiter_bands = SBR_BND_LIMIT_DEF;
494*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->limiter_gains = SBR_GAIN_LIMIT_DEF;
495*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->interpol_freq = SBR_INTERPOL_SAMP_FEQ_DEF;
496*15dc779aSAndroid Build Coastguard Worker pstr_sbr_header->smoothing_mode = SBR_SMOOTH_LEN_DEF;
497*15dc779aSAndroid Build Coastguard Worker }
498*15dc779aSAndroid Build Coastguard Worker }
499*15dc779aSAndroid Build Coastguard Worker
500*15dc779aSAndroid Build Coastguard Worker if ((pstr_sbr_header->sync_state != SBR_ACTIVE) ||
501*15dc779aSAndroid Build Coastguard Worker (prev_header_info.start_freq != pstr_sbr_header->start_freq) ||
502*15dc779aSAndroid Build Coastguard Worker (prev_header_info.stop_freq != pstr_sbr_header->stop_freq) ||
503*15dc779aSAndroid Build Coastguard Worker (prev_header_info.xover_band != pstr_sbr_header->xover_band) ||
504*15dc779aSAndroid Build Coastguard Worker (prev_header_info.freq_scale != pstr_sbr_header->freq_scale) ||
505*15dc779aSAndroid Build Coastguard Worker (prev_header_info.alter_scale != pstr_sbr_header->alter_scale) ||
506*15dc779aSAndroid Build Coastguard Worker (prev_header_info.noise_bands != pstr_sbr_header->noise_bands)) {
507*15dc779aSAndroid Build Coastguard Worker return SBR_RESET;
508*15dc779aSAndroid Build Coastguard Worker }
509*15dc779aSAndroid Build Coastguard Worker
510*15dc779aSAndroid Build Coastguard Worker return 0;
511*15dc779aSAndroid Build Coastguard Worker }
512*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_sin_coding_data(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff)513*15dc779aSAndroid Build Coastguard Worker static VOID ixheaacd_sbr_sin_coding_data(
514*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
515*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
516*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff) {
517*15dc779aSAndroid Build Coastguard Worker FLAG *p_add_harmonic = ptr_frame_data->add_harmonics;
518*15dc779aSAndroid Build Coastguard Worker WORD32 i;
519*15dc779aSAndroid Build Coastguard Worker
520*15dc779aSAndroid Build Coastguard Worker i = ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH];
521*15dc779aSAndroid Build Coastguard Worker do {
522*15dc779aSAndroid Build Coastguard Worker *p_add_harmonic++ =
523*15dc779aSAndroid Build Coastguard Worker (FLAG)ixheaacd_read_bits_buf(it_bit_buff, SBR_ADD_SINE_FLAG_BITS);
524*15dc779aSAndroid Build Coastguard Worker i--;
525*15dc779aSAndroid Build Coastguard Worker } while (i != 0);
526*15dc779aSAndroid Build Coastguard Worker
527*15dc779aSAndroid Build Coastguard Worker return;
528*15dc779aSAndroid Build Coastguard Worker }
529*15dc779aSAndroid Build Coastguard Worker
ixheaacd_validate_frame_info(ia_frame_info_struct * pstr_frame_info,WORD16 num_time_slots,WORD audio_object_type)530*15dc779aSAndroid Build Coastguard Worker static WORD16 ixheaacd_validate_frame_info(
531*15dc779aSAndroid Build Coastguard Worker ia_frame_info_struct *pstr_frame_info, WORD16 num_time_slots,
532*15dc779aSAndroid Build Coastguard Worker WORD audio_object_type) {
533*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
534*15dc779aSAndroid Build Coastguard Worker
535*15dc779aSAndroid Build Coastguard Worker WORD32 start_pos, end_pos, transient_env, start_pos_noise, end_pos_noise,
536*15dc779aSAndroid Build Coastguard Worker num_env_sf, num_noise_env;
537*15dc779aSAndroid Build Coastguard Worker
538*15dc779aSAndroid Build Coastguard Worker num_env_sf = pstr_frame_info->num_env;
539*15dc779aSAndroid Build Coastguard Worker num_noise_env = pstr_frame_info->num_noise_env;
540*15dc779aSAndroid Build Coastguard Worker
541*15dc779aSAndroid Build Coastguard Worker if ((num_env_sf < 1) || (num_env_sf > MAX_ENVELOPES)) return 0;
542*15dc779aSAndroid Build Coastguard Worker
543*15dc779aSAndroid Build Coastguard Worker if (num_noise_env > MAX_NOISE_ENVELOPES) return 0;
544*15dc779aSAndroid Build Coastguard Worker
545*15dc779aSAndroid Build Coastguard Worker start_pos = pstr_frame_info->border_vec[0];
546*15dc779aSAndroid Build Coastguard Worker end_pos = pstr_frame_info->border_vec[num_env_sf];
547*15dc779aSAndroid Build Coastguard Worker transient_env = pstr_frame_info->transient_env;
548*15dc779aSAndroid Build Coastguard Worker
549*15dc779aSAndroid Build Coastguard Worker if (transient_env > num_env_sf) return 0;
550*15dc779aSAndroid Build Coastguard Worker
551*15dc779aSAndroid Build Coastguard Worker start_pos_noise = pstr_frame_info->noise_border_vec[0];
552*15dc779aSAndroid Build Coastguard Worker end_pos_noise = pstr_frame_info->noise_border_vec[num_noise_env];
553*15dc779aSAndroid Build Coastguard Worker
554*15dc779aSAndroid Build Coastguard Worker if ((start_pos < 0) || (start_pos >= end_pos)) return 0;
555*15dc779aSAndroid Build Coastguard Worker
556*15dc779aSAndroid Build Coastguard Worker if (start_pos > SBR_OV_SLOTS) return 0;
557*15dc779aSAndroid Build Coastguard Worker if (audio_object_type != AOT_ER_AAC_ELD &&
558*15dc779aSAndroid Build Coastguard Worker audio_object_type != AOT_ER_AAC_LD) {
559*15dc779aSAndroid Build Coastguard Worker if (num_time_slots != 15) {
560*15dc779aSAndroid Build Coastguard Worker if (end_pos < SBR_TIME_SLOTS) return 0;
561*15dc779aSAndroid Build Coastguard Worker } else {
562*15dc779aSAndroid Build Coastguard Worker if (end_pos < num_time_slots) return 0;
563*15dc779aSAndroid Build Coastguard Worker }
564*15dc779aSAndroid Build Coastguard Worker } else {
565*15dc779aSAndroid Build Coastguard Worker if (end_pos < num_time_slots) return 0;
566*15dc779aSAndroid Build Coastguard Worker }
567*15dc779aSAndroid Build Coastguard Worker
568*15dc779aSAndroid Build Coastguard Worker if (num_time_slots != 15) {
569*15dc779aSAndroid Build Coastguard Worker if (end_pos > add_d(SBR_TIME_SLOTS, SBR_OV_SLOTS)) return 0;
570*15dc779aSAndroid Build Coastguard Worker } else {
571*15dc779aSAndroid Build Coastguard Worker if (end_pos > add_d(num_time_slots, SBR_OV_SLOTS)) return 0;
572*15dc779aSAndroid Build Coastguard Worker }
573*15dc779aSAndroid Build Coastguard Worker
574*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_env_sf; i++) {
575*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_info->border_vec[i] > pstr_frame_info->border_vec[i + 1])
576*15dc779aSAndroid Build Coastguard Worker return 0;
577*15dc779aSAndroid Build Coastguard Worker }
578*15dc779aSAndroid Build Coastguard Worker
579*15dc779aSAndroid Build Coastguard Worker if ((num_env_sf == 1) && (num_noise_env > 1)) return 0;
580*15dc779aSAndroid Build Coastguard Worker
581*15dc779aSAndroid Build Coastguard Worker if ((start_pos != start_pos_noise) || (end_pos != end_pos_noise)) return 0;
582*15dc779aSAndroid Build Coastguard Worker
583*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_noise_env; i++) {
584*15dc779aSAndroid Build Coastguard Worker start_pos_noise = pstr_frame_info->noise_border_vec[i];
585*15dc779aSAndroid Build Coastguard Worker
586*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_env_sf; j++) {
587*15dc779aSAndroid Build Coastguard Worker if (pstr_frame_info->border_vec[j] == start_pos_noise) break;
588*15dc779aSAndroid Build Coastguard Worker }
589*15dc779aSAndroid Build Coastguard Worker if (j == num_env_sf) return 0;
590*15dc779aSAndroid Build Coastguard Worker }
591*15dc779aSAndroid Build Coastguard Worker
592*15dc779aSAndroid Build Coastguard Worker return 1;
593*15dc779aSAndroid Build Coastguard Worker }
594*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_enh_sbr_data(ia_sbr_header_data_struct * ptr_header_data,ia_bit_buf_struct * it_bit_buff,VOID * p_frame_data,WORD32 ele_id)595*15dc779aSAndroid Build Coastguard Worker static WORD16 ixheaacd_read_enh_sbr_data(
596*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
597*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
598*15dc779aSAndroid Build Coastguard Worker VOID *p_frame_data,
599*15dc779aSAndroid Build Coastguard Worker WORD32 ele_id) {
600*15dc779aSAndroid Build Coastguard Worker WORD32 tmp = 0;
601*15dc779aSAndroid Build Coastguard Worker WORD16 num_bits_read = 0;
602*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PRE_FLAT_BITS);
603*15dc779aSAndroid Build Coastguard Worker ptr_header_data->pre_proc_flag = tmp;
604*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PRE_FLAT_BITS;
605*15dc779aSAndroid Build Coastguard Worker
606*15dc779aSAndroid Build Coastguard Worker if (ele_id == SBR_ID_SCE) {
607*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data =
608*15dc779aSAndroid Build Coastguard Worker (ia_sbr_frame_info_data_struct *)p_frame_data;
609*15dc779aSAndroid Build Coastguard Worker
610*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
611*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_patching_mode = tmp;
612*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PATCHING_MODE_BITS;
613*15dc779aSAndroid Build Coastguard Worker
614*15dc779aSAndroid Build Coastguard Worker if (tmp == 0) {
615*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
616*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->over_sampling_flag = tmp;
617*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
618*15dc779aSAndroid Build Coastguard Worker
619*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS);
620*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_FLAG_BITS;
621*15dc779aSAndroid Build Coastguard Worker
622*15dc779aSAndroid Build Coastguard Worker if (tmp) {
623*15dc779aSAndroid Build Coastguard Worker tmp =
624*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
625*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins = tmp;
626*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_BINS_BITS;
627*15dc779aSAndroid Build Coastguard Worker } else {
628*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins = 0;
629*15dc779aSAndroid Build Coastguard Worker }
630*15dc779aSAndroid Build Coastguard Worker } else {
631*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->over_sampling_flag = 0;
632*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins = 0;
633*15dc779aSAndroid Build Coastguard Worker }
634*15dc779aSAndroid Build Coastguard Worker } else if (ele_id == SBR_ID_CPE) {
635*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct **ptr_frame_data =
636*15dc779aSAndroid Build Coastguard Worker (ia_sbr_frame_info_data_struct **)p_frame_data;
637*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->coupling_mode) {
638*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_patching_mode =
639*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_patching_mode =
640*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
641*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PATCHING_MODE_BITS;
642*15dc779aSAndroid Build Coastguard Worker
643*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->sbr_patching_mode == 0) {
644*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag =
645*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag =
646*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
647*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
648*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_FLAG_BITS;
649*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
650*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins =
651*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins =
652*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
653*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_BINS_BITS;
654*15dc779aSAndroid Build Coastguard Worker } else {
655*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
656*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
657*15dc779aSAndroid Build Coastguard Worker }
658*15dc779aSAndroid Build Coastguard Worker } else {
659*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag = 0;
660*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
661*15dc779aSAndroid Build Coastguard Worker
662*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag = 0;
663*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
664*15dc779aSAndroid Build Coastguard Worker }
665*15dc779aSAndroid Build Coastguard Worker } else {
666*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_patching_mode =
667*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
668*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PATCHING_MODE_BITS;
669*15dc779aSAndroid Build Coastguard Worker
670*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->sbr_patching_mode == 0) {
671*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag =
672*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
673*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
674*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_FLAG_BITS;
675*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
676*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins =
677*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
678*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_BINS_BITS;
679*15dc779aSAndroid Build Coastguard Worker } else {
680*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
681*15dc779aSAndroid Build Coastguard Worker }
682*15dc779aSAndroid Build Coastguard Worker } else {
683*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag = 0;
684*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
685*15dc779aSAndroid Build Coastguard Worker }
686*15dc779aSAndroid Build Coastguard Worker
687*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_patching_mode =
688*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
689*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PATCHING_MODE_BITS;
690*15dc779aSAndroid Build Coastguard Worker
691*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[1]->sbr_patching_mode == 0) {
692*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag =
693*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
694*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_OVERSAMPLING_FLAG_BITS;
695*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_FLAG_BITS;
696*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS)) {
697*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins =
698*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
699*15dc779aSAndroid Build Coastguard Worker num_bits_read += ESBR_PITCHIN_BINS_BITS;
700*15dc779aSAndroid Build Coastguard Worker } else {
701*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
702*15dc779aSAndroid Build Coastguard Worker }
703*15dc779aSAndroid Build Coastguard Worker } else {
704*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag =
705*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
706*15dc779aSAndroid Build Coastguard Worker }
707*15dc779aSAndroid Build Coastguard Worker }
708*15dc779aSAndroid Build Coastguard Worker }
709*15dc779aSAndroid Build Coastguard Worker if (num_bits_read < 6) {
710*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 6 - num_bits_read);
711*15dc779aSAndroid Build Coastguard Worker num_bits_read = 6;
712*15dc779aSAndroid Build Coastguard Worker }
713*15dc779aSAndroid Build Coastguard Worker return num_bits_read;
714*15dc779aSAndroid Build Coastguard Worker }
715*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_extn_data(ia_sbr_header_data_struct * ptr_header_data,ia_ps_dec_struct * ptr_ps_dec,ia_bit_buf_struct * it_bit_buff,ia_ps_tables_struct * ps_tables_ptr,VOID * p_frame_data,WORD32 ele_id)716*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaacd_read_extn_data(ia_sbr_header_data_struct *ptr_header_data,
717*15dc779aSAndroid Build Coastguard Worker ia_ps_dec_struct *ptr_ps_dec,
718*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
719*15dc779aSAndroid Build Coastguard Worker ia_ps_tables_struct *ps_tables_ptr,
720*15dc779aSAndroid Build Coastguard Worker VOID *p_frame_data, WORD32 ele_id) {
721*15dc779aSAndroid Build Coastguard Worker WORD i;
722*15dc779aSAndroid Build Coastguard Worker WORD extended_data;
723*15dc779aSAndroid Build Coastguard Worker WORD no_bits_left;
724*15dc779aSAndroid Build Coastguard Worker
725*15dc779aSAndroid Build Coastguard Worker extended_data = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENLARGED_DATA_BITS);
726*15dc779aSAndroid Build Coastguard Worker
727*15dc779aSAndroid Build Coastguard Worker if (extended_data) {
728*15dc779aSAndroid Build Coastguard Worker WORD cnt;
729*15dc779aSAndroid Build Coastguard Worker FLAG ps_read;
730*15dc779aSAndroid Build Coastguard Worker
731*15dc779aSAndroid Build Coastguard Worker ps_read = 0;
732*15dc779aSAndroid Build Coastguard Worker
733*15dc779aSAndroid Build Coastguard Worker cnt = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_SIZE_BITS);
734*15dc779aSAndroid Build Coastguard Worker
735*15dc779aSAndroid Build Coastguard Worker if (cnt == ((1 << SBR_CONT_SIZE_BITS) - 1)) {
736*15dc779aSAndroid Build Coastguard Worker cnt = (cnt + ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ESC_CNT_BITS));
737*15dc779aSAndroid Build Coastguard Worker }
738*15dc779aSAndroid Build Coastguard Worker
739*15dc779aSAndroid Build Coastguard Worker no_bits_left = (cnt << 3);
740*15dc779aSAndroid Build Coastguard Worker
741*15dc779aSAndroid Build Coastguard Worker ptr_header_data->hbe_flag = !ptr_header_data->usac_flag;
742*15dc779aSAndroid Build Coastguard Worker ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1;
743*15dc779aSAndroid Build Coastguard Worker
744*15dc779aSAndroid Build Coastguard Worker while (no_bits_left > 7) {
745*15dc779aSAndroid Build Coastguard Worker WORD extension_id = ixheaacd_read_bits_buf(it_bit_buff, SBR_CONT_ID_BITS);
746*15dc779aSAndroid Build Coastguard Worker
747*15dc779aSAndroid Build Coastguard Worker if (extension_id == EXTENSION_ID_ENHSBR_CODING && !ptr_header_data->enh_sbr)
748*15dc779aSAndroid Build Coastguard Worker {
749*15dc779aSAndroid Build Coastguard Worker extension_id = -1;
750*15dc779aSAndroid Build Coastguard Worker }
751*15dc779aSAndroid Build Coastguard Worker no_bits_left = (no_bits_left - SBR_CONT_ID_BITS);
752*15dc779aSAndroid Build Coastguard Worker
753*15dc779aSAndroid Build Coastguard Worker switch (extension_id) {
754*15dc779aSAndroid Build Coastguard Worker case EXTENSION_ID_PS_CODING:
755*15dc779aSAndroid Build Coastguard Worker
756*15dc779aSAndroid Build Coastguard Worker if (ptr_ps_dec == NULL) {
757*15dc779aSAndroid Build Coastguard Worker return 0;
758*15dc779aSAndroid Build Coastguard Worker }
759*15dc779aSAndroid Build Coastguard Worker
760*15dc779aSAndroid Build Coastguard Worker if (!(ptr_ps_dec->force_mono || ps_read)) {
761*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ret_val = ixheaacd_read_ps_data(ptr_ps_dec, it_bit_buff,
762*15dc779aSAndroid Build Coastguard Worker (WORD16)no_bits_left, ps_tables_ptr);
763*15dc779aSAndroid Build Coastguard Worker if (ret_val == IA_FATAL_ERROR) {
764*15dc779aSAndroid Build Coastguard Worker return ret_val;
765*15dc779aSAndroid Build Coastguard Worker } else {
766*15dc779aSAndroid Build Coastguard Worker no_bits_left = no_bits_left - ret_val;
767*15dc779aSAndroid Build Coastguard Worker }
768*15dc779aSAndroid Build Coastguard Worker
769*15dc779aSAndroid Build Coastguard Worker if (no_bits_left < 0) return 0;
770*15dc779aSAndroid Build Coastguard Worker ptr_header_data->channel_mode = PS_STEREO;
771*15dc779aSAndroid Build Coastguard Worker ps_read = 1;
772*15dc779aSAndroid Build Coastguard Worker break;
773*15dc779aSAndroid Build Coastguard Worker }
774*15dc779aSAndroid Build Coastguard Worker case EXTENSION_ID_ENHSBR_CODING: {
775*15dc779aSAndroid Build Coastguard Worker no_bits_left =
776*15dc779aSAndroid Build Coastguard Worker (no_bits_left - ixheaacd_read_enh_sbr_data(ptr_header_data, it_bit_buff,
777*15dc779aSAndroid Build Coastguard Worker p_frame_data, ele_id));
778*15dc779aSAndroid Build Coastguard Worker
779*15dc779aSAndroid Build Coastguard Worker ptr_header_data->hbe_flag = 1;
780*15dc779aSAndroid Build Coastguard Worker ptr_header_data->sbr_ratio_idx = SBR_UPSAMPLE_IDX_2_1;
781*15dc779aSAndroid Build Coastguard Worker break;
782*15dc779aSAndroid Build Coastguard Worker }
783*15dc779aSAndroid Build Coastguard Worker default:
784*15dc779aSAndroid Build Coastguard Worker cnt = (no_bits_left >> 3);
785*15dc779aSAndroid Build Coastguard Worker for (i = cnt - 1; i >= 0; i--) ixheaacd_read_bits_buf(it_bit_buff, 8);
786*15dc779aSAndroid Build Coastguard Worker no_bits_left = (no_bits_left - (cnt << 3));
787*15dc779aSAndroid Build Coastguard Worker break;
788*15dc779aSAndroid Build Coastguard Worker }
789*15dc779aSAndroid Build Coastguard Worker }
790*15dc779aSAndroid Build Coastguard Worker
791*15dc779aSAndroid Build Coastguard Worker if (no_bits_left < 0) return 0;
792*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, no_bits_left);
793*15dc779aSAndroid Build Coastguard Worker }
794*15dc779aSAndroid Build Coastguard Worker return 0;
795*15dc779aSAndroid Build Coastguard Worker }
796*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff,WORD32 hbe_flag,ia_pvc_data_struct * ptr_pvc_data,ia_sbr_tables_struct * ptr_sbr_tables,ia_sbr_header_data_struct * ptr_header_data)797*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data,
798*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
799*15dc779aSAndroid Build Coastguard Worker WORD32 hbe_flag,
800*15dc779aSAndroid Build Coastguard Worker ia_pvc_data_struct *ptr_pvc_data,
801*15dc779aSAndroid Build Coastguard Worker ia_sbr_tables_struct *ptr_sbr_tables,
802*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data) {
803*15dc779aSAndroid Build Coastguard Worker WORD32 i;
804*15dc779aSAndroid Build Coastguard Worker WORD32 err_code = 0;
805*15dc779aSAndroid Build Coastguard Worker ia_env_extr_tables_struct *env_extr_tables_ptr =
806*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables->env_extr_tables_ptr;
807*15dc779aSAndroid Build Coastguard Worker WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
808*15dc779aSAndroid Build Coastguard Worker
809*15dc779aSAndroid Build Coastguard Worker if (hbe_flag) {
810*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_patching_mode =
811*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
812*15dc779aSAndroid Build Coastguard Worker
813*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->sbr_patching_mode == 0) {
814*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->over_sampling_flag =
815*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
816*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
817*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins =
818*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
819*15dc779aSAndroid Build Coastguard Worker else
820*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins = 0;
821*15dc779aSAndroid Build Coastguard Worker } else {
822*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0;
823*15dc779aSAndroid Build Coastguard Worker }
824*15dc779aSAndroid Build Coastguard Worker }
825*15dc779aSAndroid Build Coastguard Worker
826*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_pvc_time_freq_grid_info(it_bit_buff, ptr_frame_data);
827*15dc779aSAndroid Build Coastguard Worker if (err_code) return err_code;
828*15dc779aSAndroid Build Coastguard Worker
829*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->prev_sbr_mode = PVC_SBR;
830*15dc779aSAndroid Build Coastguard Worker
831*15dc779aSAndroid Build Coastguard Worker ixheaacd_pvc_env_dtdf_data(ptr_frame_data, it_bit_buff);
832*15dc779aSAndroid Build Coastguard Worker
833*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_nf_bands; i++) {
834*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
835*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_invf_mode[i] =
836*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
837*15dc779aSAndroid Build Coastguard Worker }
838*15dc779aSAndroid Build Coastguard Worker
839*15dc779aSAndroid Build Coastguard Worker ptr_pvc_data->pvc_mode = ptr_header_data->pvc_mode;
840*15dc779aSAndroid Build Coastguard Worker
841*15dc779aSAndroid Build Coastguard Worker err_code = ixheaacd_read_esbr_pvc_envelope(ptr_pvc_data, it_bit_buff,
842*15dc779aSAndroid Build Coastguard Worker usac_independency_flag);
843*15dc779aSAndroid Build Coastguard Worker if (err_code) return err_code;
844*15dc779aSAndroid Build Coastguard Worker
845*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data,
846*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
847*15dc779aSAndroid Build Coastguard Worker
848*15dc779aSAndroid Build Coastguard Worker memset(ptr_frame_data->add_harmonics, 0,
849*15dc779aSAndroid Build Coastguard Worker ptr_header_data->pstr_freq_band_data->num_sf_bands[HIGH] *
850*15dc779aSAndroid Build Coastguard Worker sizeof(WORD32));
851*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pvc_mode = ptr_header_data->pvc_mode;
852*15dc779aSAndroid Build Coastguard Worker
853*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_addi_data(ptr_frame_data, ptr_header_data, it_bit_buff);
854*15dc779aSAndroid Build Coastguard Worker
855*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->coupling_mode = COUPLING_OFF;
856*15dc779aSAndroid Build Coastguard Worker
857*15dc779aSAndroid Build Coastguard Worker return err_code;
858*15dc779aSAndroid Build Coastguard Worker }
859*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_read_sce(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_ps_dec_struct * ptr_ps_dec,ia_bit_buf_struct * it_bit_buff,ia_sbr_tables_struct * ptr_sbr_tables,WORD audio_object_type,WORD32 ec_flag)860*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data,
861*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
862*15dc779aSAndroid Build Coastguard Worker ia_ps_dec_struct *ptr_ps_dec, ia_bit_buf_struct *it_bit_buff,
863*15dc779aSAndroid Build Coastguard Worker ia_sbr_tables_struct *ptr_sbr_tables, WORD audio_object_type,
864*15dc779aSAndroid Build Coastguard Worker WORD32 ec_flag) {
865*15dc779aSAndroid Build Coastguard Worker WORD32 bit;
866*15dc779aSAndroid Build Coastguard Worker WORD32 i;
867*15dc779aSAndroid Build Coastguard Worker WORD32 hbe_flag = ptr_header_data->hbe_flag;
868*15dc779aSAndroid Build Coastguard Worker WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands;
869*15dc779aSAndroid Build Coastguard Worker WORD32 usac_flag = ptr_header_data->usac_flag;
870*15dc779aSAndroid Build Coastguard Worker ia_env_extr_tables_struct *env_extr_tables_ptr =
871*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables->env_extr_tables_ptr;
872*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
873*15dc779aSAndroid Build Coastguard Worker
874*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->coupling_mode = COUPLING_OFF;
875*15dc779aSAndroid Build Coastguard Worker
876*15dc779aSAndroid Build Coastguard Worker if (!usac_flag) {
877*15dc779aSAndroid Build Coastguard Worker bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
878*15dc779aSAndroid Build Coastguard Worker
879*15dc779aSAndroid Build Coastguard Worker if (bit) ixheaacd_read_bits_buf(it_bit_buff, SBR_SCE_RESERV_BITS);
880*15dc779aSAndroid Build Coastguard Worker if (audio_object_type == AOT_ER_AAC_ELD ||
881*15dc779aSAndroid Build Coastguard Worker audio_object_type == AOT_ER_AAC_LD) {
882*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->eld_sbr_flag == 1) {
883*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data);
884*15dc779aSAndroid Build Coastguard Worker if (err) return err;
885*15dc779aSAndroid Build Coastguard Worker }
886*15dc779aSAndroid Build Coastguard Worker } else {
887*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
888*15dc779aSAndroid Build Coastguard Worker env_extr_tables_ptr,
889*15dc779aSAndroid Build Coastguard Worker ptr_header_data->num_time_slots))
890*15dc779aSAndroid Build Coastguard Worker
891*15dc779aSAndroid Build Coastguard Worker return 0;
892*15dc779aSAndroid Build Coastguard Worker }
893*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
894*15dc779aSAndroid Build Coastguard Worker ptr_header_data->num_time_slots,
895*15dc779aSAndroid Build Coastguard Worker audio_object_type))
896*15dc779aSAndroid Build Coastguard Worker return 0;
897*15dc779aSAndroid Build Coastguard Worker
898*15dc779aSAndroid Build Coastguard Worker } else {
899*15dc779aSAndroid Build Coastguard Worker if (hbe_flag) {
900*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_patching_mode =
901*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
902*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->sbr_patching_mode == 0) {
903*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->over_sampling_flag =
904*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
905*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
906*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins =
907*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
908*15dc779aSAndroid Build Coastguard Worker else
909*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->pitch_in_bins = 0;
910*15dc779aSAndroid Build Coastguard Worker } else {
911*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->over_sampling_flag = ptr_frame_data->pitch_in_bins = 0;
912*15dc779aSAndroid Build Coastguard Worker }
913*15dc779aSAndroid Build Coastguard Worker }
914*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->num_time_slots = ptr_header_data->num_time_slots;
915*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data,
916*15dc779aSAndroid Build Coastguard Worker env_extr_tables_ptr,
917*15dc779aSAndroid Build Coastguard Worker ptr_header_data->num_time_slots))
918*15dc779aSAndroid Build Coastguard Worker return 0;
919*15dc779aSAndroid Build Coastguard Worker
920*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_validate_frame_info(&ptr_frame_data->str_frame_info_details,
921*15dc779aSAndroid Build Coastguard Worker ptr_header_data->num_time_slots,
922*15dc779aSAndroid Build Coastguard Worker audio_object_type))
923*15dc779aSAndroid Build Coastguard Worker return 0;
924*15dc779aSAndroid Build Coastguard Worker
925*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->prev_sbr_mode = ORIG_SBR;
926*15dc779aSAndroid Build Coastguard Worker }
927*15dc779aSAndroid Build Coastguard Worker
928*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_env_dtdf_data(ptr_frame_data, it_bit_buff,
929*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
930*15dc779aSAndroid Build Coastguard Worker
931*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->del_cod_dir_arr[0] == DTDF_DIR_FREQ) {
932*15dc779aSAndroid Build Coastguard Worker ptr_header_data->err_flag = 0;
933*15dc779aSAndroid Build Coastguard Worker }
934*15dc779aSAndroid Build Coastguard Worker
935*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_if_bands; i++) {
936*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_invf_mode_prev[i] = ptr_frame_data->sbr_invf_mode[i];
937*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->sbr_invf_mode[i] =
938*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
939*15dc779aSAndroid Build Coastguard Worker }
940*15dc779aSAndroid Build Coastguard Worker
941*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data, it_bit_buff,
942*15dc779aSAndroid Build Coastguard Worker env_extr_tables_ptr, audio_object_type))
943*15dc779aSAndroid Build Coastguard Worker return 0;
944*15dc779aSAndroid Build Coastguard Worker
945*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data,
946*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
947*15dc779aSAndroid Build Coastguard Worker
948*15dc779aSAndroid Build Coastguard Worker if (usac_flag) {
949*15dc779aSAndroid Build Coastguard Worker memset(
950*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->add_harmonics, 0,
951*15dc779aSAndroid Build Coastguard Worker ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
952*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->coupling_mode = COUPLING_OFF;
953*15dc779aSAndroid Build Coastguard Worker }
954*15dc779aSAndroid Build Coastguard Worker
955*15dc779aSAndroid Build Coastguard Worker bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
956*15dc779aSAndroid Build Coastguard Worker if (bit) {
957*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data, it_bit_buff);
958*15dc779aSAndroid Build Coastguard Worker } else {
959*15dc779aSAndroid Build Coastguard Worker memset(ptr_frame_data->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
960*15dc779aSAndroid Build Coastguard Worker }
961*15dc779aSAndroid Build Coastguard Worker
962*15dc779aSAndroid Build Coastguard Worker if (!usac_flag) {
963*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err =
964*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_extn_data(ptr_header_data, ptr_ps_dec, it_bit_buff,
965*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables->ps_tables_ptr, ptr_frame_data, SBR_ID_SCE);
966*15dc779aSAndroid Build Coastguard Worker if (err == IA_FATAL_ERROR) {
967*15dc779aSAndroid Build Coastguard Worker if (ec_flag)
968*15dc779aSAndroid Build Coastguard Worker return 0;
969*15dc779aSAndroid Build Coastguard Worker else
970*15dc779aSAndroid Build Coastguard Worker return err;
971*15dc779aSAndroid Build Coastguard Worker }
972*15dc779aSAndroid Build Coastguard Worker }
973*15dc779aSAndroid Build Coastguard Worker
974*15dc779aSAndroid Build Coastguard Worker return 1;
975*15dc779aSAndroid Build Coastguard Worker }
976*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct ** ptr_frame_data,ia_bit_buf_struct * it_bit_buff,ia_sbr_tables_struct * ptr_sbr_tables,WORD audio_object_type)977*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_sbr_read_cpe(
978*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
979*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct **ptr_frame_data,
980*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables,
981*15dc779aSAndroid Build Coastguard Worker WORD audio_object_type) {
982*15dc779aSAndroid Build Coastguard Worker WORD32 i, k, bit, num_ch = 2;
983*15dc779aSAndroid Build Coastguard Worker WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands;
984*15dc779aSAndroid Build Coastguard Worker WORD32 hbe_flag = ptr_header_data->hbe_flag;
985*15dc779aSAndroid Build Coastguard Worker WORD32 usac_flag = ptr_header_data->usac_flag;
986*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
987*15dc779aSAndroid Build Coastguard Worker ia_env_extr_tables_struct *env_extr_tables_ptr =
988*15dc779aSAndroid Build Coastguard Worker ptr_sbr_tables->env_extr_tables_ptr;
989*15dc779aSAndroid Build Coastguard Worker bit = ixheaacd_read_bits_buf(it_bit_buff, 1);
990*15dc779aSAndroid Build Coastguard Worker
991*15dc779aSAndroid Build Coastguard Worker if (usac_flag) {
992*15dc779aSAndroid Build Coastguard Worker if (bit) {
993*15dc779aSAndroid Build Coastguard Worker if (hbe_flag) {
994*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_patching_mode =
995*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_patching_mode =
996*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
997*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->sbr_patching_mode == 0) {
998*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag =
999*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag = ixheaacd_read_bits_buf(
1000*15dc779aSAndroid Build Coastguard Worker it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
1001*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
1002*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins =
1003*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins =
1004*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
1005*15dc779aSAndroid Build Coastguard Worker else
1006*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins =
1007*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
1008*15dc779aSAndroid Build Coastguard Worker } else {
1009*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag = 0;
1010*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag = 0;
1011*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
1012*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
1013*15dc779aSAndroid Build Coastguard Worker }
1014*15dc779aSAndroid Build Coastguard Worker }
1015*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL;
1016*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->coupling_mode = COUPLING_BAL;
1017*15dc779aSAndroid Build Coastguard Worker } else {
1018*15dc779aSAndroid Build Coastguard Worker if (hbe_flag) {
1019*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_patching_mode =
1020*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
1021*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->sbr_patching_mode == 0) {
1022*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag =
1023*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
1024*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
1025*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins =
1026*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
1027*15dc779aSAndroid Build Coastguard Worker else
1028*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
1029*15dc779aSAndroid Build Coastguard Worker } else {
1030*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->over_sampling_flag = 0;
1031*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->pitch_in_bins = 0;
1032*15dc779aSAndroid Build Coastguard Worker }
1033*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_patching_mode =
1034*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PATCHING_MODE_BITS);
1035*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[1]->sbr_patching_mode == 0) {
1036*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag =
1037*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_OVERSAMPLING_FLAG_BITS);
1038*15dc779aSAndroid Build Coastguard Worker if (ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_FLAG_BITS))
1039*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins =
1040*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_PITCHIN_BINS_BITS);
1041*15dc779aSAndroid Build Coastguard Worker else
1042*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
1043*15dc779aSAndroid Build Coastguard Worker } else {
1044*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->over_sampling_flag =
1045*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->pitch_in_bins = 0;
1046*15dc779aSAndroid Build Coastguard Worker }
1047*15dc779aSAndroid Build Coastguard Worker }
1048*15dc779aSAndroid Build Coastguard Worker
1049*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
1050*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
1051*15dc779aSAndroid Build Coastguard Worker }
1052*15dc779aSAndroid Build Coastguard Worker } else {
1053*15dc779aSAndroid Build Coastguard Worker if (bit) {
1054*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff,
1055*15dc779aSAndroid Build Coastguard Worker SBR_SCE_RESERV_BITS + SBR_SCE_RESERV_BITS);
1056*15dc779aSAndroid Build Coastguard Worker }
1057*15dc779aSAndroid Build Coastguard Worker if ((audio_object_type != AOT_ER_AAC_ELD) &&
1058*15dc779aSAndroid Build Coastguard Worker (ptr_header_data->channel_mode != SBR_STEREO)) {
1059*15dc779aSAndroid Build Coastguard Worker ptr_header_data->sync_state = UPSAMPLING;
1060*15dc779aSAndroid Build Coastguard Worker return 0;
1061*15dc779aSAndroid Build Coastguard Worker }
1062*15dc779aSAndroid Build Coastguard Worker
1063*15dc779aSAndroid Build Coastguard Worker bit = ixheaacd_read_bits_buf(it_bit_buff, SBR_COUPLNG_MODE_BITS);
1064*15dc779aSAndroid Build Coastguard Worker
1065*15dc779aSAndroid Build Coastguard Worker if (bit) {
1066*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->coupling_mode = COUPLING_LEVEL;
1067*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->coupling_mode = COUPLING_BAL;
1068*15dc779aSAndroid Build Coastguard Worker } else {
1069*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->coupling_mode = COUPLING_OFF;
1070*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->coupling_mode = COUPLING_OFF;
1071*15dc779aSAndroid Build Coastguard Worker }
1072*15dc779aSAndroid Build Coastguard Worker }
1073*15dc779aSAndroid Build Coastguard Worker
1074*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_ch; i++) {
1075*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[i]->num_time_slots = ptr_header_data->num_time_slots;
1076*15dc779aSAndroid Build Coastguard Worker if (audio_object_type == AOT_ER_AAC_ELD ||
1077*15dc779aSAndroid Build Coastguard Worker audio_object_type == AOT_ER_AAC_LD) {
1078*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[i]->eld_sbr_flag == 1) {
1079*15dc779aSAndroid Build Coastguard Worker err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data[i]);
1080*15dc779aSAndroid Build Coastguard Worker if (err) return err;
1081*15dc779aSAndroid Build Coastguard Worker }
1082*15dc779aSAndroid Build Coastguard Worker } else {
1083*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data[i],
1084*15dc779aSAndroid Build Coastguard Worker env_extr_tables_ptr,
1085*15dc779aSAndroid Build Coastguard Worker ptr_header_data->num_time_slots))
1086*15dc779aSAndroid Build Coastguard Worker return 0;
1087*15dc779aSAndroid Build Coastguard Worker }
1088*15dc779aSAndroid Build Coastguard Worker
1089*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_validate_frame_info(
1090*15dc779aSAndroid Build Coastguard Worker &ptr_frame_data[i]->str_frame_info_details,
1091*15dc779aSAndroid Build Coastguard Worker ptr_header_data->num_time_slots, audio_object_type))
1092*15dc779aSAndroid Build Coastguard Worker return 0;
1093*15dc779aSAndroid Build Coastguard Worker
1094*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->coupling_mode) {
1095*15dc779aSAndroid Build Coastguard Worker memcpy(&ptr_frame_data[1]->str_frame_info_details,
1096*15dc779aSAndroid Build Coastguard Worker &ptr_frame_data[0]->str_frame_info_details,
1097*15dc779aSAndroid Build Coastguard Worker sizeof(ia_frame_info_struct));
1098*15dc779aSAndroid Build Coastguard Worker if (audio_object_type == AOT_ER_AAC_ELD ||
1099*15dc779aSAndroid Build Coastguard Worker audio_object_type == AOT_ER_AAC_LD) {
1100*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->amp_res = ptr_frame_data[0]->amp_res;
1101*15dc779aSAndroid Build Coastguard Worker }
1102*15dc779aSAndroid Build Coastguard Worker num_ch = 1;
1103*15dc779aSAndroid Build Coastguard Worker }
1104*15dc779aSAndroid Build Coastguard Worker }
1105*15dc779aSAndroid Build Coastguard Worker
1106*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->coupling_mode && usac_flag) {
1107*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff,
1108*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
1109*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff,
1110*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
1111*15dc779aSAndroid Build Coastguard Worker
1112*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < ptr_header_data->pstr_freq_band_data->num_if_bands; i++) {
1113*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_invf_mode_prev[i] =
1114*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_invf_mode[i];
1115*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_invf_mode_prev[i] =
1116*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_invf_mode[i];
1117*15dc779aSAndroid Build Coastguard Worker
1118*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->sbr_invf_mode[i] =
1119*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, ESBR_INVF_MODE_BITS);
1120*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->sbr_invf_mode[i] = ptr_frame_data[0]->sbr_invf_mode[i];
1121*15dc779aSAndroid Build Coastguard Worker }
1122*15dc779aSAndroid Build Coastguard Worker
1123*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
1124*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr,
1125*15dc779aSAndroid Build Coastguard Worker audio_object_type)) {
1126*15dc779aSAndroid Build Coastguard Worker return 0;
1127*15dc779aSAndroid Build Coastguard Worker }
1128*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
1129*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
1130*15dc779aSAndroid Build Coastguard Worker
1131*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
1132*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr,
1133*15dc779aSAndroid Build Coastguard Worker audio_object_type)) {
1134*15dc779aSAndroid Build Coastguard Worker return 0;
1135*15dc779aSAndroid Build Coastguard Worker }
1136*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1],
1137*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
1138*15dc779aSAndroid Build Coastguard Worker
1139*15dc779aSAndroid Build Coastguard Worker memset(
1140*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[0]->add_harmonics, 0,
1141*15dc779aSAndroid Build Coastguard Worker ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
1142*15dc779aSAndroid Build Coastguard Worker memset(
1143*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[1]->add_harmonics, 0,
1144*15dc779aSAndroid Build Coastguard Worker ptr_header_data->pstr_freq_band_data->num_sf_bands[1] * sizeof(WORD32));
1145*15dc779aSAndroid Build Coastguard Worker
1146*15dc779aSAndroid Build Coastguard Worker } else {
1147*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_env_dtdf_data(ptr_frame_data[0], it_bit_buff,
1148*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
1149*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_env_dtdf_data(ptr_frame_data[1], it_bit_buff,
1150*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
1151*15dc779aSAndroid Build Coastguard Worker
1152*15dc779aSAndroid Build Coastguard Worker if ((ptr_frame_data[0]->del_cod_dir_arr[0] == DTDF_DIR_FREQ) &&
1153*15dc779aSAndroid Build Coastguard Worker (ptr_frame_data[1]->del_cod_dir_arr[0] == DTDF_DIR_FREQ)) {
1154*15dc779aSAndroid Build Coastguard Worker ptr_header_data->err_flag = 0;
1155*15dc779aSAndroid Build Coastguard Worker }
1156*15dc779aSAndroid Build Coastguard Worker
1157*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_ch; k++) {
1158*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_if_bands; i++) {
1159*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[k]->sbr_invf_mode_prev[i] =
1160*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[k]->sbr_invf_mode[i];
1161*15dc779aSAndroid Build Coastguard Worker ptr_frame_data[k]->sbr_invf_mode[i] = ixheaacd_read_bits_buf(
1162*15dc779aSAndroid Build Coastguard Worker it_bit_buff, SBR_INVERSE_FILT_MODE_BITS);
1163*15dc779aSAndroid Build Coastguard Worker }
1164*15dc779aSAndroid Build Coastguard Worker }
1165*15dc779aSAndroid Build Coastguard Worker
1166*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data[0]->coupling_mode) {
1167*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_frame_data[1]->sbr_invf_mode_prev, ptr_frame_data[1]->sbr_invf_mode,
1168*15dc779aSAndroid Build Coastguard Worker sizeof(ptr_frame_data[1]->sbr_invf_mode_prev[0]) * num_if_bands);
1169*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_frame_data[1]->sbr_invf_mode, ptr_frame_data[0]->sbr_invf_mode,
1170*15dc779aSAndroid Build Coastguard Worker sizeof(WORD32) * num_if_bands);
1171*15dc779aSAndroid Build Coastguard Worker
1172*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
1173*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr,
1174*15dc779aSAndroid Build Coastguard Worker audio_object_type)) {
1175*15dc779aSAndroid Build Coastguard Worker return 0;
1176*15dc779aSAndroid Build Coastguard Worker }
1177*15dc779aSAndroid Build Coastguard Worker
1178*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
1179*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
1180*15dc779aSAndroid Build Coastguard Worker
1181*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
1182*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr,
1183*15dc779aSAndroid Build Coastguard Worker audio_object_type)) {
1184*15dc779aSAndroid Build Coastguard Worker return 0;
1185*15dc779aSAndroid Build Coastguard Worker }
1186*15dc779aSAndroid Build Coastguard Worker } else {
1187*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0],
1188*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr,
1189*15dc779aSAndroid Build Coastguard Worker audio_object_type))
1190*15dc779aSAndroid Build Coastguard Worker return 0;
1191*15dc779aSAndroid Build Coastguard Worker
1192*15dc779aSAndroid Build Coastguard Worker if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1],
1193*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr,
1194*15dc779aSAndroid Build Coastguard Worker audio_object_type))
1195*15dc779aSAndroid Build Coastguard Worker return 0;
1196*15dc779aSAndroid Build Coastguard Worker
1197*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0],
1198*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
1199*15dc779aSAndroid Build Coastguard Worker }
1200*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1],
1201*15dc779aSAndroid Build Coastguard Worker it_bit_buff, env_extr_tables_ptr);
1202*15dc779aSAndroid Build Coastguard Worker }
1203*15dc779aSAndroid Build Coastguard Worker
1204*15dc779aSAndroid Build Coastguard Worker bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
1205*15dc779aSAndroid Build Coastguard Worker if (bit) {
1206*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[0],
1207*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
1208*15dc779aSAndroid Build Coastguard Worker } else {
1209*15dc779aSAndroid Build Coastguard Worker memset(ptr_frame_data[0]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
1210*15dc779aSAndroid Build Coastguard Worker }
1211*15dc779aSAndroid Build Coastguard Worker
1212*15dc779aSAndroid Build Coastguard Worker bit = (FLAG)ixheaacd_read_bits_buf(it_bit_buff, 1);
1213*15dc779aSAndroid Build Coastguard Worker if (bit) {
1214*15dc779aSAndroid Build Coastguard Worker ixheaacd_sbr_sin_coding_data(ptr_header_data, ptr_frame_data[1],
1215*15dc779aSAndroid Build Coastguard Worker it_bit_buff);
1216*15dc779aSAndroid Build Coastguard Worker } else {
1217*15dc779aSAndroid Build Coastguard Worker memset(ptr_frame_data[1]->add_harmonics, 0, sizeof(FLAG) * MAX_FREQ_COEFFS);
1218*15dc779aSAndroid Build Coastguard Worker }
1219*15dc779aSAndroid Build Coastguard Worker
1220*15dc779aSAndroid Build Coastguard Worker if (!usac_flag) {
1221*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err =
1222*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_extn_data(ptr_header_data, NULL, it_bit_buff, ptr_sbr_tables->ps_tables_ptr,
1223*15dc779aSAndroid Build Coastguard Worker (VOID *)ptr_frame_data, SBR_ID_CPE);
1224*15dc779aSAndroid Build Coastguard Worker if (err == IA_FATAL_ERROR) {
1225*15dc779aSAndroid Build Coastguard Worker return err;
1226*15dc779aSAndroid Build Coastguard Worker }
1227*15dc779aSAndroid Build Coastguard Worker }
1228*15dc779aSAndroid Build Coastguard Worker return 1;
1229*15dc779aSAndroid Build Coastguard Worker }
1230*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff,WORD32 usac_flag)1231*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_sbr_env_dtdf_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
1232*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1233*15dc779aSAndroid Build Coastguard Worker WORD32 usac_flag) {
1234*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1235*15dc779aSAndroid Build Coastguard Worker WORD32 num_env = ptr_frame_data->str_frame_info_details.num_env;
1236*15dc779aSAndroid Build Coastguard Worker WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env;
1237*15dc779aSAndroid Build Coastguard Worker WORD16 *p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr;
1238*15dc779aSAndroid Build Coastguard Worker WORD16 *p_coding_dir_noise_vec = ptr_frame_data->del_cod_dir_noise_arr;
1239*15dc779aSAndroid Build Coastguard Worker WORD32 usac_independency_flag = ptr_frame_data->usac_independency_flag;
1240*15dc779aSAndroid Build Coastguard Worker
1241*15dc779aSAndroid Build Coastguard Worker if (usac_flag) {
1242*15dc779aSAndroid Build Coastguard Worker if (usac_independency_flag) {
1243*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_vec = 0;
1244*15dc779aSAndroid Build Coastguard Worker p_coding_dir_vec++;
1245*15dc779aSAndroid Build Coastguard Worker } else {
1246*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_vec =
1247*15dc779aSAndroid Build Coastguard Worker (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1248*15dc779aSAndroid Build Coastguard Worker p_coding_dir_vec++;
1249*15dc779aSAndroid Build Coastguard Worker }
1250*15dc779aSAndroid Build Coastguard Worker for (i = num_env - 1; i >= 1; i--) {
1251*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_vec++ =
1252*15dc779aSAndroid Build Coastguard Worker (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1253*15dc779aSAndroid Build Coastguard Worker }
1254*15dc779aSAndroid Build Coastguard Worker if (usac_independency_flag) {
1255*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_noise_vec = 0;
1256*15dc779aSAndroid Build Coastguard Worker p_coding_dir_noise_vec++;
1257*15dc779aSAndroid Build Coastguard Worker } else {
1258*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_noise_vec =
1259*15dc779aSAndroid Build Coastguard Worker (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1260*15dc779aSAndroid Build Coastguard Worker p_coding_dir_noise_vec++;
1261*15dc779aSAndroid Build Coastguard Worker }
1262*15dc779aSAndroid Build Coastguard Worker for (i = num_noise_env - 1; i >= 1; i--) {
1263*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_noise_vec++ =
1264*15dc779aSAndroid Build Coastguard Worker (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1265*15dc779aSAndroid Build Coastguard Worker }
1266*15dc779aSAndroid Build Coastguard Worker } else {
1267*15dc779aSAndroid Build Coastguard Worker for (i = num_env - 1; i >= 0; i--) {
1268*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_vec++ =
1269*15dc779aSAndroid Build Coastguard Worker (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1270*15dc779aSAndroid Build Coastguard Worker }
1271*15dc779aSAndroid Build Coastguard Worker
1272*15dc779aSAndroid Build Coastguard Worker for (i = num_noise_env - 1; i >= 0; i--) {
1273*15dc779aSAndroid Build Coastguard Worker *p_coding_dir_noise_vec++ =
1274*15dc779aSAndroid Build Coastguard Worker (WORD16)ixheaacd_read_bits_buf(it_bit_buff, SBR_DEL_COD_DIR_BITS);
1275*15dc779aSAndroid Build Coastguard Worker }
1276*15dc779aSAndroid Build Coastguard Worker }
1277*15dc779aSAndroid Build Coastguard Worker }
1278*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_env_data(ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff,ia_huffman_data_type hcb_t,ia_huffman_data_type hcb_f,WORD32 * idx_t,WORD32 * idx_f,WORD16 * no_band,WORD32 num_env,WORD32 env_data_tbl_comp_factor,WORD32 start_bits,WORD32 start_bits_balance,WORD32 num_noise_env,WORD32 lav,WORD32 usac_flag)1279*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_read_env_data(ia_sbr_frame_info_data_struct *ptr_frame_data,
1280*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1281*15dc779aSAndroid Build Coastguard Worker ia_huffman_data_type hcb_t,
1282*15dc779aSAndroid Build Coastguard Worker ia_huffman_data_type hcb_f, WORD32 *idx_t,
1283*15dc779aSAndroid Build Coastguard Worker WORD32 *idx_f, WORD16 *no_band, WORD32 num_env,
1284*15dc779aSAndroid Build Coastguard Worker WORD32 env_data_tbl_comp_factor, WORD32 start_bits,
1285*15dc779aSAndroid Build Coastguard Worker WORD32 start_bits_balance, WORD32 num_noise_env,
1286*15dc779aSAndroid Build Coastguard Worker WORD32 lav, WORD32 usac_flag) {
1287*15dc779aSAndroid Build Coastguard Worker WORD32 j, i, ixheaacd_drc_offset = 0,
1288*15dc779aSAndroid Build Coastguard Worker coupling_mode = ptr_frame_data->coupling_mode, delta, bits,
1289*15dc779aSAndroid Build Coastguard Worker shift;
1290*15dc779aSAndroid Build Coastguard Worker WORD16 *p_coding_dir_vec, *p_sbr_sf;
1291*15dc779aSAndroid Build Coastguard Worker WORD16 index, length;
1292*15dc779aSAndroid Build Coastguard Worker WORD32 readword;
1293*15dc779aSAndroid Build Coastguard Worker FLOAT32 *p_sbr_sf_float;
1294*15dc779aSAndroid Build Coastguard Worker
1295*15dc779aSAndroid Build Coastguard Worker if (num_noise_env) {
1296*15dc779aSAndroid Build Coastguard Worker p_coding_dir_vec = ptr_frame_data->del_cod_dir_noise_arr;
1297*15dc779aSAndroid Build Coastguard Worker p_sbr_sf = ptr_frame_data->int_noise_floor;
1298*15dc779aSAndroid Build Coastguard Worker p_sbr_sf_float = ptr_frame_data->flt_noise_floor;
1299*15dc779aSAndroid Build Coastguard Worker } else {
1300*15dc779aSAndroid Build Coastguard Worker p_coding_dir_vec = ptr_frame_data->del_cod_dir_arr;
1301*15dc779aSAndroid Build Coastguard Worker p_sbr_sf = ptr_frame_data->int_env_sf_arr;
1302*15dc779aSAndroid Build Coastguard Worker p_sbr_sf_float = ptr_frame_data->flt_env_sf_arr;
1303*15dc779aSAndroid Build Coastguard Worker }
1304*15dc779aSAndroid Build Coastguard Worker
1305*15dc779aSAndroid Build Coastguard Worker if (coupling_mode == COUPLING_BAL) {
1306*15dc779aSAndroid Build Coastguard Worker bits = start_bits_balance;
1307*15dc779aSAndroid Build Coastguard Worker shift = env_data_tbl_comp_factor;
1308*15dc779aSAndroid Build Coastguard Worker
1309*15dc779aSAndroid Build Coastguard Worker } else {
1310*15dc779aSAndroid Build Coastguard Worker bits = start_bits;
1311*15dc779aSAndroid Build Coastguard Worker shift = 0;
1312*15dc779aSAndroid Build Coastguard Worker }
1313*15dc779aSAndroid Build Coastguard Worker
1314*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_env; j++) {
1315*15dc779aSAndroid Build Coastguard Worker ia_huffman_data_type h;
1316*15dc779aSAndroid Build Coastguard Worker const WORD32 *idx_tab;
1317*15dc779aSAndroid Build Coastguard Worker WORD32 dtdf_dir_flag = p_coding_dir_vec[j];
1318*15dc779aSAndroid Build Coastguard Worker
1319*15dc779aSAndroid Build Coastguard Worker if (dtdf_dir_flag == DTDF_DIR_FREQ) {
1320*15dc779aSAndroid Build Coastguard Worker p_sbr_sf[ixheaacd_drc_offset] =
1321*15dc779aSAndroid Build Coastguard Worker (WORD16)(ixheaacd_read_bits_buf(it_bit_buff, bits) << shift);
1322*15dc779aSAndroid Build Coastguard Worker p_sbr_sf_float[ixheaacd_drc_offset] = p_sbr_sf[ixheaacd_drc_offset];
1323*15dc779aSAndroid Build Coastguard Worker h = hcb_f;
1324*15dc779aSAndroid Build Coastguard Worker idx_tab = idx_f;
1325*15dc779aSAndroid Build Coastguard Worker } else {
1326*15dc779aSAndroid Build Coastguard Worker h = hcb_t;
1327*15dc779aSAndroid Build Coastguard Worker idx_tab = idx_t;
1328*15dc779aSAndroid Build Coastguard Worker }
1329*15dc779aSAndroid Build Coastguard Worker
1330*15dc779aSAndroid Build Coastguard Worker for (i = (1 - dtdf_dir_flag); i < no_band[j]; i++) {
1331*15dc779aSAndroid Build Coastguard Worker if (it_bit_buff->cnt_bits < 20) {
1332*15dc779aSAndroid Build Coastguard Worker readword = ixheaacd_show_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
1333*15dc779aSAndroid Build Coastguard Worker readword = readword << (32 - it_bit_buff->cnt_bits);
1334*15dc779aSAndroid Build Coastguard Worker } else {
1335*15dc779aSAndroid Build Coastguard Worker readword = ixheaacd_show_bits_buf(it_bit_buff, 20);
1336*15dc779aSAndroid Build Coastguard Worker readword = readword << 12;
1337*15dc779aSAndroid Build Coastguard Worker }
1338*15dc779aSAndroid Build Coastguard Worker ixheaacd_huffman_decode(readword, &index, &length, (const UWORD16 *)h,
1339*15dc779aSAndroid Build Coastguard Worker (const UWORD32 *)idx_tab);
1340*15dc779aSAndroid Build Coastguard Worker delta = index - lav;
1341*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, length);
1342*15dc779aSAndroid Build Coastguard Worker p_sbr_sf[ixheaacd_drc_offset + i] =
1343*15dc779aSAndroid Build Coastguard Worker (WORD16)(delta << env_data_tbl_comp_factor);
1344*15dc779aSAndroid Build Coastguard Worker p_sbr_sf_float[ixheaacd_drc_offset + i] =
1345*15dc779aSAndroid Build Coastguard Worker p_sbr_sf[ixheaacd_drc_offset + i];
1346*15dc779aSAndroid Build Coastguard Worker }
1347*15dc779aSAndroid Build Coastguard Worker if (usac_flag && (num_noise_env == 0)) {
1348*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->inter_temp_shape_mode[j] = 0;
1349*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->inter_tes_flag) {
1350*15dc779aSAndroid Build Coastguard Worker WORD32 flag = ixheaacd_read_bits_buf(it_bit_buff, 1);
1351*15dc779aSAndroid Build Coastguard Worker if (flag) {
1352*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->inter_temp_shape_mode[j] =
1353*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 2);
1354*15dc779aSAndroid Build Coastguard Worker }
1355*15dc779aSAndroid Build Coastguard Worker }
1356*15dc779aSAndroid Build Coastguard Worker }
1357*15dc779aSAndroid Build Coastguard Worker ixheaacd_drc_offset += (no_band[j]);
1358*15dc779aSAndroid Build Coastguard Worker }
1359*15dc779aSAndroid Build Coastguard Worker }
1360*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_sbr_noise_floor_data(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff,ia_env_extr_tables_struct * env_extr_tables_ptr)1361*15dc779aSAndroid Build Coastguard Worker VOID ixheaacd_read_sbr_noise_floor_data(
1362*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
1363*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
1364*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1365*15dc779aSAndroid Build Coastguard Worker ia_env_extr_tables_struct *env_extr_tables_ptr) {
1366*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1367*15dc779aSAndroid Build Coastguard Worker WORD32 coupling_mode;
1368*15dc779aSAndroid Build Coastguard Worker WORD16 num_noise_bands[MAX_NOISE_ENVELOPES];
1369*15dc779aSAndroid Build Coastguard Worker ia_huffman_data_type hcb_noise_env;
1370*15dc779aSAndroid Build Coastguard Worker ia_huffman_data_type hcb_noise;
1371*15dc779aSAndroid Build Coastguard Worker WORD32 *idx_noise_env;
1372*15dc779aSAndroid Build Coastguard Worker WORD32 *idx_noise;
1373*15dc779aSAndroid Build Coastguard Worker WORD32 lav;
1374*15dc779aSAndroid Build Coastguard Worker WORD32 env_data_tbl_comp_factor;
1375*15dc779aSAndroid Build Coastguard Worker
1376*15dc779aSAndroid Build Coastguard Worker WORD32 start_bits;
1377*15dc779aSAndroid Build Coastguard Worker WORD32 start_bits_balance;
1378*15dc779aSAndroid Build Coastguard Worker WORD32 num_noise_env = ptr_frame_data->str_frame_info_details.num_noise_env;
1379*15dc779aSAndroid Build Coastguard Worker
1380*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_noise_env; i++)
1381*15dc779aSAndroid Build Coastguard Worker num_noise_bands[i] = ptr_header_data->pstr_freq_band_data->num_nf_bands;
1382*15dc779aSAndroid Build Coastguard Worker
1383*15dc779aSAndroid Build Coastguard Worker start_bits = SBR_BEGIN_NOISE_BITS_AMPLITUDE_RESOLUTION_3_0;
1384*15dc779aSAndroid Build Coastguard Worker start_bits_balance = SBR_BEGIN_NOISE_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0;
1385*15dc779aSAndroid Build Coastguard Worker
1386*15dc779aSAndroid Build Coastguard Worker coupling_mode = ptr_frame_data->coupling_mode;
1387*15dc779aSAndroid Build Coastguard Worker
1388*15dc779aSAndroid Build Coastguard Worker if (coupling_mode == COUPLING_BAL) {
1389*15dc779aSAndroid Build Coastguard Worker lav = 12;
1390*15dc779aSAndroid Build Coastguard Worker hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr
1391*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_t_huffman_noise_bal_3_0db_inp_table;
1392*15dc779aSAndroid Build Coastguard Worker idx_noise =
1393*15dc779aSAndroid Build Coastguard Worker env_extr_tables_ptr->ixheaacd_t_huffman_noise_bal_3_0db_idx_table;
1394*15dc779aSAndroid Build Coastguard Worker hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr
1395*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_f_huffman_env_bal_3_0db_inp_table;
1396*15dc779aSAndroid Build Coastguard Worker idx_noise_env =
1397*15dc779aSAndroid Build Coastguard Worker env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table;
1398*15dc779aSAndroid Build Coastguard Worker env_data_tbl_comp_factor = 1;
1399*15dc779aSAndroid Build Coastguard Worker } else {
1400*15dc779aSAndroid Build Coastguard Worker lav = 31;
1401*15dc779aSAndroid Build Coastguard Worker hcb_noise = (ia_huffman_data_type)&env_extr_tables_ptr
1402*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_t_huffman_noise_3_0db_inp_table;
1403*15dc779aSAndroid Build Coastguard Worker idx_noise = env_extr_tables_ptr->ixheaacd_t_huffman_noise_3_0db_idx_table;
1404*15dc779aSAndroid Build Coastguard Worker hcb_noise_env = (ia_huffman_data_type)&env_extr_tables_ptr
1405*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_f_huffman_env_3_0db_inp_table;
1406*15dc779aSAndroid Build Coastguard Worker idx_noise_env = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table;
1407*15dc779aSAndroid Build Coastguard Worker env_data_tbl_comp_factor = 0;
1408*15dc779aSAndroid Build Coastguard Worker }
1409*15dc779aSAndroid Build Coastguard Worker
1410*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_noise, hcb_noise_env,
1411*15dc779aSAndroid Build Coastguard Worker idx_noise, idx_noise_env, &num_noise_bands[0],
1412*15dc779aSAndroid Build Coastguard Worker num_noise_env, env_data_tbl_comp_factor, start_bits,
1413*15dc779aSAndroid Build Coastguard Worker start_bits_balance, 1, lav,
1414*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
1415*15dc779aSAndroid Build Coastguard Worker }
1416*15dc779aSAndroid Build Coastguard Worker
ixheaacd_read_sbr_env_data(ia_sbr_header_data_struct * ptr_header_data,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_bit_buf_struct * it_bit_buff,ia_env_extr_tables_struct * env_extr_tables_ptr,WORD audio_object_type)1417*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_read_sbr_env_data(
1418*15dc779aSAndroid Build Coastguard Worker ia_sbr_header_data_struct *ptr_header_data,
1419*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
1420*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1421*15dc779aSAndroid Build Coastguard Worker ia_env_extr_tables_struct *env_extr_tables_ptr, WORD audio_object_type) {
1422*15dc779aSAndroid Build Coastguard Worker WORD32 coupling_mode = ptr_frame_data->coupling_mode;
1423*15dc779aSAndroid Build Coastguard Worker WORD32 *idx_t, *idx_f;
1424*15dc779aSAndroid Build Coastguard Worker WORD32 lav;
1425*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1426*15dc779aSAndroid Build Coastguard Worker WORD16 no_band[MAX_ENVELOPES];
1427*15dc779aSAndroid Build Coastguard Worker WORD32 amp_res, num_env, env_data_tbl_comp_factor, start_bits,
1428*15dc779aSAndroid Build Coastguard Worker start_bits_balance;
1429*15dc779aSAndroid Build Coastguard Worker WORD16 *p_freq_res = ptr_frame_data->str_frame_info_details.freq_res;
1430*15dc779aSAndroid Build Coastguard Worker WORD16 *p_num_sf_bands = ptr_header_data->pstr_freq_band_data->num_sf_bands;
1431*15dc779aSAndroid Build Coastguard Worker ia_huffman_data_type hcb_t, hcb_f;
1432*15dc779aSAndroid Build Coastguard Worker
1433*15dc779aSAndroid Build Coastguard Worker amp_res = ptr_header_data->amp_res;
1434*15dc779aSAndroid Build Coastguard Worker num_env = ptr_frame_data->str_frame_info_details.num_env;
1435*15dc779aSAndroid Build Coastguard Worker
1436*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->num_env_sfac = 0;
1437*15dc779aSAndroid Build Coastguard Worker
1438*15dc779aSAndroid Build Coastguard Worker if ((ptr_frame_data->str_frame_info_details.frame_class == FIXFIX) &&
1439*15dc779aSAndroid Build Coastguard Worker (num_env == 1)) {
1440*15dc779aSAndroid Build Coastguard Worker if (audio_object_type != AOT_ER_AAC_ELD &&
1441*15dc779aSAndroid Build Coastguard Worker audio_object_type != AOT_ER_AAC_LD) {
1442*15dc779aSAndroid Build Coastguard Worker amp_res = SBR_AMPLITUDE_RESOLUTION_1_5;
1443*15dc779aSAndroid Build Coastguard Worker } else {
1444*15dc779aSAndroid Build Coastguard Worker amp_res = ptr_frame_data->amp_res;
1445*15dc779aSAndroid Build Coastguard Worker }
1446*15dc779aSAndroid Build Coastguard Worker }
1447*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->amp_res = amp_res;
1448*15dc779aSAndroid Build Coastguard Worker
1449*15dc779aSAndroid Build Coastguard Worker if (amp_res == SBR_AMPLITUDE_RESOLUTION_3_0) {
1450*15dc779aSAndroid Build Coastguard Worker start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_3_0;
1451*15dc779aSAndroid Build Coastguard Worker start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_3_0;
1452*15dc779aSAndroid Build Coastguard Worker } else {
1453*15dc779aSAndroid Build Coastguard Worker start_bits = SBR_BEGIN_ENVN_BITS_AMPLITUDE_RESOLUTION_1_5;
1454*15dc779aSAndroid Build Coastguard Worker start_bits_balance = SBR_BEGIN_ENVN_BITS_BALNCE_AMPLITUDE_RESOLUTION_1_5;
1455*15dc779aSAndroid Build Coastguard Worker }
1456*15dc779aSAndroid Build Coastguard Worker
1457*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_env; i++) {
1458*15dc779aSAndroid Build Coastguard Worker no_band[i] = p_num_sf_bands[*p_freq_res++];
1459*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->num_env_sfac =
1460*15dc779aSAndroid Build Coastguard Worker ixheaac_add16(ptr_frame_data->num_env_sfac, no_band[i]);
1461*15dc779aSAndroid Build Coastguard Worker }
1462*15dc779aSAndroid Build Coastguard Worker
1463*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->num_env_sfac > MAX_NUM_ENVELOPE_VALUES) return 0;
1464*15dc779aSAndroid Build Coastguard Worker
1465*15dc779aSAndroid Build Coastguard Worker if (coupling_mode == COUPLING_BAL) {
1466*15dc779aSAndroid Build Coastguard Worker env_data_tbl_comp_factor = 1;
1467*15dc779aSAndroid Build Coastguard Worker
1468*15dc779aSAndroid Build Coastguard Worker if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) {
1469*15dc779aSAndroid Build Coastguard Worker lav = 24;
1470*15dc779aSAndroid Build Coastguard Worker hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1471*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_t_huffman_env_bal_1_5db_inp_table;
1472*15dc779aSAndroid Build Coastguard Worker idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_1_5db_idx_table;
1473*15dc779aSAndroid Build Coastguard Worker hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1474*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_f_huffman_env_bal_1_5db_inp_table;
1475*15dc779aSAndroid Build Coastguard Worker idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_1_5db_idx_table;
1476*15dc779aSAndroid Build Coastguard Worker } else {
1477*15dc779aSAndroid Build Coastguard Worker lav = 12;
1478*15dc779aSAndroid Build Coastguard Worker hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1479*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_t_huffman_env_bal_3_0db_inp_table;
1480*15dc779aSAndroid Build Coastguard Worker idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_bal_3_0db_idx_table;
1481*15dc779aSAndroid Build Coastguard Worker hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1482*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_f_huffman_env_bal_3_0db_inp_table;
1483*15dc779aSAndroid Build Coastguard Worker idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_bal_3_0db_idx_table;
1484*15dc779aSAndroid Build Coastguard Worker }
1485*15dc779aSAndroid Build Coastguard Worker } else {
1486*15dc779aSAndroid Build Coastguard Worker env_data_tbl_comp_factor = 0;
1487*15dc779aSAndroid Build Coastguard Worker
1488*15dc779aSAndroid Build Coastguard Worker if (amp_res == SBR_AMPLITUDE_RESOLUTION_1_5) {
1489*15dc779aSAndroid Build Coastguard Worker lav = 60;
1490*15dc779aSAndroid Build Coastguard Worker hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1491*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_t_huffman_env_1_5db_inp_table;
1492*15dc779aSAndroid Build Coastguard Worker idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_1_5db_idx_table;
1493*15dc779aSAndroid Build Coastguard Worker hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1494*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_f_huffman_env_1_5db_inp_table;
1495*15dc779aSAndroid Build Coastguard Worker idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_1_5db_idx_table;
1496*15dc779aSAndroid Build Coastguard Worker } else {
1497*15dc779aSAndroid Build Coastguard Worker lav = 31;
1498*15dc779aSAndroid Build Coastguard Worker hcb_t = (ia_huffman_data_type)&env_extr_tables_ptr
1499*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_t_huffman_env_3_0db_inp_table;
1500*15dc779aSAndroid Build Coastguard Worker idx_t = env_extr_tables_ptr->ixheaacd_t_huffman_env_3_0db_idx_table;
1501*15dc779aSAndroid Build Coastguard Worker hcb_f = (ia_huffman_data_type)&env_extr_tables_ptr
1502*15dc779aSAndroid Build Coastguard Worker ->ixheaacd_f_huffman_env_3_0db_inp_table;
1503*15dc779aSAndroid Build Coastguard Worker idx_f = env_extr_tables_ptr->ixheaacd_f_huffman_env_3_0db_idx_table;
1504*15dc779aSAndroid Build Coastguard Worker }
1505*15dc779aSAndroid Build Coastguard Worker }
1506*15dc779aSAndroid Build Coastguard Worker
1507*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_env_data(ptr_frame_data, it_bit_buff, hcb_t, hcb_f, idx_t,
1508*15dc779aSAndroid Build Coastguard Worker idx_f, &no_band[0], num_env, env_data_tbl_comp_factor,
1509*15dc779aSAndroid Build Coastguard Worker start_bits, start_bits_balance, 0, lav,
1510*15dc779aSAndroid Build Coastguard Worker ptr_header_data->usac_flag);
1511*15dc779aSAndroid Build Coastguard Worker
1512*15dc779aSAndroid Build Coastguard Worker return 1;
1513*15dc779aSAndroid Build Coastguard Worker }
1514*15dc779aSAndroid Build Coastguard Worker
ixheaacd_extract_frame_info_ld(ia_bit_buf_struct * it_bit_buff,ia_sbr_frame_info_data_struct * h_frame_data)1515*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ixheaacd_extract_frame_info_ld(
1516*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1517*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *h_frame_data) {
1518*15dc779aSAndroid Build Coastguard Worker int abs_bord_lead = 0, num_rel_lead = 0, bs_num_env = 0,
1519*15dc779aSAndroid Build Coastguard Worker frame_class, temp, env, k, abs_bord_trail = 0, middle_bord = 0,
1520*15dc779aSAndroid Build Coastguard Worker bs_num_noise, transient_env_temp = 0, bs_transient_position = 0;
1521*15dc779aSAndroid Build Coastguard Worker
1522*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err = IA_NO_ERROR;
1523*15dc779aSAndroid Build Coastguard Worker WORD16 time_border[MAX_ENVELOPES + 1];
1524*15dc779aSAndroid Build Coastguard Worker WORD16 time_border_noise[2 + 1];
1525*15dc779aSAndroid Build Coastguard Worker WORD16 f[MAX_ENVELOPES + 1];
1526*15dc779aSAndroid Build Coastguard Worker int rel_bord_lead[7] = {0};
1527*15dc779aSAndroid Build Coastguard Worker
1528*15dc779aSAndroid Build Coastguard Worker ia_frame_info_struct *v_frame_info = &h_frame_data->str_frame_info_details;
1529*15dc779aSAndroid Build Coastguard Worker
1530*15dc779aSAndroid Build Coastguard Worker int numTimeSlots = h_frame_data->num_time_slots;
1531*15dc779aSAndroid Build Coastguard Worker
1532*15dc779aSAndroid Build Coastguard Worker v_frame_info->frame_class = frame_class =
1533*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBRLD_CLA_BITS);
1534*15dc779aSAndroid Build Coastguard Worker
1535*15dc779aSAndroid Build Coastguard Worker switch (frame_class) {
1536*15dc779aSAndroid Build Coastguard Worker case FIXFIX:
1537*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS);
1538*15dc779aSAndroid Build Coastguard Worker bs_num_env = 1 << temp;
1539*15dc779aSAndroid Build Coastguard Worker
1540*15dc779aSAndroid Build Coastguard Worker if (bs_num_env == 1)
1541*15dc779aSAndroid Build Coastguard Worker h_frame_data->amp_res =
1542*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_AMPLITUDE_RESOLUTION_BITS);
1543*15dc779aSAndroid Build Coastguard Worker
1544*15dc779aSAndroid Build Coastguard Worker f[0] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS);
1545*15dc779aSAndroid Build Coastguard Worker
1546*15dc779aSAndroid Build Coastguard Worker for (env = 1; env < bs_num_env; env++) f[env] = f[0];
1547*15dc779aSAndroid Build Coastguard Worker break;
1548*15dc779aSAndroid Build Coastguard Worker case LD_TRAN:
1549*15dc779aSAndroid Build Coastguard Worker bs_transient_position =
1550*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_TRAN_BITS);
1551*15dc779aSAndroid Build Coastguard Worker v_frame_info->frame_class = 0;
1552*15dc779aSAndroid Build Coastguard Worker if ((numTimeSlots != 16) && (bs_transient_position >= LD_ENV_TBL_480)) {
1553*15dc779aSAndroid Build Coastguard Worker return -1;
1554*15dc779aSAndroid Build Coastguard Worker }
1555*15dc779aSAndroid Build Coastguard Worker bs_num_env = (numTimeSlots == 16)
1556*15dc779aSAndroid Build Coastguard Worker ? ixheaacd_ld_env_table_512[bs_transient_position]
1557*15dc779aSAndroid Build Coastguard Worker [SBR_ENVT_NUMENV]
1558*15dc779aSAndroid Build Coastguard Worker : ixheaacd_ld_env_table_480[bs_transient_position]
1559*15dc779aSAndroid Build Coastguard Worker [SBR_ENVT_NUMENV];
1560*15dc779aSAndroid Build Coastguard Worker for (env = 0; env < bs_num_env; env++)
1561*15dc779aSAndroid Build Coastguard Worker f[env] = ixheaacd_read_bits_buf(it_bit_buff, SBR_RES_BITS);
1562*15dc779aSAndroid Build Coastguard Worker break;
1563*15dc779aSAndroid Build Coastguard Worker }
1564*15dc779aSAndroid Build Coastguard Worker
1565*15dc779aSAndroid Build Coastguard Worker switch (frame_class) {
1566*15dc779aSAndroid Build Coastguard Worker case FIXFIX:
1567*15dc779aSAndroid Build Coastguard Worker abs_bord_lead = 0;
1568*15dc779aSAndroid Build Coastguard Worker abs_bord_trail = numTimeSlots;
1569*15dc779aSAndroid Build Coastguard Worker num_rel_lead = bs_num_env - 1;
1570*15dc779aSAndroid Build Coastguard Worker
1571*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_rel_lead; k++) {
1572*15dc779aSAndroid Build Coastguard Worker rel_bord_lead[k] = ixheaacd_ld_env_table_time_slot[num_rel_lead - 1];
1573*15dc779aSAndroid Build Coastguard Worker }
1574*15dc779aSAndroid Build Coastguard Worker
1575*15dc779aSAndroid Build Coastguard Worker time_border[0] = abs_bord_lead;
1576*15dc779aSAndroid Build Coastguard Worker time_border[bs_num_env] = abs_bord_trail;
1577*15dc779aSAndroid Build Coastguard Worker for (env = 1; env <= num_rel_lead; env++) {
1578*15dc779aSAndroid Build Coastguard Worker time_border[env] = abs_bord_lead;
1579*15dc779aSAndroid Build Coastguard Worker for (k = 0; k <= env - 1; k++) time_border[env] += rel_bord_lead[k];
1580*15dc779aSAndroid Build Coastguard Worker }
1581*15dc779aSAndroid Build Coastguard Worker break;
1582*15dc779aSAndroid Build Coastguard Worker
1583*15dc779aSAndroid Build Coastguard Worker case LD_TRAN:
1584*15dc779aSAndroid Build Coastguard Worker time_border[0] = 0;
1585*15dc779aSAndroid Build Coastguard Worker time_border[bs_num_env] = numTimeSlots;
1586*15dc779aSAndroid Build Coastguard Worker for (k = 1; k < bs_num_env; k++)
1587*15dc779aSAndroid Build Coastguard Worker time_border[k] =
1588*15dc779aSAndroid Build Coastguard Worker (numTimeSlots == 16)
1589*15dc779aSAndroid Build Coastguard Worker ? ixheaacd_ld_env_table_512[bs_transient_position][k]
1590*15dc779aSAndroid Build Coastguard Worker : ixheaacd_ld_env_table_480[bs_transient_position][k];
1591*15dc779aSAndroid Build Coastguard Worker break;
1592*15dc779aSAndroid Build Coastguard Worker
1593*15dc779aSAndroid Build Coastguard Worker default:
1594*15dc779aSAndroid Build Coastguard Worker time_border[0] = 0;
1595*15dc779aSAndroid Build Coastguard Worker
1596*15dc779aSAndroid Build Coastguard Worker break;
1597*15dc779aSAndroid Build Coastguard Worker };
1598*15dc779aSAndroid Build Coastguard Worker
1599*15dc779aSAndroid Build Coastguard Worker switch (frame_class) {
1600*15dc779aSAndroid Build Coastguard Worker case FIXFIX:
1601*15dc779aSAndroid Build Coastguard Worker middle_bord = bs_num_env / 2;
1602*15dc779aSAndroid Build Coastguard Worker break;
1603*15dc779aSAndroid Build Coastguard Worker case LD_TRAN:
1604*15dc779aSAndroid Build Coastguard Worker middle_bord = 1;
1605*15dc779aSAndroid Build Coastguard Worker break;
1606*15dc779aSAndroid Build Coastguard Worker };
1607*15dc779aSAndroid Build Coastguard Worker
1608*15dc779aSAndroid Build Coastguard Worker time_border_noise[0] = time_border[0];
1609*15dc779aSAndroid Build Coastguard Worker if (bs_num_env > 1) {
1610*15dc779aSAndroid Build Coastguard Worker time_border_noise[1] = time_border[middle_bord];
1611*15dc779aSAndroid Build Coastguard Worker time_border_noise[2] = time_border[bs_num_env];
1612*15dc779aSAndroid Build Coastguard Worker bs_num_noise = 2;
1613*15dc779aSAndroid Build Coastguard Worker } else {
1614*15dc779aSAndroid Build Coastguard Worker time_border_noise[1] = time_border[bs_num_env];
1615*15dc779aSAndroid Build Coastguard Worker bs_num_noise = 1;
1616*15dc779aSAndroid Build Coastguard Worker }
1617*15dc779aSAndroid Build Coastguard Worker
1618*15dc779aSAndroid Build Coastguard Worker switch (frame_class) {
1619*15dc779aSAndroid Build Coastguard Worker case FIXFIX:
1620*15dc779aSAndroid Build Coastguard Worker transient_env_temp = -1;
1621*15dc779aSAndroid Build Coastguard Worker break;
1622*15dc779aSAndroid Build Coastguard Worker case LD_TRAN:
1623*15dc779aSAndroid Build Coastguard Worker transient_env_temp =
1624*15dc779aSAndroid Build Coastguard Worker (numTimeSlots == 16)
1625*15dc779aSAndroid Build Coastguard Worker ? ixheaacd_ld_env_table_512[bs_transient_position]
1626*15dc779aSAndroid Build Coastguard Worker [SBR_ENVT_TRANIDX]
1627*15dc779aSAndroid Build Coastguard Worker : ixheaacd_ld_env_table_480[bs_transient_position]
1628*15dc779aSAndroid Build Coastguard Worker [SBR_ENVT_TRANIDX];
1629*15dc779aSAndroid Build Coastguard Worker break;
1630*15dc779aSAndroid Build Coastguard Worker };
1631*15dc779aSAndroid Build Coastguard Worker
1632*15dc779aSAndroid Build Coastguard Worker v_frame_info->num_env = bs_num_env;
1633*15dc779aSAndroid Build Coastguard Worker memcpy(v_frame_info->border_vec, time_border,
1634*15dc779aSAndroid Build Coastguard Worker (bs_num_env + 1) * sizeof(WORD16));
1635*15dc779aSAndroid Build Coastguard Worker memcpy(v_frame_info->freq_res, f, bs_num_env * sizeof(WORD16));
1636*15dc779aSAndroid Build Coastguard Worker v_frame_info->transient_env = transient_env_temp;
1637*15dc779aSAndroid Build Coastguard Worker v_frame_info->num_noise_env = bs_num_noise;
1638*15dc779aSAndroid Build Coastguard Worker memcpy(v_frame_info->noise_border_vec, time_border_noise,
1639*15dc779aSAndroid Build Coastguard Worker (bs_num_noise + 1) * sizeof(WORD16));
1640*15dc779aSAndroid Build Coastguard Worker
1641*15dc779aSAndroid Build Coastguard Worker return err;
1642*15dc779aSAndroid Build Coastguard Worker }
1643*15dc779aSAndroid Build Coastguard Worker
ixheaacd_pvc_time_freq_grid_info(ia_bit_buf_struct * it_bit_buff,ia_sbr_frame_info_data_struct * ptr_frame_data)1644*15dc779aSAndroid Build Coastguard Worker WORD32 ixheaacd_pvc_time_freq_grid_info(
1645*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1646*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data) {
1647*15dc779aSAndroid Build Coastguard Worker WORD32 bs_num_env = 0, bs_num_noise = 0;
1648*15dc779aSAndroid Build Coastguard Worker WORD32 time_border[MAX_ENVELOPES + 1];
1649*15dc779aSAndroid Build Coastguard Worker WORD32 time_border_noise[2 + 1];
1650*15dc779aSAndroid Build Coastguard Worker WORD32 pvc_time_border[MAX_ENVELOPES + 1];
1651*15dc779aSAndroid Build Coastguard Worker WORD32 pvc_time_border_noise[2 + 1];
1652*15dc779aSAndroid Build Coastguard Worker WORD32 bs_freq_res[MAX_ENVELOPES + 1];
1653*15dc779aSAndroid Build Coastguard Worker WORD32 var_len;
1654*15dc779aSAndroid Build Coastguard Worker ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1655*15dc779aSAndroid Build Coastguard Worker ia_frame_info_struct *pvc_frame_info = &ptr_frame_data->str_pvc_frame_info;
1656*15dc779aSAndroid Build Coastguard Worker WORD32 i;
1657*15dc779aSAndroid Build Coastguard Worker WORD32 prev_sbr_mode = ptr_frame_data->prev_sbr_mode;
1658*15dc779aSAndroid Build Coastguard Worker
1659*15dc779aSAndroid Build Coastguard Worker WORD32 tmp;
1660*15dc779aSAndroid Build Coastguard Worker WORD32 bs_noise_pos;
1661*15dc779aSAndroid Build Coastguard Worker bs_noise_pos = ixheaacd_read_bits_buf(it_bit_buff, 4);
1662*15dc779aSAndroid Build Coastguard Worker
1663*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, 1);
1664*15dc779aSAndroid Build Coastguard Worker if (tmp == 0) {
1665*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->var_len = 0;
1666*15dc779aSAndroid Build Coastguard Worker } else {
1667*15dc779aSAndroid Build Coastguard Worker tmp = ixheaacd_read_bits_buf(it_bit_buff, 2);
1668*15dc779aSAndroid Build Coastguard Worker ptr_frame_data->var_len = tmp + 1;
1669*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->var_len > 3) {
1670*15dc779aSAndroid Build Coastguard Worker return -1;
1671*15dc779aSAndroid Build Coastguard Worker }
1672*15dc779aSAndroid Build Coastguard Worker }
1673*15dc779aSAndroid Build Coastguard Worker var_len = ptr_frame_data->var_len;
1674*15dc779aSAndroid Build Coastguard Worker
1675*15dc779aSAndroid Build Coastguard Worker if (p_frame_info->num_env > 0) {
1676*15dc779aSAndroid Build Coastguard Worker time_border[0] = p_frame_info->border_vec[p_frame_info->num_env] - 16;
1677*15dc779aSAndroid Build Coastguard Worker } else {
1678*15dc779aSAndroid Build Coastguard Worker time_border[0] = 0;
1679*15dc779aSAndroid Build Coastguard Worker }
1680*15dc779aSAndroid Build Coastguard Worker if (time_border[0] < 0) return -1;
1681*15dc779aSAndroid Build Coastguard Worker pvc_time_border[0] = 0;
1682*15dc779aSAndroid Build Coastguard Worker bs_freq_res[0] = 0;
1683*15dc779aSAndroid Build Coastguard Worker
1684*15dc779aSAndroid Build Coastguard Worker if (ptr_frame_data->prev_sbr_mode == 0) {
1685*15dc779aSAndroid Build Coastguard Worker pvc_time_border[0] = time_border[0];
1686*15dc779aSAndroid Build Coastguard Worker }
1687*15dc779aSAndroid Build Coastguard Worker
1688*15dc779aSAndroid Build Coastguard Worker if (bs_noise_pos == 0) {
1689*15dc779aSAndroid Build Coastguard Worker time_border[1] = 16 + var_len;
1690*15dc779aSAndroid Build Coastguard Worker pvc_time_border[1] = 16;
1691*15dc779aSAndroid Build Coastguard Worker bs_num_noise = 1;
1692*15dc779aSAndroid Build Coastguard Worker bs_num_env = 1;
1693*15dc779aSAndroid Build Coastguard Worker } else {
1694*15dc779aSAndroid Build Coastguard Worker time_border[1] = bs_noise_pos;
1695*15dc779aSAndroid Build Coastguard Worker pvc_time_border[1] = bs_noise_pos;
1696*15dc779aSAndroid Build Coastguard Worker time_border[2] = 16 + var_len;
1697*15dc779aSAndroid Build Coastguard Worker pvc_time_border[2] = 16;
1698*15dc779aSAndroid Build Coastguard Worker bs_freq_res[1] = 0;
1699*15dc779aSAndroid Build Coastguard Worker bs_num_noise = 2;
1700*15dc779aSAndroid Build Coastguard Worker bs_num_env = 2;
1701*15dc779aSAndroid Build Coastguard Worker }
1702*15dc779aSAndroid Build Coastguard Worker
1703*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < 3; i++) {
1704*15dc779aSAndroid Build Coastguard Worker time_border_noise[i] = time_border[i];
1705*15dc779aSAndroid Build Coastguard Worker pvc_time_border_noise[i] = pvc_time_border[i];
1706*15dc779aSAndroid Build Coastguard Worker }
1707*15dc779aSAndroid Build Coastguard Worker
1708*15dc779aSAndroid Build Coastguard Worker if (prev_sbr_mode == ORIG_SBR) {
1709*15dc779aSAndroid Build Coastguard Worker pvc_time_border[0] = time_border[0];
1710*15dc779aSAndroid Build Coastguard Worker pvc_time_border_noise[0] = time_border[0];
1711*15dc779aSAndroid Build Coastguard Worker }
1712*15dc779aSAndroid Build Coastguard Worker
1713*15dc779aSAndroid Build Coastguard Worker pvc_frame_info->num_env = bs_num_env;
1714*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (bs_num_env + 1); i++) {
1715*15dc779aSAndroid Build Coastguard Worker pvc_frame_info->border_vec[i] = pvc_time_border[i];
1716*15dc779aSAndroid Build Coastguard Worker }
1717*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (bs_num_env); i++) {
1718*15dc779aSAndroid Build Coastguard Worker pvc_frame_info->freq_res[i] = bs_freq_res[i];
1719*15dc779aSAndroid Build Coastguard Worker }
1720*15dc779aSAndroid Build Coastguard Worker pvc_frame_info->transient_env = -1;
1721*15dc779aSAndroid Build Coastguard Worker pvc_frame_info->num_noise_env = bs_num_noise;
1722*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (bs_num_noise + 1); i++) {
1723*15dc779aSAndroid Build Coastguard Worker pvc_frame_info->noise_border_vec[i] = pvc_time_border_noise[i];
1724*15dc779aSAndroid Build Coastguard Worker }
1725*15dc779aSAndroid Build Coastguard Worker p_frame_info->num_env = bs_num_env;
1726*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (bs_num_env + 1); i++) {
1727*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[i] = time_border[i];
1728*15dc779aSAndroid Build Coastguard Worker }
1729*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (bs_num_env); i++) {
1730*15dc779aSAndroid Build Coastguard Worker p_frame_info->freq_res[i] = bs_freq_res[i];
1731*15dc779aSAndroid Build Coastguard Worker }
1732*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = -1;
1733*15dc779aSAndroid Build Coastguard Worker p_frame_info->num_noise_env = bs_num_noise;
1734*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < (bs_num_noise + 1); i++) {
1735*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[i] = time_border_noise[i];
1736*15dc779aSAndroid Build Coastguard Worker }
1737*15dc779aSAndroid Build Coastguard Worker return 0;
1738*15dc779aSAndroid Build Coastguard Worker }
1739*15dc779aSAndroid Build Coastguard Worker
ixheaacd_sbr_time_freq_grid_info(ia_bit_buf_struct * it_bit_buff,ia_sbr_frame_info_data_struct * ptr_frame_data,ia_env_extr_tables_struct * env_extr_tables_ptr,WORD16 number_of_time_slots)1740*15dc779aSAndroid Build Coastguard Worker WORD16 ixheaacd_sbr_time_freq_grid_info(
1741*15dc779aSAndroid Build Coastguard Worker ia_bit_buf_struct *it_bit_buff,
1742*15dc779aSAndroid Build Coastguard Worker ia_sbr_frame_info_data_struct *ptr_frame_data,
1743*15dc779aSAndroid Build Coastguard Worker ia_env_extr_tables_struct *env_extr_tables_ptr, WORD16 number_of_time_slots) {
1744*15dc779aSAndroid Build Coastguard Worker WORD32 i, k, bs_num_rel = 0;
1745*15dc779aSAndroid Build Coastguard Worker WORD32 bs_pointer_bits = 0, bs_num_env = 0, border, bs_pointer,
1746*15dc779aSAndroid Build Coastguard Worker bs_var_bord = 0, temp = 0;
1747*15dc779aSAndroid Build Coastguard Worker WORD32 freq_res_0 = 0, frame_class;
1748*15dc779aSAndroid Build Coastguard Worker WORD32 abs_bord_lead, abs_bord_trail, num_rel_trail, num_rel_lead;
1749*15dc779aSAndroid Build Coastguard Worker static const WORD32 pointer_bits_array[7] = {1, 2, 2, 3, 3, 3, 3};
1750*15dc779aSAndroid Build Coastguard Worker ia_frame_info_struct *p_fixfix_tab;
1751*15dc779aSAndroid Build Coastguard Worker ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details;
1752*15dc779aSAndroid Build Coastguard Worker
1753*15dc779aSAndroid Build Coastguard Worker frame_class = ixheaacd_read_bits_buf(it_bit_buff, SBR_FRAME_CLASS_BITS);
1754*15dc779aSAndroid Build Coastguard Worker p_frame_info->frame_class = frame_class;
1755*15dc779aSAndroid Build Coastguard Worker
1756*15dc779aSAndroid Build Coastguard Worker switch (frame_class) {
1757*15dc779aSAndroid Build Coastguard Worker case FIXFIX:
1758*15dc779aSAndroid Build Coastguard Worker temp =
1759*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_ENV_BITS + SBR_FRQ_RES_BITS);
1760*15dc779aSAndroid Build Coastguard Worker bs_num_env = (temp & 0x6) >> SBR_FRQ_RES_BITS;
1761*15dc779aSAndroid Build Coastguard Worker
1762*15dc779aSAndroid Build Coastguard Worker if (number_of_time_slots != 15) {
1763*15dc779aSAndroid Build Coastguard Worker p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env];
1764*15dc779aSAndroid Build Coastguard Worker } else {
1765*15dc779aSAndroid Build Coastguard Worker if (bs_num_env > 2) return 0;
1766*15dc779aSAndroid Build Coastguard Worker p_fixfix_tab = &env_extr_tables_ptr->sbr_frame_info1_2_4_16[bs_num_env + 4];
1767*15dc779aSAndroid Build Coastguard Worker }
1768*15dc779aSAndroid Build Coastguard Worker
1769*15dc779aSAndroid Build Coastguard Worker memcpy(p_frame_info, p_fixfix_tab, sizeof(ia_frame_info_struct));
1770*15dc779aSAndroid Build Coastguard Worker bs_num_env = (1 << bs_num_env);
1771*15dc779aSAndroid Build Coastguard Worker freq_res_0 = temp & 0x1;
1772*15dc779aSAndroid Build Coastguard Worker
1773*15dc779aSAndroid Build Coastguard Worker if (!freq_res_0) {
1774*15dc779aSAndroid Build Coastguard Worker memset(&p_frame_info->freq_res[0], 0, sizeof(WORD16) * bs_num_env);
1775*15dc779aSAndroid Build Coastguard Worker }
1776*15dc779aSAndroid Build Coastguard Worker break;
1777*15dc779aSAndroid Build Coastguard Worker case FIXVAR:
1778*15dc779aSAndroid Build Coastguard Worker bs_var_bord =
1779*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS);
1780*15dc779aSAndroid Build Coastguard Worker bs_num_rel = bs_var_bord & 3;
1781*15dc779aSAndroid Build Coastguard Worker bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
1782*15dc779aSAndroid Build Coastguard Worker bs_num_env = bs_num_rel + 1;
1783*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[0] = 0;
1784*15dc779aSAndroid Build Coastguard Worker
1785*15dc779aSAndroid Build Coastguard Worker if (number_of_time_slots != 15) {
1786*15dc779aSAndroid Build Coastguard Worker border = bs_var_bord + SBR_TIME_SLOTS;
1787*15dc779aSAndroid Build Coastguard Worker } else {
1788*15dc779aSAndroid Build Coastguard Worker border = bs_var_bord + number_of_time_slots;
1789*15dc779aSAndroid Build Coastguard Worker }
1790*15dc779aSAndroid Build Coastguard Worker
1791*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[bs_num_env] = border;
1792*15dc779aSAndroid Build Coastguard Worker for (k = bs_num_rel; k > 0; k--) {
1793*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1794*15dc779aSAndroid Build Coastguard Worker border = border - ((temp << 1) + 2);
1795*15dc779aSAndroid Build Coastguard Worker if (border < 0) border = 0;
1796*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[k] = border;
1797*15dc779aSAndroid Build Coastguard Worker }
1798*15dc779aSAndroid Build Coastguard Worker
1799*15dc779aSAndroid Build Coastguard Worker bs_pointer_bits = pointer_bits_array[bs_num_rel];
1800*15dc779aSAndroid Build Coastguard Worker bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
1801*15dc779aSAndroid Build Coastguard Worker
1802*15dc779aSAndroid Build Coastguard Worker if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0;
1803*15dc779aSAndroid Build Coastguard Worker
1804*15dc779aSAndroid Build Coastguard Worker for (k = bs_num_rel; k >= 0; k--) {
1805*15dc779aSAndroid Build Coastguard Worker p_frame_info->freq_res[k] =
1806*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
1807*15dc779aSAndroid Build Coastguard Worker }
1808*15dc779aSAndroid Build Coastguard Worker if (bs_pointer) {
1809*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = bs_num_env + 1 - bs_pointer;
1810*15dc779aSAndroid Build Coastguard Worker } else {
1811*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = -1;
1812*15dc779aSAndroid Build Coastguard Worker }
1813*15dc779aSAndroid Build Coastguard Worker if ((bs_pointer == 0) || (bs_pointer == 1))
1814*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] =
1815*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[bs_num_rel];
1816*15dc779aSAndroid Build Coastguard Worker else
1817*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] =
1818*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[p_frame_info->transient_env];
1819*15dc779aSAndroid Build Coastguard Worker
1820*15dc779aSAndroid Build Coastguard Worker break;
1821*15dc779aSAndroid Build Coastguard Worker
1822*15dc779aSAndroid Build Coastguard Worker case VARFIX:
1823*15dc779aSAndroid Build Coastguard Worker bs_var_bord =
1824*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_VAR_BORD_BITS + SBR_NUM_BITS);
1825*15dc779aSAndroid Build Coastguard Worker bs_num_rel = bs_var_bord & 3;
1826*15dc779aSAndroid Build Coastguard Worker bs_var_bord = bs_var_bord >> SBR_NUM_BITS;
1827*15dc779aSAndroid Build Coastguard Worker bs_num_env = bs_num_rel + 1;
1828*15dc779aSAndroid Build Coastguard Worker
1829*15dc779aSAndroid Build Coastguard Worker border = bs_var_bord;
1830*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[0] = border;
1831*15dc779aSAndroid Build Coastguard Worker for (k = 1; k <= bs_num_rel; k++) {
1832*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1833*15dc779aSAndroid Build Coastguard Worker border = border + ((temp << 1) + 2);
1834*15dc779aSAndroid Build Coastguard Worker
1835*15dc779aSAndroid Build Coastguard Worker if (number_of_time_slots != 15) {
1836*15dc779aSAndroid Build Coastguard Worker if (border > SBR_TIME_SLOTS) border = SBR_TIME_SLOTS;
1837*15dc779aSAndroid Build Coastguard Worker } else {
1838*15dc779aSAndroid Build Coastguard Worker if (border > number_of_time_slots) border = number_of_time_slots;
1839*15dc779aSAndroid Build Coastguard Worker }
1840*15dc779aSAndroid Build Coastguard Worker
1841*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[k] = border;
1842*15dc779aSAndroid Build Coastguard Worker }
1843*15dc779aSAndroid Build Coastguard Worker
1844*15dc779aSAndroid Build Coastguard Worker if (number_of_time_slots != 15) {
1845*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[k] = SBR_TIME_SLOTS;
1846*15dc779aSAndroid Build Coastguard Worker } else {
1847*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[k] = number_of_time_slots;
1848*15dc779aSAndroid Build Coastguard Worker }
1849*15dc779aSAndroid Build Coastguard Worker
1850*15dc779aSAndroid Build Coastguard Worker bs_pointer_bits = pointer_bits_array[bs_num_rel];
1851*15dc779aSAndroid Build Coastguard Worker
1852*15dc779aSAndroid Build Coastguard Worker bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
1853*15dc779aSAndroid Build Coastguard Worker
1854*15dc779aSAndroid Build Coastguard Worker if ((bs_pointer - (bs_num_rel + 1)) > 0) return 0;
1855*15dc779aSAndroid Build Coastguard Worker
1856*15dc779aSAndroid Build Coastguard Worker if (bs_pointer == 0 || (bs_pointer - 1) == 0) {
1857*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = -1;
1858*15dc779aSAndroid Build Coastguard Worker } else {
1859*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = bs_pointer - 1;
1860*15dc779aSAndroid Build Coastguard Worker }
1861*15dc779aSAndroid Build Coastguard Worker
1862*15dc779aSAndroid Build Coastguard Worker for (k = 0; k <= bs_num_rel; k++) {
1863*15dc779aSAndroid Build Coastguard Worker p_frame_info->freq_res[k] =
1864*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
1865*15dc779aSAndroid Build Coastguard Worker }
1866*15dc779aSAndroid Build Coastguard Worker
1867*15dc779aSAndroid Build Coastguard Worker switch (bs_pointer) {
1868*15dc779aSAndroid Build Coastguard Worker case 0:
1869*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] = p_frame_info->border_vec[1];
1870*15dc779aSAndroid Build Coastguard Worker break;
1871*15dc779aSAndroid Build Coastguard Worker case 1:
1872*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] =
1873*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[bs_num_rel];
1874*15dc779aSAndroid Build Coastguard Worker break;
1875*15dc779aSAndroid Build Coastguard Worker default:
1876*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] =
1877*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[(WORD32)p_frame_info->transient_env];
1878*15dc779aSAndroid Build Coastguard Worker break;
1879*15dc779aSAndroid Build Coastguard Worker }
1880*15dc779aSAndroid Build Coastguard Worker
1881*15dc779aSAndroid Build Coastguard Worker break;
1882*15dc779aSAndroid Build Coastguard Worker
1883*15dc779aSAndroid Build Coastguard Worker case VARVAR:
1884*15dc779aSAndroid Build Coastguard Worker abs_bord_lead = ixheaacd_read_bits_buf(
1885*15dc779aSAndroid Build Coastguard Worker it_bit_buff, 2 * SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
1886*15dc779aSAndroid Build Coastguard Worker
1887*15dc779aSAndroid Build Coastguard Worker if (number_of_time_slots != 15) {
1888*15dc779aSAndroid Build Coastguard Worker abs_bord_trail =
1889*15dc779aSAndroid Build Coastguard Worker (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + SBR_TIME_SLOTS);
1890*15dc779aSAndroid Build Coastguard Worker } else {
1891*15dc779aSAndroid Build Coastguard Worker abs_bord_trail =
1892*15dc779aSAndroid Build Coastguard Worker (((abs_bord_lead & 0x30) >> (2 * SBR_NUM_BITS)) + number_of_time_slots);
1893*15dc779aSAndroid Build Coastguard Worker }
1894*15dc779aSAndroid Build Coastguard Worker
1895*15dc779aSAndroid Build Coastguard Worker num_rel_trail = ((abs_bord_lead & 0xc) >> SBR_NUM_BITS);
1896*15dc779aSAndroid Build Coastguard Worker num_rel_lead = (abs_bord_lead & 0x3);
1897*15dc779aSAndroid Build Coastguard Worker abs_bord_lead = abs_bord_lead >> (SBR_VAR_BORD_BITS + 2 * SBR_NUM_BITS);
1898*15dc779aSAndroid Build Coastguard Worker bs_num_env = ((num_rel_trail + num_rel_lead) + 1);
1899*15dc779aSAndroid Build Coastguard Worker border = abs_bord_lead;
1900*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[0] = border;
1901*15dc779aSAndroid Build Coastguard Worker
1902*15dc779aSAndroid Build Coastguard Worker for (k = 1; k <= num_rel_trail; k++) {
1903*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1904*15dc779aSAndroid Build Coastguard Worker border = border + ((temp << 1) + 2);
1905*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[k] = border;
1906*15dc779aSAndroid Build Coastguard Worker }
1907*15dc779aSAndroid Build Coastguard Worker
1908*15dc779aSAndroid Build Coastguard Worker border = abs_bord_trail;
1909*15dc779aSAndroid Build Coastguard Worker i = bs_num_env;
1910*15dc779aSAndroid Build Coastguard Worker
1911*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[i] = border;
1912*15dc779aSAndroid Build Coastguard Worker
1913*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < num_rel_lead; k++) {
1914*15dc779aSAndroid Build Coastguard Worker temp = ixheaacd_read_bits_buf(it_bit_buff, SBR_REL_BITS);
1915*15dc779aSAndroid Build Coastguard Worker border = border - ((temp << 1) + 2);
1916*15dc779aSAndroid Build Coastguard Worker i--;
1917*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[i] = border;
1918*15dc779aSAndroid Build Coastguard Worker }
1919*15dc779aSAndroid Build Coastguard Worker bs_pointer_bits = pointer_bits_array[num_rel_trail + num_rel_lead];
1920*15dc779aSAndroid Build Coastguard Worker
1921*15dc779aSAndroid Build Coastguard Worker bs_pointer = ixheaacd_read_bits_buf(it_bit_buff, bs_pointer_bits);
1922*15dc779aSAndroid Build Coastguard Worker if ((bs_pointer - ((num_rel_trail + num_rel_lead) + 1)) > 0) return 0;
1923*15dc779aSAndroid Build Coastguard Worker
1924*15dc779aSAndroid Build Coastguard Worker if (bs_pointer) {
1925*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = bs_num_env + 1 - bs_pointer;
1926*15dc779aSAndroid Build Coastguard Worker } else {
1927*15dc779aSAndroid Build Coastguard Worker p_frame_info->transient_env = -1;
1928*15dc779aSAndroid Build Coastguard Worker }
1929*15dc779aSAndroid Build Coastguard Worker
1930*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < bs_num_env; k++) {
1931*15dc779aSAndroid Build Coastguard Worker p_frame_info->freq_res[k] =
1932*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, SBR_FRQ_RES_BITS);
1933*15dc779aSAndroid Build Coastguard Worker }
1934*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[0] = abs_bord_lead;
1935*15dc779aSAndroid Build Coastguard Worker if (bs_num_env == 1) {
1936*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] = abs_bord_trail;
1937*15dc779aSAndroid Build Coastguard Worker } else {
1938*15dc779aSAndroid Build Coastguard Worker if (bs_pointer == 0 || (bs_pointer - 1) == 0)
1939*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] =
1940*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[bs_num_env - 1];
1941*15dc779aSAndroid Build Coastguard Worker else
1942*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[1] =
1943*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[(WORD32)p_frame_info->transient_env];
1944*15dc779aSAndroid Build Coastguard Worker
1945*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[2] = abs_bord_trail;
1946*15dc779aSAndroid Build Coastguard Worker }
1947*15dc779aSAndroid Build Coastguard Worker break;
1948*15dc779aSAndroid Build Coastguard Worker }
1949*15dc779aSAndroid Build Coastguard Worker p_frame_info->num_env = bs_num_env;
1950*15dc779aSAndroid Build Coastguard Worker
1951*15dc779aSAndroid Build Coastguard Worker if (bs_num_env == 1)
1952*15dc779aSAndroid Build Coastguard Worker p_frame_info->num_noise_env = 1;
1953*15dc779aSAndroid Build Coastguard Worker else
1954*15dc779aSAndroid Build Coastguard Worker p_frame_info->num_noise_env = 2;
1955*15dc779aSAndroid Build Coastguard Worker
1956*15dc779aSAndroid Build Coastguard Worker if (frame_class == VARFIX || frame_class == FIXVAR) {
1957*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[0] = p_frame_info->border_vec[0];
1958*15dc779aSAndroid Build Coastguard Worker p_frame_info->noise_border_vec[p_frame_info->num_noise_env] =
1959*15dc779aSAndroid Build Coastguard Worker p_frame_info->border_vec[bs_num_env];
1960*15dc779aSAndroid Build Coastguard Worker }
1961*15dc779aSAndroid Build Coastguard Worker return 1;
1962*15dc779aSAndroid Build Coastguard Worker }