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