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 <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include <math.h>
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker #include "iusace_bitbuffer.h"
25*15dc779aSAndroid Build Coastguard Worker
26*15dc779aSAndroid Build Coastguard Worker /* DRC */
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_common_enc.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
29*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
30*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
31*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_eq.h"
32*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc_filter_bank.h"
33*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_gain_enc.h"
34*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_struct_def.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_mps_common_define.h"
37*15dc779aSAndroid Build Coastguard Worker #include "iusace_cnst.h"
38*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
39*15dc779aSAndroid Build Coastguard Worker #include "iusace_psy_mod.h"
40*15dc779aSAndroid Build Coastguard Worker #include "iusace_tns_usac.h"
41*15dc779aSAndroid Build Coastguard Worker #include "iusace_config.h"
42*15dc779aSAndroid Build Coastguard Worker #include "iusace_arith_enc.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
44*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_const.h"
45*15dc779aSAndroid Build Coastguard Worker #include "iusace_block_switch_struct_def.h"
46*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_qc_util.h"
47*15dc779aSAndroid Build Coastguard Worker #include "iusace_fd_quant.h"
48*15dc779aSAndroid Build Coastguard Worker #include "iusace_ms.h"
49*15dc779aSAndroid Build Coastguard Worker #include "iusace_signal_classifier.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_asc_write.h"
53*15dc779aSAndroid Build Coastguard Worker #include "iusace_main.h"
54*15dc779aSAndroid Build Coastguard Worker #include "iusace_rom.h"
55*15dc779aSAndroid Build Coastguard Worker
iusace_write_scf_data(ia_bit_buf_struct * it_bit_buf,WORD32 max_sfb,WORD32 num_sfb,const WORD32 * ptr_scale_factors,WORD32 num_win_grps,WORD32 global_gain,const WORD32 huff_tab[CODE_BOOK_ALPHA_LAV][2])56*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_scf_data(ia_bit_buf_struct *it_bit_buf, WORD32 max_sfb, WORD32 num_sfb,
57*15dc779aSAndroid Build Coastguard Worker const WORD32 *ptr_scale_factors, WORD32 num_win_grps,
58*15dc779aSAndroid Build Coastguard Worker WORD32 global_gain, const WORD32 huff_tab[CODE_BOOK_ALPHA_LAV][2]) {
59*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = (it_bit_buf != NULL);
60*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, bit_count = 0;
61*15dc779aSAndroid Build Coastguard Worker WORD32 diff, length, codeword;
62*15dc779aSAndroid Build Coastguard Worker WORD32 index = 0;
63*15dc779aSAndroid Build Coastguard Worker WORD32 previous_scale_factor = global_gain;
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_win_grps; j++) {
66*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < max_sfb; i++) {
67*15dc779aSAndroid Build Coastguard Worker if (!((i == 0) && (j == 0))) {
68*15dc779aSAndroid Build Coastguard Worker diff = ptr_scale_factors[index] - previous_scale_factor;
69*15dc779aSAndroid Build Coastguard Worker length = huff_tab[diff + 60][0];
70*15dc779aSAndroid Build Coastguard Worker bit_count += length;
71*15dc779aSAndroid Build Coastguard Worker previous_scale_factor = ptr_scale_factors[index];
72*15dc779aSAndroid Build Coastguard Worker if (write_flag == 1) {
73*15dc779aSAndroid Build Coastguard Worker codeword = huff_tab[diff + 60][1];
74*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, codeword, (UWORD8)length);
75*15dc779aSAndroid Build Coastguard Worker }
76*15dc779aSAndroid Build Coastguard Worker }
77*15dc779aSAndroid Build Coastguard Worker index++;
78*15dc779aSAndroid Build Coastguard Worker }
79*15dc779aSAndroid Build Coastguard Worker for (; i < num_sfb; i++) {
80*15dc779aSAndroid Build Coastguard Worker index++;
81*15dc779aSAndroid Build Coastguard Worker }
82*15dc779aSAndroid Build Coastguard Worker }
83*15dc779aSAndroid Build Coastguard Worker
84*15dc779aSAndroid Build Coastguard Worker return (bit_count);
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker
iusace_write_ms_data(ia_bit_buf_struct * it_bit_buf,WORD32 ms_mask,WORD32 ms_used[MAX_SHORT_WINDOWS][MAX_SFB_LONG],WORD32 num_win_grps,WORD32 nr_of_sfb)87*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_ms_data(ia_bit_buf_struct *it_bit_buf, WORD32 ms_mask,
88*15dc779aSAndroid Build Coastguard Worker WORD32 ms_used[MAX_SHORT_WINDOWS][MAX_SFB_LONG], WORD32 num_win_grps,
89*15dc779aSAndroid Build Coastguard Worker WORD32 nr_of_sfb) {
90*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = (it_bit_buf != NULL);
91*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
92*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
93*15dc779aSAndroid Build Coastguard Worker WORD32 ms_mask_write = ms_mask;
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, ms_mask_write, 2);
96*15dc779aSAndroid Build Coastguard Worker bit_count += 2;
97*15dc779aSAndroid Build Coastguard Worker
98*15dc779aSAndroid Build Coastguard Worker if (ms_mask_write == 1) {
99*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_win_grps; i++) {
100*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < nr_of_sfb; j++) {
101*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, ms_used[i][j], 1);
102*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
103*15dc779aSAndroid Build Coastguard Worker }
104*15dc779aSAndroid Build Coastguard Worker }
105*15dc779aSAndroid Build Coastguard Worker }
106*15dc779aSAndroid Build Coastguard Worker
107*15dc779aSAndroid Build Coastguard Worker return bit_count;
108*15dc779aSAndroid Build Coastguard Worker }
109*15dc779aSAndroid Build Coastguard Worker
iusace_write_tns_data(ia_bit_buf_struct * it_bit_buf,ia_tns_info * pstr_tns_info,WORD32 window_sequence,WORD32 core_mode)110*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_tns_data(ia_bit_buf_struct *it_bit_buf, ia_tns_info *pstr_tns_info,
111*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence, WORD32 core_mode) {
112*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = (it_bit_buf != NULL);
113*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
114*15dc779aSAndroid Build Coastguard Worker WORD32 num_windows;
115*15dc779aSAndroid Build Coastguard Worker WORD32 len_tns_nfilt;
116*15dc779aSAndroid Build Coastguard Worker WORD32 len_tns_length;
117*15dc779aSAndroid Build Coastguard Worker WORD32 len_tns_order;
118*15dc779aSAndroid Build Coastguard Worker WORD32 filt;
119*15dc779aSAndroid Build Coastguard Worker WORD32 res_bits;
120*15dc779aSAndroid Build Coastguard Worker UWORD32 coeff;
121*15dc779aSAndroid Build Coastguard Worker WORD32 w;
122*15dc779aSAndroid Build Coastguard Worker
123*15dc779aSAndroid Build Coastguard Worker if (window_sequence == EIGHT_SHORT_SEQUENCE) {
124*15dc779aSAndroid Build Coastguard Worker num_windows = MAX_SHORT_WINDOWS;
125*15dc779aSAndroid Build Coastguard Worker len_tns_nfilt = 1;
126*15dc779aSAndroid Build Coastguard Worker len_tns_length = 4;
127*15dc779aSAndroid Build Coastguard Worker len_tns_order = 3;
128*15dc779aSAndroid Build Coastguard Worker } else {
129*15dc779aSAndroid Build Coastguard Worker num_windows = 1;
130*15dc779aSAndroid Build Coastguard Worker len_tns_nfilt = 2;
131*15dc779aSAndroid Build Coastguard Worker len_tns_length = 6;
132*15dc779aSAndroid Build Coastguard Worker len_tns_order = 4;
133*15dc779aSAndroid Build Coastguard Worker }
134*15dc779aSAndroid Build Coastguard Worker if (core_mode == 1) {
135*15dc779aSAndroid Build Coastguard Worker num_windows = 1;
136*15dc779aSAndroid Build Coastguard Worker }
137*15dc779aSAndroid Build Coastguard Worker
138*15dc779aSAndroid Build Coastguard Worker for (w = 0; w < num_windows; w++) {
139*15dc779aSAndroid Build Coastguard Worker ia_tns_window_data *ptr_win_data = &pstr_tns_info->window_data[w];
140*15dc779aSAndroid Build Coastguard Worker WORD32 n_filt = ptr_win_data->n_filt;
141*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
142*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, n_filt, (UWORD8)len_tns_nfilt);
143*15dc779aSAndroid Build Coastguard Worker }
144*15dc779aSAndroid Build Coastguard Worker bit_count += len_tns_nfilt;
145*15dc779aSAndroid Build Coastguard Worker if (n_filt) {
146*15dc779aSAndroid Build Coastguard Worker res_bits = ptr_win_data->coef_res;
147*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
148*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, res_bits - DEF_TNS_RES_OFFSET, 1);
149*15dc779aSAndroid Build Coastguard Worker }
150*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
151*15dc779aSAndroid Build Coastguard Worker for (filt = 0; filt < n_filt; filt++) {
152*15dc779aSAndroid Build Coastguard Worker ia_tns_filter_data *ptr_tns_filt = &ptr_win_data->tns_filter[filt];
153*15dc779aSAndroid Build Coastguard Worker WORD32 order = ptr_tns_filt->order;
154*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
155*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, ptr_tns_filt->length, (UWORD8)len_tns_length);
156*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, order, (UWORD8)len_tns_order);
157*15dc779aSAndroid Build Coastguard Worker }
158*15dc779aSAndroid Build Coastguard Worker bit_count += (len_tns_length + len_tns_order);
159*15dc779aSAndroid Build Coastguard Worker if (order) {
160*15dc779aSAndroid Build Coastguard Worker WORD32 i;
161*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
162*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, ptr_tns_filt->direction, 1);
163*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, ptr_tns_filt->coef_compress, 1);
164*15dc779aSAndroid Build Coastguard Worker }
165*15dc779aSAndroid Build Coastguard Worker bit_count += 2;
166*15dc779aSAndroid Build Coastguard Worker for (i = 1; i <= order; i++) {
167*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
168*15dc779aSAndroid Build Coastguard Worker coeff = (UWORD32)(ptr_tns_filt->index[i]) & ((1 << res_bits) - 1);
169*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, coeff, (UWORD8)res_bits);
170*15dc779aSAndroid Build Coastguard Worker }
171*15dc779aSAndroid Build Coastguard Worker bit_count += res_bits;
172*15dc779aSAndroid Build Coastguard Worker }
173*15dc779aSAndroid Build Coastguard Worker }
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker }
176*15dc779aSAndroid Build Coastguard Worker }
177*15dc779aSAndroid Build Coastguard Worker
178*15dc779aSAndroid Build Coastguard Worker return bit_count;
179*15dc779aSAndroid Build Coastguard Worker }
180*15dc779aSAndroid Build Coastguard Worker
iusace_calc_grouping_bits(const WORD32 * ptr_win_grp_len,WORD32 num_win_grps)181*15dc779aSAndroid Build Coastguard Worker static WORD32 iusace_calc_grouping_bits(const WORD32 *ptr_win_grp_len, WORD32 num_win_grps) {
182*15dc779aSAndroid Build Coastguard Worker WORD32 grouping_bits = 0;
183*15dc779aSAndroid Build Coastguard Worker WORD32 tmp[8] = {0};
184*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
185*15dc779aSAndroid Build Coastguard Worker WORD32 index = 0;
186*15dc779aSAndroid Build Coastguard Worker
187*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_win_grps; i++) {
188*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < ptr_win_grp_len[i]; j++) {
189*15dc779aSAndroid Build Coastguard Worker tmp[index++] = i;
190*15dc779aSAndroid Build Coastguard Worker }
191*15dc779aSAndroid Build Coastguard Worker }
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker for (i = 1; i < 8; i++) {
194*15dc779aSAndroid Build Coastguard Worker grouping_bits = grouping_bits << 1;
195*15dc779aSAndroid Build Coastguard Worker if (tmp[i] == tmp[i - 1]) {
196*15dc779aSAndroid Build Coastguard Worker grouping_bits++;
197*15dc779aSAndroid Build Coastguard Worker }
198*15dc779aSAndroid Build Coastguard Worker }
199*15dc779aSAndroid Build Coastguard Worker
200*15dc779aSAndroid Build Coastguard Worker return (grouping_bits);
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker
iusace_write_ics_info(ia_bit_buf_struct * it_bit_buf,ia_sfb_params_struct * pstr_sfb_prms,WORD32 ch)203*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_ics_info(ia_bit_buf_struct *it_bit_buf, ia_sfb_params_struct *pstr_sfb_prms,
204*15dc779aSAndroid Build Coastguard Worker WORD32 ch) {
205*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = (it_bit_buf != NULL);
206*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
207*15dc779aSAndroid Build Coastguard Worker WORD32 win_seq = 0;
208*15dc779aSAndroid Build Coastguard Worker WORD32 grouping_bits = 0;
209*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb = pstr_sfb_prms->max_sfb[ch];
210*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence = pstr_sfb_prms->window_sequence[ch];
211*15dc779aSAndroid Build Coastguard Worker WORD32 window_shape = pstr_sfb_prms->window_shape[ch];
212*15dc779aSAndroid Build Coastguard Worker WORD32 num_win_grps = pstr_sfb_prms->num_window_groups[ch];
213*15dc779aSAndroid Build Coastguard Worker
214*15dc779aSAndroid Build Coastguard Worker switch (window_sequence) {
215*15dc779aSAndroid Build Coastguard Worker case EIGHT_SHORT_SEQUENCE:
216*15dc779aSAndroid Build Coastguard Worker win_seq = 2;
217*15dc779aSAndroid Build Coastguard Worker break;
218*15dc779aSAndroid Build Coastguard Worker case ONLY_LONG_SEQUENCE:
219*15dc779aSAndroid Build Coastguard Worker win_seq = 0;
220*15dc779aSAndroid Build Coastguard Worker break;
221*15dc779aSAndroid Build Coastguard Worker case LONG_START_SEQUENCE:
222*15dc779aSAndroid Build Coastguard Worker case STOP_START_SEQUENCE:
223*15dc779aSAndroid Build Coastguard Worker win_seq = 1;
224*15dc779aSAndroid Build Coastguard Worker break;
225*15dc779aSAndroid Build Coastguard Worker case LONG_STOP_SEQUENCE:
226*15dc779aSAndroid Build Coastguard Worker win_seq = 3;
227*15dc779aSAndroid Build Coastguard Worker break;
228*15dc779aSAndroid Build Coastguard Worker default:
229*15dc779aSAndroid Build Coastguard Worker win_seq = 3;
230*15dc779aSAndroid Build Coastguard Worker break;
231*15dc779aSAndroid Build Coastguard Worker }
232*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, win_seq, 2);
233*15dc779aSAndroid Build Coastguard Worker bit_count += 2;
234*15dc779aSAndroid Build Coastguard Worker
235*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, window_shape, 1);
236*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker if (window_sequence == EIGHT_SHORT_SEQUENCE) {
239*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, max_sfb, 4);
240*15dc779aSAndroid Build Coastguard Worker bit_count += 4;
241*15dc779aSAndroid Build Coastguard Worker
242*15dc779aSAndroid Build Coastguard Worker grouping_bits =
243*15dc779aSAndroid Build Coastguard Worker iusace_calc_grouping_bits(pstr_sfb_prms->window_group_length[ch], num_win_grps);
244*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, grouping_bits, 7);
245*15dc779aSAndroid Build Coastguard Worker bit_count += 7;
246*15dc779aSAndroid Build Coastguard Worker } else {
247*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, max_sfb, 6);
248*15dc779aSAndroid Build Coastguard Worker bit_count += 6;
249*15dc779aSAndroid Build Coastguard Worker }
250*15dc779aSAndroid Build Coastguard Worker
251*15dc779aSAndroid Build Coastguard Worker return (bit_count);
252*15dc779aSAndroid Build Coastguard Worker }
253*15dc779aSAndroid Build Coastguard Worker
iusace_write_cplx_pred_data(ia_bit_buf_struct * it_bit_buf,WORD32 num_win_grps,WORD32 num_sfb,WORD32 complex_coef,WORD32 pred_coeffs_re[MAX_SHORT_WINDOWS][MAX_SFB_LONG],WORD32 pred_coeffs_im[MAX_SHORT_WINDOWS][MAX_SFB_LONG],const WORD32 huff_tab[CODE_BOOK_ALPHA_LAV][2],WORD32 const usac_independency_flg,WORD32 pred_dir,WORD32 cplx_pred_used[MAX_SHORT_WINDOWS][MAX_SFB_LONG],WORD32 cplx_pred_all,WORD32 * ptr_prev_alpha_coeff_re,WORD32 * ptr_prev_alpha_coeff_im,WORD32 * delta_code_time)254*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_cplx_pred_data(ia_bit_buf_struct *it_bit_buf, WORD32 num_win_grps,
255*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb, WORD32 complex_coef,
256*15dc779aSAndroid Build Coastguard Worker WORD32 pred_coeffs_re[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
257*15dc779aSAndroid Build Coastguard Worker WORD32 pred_coeffs_im[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
258*15dc779aSAndroid Build Coastguard Worker const WORD32 huff_tab[CODE_BOOK_ALPHA_LAV][2],
259*15dc779aSAndroid Build Coastguard Worker WORD32 const usac_independency_flg, WORD32 pred_dir,
260*15dc779aSAndroid Build Coastguard Worker WORD32 cplx_pred_used[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
261*15dc779aSAndroid Build Coastguard Worker WORD32 cplx_pred_all, WORD32 *ptr_prev_alpha_coeff_re,
262*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_prev_alpha_coeff_im, WORD32 *delta_code_time) {
263*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = (it_bit_buf != NULL);
264*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
265*15dc779aSAndroid Build Coastguard Worker WORD32 i, j;
266*15dc779aSAndroid Build Coastguard Worker WORD32 g;
267*15dc779aSAndroid Build Coastguard Worker WORD32 sfb;
268*15dc779aSAndroid Build Coastguard Worker const WORD32 sfb_per_pred_band = 2;
269*15dc779aSAndroid Build Coastguard Worker WORD32 length_temp1_re[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
270*15dc779aSAndroid Build Coastguard Worker length_temp2_re[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
271*15dc779aSAndroid Build Coastguard Worker length_temp1_im[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
272*15dc779aSAndroid Build Coastguard Worker length_temp2_im[MAX_SHORT_WINDOWS][MAX_SFB_LONG];
273*15dc779aSAndroid Build Coastguard Worker WORD32 code_word_temp1_re[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
274*15dc779aSAndroid Build Coastguard Worker code_word_temp2_re[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
275*15dc779aSAndroid Build Coastguard Worker code_word_temp1_im[MAX_SHORT_WINDOWS][MAX_SFB_LONG],
276*15dc779aSAndroid Build Coastguard Worker code_word_temp2_im[MAX_SHORT_WINDOWS][MAX_SFB_LONG];
277*15dc779aSAndroid Build Coastguard Worker WORD32 length_tot1 = 0, length_tot2 = 0;
278*15dc779aSAndroid Build Coastguard Worker
279*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, cplx_pred_all, 1);
280*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
281*15dc779aSAndroid Build Coastguard Worker
282*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_all == 0) {
283*15dc779aSAndroid Build Coastguard Worker for (g = 0; g < num_win_grps; g++) {
284*15dc779aSAndroid Build Coastguard Worker for (sfb = 0; sfb < num_sfb; sfb += sfb_per_pred_band) {
285*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, cplx_pred_used[g][sfb], 1);
286*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
287*15dc779aSAndroid Build Coastguard Worker }
288*15dc779aSAndroid Build Coastguard Worker }
289*15dc779aSAndroid Build Coastguard Worker }
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, pred_dir, 1);
292*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
293*15dc779aSAndroid Build Coastguard Worker
294*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, complex_coef, 1);
295*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker if (complex_coef) {
298*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
299*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, 1, 1); /* use_prev_frame */
300*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
301*15dc779aSAndroid Build Coastguard Worker }
302*15dc779aSAndroid Build Coastguard Worker }
303*15dc779aSAndroid Build Coastguard Worker
304*15dc779aSAndroid Build Coastguard Worker if (usac_independency_flg) {
305*15dc779aSAndroid Build Coastguard Worker *delta_code_time = 0;
306*15dc779aSAndroid Build Coastguard Worker }
307*15dc779aSAndroid Build Coastguard Worker
308*15dc779aSAndroid Build Coastguard Worker /* Switching mechanism for delta_code_time */
309*15dc779aSAndroid Build Coastguard Worker WORD32 prev_pred_coeff_re_temp1 = 0, prev_pred_coeff_re_temp2 = 0;
310*15dc779aSAndroid Build Coastguard Worker WORD32 diff_pred_coeff_re_temp1 = 0, diff_pred_coeff_re_temp2 = 0;
311*15dc779aSAndroid Build Coastguard Worker WORD32 prev_pred_coeff_im_temp1 = 0, prev_pred_coeff_im_temp2 = 0;
312*15dc779aSAndroid Build Coastguard Worker WORD32 diff_pred_coeff_im_temp1 = 0, diff_pred_coeff_im_temp2 = 0;
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_win_grps; i++) {
315*15dc779aSAndroid Build Coastguard Worker /* delta_code_time = 0*/
316*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_re_temp1 = 0;
317*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
318*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_im_temp1 = 0;
319*15dc779aSAndroid Build Coastguard Worker }
320*15dc779aSAndroid Build Coastguard Worker
321*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sfb; j += 2) {
322*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
323*15dc779aSAndroid Build Coastguard Worker /* delta_code_time = 1*/
324*15dc779aSAndroid Build Coastguard Worker if (i > 0) {
325*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_re_temp2 = pred_coeffs_re[i - 1][j];
326*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
327*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_im_temp2 = pred_coeffs_im[i - 1][j];
328*15dc779aSAndroid Build Coastguard Worker }
329*15dc779aSAndroid Build Coastguard Worker } else {
330*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_re_temp2 = ptr_prev_alpha_coeff_re[j];
331*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
332*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_im_temp2 = ptr_prev_alpha_coeff_im[j];
333*15dc779aSAndroid Build Coastguard Worker }
334*15dc779aSAndroid Build Coastguard Worker }
335*15dc779aSAndroid Build Coastguard Worker }
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[i][j] == 1) {
338*15dc779aSAndroid Build Coastguard Worker /*Differential Huffman coding of real prediction coefficients*/
339*15dc779aSAndroid Build Coastguard Worker diff_pred_coeff_re_temp1 =
340*15dc779aSAndroid Build Coastguard Worker pred_coeffs_re[i][j] - prev_pred_coeff_re_temp1; /* delta_code_time = 0 */
341*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_re_temp1 = pred_coeffs_re[i][j]; /* delta_code_time = 0 */
342*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
343*15dc779aSAndroid Build Coastguard Worker diff_pred_coeff_re_temp2 =
344*15dc779aSAndroid Build Coastguard Worker pred_coeffs_re[i][j] - prev_pred_coeff_re_temp2; /* delta_code_time = 1 */
345*15dc779aSAndroid Build Coastguard Worker }
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker /* delta_code_time = 0 */
348*15dc779aSAndroid Build Coastguard Worker length_temp1_re[i][j] = huff_tab[diff_pred_coeff_re_temp1 + 60][0];
349*15dc779aSAndroid Build Coastguard Worker code_word_temp1_re[i][j] = huff_tab[diff_pred_coeff_re_temp1 + 60][1];
350*15dc779aSAndroid Build Coastguard Worker
351*15dc779aSAndroid Build Coastguard Worker length_tot1 += length_temp1_re[i][j];
352*15dc779aSAndroid Build Coastguard Worker
353*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
354*15dc779aSAndroid Build Coastguard Worker /*delta_code_time = 1 */
355*15dc779aSAndroid Build Coastguard Worker length_temp2_re[i][j] = huff_tab[diff_pred_coeff_re_temp2 + 60][0];
356*15dc779aSAndroid Build Coastguard Worker code_word_temp2_re[i][j] = huff_tab[diff_pred_coeff_re_temp2 + 60][1];
357*15dc779aSAndroid Build Coastguard Worker
358*15dc779aSAndroid Build Coastguard Worker length_tot2 += length_temp2_re[i][j];
359*15dc779aSAndroid Build Coastguard Worker }
360*15dc779aSAndroid Build Coastguard Worker
361*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
362*15dc779aSAndroid Build Coastguard Worker /*Differential Huffman coding of imaginary prediction coefficients*/
363*15dc779aSAndroid Build Coastguard Worker diff_pred_coeff_im_temp1 =
364*15dc779aSAndroid Build Coastguard Worker pred_coeffs_im[i][j] - prev_pred_coeff_im_temp1; /* delta_code_time = 0 */
365*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_im_temp1 = pred_coeffs_im[i][j]; /* delta_code_time = 0*/
366*15dc779aSAndroid Build Coastguard Worker
367*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
368*15dc779aSAndroid Build Coastguard Worker diff_pred_coeff_im_temp2 =
369*15dc779aSAndroid Build Coastguard Worker pred_coeffs_im[i][j] - prev_pred_coeff_im_temp2; /* delta_code_time = 1 */
370*15dc779aSAndroid Build Coastguard Worker }
371*15dc779aSAndroid Build Coastguard Worker
372*15dc779aSAndroid Build Coastguard Worker /*delta_code_time = 0*/
373*15dc779aSAndroid Build Coastguard Worker length_temp1_im[i][j] = huff_tab[diff_pred_coeff_im_temp1 + 60][0];
374*15dc779aSAndroid Build Coastguard Worker code_word_temp1_im[i][j] = huff_tab[diff_pred_coeff_im_temp1 + 60][1];
375*15dc779aSAndroid Build Coastguard Worker
376*15dc779aSAndroid Build Coastguard Worker length_tot1 += length_temp1_im[i][j];
377*15dc779aSAndroid Build Coastguard Worker
378*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
379*15dc779aSAndroid Build Coastguard Worker /*delta_code_time = 1*/
380*15dc779aSAndroid Build Coastguard Worker length_temp2_im[i][j] = huff_tab[diff_pred_coeff_im_temp2 + 60][0];
381*15dc779aSAndroid Build Coastguard Worker code_word_temp2_im[i][j] = huff_tab[diff_pred_coeff_im_temp2 + 60][1];
382*15dc779aSAndroid Build Coastguard Worker
383*15dc779aSAndroid Build Coastguard Worker length_tot2 += length_temp2_im[i][j];
384*15dc779aSAndroid Build Coastguard Worker }
385*15dc779aSAndroid Build Coastguard Worker }
386*15dc779aSAndroid Build Coastguard Worker } else {
387*15dc779aSAndroid Build Coastguard Worker pred_coeffs_re[i][j] = 0;
388*15dc779aSAndroid Build Coastguard Worker /*delta_code_time = 0*/
389*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_re_temp1 = pred_coeffs_re[i][j];
390*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
391*15dc779aSAndroid Build Coastguard Worker pred_coeffs_im[i][j] = 0;
392*15dc779aSAndroid Build Coastguard Worker /*delta_code_time = 0*/
393*15dc779aSAndroid Build Coastguard Worker prev_pred_coeff_im_temp1 = pred_coeffs_im[i][j];
394*15dc779aSAndroid Build Coastguard Worker }
395*15dc779aSAndroid Build Coastguard Worker }
396*15dc779aSAndroid Build Coastguard Worker
397*15dc779aSAndroid Build Coastguard Worker ptr_prev_alpha_coeff_re[j] = pred_coeffs_re[i][j];
398*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
399*15dc779aSAndroid Build Coastguard Worker ptr_prev_alpha_coeff_im[j] = pred_coeffs_im[i][j];
400*15dc779aSAndroid Build Coastguard Worker }
401*15dc779aSAndroid Build Coastguard Worker }
402*15dc779aSAndroid Build Coastguard Worker
403*15dc779aSAndroid Build Coastguard Worker for (j = num_sfb; j < MAX_SFB_LONG; j++) {
404*15dc779aSAndroid Build Coastguard Worker pred_coeffs_re[i][j] = 0;
405*15dc779aSAndroid Build Coastguard Worker ptr_prev_alpha_coeff_re[j] = 0;
406*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
407*15dc779aSAndroid Build Coastguard Worker pred_coeffs_im[i][j] = 0;
408*15dc779aSAndroid Build Coastguard Worker ptr_prev_alpha_coeff_im[j] = 0;
409*15dc779aSAndroid Build Coastguard Worker }
410*15dc779aSAndroid Build Coastguard Worker }
411*15dc779aSAndroid Build Coastguard Worker }
412*15dc779aSAndroid Build Coastguard Worker
413*15dc779aSAndroid Build Coastguard Worker /*Make a decison on the value of delta_code_time per frame */
414*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
415*15dc779aSAndroid Build Coastguard Worker // Compare the code-word lengths
416*15dc779aSAndroid Build Coastguard Worker if (length_tot1 <= length_tot2) {
417*15dc779aSAndroid Build Coastguard Worker *delta_code_time = 0;
418*15dc779aSAndroid Build Coastguard Worker } else {
419*15dc779aSAndroid Build Coastguard Worker *delta_code_time = 1;
420*15dc779aSAndroid Build Coastguard Worker }
421*15dc779aSAndroid Build Coastguard Worker
422*15dc779aSAndroid Build Coastguard Worker /* Write the value of delta_code_time to bitstream */
423*15dc779aSAndroid Build Coastguard Worker if (write_flag) iusace_write_bits_buf(it_bit_buf, *delta_code_time, 1);
424*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
425*15dc779aSAndroid Build Coastguard Worker }
426*15dc779aSAndroid Build Coastguard Worker
427*15dc779aSAndroid Build Coastguard Worker if (*delta_code_time == 0) {
428*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_win_grps; i++) {
429*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sfb; j += 2) {
430*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[i][j] == 1) {
431*15dc779aSAndroid Build Coastguard Worker if (write_flag)
432*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, code_word_temp1_re[i][j],
433*15dc779aSAndroid Build Coastguard Worker (UWORD8)length_temp1_re[i][j]);
434*15dc779aSAndroid Build Coastguard Worker bit_count += length_temp1_re[i][j];
435*15dc779aSAndroid Build Coastguard Worker
436*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
437*15dc779aSAndroid Build Coastguard Worker if (write_flag)
438*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, code_word_temp1_im[i][j],
439*15dc779aSAndroid Build Coastguard Worker (UWORD8)length_temp1_im[i][j]);
440*15dc779aSAndroid Build Coastguard Worker bit_count += length_temp1_im[i][j];
441*15dc779aSAndroid Build Coastguard Worker }
442*15dc779aSAndroid Build Coastguard Worker }
443*15dc779aSAndroid Build Coastguard Worker }
444*15dc779aSAndroid Build Coastguard Worker }
445*15dc779aSAndroid Build Coastguard Worker } else {
446*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_win_grps; i++) {
447*15dc779aSAndroid Build Coastguard Worker for (j = 0; j < num_sfb; j += 2) {
448*15dc779aSAndroid Build Coastguard Worker if (cplx_pred_used[i][j] == 1) {
449*15dc779aSAndroid Build Coastguard Worker if (write_flag)
450*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, code_word_temp2_re[i][j],
451*15dc779aSAndroid Build Coastguard Worker (UWORD8)length_temp2_re[i][j]);
452*15dc779aSAndroid Build Coastguard Worker bit_count += length_temp2_re[i][j];
453*15dc779aSAndroid Build Coastguard Worker
454*15dc779aSAndroid Build Coastguard Worker if (complex_coef == 1) {
455*15dc779aSAndroid Build Coastguard Worker if (write_flag)
456*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, code_word_temp2_im[i][j],
457*15dc779aSAndroid Build Coastguard Worker (UWORD8)length_temp2_im[i][j]);
458*15dc779aSAndroid Build Coastguard Worker bit_count += length_temp2_im[i][j];
459*15dc779aSAndroid Build Coastguard Worker }
460*15dc779aSAndroid Build Coastguard Worker }
461*15dc779aSAndroid Build Coastguard Worker }
462*15dc779aSAndroid Build Coastguard Worker }
463*15dc779aSAndroid Build Coastguard Worker }
464*15dc779aSAndroid Build Coastguard Worker
465*15dc779aSAndroid Build Coastguard Worker return bit_count;
466*15dc779aSAndroid Build Coastguard Worker }
467*15dc779aSAndroid Build Coastguard Worker
iusace_write_cpe(ia_sfb_params_struct * pstr_sfb_prms,ia_bit_buf_struct * it_bit_buf,WORD32 * tns_data_present,WORD32 const usac_independency_flg,ia_usac_encoder_config_struct * pstr_usac_config,ia_usac_data_struct * pstr_usac_data,WORD32 ch)468*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_cpe(ia_sfb_params_struct *pstr_sfb_prms, ia_bit_buf_struct *it_bit_buf,
469*15dc779aSAndroid Build Coastguard Worker WORD32 *tns_data_present, WORD32 const usac_independency_flg,
470*15dc779aSAndroid Build Coastguard Worker ia_usac_encoder_config_struct *pstr_usac_config,
471*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *pstr_usac_data, WORD32 ch) {
472*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
473*15dc779aSAndroid Build Coastguard Worker WORD32 ms_mask = pstr_usac_data->str_ms_info[ch].ms_mask;
474*15dc779aSAndroid Build Coastguard Worker WORD32 common_max_sfb = 1;
475*15dc779aSAndroid Build Coastguard Worker WORD32 tns_active = tns_data_present[0] || tns_data_present[1];
476*15dc779aSAndroid Build Coastguard Worker ia_tns_info *pstr_tns_info = pstr_usac_data->pstr_tns_info[ch];
477*15dc779aSAndroid Build Coastguard Worker (VOID) pstr_usac_config;
478*15dc779aSAndroid Build Coastguard Worker
479*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, tns_active, 1);
480*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
481*15dc779aSAndroid Build Coastguard Worker
482*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, pstr_sfb_prms->common_win[ch], 1);
483*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
484*15dc779aSAndroid Build Coastguard Worker
485*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->max_sfb[ch] != pstr_sfb_prms->max_sfb[ch + 1]) {
486*15dc779aSAndroid Build Coastguard Worker common_max_sfb = 0;
487*15dc779aSAndroid Build Coastguard Worker }
488*15dc779aSAndroid Build Coastguard Worker
489*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->common_win[ch]) {
490*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_write_ics_info(it_bit_buf, pstr_sfb_prms, ch);
491*15dc779aSAndroid Build Coastguard Worker
492*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, common_max_sfb, 1);
493*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
494*15dc779aSAndroid Build Coastguard Worker
495*15dc779aSAndroid Build Coastguard Worker if (common_max_sfb == 0) {
496*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->window_sequence[ch] != EIGHT_SHORT_SEQUENCE) {
497*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, pstr_sfb_prms->max_sfb[ch + 1], 6);
498*15dc779aSAndroid Build Coastguard Worker bit_count += 6;
499*15dc779aSAndroid Build Coastguard Worker } else {
500*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, pstr_sfb_prms->max_sfb[ch + 1], 4);
501*15dc779aSAndroid Build Coastguard Worker bit_count += 4;
502*15dc779aSAndroid Build Coastguard Worker }
503*15dc779aSAndroid Build Coastguard Worker }
504*15dc779aSAndroid Build Coastguard Worker
505*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->max_sfb_ste = MAX(pstr_sfb_prms->max_sfb[ch], pstr_sfb_prms->max_sfb[ch + 1]);
506*15dc779aSAndroid Build Coastguard Worker
507*15dc779aSAndroid Build Coastguard Worker bit_count +=
508*15dc779aSAndroid Build Coastguard Worker iusace_write_ms_data(it_bit_buf, ms_mask, pstr_usac_data->str_ms_info[ch].ms_used,
509*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->num_window_groups[ch], pstr_sfb_prms->max_sfb_ste);
510*15dc779aSAndroid Build Coastguard Worker
511*15dc779aSAndroid Build Coastguard Worker {
512*15dc779aSAndroid Build Coastguard Worker if ((ms_mask == 3) && (pstr_usac_data->stereo_config_index == 0)) {
513*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_write_cplx_pred_data(
514*15dc779aSAndroid Build Coastguard Worker it_bit_buf, pstr_sfb_prms->num_window_groups[ch], pstr_sfb_prms->max_sfb_ste,
515*15dc779aSAndroid Build Coastguard Worker pstr_usac_data->complex_coef[ch], pstr_usac_data->pred_coef_re[ch],
516*15dc779aSAndroid Build Coastguard Worker pstr_usac_data->pred_coef_im[ch], iusace_huffman_code_table, usac_independency_flg,
517*15dc779aSAndroid Build Coastguard Worker pstr_usac_data->pred_dir_idx[ch], pstr_usac_data->cplx_pred_used[ch],
518*15dc779aSAndroid Build Coastguard Worker pstr_usac_data->cplx_pred_all[ch], pstr_usac_data->pred_coef_re_prev[ch],
519*15dc779aSAndroid Build Coastguard Worker pstr_usac_data->pred_coef_im_prev[ch], &pstr_usac_data->delta_code_time[ch]);
520*15dc779aSAndroid Build Coastguard Worker }
521*15dc779aSAndroid Build Coastguard Worker }
522*15dc779aSAndroid Build Coastguard Worker }
523*15dc779aSAndroid Build Coastguard Worker
524*15dc779aSAndroid Build Coastguard Worker if (tns_active) {
525*15dc779aSAndroid Build Coastguard Worker WORD32 common_tns = 0;
526*15dc779aSAndroid Build Coastguard Worker WORD32 tns_on_lr = 1;
527*15dc779aSAndroid Build Coastguard Worker WORD32 tns_present_both = tns_data_present[0] && tns_data_present[1];
528*15dc779aSAndroid Build Coastguard Worker WORD32 tns_data_present1 = tns_data_present[1];
529*15dc779aSAndroid Build Coastguard Worker
530*15dc779aSAndroid Build Coastguard Worker if (pstr_sfb_prms->common_win[ch]) {
531*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, common_tns, 1);
532*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
533*15dc779aSAndroid Build Coastguard Worker }
534*15dc779aSAndroid Build Coastguard Worker
535*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, tns_on_lr, 1);
536*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
537*15dc779aSAndroid Build Coastguard Worker
538*15dc779aSAndroid Build Coastguard Worker if (common_tns) {
539*15dc779aSAndroid Build Coastguard Worker bit_count +=
540*15dc779aSAndroid Build Coastguard Worker iusace_write_tns_data(it_bit_buf, pstr_tns_info, pstr_sfb_prms->window_sequence[ch], 0);
541*15dc779aSAndroid Build Coastguard Worker } else {
542*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, tns_present_both, 1);
543*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
544*15dc779aSAndroid Build Coastguard Worker
545*15dc779aSAndroid Build Coastguard Worker if (!tns_present_both) {
546*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, tns_data_present1, 1);
547*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
548*15dc779aSAndroid Build Coastguard Worker }
549*15dc779aSAndroid Build Coastguard Worker }
550*15dc779aSAndroid Build Coastguard Worker }
551*15dc779aSAndroid Build Coastguard Worker
552*15dc779aSAndroid Build Coastguard Worker return (bit_count);
553*15dc779aSAndroid Build Coastguard Worker }
554*15dc779aSAndroid Build Coastguard Worker
iusace_write_fd_data(ia_bit_buf_struct * it_bit_buf,ia_sfb_params_struct * pstr_sfb_prms,WORD32 num_fac_bits,WORD32 usac_independency_flg,ia_usac_data_struct * pstr_usac_data,ia_usac_encoder_config_struct * pstr_usac_config,WORD32 ch_idx,WORD32 ele_id,WORD32 idx)555*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_fd_data(ia_bit_buf_struct *it_bit_buf, ia_sfb_params_struct *pstr_sfb_prms,
556*15dc779aSAndroid Build Coastguard Worker WORD32 num_fac_bits, WORD32 usac_independency_flg,
557*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *pstr_usac_data,
558*15dc779aSAndroid Build Coastguard Worker ia_usac_encoder_config_struct *pstr_usac_config, WORD32 ch_idx,
559*15dc779aSAndroid Build Coastguard Worker WORD32 ele_id, WORD32 idx) {
560*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
561*15dc779aSAndroid Build Coastguard Worker WORD32 fac_data_present = (num_fac_bits > 0) ? 1 : 0;
562*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_fac_data = pstr_usac_data->fac_out_stream[ch_idx];
563*15dc779aSAndroid Build Coastguard Worker
564*15dc779aSAndroid Build Coastguard Worker WORD32 is_noise_filling = pstr_usac_data->noise_filling[ele_id];
565*15dc779aSAndroid Build Coastguard Worker WORD32 common_window = pstr_sfb_prms->common_win[ch_idx];
566*15dc779aSAndroid Build Coastguard Worker ia_usac_quant_info_struct *pstr_quant_info = &(pstr_usac_data->str_quant_info[idx]);
567*15dc779aSAndroid Build Coastguard Worker ia_tns_info *pstr_tns_info = pstr_usac_data->pstr_tns_info[ch_idx];
568*15dc779aSAndroid Build Coastguard Worker WORD32 global_gain = pstr_usac_data->str_quant_info[idx].scale_factor[0];
569*15dc779aSAndroid Build Coastguard Worker
570*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, global_gain, 8);
571*15dc779aSAndroid Build Coastguard Worker bit_count += 8;
572*15dc779aSAndroid Build Coastguard Worker
573*15dc779aSAndroid Build Coastguard Worker if (is_noise_filling) {
574*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, pstr_usac_data->noise_level[idx], 3);
575*15dc779aSAndroid Build Coastguard Worker
576*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, pstr_usac_data->noise_offset[idx], 5);
577*15dc779aSAndroid Build Coastguard Worker bit_count += 8;
578*15dc779aSAndroid Build Coastguard Worker }
579*15dc779aSAndroid Build Coastguard Worker
580*15dc779aSAndroid Build Coastguard Worker if (!common_window) {
581*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_write_ics_info(it_bit_buf, pstr_sfb_prms, ch_idx);
582*15dc779aSAndroid Build Coastguard Worker }
583*15dc779aSAndroid Build Coastguard Worker
584*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_write_scf_data(
585*15dc779aSAndroid Build Coastguard Worker it_bit_buf, pstr_sfb_prms->max_sfb[ch_idx], pstr_sfb_prms->num_sfb[ch_idx],
586*15dc779aSAndroid Build Coastguard Worker pstr_quant_info->scale_factor, pstr_sfb_prms->num_window_groups[ch_idx], global_gain,
587*15dc779aSAndroid Build Coastguard Worker iusace_huffman_code_table);
588*15dc779aSAndroid Build Coastguard Worker
589*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info != NULL && pstr_tns_info->tns_data_present == 1) {
590*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_write_tns_data(it_bit_buf, pstr_tns_info,
591*15dc779aSAndroid Build Coastguard Worker pstr_sfb_prms->window_sequence[ch_idx], 0);
592*15dc779aSAndroid Build Coastguard Worker }
593*15dc779aSAndroid Build Coastguard Worker
594*15dc779aSAndroid Build Coastguard Worker if (!usac_independency_flg) {
595*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, pstr_quant_info->reset, 1);
596*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
597*15dc779aSAndroid Build Coastguard Worker }
598*15dc779aSAndroid Build Coastguard Worker
599*15dc779aSAndroid Build Coastguard Worker if (pstr_quant_info->max_spec_coeffs == FRAME_LEN_SHORT_768) {
600*15dc779aSAndroid Build Coastguard Worker pstr_quant_info->max_spec_coeffs = pstr_quant_info->max_spec_coeffs;
601*15dc779aSAndroid Build Coastguard Worker }
602*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_arith_enc_spec(
603*15dc779aSAndroid Build Coastguard Worker it_bit_buf, pstr_sfb_prms->window_sequence[ch_idx], pstr_quant_info->quant_degroup,
604*15dc779aSAndroid Build Coastguard Worker pstr_quant_info->max_spec_coeffs, pstr_quant_info->c_pres, pstr_quant_info->c_prev,
605*15dc779aSAndroid Build Coastguard Worker &(pstr_quant_info->arith_size_prev), usac_independency_flg || pstr_quant_info->reset,
606*15dc779aSAndroid Build Coastguard Worker pstr_usac_config->ccfl);
607*15dc779aSAndroid Build Coastguard Worker
608*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, fac_data_present, 1);
609*15dc779aSAndroid Build Coastguard Worker bit_count += 1;
610*15dc779aSAndroid Build Coastguard Worker
611*15dc779aSAndroid Build Coastguard Worker if (fac_data_present) {
612*15dc779aSAndroid Build Coastguard Worker WORD32 i;
613*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_fac_bits; i += 8) {
614*15dc779aSAndroid Build Coastguard Worker WORD32 bits_to_write = MIN(8, num_fac_bits - i);
615*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, ptr_fac_data[i / 8] >> (8 - bits_to_write),
616*15dc779aSAndroid Build Coastguard Worker (UWORD8)bits_to_write);
617*15dc779aSAndroid Build Coastguard Worker }
618*15dc779aSAndroid Build Coastguard Worker bit_count += num_fac_bits;
619*15dc779aSAndroid Build Coastguard Worker }
620*15dc779aSAndroid Build Coastguard Worker
621*15dc779aSAndroid Build Coastguard Worker return (bit_count);
622*15dc779aSAndroid Build Coastguard Worker }
623*15dc779aSAndroid Build Coastguard Worker
iusace_count_fd_bits(ia_sfb_params_struct * pstr_sfb_prms,ia_usac_data_struct * pstr_usac_data,WORD32 usac_independency_flg,ia_usac_encoder_config_struct * pstr_usac_config,WORD32 ch_idx,WORD32 idx)624*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_count_fd_bits(ia_sfb_params_struct *pstr_sfb_prms,
625*15dc779aSAndroid Build Coastguard Worker ia_usac_data_struct *pstr_usac_data, WORD32 usac_independency_flg,
626*15dc779aSAndroid Build Coastguard Worker ia_usac_encoder_config_struct *pstr_usac_config, WORD32 ch_idx,
627*15dc779aSAndroid Build Coastguard Worker WORD32 idx) {
628*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
629*15dc779aSAndroid Build Coastguard Worker ia_usac_quant_info_struct *pstr_quant_info = &pstr_usac_data->str_quant_info[idx];
630*15dc779aSAndroid Build Coastguard Worker WORD32 window_sequence = pstr_sfb_prms->window_sequence[ch_idx];
631*15dc779aSAndroid Build Coastguard Worker WORD32 global_gain = pstr_quant_info->scale_factor[0];
632*15dc779aSAndroid Build Coastguard Worker WORD32 max_sfb = pstr_sfb_prms->max_sfb[ch_idx];
633*15dc779aSAndroid Build Coastguard Worker WORD32 num_sfb = pstr_sfb_prms->num_sfb[ch_idx];
634*15dc779aSAndroid Build Coastguard Worker WORD32 num_win_grps = pstr_sfb_prms->num_window_groups[ch_idx];
635*15dc779aSAndroid Build Coastguard Worker
636*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_write_scf_data(NULL, max_sfb, num_sfb, pstr_quant_info->scale_factor,
637*15dc779aSAndroid Build Coastguard Worker num_win_grps, global_gain, iusace_huffman_code_table);
638*15dc779aSAndroid Build Coastguard Worker
639*15dc779aSAndroid Build Coastguard Worker WORD32 temp_c_pres[516], temp_c_prev[516], temp_size = pstr_quant_info->arith_size_prev;
640*15dc779aSAndroid Build Coastguard Worker memcpy(temp_c_pres, pstr_quant_info->c_pres, 516 * sizeof(pstr_quant_info->c_pres[0]));
641*15dc779aSAndroid Build Coastguard Worker memcpy(temp_c_prev, pstr_quant_info->c_prev, 516 * sizeof(pstr_quant_info->c_prev[0]));
642*15dc779aSAndroid Build Coastguard Worker bit_count += iusace_arith_enc_spec(
643*15dc779aSAndroid Build Coastguard Worker NULL, window_sequence, pstr_quant_info->quant_degroup, pstr_quant_info->max_spec_coeffs,
644*15dc779aSAndroid Build Coastguard Worker temp_c_pres, temp_c_prev, &(temp_size), usac_independency_flg || pstr_quant_info->reset,
645*15dc779aSAndroid Build Coastguard Worker pstr_usac_config->ccfl);
646*15dc779aSAndroid Build Coastguard Worker
647*15dc779aSAndroid Build Coastguard Worker return (bit_count);
648*15dc779aSAndroid Build Coastguard Worker }
649*15dc779aSAndroid Build Coastguard Worker
iusace_write_fill_ele(ia_bit_buf_struct * it_bit_buf,WORD32 num_bits)650*15dc779aSAndroid Build Coastguard Worker WORD32 iusace_write_fill_ele(ia_bit_buf_struct *it_bit_buf, WORD32 num_bits) {
651*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = (it_bit_buf != NULL);
652*15dc779aSAndroid Build Coastguard Worker WORD32 bit_count = 0;
653*15dc779aSAndroid Build Coastguard Worker
654*15dc779aSAndroid Build Coastguard Worker if (num_bits <= 8) {
655*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
656*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, 0, 1);
657*15dc779aSAndroid Build Coastguard Worker }
658*15dc779aSAndroid Build Coastguard Worker bit_count++;
659*15dc779aSAndroid Build Coastguard Worker num_bits--;
660*15dc779aSAndroid Build Coastguard Worker } else {
661*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
662*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, 1, 1);
663*15dc779aSAndroid Build Coastguard Worker }
664*15dc779aSAndroid Build Coastguard Worker bit_count++;
665*15dc779aSAndroid Build Coastguard Worker num_bits--;
666*15dc779aSAndroid Build Coastguard Worker
667*15dc779aSAndroid Build Coastguard Worker if (num_bits <= 8) {
668*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
669*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, 1, 1);
670*15dc779aSAndroid Build Coastguard Worker }
671*15dc779aSAndroid Build Coastguard Worker bit_count++;
672*15dc779aSAndroid Build Coastguard Worker num_bits--;
673*15dc779aSAndroid Build Coastguard Worker } else {
674*15dc779aSAndroid Build Coastguard Worker WORD32 bytes_to_write = 0;
675*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
676*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, 0, 1);
677*15dc779aSAndroid Build Coastguard Worker }
678*15dc779aSAndroid Build Coastguard Worker bit_count++;
679*15dc779aSAndroid Build Coastguard Worker num_bits--;
680*15dc779aSAndroid Build Coastguard Worker bytes_to_write = num_bits >> 3;
681*15dc779aSAndroid Build Coastguard Worker
682*15dc779aSAndroid Build Coastguard Worker if (bytes_to_write > 255) {
683*15dc779aSAndroid Build Coastguard Worker bytes_to_write -= 3;
684*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
685*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, 255, 8);
686*15dc779aSAndroid Build Coastguard Worker }
687*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
688*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, bytes_to_write - 253, 16);
689*15dc779aSAndroid Build Coastguard Worker }
690*15dc779aSAndroid Build Coastguard Worker bit_count += 24;
691*15dc779aSAndroid Build Coastguard Worker num_bits -= 24;
692*15dc779aSAndroid Build Coastguard Worker } else {
693*15dc779aSAndroid Build Coastguard Worker bytes_to_write--;
694*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
695*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, bytes_to_write, 8);
696*15dc779aSAndroid Build Coastguard Worker }
697*15dc779aSAndroid Build Coastguard Worker bit_count += 8;
698*15dc779aSAndroid Build Coastguard Worker num_bits -= 8;
699*15dc779aSAndroid Build Coastguard Worker }
700*15dc779aSAndroid Build Coastguard Worker
701*15dc779aSAndroid Build Coastguard Worker while (bytes_to_write > 0) {
702*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
703*15dc779aSAndroid Build Coastguard Worker iusace_write_bits_buf(it_bit_buf, 0xA9, 8);
704*15dc779aSAndroid Build Coastguard Worker }
705*15dc779aSAndroid Build Coastguard Worker bit_count += 8;
706*15dc779aSAndroid Build Coastguard Worker num_bits -= 8;
707*15dc779aSAndroid Build Coastguard Worker bytes_to_write--;
708*15dc779aSAndroid Build Coastguard Worker }
709*15dc779aSAndroid Build Coastguard Worker }
710*15dc779aSAndroid Build Coastguard Worker }
711*15dc779aSAndroid Build Coastguard Worker return bit_count;
712*15dc779aSAndroid Build Coastguard Worker }
713