• 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 
44 #include "ixheaacd_channelinfo.h"
45 #include "ixheaacd_drc_dec.h"
46 
47 #include "ixheaacd_sbrdecoder.h"
48 #include "ixheaacd_sbr_payload.h"
49 #include "ixheaacd_audioobjtypes.h"
50 #include "ixheaacd_error_codes.h"
51 
52 #define SBR_EXTENSION_MPEG SBR_EXTENSION
53 
54 #define SBR_EXTENSION_CRC_MPEG SBR_EXTENSION_CRC
55 
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)56 FLAG ixheaacd_check_for_sbr_payload(
57     ia_bit_buf_struct *it_bit_buff,
58     ia_aac_dec_sbr_bitstream_struct *pstr_stream_sbr, WORD16 prev_element,
59     ia_drc_dec_struct *pstr_drc_dec, WORD32 object_type, WORD32 adtsheader,
60     WORD32 cnt_bits, WORD32 ld_sbr_crc_flag, ia_drc_dec_struct *drc_dummy) {
61   FLAG ret = 0;
62   WORD32 count;
63 
64   if (object_type == AOT_ER_AAC_ELD) {
65     count = it_bit_buff->cnt_bits >> 3;
66     if (adtsheader == 1) count = cnt_bits >> 3;
67   } else {
68     count = ixheaacd_read_bits_buf(it_bit_buff, 4);
69 
70     if ((count - 15) == 0) {
71       WORD32 esc_count;
72       esc_count = ixheaacd_read_bits_buf(it_bit_buff, 8);
73       count = (esc_count + 14);
74     }
75   }
76 
77   if (count > 0) {
78     WORD32 extension_type;
79 
80     if (object_type == AOT_ER_AAC_ELD)
81       extension_type = ld_sbr_crc_flag ? SBR_EXTENSION_CRC : SBR_EXTENSION;
82     else
83       extension_type = ixheaacd_read_bits_buf(it_bit_buff, 4);
84 
85     if (((count < MAXSBRBYTES)) && (((extension_type == SBR_EXTENSION)) ||
86                                     ((extension_type == SBR_EXTENSION_CRC))) &&
87         ((prev_element == SBR_ID_SCE) || (prev_element == SBR_ID_CPE) ||
88          sub_d(prev_element, SBR_ID_CCE) == 0)
89 
90             ) {
91       WORD32 no_elements = pstr_stream_sbr->no_elements;
92       WORD32 byte_count;
93       ia_sbr_element_stream_struct *ptr_stream_sbr;
94 
95       ret = 1;
96 
97       ptr_stream_sbr = &pstr_stream_sbr->str_sbr_ele[no_elements];
98       ptr_stream_sbr->size_payload = count;
99       byte_count = ptr_stream_sbr->size_payload;
100       ptr_stream_sbr->extension_type = extension_type;
101       ptr_stream_sbr->sbr_ele_id = prev_element;
102       pstr_stream_sbr->no_elements = no_elements + 1;
103 
104       if (pstr_drc_dec) pstr_drc_dec->sbr_found = 1;
105 
106       if (byte_count > 0 && sub_d(byte_count, MAXSBRBYTES) <= 0) {
107         WORD32 i;
108         WORD8 *ptr_sbr_data;
109         if (object_type != AOT_ER_AAC_ELD) {
110           ptr_sbr_data = &ptr_stream_sbr->ptr_sbr_data[1];
111           ptr_stream_sbr->ptr_sbr_data[0] =
112               (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
113         } else
114           ptr_sbr_data = ptr_stream_sbr->ptr_sbr_data;
115 
116         for (i = byte_count - 2; i >= 0; i--) {
117           *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
118           if (object_type == AOT_ER_AAC_ELD) {
119             if (adtsheader == 1) {
120               cnt_bits = cnt_bits - 8;
121             }
122           }
123         }
124 
125         if (object_type == AOT_ER_AAC_ELD) {
126           *ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
127           if (adtsheader == 1) {
128             cnt_bits = cnt_bits - 8;
129             if (cnt_bits > 0) {
130               WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
131               *ptr_sbr_data =
132                   (WORD8)ixheaacd_read_bits_buf(it_bit_buff, cnt_bits);
133               *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
134               ptr_stream_sbr->size_payload++;
135             }
136           } else {
137             if (it_bit_buff->cnt_bits > 0) {
138               WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
139               *ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(
140                   it_bit_buff, it_bit_buff->cnt_bits);
141               *ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
142               ptr_stream_sbr->size_payload++;
143             }
144           }
145         }
146       }
147 
148     } else if (extension_type == EXT_DYNAMIC_RANGE) {
149       pstr_drc_dec->drc_element_found = 1;
150       count -=
151           ixheaacd_dec_drc_read_element(pstr_drc_dec, drc_dummy, it_bit_buff);
152     } else {
153       ixheaacd_read_bits_buf(it_bit_buff, 4);
154 
155       if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
156         longjmp(*(it_bit_buff->xaac_jmp_buf),
157                 IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
158       }
159       it_bit_buff->ptr_read_next += count - 1;
160       it_bit_buff->cnt_bits -= ((count - 1) << 3);
161 
162     }
163   }
164   if (it_bit_buff->cnt_bits < 0) ret = -1;
165   return (ret);
166 }
167