You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
5.5 KiB
165 lines
5.5 KiB
/******************************************************************************
|
|
* *
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*****************************************************************************
|
|
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
|
|
*/
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "ixheaacd_sbr_common.h"
|
|
#include "ixheaacd_type_def.h"
|
|
|
|
#include "ixheaacd_constants.h"
|
|
#include "ixheaacd_basic_ops32.h"
|
|
#include "ixheaacd_basic_ops16.h"
|
|
#include "ixheaacd_basic_ops40.h"
|
|
#include "ixheaacd_basic_ops.h"
|
|
|
|
#include "ixheaacd_basic_op.h"
|
|
#include "ixheaacd_intrinsics.h"
|
|
#include "ixheaacd_bitbuffer.h"
|
|
#include "ixheaacd_defines.h"
|
|
|
|
#include "ixheaacd_pns.h"
|
|
|
|
#include "ixheaacd_aac_rom.h"
|
|
#include "ixheaacd_pulsedata.h"
|
|
#include "ixheaacd_drc_data_struct.h"
|
|
|
|
#include "ixheaacd_lt_predict.h"
|
|
|
|
#include "ixheaacd_channelinfo.h"
|
|
#include "ixheaacd_drc_dec.h"
|
|
|
|
#include "ixheaacd_sbrdecoder.h"
|
|
#include "ixheaacd_sbr_payload.h"
|
|
#include "ixheaacd_audioobjtypes.h"
|
|
#include "ixheaacd_error_codes.h"
|
|
|
|
#define SBR_EXTENSION_MPEG SBR_EXTENSION
|
|
|
|
#define SBR_EXTENSION_CRC_MPEG SBR_EXTENSION_CRC
|
|
|
|
FLAG 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) {
|
|
FLAG ret = 0;
|
|
WORD32 count;
|
|
|
|
if (object_type == AOT_ER_AAC_ELD) {
|
|
count = it_bit_buff->cnt_bits >> 3;
|
|
if (adtsheader == 1) count = cnt_bits >> 3;
|
|
} else {
|
|
count = ixheaacd_read_bits_buf(it_bit_buff, 4);
|
|
|
|
if ((count - 15) == 0) {
|
|
WORD32 esc_count;
|
|
esc_count = ixheaacd_read_bits_buf(it_bit_buff, 8);
|
|
count = (esc_count + 14);
|
|
}
|
|
}
|
|
|
|
if (count > 0) {
|
|
WORD32 extension_type;
|
|
|
|
if (object_type == AOT_ER_AAC_ELD)
|
|
extension_type = ld_sbr_crc_flag ? SBR_EXTENSION_CRC : SBR_EXTENSION;
|
|
else
|
|
extension_type = ixheaacd_read_bits_buf(it_bit_buff, 4);
|
|
|
|
if (((count < MAXSBRBYTES)) && (((extension_type == SBR_EXTENSION)) ||
|
|
((extension_type == SBR_EXTENSION_CRC))) &&
|
|
((prev_element == SBR_ID_SCE) || (prev_element == SBR_ID_CPE) ||
|
|
sub_d(prev_element, SBR_ID_CCE) == 0)
|
|
|
|
) {
|
|
WORD32 no_elements = pstr_stream_sbr->no_elements;
|
|
WORD32 byte_count;
|
|
ia_sbr_element_stream_struct *ptr_stream_sbr;
|
|
|
|
ret = 1;
|
|
|
|
ptr_stream_sbr = &pstr_stream_sbr->str_sbr_ele[no_elements];
|
|
ptr_stream_sbr->size_payload = count;
|
|
byte_count = ptr_stream_sbr->size_payload;
|
|
ptr_stream_sbr->extension_type = extension_type;
|
|
ptr_stream_sbr->sbr_ele_id = prev_element;
|
|
pstr_stream_sbr->no_elements = no_elements + 1;
|
|
|
|
if (pstr_drc_dec) pstr_drc_dec->sbr_found = 1;
|
|
|
|
if (byte_count > 0 && sub_d(byte_count, MAXSBRBYTES) <= 0) {
|
|
WORD32 i;
|
|
WORD8 *ptr_sbr_data;
|
|
if (object_type != AOT_ER_AAC_ELD) {
|
|
ptr_sbr_data = &ptr_stream_sbr->ptr_sbr_data[1];
|
|
ptr_stream_sbr->ptr_sbr_data[0] =
|
|
(WORD8)ixheaacd_read_bits_buf(it_bit_buff, 4);
|
|
} else
|
|
ptr_sbr_data = ptr_stream_sbr->ptr_sbr_data;
|
|
|
|
for (i = byte_count - 2; i >= 0; i--) {
|
|
*ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
|
|
if (object_type == AOT_ER_AAC_ELD) {
|
|
if (adtsheader == 1) {
|
|
cnt_bits = cnt_bits - 8;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (object_type == AOT_ER_AAC_ELD) {
|
|
*ptr_sbr_data++ = (WORD8)ixheaacd_read_bits_buf(it_bit_buff, 8);
|
|
if (adtsheader == 1) {
|
|
cnt_bits = cnt_bits - 8;
|
|
if (cnt_bits > 0) {
|
|
WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
|
|
*ptr_sbr_data =
|
|
(WORD8)ixheaacd_read_bits_buf(it_bit_buff, cnt_bits);
|
|
*ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
|
|
ptr_stream_sbr->size_payload++;
|
|
}
|
|
} else {
|
|
if (it_bit_buff->cnt_bits > 0) {
|
|
WORD32 unaligned_bits = (8 - it_bit_buff->cnt_bits);
|
|
*ptr_sbr_data = (WORD8)ixheaacd_read_bits_buf(
|
|
it_bit_buff, it_bit_buff->cnt_bits);
|
|
*ptr_sbr_data = *ptr_sbr_data << unaligned_bits;
|
|
ptr_stream_sbr->size_payload++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
} else if (extension_type == EXT_DYNAMIC_RANGE) {
|
|
pstr_drc_dec->drc_element_found = 1;
|
|
count -=
|
|
ixheaacd_dec_drc_read_element(pstr_drc_dec, drc_dummy, it_bit_buff);
|
|
} else {
|
|
ixheaacd_read_bits_buf(it_bit_buff, 4);
|
|
|
|
if (it_bit_buff->cnt_bits < ((count - 1) << 3)) {
|
|
longjmp(*(it_bit_buff->xaac_jmp_buf),
|
|
IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES);
|
|
}
|
|
it_bit_buff->ptr_read_next += count - 1;
|
|
it_bit_buff->cnt_bits -= ((count - 1) << 3);
|
|
}
|
|
}
|
|
return (ret);
|
|
}
|