libxaac-mirror/decoder/ixheaacd_common_initfuncs.c
Ramesh Katuri 7c86bb9485 Fix for segmentation fault in header initialization
This error stream contains two elements (CPE and CCE). Because
the stream is an erroneous for CCE at the time of initialization
number of channel is 1 and at the time of execution it is 2.

So code is modified to populate memory based on MAXIMUM CHANNELS
allowed for SBR

Bug:112711350
Test: poc
Change-Id: Ia4b75694ae29d025289d0f85123ce2b24f9c1022
2018-09-04 11:55:48 -07:00

189 lines
6.1 KiB
C

/******************************************************************************
* *
* 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 <string.h>
#include "ixheaacd_sbr_common.h"
#include <ixheaacd_type_def.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_bitbuffer.h"
#include "ixheaacd_defines.h"
#include <ixheaacd_aac_rom.h>
#include "ixheaacd_pulsedata.h"
#include "ixheaacd_pns.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_audioobjtypes.h"
#include "ixheaacd_sbrdecsettings.h"
#include "ixheaacd_memory_standards.h"
#include "ixheaacd_error_codes.h"
#include "ixheaacd_defines.h"
#include "ixheaacd_sbr_scale.h"
#include "ixheaacd_lpp_tran.h"
#include "ixheaacd_env_extr_part.h"
#include <ixheaacd_sbr_rom.h>
#include "ixheaacd_hybrid.h"
#include "ixheaacd_ps_dec.h"
#include "ixheaacd_ps_bitdec.h"
#include "ixheaacd_pulsedata.h"
#include "ixheaacd_env_extr.h"
#include "ixheaacd_common_rom.h"
#include "ixheaacd_block.h"
#include "ixheaacd_channel.h"
#include "ixheaacd_audioobjtypes.h"
#include "ixheaacd_latmdemux.h"
#include "ixheaacd_aacdec.h"
#include "ixheaacd_mps_polyphase.h"
#include "ixheaacd_config.h"
#include "ixheaacd_mps_dec.h"
#include "ixheaacd_struct_def.h"
#include "ixheaacd_headerdecode.h"
#include "ixheaacd_multichannel.h"
#include <ixheaacd_basic_op.h>
#include "ixheaacd_adts_crc_check.h"
#include "ixheaacd_function_selector.h"
VOID ixheaacd_allocate_mem_persistent(
ia_exhaacplus_dec_api_struct *p_obj_enhaacplus_dec,
ia_aac_dec_state_struct *p_state_enhaacplus_dec, WORD channels,
WORD *persistent_used_total, WORD *sbr_persistent_start, WORD ps_enable) {
WORD persistent_used;
WORD8 **temp_persistent =
(WORD8 **)&(p_state_enhaacplus_dec->aac_persistent_mem_v);
*temp_persistent += *persistent_used_total;
persistent_used = ixheaacd_set_aac_persistent_buffers(
p_state_enhaacplus_dec->aac_persistent_mem_v, channels);
*persistent_used_total += persistent_used;
*sbr_persistent_start = *persistent_used_total;
p_state_enhaacplus_dec->sbr_persistent_mem_v =
(pVOID)((SIZE_T)((pWORD8)p_state_enhaacplus_dec->aac_persistent_mem_v +
persistent_used + sizeof(SIZE_T) - 1) &
(SIZE_T)(~(sizeof(SIZE_T) - 1)));
persistent_used = ixheaacd_getsize_sbr_persistent();
ixheaacd_set_sbr_persistent_buffers(
p_state_enhaacplus_dec->sbr_persistent_mem_v, &persistent_used, MAXNRSBRCHANNELS,
ps_enable);
*persistent_used_total += persistent_used;
{
struct ia_aac_persistent_struct *aac_persistent_mem =
(struct ia_aac_persistent_struct *)
p_obj_enhaacplus_dec->p_state_aac->aac_persistent_mem_v;
aac_persistent_mem->str_aac_decoder.pstr_aac_tables =
&p_obj_enhaacplus_dec->aac_tables;
aac_persistent_mem->str_aac_decoder.pstr_common_tables =
p_obj_enhaacplus_dec->common_tables;
}
ixheaacd_set_sbr_persistent_table_pointer(
p_obj_enhaacplus_dec->p_state_aac->sbr_persistent_mem_v,
&p_obj_enhaacplus_dec->str_sbr_tables,
p_obj_enhaacplus_dec->common_tables);
}
ia_bit_buf_struct *ixheaacd_create_bit_buf(ia_bit_buf_struct *it_bit_buff,
UWORD8 *ptr_bit_buf_base,
WORD32 bit_buf_size) {
it_bit_buff->ptr_bit_buf_base = ptr_bit_buf_base;
it_bit_buff->ptr_bit_buf_end = ptr_bit_buf_base + bit_buf_size - 1;
it_bit_buff->ptr_read_next = ptr_bit_buf_base;
it_bit_buff->bit_pos = 7;
it_bit_buff->cnt_bits = 0;
it_bit_buff->size = bit_buf_size << 3;
it_bit_buff->adts_header_present = 0;
it_bit_buff->protection_absent = 0;
it_bit_buff->pstr_adts_crc_info = &it_bit_buff->str_adts_crc_info;
it_bit_buff->max_size = it_bit_buff->size;
ixheaacd_adts_crc_open(it_bit_buff->pstr_adts_crc_info);
return it_bit_buff;
}
ia_bit_buf_struct *ixheaacd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff,
UWORD8 *ptr_bit_buf_base,
WORD32 bit_buf_size) {
ixheaacd_create_bit_buf(it_bit_buff, ptr_bit_buf_base, bit_buf_size);
it_bit_buff->cnt_bits = (bit_buf_size << 3);
return (it_bit_buff);
}
VOID ixheaacd_read_bidirection(ia_bit_buf_struct *it_bit_buff,
WORD32 ixheaacd_drc_offset) {
if (ixheaacd_drc_offset != 0) {
WORD32 bit_offset;
it_bit_buff->cnt_bits = it_bit_buff->cnt_bits - ixheaacd_drc_offset;
it_bit_buff->bit_pos = it_bit_buff->bit_pos - ixheaacd_drc_offset;
bit_offset = it_bit_buff->bit_pos >> 3;
it_bit_buff->bit_pos = it_bit_buff->bit_pos - (bit_offset << 3);
if (bit_offset) {
UWORD8 *ptr_read_next;
WORD32 temp;
ptr_read_next = it_bit_buff->ptr_read_next;
ptr_read_next = ptr_read_next - (bit_offset);
temp = it_bit_buff->ptr_bit_buf_end - it_bit_buff->ptr_bit_buf_base + 1;
if (ptr_read_next > it_bit_buff->ptr_bit_buf_end) {
ptr_read_next -= temp;
}
if (ptr_read_next < it_bit_buff->ptr_bit_buf_base) {
ptr_read_next += temp;
}
it_bit_buff->ptr_read_next = ptr_read_next;
}
}
}