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 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 if (it_bit_buff->cnt_bits < 0) ret = -1; 164 return (ret); 165 } 166