diff options
author | akshayragir833 <110660198+akshayragir833@users.noreply.github.com> | 2024-03-29 17:36:14 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-29 17:36:14 +0530 |
commit | da04d9de787f78b6d5e3cba9970d50b3a9d17085 (patch) | |
tree | 949ccaf39034644fcc9d774572a550636722984e | |
parent | d880b2f9eef8d151275d8666885c44cd78c9734d (diff) | |
download | libxaac-da04d9de787f78b6d5e3cba9970d50b3a9d17085.tar.gz |
Encoder enhancements (#84)
Tests done: smoke test
-rw-r--r-- | encoder/drc_src/impd_drc_api.c | 21 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_api.h | 4 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_common_enc.h | 11 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_enc.h | 9 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_mux.c | 59 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_uni_drc.h | 2 | ||||
-rw-r--r-- | encoder/iusace_enc_main.c | 7 | ||||
-rw-r--r-- | encoder/ixheaace_api.c | 92 | ||||
-rw-r--r-- | fuzzer/xaac_enc_fuzzer.cpp | 105 |
9 files changed, 233 insertions, 77 deletions
diff --git a/encoder/drc_src/impd_drc_api.c b/encoder/drc_src/impd_drc_api.c index 75d96a7..f3c6ace 100644 --- a/encoder/drc_src/impd_drc_api.c +++ b/encoder/drc_src/impd_drc_api.c @@ -41,7 +41,7 @@ var = MAX(var, lower_bound); \ } -static IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_config) { +IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_config) { LOOPIDX i, j, k; WORD32 curr_start_subband_idx, next_start_subband_idx; ia_drc_uni_drc_config_struct *pstr_uni_drc_config = &pstr_inp_config->str_uni_drc_config; @@ -280,11 +280,6 @@ IA_ERRORCODE impd_drc_enc_init(VOID *pstr_drc_state, VOID *ptr_drc_scratch, pstr_drc_state_local->bit_buf_base_out, sizeof(pstr_drc_state_local->bit_buf_base_out), 1); - err_code = impd_drc_validate_config_params(pstr_inp_config); - if (err_code) { - return err_code; - } - err_code = impd_drc_gain_enc_init( &pstr_drc_state_local->str_gain_enc, &pstr_inp_config->str_uni_drc_config, &pstr_inp_config->str_enc_loudness_info_set, pstr_inp_config->str_enc_params.frame_size, @@ -302,13 +297,23 @@ IA_ERRORCODE impd_drc_enc_init(VOID *pstr_drc_state, VOID *ptr_drc_scratch, return IA_EXHEAACE_CONFIG_FATAL_DRC_INVALID_CONFIG; } - err_code = impd_drc_write_uni_drc_config(pstr_drc_state_local, &bit_count); + err_code = impd_drc_write_uni_drc_config(pstr_drc_state_local, &bit_count, 1); if (err_code & IA_FATAL_ERROR) { return err_code; } - pstr_drc_state_local->drc_config_data_size_bit = bit_count; + // Loudness info set + if (pstr_drc_state_local->str_gain_enc.str_uni_drc_config.loudness_info_set_present == 1){ + bit_count = 0; + err_code = impd_drc_write_loudness_info_set( + pstr_drc_state, &pstr_drc_state_local->str_bit_buf_cfg_ext, &bit_count, 1); + if (err_code & IA_FATAL_ERROR) { + return (err_code); + } + pstr_drc_state_local->drc_config_ext_data_size_bit = bit_count; + } + return err_code; } diff --git a/encoder/drc_src/impd_drc_api.h b/encoder/drc_src/impd_drc_api.h index 8e6ec9b..c631c46 100644 --- a/encoder/drc_src/impd_drc_api.h +++ b/encoder/drc_src/impd_drc_api.h @@ -49,4 +49,6 @@ IA_ERRORCODE impd_drc_enc_init(VOID *pstr_drc_state, VOID *ptr_drc_scratch, IA_ERRORCODE impd_drc_enc(VOID *pstr_drc_state, FLOAT32 **pptr_input, UWORD32 inp_offset, WORD32 *ptr_bits_written, VOID *pstr_scratch); -IA_ERRORCODE impd_loudness_info_init(VOID *pstr_drc_state, ia_drc_input_config *pstr_inp_config);
\ No newline at end of file +IA_ERRORCODE impd_loudness_info_init(VOID *pstr_drc_state, ia_drc_input_config *pstr_inp_config); + +IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_config);
\ No newline at end of file diff --git a/encoder/drc_src/impd_drc_common_enc.h b/encoder/drc_src/impd_drc_common_enc.h index 8ff57b8..1bb46e3 100644 --- a/encoder/drc_src/impd_drc_common_enc.h +++ b/encoder/drc_src/impd_drc_common_enc.h @@ -25,19 +25,20 @@ #define MAX_CHANNEL_COUNT (8) #define MAX_BAND_COUNT (8) #define MAX_SEQUENCE_COUNT (8) -#define MAX_MEASUREMENT_COUNT (8) +#define MAX_MEASUREMENT_COUNT (15) #define MAX_DOWNMIX_INSTRUCTION_COUNT (16) -#define MAX_DRC_COEFF_COUNT (8) +#define MAX_DRC_COEFF_COUNT (7) #define MAX_DRC_INSTRUCTIONS_COUNT (MAX_DOWNMIX_INSTRUCTION_COUNT + 16) -#define MAX_LOUDNESS_INFO_COUNT (7) +#define MAX_LOUDNESS_INFO_COUNT (MAX_DOWNMIX_INSTRUCTION_COUNT + 16) #define MAX_AUDIO_CODEC_FRAME_SIZE (2048) #define MAX_DRC_CODEC_FRAME_SIZE (MAX_AUDIO_CODEC_FRAME_SIZE / 8) #define MAX_NODE_COUNT (MAX_DRC_CODEC_FRAME_SIZE) #define MAX_CHANNEL_GROUP_COUNT (MAX_SEQUENCE_COUNT) -#define MAX_ADDITIONAL_DOWNMIX_ID (8) +#define MAX_ADDITIONAL_DOWNMIX_ID (7) #define DELAY_MODE_REGULAR_DELAY (0) #define MAX_EXT_COUNT (2) #define MAX_GAIN_POINTS (256) +#define MAX_DRC_INSTRUCTIONS_BASIC_COUNT (15) #define UNIDRC_GAIN_EXT_TERM (0x0) #define UNIDRC_LOUD_EXT_TERM (0x0) @@ -72,6 +73,8 @@ #define SUBBAND_DOMAIN (2) #define SLOPE_FACTOR_DB_TO_LINEAR (0.1151f) /* ln(10) / 20 */ +#define MAX_DRC_CONFIG_SIZE_EXPECTED (14336) /* 14 KB*/ + #ifndef MIN #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif diff --git a/encoder/drc_src/impd_drc_enc.h b/encoder/drc_src/impd_drc_enc.h index 444a817..2ba05a5 100644 --- a/encoder/drc_src/impd_drc_enc.h +++ b/encoder/drc_src/impd_drc_enc.h @@ -33,14 +33,15 @@ IA_ERRORCODE impd_drc_encode_uni_drc_gain(ia_drc_gain_enc_struct *pstr_gain_enc, IA_ERRORCODE impd_drc_write_loudness_info_set_extension( ia_drc_enc_state *pstr_drc_state, ia_bit_buf_struct *it_bit_buf, ia_drc_loudness_info_set_extension_struct *pstr_loudness_info_set_extension, - WORD32 *ptr_bit_cnt); + WORD32 *ptr_bit_cnt, FLAG write_bs); -IA_ERRORCODE impd_drc_write_uni_drc_config(ia_drc_enc_state *pstr_drc_state, WORD32 *ptr_bit_cnt); +IA_ERRORCODE impd_drc_write_uni_drc_config(ia_drc_enc_state *pstr_drc_state, WORD32 *ptr_bit_cnt, + FLAG write_bs); VOID impd_drc_write_uni_drc_gain(ia_drc_enc_state *pstr_drc_state, WORD32 *ptr_bit_cnt); IA_ERRORCODE impd_drc_write_measured_loudness_info(ia_drc_enc_state *pstr_drc_state); IA_ERRORCODE impd_drc_write_loudness_info_set(ia_drc_enc_state *pstr_drc_state, - ia_bit_buf_struct *it_bit_buf, - WORD32 *ptr_bit_cnt);
\ No newline at end of file + ia_bit_buf_struct *it_bit_buf, WORD32 *ptr_bit_cnt, + FLAG write_bs);
\ No newline at end of file diff --git a/encoder/drc_src/impd_drc_mux.c b/encoder/drc_src/impd_drc_mux.c index 4d2718e..8484b1c 100644 --- a/encoder/drc_src/impd_drc_mux.c +++ b/encoder/drc_src/impd_drc_mux.c @@ -1213,8 +1213,8 @@ static VOID impd_drc_write_split_drc_characteristic( it_bit_buf, pstr_split_characteristic->characteristic_node_count - 1, 2); for (idx = 1; idx <= pstr_split_characteristic->characteristic_node_count; idx++) { - bs_node_level_delta = (WORD32)( - floor(fabs(pstr_split_characteristic->node_level[idx] - bs_node_level_previous) + + bs_node_level_delta = (WORD32)(floor(fabs(pstr_split_characteristic->node_level[idx] - + bs_node_level_previous) + 0.5f) - 1); @@ -2510,7 +2510,8 @@ static IA_ERRORCODE impd_drc_write_eq_instructions( static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( ia_drc_enc_state *pstr_drc_state, ia_drc_gain_enc_struct *pstr_gain_enc, ia_drc_uni_drc_config_struct *pstr_uni_drc_config, - ia_drc_uni_drc_config_ext_struct *pstr_uni_drc_config_ext, WORD32 *ptr_bit_cnt) { + ia_drc_uni_drc_config_ext_struct *pstr_uni_drc_config_ext, WORD32 *ptr_bit_cnt, + FLAG write_bs) { IA_ERRORCODE err_code = IA_NO_ERROR; LOOPIDX idx; WORD32 version; @@ -2519,10 +2520,15 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( WORD32 bit_cnt_local = 0, bit_cnt_local_ext = 0; WORD32 *scratch_used = &pstr_drc_state->drc_scratch_used; VOID *ptr_scratch = &pstr_drc_state->drc_scratch_mem; - ia_bit_buf_struct *it_bit_buf = &pstr_drc_state->str_bit_buf_cfg; - ia_bit_buf_struct *ptr_bit_buf_ext = &pstr_drc_state->str_bit_buf_cfg_ext; + ia_bit_buf_struct *it_bit_buf = NULL; + ia_bit_buf_struct *ptr_bit_buf_ext = NULL; - iusace_reset_bit_buffer(ptr_bit_buf_ext); + if (write_bs) { + it_bit_buf = &pstr_drc_state->str_bit_buf_cfg; + ptr_bit_buf_ext = &pstr_drc_state->str_bit_buf_cfg_ext; + + iusace_reset_bit_buffer(ptr_bit_buf_ext); + } bit_cnt_local += iusace_write_bits_buf( it_bit_buf, pstr_uni_drc_config_ext->uni_drc_config_ext_type[counter], 4); @@ -2755,7 +2761,7 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( IA_ERRORCODE impd_drc_write_loudness_info_set_extension( ia_drc_enc_state *pstr_drc_state, ia_bit_buf_struct *it_bit_buf, ia_drc_loudness_info_set_extension_struct *pstr_loudness_info_set_extension, - WORD32 *ptr_bit_cnt) { + WORD32 *ptr_bit_cnt, FLAG write_bs) { IA_ERRORCODE err_code = IA_NO_ERROR; LOOPIDX idx; WORD32 counter = 0, version = 1; @@ -2764,9 +2770,13 @@ IA_ERRORCODE impd_drc_write_loudness_info_set_extension( WORD32 bit_cnt_local_tmp = 0; ia_drc_loudness_info_set_ext_eq_struct *pstr_loudness_info_set_ext_eq = &pstr_loudness_info_set_extension->str_loudness_info_set_ext_eq; - ia_bit_buf_struct *ptr_bit_buf_tmp = &pstr_drc_state->str_bit_buf_cfg_tmp; + ia_bit_buf_struct *ptr_bit_buf_tmp = NULL; - iusace_reset_bit_buffer(ptr_bit_buf_tmp); + if (write_bs) { + ptr_bit_buf_tmp = &pstr_drc_state->str_bit_buf_cfg_tmp; + + iusace_reset_bit_buffer(ptr_bit_buf_tmp); + } bit_cnt_local += iusace_write_bits_buf( it_bit_buf, pstr_loudness_info_set_extension->loudness_info_set_ext_type[counter], 4); @@ -2850,8 +2860,8 @@ IA_ERRORCODE impd_drc_write_loudness_info_set_extension( } IA_ERRORCODE impd_drc_write_loudness_info_set(ia_drc_enc_state *pstr_drc_state, - ia_bit_buf_struct *it_bit_buf, - WORD32 *ptr_bit_cnt) { + ia_bit_buf_struct *it_bit_buf, WORD32 *ptr_bit_cnt, + FLAG write_bs) { IA_ERRORCODE err_code = IA_NO_ERROR; LOOPIDX idx; WORD32 version = 0; @@ -2888,7 +2898,7 @@ IA_ERRORCODE impd_drc_write_loudness_info_set(ia_drc_enc_state *pstr_drc_state, if (pstr_loudness_info_set->loudness_info_set_ext_present) { err_code = impd_drc_write_loudness_info_set_extension( pstr_drc_state, it_bit_buf, &pstr_loudness_info_set->str_loudness_info_set_extension, - &bit_cnt_local); + &bit_cnt_local, write_bs); if (err_code) { return err_code; } @@ -2899,17 +2909,21 @@ IA_ERRORCODE impd_drc_write_loudness_info_set(ia_drc_enc_state *pstr_drc_state, return err_code; } -IA_ERRORCODE impd_drc_write_uni_drc_config(ia_drc_enc_state *pstr_drc_state, - WORD32 *ptr_bit_cnt) { +IA_ERRORCODE impd_drc_write_uni_drc_config(ia_drc_enc_state *pstr_drc_state, WORD32 *ptr_bit_cnt, + FLAG write_bs) { IA_ERRORCODE err_code = IA_NO_ERROR; LOOPIDX idx; WORD32 version = 0; WORD32 bit_cnt_local = 0; VOID *ptr_scratch = pstr_drc_state->drc_scratch_mem; - ia_bit_buf_struct *it_bit_buf = &pstr_drc_state->str_bit_buf_cfg; + ia_bit_buf_struct *it_bit_buf = NULL; ia_drc_gain_enc_struct *pstr_gain_enc = &pstr_drc_state->str_gain_enc; ia_drc_uni_drc_config_struct *pstr_uni_drc_config = &(pstr_gain_enc->str_uni_drc_config); + if (write_bs) { + it_bit_buf = &pstr_drc_state->str_bit_buf_cfg; + } + bit_cnt_local += iusace_write_bits_buf(it_bit_buf, pstr_uni_drc_config->sample_rate_present, 1); if (1 == pstr_uni_drc_config->sample_rate_present) { @@ -2983,21 +2997,10 @@ IA_ERRORCODE impd_drc_write_uni_drc_config(ia_drc_enc_state *pstr_drc_state, if (pstr_uni_drc_config->uni_drc_config_ext_present) { err_code = impd_drc_write_uni_drc_config_extn( pstr_drc_state, pstr_gain_enc, pstr_uni_drc_config, - &(pstr_uni_drc_config->str_uni_drc_config_ext), &bit_cnt_local); - if (err_code & IA_FATAL_ERROR) { - return (err_code); - } - } - - // Loudness info set - if (pstr_uni_drc_config->loudness_info_set_present == 1) { - ia_bit_buf_struct *it_bit_buf_lis = &pstr_drc_state->str_bit_buf_cfg_ext; - WORD32 bit_cnt_lis = 0; - err_code = impd_drc_write_loudness_info_set(pstr_drc_state, it_bit_buf_lis, &bit_cnt_lis); + &(pstr_uni_drc_config->str_uni_drc_config_ext), &bit_cnt_local, write_bs); if (err_code & IA_FATAL_ERROR) { return (err_code); } - pstr_drc_state->drc_config_ext_data_size_bit = bit_cnt_lis; } *ptr_bit_cnt += bit_cnt_local; @@ -3010,7 +3013,7 @@ IA_ERRORCODE impd_drc_write_measured_loudness_info(ia_drc_enc_state *pstr_drc_st IA_ERRORCODE err_code = IA_NO_ERROR; ia_bit_buf_struct *it_bit_buf_lis = &pstr_drc_state->str_bit_buf_cfg_ext; WORD32 bit_cnt_lis = 0; - err_code = impd_drc_write_loudness_info_set(pstr_drc_state, it_bit_buf_lis, &bit_cnt_lis); + err_code = impd_drc_write_loudness_info_set(pstr_drc_state, it_bit_buf_lis, &bit_cnt_lis, 1); if (err_code & IA_FATAL_ERROR) { return (err_code); } diff --git a/encoder/drc_src/impd_drc_uni_drc.h b/encoder/drc_src/impd_drc_uni_drc.h index 34f844e..48d7d7f 100644 --- a/encoder/drc_src/impd_drc_uni_drc.h +++ b/encoder/drc_src/impd_drc_uni_drc.h @@ -585,7 +585,7 @@ typedef struct { WORD32 uni_drc_config_ext_present; ia_drc_uni_drc_config_ext_struct str_uni_drc_config_ext; ia_drc_coefficients_basic_struct str_drc_coefficients_basic[MAX_DRC_COEFF_COUNT]; - ia_drc_instructions_basic_struct str_drc_instructions_basic[MAX_DRC_INSTRUCTIONS_COUNT]; + ia_drc_instructions_basic_struct str_drc_instructions_basic[MAX_DRC_INSTRUCTIONS_BASIC_COUNT]; ia_drc_coefficients_uni_drc_struct str_drc_coefficients_uni_drc[MAX_DRC_COEFF_COUNT]; ia_drc_instructions_uni_drc str_drc_instructions_uni_drc[MAX_DRC_INSTRUCTIONS_COUNT]; ia_drc_channel_layout_struct str_channel_layout; diff --git a/encoder/iusace_enc_main.c b/encoder/iusace_enc_main.c index e1b95e0..a4dcd19 100644 --- a/encoder/iusace_enc_main.c +++ b/encoder/iusace_enc_main.c @@ -635,12 +635,13 @@ IA_ERRORCODE iusace_enc_init(ia_usac_encoder_config_struct *ptr_usac_config, err_code = impd_drc_enc_init(&usac_data->str_drc_state, pstr_state->str_scratch.drc_scratch, &ptr_usac_config->str_drc_cfg); - if (err_code == IA_EXHEAACE_EXE_NONFATAL_USAC_INVALID_GAIN_POINTS) { - ptr_usac_config->use_drc_element = 0; - } if (err_code & IA_FATAL_ERROR) { return err_code; } + if (err_code) { + ptr_usac_config->use_drc_element = 0; + err_code = IA_NO_ERROR; + } if (ptr_usac_config->use_drc_element) { ia_usac_enc_element_config_struct *pstr_usac_elem_config = diff --git a/encoder/ixheaace_api.c b/encoder/ixheaace_api.c index 2659d40..a98a8dc 100644 --- a/encoder/ixheaace_api.c +++ b/encoder/ixheaace_api.c @@ -539,7 +539,8 @@ static VOID ixheaace_set_default_config(ixheaace_api_struct *pstr_api_struct, (ixheaace_common_tables *)&ia_enhaacplus_enc_common_tab; } -static VOID ixheaace_validate_config_params(ixheaace_input_config *pstr_input_config) { +static IA_ERRORCODE ixheaace_validate_config_params(ixheaace_input_config *pstr_input_config) { + IA_ERRORCODE err_code = IA_NO_ERROR; if (pstr_input_config->aot != AOT_AAC_ELD && pstr_input_config->aot != AOT_AAC_LC && pstr_input_config->aot != AOT_AAC_LD && pstr_input_config->aot != AOT_PS && pstr_input_config->aot != AOT_SBR && pstr_input_config->aot != AOT_USAC) { @@ -730,6 +731,17 @@ static VOID ixheaace_validate_config_params(ixheaace_input_config *pstr_input_co pstr_input_config->sample_peak_level < MIN_SAMPLE_PEAK_LEVEL) { pstr_input_config->sample_peak_level = DEFAULT_SAMPLE_PEAK_VALUE; } + if (pstr_input_config->use_drc_element) { + ia_drc_input_config *pstr_drc_cfg = (ia_drc_input_config *)pstr_input_config->pv_drc_cfg; + err_code = impd_drc_validate_config_params(pstr_drc_cfg); + if (err_code & IA_FATAL_ERROR) { + return err_code; + } + if (err_code) { + pstr_input_config->use_drc_element = 0; + err_code = IA_NO_ERROR; + } + } } else { pstr_input_config->cplx_pred = 0; pstr_input_config->harmonic_sbr = 0; @@ -788,13 +800,18 @@ static VOID ixheaace_validate_config_params(ixheaace_input_config *pstr_input_co pstr_input_config->esbr_flag = 0; } } + return err_code; } static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_struct, ixheaace_input_config *pstr_input_config) { WORD32 ele_idx; + IA_ERRORCODE err_code = IA_NO_ERROR; ia_usac_encoder_config_struct *pstr_usac_config = &pstr_api_struct->config[0].usac_config; - ixheaace_validate_config_params(pstr_input_config); + err_code = ixheaace_validate_config_params(pstr_input_config); + if (err_code) { + return err_code; + } if (pstr_input_config->ui_pcm_wd_sz != 16) { return (IA_EXHEAACE_CONFIG_FATAL_PCM_WDSZ); @@ -1454,12 +1471,54 @@ static VOID ixheaace_fill_mem_tabs(ixheaace_api_struct *pstr_api_struct, WORD32 return; } +static WORD32 get_drc_config_size(ixheaace_api_struct *pstr_api_struct, + ixheaace_output_config *ptr_out_cfg, + ixheaace_input_config *ptr_in_cfg) { + WORD32 bit_count = 0; + WORD32 total_byte_cnt = 0; + + ia_drc_enc_state *pstr_drc_state = + &pstr_api_struct->pstr_state->str_usac_enc_data.str_drc_state; + ia_drc_input_config *pstr_in_drc_cfg = (ia_drc_input_config *)ptr_in_cfg->pv_drc_cfg; + + memset(pstr_drc_state, 0, sizeof(*pstr_drc_state)); + + pstr_drc_state->str_enc_params = pstr_in_drc_cfg->str_enc_params; + pstr_drc_state->str_uni_drc_config = pstr_in_drc_cfg->str_uni_drc_config; + pstr_drc_state->str_gain_enc.str_loudness_info_set = pstr_in_drc_cfg->str_enc_loudness_info_set; + pstr_drc_state->str_enc_gain_extension = pstr_in_drc_cfg->str_enc_gain_extension; + pstr_drc_state->str_gain_enc.str_uni_drc_config = pstr_in_drc_cfg->str_uni_drc_config; + pstr_drc_state->drc_scratch_mem = + pstr_api_struct->pstr_state->str_usac_enc_data.str_scratch.ptr_scratch_buf; + + //uniDrc payload size + impd_drc_write_uni_drc_config(pstr_drc_state, &bit_count, 0); + total_byte_cnt += ((bit_count + 7) >> 3); + bit_count = 0; + + // LoudnessInfo payload size + impd_drc_write_loudness_info_set(pstr_drc_state, NULL, &bit_count, 0); + total_byte_cnt += ((bit_count + 7) >> 3); + + return total_byte_cnt; +} + static IA_ERRORCODE ixheaace_alloc_and_assign_mem(ixheaace_api_struct *pstr_api_struct, - ixheaace_output_config *ptr_out_cfg) { + ixheaace_output_config *ptr_out_cfg, + ixheaace_input_config *ptr_in_cfg) { IA_ERRORCODE err_code = IA_NO_ERROR; UWORD32 i_idx; pVOID pv_value; for (i_idx = 0; i_idx < 4; i_idx++) { + if (i_idx == IA_ENHAACPLUSENC_OUTPUT_IDX && + pstr_api_struct->config[0].usac_config.use_drc_element) { + WORD32 drc_config_size_expected = + get_drc_config_size(pstr_api_struct, ptr_out_cfg, ptr_in_cfg); + if (drc_config_size_expected > MAX_DRC_CONFIG_SIZE_EXPECTED) { + return IA_EXHEAACE_CONFIG_FATAL_DRC_INVALID_CONFIG; + } + pstr_api_struct->pstr_mem_info[i_idx].ui_size += drc_config_size_expected; + } ptr_out_cfg->mem_info_table[i_idx].ui_size = pstr_api_struct->pstr_mem_info[i_idx].ui_size; ptr_out_cfg->mem_info_table[i_idx].ui_alignment = pstr_api_struct->pstr_mem_info[i_idx].ui_alignment; @@ -3490,28 +3549,21 @@ static void ixheaace_config_drc_parameters(ixheaace_api_struct *pstr_api_struct, &pstr_internal_drc_cfg->str_enc_loudness_info_set; WORD32 n; - WORD32 i, k = 0; - i = pstr_enc_loudness_info_set->loudness_info_count; pstr_enc_loudness_info_set->loudness_info_count = - MIN(pstr_enc_loudness_info_set->loudness_info_count + - pstr_enc_internal_loudness_info_set->loudness_info_count, - MAX_LOUDNESS_INFO_COUNT); + MIN(pstr_enc_internal_loudness_info_set->loudness_info_count, MAX_LOUDNESS_INFO_COUNT); - for (n = i; n < pstr_enc_loudness_info_set->loudness_info_count; n++, k++) { + for (n = 0; n < pstr_enc_loudness_info_set->loudness_info_count; n++) { memcpy(&pstr_enc_loudness_info_set->str_loudness_info[n], - &pstr_enc_internal_loudness_info_set->str_loudness_info[k], + &pstr_enc_internal_loudness_info_set->str_loudness_info[n], sizeof(ia_drc_loudness_info_struct)); } - i = pstr_enc_loudness_info_set->loudness_info_album_count; - k = 0; - pstr_enc_loudness_info_set->loudness_info_album_count = - MIN(pstr_enc_loudness_info_set->loudness_info_album_count + - pstr_enc_internal_loudness_info_set->loudness_info_album_count, - MAX_LOUDNESS_INFO_COUNT); - for (n = i; n < pstr_enc_loudness_info_set->loudness_info_album_count; n++, k++) { + + pstr_enc_loudness_info_set->loudness_info_album_count = MIN( + pstr_enc_internal_loudness_info_set->loudness_info_album_count, MAX_LOUDNESS_INFO_COUNT); + for (n = 0; n < pstr_enc_loudness_info_set->loudness_info_album_count; n++) { memcpy(&pstr_enc_loudness_info_set->str_loudness_info_album[n], - &pstr_enc_internal_loudness_info_set->str_loudness_info_album[k], + &pstr_enc_internal_loudness_info_set->str_loudness_info_album[n], sizeof(ia_drc_loudness_info_struct)); } } @@ -3658,11 +3710,11 @@ IA_ERRORCODE ixheaace_allocate(pVOID pv_input, pVOID pv_output) { ixheaace_fill_mem_tabs(pstr_api_struct, pstr_input_config->aot); - err_code = ixheaace_alloc_and_assign_mem(pstr_api_struct, pstr_output_config); + err_code = + ixheaace_alloc_and_assign_mem(pstr_api_struct, pstr_output_config, pstr_input_config); if (err_code) { return err_code; } - return err_code; } diff --git a/fuzzer/xaac_enc_fuzzer.cpp b/fuzzer/xaac_enc_fuzzer.cpp index 7cd9c9f..3058b5f 100644 --- a/fuzzer/xaac_enc_fuzzer.cpp +++ b/fuzzer/xaac_enc_fuzzer.cpp @@ -203,16 +203,105 @@ static VOID ixheaace_read_drc_config_params( } } - pstr_uni_drc_config->str_channel_layout.layout_signaling_present = 0; - pstr_uni_drc_config->str_channel_layout.defined_layout = 0; - pstr_uni_drc_config->str_channel_layout.speaker_position[0] = 0; + pstr_enc_loudness_info_set->loudness_info_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_LOUDNESS_INFO_COUNT); + for (n = 0; n < pstr_enc_loudness_info_set->loudness_info_count; n++) { + pstr_enc_loudness_info_set->str_loudness_info[n].drc_set_id = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info[n].downmix_id = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info[n].sample_peak_level_present = + fuzzed_data->ConsumeBool(); + if (1 == pstr_enc_loudness_info_set->str_loudness_info[n].sample_peak_level_present) { + pstr_enc_loudness_info_set->str_loudness_info[n].sample_peak_level = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + } + pstr_enc_loudness_info_set->str_loudness_info[n].true_peak_level_present = + fuzzed_data->ConsumeBool(); + if (1 == pstr_enc_loudness_info_set->str_loudness_info[n].true_peak_level_present) { + pstr_enc_loudness_info_set->str_loudness_info[n].true_peak_level = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_enc_loudness_info_set->str_loudness_info[n].true_peak_level_measurement_system = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info[n].true_peak_level_reliability = + fuzzed_data->ConsumeIntegral<WORD8>(); + } - pstr_uni_drc_config->downmix_instructions_count = 0; + pstr_enc_loudness_info_set->str_loudness_info[n].measurement_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_MEASUREMENT_COUNT); + for (m = 0; m < pstr_enc_loudness_info_set->str_loudness_info[n].measurement_count; m++) { + pstr_enc_loudness_info_set->str_loudness_info[n].str_loudness_measure[m].method_definition = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info[n].str_loudness_measure[m].method_value = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_enc_loudness_info_set->str_loudness_info[n] + .str_loudness_measure[m] + .measurement_system = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info[n].str_loudness_measure[m].reliability = + fuzzed_data->ConsumeIntegral<WORD8>(); + } + } + + pstr_enc_loudness_info_set->loudness_info_album_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_LOUDNESS_INFO_COUNT); + for (n = 0; n < pstr_enc_loudness_info_set->loudness_info_album_count; n++) { + pstr_enc_loudness_info_set->str_loudness_info_album[n].drc_set_id = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n].downmix_id = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n].sample_peak_level_present = + fuzzed_data->ConsumeBool(); + if (1 == pstr_enc_loudness_info_set->str_loudness_info_album[n].sample_peak_level_present) { + pstr_enc_loudness_info_set->str_loudness_info_album[n].sample_peak_level = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + } + pstr_enc_loudness_info_set->str_loudness_info_album[n].true_peak_level_present = + fuzzed_data->ConsumeBool(); + if (1 == pstr_enc_loudness_info_set->str_loudness_info_album[n].true_peak_level_present) { + pstr_enc_loudness_info_set->str_loudness_info_album[n].true_peak_level = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n].true_peak_level_measurement_system = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n].true_peak_level_reliability = + fuzzed_data->ConsumeIntegral<WORD8>(); + } + + pstr_enc_loudness_info_set->str_loudness_info_album[n].measurement_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_MEASUREMENT_COUNT); + for (m = 0; m < pstr_enc_loudness_info_set->str_loudness_info_album[n].measurement_count; + m++) { + pstr_enc_loudness_info_set->str_loudness_info_album[n] + .str_loudness_measure[m] + .method_definition = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n] + .str_loudness_measure[m] + .method_value = fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n] + .str_loudness_measure[m] + .measurement_system = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_enc_loudness_info_set->str_loudness_info_album[n].str_loudness_measure[m].reliability = + fuzzed_data->ConsumeIntegral<WORD8>(); + } + } + + pstr_uni_drc_config->str_channel_layout.layout_signaling_present = fuzzed_data->ConsumeBool(); + pstr_uni_drc_config->str_channel_layout.defined_layout = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_uni_drc_config->str_channel_layout.speaker_position[0] = + fuzzed_data->ConsumeIntegral<WORD8>(); + + pstr_uni_drc_config->downmix_instructions_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_DOWNMIX_INSTRUCTION_COUNT); + for (n = 0; n < pstr_uni_drc_config->downmix_instructions_count; n++) { + pstr_uni_drc_config->str_downmix_instructions[n].target_layout = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_uni_drc_config->str_downmix_instructions[n].downmix_coefficients_present = + fuzzed_data->ConsumeBool(); + } - pstr_uni_drc_config->drc_description_basic_present = 0; - pstr_uni_drc_config->uni_drc_config_ext_present = 0; - pstr_enc_loudness_info_set->loudness_info_set_ext_present = 0; - pstr_enc_gain_extension->uni_drc_gain_ext_present = 0; + pstr_uni_drc_config->drc_description_basic_present = fuzzed_data->ConsumeBool(); + pstr_uni_drc_config->uni_drc_config_ext_present = fuzzed_data->ConsumeBool(); + pstr_enc_loudness_info_set->loudness_info_set_ext_present = fuzzed_data->ConsumeBool(); + pstr_enc_gain_extension->uni_drc_gain_ext_present = fuzzed_data->ConsumeBool(); } static VOID ixheaace_fuzzer_flag(ixheaace_input_config *pstr_in_cfg, |