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 <limits.h>
22*15dc779aSAndroid Build Coastguard Worker #include <stddef.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 "impd_drc_common_enc.h"
26*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_uni_drc.h"
27*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_tables.h"
28*15dc779aSAndroid Build Coastguard Worker #include "impd_drc_api.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_api.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_error_standards.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_error_codes.h"
33*15dc779aSAndroid Build Coastguard Worker #include <stdlib.h>
34*15dc779aSAndroid Build Coastguard Worker
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
37*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
39*15dc779aSAndroid Build Coastguard Worker
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
41*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
46*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_block_switch.h"
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_data.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_interface.h"
49*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bits_count.h"
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_dynamic_bits.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_adjust_threshold_data.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_qc_data.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_bitstream.h"
54*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_sbr_header.h"
55*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_config.h"
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_channel_map.h"
58*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_adts_adif.h"
59*15dc779aSAndroid Build Coastguard Worker
60*15dc779aSAndroid Build Coastguard Worker static VOID PLATFORM_INLINE
ia_enhaacplus_enc_encode_gain_control_data(ixheaace_bit_buf_handle pstr_bit_stream_handle)61*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_gain_control_data(ixheaace_bit_buf_handle pstr_bit_stream_handle)
62*15dc779aSAndroid Build Coastguard Worker
63*15dc779aSAndroid Build Coastguard Worker {
64*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 1);
65*15dc779aSAndroid Build Coastguard Worker }
ia_enhaacplus_enc_encode_spectral_data(WORD32 * pstr_sfb_offset,ixheaace_section_data * pstr_section_data,WORD16 * ptr_quant_spectrum,ixheaace_bit_buf_handle pstr_bit_stream_handle,ixheaace_huffman_tables * ptr_huffman_tbl)66*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_encode_spectral_data(
67*15dc779aSAndroid Build Coastguard Worker WORD32 *pstr_sfb_offset, ixheaace_section_data *pstr_section_data, WORD16 *ptr_quant_spectrum,
68*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, ixheaace_huffman_tables *ptr_huffman_tbl) {
69*15dc779aSAndroid Build Coastguard Worker WORD32 i, sfb;
70*15dc779aSAndroid Build Coastguard Worker WORD32 dbg_val;
71*15dc779aSAndroid Build Coastguard Worker
72*15dc779aSAndroid Build Coastguard Worker dbg_val = ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle);
73*15dc779aSAndroid Build Coastguard Worker
74*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_section_data->num_of_sections; i++) {
75*15dc779aSAndroid Build Coastguard Worker for (sfb = pstr_section_data->section[i].sfb_start;
76*15dc779aSAndroid Build Coastguard Worker sfb < pstr_section_data->section[i].sfb_start + pstr_section_data->section[i].sfb_cnt;
77*15dc779aSAndroid Build Coastguard Worker sfb++) {
78*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_code_values(ptr_quant_spectrum + pstr_sfb_offset[sfb],
79*15dc779aSAndroid Build Coastguard Worker pstr_sfb_offset[sfb + 1] - pstr_sfb_offset[sfb],
80*15dc779aSAndroid Build Coastguard Worker pstr_section_data->section[i].code_book,
81*15dc779aSAndroid Build Coastguard Worker pstr_bit_stream_handle, ptr_huffman_tbl);
82*15dc779aSAndroid Build Coastguard Worker }
83*15dc779aSAndroid Build Coastguard Worker }
84*15dc779aSAndroid Build Coastguard Worker
85*15dc779aSAndroid Build Coastguard Worker return (ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle) - dbg_val);
86*15dc779aSAndroid Build Coastguard Worker }
87*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_encode_global_gain(WORD32 global_gain,WORD32 log_norm,WORD32 scalefac,ixheaace_bit_buf_handle pstr_bit_stream_handle)88*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_encode_global_gain(WORD32 global_gain, WORD32 log_norm,
89*15dc779aSAndroid Build Coastguard Worker WORD32 scalefac,
90*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle) {
91*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle,
92*15dc779aSAndroid Build Coastguard Worker global_gain - scalefac + GLOBAL_GAIN_OFFSET - 4 * log_norm, 8);
93*15dc779aSAndroid Build Coastguard Worker }
94*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_encode_ics_info(WORD32 block_type,WORD32 win_shape,WORD32 grouping_mask,ixheaace_section_data * pstr_section_data,ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot)95*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_encode_ics_info(WORD32 block_type, WORD32 win_shape,
96*15dc779aSAndroid Build Coastguard Worker WORD32 grouping_mask,
97*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data *pstr_section_data,
98*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle,
99*15dc779aSAndroid Build Coastguard Worker WORD32 aot) {
100*15dc779aSAndroid Build Coastguard Worker WORD32 tmp;
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker switch (aot) {
103*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
104*15dc779aSAndroid Build Coastguard Worker tmp = ((ICS_RESERVED_BIT << 3) | (block_type << 1) | win_shape);
105*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp, 4);
106*15dc779aSAndroid Build Coastguard Worker break;
107*15dc779aSAndroid Build Coastguard Worker
108*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
109*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
110*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
111*15dc779aSAndroid Build Coastguard Worker tmp = ((ICS_RESERVED_BIT << 3) | (block_type << 1) | win_shape);
112*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp, 4);
113*15dc779aSAndroid Build Coastguard Worker break;
114*15dc779aSAndroid Build Coastguard Worker }
115*15dc779aSAndroid Build Coastguard Worker switch (block_type) {
116*15dc779aSAndroid Build Coastguard Worker case LONG_WINDOW:
117*15dc779aSAndroid Build Coastguard Worker case START_WINDOW:
118*15dc779aSAndroid Build Coastguard Worker case STOP_WINDOW:
119*15dc779aSAndroid Build Coastguard Worker
120*15dc779aSAndroid Build Coastguard Worker switch (aot) {
121*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
122*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
123*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
124*15dc779aSAndroid Build Coastguard Worker tmp = pstr_section_data->max_sfb_per_grp << 1;
125*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp, 7);
126*15dc779aSAndroid Build Coastguard Worker break;
127*15dc779aSAndroid Build Coastguard Worker
128*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
129*15dc779aSAndroid Build Coastguard Worker tmp = pstr_section_data->max_sfb_per_grp << 1;
130*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp, 7);
131*15dc779aSAndroid Build Coastguard Worker break;
132*15dc779aSAndroid Build Coastguard Worker default:
133*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, pstr_section_data->max_sfb_per_grp, 6);
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker break;
136*15dc779aSAndroid Build Coastguard Worker
137*15dc779aSAndroid Build Coastguard Worker case SHORT_WINDOW:
138*15dc779aSAndroid Build Coastguard Worker
139*15dc779aSAndroid Build Coastguard Worker // Write grouping bits
140*15dc779aSAndroid Build Coastguard Worker
141*15dc779aSAndroid Build Coastguard Worker tmp = pstr_section_data->max_sfb_per_grp << (TRANS_FAC - 1) | grouping_mask;
142*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp, TRANS_FAC - 1 + 4);
143*15dc779aSAndroid Build Coastguard Worker
144*15dc779aSAndroid Build Coastguard Worker break;
145*15dc779aSAndroid Build Coastguard Worker }
146*15dc779aSAndroid Build Coastguard Worker }
147*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_encode_section_data(ixheaace_section_data * pstr_section_data,ixheaace_bit_buf_handle pstr_bit_stream_handle)148*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_encode_section_data(
149*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data *pstr_section_data, ixheaace_bit_buf_handle pstr_bit_stream_handle) {
150*15dc779aSAndroid Build Coastguard Worker WORD32 sect_escape_val = 0, sect_len_bits = 0;
151*15dc779aSAndroid Build Coastguard Worker WORD32 sect_len;
152*15dc779aSAndroid Build Coastguard Worker WORD32 i;
153*15dc779aSAndroid Build Coastguard Worker WORD32 dbg_val = ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle);
154*15dc779aSAndroid Build Coastguard Worker
155*15dc779aSAndroid Build Coastguard Worker switch (pstr_section_data->block_type) {
156*15dc779aSAndroid Build Coastguard Worker case LONG_WINDOW:
157*15dc779aSAndroid Build Coastguard Worker case START_WINDOW:
158*15dc779aSAndroid Build Coastguard Worker case STOP_WINDOW:
159*15dc779aSAndroid Build Coastguard Worker
160*15dc779aSAndroid Build Coastguard Worker sect_escape_val = SECT_ESC_VAL_LONG;
161*15dc779aSAndroid Build Coastguard Worker sect_len_bits = SECT_BITS_LONG;
162*15dc779aSAndroid Build Coastguard Worker break;
163*15dc779aSAndroid Build Coastguard Worker
164*15dc779aSAndroid Build Coastguard Worker case SHORT_WINDOW:
165*15dc779aSAndroid Build Coastguard Worker
166*15dc779aSAndroid Build Coastguard Worker sect_escape_val = SECT_ESC_VAL_SHORT;
167*15dc779aSAndroid Build Coastguard Worker sect_len_bits = SECT_BITS_SHORT;
168*15dc779aSAndroid Build Coastguard Worker break;
169*15dc779aSAndroid Build Coastguard Worker }
170*15dc779aSAndroid Build Coastguard Worker
171*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_section_data->num_of_sections; i++) {
172*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, pstr_section_data->section[i].code_book, 4);
173*15dc779aSAndroid Build Coastguard Worker
174*15dc779aSAndroid Build Coastguard Worker sect_len = pstr_section_data->section[i].sfb_cnt;
175*15dc779aSAndroid Build Coastguard Worker
176*15dc779aSAndroid Build Coastguard Worker while (sect_len >= sect_escape_val) {
177*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, sect_escape_val, (UWORD8)sect_len_bits);
178*15dc779aSAndroid Build Coastguard Worker
179*15dc779aSAndroid Build Coastguard Worker sect_len -= sect_escape_val;
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker
182*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, sect_len, (UWORD8)sect_len_bits);
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker return (ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle) - dbg_val);
186*15dc779aSAndroid Build Coastguard Worker }
187*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_code_scale_factor_delta_lav(WORD32 delta,ixheaace_bit_buf_handle ptr_bitstream,const UWORD16 * ptr_pltabscf,const UWORD32 * ptr_pctabscf)188*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_code_scale_factor_delta_lav(WORD32 delta,
189*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle ptr_bitstream,
190*15dc779aSAndroid Build Coastguard Worker const UWORD16 *ptr_pltabscf,
191*15dc779aSAndroid Build Coastguard Worker const UWORD32 *ptr_pctabscf) {
192*15dc779aSAndroid Build Coastguard Worker WORD32 code_word, code_length;
193*15dc779aSAndroid Build Coastguard Worker
194*15dc779aSAndroid Build Coastguard Worker code_word = ptr_pctabscf[delta];
195*15dc779aSAndroid Build Coastguard Worker code_length = ptr_pltabscf[delta];
196*15dc779aSAndroid Build Coastguard Worker
197*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(ptr_bitstream, code_word, (UWORD8)code_length);
198*15dc779aSAndroid Build Coastguard Worker }
ia_enhaacplus_enc_encode_scalefactor_data(UWORD16 * ptr_max_val_in_sfb,ixheaace_section_data * pstr_section_data,WORD16 * ptr_scalefac,ixheaace_bit_buf_handle pstr_bit_stream_handle,ixheaace_huffman_tables * pstr_huffman_tbl)199*15dc779aSAndroid Build Coastguard Worker static WORD32 ia_enhaacplus_enc_encode_scalefactor_data(
200*15dc779aSAndroid Build Coastguard Worker UWORD16 *ptr_max_val_in_sfb, ixheaace_section_data *pstr_section_data, WORD16 *ptr_scalefac,
201*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, ixheaace_huffman_tables *pstr_huffman_tbl) {
202*15dc779aSAndroid Build Coastguard Worker WORD32 i, j, last_val_scf, delta_scf;
203*15dc779aSAndroid Build Coastguard Worker WORD32 dbg_val = ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle);
204*15dc779aSAndroid Build Coastguard Worker const UWORD16 *ptr_pltabscf = &pstr_huffman_tbl->huff_ltabscf[CODE_BCK_SCF_LAV];
205*15dc779aSAndroid Build Coastguard Worker const UWORD32 *ptr_pctabscf = &pstr_huffman_tbl->huff_ctabscf[CODE_BCK_SCF_LAV];
206*15dc779aSAndroid Build Coastguard Worker
207*15dc779aSAndroid Build Coastguard Worker last_val_scf = ptr_scalefac[pstr_section_data->first_scf];
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < pstr_section_data->num_of_sections; i++) {
210*15dc779aSAndroid Build Coastguard Worker if (pstr_section_data->section[i].code_book != CODE_BCK_ZERO_NO) {
211*15dc779aSAndroid Build Coastguard Worker for (j = pstr_section_data->section[i].sfb_start;
212*15dc779aSAndroid Build Coastguard Worker j < pstr_section_data->section[i].sfb_start + pstr_section_data->section[i].sfb_cnt;
213*15dc779aSAndroid Build Coastguard Worker j++) {
214*15dc779aSAndroid Build Coastguard Worker if (ptr_max_val_in_sfb[j] == 0) {
215*15dc779aSAndroid Build Coastguard Worker delta_scf = 0;
216*15dc779aSAndroid Build Coastguard Worker } else {
217*15dc779aSAndroid Build Coastguard Worker delta_scf = -(ptr_scalefac[j] - last_val_scf);
218*15dc779aSAndroid Build Coastguard Worker
219*15dc779aSAndroid Build Coastguard Worker last_val_scf = ptr_scalefac[j];
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_code_scale_factor_delta_lav(delta_scf, pstr_bit_stream_handle,
222*15dc779aSAndroid Build Coastguard Worker ptr_pltabscf, ptr_pctabscf);
223*15dc779aSAndroid Build Coastguard Worker }
224*15dc779aSAndroid Build Coastguard Worker }
225*15dc779aSAndroid Build Coastguard Worker }
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker return (ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle) - dbg_val);
228*15dc779aSAndroid Build Coastguard Worker }
229*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_encode_ms_info(WORD32 sfb_cnt,WORD32 sfb_grp,WORD32 max_sfb,WORD32 ms_digest,WORD32 * js_flags,ixheaace_bit_buf_handle pstr_bit_stream_handle)230*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_encode_ms_info(WORD32 sfb_cnt, WORD32 sfb_grp, WORD32 max_sfb,
231*15dc779aSAndroid Build Coastguard Worker WORD32 ms_digest, WORD32 *js_flags,
232*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle) {
233*15dc779aSAndroid Build Coastguard Worker WORD32 sfb, sfb_offset;
234*15dc779aSAndroid Build Coastguard Worker UWORD32 tmp_var = 0;
235*15dc779aSAndroid Build Coastguard Worker WORD32 *jsflag;
236*15dc779aSAndroid Build Coastguard Worker UWORD8 num_of_bits, remaining = 0;
237*15dc779aSAndroid Build Coastguard Worker
238*15dc779aSAndroid Build Coastguard Worker switch (ms_digest) {
239*15dc779aSAndroid Build Coastguard Worker case MS_NONE:
240*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, SI_MS_MASK_NONE, 2);
241*15dc779aSAndroid Build Coastguard Worker break;
242*15dc779aSAndroid Build Coastguard Worker
243*15dc779aSAndroid Build Coastguard Worker case MS_ALL:
244*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, SI_MS_MASK_ALL, 2);
245*15dc779aSAndroid Build Coastguard Worker break;
246*15dc779aSAndroid Build Coastguard Worker
247*15dc779aSAndroid Build Coastguard Worker case MS_SOME:
248*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, SI_MS_MASK_SOME, 2);
249*15dc779aSAndroid Build Coastguard Worker
250*15dc779aSAndroid Build Coastguard Worker if (max_sfb > 32) {
251*15dc779aSAndroid Build Coastguard Worker num_of_bits = 32;
252*15dc779aSAndroid Build Coastguard Worker remaining = (UWORD8)(max_sfb - 32);
253*15dc779aSAndroid Build Coastguard Worker } else
254*15dc779aSAndroid Build Coastguard Worker num_of_bits = (UWORD8)max_sfb;
255*15dc779aSAndroid Build Coastguard Worker
256*15dc779aSAndroid Build Coastguard Worker for (sfb_offset = 0; sfb_offset < sfb_cnt; sfb_offset += sfb_grp) {
257*15dc779aSAndroid Build Coastguard Worker WORD8 flag;
258*15dc779aSAndroid Build Coastguard Worker jsflag = &js_flags[sfb_offset];
259*15dc779aSAndroid Build Coastguard Worker tmp_var = 0;
260*15dc779aSAndroid Build Coastguard Worker
261*15dc779aSAndroid Build Coastguard Worker for (sfb = num_of_bits - 1; sfb >= 0; sfb--) {
262*15dc779aSAndroid Build Coastguard Worker flag = (WORD8)(*jsflag++);
263*15dc779aSAndroid Build Coastguard Worker tmp_var = ((tmp_var << 1) | flag);
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker
266*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp_var, num_of_bits);
267*15dc779aSAndroid Build Coastguard Worker
268*15dc779aSAndroid Build Coastguard Worker if (remaining) {
269*15dc779aSAndroid Build Coastguard Worker for (sfb = remaining - 1; sfb >= 0; sfb--) {
270*15dc779aSAndroid Build Coastguard Worker flag = (WORD8)(*jsflag++);
271*15dc779aSAndroid Build Coastguard Worker tmp_var = ((tmp_var << 1) | flag);
272*15dc779aSAndroid Build Coastguard Worker }
273*15dc779aSAndroid Build Coastguard Worker
274*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp_var, remaining);
275*15dc779aSAndroid Build Coastguard Worker }
276*15dc779aSAndroid Build Coastguard Worker }
277*15dc779aSAndroid Build Coastguard Worker
278*15dc779aSAndroid Build Coastguard Worker break;
279*15dc779aSAndroid Build Coastguard Worker }
280*15dc779aSAndroid Build Coastguard Worker }
281*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_encode_tns_data(ixheaace_temporal_noise_shaping_params pstr_tns_info,WORD32 block_type,ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot)282*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_encode_tns_data(
283*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params pstr_tns_info, WORD32 block_type,
284*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, WORD32 aot) {
285*15dc779aSAndroid Build Coastguard Worker WORD32 i, k;
286*15dc779aSAndroid Build Coastguard Worker WORD32 tns_present;
287*15dc779aSAndroid Build Coastguard Worker WORD32 num_windows;
288*15dc779aSAndroid Build Coastguard Worker WORD32 coef_bits;
289*15dc779aSAndroid Build Coastguard Worker
290*15dc779aSAndroid Build Coastguard Worker UWORD32 tmp;
291*15dc779aSAndroid Build Coastguard Worker UWORD8 val;
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker num_windows = (block_type == 2 ? TRANS_FAC : 1);
294*15dc779aSAndroid Build Coastguard Worker
295*15dc779aSAndroid Build Coastguard Worker tns_present = 0;
296*15dc779aSAndroid Build Coastguard Worker
297*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_windows; i++) {
298*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info.tns_active[i] == 1) {
299*15dc779aSAndroid Build Coastguard Worker tns_present = 1;
300*15dc779aSAndroid Build Coastguard Worker }
301*15dc779aSAndroid Build Coastguard Worker }
302*15dc779aSAndroid Build Coastguard Worker
303*15dc779aSAndroid Build Coastguard Worker if (tns_present == 0) {
304*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 1);
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker if (AOT_AAC_LD == aot) {
307*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_gain_control_data(pstr_bit_stream_handle);
308*15dc779aSAndroid Build Coastguard Worker }
309*15dc779aSAndroid Build Coastguard Worker } else {
310*15dc779aSAndroid Build Coastguard Worker /* there is data to be written*/
311*15dc779aSAndroid Build Coastguard Worker
312*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 1, 1); /* data_present */
313*15dc779aSAndroid Build Coastguard Worker
314*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LD) {
315*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_gain_control_data(pstr_bit_stream_handle);
316*15dc779aSAndroid Build Coastguard Worker }
317*15dc779aSAndroid Build Coastguard Worker
318*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_windows; i++) {
319*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, pstr_tns_info.tns_active[i],
320*15dc779aSAndroid Build Coastguard Worker (UWORD8)(block_type == 2 ? 1 : 2));
321*15dc779aSAndroid Build Coastguard Worker
322*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info.tns_active[i]) {
323*15dc779aSAndroid Build Coastguard Worker tmp = ((pstr_tns_info.coef_res[i] == 4 ? 1 : 0)
324*15dc779aSAndroid Build Coastguard Worker << ((block_type == 2 ? 4 : 6) + (block_type == 2 ? 3 : 5)) |
325*15dc779aSAndroid Build Coastguard Worker pstr_tns_info.length[i] << (block_type == 2 ? 3 : 5) | pstr_tns_info.order[i]);
326*15dc779aSAndroid Build Coastguard Worker
327*15dc779aSAndroid Build Coastguard Worker val = (UWORD8)(1 + (block_type == 2 ? 4 : 6) + (block_type == 2 ? 3 : 5));
328*15dc779aSAndroid Build Coastguard Worker
329*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, tmp, val);
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info.order[i]) {
332*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, FILTER_DIRECTION, 1);
333*15dc779aSAndroid Build Coastguard Worker
334*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info.coef_res[i] == 4) {
335*15dc779aSAndroid Build Coastguard Worker coef_bits = 3;
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_tns_info.order[i]; k++) {
338*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info.coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] > 3 ||
339*15dc779aSAndroid Build Coastguard Worker pstr_tns_info.coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] < -4) {
340*15dc779aSAndroid Build Coastguard Worker coef_bits = 4;
341*15dc779aSAndroid Build Coastguard Worker break;
342*15dc779aSAndroid Build Coastguard Worker }
343*15dc779aSAndroid Build Coastguard Worker }
344*15dc779aSAndroid Build Coastguard Worker } else {
345*15dc779aSAndroid Build Coastguard Worker coef_bits = 2;
346*15dc779aSAndroid Build Coastguard Worker
347*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_tns_info.order[i]; k++) {
348*15dc779aSAndroid Build Coastguard Worker if (pstr_tns_info.coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] > 1 ||
349*15dc779aSAndroid Build Coastguard Worker pstr_tns_info.coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] < -2) {
350*15dc779aSAndroid Build Coastguard Worker coef_bits = 3;
351*15dc779aSAndroid Build Coastguard Worker break;
352*15dc779aSAndroid Build Coastguard Worker }
353*15dc779aSAndroid Build Coastguard Worker }
354*15dc779aSAndroid Build Coastguard Worker }
355*15dc779aSAndroid Build Coastguard Worker
356*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, -(coef_bits - pstr_tns_info.coef_res[i]),
357*15dc779aSAndroid Build Coastguard Worker 1); /*coef_compres*/
358*15dc779aSAndroid Build Coastguard Worker
359*15dc779aSAndroid Build Coastguard Worker for (k = 0; k < pstr_tns_info.order[i]; k++) {
360*15dc779aSAndroid Build Coastguard Worker static const WORD32 rmask[] = {0, 1, 3, 7, 15};
361*15dc779aSAndroid Build Coastguard Worker
362*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(
363*15dc779aSAndroid Build Coastguard Worker pstr_bit_stream_handle,
364*15dc779aSAndroid Build Coastguard Worker pstr_tns_info.coef[i * TEMPORAL_NOISE_SHAPING_MAX_ORDER_SHORT + k] &
365*15dc779aSAndroid Build Coastguard Worker rmask[coef_bits],
366*15dc779aSAndroid Build Coastguard Worker (UWORD8)coef_bits);
367*15dc779aSAndroid Build Coastguard Worker }
368*15dc779aSAndroid Build Coastguard Worker }
369*15dc779aSAndroid Build Coastguard Worker }
370*15dc779aSAndroid Build Coastguard Worker }
371*15dc779aSAndroid Build Coastguard Worker }
372*15dc779aSAndroid Build Coastguard Worker }
373*15dc779aSAndroid Build Coastguard Worker
374*15dc779aSAndroid Build Coastguard Worker static VOID PLATFORM_INLINE
ia_enhaacplus_enc_encode_pulse_data(ixheaace_bit_buf_handle pstr_bit_stream_handle)375*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_pulse_data(ixheaace_bit_buf_handle pstr_bit_stream_handle) {
376*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 1);
377*15dc779aSAndroid Build Coastguard Worker }
378*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_ic_stream(WORD32 common_window,WORD32 win_shape,WORD32 grouping_mask,WORD32 * pstr_sfb_offset,WORD16 * ptr_scf,UWORD16 * ptr_max_val_in_sfb,WORD32 global_gain,WORD16 * ptr_quant_spec,ixheaace_section_data * pstr_section_data,ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot,ixheaace_temporal_noise_shaping_params pstr_tns_info,ixheaace_aac_tables * pstr_aac_tables)379*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_write_ic_stream(
380*15dc779aSAndroid Build Coastguard Worker WORD32 common_window, WORD32 win_shape, WORD32 grouping_mask, WORD32 *pstr_sfb_offset,
381*15dc779aSAndroid Build Coastguard Worker WORD16 *ptr_scf, UWORD16 *ptr_max_val_in_sfb, WORD32 global_gain, WORD16 *ptr_quant_spec,
382*15dc779aSAndroid Build Coastguard Worker ixheaace_section_data *pstr_section_data, ixheaace_bit_buf_handle pstr_bit_stream_handle,
383*15dc779aSAndroid Build Coastguard Worker WORD32 aot, ixheaace_temporal_noise_shaping_params pstr_tns_info,
384*15dc779aSAndroid Build Coastguard Worker ixheaace_aac_tables *pstr_aac_tables) {
385*15dc779aSAndroid Build Coastguard Worker WORD32 log_norm = -1;
386*15dc779aSAndroid Build Coastguard Worker
387*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_global_gain(
388*15dc779aSAndroid Build Coastguard Worker global_gain, log_norm, ptr_scf[pstr_section_data->first_scf], pstr_bit_stream_handle);
389*15dc779aSAndroid Build Coastguard Worker if (!common_window) {
390*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_ics_info(pstr_section_data->block_type, win_shape, grouping_mask,
391*15dc779aSAndroid Build Coastguard Worker pstr_section_data, pstr_bit_stream_handle, aot);
392*15dc779aSAndroid Build Coastguard Worker }
393*15dc779aSAndroid Build Coastguard Worker
394*15dc779aSAndroid Build Coastguard Worker if (ia_enhaacplus_enc_encode_section_data(pstr_section_data, pstr_bit_stream_handle) !=
395*15dc779aSAndroid Build Coastguard Worker pstr_section_data->side_info_bits) {
396*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_INVALID_SIDE_INFO_BITS;
397*15dc779aSAndroid Build Coastguard Worker }
398*15dc779aSAndroid Build Coastguard Worker
399*15dc779aSAndroid Build Coastguard Worker if (ia_enhaacplus_enc_encode_scalefactor_data(
400*15dc779aSAndroid Build Coastguard Worker ptr_max_val_in_sfb, pstr_section_data, ptr_scf, pstr_bit_stream_handle,
401*15dc779aSAndroid Build Coastguard Worker pstr_aac_tables->pstr_huff_tab) != pstr_section_data->scale_fac_bits) {
402*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_INVALID_SCALE_FACTOR_BITS;
403*15dc779aSAndroid Build Coastguard Worker }
404*15dc779aSAndroid Build Coastguard Worker
405*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LC || aot == AOT_AAC_LD || aot == AOT_SBR || aot == AOT_PS) {
406*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_pulse_data(pstr_bit_stream_handle);
407*15dc779aSAndroid Build Coastguard Worker }
408*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_tns_data(pstr_tns_info, pstr_section_data->block_type,
409*15dc779aSAndroid Build Coastguard Worker pstr_bit_stream_handle, aot);
410*15dc779aSAndroid Build Coastguard Worker
411*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
412*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_gain_control_data(pstr_bit_stream_handle);
413*15dc779aSAndroid Build Coastguard Worker }
414*15dc779aSAndroid Build Coastguard Worker
415*15dc779aSAndroid Build Coastguard Worker if (ia_enhaacplus_enc_encode_spectral_data(
416*15dc779aSAndroid Build Coastguard Worker pstr_sfb_offset, pstr_section_data, ptr_quant_spec, pstr_bit_stream_handle,
417*15dc779aSAndroid Build Coastguard Worker pstr_aac_tables->pstr_huff_tab) != pstr_section_data->huffman_bits) {
418*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_EXE_FATAL_INVALID_HUFFMAN_BITS;
419*15dc779aSAndroid Build Coastguard Worker }
420*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
421*15dc779aSAndroid Build Coastguard Worker }
422*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_single_chan_elem(WORD32 instance_tag,WORD32 * pstr_sfb_offset,ixheaace_qc_out_channel * pstr_qc_out_ch,ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot,ixheaace_temporal_noise_shaping_params pstr_tns_info,ixheaace_aac_tables * pstr_aac_tables)423*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_write_single_chan_elem(
424*15dc779aSAndroid Build Coastguard Worker WORD32 instance_tag, WORD32 *pstr_sfb_offset, ixheaace_qc_out_channel *pstr_qc_out_ch,
425*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, WORD32 aot,
426*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params pstr_tns_info, ixheaace_aac_tables *pstr_aac_tables) {
427*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
428*15dc779aSAndroid Build Coastguard Worker
429*15dc779aSAndroid Build Coastguard Worker switch (aot) {
430*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
431*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
432*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
433*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, ID_SCE, 3);
434*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, instance_tag, 4);
435*15dc779aSAndroid Build Coastguard Worker break;
436*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
437*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, instance_tag, 4);
438*15dc779aSAndroid Build Coastguard Worker break;
439*15dc779aSAndroid Build Coastguard Worker }
440*15dc779aSAndroid Build Coastguard Worker
441*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_ic_stream(
442*15dc779aSAndroid Build Coastguard Worker 0, pstr_qc_out_ch->win_shape, pstr_qc_out_ch->grouping_mask, pstr_sfb_offset,
443*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch->scalefactor, pstr_qc_out_ch->max_val_in_sfb, pstr_qc_out_ch->global_gain,
444*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch->quant_spec, &(pstr_qc_out_ch->section_data), pstr_bit_stream_handle, aot,
445*15dc779aSAndroid Build Coastguard Worker pstr_tns_info, pstr_aac_tables);
446*15dc779aSAndroid Build Coastguard Worker
447*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
448*15dc779aSAndroid Build Coastguard Worker return err_code;
449*15dc779aSAndroid Build Coastguard Worker }
450*15dc779aSAndroid Build Coastguard Worker
451*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
452*15dc779aSAndroid Build Coastguard Worker }
453*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_channel_pair_element(WORD32 instance_tag,WORD32 ms_digest,WORD32 ms_flags[MAXIMUM_GROUPED_SCALE_FACTOR_BAND],WORD32 * pstr_sfb_offset[2],ixheaace_qc_out_channel pstr_qc_out_ch[2],ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot,ixheaace_temporal_noise_shaping_params pstr_tns_info[2],ixheaace_aac_tables * pstr_aac_tables)454*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_write_channel_pair_element(
455*15dc779aSAndroid Build Coastguard Worker WORD32 instance_tag, WORD32 ms_digest, WORD32 ms_flags[MAXIMUM_GROUPED_SCALE_FACTOR_BAND],
456*15dc779aSAndroid Build Coastguard Worker WORD32 *pstr_sfb_offset[2], ixheaace_qc_out_channel pstr_qc_out_ch[2],
457*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, WORD32 aot,
458*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params pstr_tns_info[2],
459*15dc779aSAndroid Build Coastguard Worker ixheaace_aac_tables *pstr_aac_tables) {
460*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
461*15dc779aSAndroid Build Coastguard Worker
462*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
463*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, ID_CPE, 3);
464*15dc779aSAndroid Build Coastguard Worker }
465*15dc779aSAndroid Build Coastguard Worker
466*15dc779aSAndroid Build Coastguard Worker switch (aot) {
467*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
468*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, instance_tag, 4);
469*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 1, 1); /* common window */
470*15dc779aSAndroid Build Coastguard Worker break;
471*15dc779aSAndroid Build Coastguard Worker
472*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
473*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
474*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
475*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, instance_tag, 4);
476*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 1, 1);
477*15dc779aSAndroid Build Coastguard Worker break;
478*15dc779aSAndroid Build Coastguard Worker }
479*15dc779aSAndroid Build Coastguard Worker
480*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_ics_info(pstr_qc_out_ch[0].section_data.block_type,
481*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[0].win_shape, pstr_qc_out_ch[0].grouping_mask,
482*15dc779aSAndroid Build Coastguard Worker &(pstr_qc_out_ch[0].section_data), pstr_bit_stream_handle,
483*15dc779aSAndroid Build Coastguard Worker aot);
484*15dc779aSAndroid Build Coastguard Worker
485*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_encode_ms_info(pstr_qc_out_ch[0].section_data.sfb_cnt,
486*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[0].section_data.sfb_per_group,
487*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[0].section_data.max_sfb_per_grp, ms_digest,
488*15dc779aSAndroid Build Coastguard Worker ms_flags, pstr_bit_stream_handle);
489*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_ic_stream(
490*15dc779aSAndroid Build Coastguard Worker 1, pstr_qc_out_ch[0].win_shape, pstr_qc_out_ch[0].grouping_mask, pstr_sfb_offset[0],
491*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[0].scalefactor, pstr_qc_out_ch[0].max_val_in_sfb,
492*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[0].global_gain, pstr_qc_out_ch[0].quant_spec,
493*15dc779aSAndroid Build Coastguard Worker &(pstr_qc_out_ch[0].section_data), pstr_bit_stream_handle, aot, pstr_tns_info[0],
494*15dc779aSAndroid Build Coastguard Worker pstr_aac_tables);
495*15dc779aSAndroid Build Coastguard Worker
496*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
497*15dc779aSAndroid Build Coastguard Worker return err_code;
498*15dc779aSAndroid Build Coastguard Worker }
499*15dc779aSAndroid Build Coastguard Worker
500*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_ic_stream(
501*15dc779aSAndroid Build Coastguard Worker 1, pstr_qc_out_ch[1].win_shape, pstr_qc_out_ch[1].grouping_mask, pstr_sfb_offset[1],
502*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[1].scalefactor, pstr_qc_out_ch[1].max_val_in_sfb,
503*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch[1].global_gain, pstr_qc_out_ch[1].quant_spec,
504*15dc779aSAndroid Build Coastguard Worker &(pstr_qc_out_ch[1].section_data), pstr_bit_stream_handle, aot, pstr_tns_info[1],
505*15dc779aSAndroid Build Coastguard Worker pstr_aac_tables);
506*15dc779aSAndroid Build Coastguard Worker
507*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
508*15dc779aSAndroid Build Coastguard Worker return err_code;
509*15dc779aSAndroid Build Coastguard Worker }
510*15dc779aSAndroid Build Coastguard Worker
511*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
512*15dc779aSAndroid Build Coastguard Worker }
513*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_fill_element_LD(const UWORD8 * ptr_anc_bytes,WORD32 total_fill_bits,ixheaace_bit_buf_handle pstr_bit_stream_handle)514*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_write_fill_element_LD(
515*15dc779aSAndroid Build Coastguard Worker const UWORD8 *ptr_anc_bytes, WORD32 total_fill_bits,
516*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle) {
517*15dc779aSAndroid Build Coastguard Worker WORD32 i, cnt, cnt1, remaining = 0;
518*15dc779aSAndroid Build Coastguard Worker
519*15dc779aSAndroid Build Coastguard Worker /*
520*15dc779aSAndroid Build Coastguard Worker Write fill Element(s):
521*15dc779aSAndroid Build Coastguard Worker amount of a fill element can be 7+X*8 Bits, X element of [0..270]
522*15dc779aSAndroid Build Coastguard Worker */
523*15dc779aSAndroid Build Coastguard Worker // ID_FIL and the FILL element payload size, ( 3+ 4 bits) are not sent.
524*15dc779aSAndroid Build Coastguard Worker // but they are accounted in the earlier code, so subtracting it here
525*15dc779aSAndroid Build Coastguard Worker
526*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= 7;
527*15dc779aSAndroid Build Coastguard Worker while (total_fill_bits > 0) {
528*15dc779aSAndroid Build Coastguard Worker cnt = MIN((total_fill_bits >> 3), ((1 << 4) - 1));
529*15dc779aSAndroid Build Coastguard Worker
530*15dc779aSAndroid Build Coastguard Worker if (ptr_anc_bytes) {
531*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < cnt; i++) {
532*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, *ptr_anc_bytes++, 8);
533*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= 8;
534*15dc779aSAndroid Build Coastguard Worker }
535*15dc779aSAndroid Build Coastguard Worker if (total_fill_bits < 8) {
536*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, *ptr_anc_bytes++, (UWORD8)total_fill_bits);
537*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, (UWORD8)(8 - total_fill_bits));
538*15dc779aSAndroid Build Coastguard Worker total_fill_bits = 0;
539*15dc779aSAndroid Build Coastguard Worker }
540*15dc779aSAndroid Build Coastguard Worker } else {
541*15dc779aSAndroid Build Coastguard Worker cnt1 = cnt >> 2;
542*15dc779aSAndroid Build Coastguard Worker remaining = cnt - (cnt1 << 2);
543*15dc779aSAndroid Build Coastguard Worker
544*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < cnt1; i++) {
545*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 32);
546*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= 32;
547*15dc779aSAndroid Build Coastguard Worker }
548*15dc779aSAndroid Build Coastguard Worker if (remaining)
549*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < remaining; i++) {
550*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 8);
551*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= 8;
552*15dc779aSAndroid Build Coastguard Worker }
553*15dc779aSAndroid Build Coastguard Worker }
554*15dc779aSAndroid Build Coastguard Worker }
555*15dc779aSAndroid Build Coastguard Worker }
556*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_fill_element_LC(const UWORD8 * ptr_anc_bytes,WORD32 total_fill_bits,ixheaace_bit_buf_handle pstr_h_bit_stream)557*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_write_fill_element_LC(const UWORD8 *ptr_anc_bytes,
558*15dc779aSAndroid Build Coastguard Worker WORD32 total_fill_bits,
559*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_h_bit_stream) {
560*15dc779aSAndroid Build Coastguard Worker WORD32 i, cnt, esc_count;
561*15dc779aSAndroid Build Coastguard Worker
562*15dc779aSAndroid Build Coastguard Worker while (total_fill_bits >= (3 + 4)) {
563*15dc779aSAndroid Build Coastguard Worker cnt = MIN((total_fill_bits - (3 + 4)) / 8, ((1 << 4) - 1));
564*15dc779aSAndroid Build Coastguard Worker
565*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_h_bit_stream, ID_FIL, 3);
566*15dc779aSAndroid Build Coastguard Worker
567*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_h_bit_stream, cnt, 4);
568*15dc779aSAndroid Build Coastguard Worker
569*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= (3 + 4);
570*15dc779aSAndroid Build Coastguard Worker
571*15dc779aSAndroid Build Coastguard Worker if (cnt == (1 << 4) - 1) {
572*15dc779aSAndroid Build Coastguard Worker esc_count = MIN((total_fill_bits / 8) - ((1 << 4) - 1), (1 << 8) - 1);
573*15dc779aSAndroid Build Coastguard Worker
574*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_h_bit_stream, esc_count, 8);
575*15dc779aSAndroid Build Coastguard Worker
576*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= 8;
577*15dc779aSAndroid Build Coastguard Worker
578*15dc779aSAndroid Build Coastguard Worker cnt += esc_count - 1;
579*15dc779aSAndroid Build Coastguard Worker }
580*15dc779aSAndroid Build Coastguard Worker
581*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < cnt; i++) {
582*15dc779aSAndroid Build Coastguard Worker if (ptr_anc_bytes)
583*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_h_bit_stream, *ptr_anc_bytes++, 8);
584*15dc779aSAndroid Build Coastguard Worker else
585*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_h_bit_stream, 0, 8);
586*15dc779aSAndroid Build Coastguard Worker
587*15dc779aSAndroid Build Coastguard Worker total_fill_bits -= 8;
588*15dc779aSAndroid Build Coastguard Worker }
589*15dc779aSAndroid Build Coastguard Worker }
590*15dc779aSAndroid Build Coastguard Worker }
591*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_single_channel_element_LFE(WORD32 instance_tag,WORD32 * ptr_sfb_offset,ixheaace_qc_out_channel * pstr_qc_out_ch,ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot,ixheaace_temporal_noise_shaping_params pstr_tns_info,ixheaace_aac_tables * pstr_aac_tables)592*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_write_single_channel_element_LFE(
593*15dc779aSAndroid Build Coastguard Worker WORD32 instance_tag, WORD32 *ptr_sfb_offset, ixheaace_qc_out_channel *pstr_qc_out_ch,
594*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, WORD32 aot,
595*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params pstr_tns_info, ixheaace_aac_tables *pstr_aac_tables) {
596*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
597*15dc779aSAndroid Build Coastguard Worker switch (aot) {
598*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LC:
599*15dc779aSAndroid Build Coastguard Worker case AOT_SBR:
600*15dc779aSAndroid Build Coastguard Worker case AOT_PS:
601*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, ID_LFE, 3);
602*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, instance_tag, 4);
603*15dc779aSAndroid Build Coastguard Worker break;
604*15dc779aSAndroid Build Coastguard Worker
605*15dc779aSAndroid Build Coastguard Worker case AOT_AAC_LD:
606*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, instance_tag, 4);
607*15dc779aSAndroid Build Coastguard Worker break;
608*15dc779aSAndroid Build Coastguard Worker }
609*15dc779aSAndroid Build Coastguard Worker
610*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_ic_stream(
611*15dc779aSAndroid Build Coastguard Worker 0, pstr_qc_out_ch->win_shape, pstr_qc_out_ch->grouping_mask, ptr_sfb_offset,
612*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch->scalefactor, pstr_qc_out_ch->max_val_in_sfb, pstr_qc_out_ch->global_gain,
613*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch->quant_spec, &(pstr_qc_out_ch->section_data), pstr_bit_stream_handle, aot,
614*15dc779aSAndroid Build Coastguard Worker pstr_tns_info, pstr_aac_tables);
615*15dc779aSAndroid Build Coastguard Worker
616*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
617*15dc779aSAndroid Build Coastguard Worker return err_code;
618*15dc779aSAndroid Build Coastguard Worker }
619*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
620*15dc779aSAndroid Build Coastguard Worker }
621*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_single_channel_ind_coupling_element(WORD32 * ptr_sfb_offset,ixheaace_qc_out_channel * pstr_qc_out_ch,ixheaace_bit_buf_handle pstr_bit_stream_handle,WORD32 aot,ixheaace_temporal_noise_shaping_params pstr_tns_info,ixheaace_aac_tables * pstr_aac_tables)622*15dc779aSAndroid Build Coastguard Worker static IA_ERRORCODE ia_enhaacplus_enc_write_single_channel_ind_coupling_element(
623*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_sfb_offset, ixheaace_qc_out_channel *pstr_qc_out_ch,
624*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, WORD32 aot,
625*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params pstr_tns_info, ixheaace_aac_tables *pstr_aac_tables) {
626*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
627*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, ID_CCE, 3);
628*15dc779aSAndroid Build Coastguard Worker
629*15dc779aSAndroid Build Coastguard Worker /*Flag indication that this is an independent coupling channel*/
630*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 1, 1);
631*15dc779aSAndroid Build Coastguard Worker
632*15dc779aSAndroid Build Coastguard Worker /*number of coupled channel elements*/
633*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, NUM_COUPLED_ELE, 3);
634*15dc779aSAndroid Build Coastguard Worker
635*15dc779aSAndroid Build Coastguard Worker /*Flag indicating target is CPE*/
636*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 1, 1);
637*15dc779aSAndroid Build Coastguard Worker
638*15dc779aSAndroid Build Coastguard Worker /*Instance tag of target CPE*/
639*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 4);
640*15dc779aSAndroid Build Coastguard Worker
641*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 3, 2);
642*15dc779aSAndroid Build Coastguard Worker
643*15dc779aSAndroid Build Coastguard Worker /*Flag indicating coupling after TNS*/
644*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 1, 1);
645*15dc779aSAndroid Build Coastguard Worker
646*15dc779aSAndroid Build Coastguard Worker /*Flag indicating sign of coupling*/
647*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 1);
648*15dc779aSAndroid Build Coastguard Worker
649*15dc779aSAndroid Build Coastguard Worker /*Flag indicating Scale of coupling*/
650*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, SCALE_COUPLING_LEVEL0, 2);
651*15dc779aSAndroid Build Coastguard Worker
652*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_ic_stream(
653*15dc779aSAndroid Build Coastguard Worker 0, pstr_qc_out_ch->win_shape, pstr_qc_out_ch->grouping_mask, ptr_sfb_offset,
654*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch->scalefactor, pstr_qc_out_ch->max_val_in_sfb, pstr_qc_out_ch->global_gain,
655*15dc779aSAndroid Build Coastguard Worker pstr_qc_out_ch->quant_spec, &(pstr_qc_out_ch->section_data), pstr_bit_stream_handle, aot,
656*15dc779aSAndroid Build Coastguard Worker pstr_tns_info, pstr_aac_tables);
657*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
658*15dc779aSAndroid Build Coastguard Worker return err_code;
659*15dc779aSAndroid Build Coastguard Worker }
660*15dc779aSAndroid Build Coastguard Worker
661*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_code_scale_factor_delta(-1, pstr_bit_stream_handle,
662*15dc779aSAndroid Build Coastguard Worker pstr_aac_tables->pstr_huff_tab);
663*15dc779aSAndroid Build Coastguard Worker
664*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
665*15dc779aSAndroid Build Coastguard Worker }
666*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_bitstream(ixheaace_bit_buf_handle pstr_bit_stream_handle,ixheaace_element_info pstr_element_info,ixheaace_qc_out * pstr_qc_out,ixheaace_psy_out * pstr_psy_out,WORD32 * glob_used_bits,const UWORD8 * ptr_anc_bytes,ixheaace_aac_tables * pstr_aac_tables,FLAG flag_last_element,WORD32 * write_program_config_element,WORD32 i_num_coup_channels,WORD32 i_channels_mask,WORD32 i_samp_freq,WORD32 ele_idx,WORD32 aot,WORD32 * total_fill_bits)667*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE ia_enhaacplus_enc_write_bitstream(
668*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle, ixheaace_element_info pstr_element_info,
669*15dc779aSAndroid Build Coastguard Worker ixheaace_qc_out *pstr_qc_out, ixheaace_psy_out *pstr_psy_out, WORD32 *glob_used_bits,
670*15dc779aSAndroid Build Coastguard Worker const UWORD8 *ptr_anc_bytes, ixheaace_aac_tables *pstr_aac_tables, FLAG flag_last_element,
671*15dc779aSAndroid Build Coastguard Worker WORD32 *write_program_config_element, WORD32 i_num_coup_channels, WORD32 i_channels_mask,
672*15dc779aSAndroid Build Coastguard Worker WORD32 i_samp_freq, WORD32 ele_idx, WORD32 aot, WORD32 *total_fill_bits) {
673*15dc779aSAndroid Build Coastguard Worker IA_ERRORCODE err_code;
674*15dc779aSAndroid Build Coastguard Worker WORD32 bit_markup, element_used_bits, frame_bits;
675*15dc779aSAndroid Build Coastguard Worker
676*15dc779aSAndroid Build Coastguard Worker bit_markup = ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle);
677*15dc779aSAndroid Build Coastguard Worker
678*15dc779aSAndroid Build Coastguard Worker *glob_used_bits = 0;
679*15dc779aSAndroid Build Coastguard Worker
680*15dc779aSAndroid Build Coastguard Worker {
681*15dc779aSAndroid Build Coastguard Worker WORD32 *ptr_sfb_offset[2];
682*15dc779aSAndroid Build Coastguard Worker ixheaace_temporal_noise_shaping_params tns_info[2];
683*15dc779aSAndroid Build Coastguard Worker
684*15dc779aSAndroid Build Coastguard Worker element_used_bits = 0;
685*15dc779aSAndroid Build Coastguard Worker
686*15dc779aSAndroid Build Coastguard Worker if ((*write_program_config_element == 1) && (ele_idx == 0)) {
687*15dc779aSAndroid Build Coastguard Worker WORD32 samp_rate = i_samp_freq, ch_mask = i_channels_mask, n_cc_ch = i_num_coup_channels;
688*15dc779aSAndroid Build Coastguard Worker
689*15dc779aSAndroid Build Coastguard Worker /*Write Program Config Element*/
690*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, ID_PCE, 3);
691*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_write_pce(samp_rate, ch_mask, n_cc_ch, pstr_bit_stream_handle);
692*15dc779aSAndroid Build Coastguard Worker *write_program_config_element = 0;
693*15dc779aSAndroid Build Coastguard Worker }
694*15dc779aSAndroid Build Coastguard Worker
695*15dc779aSAndroid Build Coastguard Worker switch (pstr_element_info.el_type) {
696*15dc779aSAndroid Build Coastguard Worker case ID_SCE: /* single channel */
697*15dc779aSAndroid Build Coastguard Worker
698*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[0] =
699*15dc779aSAndroid Build Coastguard Worker pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->sfb_offsets;
700*15dc779aSAndroid Build Coastguard Worker tns_info[0] = pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->tns_info;
701*15dc779aSAndroid Build Coastguard Worker
702*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_single_chan_elem(
703*15dc779aSAndroid Build Coastguard Worker pstr_element_info.instance_tag, ptr_sfb_offset[0],
704*15dc779aSAndroid Build Coastguard Worker pstr_qc_out->qc_channel[pstr_element_info.channel_index[0]], pstr_bit_stream_handle,
705*15dc779aSAndroid Build Coastguard Worker aot, tns_info[0], pstr_aac_tables);
706*15dc779aSAndroid Build Coastguard Worker
707*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
708*15dc779aSAndroid Build Coastguard Worker return err_code;
709*15dc779aSAndroid Build Coastguard Worker }
710*15dc779aSAndroid Build Coastguard Worker break;
711*15dc779aSAndroid Build Coastguard Worker
712*15dc779aSAndroid Build Coastguard Worker case ID_CCE: /* single channel independent coupling element*/
713*15dc779aSAndroid Build Coastguard Worker
714*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[0] =
715*15dc779aSAndroid Build Coastguard Worker pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->sfb_offsets;
716*15dc779aSAndroid Build Coastguard Worker tns_info[0] = pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->tns_info;
717*15dc779aSAndroid Build Coastguard Worker
718*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_single_channel_ind_coupling_element(
719*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[0], pstr_qc_out->qc_channel[pstr_element_info.channel_index[0]],
720*15dc779aSAndroid Build Coastguard Worker pstr_bit_stream_handle, aot, tns_info[0], pstr_aac_tables);
721*15dc779aSAndroid Build Coastguard Worker
722*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
723*15dc779aSAndroid Build Coastguard Worker return err_code;
724*15dc779aSAndroid Build Coastguard Worker }
725*15dc779aSAndroid Build Coastguard Worker break;
726*15dc779aSAndroid Build Coastguard Worker
727*15dc779aSAndroid Build Coastguard Worker case ID_LFE: /* single channel */
728*15dc779aSAndroid Build Coastguard Worker
729*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[0] =
730*15dc779aSAndroid Build Coastguard Worker pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->sfb_offsets;
731*15dc779aSAndroid Build Coastguard Worker tns_info[0] = pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->tns_info;
732*15dc779aSAndroid Build Coastguard Worker
733*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_single_channel_element_LFE(
734*15dc779aSAndroid Build Coastguard Worker pstr_element_info.instance_tag, ptr_sfb_offset[0],
735*15dc779aSAndroid Build Coastguard Worker pstr_qc_out->qc_channel[pstr_element_info.channel_index[0]], pstr_bit_stream_handle,
736*15dc779aSAndroid Build Coastguard Worker aot, tns_info[0], pstr_aac_tables);
737*15dc779aSAndroid Build Coastguard Worker
738*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
739*15dc779aSAndroid Build Coastguard Worker return err_code;
740*15dc779aSAndroid Build Coastguard Worker }
741*15dc779aSAndroid Build Coastguard Worker break;
742*15dc779aSAndroid Build Coastguard Worker
743*15dc779aSAndroid Build Coastguard Worker case ID_CPE: /* channel pair */
744*15dc779aSAndroid Build Coastguard Worker {
745*15dc779aSAndroid Build Coastguard Worker WORD32 ms_digest = pstr_psy_out->psy_out_element.tools_info.ms_digest;
746*15dc779aSAndroid Build Coastguard Worker WORD32 *ms_flags = pstr_psy_out->psy_out_element.tools_info.ms_mask;
747*15dc779aSAndroid Build Coastguard Worker
748*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[0] =
749*15dc779aSAndroid Build Coastguard Worker pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->sfb_offsets;
750*15dc779aSAndroid Build Coastguard Worker ptr_sfb_offset[1] =
751*15dc779aSAndroid Build Coastguard Worker pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[1]]->sfb_offsets;
752*15dc779aSAndroid Build Coastguard Worker
753*15dc779aSAndroid Build Coastguard Worker tns_info[0] = pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[0]]->tns_info;
754*15dc779aSAndroid Build Coastguard Worker tns_info[1] = pstr_psy_out->psy_out_ch[pstr_element_info.channel_index[1]]->tns_info;
755*15dc779aSAndroid Build Coastguard Worker
756*15dc779aSAndroid Build Coastguard Worker err_code = ia_enhaacplus_enc_write_channel_pair_element(
757*15dc779aSAndroid Build Coastguard Worker pstr_element_info.instance_tag, ms_digest, ms_flags, ptr_sfb_offset,
758*15dc779aSAndroid Build Coastguard Worker pstr_qc_out->qc_channel[pstr_element_info.channel_index[0]], pstr_bit_stream_handle,
759*15dc779aSAndroid Build Coastguard Worker aot, tns_info, pstr_aac_tables);
760*15dc779aSAndroid Build Coastguard Worker if (err_code != IA_NO_ERROR) {
761*15dc779aSAndroid Build Coastguard Worker return err_code;
762*15dc779aSAndroid Build Coastguard Worker }
763*15dc779aSAndroid Build Coastguard Worker } break;
764*15dc779aSAndroid Build Coastguard Worker
765*15dc779aSAndroid Build Coastguard Worker default:
766*15dc779aSAndroid Build Coastguard Worker return IA_EXHEAACE_INIT_FATAL_INVALID_ELEMENT_TYPE;
767*15dc779aSAndroid Build Coastguard Worker
768*15dc779aSAndroid Build Coastguard Worker } /* switch */
769*15dc779aSAndroid Build Coastguard Worker
770*15dc779aSAndroid Build Coastguard Worker element_used_bits -= bit_markup;
771*15dc779aSAndroid Build Coastguard Worker
772*15dc779aSAndroid Build Coastguard Worker bit_markup = ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle);
773*15dc779aSAndroid Build Coastguard Worker
774*15dc779aSAndroid Build Coastguard Worker frame_bits = element_used_bits + bit_markup;
775*15dc779aSAndroid Build Coastguard Worker }
776*15dc779aSAndroid Build Coastguard Worker
777*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
778*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_write_fill_element_LC(ptr_anc_bytes, pstr_qc_out->tot_anc_bits_used,
779*15dc779aSAndroid Build Coastguard Worker pstr_bit_stream_handle);
780*15dc779aSAndroid Build Coastguard Worker }
781*15dc779aSAndroid Build Coastguard Worker
782*15dc779aSAndroid Build Coastguard Worker if (flag_last_element) {
783*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LC || aot == AOT_SBR || aot == AOT_PS) {
784*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_write_fill_element_LC(NULL, *total_fill_bits, pstr_bit_stream_handle);
785*15dc779aSAndroid Build Coastguard Worker
786*15dc779aSAndroid Build Coastguard Worker *total_fill_bits = 0;
787*15dc779aSAndroid Build Coastguard Worker
788*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, ID_END, 3);
789*15dc779aSAndroid Build Coastguard Worker }
790*15dc779aSAndroid Build Coastguard Worker
791*15dc779aSAndroid Build Coastguard Worker if (aot == AOT_AAC_LD || aot == AOT_AAC_ELD) {
792*15dc779aSAndroid Build Coastguard Worker {
793*15dc779aSAndroid Build Coastguard Worker WORD32 i, cnt = 0;
794*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_write_fill_element_LD(ptr_anc_bytes, pstr_qc_out->tot_anc_bits_used,
795*15dc779aSAndroid Build Coastguard Worker pstr_bit_stream_handle);
796*15dc779aSAndroid Build Coastguard Worker
797*15dc779aSAndroid Build Coastguard Worker *total_fill_bits += pstr_qc_out->total_fill_bits;
798*15dc779aSAndroid Build Coastguard Worker *total_fill_bits += pstr_qc_out->align_bits;
799*15dc779aSAndroid Build Coastguard Worker cnt = *total_fill_bits >> 3;
800*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < cnt; i++) {
801*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, 8);
802*15dc779aSAndroid Build Coastguard Worker }
803*15dc779aSAndroid Build Coastguard Worker cnt = *total_fill_bits - (cnt << 3);
804*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0, (UWORD8)cnt);
805*15dc779aSAndroid Build Coastguard Worker *total_fill_bits = 0;
806*15dc779aSAndroid Build Coastguard Worker }
807*15dc779aSAndroid Build Coastguard Worker }
808*15dc779aSAndroid Build Coastguard Worker /* byte alignement */
809*15dc779aSAndroid Build Coastguard Worker
810*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0,
811*15dc779aSAndroid Build Coastguard Worker (UWORD8)((8 - (pstr_bit_stream_handle->cnt_bits % 8)) % 8));
812*15dc779aSAndroid Build Coastguard Worker }
813*15dc779aSAndroid Build Coastguard Worker
814*15dc779aSAndroid Build Coastguard Worker *glob_used_bits -= bit_markup;
815*15dc779aSAndroid Build Coastguard Worker
816*15dc779aSAndroid Build Coastguard Worker bit_markup = ia_enhaacplus_enc_get_bits_available(pstr_bit_stream_handle);
817*15dc779aSAndroid Build Coastguard Worker
818*15dc779aSAndroid Build Coastguard Worker *glob_used_bits += bit_markup;
819*15dc779aSAndroid Build Coastguard Worker
820*15dc779aSAndroid Build Coastguard Worker frame_bits += *glob_used_bits;
821*15dc779aSAndroid Build Coastguard Worker
822*15dc779aSAndroid Build Coastguard Worker if (frame_bits != pstr_qc_out->tot_static_bits_used + pstr_qc_out->tot_dyn_bits_used +
823*15dc779aSAndroid Build Coastguard Worker pstr_qc_out->tot_anc_bits_used + +pstr_qc_out->total_fill_bits +
824*15dc779aSAndroid Build Coastguard Worker pstr_qc_out->align_bits) {
825*15dc779aSAndroid Build Coastguard Worker }
826*15dc779aSAndroid Build Coastguard Worker
827*15dc779aSAndroid Build Coastguard Worker return IA_NO_ERROR;
828*15dc779aSAndroid Build Coastguard Worker }
829