xref: /aosp_15_r20/external/libxaac/encoder/ixheaace_sbr_write_bitstream.c (revision 15dc779a375ca8b5125643b829a8aa4b70d7f451)
1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker  *                                                                            *
3*15dc779aSAndroid Build Coastguard Worker  * Copyright (C) 2023 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 
21*15dc779aSAndroid Build Coastguard Worker #include <math.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_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 
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_def.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_resampler.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_rom.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hbe.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_qmf_enc.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_tran_det.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_frame_info_gen.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_env_est.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_code_envelope.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_main.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_missing_harmonics_det.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_inv_filtering_estimation.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_noise_floor_est.h"
46*15dc779aSAndroid Build Coastguard Worker 
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ton_corr.h"
48*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
49*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_inter_tes.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_cmondata.h"
52*15dc779aSAndroid Build Coastguard Worker #include "iusace_esbr_pvc.h"
53*15dc779aSAndroid Build Coastguard Worker 
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_hybrid.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_enc.h"
56*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_ps_bitenc.h"
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_write_bitstream.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
59*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
60*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
61*15dc779aSAndroid Build Coastguard Worker 
ixheaace_get_esbr_ext_data_size(ixheaace_str_esbr_bs_data * pstr_esbr_bs_data)62*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_esbr_ext_data_size(ixheaace_str_esbr_bs_data *pstr_esbr_bs_data) {
63*15dc779aSAndroid Build Coastguard Worker   WORD32 num_bits = 1;
64*15dc779aSAndroid Build Coastguard Worker   if (1 == pstr_esbr_bs_data->sbr_num_chan) {
65*15dc779aSAndroid Build Coastguard Worker     num_bits += 1;
66*15dc779aSAndroid Build Coastguard Worker     if (pstr_esbr_bs_data->sbr_patching_mode[0] == 0) {
67*15dc779aSAndroid Build Coastguard Worker       num_bits += 2;
68*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_pitchin_flags[0] == 1) {
69*15dc779aSAndroid Build Coastguard Worker         num_bits += 7;
70*15dc779aSAndroid Build Coastguard Worker       }
71*15dc779aSAndroid Build Coastguard Worker     }
72*15dc779aSAndroid Build Coastguard Worker   } else if (2 == pstr_esbr_bs_data->sbr_num_chan) {
73*15dc779aSAndroid Build Coastguard Worker     if (pstr_esbr_bs_data->sbr_coupling) {
74*15dc779aSAndroid Build Coastguard Worker       num_bits += 1;
75*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_patching_mode[0] == 0) {
76*15dc779aSAndroid Build Coastguard Worker         num_bits += 2;
77*15dc779aSAndroid Build Coastguard Worker         if (pstr_esbr_bs_data->sbr_pitchin_flags[0] == 1) {
78*15dc779aSAndroid Build Coastguard Worker           num_bits += 7;
79*15dc779aSAndroid Build Coastguard Worker         }
80*15dc779aSAndroid Build Coastguard Worker       }
81*15dc779aSAndroid Build Coastguard Worker     } else {
82*15dc779aSAndroid Build Coastguard Worker       num_bits += 1;
83*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_patching_mode[0] == 0) {
84*15dc779aSAndroid Build Coastguard Worker         num_bits += 2;
85*15dc779aSAndroid Build Coastguard Worker         if (pstr_esbr_bs_data->sbr_pitchin_flags[0] == 1) {
86*15dc779aSAndroid Build Coastguard Worker           num_bits += 7;
87*15dc779aSAndroid Build Coastguard Worker         }
88*15dc779aSAndroid Build Coastguard Worker       }
89*15dc779aSAndroid Build Coastguard Worker       num_bits += 1;
90*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_patching_mode[1] == 0) {
91*15dc779aSAndroid Build Coastguard Worker         num_bits += 2;
92*15dc779aSAndroid Build Coastguard Worker         if (pstr_esbr_bs_data->sbr_pitchin_flags[1] == 1) {
93*15dc779aSAndroid Build Coastguard Worker           num_bits += 7;
94*15dc779aSAndroid Build Coastguard Worker         }
95*15dc779aSAndroid Build Coastguard Worker       }
96*15dc779aSAndroid Build Coastguard Worker     }
97*15dc779aSAndroid Build Coastguard Worker   } else {
98*15dc779aSAndroid Build Coastguard Worker     num_bits = 0;
99*15dc779aSAndroid Build Coastguard Worker   }
100*15dc779aSAndroid Build Coastguard Worker   if (num_bits != 0 && num_bits < 6) {
101*15dc779aSAndroid Build Coastguard Worker     num_bits = 6;
102*15dc779aSAndroid Build Coastguard Worker   }
103*15dc779aSAndroid Build Coastguard Worker   return num_bits;
104*15dc779aSAndroid Build Coastguard Worker }
iusace_encode_pvc_envelope(ixheaace_bit_buf_handle pstr_bs_handle,ixheaace_pvc_bs_info * pstr_pvc_bs_data,WORD32 usac_indep_flag)105*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_encode_pvc_envelope(ixheaace_bit_buf_handle pstr_bs_handle,
106*15dc779aSAndroid Build Coastguard Worker                                          ixheaace_pvc_bs_info *pstr_pvc_bs_data,
107*15dc779aSAndroid Build Coastguard Worker                                          WORD32 usac_indep_flag) {
108*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
109*15dc779aSAndroid Build Coastguard Worker   payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_pvc_bs_data->div_mode,
110*15dc779aSAndroid Build Coastguard Worker                                           IXHEAACE_ESBR_PVC_DIV_MODE_BITS);
111*15dc779aSAndroid Build Coastguard Worker   payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_pvc_bs_data->ns_mode,
112*15dc779aSAndroid Build Coastguard Worker                                           IXHEAACE_ESBR_PVC_NS_MODE_BITS);
113*15dc779aSAndroid Build Coastguard Worker 
114*15dc779aSAndroid Build Coastguard Worker   if (0 == pstr_pvc_bs_data->div_mode) {
115*15dc779aSAndroid Build Coastguard Worker     if (1 == usac_indep_flag) {
116*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_pvc_bs_data->pvc_id_bs[0],
117*15dc779aSAndroid Build Coastguard Worker                                               IXHEAACE_ESBR_PVC_ID_BITS);
118*15dc779aSAndroid Build Coastguard Worker     } else {
119*15dc779aSAndroid Build Coastguard Worker       if (1 == pstr_pvc_bs_data->grid_info[0]) {
120*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, IXHEAACE_ESBR_PVC_REUSE_BITS);
121*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_pvc_bs_data->pvc_id_bs[0],
122*15dc779aSAndroid Build Coastguard Worker                                                 IXHEAACE_ESBR_PVC_ID_BITS);
123*15dc779aSAndroid Build Coastguard Worker       } else {
124*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 1, IXHEAACE_ESBR_PVC_REUSE_BITS);
125*15dc779aSAndroid Build Coastguard Worker       }
126*15dc779aSAndroid Build Coastguard Worker     }
127*15dc779aSAndroid Build Coastguard Worker   } else if (pstr_pvc_bs_data->div_mode <= 3) {
128*15dc779aSAndroid Build Coastguard Worker     /* Do nothing */
129*15dc779aSAndroid Build Coastguard Worker   } else {
130*15dc779aSAndroid Build Coastguard Worker     WORD32 gi, is_grid_info;
131*15dc779aSAndroid Build Coastguard Worker     for (gi = 0; gi < pstr_pvc_bs_data->num_grid_info; gi++) {
132*15dc779aSAndroid Build Coastguard Worker       if (gi == 0 && 1 == usac_indep_flag) {
133*15dc779aSAndroid Build Coastguard Worker         is_grid_info = 1;
134*15dc779aSAndroid Build Coastguard Worker       } else {
135*15dc779aSAndroid Build Coastguard Worker         is_grid_info = pstr_pvc_bs_data->grid_info[gi];
136*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
137*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, is_grid_info, IXHEAACE_ESBR_PVC_GRID_INFO_BITS);
138*15dc779aSAndroid Build Coastguard Worker       }
139*15dc779aSAndroid Build Coastguard Worker       if (is_grid_info) {
140*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_pvc_bs_data->pvc_id_bs[gi],
141*15dc779aSAndroid Build Coastguard Worker                                                 IXHEAACE_ESBR_PVC_ID_BITS);
142*15dc779aSAndroid Build Coastguard Worker       }
143*15dc779aSAndroid Build Coastguard Worker     }
144*15dc779aSAndroid Build Coastguard Worker   }
145*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
146*15dc779aSAndroid Build Coastguard Worker }
ia_enhaacplus_enc_ceil_ln2(WORD32 x)147*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_ceil_ln2(WORD32 x) {
148*15dc779aSAndroid Build Coastguard Worker   WORD32 tmp = -1;
149*15dc779aSAndroid Build Coastguard Worker 
150*15dc779aSAndroid Build Coastguard Worker   while (ixheaac_shl32(1, ++tmp) < x)
151*15dc779aSAndroid Build Coastguard Worker     ;
152*15dc779aSAndroid Build Coastguard Worker 
153*15dc779aSAndroid Build Coastguard Worker   return (tmp);
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_sbr_grid(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,ixheaace_bit_buf_handle pstr_bs_handle,ixheaace_sbr_codec_type sbr_codec)156*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_encode_sbr_grid(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,
157*15dc779aSAndroid Build Coastguard Worker                                        ixheaace_bit_buf_handle pstr_bs_handle,
158*15dc779aSAndroid Build Coastguard Worker                                        ixheaace_sbr_codec_type sbr_codec) {
159*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
160*15dc779aSAndroid Build Coastguard Worker   WORD32 i, tmp_var;
161*15dc779aSAndroid Build Coastguard Worker 
162*15dc779aSAndroid Build Coastguard Worker   if (ELD_SBR != sbr_codec) {
163*15dc779aSAndroid Build Coastguard Worker     if (HEAAC_SBR == sbr_codec ||
164*15dc779aSAndroid Build Coastguard Worker         (USAC_SBR == sbr_codec && pstr_sbr_env_info->sbr_pvc_mode == 0)) {
165*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
166*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->frame_type, SBR_CLA_BITS);
167*15dc779aSAndroid Build Coastguard Worker 
168*15dc779aSAndroid Build Coastguard Worker       switch (pstr_sbr_env_info->pstr_sbr_bs_grid->frame_type) {
169*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_FIXFIX:
170*15dc779aSAndroid Build Coastguard Worker 
171*15dc779aSAndroid Build Coastguard Worker           tmp_var = ia_enhaacplus_enc_ceil_ln2(pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_env);
172*15dc779aSAndroid Build Coastguard Worker 
173*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_ENV_BITS);
174*15dc779aSAndroid Build Coastguard Worker 
175*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
176*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->freq_res_fix, SBR_RES_BITS);
177*15dc779aSAndroid Build Coastguard Worker           break;
178*15dc779aSAndroid Build Coastguard Worker 
179*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_FIXVAR:
180*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_VARFIX:
181*15dc779aSAndroid Build Coastguard Worker 
182*15dc779aSAndroid Build Coastguard Worker           if (pstr_sbr_env_info->pstr_sbr_bs_grid->frame_type == IXHEAACE_FIXVAR) {
183*15dc779aSAndroid Build Coastguard Worker             tmp_var = pstr_sbr_env_info->pstr_sbr_bs_grid->bs_abs_bord - 16;
184*15dc779aSAndroid Build Coastguard Worker           } else {
185*15dc779aSAndroid Build Coastguard Worker             tmp_var = pstr_sbr_env_info->pstr_sbr_bs_grid->bs_abs_bord;
186*15dc779aSAndroid Build Coastguard Worker           }
187*15dc779aSAndroid Build Coastguard Worker 
188*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_ABS_BITS);
189*15dc779aSAndroid Build Coastguard Worker 
190*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
191*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->n, SBR_NUM_BITS);
192*15dc779aSAndroid Build Coastguard Worker 
193*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < pstr_sbr_env_info->pstr_sbr_bs_grid->n; i++) {
194*15dc779aSAndroid Build Coastguard Worker             tmp_var = (pstr_sbr_env_info->pstr_sbr_bs_grid->bs_rel_bord[i] - 2) >> 1;
195*15dc779aSAndroid Build Coastguard Worker 
196*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_REL_BITS);
197*15dc779aSAndroid Build Coastguard Worker           }
198*15dc779aSAndroid Build Coastguard Worker 
199*15dc779aSAndroid Build Coastguard Worker           tmp_var = ia_enhaacplus_enc_ceil_ln2(pstr_sbr_env_info->pstr_sbr_bs_grid->n + 2);
200*15dc779aSAndroid Build Coastguard Worker 
201*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
202*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->p, (UWORD8)tmp_var);
203*15dc779aSAndroid Build Coastguard Worker 
204*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < pstr_sbr_env_info->pstr_sbr_bs_grid->n + 1; i++) {
205*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(
206*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->v_f[i], SBR_RES_BITS);
207*15dc779aSAndroid Build Coastguard Worker           }
208*15dc779aSAndroid Build Coastguard Worker           break;
209*15dc779aSAndroid Build Coastguard Worker 
210*15dc779aSAndroid Build Coastguard Worker         case IXHEAACE_VARVAR:
211*15dc779aSAndroid Build Coastguard Worker 
212*15dc779aSAndroid Build Coastguard Worker           tmp_var = pstr_sbr_env_info->pstr_sbr_bs_grid->bs_abs_bord_0;
213*15dc779aSAndroid Build Coastguard Worker 
214*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_ABS_BITS);
215*15dc779aSAndroid Build Coastguard Worker           tmp_var = pstr_sbr_env_info->pstr_sbr_bs_grid->bs_abs_bord_1 - 16;
216*15dc779aSAndroid Build Coastguard Worker 
217*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_ABS_BITS);
218*15dc779aSAndroid Build Coastguard Worker 
219*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
220*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_0, SBR_NUM_BITS);
221*15dc779aSAndroid Build Coastguard Worker 
222*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
223*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_1, SBR_NUM_BITS);
224*15dc779aSAndroid Build Coastguard Worker 
225*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_0; i++) {
226*15dc779aSAndroid Build Coastguard Worker             tmp_var = (pstr_sbr_env_info->pstr_sbr_bs_grid->bs_rel_bord_0[i] - 2) >> 1;
227*15dc779aSAndroid Build Coastguard Worker 
228*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_REL_BITS);
229*15dc779aSAndroid Build Coastguard Worker           }
230*15dc779aSAndroid Build Coastguard Worker 
231*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_1; i++) {
232*15dc779aSAndroid Build Coastguard Worker             tmp_var = (pstr_sbr_env_info->pstr_sbr_bs_grid->bs_rel_bord_1[i] - 2) >> 1;
233*15dc779aSAndroid Build Coastguard Worker 
234*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_REL_BITS);
235*15dc779aSAndroid Build Coastguard Worker           }
236*15dc779aSAndroid Build Coastguard Worker 
237*15dc779aSAndroid Build Coastguard Worker           tmp_var =
238*15dc779aSAndroid Build Coastguard Worker               ia_enhaacplus_enc_ceil_ln2(pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_0 +
239*15dc779aSAndroid Build Coastguard Worker                                          pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_1 + 2);
240*15dc779aSAndroid Build Coastguard Worker 
241*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
242*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->p, (UWORD8)tmp_var);
243*15dc779aSAndroid Build Coastguard Worker 
244*15dc779aSAndroid Build Coastguard Worker           tmp_var = pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_0 +
245*15dc779aSAndroid Build Coastguard Worker                     pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_rel_1 + 1;
246*15dc779aSAndroid Build Coastguard Worker 
247*15dc779aSAndroid Build Coastguard Worker           for (i = 0; i < tmp_var; i++) {
248*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(
249*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->v_f_lr[i], SBR_RES_BITS);
250*15dc779aSAndroid Build Coastguard Worker           }
251*15dc779aSAndroid Build Coastguard Worker           break;
252*15dc779aSAndroid Build Coastguard Worker         default:
253*15dc779aSAndroid Build Coastguard Worker           break;
254*15dc779aSAndroid Build Coastguard Worker       }
255*15dc779aSAndroid Build Coastguard Worker     } else {
256*15dc779aSAndroid Build Coastguard Worker       // If PVC mode is non-zero, bit stream parameters are updated here
257*15dc779aSAndroid Build Coastguard Worker       if (pstr_sbr_env_info->no_of_envelopes > 1) {
258*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 8, SBR_PVC_NOISE_POSITION_BITS);
259*15dc779aSAndroid Build Coastguard Worker       } else {
260*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, SBR_PVC_NOISE_POSITION_BITS);
261*15dc779aSAndroid Build Coastguard Worker       }
262*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, SBR_PVC_VAR_LEN_HF_BITS);
263*15dc779aSAndroid Build Coastguard Worker     }
264*15dc779aSAndroid Build Coastguard Worker   } else {
265*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(
266*15dc779aSAndroid Build Coastguard Worker         pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->frame_type, LDSBR_CLA_BITS);
267*15dc779aSAndroid Build Coastguard Worker 
268*15dc779aSAndroid Build Coastguard Worker     switch (pstr_sbr_env_info->pstr_sbr_bs_grid->frame_type) {
269*15dc779aSAndroid Build Coastguard Worker       case IXHEAACE_FIXFIX:
270*15dc779aSAndroid Build Coastguard Worker         tmp_var = ia_enhaacplus_enc_ceil_ln2(pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_env);
271*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, tmp_var, SBR_ENV_BITS);
272*15dc779aSAndroid Build Coastguard Worker         if (pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_env == 1) {
273*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
274*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->curr_sbr_amp_res, SI_SBR_AMP_RES_BITS);
275*15dc779aSAndroid Build Coastguard Worker         }
276*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(
277*15dc779aSAndroid Build Coastguard Worker             pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->v_f[0], SBR_RES_BITS);
278*15dc779aSAndroid Build Coastguard Worker         break;
279*15dc779aSAndroid Build Coastguard Worker 
280*15dc779aSAndroid Build Coastguard Worker       case IXHEAACE_LD_TRAN:
281*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(
282*15dc779aSAndroid Build Coastguard Worker             pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->bs_transient_position,
283*15dc779aSAndroid Build Coastguard Worker             IXHEAACE_SBR_TRAN_BITS);
284*15dc779aSAndroid Build Coastguard Worker         for (i = 0; i < pstr_sbr_env_info->pstr_sbr_bs_grid->bs_num_env; i++) {
285*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
286*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->pstr_sbr_bs_grid->v_f[i], SBR_RES_BITS);
287*15dc779aSAndroid Build Coastguard Worker         }
288*15dc779aSAndroid Build Coastguard Worker         break;
289*15dc779aSAndroid Build Coastguard Worker       default:
290*15dc779aSAndroid Build Coastguard Worker         break;
291*15dc779aSAndroid Build Coastguard Worker     }
292*15dc779aSAndroid Build Coastguard Worker   }
293*15dc779aSAndroid Build Coastguard Worker 
294*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
295*15dc779aSAndroid Build Coastguard Worker }
296*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_sbr_dtdf(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,ixheaace_bit_buf_handle pstr_bs_handle,ixheaace_sbr_codec_type sbr_codec,WORD32 usac_indep_flag,WORD32 sbr_pvc_mode)297*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_encode_sbr_dtdf(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,
298*15dc779aSAndroid Build Coastguard Worker                                        ixheaace_bit_buf_handle pstr_bs_handle,
299*15dc779aSAndroid Build Coastguard Worker                                        ixheaace_sbr_codec_type sbr_codec, WORD32 usac_indep_flag,
300*15dc779aSAndroid Build Coastguard Worker                                        WORD32 sbr_pvc_mode) {
301*15dc779aSAndroid Build Coastguard Worker   WORD32 i, payload_cnt_bits = 0, num_of_noise_env;
302*15dc779aSAndroid Build Coastguard Worker 
303*15dc779aSAndroid Build Coastguard Worker   num_of_noise_env = (pstr_sbr_env_info->no_of_envelopes > 1) ? 2 : 1;
304*15dc779aSAndroid Build Coastguard Worker 
305*15dc779aSAndroid Build Coastguard Worker   if (USAC_SBR != sbr_codec) {
306*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sbr_env_info->no_of_envelopes; ++i) {
307*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
308*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->domain_vec[i], SBR_DIR_BITS);
309*15dc779aSAndroid Build Coastguard Worker     }
310*15dc779aSAndroid Build Coastguard Worker   }
311*15dc779aSAndroid Build Coastguard Worker 
312*15dc779aSAndroid Build Coastguard Worker   else {
313*15dc779aSAndroid Build Coastguard Worker     if (sbr_pvc_mode == 0) {
314*15dc779aSAndroid Build Coastguard Worker       WORD32 start_env = 0;
315*15dc779aSAndroid Build Coastguard Worker       if (1 == usac_indep_flag) {
316*15dc779aSAndroid Build Coastguard Worker         start_env = 1;
317*15dc779aSAndroid Build Coastguard Worker       }
318*15dc779aSAndroid Build Coastguard Worker       for (i = start_env; i < pstr_sbr_env_info->no_of_envelopes; ++i) {
319*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
320*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->domain_vec[i], SBR_DIR_BITS);
321*15dc779aSAndroid Build Coastguard Worker       }
322*15dc779aSAndroid Build Coastguard Worker     } else {
323*15dc779aSAndroid Build Coastguard Worker       /* Do nothing */
324*15dc779aSAndroid Build Coastguard Worker     }
325*15dc779aSAndroid Build Coastguard Worker   }
326*15dc779aSAndroid Build Coastguard Worker   if (USAC_SBR != sbr_codec) {
327*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < num_of_noise_env; ++i) {
328*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
329*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_info->domain_vec_noise[i], SBR_DIR_BITS);
330*15dc779aSAndroid Build Coastguard Worker     }
331*15dc779aSAndroid Build Coastguard Worker   } else {
332*15dc779aSAndroid Build Coastguard Worker     WORD32 start_env = 0;
333*15dc779aSAndroid Build Coastguard Worker     if (1 == usac_indep_flag) {
334*15dc779aSAndroid Build Coastguard Worker       start_env = 1;
335*15dc779aSAndroid Build Coastguard Worker     }
336*15dc779aSAndroid Build Coastguard Worker 
337*15dc779aSAndroid Build Coastguard Worker     for (i = start_env; i < num_of_noise_env; ++i) {
338*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
339*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_info->domain_vec_noise[i], SBR_DIR_BITS);
340*15dc779aSAndroid Build Coastguard Worker     }
341*15dc779aSAndroid Build Coastguard Worker   }
342*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
343*15dc779aSAndroid Build Coastguard Worker }
344*15dc779aSAndroid Build Coastguard Worker 
ixheaace_write_noise_lvl_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,ixheaace_bit_buf_handle pstr_bs_handle,WORD32 coupling)345*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_write_noise_lvl_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,
346*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_bit_buf_handle pstr_bs_handle,
347*15dc779aSAndroid Build Coastguard Worker                                             WORD32 coupling) {
348*15dc779aSAndroid Build Coastguard Worker   WORD32 j, i, payload_cnt_bits = 0;
349*15dc779aSAndroid Build Coastguard Worker   WORD32 n_noise_envelopes = ((pstr_sbr_env_info->no_of_envelopes > 1) ? 2 : 1);
350*15dc779aSAndroid Build Coastguard Worker 
351*15dc779aSAndroid Build Coastguard Worker   for (i = 0; i < n_noise_envelopes; i++) {
352*15dc779aSAndroid Build Coastguard Worker     switch (pstr_sbr_env_info->domain_vec_noise[i]) {
353*15dc779aSAndroid Build Coastguard Worker       case FREQ:
354*15dc779aSAndroid Build Coastguard Worker 
355*15dc779aSAndroid Build Coastguard Worker         if (coupling && pstr_sbr_env_info->balance) {
356*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
357*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle,
358*15dc779aSAndroid Build Coastguard Worker               pstr_sbr_env_info->noise_level[i * pstr_sbr_env_info->noise_band_count],
359*15dc779aSAndroid Build Coastguard Worker               (UWORD8)pstr_sbr_env_info->si_sbr_start_noise_bits_balance);
360*15dc779aSAndroid Build Coastguard Worker         } else {
361*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(
362*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle,
363*15dc779aSAndroid Build Coastguard Worker               pstr_sbr_env_info->noise_level[i * pstr_sbr_env_info->noise_band_count],
364*15dc779aSAndroid Build Coastguard Worker               (UWORD8)pstr_sbr_env_info->si_sbr_start_noise_bits);
365*15dc779aSAndroid Build Coastguard Worker         }
366*15dc779aSAndroid Build Coastguard Worker 
367*15dc779aSAndroid Build Coastguard Worker         for (j = 1 + i * pstr_sbr_env_info->noise_band_count;
368*15dc779aSAndroid Build Coastguard Worker              j < (pstr_sbr_env_info->noise_band_count * (1 + i)); j++) {
369*15dc779aSAndroid Build Coastguard Worker           if (coupling) {
370*15dc779aSAndroid Build Coastguard Worker             if (pstr_sbr_env_info->balance) {
371*15dc779aSAndroid Build Coastguard Worker               payload_cnt_bits += ixheaace_write_bits(
372*15dc779aSAndroid Build Coastguard Worker                   pstr_bs_handle,
373*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
374*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_bal_freq_c[pstr_sbr_env_info->noise_level[j] +
375*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV_BALANCE11],
376*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
377*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_bal_freq_l[pstr_sbr_env_info->noise_level[j] +
378*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV_BALANCE11]);
379*15dc779aSAndroid Build Coastguard Worker             } else {
380*15dc779aSAndroid Build Coastguard Worker               payload_cnt_bits += ixheaace_write_bits(
381*15dc779aSAndroid Build Coastguard Worker                   pstr_bs_handle,
382*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
383*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_lvl_freq_c[pstr_sbr_env_info->noise_level[j] +
384*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV11],
385*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
386*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_lvl_freq_l[pstr_sbr_env_info->noise_level[j] +
387*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV11]);
388*15dc779aSAndroid Build Coastguard Worker             }
389*15dc779aSAndroid Build Coastguard Worker           } else {
390*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(
391*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle,
392*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info->ptr_huff_tab_noise_freq_c[pstr_sbr_env_info->noise_level[j] +
393*15dc779aSAndroid Build Coastguard Worker                                                              CODE_BCK_SCF_LAV11],
394*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info->ptr_huff_tab_noise_freq_l[pstr_sbr_env_info->noise_level[j] +
395*15dc779aSAndroid Build Coastguard Worker                                                              CODE_BCK_SCF_LAV11]);
396*15dc779aSAndroid Build Coastguard Worker           }
397*15dc779aSAndroid Build Coastguard Worker         }
398*15dc779aSAndroid Build Coastguard Worker         break;
399*15dc779aSAndroid Build Coastguard Worker 
400*15dc779aSAndroid Build Coastguard Worker       case TIME:
401*15dc779aSAndroid Build Coastguard Worker         for (j = i * pstr_sbr_env_info->noise_band_count;
402*15dc779aSAndroid Build Coastguard Worker              j < (pstr_sbr_env_info->noise_band_count * (1 + i)); j++) {
403*15dc779aSAndroid Build Coastguard Worker           if (coupling) {
404*15dc779aSAndroid Build Coastguard Worker             if (pstr_sbr_env_info->balance) {
405*15dc779aSAndroid Build Coastguard Worker               payload_cnt_bits += ixheaace_write_bits(
406*15dc779aSAndroid Build Coastguard Worker                   pstr_bs_handle,
407*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
408*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_bal_time_c[pstr_sbr_env_info->noise_level[j] +
409*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV_BALANCE11],
410*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
411*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_bal_time_l[pstr_sbr_env_info->noise_level[j] +
412*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV_BALANCE11]);
413*15dc779aSAndroid Build Coastguard Worker             } else {
414*15dc779aSAndroid Build Coastguard Worker               payload_cnt_bits += ixheaace_write_bits(
415*15dc779aSAndroid Build Coastguard Worker                   pstr_bs_handle,
416*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
417*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_lvl_time_c[pstr_sbr_env_info->noise_level[j] +
418*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV11],
419*15dc779aSAndroid Build Coastguard Worker                   pstr_sbr_env_info
420*15dc779aSAndroid Build Coastguard Worker                       ->ptr_huff_tab_noise_lvl_time_l[pstr_sbr_env_info->noise_level[j] +
421*15dc779aSAndroid Build Coastguard Worker                                                       CODE_BCK_SCF_LAV11]);
422*15dc779aSAndroid Build Coastguard Worker             }
423*15dc779aSAndroid Build Coastguard Worker           } else {
424*15dc779aSAndroid Build Coastguard Worker             payload_cnt_bits += ixheaace_write_bits(
425*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle,
426*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
427*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_noise_lvl_time_c[pstr_sbr_env_info->noise_level[j] +
428*15dc779aSAndroid Build Coastguard Worker                                                     CODE_BCK_SCF_LAV11],
429*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
430*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_noise_lvl_time_l[pstr_sbr_env_info->noise_level[j] +
431*15dc779aSAndroid Build Coastguard Worker                                                     CODE_BCK_SCF_LAV11]);
432*15dc779aSAndroid Build Coastguard Worker           }
433*15dc779aSAndroid Build Coastguard Worker         }
434*15dc779aSAndroid Build Coastguard Worker         break;
435*15dc779aSAndroid Build Coastguard Worker     }
436*15dc779aSAndroid Build Coastguard Worker   }
437*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
438*15dc779aSAndroid Build Coastguard Worker }
439*15dc779aSAndroid Build Coastguard Worker 
ixheaace_write_env_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,ixheaace_bit_buf_handle pstr_bs_handle,WORD32 coupling,ixheaace_sbr_codec_type sbr_codec,WORD32 * ptr_payload_cnt_bits)440*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_write_env_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,
441*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_bit_buf_handle pstr_bs_handle,
442*15dc779aSAndroid Build Coastguard Worker                                             WORD32 coupling, ixheaace_sbr_codec_type sbr_codec,
443*15dc779aSAndroid Build Coastguard Worker                                             WORD32 *ptr_payload_cnt_bits) {
444*15dc779aSAndroid Build Coastguard Worker   WORD32 j, i, delta;
445*15dc779aSAndroid Build Coastguard Worker 
446*15dc779aSAndroid Build Coastguard Worker   *ptr_payload_cnt_bits = 0;
447*15dc779aSAndroid Build Coastguard Worker 
448*15dc779aSAndroid Build Coastguard Worker   for (j = 0; j < pstr_sbr_env_info->no_of_envelopes; j++) {
449*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_env_info->domain_vec[j] == FREQ) {
450*15dc779aSAndroid Build Coastguard Worker       if (coupling && pstr_sbr_env_info->balance) {
451*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_cnt_bits +=
452*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->ienvelope[j][0],
453*15dc779aSAndroid Build Coastguard Worker                                 (UWORD8)pstr_sbr_env_info->si_sbr_start_env_bits_balance);
454*15dc779aSAndroid Build Coastguard Worker       } else {
455*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_cnt_bits +=
456*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->ienvelope[j][0],
457*15dc779aSAndroid Build Coastguard Worker                                 (UWORD8)pstr_sbr_env_info->si_sbr_start_env_bits);
458*15dc779aSAndroid Build Coastguard Worker       }
459*15dc779aSAndroid Build Coastguard Worker     }
460*15dc779aSAndroid Build Coastguard Worker 
461*15dc779aSAndroid Build Coastguard Worker     for (i = 1 - pstr_sbr_env_info->domain_vec[j]; i < pstr_sbr_env_info->no_scf_bands[j]; i++) {
462*15dc779aSAndroid Build Coastguard Worker       delta = pstr_sbr_env_info->ienvelope[j][i];
463*15dc779aSAndroid Build Coastguard Worker 
464*15dc779aSAndroid Build Coastguard Worker       if (coupling && pstr_sbr_env_info->balance) {
465*15dc779aSAndroid Build Coastguard Worker         if (abs(delta) > pstr_sbr_env_info->code_book_scf_lav_balance) {
466*15dc779aSAndroid Build Coastguard Worker           return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_CODEBOOK;
467*15dc779aSAndroid Build Coastguard Worker         }
468*15dc779aSAndroid Build Coastguard Worker       } else {
469*15dc779aSAndroid Build Coastguard Worker         if (abs(delta) > pstr_sbr_env_info->code_book_scf_lav) {
470*15dc779aSAndroid Build Coastguard Worker           return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_CODEBOOK;
471*15dc779aSAndroid Build Coastguard Worker         }
472*15dc779aSAndroid Build Coastguard Worker       }
473*15dc779aSAndroid Build Coastguard Worker 
474*15dc779aSAndroid Build Coastguard Worker       if (coupling) {
475*15dc779aSAndroid Build Coastguard Worker         if (pstr_sbr_env_info->balance) {
476*15dc779aSAndroid Build Coastguard Worker           if (pstr_sbr_env_info->domain_vec[j]) {
477*15dc779aSAndroid Build Coastguard Worker             *ptr_payload_cnt_bits += ixheaace_write_bits(
478*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle,
479*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
480*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_bal_time_c[delta +
481*15dc779aSAndroid Build Coastguard Worker                                               pstr_sbr_env_info->code_book_scf_lav_balance],
482*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
483*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_bal_time_l[delta +
484*15dc779aSAndroid Build Coastguard Worker                                               pstr_sbr_env_info->code_book_scf_lav_balance]);
485*15dc779aSAndroid Build Coastguard Worker           } else {
486*15dc779aSAndroid Build Coastguard Worker             *ptr_payload_cnt_bits += ixheaace_write_bits(
487*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle,
488*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
489*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_bal_freq_c[delta +
490*15dc779aSAndroid Build Coastguard Worker                                               pstr_sbr_env_info->code_book_scf_lav_balance],
491*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
492*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_bal_freq_l[delta +
493*15dc779aSAndroid Build Coastguard Worker                                               pstr_sbr_env_info->code_book_scf_lav_balance]);
494*15dc779aSAndroid Build Coastguard Worker           }
495*15dc779aSAndroid Build Coastguard Worker         } else {
496*15dc779aSAndroid Build Coastguard Worker           if (pstr_sbr_env_info->domain_vec[j]) {
497*15dc779aSAndroid Build Coastguard Worker             *ptr_payload_cnt_bits += ixheaace_write_bits(
498*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle,
499*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
500*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_lvl_time_c[delta + pstr_sbr_env_info->code_book_scf_lav],
501*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
502*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_lvl_time_l[delta + pstr_sbr_env_info->code_book_scf_lav]);
503*15dc779aSAndroid Build Coastguard Worker           } else {
504*15dc779aSAndroid Build Coastguard Worker             *ptr_payload_cnt_bits += ixheaace_write_bits(
505*15dc779aSAndroid Build Coastguard Worker                 pstr_bs_handle,
506*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
507*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_lvl_freq_c[delta + pstr_sbr_env_info->code_book_scf_lav],
508*15dc779aSAndroid Build Coastguard Worker                 pstr_sbr_env_info
509*15dc779aSAndroid Build Coastguard Worker                     ->ptr_huff_tab_lvl_freq_l[delta + pstr_sbr_env_info->code_book_scf_lav]);
510*15dc779aSAndroid Build Coastguard Worker           }
511*15dc779aSAndroid Build Coastguard Worker         }
512*15dc779aSAndroid Build Coastguard Worker       } else {
513*15dc779aSAndroid Build Coastguard Worker         if (pstr_sbr_env_info->domain_vec[j]) {
514*15dc779aSAndroid Build Coastguard Worker           *ptr_payload_cnt_bits += ixheaace_write_bits(
515*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle,
516*15dc779aSAndroid Build Coastguard Worker               pstr_sbr_env_info
517*15dc779aSAndroid Build Coastguard Worker                   ->ptr_huff_tab_time_c[delta + pstr_sbr_env_info->code_book_scf_lav],
518*15dc779aSAndroid Build Coastguard Worker               pstr_sbr_env_info
519*15dc779aSAndroid Build Coastguard Worker                   ->ptr_huff_tab_time_l[delta + pstr_sbr_env_info->code_book_scf_lav]);
520*15dc779aSAndroid Build Coastguard Worker         } else {
521*15dc779aSAndroid Build Coastguard Worker           *ptr_payload_cnt_bits += ixheaace_write_bits(
522*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle,
523*15dc779aSAndroid Build Coastguard Worker               pstr_sbr_env_info
524*15dc779aSAndroid Build Coastguard Worker                   ->ptr_huff_tab_freq_c[delta + pstr_sbr_env_info->code_book_scf_lav],
525*15dc779aSAndroid Build Coastguard Worker               pstr_sbr_env_info
526*15dc779aSAndroid Build Coastguard Worker                   ->ptr_huff_tab_freq_l[delta + pstr_sbr_env_info->code_book_scf_lav]);
527*15dc779aSAndroid Build Coastguard Worker         }
528*15dc779aSAndroid Build Coastguard Worker       }
529*15dc779aSAndroid Build Coastguard Worker     }
530*15dc779aSAndroid Build Coastguard Worker     if (USAC_SBR == sbr_codec) {
531*15dc779aSAndroid Build Coastguard Worker       if (1 == pstr_sbr_env_info->sbr_inter_tes) {
532*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_cnt_bits +=
533*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->ptr_sbr_inter_tes_shape[j],
534*15dc779aSAndroid Build Coastguard Worker                                 IXHEAACE_SBR_TES_SHAPE_BITS);
535*15dc779aSAndroid Build Coastguard Worker         if (1 == pstr_sbr_env_info->ptr_sbr_inter_tes_shape[j]) {
536*15dc779aSAndroid Build Coastguard Worker           *ptr_payload_cnt_bits += ixheaace_write_bits(
537*15dc779aSAndroid Build Coastguard Worker               pstr_bs_handle, pstr_sbr_env_info->ptr_sbr_inter_tes_shape_mode[j],
538*15dc779aSAndroid Build Coastguard Worker               IXHEAACE_SBR_TES_SHAPE_MODE_BITS);
539*15dc779aSAndroid Build Coastguard Worker         }
540*15dc779aSAndroid Build Coastguard Worker       }
541*15dc779aSAndroid Build Coastguard Worker     }
542*15dc779aSAndroid Build Coastguard Worker   }
543*15dc779aSAndroid Build Coastguard Worker 
544*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
545*15dc779aSAndroid Build Coastguard Worker }
546*15dc779aSAndroid Build Coastguard Worker 
ixheaace_write_synthetic_coding_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,ixheaace_bit_buf_handle pstr_bs_handle,ixheaace_sbr_codec_type sbr_codec,WORD32 sbr_pvc_mode)547*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_write_synthetic_coding_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,
548*15dc779aSAndroid Build Coastguard Worker                                                    ixheaace_bit_buf_handle pstr_bs_handle,
549*15dc779aSAndroid Build Coastguard Worker                                                    ixheaace_sbr_codec_type sbr_codec,
550*15dc779aSAndroid Build Coastguard Worker                                                    WORD32 sbr_pvc_mode)
551*15dc779aSAndroid Build Coastguard Worker 
552*15dc779aSAndroid Build Coastguard Worker {
553*15dc779aSAndroid Build Coastguard Worker   WORD32 i;
554*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
555*15dc779aSAndroid Build Coastguard Worker 
556*15dc779aSAndroid Build Coastguard Worker   payload_cnt_bits +=
557*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->add_harmonic_flag, 1);
558*15dc779aSAndroid Build Coastguard Worker 
559*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_env_info->add_harmonic_flag) {
560*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sbr_env_info->no_harmonics; i++) {
561*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
562*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->add_harmonic[i], 1);
563*15dc779aSAndroid Build Coastguard Worker     }
564*15dc779aSAndroid Build Coastguard Worker     if (USAC_SBR == sbr_codec && 0 != sbr_pvc_mode) {
565*15dc779aSAndroid Build Coastguard Worker       if (pstr_sbr_env_info->sbr_sinusoidal_pos_flag) {
566*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 1, 1);
567*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 31, 5);
568*15dc779aSAndroid Build Coastguard Worker       } else {
569*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, 1);
570*15dc779aSAndroid Build Coastguard Worker       }
571*15dc779aSAndroid Build Coastguard Worker     }
572*15dc779aSAndroid Build Coastguard Worker   }
573*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
574*15dc779aSAndroid Build Coastguard Worker }
575*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_sbr_single_channel_element(ixheaace_pstr_sbr_env_data pstr_sbr_env_info,ixheaace_bit_buf_handle pstr_bs_handle,ixheaace_sbr_codec_type sbr_codec,WORD32 * ptr_num_bits)576*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_encode_sbr_single_channel_element(
577*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_info, ixheaace_bit_buf_handle pstr_bs_handle,
578*15dc779aSAndroid Build Coastguard Worker     ixheaace_sbr_codec_type sbr_codec, WORD32 *ptr_num_bits)
579*15dc779aSAndroid Build Coastguard Worker 
580*15dc779aSAndroid Build Coastguard Worker {
581*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
582*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
583*15dc779aSAndroid Build Coastguard Worker 
584*15dc779aSAndroid Build Coastguard Worker   if (sbr_codec != USAC_SBR) {
585*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, 1);
586*15dc779aSAndroid Build Coastguard Worker   } else {
587*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_env_info->harmonic_sbr) {
588*15dc779aSAndroid Build Coastguard Worker       // USAC Harmonic SBR data
589*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
590*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->sbr_patching_mode, 1);
591*15dc779aSAndroid Build Coastguard Worker       if (0 == pstr_sbr_env_info->sbr_patching_mode) {
592*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
593*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->sbr_oversampling_flag, 1);
594*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
595*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->sbr_pitchin_bins_flag, 1);
596*15dc779aSAndroid Build Coastguard Worker         if (0 != pstr_sbr_env_info->sbr_pitchin_bins_flag) {
597*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
598*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_info->sbr_pitchin_bins, 7);
599*15dc779aSAndroid Build Coastguard Worker         }
600*15dc779aSAndroid Build Coastguard Worker       }
601*15dc779aSAndroid Build Coastguard Worker     }
602*15dc779aSAndroid Build Coastguard Worker   }
603*15dc779aSAndroid Build Coastguard Worker   payload_cnt_bits += ixheaace_encode_sbr_grid(pstr_sbr_env_info, pstr_bs_handle, sbr_codec);
604*15dc779aSAndroid Build Coastguard Worker   if (sbr_codec == USAC_SBR) {
605*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_encode_sbr_dtdf(pstr_sbr_env_info, pstr_bs_handle, sbr_codec,
606*15dc779aSAndroid Build Coastguard Worker                                                  pstr_sbr_env_info->usac_indep_flag,
607*15dc779aSAndroid Build Coastguard Worker                                                  pstr_sbr_env_info->sbr_pvc_mode);
608*15dc779aSAndroid Build Coastguard Worker   } else {
609*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
610*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_dtdf(pstr_sbr_env_info, pstr_bs_handle, sbr_codec, 0, 0);
611*15dc779aSAndroid Build Coastguard Worker   }
612*15dc779aSAndroid Build Coastguard Worker 
613*15dc779aSAndroid Build Coastguard Worker   {
614*15dc779aSAndroid Build Coastguard Worker     WORD32 i;
615*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sbr_env_info->noise_band_count; i++) {
616*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
617*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_info->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS);
618*15dc779aSAndroid Build Coastguard Worker     }
619*15dc779aSAndroid Build Coastguard Worker   }
620*15dc779aSAndroid Build Coastguard Worker   if (sbr_codec != USAC_SBR) {
621*15dc779aSAndroid Build Coastguard Worker     WORD32 env_data_len;
622*15dc779aSAndroid Build Coastguard Worker     err_code =
623*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_env_data(pstr_sbr_env_info, pstr_bs_handle, 0, sbr_codec, &env_data_len);
624*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
625*15dc779aSAndroid Build Coastguard Worker       *ptr_num_bits = payload_cnt_bits;
626*15dc779aSAndroid Build Coastguard Worker       return err_code;
627*15dc779aSAndroid Build Coastguard Worker     }
628*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += env_data_len;
629*15dc779aSAndroid Build Coastguard Worker   } else {
630*15dc779aSAndroid Build Coastguard Worker     if (0 == pstr_sbr_env_info->sbr_pvc_mode) {
631*15dc779aSAndroid Build Coastguard Worker       WORD32 env_data_len;
632*15dc779aSAndroid Build Coastguard Worker       err_code =
633*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_env_data(pstr_sbr_env_info, pstr_bs_handle, 0, sbr_codec, &env_data_len);
634*15dc779aSAndroid Build Coastguard Worker       if (err_code) {
635*15dc779aSAndroid Build Coastguard Worker         *ptr_num_bits = payload_cnt_bits;
636*15dc779aSAndroid Build Coastguard Worker         return err_code;
637*15dc779aSAndroid Build Coastguard Worker       }
638*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += env_data_len;
639*15dc779aSAndroid Build Coastguard Worker     } else {
640*15dc779aSAndroid Build Coastguard Worker       // PVC envelope goes here
641*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += iusace_encode_pvc_envelope(pstr_bs_handle, &pstr_sbr_env_info->pvc_info,
642*15dc779aSAndroid Build Coastguard Worker                                                      pstr_sbr_env_info->usac_indep_flag);
643*15dc779aSAndroid Build Coastguard Worker     }
644*15dc779aSAndroid Build Coastguard Worker   }
645*15dc779aSAndroid Build Coastguard Worker   payload_cnt_bits += ixheaace_write_noise_lvl_data(pstr_sbr_env_info, pstr_bs_handle, 0);
646*15dc779aSAndroid Build Coastguard Worker 
647*15dc779aSAndroid Build Coastguard Worker   if (USAC_SBR == sbr_codec) {
648*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_synthetic_coding_data(
649*15dc779aSAndroid Build Coastguard Worker         pstr_sbr_env_info, pstr_bs_handle, sbr_codec, pstr_sbr_env_info->sbr_pvc_mode);
650*15dc779aSAndroid Build Coastguard Worker   } else {
651*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
652*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_synthetic_coding_data(pstr_sbr_env_info, pstr_bs_handle, sbr_codec, 0);
653*15dc779aSAndroid Build Coastguard Worker   }
654*15dc779aSAndroid Build Coastguard Worker 
655*15dc779aSAndroid Build Coastguard Worker   *ptr_num_bits = payload_cnt_bits;
656*15dc779aSAndroid Build Coastguard Worker   return err_code;
657*15dc779aSAndroid Build Coastguard Worker }
658*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_sbr_channel_pair_element(ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right,ixheaace_bit_buf_handle pstr_bs_handle,WORD32 coupling,ixheaace_sbr_codec_type sbr_codec,WORD32 * ptr_num_bits)659*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_encode_sbr_channel_pair_element(
660*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,
661*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right, ixheaace_bit_buf_handle pstr_bs_handle,
662*15dc779aSAndroid Build Coastguard Worker     WORD32 coupling, ixheaace_sbr_codec_type sbr_codec, WORD32 *ptr_num_bits) {
663*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
664*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
665*15dc779aSAndroid Build Coastguard Worker   WORD32 env_data_len;
666*15dc779aSAndroid Build Coastguard Worker   WORD32 i = 0;
667*15dc779aSAndroid Build Coastguard Worker 
668*15dc779aSAndroid Build Coastguard Worker   if (USAC_SBR != sbr_codec) {
669*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, 1); /* no reserved bits */
670*15dc779aSAndroid Build Coastguard Worker   }
671*15dc779aSAndroid Build Coastguard Worker 
672*15dc779aSAndroid Build Coastguard Worker   payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, coupling, SI_SBR_COUPLING_BITS);
673*15dc779aSAndroid Build Coastguard Worker 
674*15dc779aSAndroid Build Coastguard Worker   if (coupling) {
675*15dc779aSAndroid Build Coastguard Worker     if (sbr_codec == USAC_SBR && pstr_sbr_env_data_left->harmonic_sbr) {
676*15dc779aSAndroid Build Coastguard Worker       // USAC Harmonic SBR data
677*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
678*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_patching_mode, 1);
679*15dc779aSAndroid Build Coastguard Worker       if (0 == pstr_sbr_env_data_left->sbr_patching_mode) {
680*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
681*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_oversampling_flag, 1);
682*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
683*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_pitchin_bins_flag, 1);
684*15dc779aSAndroid Build Coastguard Worker         if (0 != pstr_sbr_env_data_left->sbr_pitchin_bins_flag) {
685*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
686*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_pitchin_bins, 7);
687*15dc779aSAndroid Build Coastguard Worker         }
688*15dc779aSAndroid Build Coastguard Worker       }
689*15dc779aSAndroid Build Coastguard Worker     }
690*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
691*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_grid(pstr_sbr_env_data_left, pstr_bs_handle, sbr_codec);
692*15dc779aSAndroid Build Coastguard Worker 
693*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
694*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_dtdf(pstr_sbr_env_data_left, pstr_bs_handle, sbr_codec,
695*15dc779aSAndroid Build Coastguard Worker                                  pstr_sbr_env_data_left->usac_indep_flag, 0);
696*15dc779aSAndroid Build Coastguard Worker 
697*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
698*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_dtdf(pstr_sbr_env_data_right, pstr_bs_handle, sbr_codec,
699*15dc779aSAndroid Build Coastguard Worker                                  pstr_sbr_env_data_left->usac_indep_flag, 0);
700*15dc779aSAndroid Build Coastguard Worker 
701*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sbr_env_data_left->noise_band_count; i++) {
702*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
703*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_data_left->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS);
704*15dc779aSAndroid Build Coastguard Worker     }
705*15dc779aSAndroid Build Coastguard Worker 
706*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaace_write_env_data(pstr_sbr_env_data_left, pstr_bs_handle, 1, sbr_codec,
707*15dc779aSAndroid Build Coastguard Worker                                        &env_data_len);
708*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
709*15dc779aSAndroid Build Coastguard Worker       *ptr_num_bits = payload_cnt_bits;
710*15dc779aSAndroid Build Coastguard Worker       return err_code;
711*15dc779aSAndroid Build Coastguard Worker     }
712*15dc779aSAndroid Build Coastguard Worker 
713*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += env_data_len;
714*15dc779aSAndroid Build Coastguard Worker 
715*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_noise_lvl_data(pstr_sbr_env_data_left, pstr_bs_handle, 1);
716*15dc779aSAndroid Build Coastguard Worker 
717*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaace_write_env_data(pstr_sbr_env_data_right, pstr_bs_handle, 1, sbr_codec,
718*15dc779aSAndroid Build Coastguard Worker                                        &env_data_len);
719*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
720*15dc779aSAndroid Build Coastguard Worker       *ptr_num_bits = payload_cnt_bits;
721*15dc779aSAndroid Build Coastguard Worker       return err_code;
722*15dc779aSAndroid Build Coastguard Worker     }
723*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += env_data_len;
724*15dc779aSAndroid Build Coastguard Worker 
725*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_noise_lvl_data(pstr_sbr_env_data_right, pstr_bs_handle, 1);
726*15dc779aSAndroid Build Coastguard Worker 
727*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_synthetic_coding_data(pstr_sbr_env_data_left,
728*15dc779aSAndroid Build Coastguard Worker                                                              pstr_bs_handle, sbr_codec, 0);
729*15dc779aSAndroid Build Coastguard Worker 
730*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_synthetic_coding_data(pstr_sbr_env_data_right,
731*15dc779aSAndroid Build Coastguard Worker                                                              pstr_bs_handle, sbr_codec, 0);
732*15dc779aSAndroid Build Coastguard Worker   } else {
733*15dc779aSAndroid Build Coastguard Worker     if (sbr_codec == USAC_SBR && pstr_sbr_env_data_left->harmonic_sbr) {
734*15dc779aSAndroid Build Coastguard Worker       // USAC Harmonic SBR data
735*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
736*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_patching_mode, 1);
737*15dc779aSAndroid Build Coastguard Worker       if (0 == pstr_sbr_env_data_left->sbr_patching_mode) {
738*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
739*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_oversampling_flag, 1);
740*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits +=
741*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_pitchin_bins_flag, 1);
742*15dc779aSAndroid Build Coastguard Worker         if (0 != pstr_sbr_env_data_left->sbr_pitchin_bins_flag) {
743*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
744*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_left->sbr_pitchin_bins, 7);
745*15dc779aSAndroid Build Coastguard Worker         }
746*15dc779aSAndroid Build Coastguard Worker       }
747*15dc779aSAndroid Build Coastguard Worker 
748*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
749*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_right->sbr_patching_mode, 1);
750*15dc779aSAndroid Build Coastguard Worker       if (0 == pstr_sbr_env_data_right->sbr_patching_mode) {
751*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(
752*15dc779aSAndroid Build Coastguard Worker             pstr_bs_handle, pstr_sbr_env_data_right->sbr_oversampling_flag, 1);
753*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(
754*15dc779aSAndroid Build Coastguard Worker             pstr_bs_handle, pstr_sbr_env_data_right->sbr_pitchin_bins_flag, 1);
755*15dc779aSAndroid Build Coastguard Worker         if (0 != pstr_sbr_env_data_right->sbr_pitchin_bins_flag) {
756*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
757*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_sbr_env_data_right->sbr_pitchin_bins, 7);
758*15dc779aSAndroid Build Coastguard Worker         }
759*15dc779aSAndroid Build Coastguard Worker       }
760*15dc779aSAndroid Build Coastguard Worker     }
761*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
762*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_grid(pstr_sbr_env_data_left, pstr_bs_handle, sbr_codec);
763*15dc779aSAndroid Build Coastguard Worker 
764*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
765*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_grid(pstr_sbr_env_data_right, pstr_bs_handle, sbr_codec);
766*15dc779aSAndroid Build Coastguard Worker 
767*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
768*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_dtdf(pstr_sbr_env_data_left, pstr_bs_handle, sbr_codec,
769*15dc779aSAndroid Build Coastguard Worker                                  pstr_sbr_env_data_left->usac_indep_flag, 0);
770*15dc779aSAndroid Build Coastguard Worker 
771*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
772*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_dtdf(pstr_sbr_env_data_right, pstr_bs_handle, sbr_codec,
773*15dc779aSAndroid Build Coastguard Worker                                  pstr_sbr_env_data_left->usac_indep_flag, 0);
774*15dc779aSAndroid Build Coastguard Worker 
775*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sbr_env_data_left->noise_band_count; i++) {
776*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
777*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_data_left->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS);
778*15dc779aSAndroid Build Coastguard Worker     }
779*15dc779aSAndroid Build Coastguard Worker 
780*15dc779aSAndroid Build Coastguard Worker     for (i = 0; i < pstr_sbr_env_data_right->noise_band_count; i++) {
781*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(
782*15dc779aSAndroid Build Coastguard Worker           pstr_bs_handle, pstr_sbr_env_data_right->sbr_invf_mode_vec[i], SI_SBR_INVF_MODE_BITS);
783*15dc779aSAndroid Build Coastguard Worker     }
784*15dc779aSAndroid Build Coastguard Worker 
785*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaace_write_env_data(pstr_sbr_env_data_left, pstr_bs_handle, 0, sbr_codec,
786*15dc779aSAndroid Build Coastguard Worker                                        &env_data_len);
787*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
788*15dc779aSAndroid Build Coastguard Worker       *ptr_num_bits = payload_cnt_bits;
789*15dc779aSAndroid Build Coastguard Worker       return err_code;
790*15dc779aSAndroid Build Coastguard Worker     }
791*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += env_data_len;
792*15dc779aSAndroid Build Coastguard Worker 
793*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaace_write_env_data(pstr_sbr_env_data_right, pstr_bs_handle, 0, sbr_codec,
794*15dc779aSAndroid Build Coastguard Worker                                        &env_data_len);
795*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
796*15dc779aSAndroid Build Coastguard Worker       *ptr_num_bits = payload_cnt_bits;
797*15dc779aSAndroid Build Coastguard Worker       return err_code;
798*15dc779aSAndroid Build Coastguard Worker     }
799*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += env_data_len;
800*15dc779aSAndroid Build Coastguard Worker 
801*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_noise_lvl_data(pstr_sbr_env_data_left, pstr_bs_handle, 0);
802*15dc779aSAndroid Build Coastguard Worker 
803*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_noise_lvl_data(pstr_sbr_env_data_right, pstr_bs_handle, 0);
804*15dc779aSAndroid Build Coastguard Worker 
805*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_synthetic_coding_data(pstr_sbr_env_data_left,
806*15dc779aSAndroid Build Coastguard Worker                                                              pstr_bs_handle, sbr_codec, 0);
807*15dc779aSAndroid Build Coastguard Worker 
808*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_synthetic_coding_data(pstr_sbr_env_data_right,
809*15dc779aSAndroid Build Coastguard Worker                                                              pstr_bs_handle, sbr_codec, 0);
810*15dc779aSAndroid Build Coastguard Worker   }
811*15dc779aSAndroid Build Coastguard Worker 
812*15dc779aSAndroid Build Coastguard Worker   *ptr_num_bits = payload_cnt_bits;
813*15dc779aSAndroid Build Coastguard Worker   return err_code;
814*15dc779aSAndroid Build Coastguard Worker }
815*15dc779aSAndroid Build Coastguard Worker 
iexhaace_esbr_write_bs(ixheaace_str_esbr_bs_data * pstr_esbr_bs_data,ixheaace_bit_buf_handle pstr_bs_handle)816*15dc779aSAndroid Build Coastguard Worker static WORD32 iexhaace_esbr_write_bs(ixheaace_str_esbr_bs_data *pstr_esbr_bs_data,
817*15dc779aSAndroid Build Coastguard Worker                                      ixheaace_bit_buf_handle pstr_bs_handle) {
818*15dc779aSAndroid Build Coastguard Worker   WORD32 num_bits = 0;
819*15dc779aSAndroid Build Coastguard Worker   num_bits +=
820*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bs_handle, EXTENSION_ID_ESBR_CODING, SI_SBR_EXTENSION_ID_BITS);
821*15dc779aSAndroid Build Coastguard Worker   num_bits += ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_preprocessing, 1);
822*15dc779aSAndroid Build Coastguard Worker   if (1 == pstr_esbr_bs_data->sbr_num_chan) {
823*15dc779aSAndroid Build Coastguard Worker     num_bits += ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_patching_mode[0], 1);
824*15dc779aSAndroid Build Coastguard Worker     if (pstr_esbr_bs_data->sbr_patching_mode[0] == 0) {
825*15dc779aSAndroid Build Coastguard Worker       num_bits +=
826*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_oversampling_flag[0], 1);
827*15dc779aSAndroid Build Coastguard Worker       num_bits += ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_flags[0], 1);
828*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_pitchin_flags[0] == 1) {
829*15dc779aSAndroid Build Coastguard Worker         num_bits +=
830*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_bins[0], 7);
831*15dc779aSAndroid Build Coastguard Worker       }
832*15dc779aSAndroid Build Coastguard Worker     }
833*15dc779aSAndroid Build Coastguard Worker   } else if (2 == pstr_esbr_bs_data->sbr_num_chan) {
834*15dc779aSAndroid Build Coastguard Worker     if (pstr_esbr_bs_data->sbr_coupling) {
835*15dc779aSAndroid Build Coastguard Worker       num_bits += ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_patching_mode[0], 1);
836*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_patching_mode[0] == 0) {
837*15dc779aSAndroid Build Coastguard Worker         num_bits +=
838*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_oversampling_flag[0], 1);
839*15dc779aSAndroid Build Coastguard Worker         num_bits +=
840*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_flags[0], 1);
841*15dc779aSAndroid Build Coastguard Worker         if (pstr_esbr_bs_data->sbr_pitchin_flags[0] == 1) {
842*15dc779aSAndroid Build Coastguard Worker           num_bits +=
843*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_bins[0], 7);
844*15dc779aSAndroid Build Coastguard Worker         }
845*15dc779aSAndroid Build Coastguard Worker       }
846*15dc779aSAndroid Build Coastguard Worker     } else {
847*15dc779aSAndroid Build Coastguard Worker       num_bits += ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_patching_mode[0], 1);
848*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_patching_mode[0] == 0) {
849*15dc779aSAndroid Build Coastguard Worker         num_bits +=
850*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_oversampling_flag[0], 1);
851*15dc779aSAndroid Build Coastguard Worker         num_bits +=
852*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_flags[0], 1);
853*15dc779aSAndroid Build Coastguard Worker         if (pstr_esbr_bs_data->sbr_pitchin_flags[0] == 1) {
854*15dc779aSAndroid Build Coastguard Worker           num_bits +=
855*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_bins[0], 7);
856*15dc779aSAndroid Build Coastguard Worker         } else {
857*15dc779aSAndroid Build Coastguard Worker           pstr_esbr_bs_data->sbr_patching_mode[0] = pstr_esbr_bs_data->sbr_patching_mode[0];
858*15dc779aSAndroid Build Coastguard Worker         }
859*15dc779aSAndroid Build Coastguard Worker       }
860*15dc779aSAndroid Build Coastguard Worker       num_bits += ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_patching_mode[1], 1);
861*15dc779aSAndroid Build Coastguard Worker       if (pstr_esbr_bs_data->sbr_patching_mode[1] == 0) {
862*15dc779aSAndroid Build Coastguard Worker         num_bits +=
863*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_oversampling_flag[1], 1);
864*15dc779aSAndroid Build Coastguard Worker         num_bits +=
865*15dc779aSAndroid Build Coastguard Worker             ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_flags[1], 1);
866*15dc779aSAndroid Build Coastguard Worker         if (pstr_esbr_bs_data->sbr_pitchin_flags[1] == 1) {
867*15dc779aSAndroid Build Coastguard Worker           num_bits +=
868*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, pstr_esbr_bs_data->sbr_pitchin_bins[0], 7);
869*15dc779aSAndroid Build Coastguard Worker         }
870*15dc779aSAndroid Build Coastguard Worker       }
871*15dc779aSAndroid Build Coastguard Worker     }
872*15dc779aSAndroid Build Coastguard Worker   }
873*15dc779aSAndroid Build Coastguard Worker   if (num_bits < 8) {
874*15dc779aSAndroid Build Coastguard Worker     num_bits += ixheaace_write_bits(pstr_bs_handle, 0, (UWORD8)(8 - num_bits));
875*15dc779aSAndroid Build Coastguard Worker   }
876*15dc779aSAndroid Build Coastguard Worker 
877*15dc779aSAndroid Build Coastguard Worker   return num_bits;
878*15dc779aSAndroid Build Coastguard Worker }
879*15dc779aSAndroid Build Coastguard Worker 
ixheaace_get_sbr_extended_data_size(struct ixheaace_ps_enc * pstr_ps_handle,WORD32 is_hdr_active,ixheaace_str_sbr_tabs * pstr_sbr_tab,WORD32 is_esbr,ixheaace_str_esbr_bs_data * pstr_esbr_data)880*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_get_sbr_extended_data_size(struct ixheaace_ps_enc *pstr_ps_handle,
881*15dc779aSAndroid Build Coastguard Worker                                                   WORD32 is_hdr_active,
882*15dc779aSAndroid Build Coastguard Worker                                                   ixheaace_str_sbr_tabs *pstr_sbr_tab,
883*15dc779aSAndroid Build Coastguard Worker                                                   WORD32 is_esbr,
884*15dc779aSAndroid Build Coastguard Worker                                                   ixheaace_str_esbr_bs_data *pstr_esbr_data) {
885*15dc779aSAndroid Build Coastguard Worker   WORD32 ext_data_bits = 0;
886*15dc779aSAndroid Build Coastguard Worker 
887*15dc779aSAndroid Build Coastguard Worker   if (pstr_ps_handle) {
888*15dc779aSAndroid Build Coastguard Worker     ext_data_bits +=
889*15dc779aSAndroid Build Coastguard Worker         ixheaace_enc_write_ps_data(pstr_ps_handle, is_hdr_active, pstr_sbr_tab->ptr_ps_tab);
890*15dc779aSAndroid Build Coastguard Worker   }
891*15dc779aSAndroid Build Coastguard Worker   if (is_esbr) {
892*15dc779aSAndroid Build Coastguard Worker     ext_data_bits += ixheaace_get_esbr_ext_data_size(pstr_esbr_data);
893*15dc779aSAndroid Build Coastguard Worker   }
894*15dc779aSAndroid Build Coastguard Worker 
895*15dc779aSAndroid Build Coastguard Worker   if (ext_data_bits != 0) {
896*15dc779aSAndroid Build Coastguard Worker     ext_data_bits += SI_SBR_EXTENSION_ID_BITS;
897*15dc779aSAndroid Build Coastguard Worker   }
898*15dc779aSAndroid Build Coastguard Worker 
899*15dc779aSAndroid Build Coastguard Worker   return (ext_data_bits + 7) >> 3;
900*15dc779aSAndroid Build Coastguard Worker }
901*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_extended_data(struct ixheaace_ps_enc * pstr_ps_handle,WORD32 is_hdr_active,ixheaace_bit_buf_handle pstr_bs_prev,WORD32 * ptr_sbr_hdr_bits,ixheaace_bit_buf_handle pstr_bs_handle,WORD32 * ptr_payload_bits,ixheaace_str_sbr_tabs * pstr_sbr_tab,WORD32 is_esbr,ixheaace_str_esbr_bs_data * pstr_esbr_data)902*15dc779aSAndroid Build Coastguard Worker static VOID ixheaace_encode_extended_data(struct ixheaace_ps_enc *pstr_ps_handle,
903*15dc779aSAndroid Build Coastguard Worker                                           WORD32 is_hdr_active,
904*15dc779aSAndroid Build Coastguard Worker                                           ixheaace_bit_buf_handle pstr_bs_prev,
905*15dc779aSAndroid Build Coastguard Worker                                           WORD32 *ptr_sbr_hdr_bits,
906*15dc779aSAndroid Build Coastguard Worker                                           ixheaace_bit_buf_handle pstr_bs_handle,
907*15dc779aSAndroid Build Coastguard Worker                                           WORD32 *ptr_payload_bits,
908*15dc779aSAndroid Build Coastguard Worker                                           ixheaace_str_sbr_tabs *pstr_sbr_tab, WORD32 is_esbr,
909*15dc779aSAndroid Build Coastguard Worker                                           ixheaace_str_esbr_bs_data *pstr_esbr_data) {
910*15dc779aSAndroid Build Coastguard Worker   WORD32 ext_data_size;
911*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_bits_in = *ptr_payload_bits;
912*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
913*15dc779aSAndroid Build Coastguard Worker 
914*15dc779aSAndroid Build Coastguard Worker   ext_data_size = ixheaace_get_sbr_extended_data_size(pstr_ps_handle, is_hdr_active, pstr_sbr_tab,
915*15dc779aSAndroid Build Coastguard Worker                                                       is_esbr, pstr_esbr_data);
916*15dc779aSAndroid Build Coastguard Worker 
917*15dc779aSAndroid Build Coastguard Worker   if (ext_data_size != 0) {
918*15dc779aSAndroid Build Coastguard Worker     if (pstr_ps_handle && ixheaace_append_ps_bitstream(pstr_ps_handle, NULL_PTR, 0)) {
919*15dc779aSAndroid Build Coastguard Worker       ixheaace_bit_buf bitbuf_tmp;
920*15dc779aSAndroid Build Coastguard Worker       UWORD8 tmp[IXHEAACE_MAX_PAYLOAD_SIZE];
921*15dc779aSAndroid Build Coastguard Worker       WORD32 max_ext_size = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1;
922*15dc779aSAndroid Build Coastguard Worker       WORD32 num_bits;
923*15dc779aSAndroid Build Coastguard Worker 
924*15dc779aSAndroid Build Coastguard Worker       num_bits = ia_enhaacplus_enc_get_bits_available(&pstr_ps_handle->ps_bit_buf);
925*15dc779aSAndroid Build Coastguard Worker       num_bits += SI_SBR_EXTENSION_ID_BITS;
926*15dc779aSAndroid Build Coastguard Worker       if (is_esbr) {
927*15dc779aSAndroid Build Coastguard Worker         num_bits += ixheaace_get_esbr_ext_data_size(pstr_esbr_data);
928*15dc779aSAndroid Build Coastguard Worker         num_bits += SI_SBR_EXTENSION_ID_BITS;
929*15dc779aSAndroid Build Coastguard Worker       }
930*15dc779aSAndroid Build Coastguard Worker       ext_data_size = (num_bits + 7) >> 3;
931*15dc779aSAndroid Build Coastguard Worker       if (ia_enhaacplus_enc_get_bits_available(pstr_bs_prev) == 0) {
932*15dc779aSAndroid Build Coastguard Worker         pstr_ps_handle->hdr_bits_prev_frame = *ptr_sbr_hdr_bits;
933*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_copy_bitbuf(pstr_bs_handle, pstr_bs_prev);
934*15dc779aSAndroid Build Coastguard Worker       } else {
935*15dc779aSAndroid Build Coastguard Worker         WORD32 tmp_bits;
936*15dc779aSAndroid Build Coastguard Worker         ia_enhaacplus_enc_create_bitbuffer(&bitbuf_tmp, tmp, sizeof(tmp));
937*15dc779aSAndroid Build Coastguard Worker         tmp_bits = *ptr_sbr_hdr_bits;
938*15dc779aSAndroid Build Coastguard Worker         *ptr_sbr_hdr_bits = pstr_ps_handle->hdr_bits_prev_frame;
939*15dc779aSAndroid Build Coastguard Worker         pstr_ps_handle->hdr_bits_prev_frame = tmp_bits;
940*15dc779aSAndroid Build Coastguard Worker         ixheaace_copy_bitbuf_to_and_fro(pstr_bs_prev, pstr_bs_handle);
941*15dc779aSAndroid Build Coastguard Worker       }
942*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bs_handle, 1, SI_SBR_EXTENDED_DATA_BITS);
943*15dc779aSAndroid Build Coastguard Worker 
944*15dc779aSAndroid Build Coastguard Worker       if (ext_data_size < max_ext_size) {
945*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, ext_data_size, SI_SBR_EXTENSION_SIZE_BITS);
946*15dc779aSAndroid Build Coastguard Worker       } else {
947*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, max_ext_size, SI_SBR_EXTENSION_SIZE_BITS);
948*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, ext_data_size - max_ext_size,
949*15dc779aSAndroid Build Coastguard Worker                             SI_SBR_EXTENSION_ESC_COUNT_BITS);
950*15dc779aSAndroid Build Coastguard Worker       }
951*15dc779aSAndroid Build Coastguard Worker       WORD32 start_bits = pstr_bs_handle->cnt_bits;
952*15dc779aSAndroid Build Coastguard Worker       *ptr_payload_bits =
953*15dc779aSAndroid Build Coastguard Worker           ixheaace_append_ps_bitstream(pstr_ps_handle, pstr_bs_handle, ptr_sbr_hdr_bits);
954*15dc779aSAndroid Build Coastguard Worker 
955*15dc779aSAndroid Build Coastguard Worker       if (is_esbr) {
956*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_bits += iexhaace_esbr_write_bs(pstr_esbr_data, pstr_bs_handle);
957*15dc779aSAndroid Build Coastguard Worker       }
958*15dc779aSAndroid Build Coastguard Worker 
959*15dc779aSAndroid Build Coastguard Worker       WORD32 fill_bits = (ext_data_size << 3) - (pstr_bs_handle->cnt_bits - start_bits);
960*15dc779aSAndroid Build Coastguard Worker       ixheaace_write_bits(pstr_bs_handle, 0, (UWORD8)fill_bits);
961*15dc779aSAndroid Build Coastguard Worker       *ptr_payload_bits = *ptr_payload_bits + fill_bits;
962*15dc779aSAndroid Build Coastguard Worker     } else {
963*15dc779aSAndroid Build Coastguard Worker       if (is_esbr) {
964*15dc779aSAndroid Build Coastguard Worker         WORD32 max_ext_size = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1;
965*15dc779aSAndroid Build Coastguard Worker         WORD32 num_bits;
966*15dc779aSAndroid Build Coastguard Worker         num_bits = ixheaace_get_esbr_ext_data_size(pstr_esbr_data);
967*15dc779aSAndroid Build Coastguard Worker         ext_data_size = (num_bits + SI_SBR_EXTENSION_ID_BITS + 7) >> 3;
968*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, 1, SI_SBR_EXTENDED_DATA_BITS);
969*15dc779aSAndroid Build Coastguard Worker         if (ext_data_size < max_ext_size) {
970*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, ext_data_size, SI_SBR_EXTENSION_SIZE_BITS);
971*15dc779aSAndroid Build Coastguard Worker         } else {
972*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, max_ext_size, SI_SBR_EXTENSION_SIZE_BITS);
973*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, ext_data_size - max_ext_size,
974*15dc779aSAndroid Build Coastguard Worker                               SI_SBR_EXTENSION_ESC_COUNT_BITS);
975*15dc779aSAndroid Build Coastguard Worker         }
976*15dc779aSAndroid Build Coastguard Worker         WORD32 start_bits = pstr_bs_handle->cnt_bits;
977*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_bits += iexhaace_esbr_write_bs(pstr_esbr_data, pstr_bs_handle);
978*15dc779aSAndroid Build Coastguard Worker         UWORD8 fill_bits =
979*15dc779aSAndroid Build Coastguard Worker             (UWORD8)((ext_data_size << 3) - (pstr_bs_handle->cnt_bits - start_bits));
980*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, 0, fill_bits);
981*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_bits = *ptr_payload_bits + fill_bits;
982*15dc779aSAndroid Build Coastguard Worker       } else {
983*15dc779aSAndroid Build Coastguard Worker         WORD32 max_ext_size = (1 << SI_SBR_EXTENSION_SIZE_BITS) - 1;
984*15dc779aSAndroid Build Coastguard Worker         payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 1, SI_SBR_EXTENDED_DATA_BITS);
985*15dc779aSAndroid Build Coastguard Worker 
986*15dc779aSAndroid Build Coastguard Worker         if (ext_data_size < max_ext_size) {
987*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
988*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, ext_data_size, SI_SBR_EXTENSION_SIZE_BITS);
989*15dc779aSAndroid Build Coastguard Worker         } else {
990*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits +=
991*15dc779aSAndroid Build Coastguard Worker               ixheaace_write_bits(pstr_bs_handle, max_ext_size, SI_SBR_EXTENSION_SIZE_BITS);
992*15dc779aSAndroid Build Coastguard Worker 
993*15dc779aSAndroid Build Coastguard Worker           payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, ext_data_size - max_ext_size,
994*15dc779aSAndroid Build Coastguard Worker                                                   SI_SBR_EXTENSION_ESC_COUNT_BITS);
995*15dc779aSAndroid Build Coastguard Worker         }
996*15dc779aSAndroid Build Coastguard Worker 
997*15dc779aSAndroid Build Coastguard Worker         *ptr_payload_bits = payload_cnt_bits + payload_bits_in;
998*15dc779aSAndroid Build Coastguard Worker       }
999*15dc779aSAndroid Build Coastguard Worker     }
1000*15dc779aSAndroid Build Coastguard Worker   } else {
1001*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, SI_SBR_EXTENDED_DATA_BITS);
1002*15dc779aSAndroid Build Coastguard Worker 
1003*15dc779aSAndroid Build Coastguard Worker     *ptr_payload_bits = payload_cnt_bits + payload_bits_in;
1004*15dc779aSAndroid Build Coastguard Worker   }
1005*15dc779aSAndroid Build Coastguard Worker }
1006*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_sbr_data(ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right,ixheaace_pstr_common_data pstr_cmon_data,ixheaace_sbr_element_type sbr_ele_type,struct ixheaace_ps_enc * pstr_ps_handle,WORD32 is_hdr_active,WORD32 coupling,ixheaace_str_sbr_tabs * pstr_sbr_tab,ixheaace_sbr_codec_type sbr_codec,WORD32 is_esbr,ixheaace_str_esbr_bs_data * pstr_esbr_data,WORD32 * ptr_num_bits)1007*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ixheaace_encode_sbr_data(
1008*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,
1009*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right, ixheaace_pstr_common_data pstr_cmon_data,
1010*15dc779aSAndroid Build Coastguard Worker     ixheaace_sbr_element_type sbr_ele_type, struct ixheaace_ps_enc *pstr_ps_handle,
1011*15dc779aSAndroid Build Coastguard Worker     WORD32 is_hdr_active, WORD32 coupling, ixheaace_str_sbr_tabs *pstr_sbr_tab,
1012*15dc779aSAndroid Build Coastguard Worker     ixheaace_sbr_codec_type sbr_codec, WORD32 is_esbr, ixheaace_str_esbr_bs_data *pstr_esbr_data,
1013*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_num_bits) {
1014*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1015*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1016*15dc779aSAndroid Build Coastguard Worker 
1017*15dc779aSAndroid Build Coastguard Worker   switch (sbr_ele_type) {
1018*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_SBR_ID_SCE:
1019*15dc779aSAndroid Build Coastguard Worker 
1020*15dc779aSAndroid Build Coastguard Worker       err_code = ixheaace_encode_sbr_single_channel_element(
1021*15dc779aSAndroid Build Coastguard Worker           pstr_sbr_env_data_left, &pstr_cmon_data->str_sbr_bit_buf, sbr_codec, &payload_cnt_bits);
1022*15dc779aSAndroid Build Coastguard Worker       if (err_code) {
1023*15dc779aSAndroid Build Coastguard Worker         return err_code;
1024*15dc779aSAndroid Build Coastguard Worker       }
1025*15dc779aSAndroid Build Coastguard Worker       if (USAC_SBR != sbr_codec) {
1026*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_extended_data(
1027*15dc779aSAndroid Build Coastguard Worker             pstr_ps_handle, is_hdr_active, &pstr_cmon_data->str_sbr_bit_buf_prev,
1028*15dc779aSAndroid Build Coastguard Worker             &pstr_cmon_data->sbr_hdr_bits, &pstr_cmon_data->str_sbr_bit_buf, &payload_cnt_bits,
1029*15dc779aSAndroid Build Coastguard Worker             pstr_sbr_tab, is_esbr, pstr_esbr_data);
1030*15dc779aSAndroid Build Coastguard Worker       }
1031*15dc779aSAndroid Build Coastguard Worker       break;
1032*15dc779aSAndroid Build Coastguard Worker     case IXHEAACE_SBR_ID_CPE:
1033*15dc779aSAndroid Build Coastguard Worker 
1034*15dc779aSAndroid Build Coastguard Worker       err_code = ixheaace_encode_sbr_channel_pair_element(
1035*15dc779aSAndroid Build Coastguard Worker           pstr_sbr_env_data_left, pstr_sbr_env_data_right, &pstr_cmon_data->str_sbr_bit_buf,
1036*15dc779aSAndroid Build Coastguard Worker           coupling, sbr_codec, &payload_cnt_bits);
1037*15dc779aSAndroid Build Coastguard Worker       if (err_code) {
1038*15dc779aSAndroid Build Coastguard Worker         return err_code;
1039*15dc779aSAndroid Build Coastguard Worker       }
1040*15dc779aSAndroid Build Coastguard Worker       if (USAC_SBR != sbr_codec) {
1041*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_extended_data(NULL_PTR, 0, NULL_PTR, 0, &pstr_cmon_data->str_sbr_bit_buf,
1042*15dc779aSAndroid Build Coastguard Worker                                       &payload_cnt_bits, pstr_sbr_tab, is_esbr, pstr_esbr_data);
1043*15dc779aSAndroid Build Coastguard Worker       }
1044*15dc779aSAndroid Build Coastguard Worker       break;
1045*15dc779aSAndroid Build Coastguard Worker   }
1046*15dc779aSAndroid Build Coastguard Worker 
1047*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_data_bits = payload_cnt_bits;
1048*15dc779aSAndroid Build Coastguard Worker   *ptr_num_bits = payload_cnt_bits;
1049*15dc779aSAndroid Build Coastguard Worker 
1050*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->prev_bit_buf_read_offset =
1051*15dc779aSAndroid Build Coastguard Worker       (WORD32)(pstr_cmon_data->str_sbr_bit_buf_prev.ptr_read_next -
1052*15dc779aSAndroid Build Coastguard Worker                pstr_cmon_data->str_sbr_bit_buf_prev.ptr_bit_buf_base);
1053*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->prev_bit_buf_write_offset =
1054*15dc779aSAndroid Build Coastguard Worker       (WORD32)(pstr_cmon_data->str_sbr_bit_buf_prev.ptr_write_next -
1055*15dc779aSAndroid Build Coastguard Worker                pstr_cmon_data->str_sbr_bit_buf_prev.ptr_bit_buf_base);
1056*15dc779aSAndroid Build Coastguard Worker 
1057*15dc779aSAndroid Build Coastguard Worker   return err_code;
1058*15dc779aSAndroid Build Coastguard Worker }
1059*15dc779aSAndroid Build Coastguard Worker 
ixheaace_encode_sbr_header_data(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_bit_buf_handle pstr_bs_handle)1060*15dc779aSAndroid Build Coastguard Worker static WORD32 ixheaace_encode_sbr_header_data(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,
1061*15dc779aSAndroid Build Coastguard Worker                                               ixheaace_bit_buf_handle pstr_bs_handle)
1062*15dc779aSAndroid Build Coastguard Worker 
1063*15dc779aSAndroid Build Coastguard Worker {
1064*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1065*15dc779aSAndroid Build Coastguard Worker 
1066*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_hdr != NULL_PTR) {
1067*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1068*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_amp_res, SI_SBR_AMP_RES_BITS);
1069*15dc779aSAndroid Build Coastguard Worker 
1070*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1071*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_start_freq, SI_SBR_START_FREQ_BITS);
1072*15dc779aSAndroid Build Coastguard Worker 
1073*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1074*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_stop_freq, SI_SBR_STOP_FREQ_BITS);
1075*15dc779aSAndroid Build Coastguard Worker 
1076*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1077*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_xover_band, SI_SBR_XOVER_BAND_BITS);
1078*15dc779aSAndroid Build Coastguard Worker 
1079*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, 0, SI_SBR_RESERVED_BITS);
1080*15dc779aSAndroid Build Coastguard Worker 
1081*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->header_extra_1,
1082*15dc779aSAndroid Build Coastguard Worker                                             SI_SBR_HEADER_EXTRA_1_BITS);
1083*15dc779aSAndroid Build Coastguard Worker 
1084*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->header_extra_2,
1085*15dc779aSAndroid Build Coastguard Worker                                             SI_SBR_HEADER_EXTRA_2_BITS);
1086*15dc779aSAndroid Build Coastguard Worker 
1087*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_hdr->header_extra_1) {
1088*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1089*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->freq_scale, SI_SBR_FREQ_SCALE_BITS);
1090*15dc779aSAndroid Build Coastguard Worker 
1091*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1092*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->alter_scale, SI_SBR_ALTER_SCALE_BITS);
1093*15dc779aSAndroid Build Coastguard Worker 
1094*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_noise_bands,
1095*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_NOISE_BANDS_BITS);
1096*15dc779aSAndroid Build Coastguard Worker     }
1097*15dc779aSAndroid Build Coastguard Worker 
1098*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_hdr->header_extra_2) {
1099*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_limiter_bands,
1100*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_LIMITER_BANDS_BITS);
1101*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_limiter_gains,
1102*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_LIMITER_GAINS_BITS);
1103*15dc779aSAndroid Build Coastguard Worker 
1104*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_interpol_freq,
1105*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_INTERPOL_FREQ_BITS);
1106*15dc779aSAndroid Build Coastguard Worker 
1107*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_smoothing_length,
1108*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_SMOOTHING_LENGTH_BITS);
1109*15dc779aSAndroid Build Coastguard Worker     }
1110*15dc779aSAndroid Build Coastguard Worker   }
1111*15dc779aSAndroid Build Coastguard Worker 
1112*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
1113*15dc779aSAndroid Build Coastguard Worker }
1114*15dc779aSAndroid Build Coastguard Worker 
ia_enhaacplus_enc_encode_sbr_header(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,ixheaace_pstr_common_data pstr_cmon_data)1115*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_encode_sbr_header(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,
1116*15dc779aSAndroid Build Coastguard Worker                                                   ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,
1117*15dc779aSAndroid Build Coastguard Worker                                                   ixheaace_pstr_common_data pstr_cmon_data) {
1118*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1119*15dc779aSAndroid Build Coastguard Worker 
1120*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_bs->crc_active) {
1121*15dc779aSAndroid Build Coastguard Worker     pstr_cmon_data->sbr_crc_len = 1;
1122*15dc779aSAndroid Build Coastguard Worker   } else {
1123*15dc779aSAndroid Build Coastguard Worker     pstr_cmon_data->sbr_crc_len = 0;
1124*15dc779aSAndroid Build Coastguard Worker   }
1125*15dc779aSAndroid Build Coastguard Worker 
1126*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_bs->header_active) {
1127*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 1, 1);
1128*15dc779aSAndroid Build Coastguard Worker 
1129*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1130*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_header_data(pstr_sbr_hdr, &pstr_cmon_data->str_sbr_bit_buf);
1131*15dc779aSAndroid Build Coastguard Worker   } else {
1132*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 0, 1);
1133*15dc779aSAndroid Build Coastguard Worker   }
1134*15dc779aSAndroid Build Coastguard Worker 
1135*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_hdr_bits = payload_cnt_bits;
1136*15dc779aSAndroid Build Coastguard Worker 
1137*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
1138*15dc779aSAndroid Build Coastguard Worker }
iusace_encode_sbr_header_data(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_bit_buf_handle pstr_bs_handle)1139*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_encode_sbr_header_data(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,
1140*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_bit_buf_handle pstr_bs_handle) {
1141*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1142*15dc779aSAndroid Build Coastguard Worker 
1143*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_hdr != NULL_PTR) {
1144*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1145*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_start_freq, SI_SBR_START_FREQ_BITS);
1146*15dc779aSAndroid Build Coastguard Worker 
1147*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1148*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_stop_freq, SI_SBR_STOP_FREQ_BITS);
1149*15dc779aSAndroid Build Coastguard Worker 
1150*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->header_extra_1,
1151*15dc779aSAndroid Build Coastguard Worker                                             SI_SBR_HEADER_EXTRA_1_BITS);
1152*15dc779aSAndroid Build Coastguard Worker 
1153*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->header_extra_2,
1154*15dc779aSAndroid Build Coastguard Worker                                             SI_SBR_HEADER_EXTRA_2_BITS);
1155*15dc779aSAndroid Build Coastguard Worker 
1156*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_hdr->header_extra_1) {
1157*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1158*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->freq_scale, SI_SBR_FREQ_SCALE_BITS);
1159*15dc779aSAndroid Build Coastguard Worker 
1160*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1161*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->alter_scale, SI_SBR_ALTER_SCALE_BITS);
1162*15dc779aSAndroid Build Coastguard Worker 
1163*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_noise_bands,
1164*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_NOISE_BANDS_BITS);
1165*15dc779aSAndroid Build Coastguard Worker     }
1166*15dc779aSAndroid Build Coastguard Worker 
1167*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_hdr->header_extra_2) {
1168*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_limiter_bands,
1169*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_LIMITER_BANDS_BITS);
1170*15dc779aSAndroid Build Coastguard Worker 
1171*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_limiter_gains,
1172*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_LIMITER_GAINS_BITS);
1173*15dc779aSAndroid Build Coastguard Worker 
1174*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_interpol_freq,
1175*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_INTERPOL_FREQ_BITS);
1176*15dc779aSAndroid Build Coastguard Worker 
1177*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(pstr_bs_handle, pstr_sbr_hdr->sbr_smoothing_length,
1178*15dc779aSAndroid Build Coastguard Worker                                               SI_SBR_SMOOTHING_LENGTH_BITS);
1179*15dc779aSAndroid Build Coastguard Worker     }
1180*15dc779aSAndroid Build Coastguard Worker   }
1181*15dc779aSAndroid Build Coastguard Worker 
1182*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
1183*15dc779aSAndroid Build Coastguard Worker }
1184*15dc779aSAndroid Build Coastguard Worker 
ia_usac_enc_encode_sbr_header(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,ixheaace_pstr_common_data pstr_cmon_data)1185*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_usac_enc_encode_sbr_header(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,
1186*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,
1187*15dc779aSAndroid Build Coastguard Worker                                             ixheaace_pstr_common_data pstr_cmon_data) {
1188*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1189*15dc779aSAndroid Build Coastguard Worker   WORD32 sbr_info_flag = 0;
1190*15dc779aSAndroid Build Coastguard Worker   WORD32 sbr_hdr_flag = 0;
1191*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_bs->usac_indep_flag) {
1192*15dc779aSAndroid Build Coastguard Worker     sbr_hdr_flag = 1;
1193*15dc779aSAndroid Build Coastguard Worker     sbr_info_flag = 1;
1194*15dc779aSAndroid Build Coastguard Worker   } else {
1195*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_bs->header_active) {
1196*15dc779aSAndroid Build Coastguard Worker       sbr_info_flag = 1;
1197*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 1, 1);
1198*15dc779aSAndroid Build Coastguard Worker       sbr_hdr_flag = 1;
1199*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 1, 1);
1200*15dc779aSAndroid Build Coastguard Worker     } else {
1201*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits += ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, 0, 1);
1202*15dc779aSAndroid Build Coastguard Worker     }
1203*15dc779aSAndroid Build Coastguard Worker   }
1204*15dc779aSAndroid Build Coastguard Worker 
1205*15dc779aSAndroid Build Coastguard Worker   if (1 == sbr_info_flag) {
1206*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1207*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, pstr_sbr_hdr->sbr_amp_res, 1);
1208*15dc779aSAndroid Build Coastguard Worker 
1209*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1210*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, pstr_sbr_hdr->sbr_xover_band, 4);
1211*15dc779aSAndroid Build Coastguard Worker 
1212*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits +=
1213*15dc779aSAndroid Build Coastguard Worker         ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, pstr_sbr_hdr->sbr_pre_proc, 1);
1214*15dc779aSAndroid Build Coastguard Worker     if (pstr_sbr_hdr->sbr_pvc_active) {
1215*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1216*15dc779aSAndroid Build Coastguard Worker           ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, pstr_sbr_hdr->sbr_pvc_mode, 2);
1217*15dc779aSAndroid Build Coastguard Worker     }
1218*15dc779aSAndroid Build Coastguard Worker   }
1219*15dc779aSAndroid Build Coastguard Worker 
1220*15dc779aSAndroid Build Coastguard Worker   if (1 == sbr_hdr_flag) {
1221*15dc779aSAndroid Build Coastguard Worker     WORD32 sbr_def_hdr = 0;
1222*15dc779aSAndroid Build Coastguard Worker     // SBR default header
1223*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += ixheaace_write_bits(&pstr_cmon_data->str_sbr_bit_buf, sbr_def_hdr, 1);
1224*15dc779aSAndroid Build Coastguard Worker     if (0 == sbr_def_hdr) {
1225*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1226*15dc779aSAndroid Build Coastguard Worker           iusace_encode_sbr_header_data(pstr_sbr_hdr, &pstr_cmon_data->str_sbr_bit_buf);
1227*15dc779aSAndroid Build Coastguard Worker     }
1228*15dc779aSAndroid Build Coastguard Worker   }
1229*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_hdr_bits = payload_cnt_bits;
1230*15dc779aSAndroid Build Coastguard Worker 
1231*15dc779aSAndroid Build Coastguard Worker   return payload_cnt_bits;
1232*15dc779aSAndroid Build Coastguard Worker }
1233*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_write_env_single_channel_element(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,ixheaace_pstr_sbr_env_data pstr_sbr_env_info,struct ixheaace_ps_enc * pstr_ps_handle,ixheaace_pstr_common_data pstr_cmon_data,ixheaace_str_sbr_tabs * pstr_sbr_tab,ixheaace_sbr_codec_type sbr_codec,WORD32 is_esbr,ixheaace_str_esbr_bs_data * pstr_esbr_data,WORD32 * ptr_num_bits)1234*15dc779aSAndroid Build Coastguard Worker ixheaace_write_env_single_channel_element(
1235*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr, ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,
1236*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_info, struct ixheaace_ps_enc *pstr_ps_handle,
1237*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_common_data pstr_cmon_data, ixheaace_str_sbr_tabs *pstr_sbr_tab,
1238*15dc779aSAndroid Build Coastguard Worker     ixheaace_sbr_codec_type sbr_codec, WORD32 is_esbr, ixheaace_str_esbr_bs_data *pstr_esbr_data,
1239*15dc779aSAndroid Build Coastguard Worker     WORD32 *ptr_num_bits) {
1240*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1241*15dc779aSAndroid Build Coastguard Worker   WORD32 num_sbr_data_bits = 0;
1242*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1243*15dc779aSAndroid Build Coastguard Worker 
1244*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_hdr_bits = 0;
1245*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_data_bits = 0;
1246*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_crc_len = 0;
1247*15dc779aSAndroid Build Coastguard Worker 
1248*15dc779aSAndroid Build Coastguard Worker   if (pstr_sbr_env_info != NULL_PTR) {
1249*15dc779aSAndroid Build Coastguard Worker     if (USAC_SBR == sbr_codec) {
1250*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1251*15dc779aSAndroid Build Coastguard Worker           ia_usac_enc_encode_sbr_header(pstr_sbr_hdr, pstr_sbr_bs, pstr_cmon_data);
1252*15dc779aSAndroid Build Coastguard Worker     } else {
1253*15dc779aSAndroid Build Coastguard Worker       /* write header */
1254*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1255*15dc779aSAndroid Build Coastguard Worker           ia_enhaacplus_enc_encode_sbr_header(pstr_sbr_hdr, pstr_sbr_bs, pstr_cmon_data);
1256*15dc779aSAndroid Build Coastguard Worker     }
1257*15dc779aSAndroid Build Coastguard Worker     /* write data */
1258*15dc779aSAndroid Build Coastguard Worker     err_code =
1259*15dc779aSAndroid Build Coastguard Worker         ixheaace_encode_sbr_data(pstr_sbr_env_info, NULL_PTR, pstr_cmon_data, IXHEAACE_SBR_ID_SCE,
1260*15dc779aSAndroid Build Coastguard Worker                                  pstr_ps_handle, pstr_sbr_bs->header_active, 0, pstr_sbr_tab,
1261*15dc779aSAndroid Build Coastguard Worker                                  sbr_codec, is_esbr, pstr_esbr_data, &num_sbr_data_bits);
1262*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
1263*15dc779aSAndroid Build Coastguard Worker       return err_code;
1264*15dc779aSAndroid Build Coastguard Worker     }
1265*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += num_sbr_data_bits;
1266*15dc779aSAndroid Build Coastguard Worker   }
1267*15dc779aSAndroid Build Coastguard Worker 
1268*15dc779aSAndroid Build Coastguard Worker   *ptr_num_bits = payload_cnt_bits;
1269*15dc779aSAndroid Build Coastguard Worker   return err_code;
1270*15dc779aSAndroid Build Coastguard Worker }
1271*15dc779aSAndroid Build Coastguard Worker 
1272*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_write_env_channel_pair_element(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right,ixheaace_pstr_common_data pstr_cmon_data,ixheaace_str_sbr_tabs * pstr_sbr_tab,ixheaace_sbr_codec_type sbr_codec,WORD32 is_esbr,ixheaace_str_esbr_bs_data * pstr_esbr_data,WORD32 * ptr_num_bits)1273*15dc779aSAndroid Build Coastguard Worker ixheaace_write_env_channel_pair_element(
1274*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr, ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,
1275*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,
1276*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right, ixheaace_pstr_common_data pstr_cmon_data,
1277*15dc779aSAndroid Build Coastguard Worker     ixheaace_str_sbr_tabs *pstr_sbr_tab, ixheaace_sbr_codec_type sbr_codec, WORD32 is_esbr,
1278*15dc779aSAndroid Build Coastguard Worker     ixheaace_str_esbr_bs_data *pstr_esbr_data, WORD32 *ptr_num_bits)
1279*15dc779aSAndroid Build Coastguard Worker 
1280*15dc779aSAndroid Build Coastguard Worker {
1281*15dc779aSAndroid Build Coastguard Worker   WORD32 payload_cnt_bits = 0;
1282*15dc779aSAndroid Build Coastguard Worker   WORD32 num_sbr_data_bits = 0;
1283*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1284*15dc779aSAndroid Build Coastguard Worker 
1285*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_hdr_bits = 0;
1286*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_data_bits = 0;
1287*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->sbr_crc_len = 0;
1288*15dc779aSAndroid Build Coastguard Worker 
1289*15dc779aSAndroid Build Coastguard Worker   /* write pure SBR data */
1290*15dc779aSAndroid Build Coastguard Worker   if ((pstr_sbr_env_data_left != NULL_PTR) && (pstr_sbr_env_data_right != NULL_PTR)) {
1291*15dc779aSAndroid Build Coastguard Worker     if (USAC_SBR == sbr_codec) {
1292*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1293*15dc779aSAndroid Build Coastguard Worker           ia_usac_enc_encode_sbr_header(pstr_sbr_hdr, pstr_sbr_bs, pstr_cmon_data);
1294*15dc779aSAndroid Build Coastguard Worker     } else {
1295*15dc779aSAndroid Build Coastguard Worker       /* write header */
1296*15dc779aSAndroid Build Coastguard Worker       payload_cnt_bits +=
1297*15dc779aSAndroid Build Coastguard Worker           ia_enhaacplus_enc_encode_sbr_header(pstr_sbr_hdr, pstr_sbr_bs, pstr_cmon_data);
1298*15dc779aSAndroid Build Coastguard Worker     }
1299*15dc779aSAndroid Build Coastguard Worker 
1300*15dc779aSAndroid Build Coastguard Worker     /* write data */
1301*15dc779aSAndroid Build Coastguard Worker     err_code = ixheaace_encode_sbr_data(pstr_sbr_env_data_left, pstr_sbr_env_data_right,
1302*15dc779aSAndroid Build Coastguard Worker                                         pstr_cmon_data, IXHEAACE_SBR_ID_CPE, NULL_PTR, 0,
1303*15dc779aSAndroid Build Coastguard Worker                                         pstr_sbr_hdr->coupling, pstr_sbr_tab, sbr_codec, is_esbr,
1304*15dc779aSAndroid Build Coastguard Worker                                         pstr_esbr_data, &num_sbr_data_bits);
1305*15dc779aSAndroid Build Coastguard Worker     if (err_code) {
1306*15dc779aSAndroid Build Coastguard Worker       return err_code;
1307*15dc779aSAndroid Build Coastguard Worker     }
1308*15dc779aSAndroid Build Coastguard Worker     payload_cnt_bits += num_sbr_data_bits;
1309*15dc779aSAndroid Build Coastguard Worker   }
1310*15dc779aSAndroid Build Coastguard Worker 
1311*15dc779aSAndroid Build Coastguard Worker   *ptr_num_bits = payload_cnt_bits;
1312*15dc779aSAndroid Build Coastguard Worker   return err_code;
1313*15dc779aSAndroid Build Coastguard Worker }
1314*15dc779aSAndroid Build Coastguard Worker 
1315*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_count_sbr_channel_pair_element(ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr,ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right,ixheaace_pstr_common_data pstr_cmon_data,ixheaace_str_sbr_tabs * pstr_sbr_tab,ixheaace_sbr_codec_type sbr_codec,WORD32 is_esbr,ixheaace_str_esbr_bs_data * pstr_esbr_data,WORD32 * ptr_num_bits)1316*15dc779aSAndroid Build Coastguard Worker ixheaace_count_sbr_channel_pair_element(
1317*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_hdr_data pstr_sbr_hdr, ixheaace_pstr_sbr_bitstream_data pstr_sbr_bs,
1318*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_left,
1319*15dc779aSAndroid Build Coastguard Worker     ixheaace_pstr_sbr_env_data pstr_sbr_env_data_right, ixheaace_pstr_common_data pstr_cmon_data,
1320*15dc779aSAndroid Build Coastguard Worker     ixheaace_str_sbr_tabs *pstr_sbr_tab, ixheaace_sbr_codec_type sbr_codec, WORD32 is_esbr,
1321*15dc779aSAndroid Build Coastguard Worker     ixheaace_str_esbr_bs_data *pstr_esbr_data, WORD32 *ptr_num_bits)
1322*15dc779aSAndroid Build Coastguard Worker 
1323*15dc779aSAndroid Build Coastguard Worker {
1324*15dc779aSAndroid Build Coastguard Worker   IA_ERRORCODE err_code = IA_NO_ERROR;
1325*15dc779aSAndroid Build Coastguard Worker   ixheaace_bit_buf bit_buf_tmp = pstr_cmon_data->str_sbr_bit_buf;
1326*15dc779aSAndroid Build Coastguard Worker 
1327*15dc779aSAndroid Build Coastguard Worker   err_code = ixheaace_write_env_channel_pair_element(
1328*15dc779aSAndroid Build Coastguard Worker       pstr_sbr_hdr, pstr_sbr_bs, pstr_sbr_env_data_left, pstr_sbr_env_data_right, pstr_cmon_data,
1329*15dc779aSAndroid Build Coastguard Worker       pstr_sbr_tab, sbr_codec, is_esbr, pstr_esbr_data, ptr_num_bits);
1330*15dc779aSAndroid Build Coastguard Worker 
1331*15dc779aSAndroid Build Coastguard Worker   pstr_cmon_data->str_sbr_bit_buf = bit_buf_tmp;
1332*15dc779aSAndroid Build Coastguard Worker 
1333*15dc779aSAndroid Build Coastguard Worker   return err_code;
1334*15dc779aSAndroid Build Coastguard Worker }
1335*15dc779aSAndroid Build Coastguard Worker 
ixheaace_map_low_res_energy_value(WORD32 curr_val,WORD32 * ptr_prev_data,WORD32 offset,WORD32 index,ixheaace_freq_res res)1336*15dc779aSAndroid Build Coastguard Worker VOID ixheaace_map_low_res_energy_value(WORD32 curr_val, WORD32 *ptr_prev_data, WORD32 offset,
1337*15dc779aSAndroid Build Coastguard Worker                                        WORD32 index, ixheaace_freq_res res) {
1338*15dc779aSAndroid Build Coastguard Worker   if (res == FREQ_RES_LOW) {
1339*15dc779aSAndroid Build Coastguard Worker     if (offset >= 0) {
1340*15dc779aSAndroid Build Coastguard Worker       if (index < offset) {
1341*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[index] = curr_val;
1342*15dc779aSAndroid Build Coastguard Worker       } else {
1343*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[2 * index - offset] = curr_val;
1344*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[2 * index + 1 - offset] = curr_val;
1345*15dc779aSAndroid Build Coastguard Worker       }
1346*15dc779aSAndroid Build Coastguard Worker     } else {
1347*15dc779aSAndroid Build Coastguard Worker       offset = -offset;
1348*15dc779aSAndroid Build Coastguard Worker 
1349*15dc779aSAndroid Build Coastguard Worker       if (index < offset) {
1350*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[3 * index] = curr_val;
1351*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[3 * index + 1] = curr_val;
1352*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[3 * index + 2] = curr_val;
1353*15dc779aSAndroid Build Coastguard Worker       } else {
1354*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[2 * index + offset] = curr_val;
1355*15dc779aSAndroid Build Coastguard Worker         ptr_prev_data[2 * index + 1 + offset] = curr_val;
1356*15dc779aSAndroid Build Coastguard Worker       }
1357*15dc779aSAndroid Build Coastguard Worker     }
1358*15dc779aSAndroid Build Coastguard Worker   } else {
1359*15dc779aSAndroid Build Coastguard Worker     ptr_prev_data[index] = curr_val;
1360*15dc779aSAndroid Build Coastguard Worker   }
1361*15dc779aSAndroid Build Coastguard Worker }
1362*15dc779aSAndroid Build Coastguard Worker 
1363*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE
ixheaace_compute_bits(WORD32 delta,WORD32 code_book_scf_lav_lvl,WORD32 code_book_scf_lav_balance,const UWORD8 * ptr_huff_tbl_lvl,const UWORD8 * ptr_huff_tbl_bal,WORD32 coupling,WORD32 ch,WORD32 * ptr_delta_bits)1364*15dc779aSAndroid Build Coastguard Worker ixheaace_compute_bits(WORD32 delta, WORD32 code_book_scf_lav_lvl,
1365*15dc779aSAndroid Build Coastguard Worker                       WORD32 code_book_scf_lav_balance, const UWORD8 *ptr_huff_tbl_lvl,
1366*15dc779aSAndroid Build Coastguard Worker                       const UWORD8 *ptr_huff_tbl_bal, WORD32 coupling, WORD32 ch,
1367*15dc779aSAndroid Build Coastguard Worker                       WORD32 *ptr_delta_bits) {
1368*15dc779aSAndroid Build Coastguard Worker   WORD32 index;
1369*15dc779aSAndroid Build Coastguard Worker   *ptr_delta_bits = 0;
1370*15dc779aSAndroid Build Coastguard Worker 
1371*15dc779aSAndroid Build Coastguard Worker   if (coupling) {
1372*15dc779aSAndroid Build Coastguard Worker     if (ch == 1) {
1373*15dc779aSAndroid Build Coastguard Worker       index = (delta < 0) ? ixheaac_max32(delta, -code_book_scf_lav_balance)
1374*15dc779aSAndroid Build Coastguard Worker                           : ixheaac_min32(delta, code_book_scf_lav_balance);
1375*15dc779aSAndroid Build Coastguard Worker 
1376*15dc779aSAndroid Build Coastguard Worker       if (index != delta) {
1377*15dc779aSAndroid Build Coastguard Worker         return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_BS;
1378*15dc779aSAndroid Build Coastguard Worker       }
1379*15dc779aSAndroid Build Coastguard Worker 
1380*15dc779aSAndroid Build Coastguard Worker       *ptr_delta_bits = ptr_huff_tbl_bal[index + code_book_scf_lav_balance];
1381*15dc779aSAndroid Build Coastguard Worker     } else {
1382*15dc779aSAndroid Build Coastguard Worker       index = (delta < 0) ? ixheaac_max32(delta, -code_book_scf_lav_lvl)
1383*15dc779aSAndroid Build Coastguard Worker                           : ixheaac_min32(delta, code_book_scf_lav_lvl);
1384*15dc779aSAndroid Build Coastguard Worker 
1385*15dc779aSAndroid Build Coastguard Worker       if (index != delta) {
1386*15dc779aSAndroid Build Coastguard Worker         return IA_EXHEAACE_EXE_FATAL_SBR_INVALID_BS;
1387*15dc779aSAndroid Build Coastguard Worker       }
1388*15dc779aSAndroid Build Coastguard Worker 
1389*15dc779aSAndroid Build Coastguard Worker       *ptr_delta_bits = ptr_huff_tbl_lvl[index + code_book_scf_lav_lvl];
1390*15dc779aSAndroid Build Coastguard Worker     }
1391*15dc779aSAndroid Build Coastguard Worker   } else {
1392*15dc779aSAndroid Build Coastguard Worker     index = (delta < 0) ? ixheaac_max32(delta, -code_book_scf_lav_lvl)
1393*15dc779aSAndroid Build Coastguard Worker                         : ixheaac_min32(delta, code_book_scf_lav_lvl);
1394*15dc779aSAndroid Build Coastguard Worker 
1395*15dc779aSAndroid Build Coastguard Worker     *ptr_delta_bits = ptr_huff_tbl_lvl[index + code_book_scf_lav_lvl];
1396*15dc779aSAndroid Build Coastguard Worker   }
1397*15dc779aSAndroid Build Coastguard Worker 
1398*15dc779aSAndroid Build Coastguard Worker   return IA_NO_ERROR;
1399*15dc779aSAndroid Build Coastguard Worker }
1400