1*15dc779aSAndroid Build Coastguard Worker /******************************************************************************
2*15dc779aSAndroid Build Coastguard Worker * *
3*15dc779aSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project
4*15dc779aSAndroid Build Coastguard Worker *
5*15dc779aSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*15dc779aSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*15dc779aSAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*15dc779aSAndroid Build Coastguard Worker *
9*15dc779aSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*15dc779aSAndroid Build Coastguard Worker *
11*15dc779aSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*15dc779aSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*15dc779aSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*15dc779aSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*15dc779aSAndroid Build Coastguard Worker * limitations under the License.
16*15dc779aSAndroid Build Coastguard Worker *
17*15dc779aSAndroid Build Coastguard Worker *****************************************************************************
18*15dc779aSAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*15dc779aSAndroid Build Coastguard Worker */
20*15dc779aSAndroid Build Coastguard Worker #include <stdio.h>
21*15dc779aSAndroid Build Coastguard Worker #include <string.h>
22*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_common.h"
23*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_type_def.h"
24*15dc779aSAndroid Build Coastguard Worker
25*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_constants.h"
26*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops32.h"
27*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops16.h"
28*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops40.h"
29*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_ops.h"
30*15dc779aSAndroid Build Coastguard Worker
31*15dc779aSAndroid Build Coastguard Worker #include "ixheaac_basic_op.h"
32*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_intrinsics.h"
33*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_bitbuffer.h"
34*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_defines.h"
35*15dc779aSAndroid Build Coastguard Worker
36*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pns.h"
37*15dc779aSAndroid Build Coastguard Worker
38*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_aac_rom.h"
39*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_pulsedata.h"
40*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_data_struct.h"
41*15dc779aSAndroid Build Coastguard Worker
42*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_lt_predict.h"
43*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_cnst.h"
44*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_defines.h"
45*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_ec_struct_def.h"
46*15dc779aSAndroid Build Coastguard Worker
47*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_channelinfo.h"
48*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_drc_dec.h"
49*15dc779aSAndroid Build Coastguard Worker
50*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbrdecoder.h"
51*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_sbr_payload.h"
52*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_audioobjtypes.h"
53*15dc779aSAndroid Build Coastguard Worker #include "ixheaacd_error_codes.h"
54*15dc779aSAndroid Build Coastguard Worker
55*15dc779aSAndroid Build Coastguard Worker #define SBR_EXTENSION_MPEG SBR_EXTENSION
56*15dc779aSAndroid Build Coastguard Worker
57*15dc779aSAndroid Build Coastguard Worker #define SBR_EXTENSION_CRC_MPEG SBR_EXTENSION_CRC
58*15dc779aSAndroid Build Coastguard Worker
ixheaacd_check_for_sbr_payload(ia_bit_buf_struct * it_bit_buff,ia_aac_dec_sbr_bitstream_struct * pstr_stream_sbr,WORD16 prev_element,ia_drc_dec_struct * pstr_drc_dec,WORD32 object_type,WORD32 adtsheader,WORD32 cnt_bits,WORD32 ld_sbr_crc_flag,ia_drc_dec_struct * drc_dummy,UWORD8 * mps_buffer,WORD32 * mps_header,WORD32 * mps_bytes,WORD32 is_init,WORD32 * is_first,WORD32 ec_flag)59*15dc779aSAndroid Build Coastguard Worker FLAG ixheaacd_check_for_sbr_payload(ia_bit_buf_struct *it_bit_buff,
60*15dc779aSAndroid Build Coastguard Worker ia_aac_dec_sbr_bitstream_struct *pstr_stream_sbr,
61*15dc779aSAndroid Build Coastguard Worker WORD16 prev_element, ia_drc_dec_struct *pstr_drc_dec,
62*15dc779aSAndroid Build Coastguard Worker WORD32 object_type, WORD32 adtsheader, WORD32 cnt_bits,
63*15dc779aSAndroid Build Coastguard Worker WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy,
64*15dc779aSAndroid Build Coastguard Worker UWORD8 *mps_buffer, WORD32 *mps_header, WORD32 *mps_bytes,
65*15dc779aSAndroid Build Coastguard Worker WORD32 is_init, WORD32 *is_first, WORD32 ec_flag) {
66*15dc779aSAndroid Build Coastguard Worker FLAG ret = 0;
67*15dc779aSAndroid Build Coastguard Worker WORD32 count;
68*15dc779aSAndroid Build Coastguard Worker
69*15dc779aSAndroid Build Coastguard Worker if (object_type == AOT_ER_AAC_ELD) {
70*15dc779aSAndroid Build Coastguard Worker count = it_bit_buff->cnt_bits >> 3;
71*15dc779aSAndroid Build Coastguard Worker if (adtsheader == 1) count = cnt_bits >> 3;
72*15dc779aSAndroid Build Coastguard Worker } else {
73*15dc779aSAndroid Build Coastguard Worker count = ixheaacd_read_bits_buf(it_bit_buff, 4);
74*15dc779aSAndroid Build Coastguard Worker
75*15dc779aSAndroid Build Coastguard Worker if ((count - 15) == 0) {
76*15dc779aSAndroid Build Coastguard Worker WORD32 esc_count;
77*15dc779aSAndroid Build Coastguard Worker esc_count = ixheaacd_read_bits_buf(it_bit_buff, 8);
78*15dc779aSAndroid Build Coastguard Worker count = (esc_count + 14);
79*15dc779aSAndroid Build Coastguard Worker }
80*15dc779aSAndroid Build Coastguard Worker }
81*15dc779aSAndroid Build Coastguard Worker
82*15dc779aSAndroid Build Coastguard Worker if (count > 0) {
83*15dc779aSAndroid Build Coastguard Worker WORD32 extension_type;
84*15dc779aSAndroid Build Coastguard Worker
85*15dc779aSAndroid Build Coastguard Worker if (object_type == AOT_ER_AAC_ELD)
86*15dc779aSAndroid Build Coastguard Worker extension_type = ld_sbr_crc_flag ? SBR_EXTENSION_CRC : SBR_EXTENSION;
87*15dc779aSAndroid Build Coastguard Worker else
88*15dc779aSAndroid Build Coastguard Worker extension_type = ixheaacd_read_bits_buf(it_bit_buff, 4);
89*15dc779aSAndroid Build Coastguard Worker
90*15dc779aSAndroid Build Coastguard Worker if (((count < MAXSBRBYTES)) &&
91*15dc779aSAndroid Build Coastguard Worker (((extension_type == SBR_EXTENSION)) || ((extension_type == SBR_EXTENSION_CRC))) &&
92*15dc779aSAndroid Build Coastguard Worker ((prev_element == SBR_ID_SCE) || (prev_element == SBR_ID_CPE) ||
93*15dc779aSAndroid Build Coastguard Worker sub_d(prev_element, SBR_ID_CCE) == 0)
94*15dc779aSAndroid Build Coastguard Worker
95*15dc779aSAndroid Build Coastguard Worker ) {
96*15dc779aSAndroid Build Coastguard Worker WORD32 no_elements = pstr_stream_sbr->no_elements;
97*15dc779aSAndroid Build Coastguard Worker WORD32 byte_count;
98*15dc779aSAndroid Build Coastguard Worker ia_sbr_element_stream_struct *ptr_stream_sbr;
99*15dc779aSAndroid Build Coastguard Worker
100*15dc779aSAndroid Build Coastguard Worker ret = 1;
101*15dc779aSAndroid Build Coastguard Worker
102*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr = &pstr_stream_sbr->str_sbr_ele[no_elements];
103*15dc779aSAndroid Build Coastguard Worker
104*15dc779aSAndroid Build Coastguard Worker if (ec_flag) {
105*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload = ptr_stream_sbr->size_payload_old;
106*15dc779aSAndroid Build Coastguard Worker byte_count = ptr_stream_sbr->size_payload;
107*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->extension_type = ptr_stream_sbr->prev_extension_type;
108*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->sbr_ele_id = ptr_stream_sbr->prev_sbr_ele_id;
109*15dc779aSAndroid Build Coastguard Worker }
110*15dc779aSAndroid Build Coastguard Worker
111*15dc779aSAndroid Build Coastguard Worker if (ec_flag) {
112*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload_old = count;
113*15dc779aSAndroid Build Coastguard Worker byte_count = ptr_stream_sbr->size_payload_old;
114*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->prev_extension_type = extension_type;
115*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->prev_sbr_ele_id = prev_element;
116*15dc779aSAndroid Build Coastguard Worker } else {
117*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload = count;
118*15dc779aSAndroid Build Coastguard Worker byte_count = ptr_stream_sbr->size_payload;
119*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->extension_type = extension_type;
120*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->sbr_ele_id = prev_element;
121*15dc779aSAndroid Build Coastguard Worker }
122*15dc779aSAndroid Build Coastguard Worker pstr_stream_sbr->no_elements = no_elements + 1;
123*15dc779aSAndroid Build Coastguard Worker
124*15dc779aSAndroid Build Coastguard Worker if (pstr_drc_dec) pstr_drc_dec->sbr_found = 1;
125*15dc779aSAndroid Build Coastguard Worker
126*15dc779aSAndroid Build Coastguard Worker if (ec_flag) {
127*15dc779aSAndroid Build Coastguard Worker memcpy(ptr_stream_sbr->ptr_sbr_data, ptr_stream_sbr->sbr_prev_data,
128*15dc779aSAndroid Build Coastguard Worker sizeof(ptr_stream_sbr->sbr_prev_data));
129*15dc779aSAndroid Build Coastguard Worker }
130*15dc779aSAndroid Build Coastguard Worker
131*15dc779aSAndroid Build Coastguard Worker if (byte_count > 0 && sub_d(byte_count, MAXSBRBYTES) <= 0) {
132*15dc779aSAndroid Build Coastguard Worker WORD32 i;
133*15dc779aSAndroid Build Coastguard Worker WORD8 *ptr_sbr_data;
134*15dc779aSAndroid Build Coastguard Worker if (object_type != AOT_ER_AAC_ELD) {
135*15dc779aSAndroid Build Coastguard Worker if (ec_flag) {
136*15dc779aSAndroid Build Coastguard Worker ptr_sbr_data = &ptr_stream_sbr->sbr_prev_data[1];
137*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->sbr_prev_data[0] = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
138*15dc779aSAndroid Build Coastguard Worker } else {
139*15dc779aSAndroid Build Coastguard Worker ptr_sbr_data = &ptr_stream_sbr->ptr_sbr_data[1];
140*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->ptr_sbr_data[0] = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
141*15dc779aSAndroid Build Coastguard Worker }
142*15dc779aSAndroid Build Coastguard Worker } else {
143*15dc779aSAndroid Build Coastguard Worker if (ec_flag) {
144*15dc779aSAndroid Build Coastguard Worker ptr_sbr_data = ptr_stream_sbr->sbr_prev_data;
145*15dc779aSAndroid Build Coastguard Worker } else {
146*15dc779aSAndroid Build Coastguard Worker ptr_sbr_data = ptr_stream_sbr->ptr_sbr_data;
147*15dc779aSAndroid Build Coastguard Worker }
148*15dc779aSAndroid Build Coastguard Worker }
149*15dc779aSAndroid Build Coastguard Worker for (i = byte_count - 2; i >= 0; i--) {
150*15dc779aSAndroid Build Coastguard Worker *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
151*15dc779aSAndroid Build Coastguard Worker if (object_type == AOT_ER_AAC_ELD) {
152*15dc779aSAndroid Build Coastguard Worker if (adtsheader == 1) {
153*15dc779aSAndroid Build Coastguard Worker cnt_bits = cnt_bits - 8;
154*15dc779aSAndroid Build Coastguard Worker }
155*15dc779aSAndroid Build Coastguard Worker }
156*15dc779aSAndroid Build Coastguard Worker }
157*15dc779aSAndroid Build Coastguard Worker
158*15dc779aSAndroid Build Coastguard Worker if (object_type == AOT_ER_AAC_ELD) {
159*15dc779aSAndroid Build Coastguard Worker *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
160*15dc779aSAndroid Build Coastguard Worker if (adtsheader == 1) {
161*15dc779aSAndroid Build Coastguard Worker cnt_bits = cnt_bits - 8;
162*15dc779aSAndroid Build Coastguard Worker if (cnt_bits > 0) {
163*15dc779aSAndroid Build Coastguard Worker WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
164*15dc779aSAndroid Build Coastguard Worker *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, cnt_bits);
165*15dc779aSAndroid Build Coastguard Worker *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
166*15dc779aSAndroid Build Coastguard Worker if (!ec_flag)
167*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload++;
168*15dc779aSAndroid Build Coastguard Worker else
169*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload_old++;
170*15dc779aSAndroid Build Coastguard Worker }
171*15dc779aSAndroid Build Coastguard Worker } else {
172*15dc779aSAndroid Build Coastguard Worker if (it_bit_buff->cnt_bits > 0) {
173*15dc779aSAndroid Build Coastguard Worker WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
174*15dc779aSAndroid Build Coastguard Worker *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits);
175*15dc779aSAndroid Build Coastguard Worker *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
176*15dc779aSAndroid Build Coastguard Worker if (!ec_flag)
177*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload++;
178*15dc779aSAndroid Build Coastguard Worker else
179*15dc779aSAndroid Build Coastguard Worker ptr_stream_sbr->size_payload_old++;
180*15dc779aSAndroid Build Coastguard Worker }
181*15dc779aSAndroid Build Coastguard Worker }
182*15dc779aSAndroid Build Coastguard Worker }
183*15dc779aSAndroid Build Coastguard Worker }
184*15dc779aSAndroid Build Coastguard Worker
185*15dc779aSAndroid Build Coastguard Worker } else if (extension_type == EXT_DYNAMIC_RANGE) {
186*15dc779aSAndroid Build Coastguard Worker pstr_drc_dec->drc_element_found = 1;
187*15dc779aSAndroid Build Coastguard Worker count -= ixheaacd_dec_drc_read_element(pstr_drc_dec, drc_dummy, it_bit_buff);
188*15dc779aSAndroid Build Coastguard Worker } else if (extension_type == EXT_SAC_DATA) {
189*15dc779aSAndroid Build Coastguard Worker WORD32 anc_type, anc_start, i, len = 0;
190*15dc779aSAndroid Build Coastguard Worker anc_type = ixheaacd_read_bits_buf(it_bit_buff, 2);
191*15dc779aSAndroid Build Coastguard Worker *mps_header = anc_type;
192*15dc779aSAndroid Build Coastguard Worker
193*15dc779aSAndroid Build Coastguard Worker anc_start = ixheaacd_read_bits_buf(it_bit_buff, 1);
194*15dc779aSAndroid Build Coastguard Worker if (anc_start == 1) {
195*15dc779aSAndroid Build Coastguard Worker *mps_bytes = 0;
196*15dc779aSAndroid Build Coastguard Worker }
197*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 1);
198*15dc779aSAndroid Build Coastguard Worker
199*15dc779aSAndroid Build Coastguard Worker if (anc_type == 1 && is_init == 0 && *is_first == 1) {
200*15dc779aSAndroid Build Coastguard Worker len = ixheaacd_read_bits_buf(it_bit_buff, 1);
201*15dc779aSAndroid Build Coastguard Worker len = ixheaacd_read_bits_buf(it_bit_buff, 7) + 1;
202*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bidirection(it_bit_buff, -8);
203*15dc779aSAndroid Build Coastguard Worker }
204*15dc779aSAndroid Build Coastguard Worker
205*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < count - 1; i++) {
206*15dc779aSAndroid Build Coastguard Worker mps_buffer[i + *mps_bytes] = ixheaacd_read_bits_buf(it_bit_buff, 8);
207*15dc779aSAndroid Build Coastguard Worker }
208*15dc779aSAndroid Build Coastguard Worker
209*15dc779aSAndroid Build Coastguard Worker *mps_bytes += (count - 1);
210*15dc779aSAndroid Build Coastguard Worker if (anc_type == 1 && is_init == 0 && *is_first == 1) {
211*15dc779aSAndroid Build Coastguard Worker if (*mps_bytes < len) {
212*15dc779aSAndroid Build Coastguard Worker if (ec_flag) {
213*15dc779aSAndroid Build Coastguard Worker *mps_bytes = 0;
214*15dc779aSAndroid Build Coastguard Worker }
215*15dc779aSAndroid Build Coastguard Worker longjmp(*(it_bit_buff->xaac_jmp_buf),
216*15dc779aSAndroid Build Coastguard Worker IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
217*15dc779aSAndroid Build Coastguard Worker }
218*15dc779aSAndroid Build Coastguard Worker for (i = 0; i < count - 1; i++) {
219*15dc779aSAndroid Build Coastguard Worker mps_buffer[i] = mps_buffer[i + len];
220*15dc779aSAndroid Build Coastguard Worker }
221*15dc779aSAndroid Build Coastguard Worker *mps_bytes = *mps_bytes - len;
222*15dc779aSAndroid Build Coastguard Worker }
223*15dc779aSAndroid Build Coastguard Worker *is_first = 1;
224*15dc779aSAndroid Build Coastguard Worker } else {
225*15dc779aSAndroid Build Coastguard Worker ixheaacd_read_bits_buf(it_bit_buff, 4);
226*15dc779aSAndroid Build Coastguard Worker
227*15dc779aSAndroid Build Coastguard Worker if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
228*15dc779aSAndroid Build Coastguard Worker longjmp(*(it_bit_buff->xaac_jmp_buf),
229*15dc779aSAndroid Build Coastguard Worker IA_XHEAAC_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
230*15dc779aSAndroid Build Coastguard Worker }
231*15dc779aSAndroid Build Coastguard Worker it_bit_buff->ptr_read_next += count - 1;
232*15dc779aSAndroid Build Coastguard Worker it_bit_buff->cnt_bits -= ((count - 1) << 3);
233*15dc779aSAndroid Build Coastguard Worker }
234*15dc779aSAndroid Build Coastguard Worker }
235*15dc779aSAndroid Build Coastguard Worker return (ret);
236*15dc779aSAndroid Build Coastguard Worker }
237