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 "ixheaac_type_def.h"
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_psy_const.h"
24*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns.h"
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_tns_params.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_rom.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_rom.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_bitbuffer.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_aac_constants.h"
30*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_write_adts_adif.h"
31*15dc779aSAndroid Build Coastguard Worker
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
35*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaace_common_utils.h"
37*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_putbit(ixheaace_bitstream_params * pstr_bitstream,UWORD32 data,WORD32 num_bit)38*15dc779aSAndroid Build Coastguard Worker static VOID ia_enhaacplus_enc_putbit(ixheaace_bitstream_params *pstr_bitstream, UWORD32 data,
39*15dc779aSAndroid Build Coastguard Worker WORD32 num_bit) {
40*15dc779aSAndroid Build Coastguard Worker WORD32 num, max_num, curr_num;
41*15dc779aSAndroid Build Coastguard Worker WORD32 num_used, idx;
42*15dc779aSAndroid Build Coastguard Worker unsigned long bits;
43*15dc779aSAndroid Build Coastguard Worker WORD32 current_bitstream_bit;
44*15dc779aSAndroid Build Coastguard Worker UWORD8 *bitstream_data;
45*15dc779aSAndroid Build Coastguard Worker
46*15dc779aSAndroid Build Coastguard Worker if (num_bit == 0) return;
47*15dc779aSAndroid Build Coastguard Worker
48*15dc779aSAndroid Build Coastguard Worker current_bitstream_bit = pstr_bitstream->current_bit;
49*15dc779aSAndroid Build Coastguard Worker bitstream_data = pstr_bitstream->data;
50*15dc779aSAndroid Build Coastguard Worker
51*15dc779aSAndroid Build Coastguard Worker /*
52*15dc779aSAndroid Build Coastguard Worker Functionality of Writing bits to the bitstream is split into 3 stages.
53*15dc779aSAndroid Build Coastguard Worker */
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker /*
56*15dc779aSAndroid Build Coastguard Worker Stage #1: Write remainder bits to the partially filled byte
57*15dc779aSAndroid Build Coastguard Worker */
58*15dc779aSAndroid Build Coastguard Worker
59*15dc779aSAndroid Build Coastguard Worker num = 0;
60*15dc779aSAndroid Build Coastguard Worker num_used = current_bitstream_bit & 7;
61*15dc779aSAndroid Build Coastguard Worker max_num = BYTE_NUMBIT - num_used;
62*15dc779aSAndroid Build Coastguard Worker curr_num = MIN(num_bit, max_num);
63*15dc779aSAndroid Build Coastguard Worker bits = data >> (num_bit - curr_num);
64*15dc779aSAndroid Build Coastguard Worker
65*15dc779aSAndroid Build Coastguard Worker idx = (current_bitstream_bit >> 3);
66*15dc779aSAndroid Build Coastguard Worker
67*15dc779aSAndroid Build Coastguard Worker if (num_used == 0) bitstream_data[idx] = 0;
68*15dc779aSAndroid Build Coastguard Worker
69*15dc779aSAndroid Build Coastguard Worker bitstream_data[idx] |= (bits & ((1 << curr_num) - 1)) << (max_num - curr_num);
70*15dc779aSAndroid Build Coastguard Worker current_bitstream_bit += curr_num;
71*15dc779aSAndroid Build Coastguard Worker num += curr_num;
72*15dc779aSAndroid Build Coastguard Worker
73*15dc779aSAndroid Build Coastguard Worker /*
74*15dc779aSAndroid Build Coastguard Worker Stage #2:
75*15dc779aSAndroid Build Coastguard Worker At this point, (num + num_used), will be a multiple of 8
76*15dc779aSAndroid Build Coastguard Worker Now the bytes can be written directly to bitstream_data[], as long
77*15dc779aSAndroid Build Coastguard Worker as (num + 8) < num_bit
78*15dc779aSAndroid Build Coastguard Worker */
79*15dc779aSAndroid Build Coastguard Worker
80*15dc779aSAndroid Build Coastguard Worker while ((num + 8) < num_bit) {
81*15dc779aSAndroid Build Coastguard Worker num += 8;
82*15dc779aSAndroid Build Coastguard Worker current_bitstream_bit += 8;
83*15dc779aSAndroid Build Coastguard Worker bits = data >> (num_bit - num);
84*15dc779aSAndroid Build Coastguard Worker bitstream_data[++idx] = (UWORD8)bits;
85*15dc779aSAndroid Build Coastguard Worker }
86*15dc779aSAndroid Build Coastguard Worker
87*15dc779aSAndroid Build Coastguard Worker /*
88*15dc779aSAndroid Build Coastguard Worker Stage #3: Write remainder bits from the data
89*15dc779aSAndroid Build Coastguard Worker */
90*15dc779aSAndroid Build Coastguard Worker if (num < num_bit) {
91*15dc779aSAndroid Build Coastguard Worker curr_num = num_bit - num;
92*15dc779aSAndroid Build Coastguard Worker num_used = current_bitstream_bit & 7;
93*15dc779aSAndroid Build Coastguard Worker max_num = BYTE_NUMBIT - num_used;
94*15dc779aSAndroid Build Coastguard Worker idx = current_bitstream_bit >> 3;
95*15dc779aSAndroid Build Coastguard Worker if (num_used == 0) bitstream_data[idx] = 0;
96*15dc779aSAndroid Build Coastguard Worker bitstream_data[idx] |= (data & ((1 << curr_num) - 1)) << (max_num - curr_num);
97*15dc779aSAndroid Build Coastguard Worker current_bitstream_bit += curr_num;
98*15dc779aSAndroid Build Coastguard Worker }
99*15dc779aSAndroid Build Coastguard Worker
100*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->current_bit = current_bitstream_bit;
101*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->num_bit = current_bitstream_bit;
102*15dc779aSAndroid Build Coastguard Worker }
103*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_get_sample_rate_index(WORD32 sample_rate)104*15dc779aSAndroid Build Coastguard Worker static WORD16 ia_enhaacplus_enc_get_sample_rate_index(WORD32 sample_rate) {
105*15dc779aSAndroid Build Coastguard Worker if (92017 <= sample_rate) {
106*15dc779aSAndroid Build Coastguard Worker return 0;
107*15dc779aSAndroid Build Coastguard Worker }
108*15dc779aSAndroid Build Coastguard Worker if (75132 <= sample_rate) {
109*15dc779aSAndroid Build Coastguard Worker return 1;
110*15dc779aSAndroid Build Coastguard Worker }
111*15dc779aSAndroid Build Coastguard Worker if (55426 <= sample_rate) {
112*15dc779aSAndroid Build Coastguard Worker return 2;
113*15dc779aSAndroid Build Coastguard Worker }
114*15dc779aSAndroid Build Coastguard Worker if (46009 <= sample_rate) {
115*15dc779aSAndroid Build Coastguard Worker return 3;
116*15dc779aSAndroid Build Coastguard Worker }
117*15dc779aSAndroid Build Coastguard Worker if (37566 <= sample_rate) {
118*15dc779aSAndroid Build Coastguard Worker return 4;
119*15dc779aSAndroid Build Coastguard Worker }
120*15dc779aSAndroid Build Coastguard Worker if (27713 <= sample_rate) {
121*15dc779aSAndroid Build Coastguard Worker return 5;
122*15dc779aSAndroid Build Coastguard Worker }
123*15dc779aSAndroid Build Coastguard Worker if (23004 <= sample_rate) {
124*15dc779aSAndroid Build Coastguard Worker return 6;
125*15dc779aSAndroid Build Coastguard Worker }
126*15dc779aSAndroid Build Coastguard Worker if (18783 <= sample_rate) {
127*15dc779aSAndroid Build Coastguard Worker return 7;
128*15dc779aSAndroid Build Coastguard Worker }
129*15dc779aSAndroid Build Coastguard Worker if (13856 <= sample_rate) {
130*15dc779aSAndroid Build Coastguard Worker return 8;
131*15dc779aSAndroid Build Coastguard Worker }
132*15dc779aSAndroid Build Coastguard Worker if (11502 <= sample_rate) {
133*15dc779aSAndroid Build Coastguard Worker return 9;
134*15dc779aSAndroid Build Coastguard Worker }
135*15dc779aSAndroid Build Coastguard Worker if (9391 <= sample_rate) {
136*15dc779aSAndroid Build Coastguard Worker return 10;
137*15dc779aSAndroid Build Coastguard Worker }
138*15dc779aSAndroid Build Coastguard Worker return 11;
139*15dc779aSAndroid Build Coastguard Worker }
140*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_pce(WORD32 samp_rate,WORD32 ch_mask,WORD32 num_core_coder_chans,ixheaace_bit_buf_handle pstr_bit_stream_handle)141*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_write_pce(WORD32 samp_rate, WORD32 ch_mask, WORD32 num_core_coder_chans,
142*15dc779aSAndroid Build Coastguard Worker ixheaace_bit_buf_handle pstr_bit_stream_handle) {
143*15dc779aSAndroid Build Coastguard Worker UWORD32 object_type = 0;
144*15dc779aSAndroid Build Coastguard Worker UWORD8 buffer[200];
145*15dc779aSAndroid Build Coastguard Worker ixheaace_bitstream_params bitstream_temp;
146*15dc779aSAndroid Build Coastguard Worker ixheaace_bitstream_params *pstr_bitstream = &bitstream_temp;
147*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = 1;
148*15dc779aSAndroid Build Coastguard Worker WORD32 start_bits = pstr_bit_stream_handle->cnt_bits, end_bits;
149*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->data = buffer;
150*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->num_bit = 8;
151*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->current_bit = 0;
152*15dc779aSAndroid Build Coastguard Worker
153*15dc779aSAndroid Build Coastguard Worker object_type = 01;
154*15dc779aSAndroid Build Coastguard Worker
155*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
156*15dc779aSAndroid Build Coastguard Worker WORD32 i;
157*15dc779aSAndroid Build Coastguard Worker WORD32 num_front_chan_ele, num_side_chan_ele, num_back_chan_ele, num_lfe_chan_ele;
158*15dc779aSAndroid Build Coastguard Worker
159*15dc779aSAndroid Build Coastguard Worker /* element instance tag can be anything... writing 0 */
160*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 4);
161*15dc779aSAndroid Build Coastguard Worker
162*15dc779aSAndroid Build Coastguard Worker /* object type --> LC / LTP / any other */
163*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, object_type, 2);
164*15dc779aSAndroid Build Coastguard Worker
165*15dc779aSAndroid Build Coastguard Worker /* sampling freq index */
166*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle,
167*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_get_sample_rate_index(samp_rate), 4);
168*15dc779aSAndroid Build Coastguard Worker
169*15dc779aSAndroid Build Coastguard Worker /* num_front_channel_elements --> only this present for mono / stereo */
170*15dc779aSAndroid Build Coastguard Worker num_front_chan_ele = 0;
171*15dc779aSAndroid Build Coastguard Worker
172*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0x3) {
173*15dc779aSAndroid Build Coastguard Worker num_front_chan_ele++; /*Front Left and Right Present*/
174*15dc779aSAndroid Build Coastguard Worker }
175*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0x4) {
176*15dc779aSAndroid Build Coastguard Worker num_front_chan_ele++; /*Front Center Present*/
177*15dc779aSAndroid Build Coastguard Worker }
178*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, num_front_chan_ele, 4);
179*15dc779aSAndroid Build Coastguard Worker
180*15dc779aSAndroid Build Coastguard Worker /* num_side_channel_elements 4 */
181*15dc779aSAndroid Build Coastguard Worker num_side_chan_ele = 0;
182*15dc779aSAndroid Build Coastguard Worker
183*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0xC0) {
184*15dc779aSAndroid Build Coastguard Worker num_side_chan_ele++; /*Back Left and Right Present*/
185*15dc779aSAndroid Build Coastguard Worker }
186*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, num_side_chan_ele, 4);
187*15dc779aSAndroid Build Coastguard Worker
188*15dc779aSAndroid Build Coastguard Worker /* num_back_channel_elements 4 */
189*15dc779aSAndroid Build Coastguard Worker num_back_chan_ele = 0;
190*15dc779aSAndroid Build Coastguard Worker
191*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0x30) {
192*15dc779aSAndroid Build Coastguard Worker num_back_chan_ele++; /*Back Left and Right of center Present*/
193*15dc779aSAndroid Build Coastguard Worker }
194*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, num_back_chan_ele, 4);
195*15dc779aSAndroid Build Coastguard Worker
196*15dc779aSAndroid Build Coastguard Worker /* num_lfe_channel_elements 2 */
197*15dc779aSAndroid Build Coastguard Worker num_lfe_chan_ele = 0;
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0x8) {
200*15dc779aSAndroid Build Coastguard Worker num_lfe_chan_ele++; /*LFE channel Present*/
201*15dc779aSAndroid Build Coastguard Worker }
202*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, num_lfe_chan_ele, 2);
203*15dc779aSAndroid Build Coastguard Worker
204*15dc779aSAndroid Build Coastguard Worker /* num_assoc_data_elements 3 */
205*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 3);
206*15dc779aSAndroid Build Coastguard Worker
207*15dc779aSAndroid Build Coastguard Worker /* num_valid_cc_elements 4 */
208*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, num_core_coder_chans, 4);
209*15dc779aSAndroid Build Coastguard Worker
210*15dc779aSAndroid Build Coastguard Worker /* mono mix down is zero */
211*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
212*15dc779aSAndroid Build Coastguard Worker
213*15dc779aSAndroid Build Coastguard Worker /* mono_mixdown_element_number 4 if mono_mixdown_present == 1 */
214*15dc779aSAndroid Build Coastguard Worker
215*15dc779aSAndroid Build Coastguard Worker /* stereo_mixdown_present is zero */
216*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
217*15dc779aSAndroid Build Coastguard Worker
218*15dc779aSAndroid Build Coastguard Worker /* stereo_mixdown_element_number 4 if stereo_mixdown_present == 1 */
219*15dc779aSAndroid Build Coastguard Worker
220*15dc779aSAndroid Build Coastguard Worker /* matrix_mixdown_idx_present is zero */
221*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
222*15dc779aSAndroid Build Coastguard Worker
223*15dc779aSAndroid Build Coastguard Worker {
224*15dc779aSAndroid Build Coastguard Worker /* stereo --> 1 mono --> 0 */
225*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0x4) {
226*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
227*15dc779aSAndroid Build Coastguard Worker /* element tag select */
228*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 4);
229*15dc779aSAndroid Build Coastguard Worker }
230*15dc779aSAndroid Build Coastguard Worker if (ch_mask & 0x3) {
231*15dc779aSAndroid Build Coastguard Worker if ((ch_mask & 0x3) == 0x3) {
232*15dc779aSAndroid Build Coastguard Worker /* stereo channel */
233*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x01, 1);
234*15dc779aSAndroid Build Coastguard Worker } else {
235*15dc779aSAndroid Build Coastguard Worker /* mono channel */
236*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
237*15dc779aSAndroid Build Coastguard Worker }
238*15dc779aSAndroid Build Coastguard Worker
239*15dc779aSAndroid Build Coastguard Worker /* element tag select */
240*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 4);
241*15dc779aSAndroid Build Coastguard Worker }
242*15dc779aSAndroid Build Coastguard Worker }
243*15dc779aSAndroid Build Coastguard Worker
244*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_side_chan_ele; i++) {
245*15dc779aSAndroid Build Coastguard Worker if ((ch_mask & 0xC0) == 0xC0) {
246*15dc779aSAndroid Build Coastguard Worker /* stereo channel */
247*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x01, 1);
248*15dc779aSAndroid Build Coastguard Worker } else {
249*15dc779aSAndroid Build Coastguard Worker /* mono channel */
250*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
251*15dc779aSAndroid Build Coastguard Worker }
252*15dc779aSAndroid Build Coastguard Worker
253*15dc779aSAndroid Build Coastguard Worker /* element tag select */
254*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x02, 4);
255*15dc779aSAndroid Build Coastguard Worker }
256*15dc779aSAndroid Build Coastguard Worker
257*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_back_chan_ele; i++) {
258*15dc779aSAndroid Build Coastguard Worker if ((ch_mask & 0x30) == 0x30) {
259*15dc779aSAndroid Build Coastguard Worker /* stereo channel */
260*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x01, 1);
261*15dc779aSAndroid Build Coastguard Worker } else {
262*15dc779aSAndroid Build Coastguard Worker /* mono channel */
263*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 1);
264*15dc779aSAndroid Build Coastguard Worker }
265*15dc779aSAndroid Build Coastguard Worker
266*15dc779aSAndroid Build Coastguard Worker /* element tag select */
267*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x01, 4);
268*15dc779aSAndroid Build Coastguard Worker }
269*15dc779aSAndroid Build Coastguard Worker
270*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_lfe_chan_ele; i++) {
271*15dc779aSAndroid Build Coastguard Worker /* element tag select */
272*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 4);
273*15dc779aSAndroid Build Coastguard Worker }
274*15dc779aSAndroid Build Coastguard Worker
275*15dc779aSAndroid Build Coastguard Worker /* loop for independent coupling elements */
276*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < num_core_coder_chans; i++) {
277*15dc779aSAndroid Build Coastguard Worker /* It is independent coupling channel */
278*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x01, 1);
279*15dc779aSAndroid Build Coastguard Worker
280*15dc779aSAndroid Build Coastguard Worker /* element tag select */
281*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, num_core_coder_chans - i - 1, 4);
282*15dc779aSAndroid Build Coastguard Worker }
283*15dc779aSAndroid Build Coastguard Worker
284*15dc779aSAndroid Build Coastguard Worker /* byte align the stream */
285*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0,
286*15dc779aSAndroid Build Coastguard Worker (UWORD8)((8 - (pstr_bit_stream_handle->cnt_bits % 8)) % 8));
287*15dc779aSAndroid Build Coastguard Worker /* comment field types --> do not quite know what this is */
288*15dc779aSAndroid Build Coastguard Worker ixheaace_write_bits(pstr_bit_stream_handle, 0x00, 8);
289*15dc779aSAndroid Build Coastguard Worker }
290*15dc779aSAndroid Build Coastguard Worker
291*15dc779aSAndroid Build Coastguard Worker end_bits = pstr_bit_stream_handle->cnt_bits;
292*15dc779aSAndroid Build Coastguard Worker
293*15dc779aSAndroid Build Coastguard Worker return (end_bits - start_bits);
294*15dc779aSAndroid Build Coastguard Worker }
295*15dc779aSAndroid Build Coastguard Worker
ia_enhaacplus_enc_write_ADTS_header(pUWORD8 buffer,WORD32 bytes_used,WORD32 samp_rate,WORD32 num_ch)296*15dc779aSAndroid Build Coastguard Worker WORD32 ia_enhaacplus_enc_write_ADTS_header(pUWORD8 buffer, WORD32 bytes_used, WORD32 samp_rate,
297*15dc779aSAndroid Build Coastguard Worker WORD32 num_ch) {
298*15dc779aSAndroid Build Coastguard Worker WORD32 bits = 56;
299*15dc779aSAndroid Build Coastguard Worker UWORD32 object_type = 0;
300*15dc779aSAndroid Build Coastguard Worker ixheaace_bitstream_params bitstream_temp;
301*15dc779aSAndroid Build Coastguard Worker ixheaace_bitstream_params *pstr_bitstream = &bitstream_temp;
302*15dc779aSAndroid Build Coastguard Worker WORD32 write_flag = 1;
303*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->data = buffer;
304*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->num_bit = 8;
305*15dc779aSAndroid Build Coastguard Worker
306*15dc779aSAndroid Build Coastguard Worker pstr_bitstream->current_bit = 0;
307*15dc779aSAndroid Build Coastguard Worker ;
308*15dc779aSAndroid Build Coastguard Worker object_type = 01;
309*15dc779aSAndroid Build Coastguard Worker
310*15dc779aSAndroid Build Coastguard Worker if (write_flag) {
311*15dc779aSAndroid Build Coastguard Worker /* Fixed ADTS header */
312*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0xFFFF, 12); /* 12 bit Syncword */
313*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 1 /*aacStateStruct->aacConfigSturct.mpegVersion*/,
314*15dc779aSAndroid Build Coastguard Worker 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */
315*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 2); /* layer == 0 */
316*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 1, 1); /* protection absent */
317*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, object_type, 2); /* profile */
318*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(
319*15dc779aSAndroid Build Coastguard Worker pstr_bitstream,
320*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_get_sample_rate_index(samp_rate) /*aacStateStruct->sampleRateIdx*/,
321*15dc779aSAndroid Build Coastguard Worker 4); /* sampling rate */
322*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 1); /* private bit */
323*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, num_ch /*aacStateStruct->aacConfigSturct.ch*/,
324*15dc779aSAndroid Build Coastguard Worker 3); /* ch. aacConfigSturct (must be > 0) */
325*15dc779aSAndroid Build Coastguard Worker /* simply using num_channels only works for
326*15dc779aSAndroid Build Coastguard Worker 6 channels or less, else a channel
327*15dc779aSAndroid Build Coastguard Worker configuration should be written */
328*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 1); /* original/copy */
329*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 1); /* home */
330*15dc779aSAndroid Build Coastguard Worker
331*15dc779aSAndroid Build Coastguard Worker /* Variable ADTS header */
332*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 1); /* copyr. id. bit */
333*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 1); /* copyr. id. start */
334*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, /*aacStateStruct->*/ bytes_used + 7, 13);
335*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0x7FF, 11); /* buffer fullness (0x7FF for VBR) */
336*15dc779aSAndroid Build Coastguard Worker
337*15dc779aSAndroid Build Coastguard Worker ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 2); /* raw data blocks (0+1=1) */
338*15dc779aSAndroid Build Coastguard Worker }
339*15dc779aSAndroid Build Coastguard Worker
340*15dc779aSAndroid Build Coastguard Worker /*
341*15dc779aSAndroid Build Coastguard Worker * MPEG2 says byte_aligment() here, but ADTS always is multiple of 8 bits
342*15dc779aSAndroid Build Coastguard Worker * MPEG4 has no byte_alignment() here
343*15dc779aSAndroid Build Coastguard Worker */
344*15dc779aSAndroid Build Coastguard Worker return bits / 8;
345*15dc779aSAndroid Build Coastguard Worker }
346