These changes handle the index-out-of-bounds runtime error reported when the bit consumption exceeds the bit reservoir and global gain reaches the maximum value. The issue is reported with USAC and the same changes are extended to AAC. Bug: ossFuzz: 63019 Test: poc in bug
116 lines
5.8 KiB
C
116 lines
5.8 KiB
C
/******************************************************************************
|
|
* *
|
|
* Copyright (C) 2023 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
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#define IXHEAACE_MEM_FREE(pv_output) \
|
|
{ \
|
|
WORD32 idx; \
|
|
ixheaace_output_config *pstr_output_config = (ixheaace_output_config *)pv_output; \
|
|
if (pstr_output_config->malloc_count > 0) { \
|
|
for (idx = pstr_output_config->malloc_count - 1; idx >= 0; idx--) { \
|
|
if (pstr_output_config->arr_alloc_memory[idx]) { \
|
|
pstr_output_config->free_xheaace(pstr_output_config->arr_alloc_memory[idx]); \
|
|
} \
|
|
} \
|
|
pstr_output_config->malloc_count = 0; \
|
|
} \
|
|
}
|
|
|
|
/*-------------------- structure definitions ------------------------------*/
|
|
|
|
typedef struct {
|
|
WORD32 sample_rate; /* mapped input sample rate */
|
|
WORD32 core_sample_rate; /* core coder processing sample rate */
|
|
WORD32 native_sample_rate; /* audio file sample rate */
|
|
WORD32 bit_rate; /* encoder bit rate in bits/sec */
|
|
WORD32 num_in_channels; /* number of channels on input (1,2) */
|
|
WORD32 num_out_channels; /* number of channels on output (1,2) */
|
|
WORD32 band_width; /* targeted audio bandwidth in Hz */
|
|
WORD32 dual_mono; /* flag: make 2 SCEs for stereo input files */
|
|
WORD32 use_tns; /* flag: use temporal noise shaping */
|
|
WORD32 use_adts; /* flag: use ADTS instead of ADIF */
|
|
WORD32 calc_crc; /* flag: write CRC checks */
|
|
WORD32 private_bit; /* private bit of MPEG Header */
|
|
WORD32 copyright_bit; /* copyright bit of MPEG Header */
|
|
WORD32 original_copy_bit; /* original bit of MPEG Header */
|
|
WORD32 num_stereo_preprocessing; /* forbid usage of stereo prerpocessing */
|
|
WORD32 inv_quant; /* improve distortion by inverse quantization */
|
|
WORD32 full_bandwidth; /* improve distortion by inverse quantization */
|
|
WORD32 flag_framelength_small; /* indicates frame size. 0 -> 512, 1 -> 480
|
|
indicates frame size. 0 -> 1024, 1 -> 960 */
|
|
WORD32 bitreservoir_size; /* size of bit reservoir (default:0; max 6144)*/
|
|
} iaace_config;
|
|
|
|
typedef struct {
|
|
WORD32 *shared_buffer1;
|
|
WORD32 *shared_buffer_2;
|
|
WORD32 *shared_buffer3;
|
|
WORD8 *shared_buffer5;
|
|
} iaace_scratch;
|
|
|
|
/* pstr_ancillary configuration struct */
|
|
typedef struct {
|
|
WORD32 anc_flag;
|
|
WORD32 anc_mode;
|
|
WORD32 anc_rate;
|
|
} ixheaace_config_ancillary;
|
|
|
|
typedef struct {
|
|
iaace_config config;
|
|
ixheaace_element_info element_info;
|
|
ixheaace_psy_out psy_out;
|
|
ixheaace_psy_kernel psy_kernel;
|
|
ixheaace_qc_state qc_kernel;
|
|
ixheaace_qc_out qc_out;
|
|
ixheaace_bitstream_enc_init bse_init;
|
|
ixheaace_stereo_pre_pro_struct str_stereo_pre_pro;
|
|
WORD32 downmix;
|
|
WORD32 downmix_fac;
|
|
WORD32 dual_mono;
|
|
WORD32 bandwidth_90_dB;
|
|
iaace_scratch *pstr_aac_scratch;
|
|
} iexheaac_encoder_str;
|
|
|
|
VOID ia_enhaacplus_enc_aac_init_default_config(iaace_config *config, WORD32 aot);
|
|
|
|
WORD32 ia_enhaacplus_enc_aac_enc_pers_size(WORD32 num_aac_chan, WORD32 aot);
|
|
WORD32 ia_enhaacplus_enc_aac_enc_scr_size(VOID);
|
|
|
|
VOID ia_enhaacplus_enc_init_aac_tabs(ixheaace_aac_tables *pstr_aac_tabs);
|
|
|
|
IA_ERRORCODE ia_enhaacplus_enc_aac_enc_open(iexheaac_encoder_str **ppstr_exheaac_encoder,
|
|
const iaace_config config,
|
|
iaace_scratch *pstr_aac_scratch,
|
|
ixheaace_aac_tables *pstr_aac_tabs, WORD32 ele_type,
|
|
WORD32 element_instance_tag, WORD32 aot);
|
|
|
|
IA_ERRORCODE ia_enhaacplus_enc_aac_core_encode(
|
|
iexheaac_encoder_str **pstr_aac_enc, FLOAT32 *ptr_time_signal, UWORD32 time_sn_stride,
|
|
const UWORD8 *ptr_anc_bytes, UWORD8 *num_anc_bytes, UWORD8 *ptr_out_bytes,
|
|
WORD32 *num_out_bytes, ixheaace_aac_tables *pstr_aac_tables, VOID *ptr_bit_stream_handle,
|
|
VOID *ptr_bit_stream, FLAG flag_last_element, WORD32 *write_program_config_element,
|
|
WORD32 i_num_coup_channels, WORD32 i_channels_mask, WORD32 ele_idx, WORD32 *total_fill_bits,
|
|
WORD32 total_channels, WORD32 aot, WORD32 adts_flag, WORD32 num_bs_elements,
|
|
WORD32 *is_quant_spec_zero, WORD32 *is_gain_limited);
|
|
|
|
VOID ia_enhaacplus_enc_set_shared_bufs(iaace_scratch *scr, WORD32 **shared_buf1,
|
|
WORD32 **shared_buf2, WORD32 **shared_buf3,
|
|
WORD8 **shared_buf5);
|