diff options
author | Akshay Ragir <akshay.ragir@ittiam.com> | 2024-05-06 19:21:31 +0530 |
---|---|---|
committer | Akshay Ragir <akshay.ragir@ittiam.com> | 2024-05-07 13:20:31 +0530 |
commit | b9598d0c6c94b3b6096c1c9d63305bbfec58667b (patch) | |
tree | a647b31f41bad5e424f4b93f0408bcf7aba10b86 | |
parent | 12e2e71b241cd7523ed69adb4ff7307f488fea8d (diff) | |
download | libxaac-b9598d0c6c94b3b6096c1c9d63305bbfec58667b.tar.gz |
UniDrcv1 configuration support when DRC is enabled
Tests done: Smoke test
-rw-r--r-- | encoder/drc_src/impd_drc_api.c | 205 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_enc.c | 12 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_mux.c | 7 | ||||
-rw-r--r-- | encoder/drc_src/impd_drc_uni_drc.h | 2 | ||||
-rw-r--r-- | encoder/ixheaace_api.c | 17 | ||||
-rw-r--r-- | fuzzer/xaac_enc_fuzzer.cpp | 279 | ||||
-rw-r--r-- | test/encoder/impd_drc_config_params.txt | 104 | ||||
-rw-r--r-- | test/encoder/impd_drc_user_config.c | 183 | ||||
-rw-r--r-- | test/encoder/impd_drc_user_config.h | 3 | ||||
-rw-r--r-- | test/encoder/ixheaace_testbench.c | 3 |
10 files changed, 675 insertions, 140 deletions
diff --git a/encoder/drc_src/impd_drc_api.c b/encoder/drc_src/impd_drc_api.c index f3c6ace..5527b6d 100644 --- a/encoder/drc_src/impd_drc_api.c +++ b/encoder/drc_src/impd_drc_api.c @@ -51,6 +51,8 @@ IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_confi IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->drc_instructions_uni_drc_count, 0, MAX_DRC_INSTRUCTIONS_COUNT); for (i = 0; i < pstr_uni_drc_config->drc_instructions_uni_drc_count; i++) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->str_drc_instructions_uni_drc[i].drc_set_id, 0, + MAX_DRC_SET_ID); IMPD_DRC_BOUND_CHECK( pstr_uni_drc_config->str_drc_instructions_uni_drc[i].additional_downmix_id_count, 0, ADDITIONAL_DOWNMIX_ID_COUNT_MAX); @@ -128,25 +130,42 @@ IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_confi .start_sub_band_index, 0, STFT256_HOP_SIZE - 1); IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] - .str_gain_set_params[j].gain_params[k].width, + .str_gain_set_params[j] + .gain_params[k] + .width, -MAX_FLT_VAL_DB, MAX_FLT_VAL_DB); for (WORD32 m = 0; m < pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] - .str_gain_set_params[j].gain_params[k].nb_points; m++) { + .str_gain_set_params[j] + .gain_params[k] + .nb_points; + m++) { IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] - .str_gain_set_params[j].gain_params[k].gain_points[m].x, + .str_gain_set_params[j] + .gain_params[k] + .gain_points[m] + .x, -MAX_FLT_VAL_DB, MAX_FLT_VAL_DB); IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] - .str_gain_set_params[j].gain_params[k].gain_points[m].y, + .str_gain_set_params[j] + .gain_params[k] + .gain_points[m] + .y, -MAX_FLT_VAL_DB, MAX_FLT_VAL_DB); } } - for (k = 0; k < - pstr_uni_drc_config->str_drc_coefficients_uni_drc[i].str_gain_set_params[j].band_count - - 1; k++) { - curr_start_subband_idx = pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]. - str_gain_set_params[j].gain_params[k].start_sub_band_index; - next_start_subband_idx = pstr_uni_drc_config->str_drc_coefficients_uni_drc[i]. - str_gain_set_params[j].gain_params[k + 1].start_sub_band_index; + for (k = 0; k < pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] + .str_gain_set_params[j] + .band_count - + 1; + k++) { + curr_start_subband_idx = pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] + .str_gain_set_params[j] + .gain_params[k] + .start_sub_band_index; + next_start_subband_idx = pstr_uni_drc_config->str_drc_coefficients_uni_drc[i] + .str_gain_set_params[j] + .gain_params[k + 1] + .start_sub_band_index; /* It is assumed that the start index of a subband is greater than the start index of its previous subbands for a multiband */ if (next_start_subband_idx <= curr_start_subband_idx) { @@ -225,6 +244,160 @@ IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_confi 0, MAX_RELIABILITY_TYPE); } } + + if (pstr_uni_drc_config->uni_drc_config_ext_present) { + ia_drc_uni_drc_config_ext_struct *pstr_uni_drc_config_ext = + &pstr_uni_drc_config->str_uni_drc_config_ext; + if (pstr_uni_drc_config_ext->downmix_instructions_v1_present) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->downmix_instructions_v1_count, 0, + DOWNMIX_INSTRUCTIONS_COUNT_MAX); + for (i = 0; i < pstr_uni_drc_config_ext->downmix_instructions_v1_count; i++) { + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_downmix_instructions_v1[i].target_layout, 0, + MAX_TARGET_LAYOUT_COUNT); + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_downmix_instructions_v1[i].target_ch_count, 0, + MAX_CHANNEL_COUNT); + } + } + + if (pstr_uni_drc_config_ext->drc_coeffs_and_instructions_uni_drc_v1_present) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->drc_coefficients_uni_drc_v1_count, 0, + DRC_COEFFICIENTS_UNIDRC_V1_COUNT_MAX); + for (i = 0; i < pstr_uni_drc_config_ext->drc_coefficients_uni_drc_v1_count; i++) { + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i].gain_set_count, 0, + GAIN_SET_COUNT_MAX); + for (j = 0; + j < pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i].gain_set_count; + j++) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_coding_profile, + 0, MAX_GAIN_CODING_PROFILE); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .band_count, + 0, MAX_BAND_COUNT); + for (k = 0; k < pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .band_count; + k++) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .nb_points, + 0, MAX_GAIN_POINTS); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .drc_characteristic, + 0, MAX_DRC_CHARACTERISTIC_VALUE); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .crossover_freq_index, + 0, MAX_CROSSOVER_FREQ_INDEX); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .start_sub_band_index, + 0, STFT256_HOP_SIZE - 1); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .width, + -MAX_FLT_VAL_DB, MAX_FLT_VAL_DB); + for (WORD32 m = 0; m < pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .nb_points; + m++) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .gain_points[m] + .x, + -MAX_FLT_VAL_DB, MAX_FLT_VAL_DB); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .gain_points[m] + .y, + -MAX_FLT_VAL_DB, MAX_FLT_VAL_DB); + } + } + for (k = 0; k < pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .band_count - + 1; + k++) { + curr_start_subband_idx = pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k] + .start_sub_band_index; + next_start_subband_idx = pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .gain_params[k + 1] + .start_sub_band_index; + /* It is assumed that the start index of a subband is greater than + the start index of its previous subbands for a multiband */ + if (next_start_subband_idx <= curr_start_subband_idx) { + return IA_EXHEAACE_EXE_NONFATAL_USAC_INVALID_SUBBAND_INDEX; + } + } + } + } + + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count, 0, + DRC_INSTRUCTIONS_UNIDRC_V1_COUNT_MAX); + for (i = 0; i < pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count; i++) { + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].drc_set_id, 0, + MAX_DRC_SET_ID); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .additional_downmix_id_count, + 0, MAX_ADDITIONAL_DOWNMIX_ID); + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].drc_location, 0, + MAX_DRC_LOCATION); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .drc_set_target_loudness_value_upper, + MIN_DRC_TARGET_LOUDNESS, 0); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .drc_set_target_loudness_value_lower, + MIN_DRC_TARGET_LOUDNESS, 0); + for (j = 0; j < MAX_CHANNEL_COUNT; j++) { + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].gain_set_index[j], 0, + GAIN_SET_COUNT_MAX - 1); + } + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].num_drc_channel_groups, 0, + MAX_CHANNEL_GROUP_COUNT); + for (j = 0; + j < + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].num_drc_channel_groups; + j++) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .str_gain_modifiers[j] + .attenuation_scaling[0], + 0, MAX_ATTENUATION_SCALING); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .str_gain_modifiers[j] + .amplification_scaling[0], + 0, MAX_AMPLIFICATION_SCALING); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .str_gain_modifiers[j] + .gain_offset[0], + MIN_DRC_GAIN_OFFSET, MAX_DRC_GAIN_OFFSET); + } + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].limiter_peak_target, + MIN_LIMITER_PEAK_TARGET, 0.0f); + } + } + } return IA_NO_ERROR; } @@ -304,8 +477,9 @@ IA_ERRORCODE impd_drc_enc_init(VOID *pstr_drc_state, VOID *ptr_drc_scratch, 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){ + if (pstr_drc_state_local->str_gain_enc.str_uni_drc_config.loudness_info_set_present == 1) { bit_count = 0; + iusace_reset_bit_buffer(&pstr_drc_state_local->str_bit_buf_cfg_ext); 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) { @@ -322,12 +496,11 @@ IA_ERRORCODE impd_loudness_info_init(VOID *pstr_drc_state, ia_drc_input_config * ia_drc_enc_state *pstr_drc_state_local = pstr_drc_state; iusace_create_bit_buffer(&pstr_drc_state_local->str_bit_buf_cfg_ext, - pstr_drc_state_local->bit_buf_base_cfg_ext, - sizeof(pstr_drc_state_local->bit_buf_base_cfg_ext), 1); + pstr_drc_state_local->bit_buf_base_cfg_ext, + sizeof(pstr_drc_state_local->bit_buf_base_cfg_ext), 1); memcpy(&pstr_drc_state_local->str_gain_enc.str_loudness_info_set, - &pstr_inp_config->str_enc_loudness_info_set, - sizeof(ia_drc_loudness_info_set_struct)); + &pstr_inp_config->str_enc_loudness_info_set, sizeof(ia_drc_loudness_info_set_struct)); err_code = impd_drc_write_measured_loudness_info(pstr_drc_state_local); return err_code; diff --git a/encoder/drc_src/impd_drc_enc.c b/encoder/drc_src/impd_drc_enc.c index 7e835f7..8c0c5ab 100644 --- a/encoder/drc_src/impd_drc_enc.c +++ b/encoder/drc_src/impd_drc_enc.c @@ -104,8 +104,16 @@ IA_ERRORCODE impd_drc_gain_enc_init(ia_drc_gain_enc_struct *pstr_gain_enc, all_band_gain_count += pstr_drc_coefficients_uni_drc->str_gain_set_params[i].band_count; } pstr_gain_enc->n_sequences = all_band_gain_count; - } else { - pstr_gain_enc->n_sequences = pstr_drc_coefficients_uni_drc_v1->gain_sequence_count; + } + else { + for (i = 0; i < pstr_uni_drc_config_ext->drc_coefficients_uni_drc_v1_count; i++) { + WORD32 all_band_gain_count = 0; + for (j = 0; j < pstr_drc_coefficients_uni_drc_v1[i].gain_set_count; j++) { + all_band_gain_count += pstr_drc_coefficients_uni_drc_v1[i].str_gain_set_params[j].band_count; + } + pstr_drc_coefficients_uni_drc_v1[i].gain_sequence_count = all_band_gain_count; + pstr_gain_enc->n_sequences += all_band_gain_count; + } } if (pstr_gain_enc->n_sequences > IMPD_DRCMAX_NSEQ) { diff --git a/encoder/drc_src/impd_drc_mux.c b/encoder/drc_src/impd_drc_mux.c index 8484b1c..43bb87e 100644 --- a/encoder/drc_src/impd_drc_mux.c +++ b/encoder/drc_src/impd_drc_mux.c @@ -1113,7 +1113,7 @@ static VOID impd_drc_write_gain_params(ia_bit_buf_struct *it_bit_buf, const WORD } } else { WORD32 index_present; - WORD32 gain_sequence_index_last = -100; + WORD32 gain_sequence_index_last = -1; for (idx = 0; idx < band_count; idx++) { if (pstr_gain_params[idx].gain_sequence_index == gain_sequence_index_last + 1) { index_present = 0; @@ -2747,10 +2747,11 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( } break; } - bit_cnt_local += iusace_write_bits_buf( - it_bit_buf, pstr_uni_drc_config_ext->uni_drc_config_ext_type[counter], 4); counter++; + + bit_cnt_local += iusace_write_bits_buf( + it_bit_buf, pstr_uni_drc_config_ext->uni_drc_config_ext_type[counter], 4); } *ptr_bit_cnt += bit_cnt_local; diff --git a/encoder/drc_src/impd_drc_uni_drc.h b/encoder/drc_src/impd_drc_uni_drc.h index 48d7d7f..13e43ca 100644 --- a/encoder/drc_src/impd_drc_uni_drc.h +++ b/encoder/drc_src/impd_drc_uni_drc.h @@ -73,6 +73,7 @@ #define SPLIT_CHARACTERISTIC_COUNT_MAX 8 /* reduced size */ #define SHAPE_FILTER_COUNT_MAX 8 /* reduced size */ #define ADDITIONAL_DOWNMIX_ID_COUNT_MAX MAX_ADDITIONAL_DOWNMIX_ID +#define MAX_TARGET_LAYOUT_COUNT 127 #define ADDITIONAL_DRC_SET_ID_COUNT_MAX 16 #define ADDITIONAL_EQ_SET_ID_COUNT_MAX 8 #define LOUD_EQ_GAIN_MAX_SEQUENCE_COUNT 4 @@ -110,6 +111,7 @@ #define COMPLEXITY_W_PARAM_LIM_FILT 4.5f #define COMPLEXITY_W_PARAM_DRC_ATTACK 136.0f +#define MAX_DRC_SET_ID (63) #define MAX_DRC_LOCATION (4) #define MIN_DRC_TARGET_LOUDNESS (-63) #define MAX_ATTENUATION_SCALING (1.875f) diff --git a/encoder/ixheaace_api.c b/encoder/ixheaace_api.c index a98a8dc..2fadb8e 100644 --- a/encoder/ixheaace_api.c +++ b/encoder/ixheaace_api.c @@ -1007,6 +1007,7 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str pstr_drc_cfg->str_uni_drc_config.str_channel_layout.base_ch_count = pstr_input_config->i_channels; pstr_drc_cfg->str_enc_params.sample_rate = pstr_input_config->i_samp_freq; + pstr_drc_cfg->str_enc_params.domain = TIME_DOMAIN; pstr_drc_cfg->str_uni_drc_config.sample_rate = pstr_drc_cfg->str_enc_params.sample_rate; for (WORD32 i = 0; i < pstr_drc_cfg->str_uni_drc_config.drc_coefficients_uni_drc_count; i++) { @@ -1019,6 +1020,18 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str impd_drc_get_delta_t_min(pstr_drc_cfg->str_uni_drc_config.sample_rate); } } + for (WORD32 i = 0; i < pstr_drc_cfg->str_uni_drc_config.str_uni_drc_config_ext + .drc_coefficients_uni_drc_v1_count; i++) { + for (WORD32 j = 0; + j < pstr_drc_cfg->str_uni_drc_config.str_uni_drc_config_ext + .str_drc_coefficients_uni_drc_v1[i].gain_set_count; j++) { + pstr_drc_cfg->str_uni_drc_config.str_uni_drc_config_ext + .str_drc_coefficients_uni_drc_v1[i] + .str_gain_set_params[j] + .delta_tmin = + impd_drc_get_delta_t_min(pstr_drc_cfg->str_uni_drc_config.sample_rate); + } + } pstr_usac_config->str_drc_cfg = *pstr_drc_cfg; pstr_usac_config->str_drc_cfg.str_enc_params.frame_size = pstr_usac_config->drc_frame_size; @@ -1472,7 +1485,6 @@ static VOID ixheaace_fill_mem_tabs(ixheaace_api_struct *pstr_api_struct, WORD32 } 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; @@ -1490,6 +1502,7 @@ static WORD32 get_drc_config_size(ixheaace_api_struct *pstr_api_struct, 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; + pstr_drc_state->str_gain_enc.base_ch_count = ptr_in_cfg->i_channels; //uniDrc payload size impd_drc_write_uni_drc_config(pstr_drc_state, &bit_count, 0); @@ -1513,7 +1526,7 @@ static IA_ERRORCODE ixheaace_alloc_and_assign_mem(ixheaace_api_struct *pstr_api_ 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); + get_drc_config_size(pstr_api_struct, ptr_in_cfg); if (drc_config_size_expected > MAX_DRC_CONFIG_SIZE_EXPECTED) { return IA_EXHEAACE_CONFIG_FATAL_DRC_INVALID_CONFIG; } diff --git a/fuzzer/xaac_enc_fuzzer.cpp b/fuzzer/xaac_enc_fuzzer.cpp index 3058b5f..fe96c8a 100644 --- a/fuzzer/xaac_enc_fuzzer.cpp +++ b/fuzzer/xaac_enc_fuzzer.cpp @@ -36,8 +36,8 @@ extern "C" { } static constexpr WORD32 k_sample_rates[] = {7350, 8000, 11025, 12000, 16000, 22050, 24000, - 32000, 44100, 48000, 64000, 88200, 96000}; -static constexpr WORD16 k_frame_length[] = {480, 512, 768, 960, 1024}; + 32000, 44100, 48000, 64000, 88200, 96000}; +static constexpr WORD16 k_frame_length[] = {480, 512, 768, 960, 1024}; pVOID malloc_global(UWORD32 size, UWORD32 alignment) { pVOID ptr = NULL; @@ -52,7 +52,8 @@ VOID free_global(pVOID ptr) { free(ptr); } static VOID ixheaace_read_drc_config_params( ia_drc_enc_params_struct *pstr_enc_params, ia_drc_uni_drc_config_struct *pstr_uni_drc_config, ia_drc_loudness_info_set_struct *pstr_enc_loudness_info_set, - ia_drc_uni_drc_gain_ext_struct *pstr_enc_gain_extension, FuzzedDataProvider *fuzzed_data) { + ia_drc_uni_drc_gain_ext_struct *pstr_enc_gain_extension, FuzzedDataProvider *fuzzed_data, + WORD32 in_ch) { WORD32 n, g, s, m, ch, p; WORD32 gain_set_channels; @@ -302,11 +303,207 @@ static VOID ixheaace_read_drc_config_params( 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(); + + if (pstr_uni_drc_config->uni_drc_config_ext_present) { + pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[0] = UNIDRC_CONF_EXT_V1; + pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present = + fuzzed_data->ConsumeBool(); + if (pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present) { + /*********** str_downmix_instructions_v1 *************/ + + pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, DOWNMIX_INSTRUCTIONS_COUNT_MAX); + for (n = 0; n < pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_count; + n++) { + ia_drc_downmix_instructions_struct *pstr_downmix_instructions_v1 = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_downmix_instructions_v1[n]; + pstr_downmix_instructions_v1->downmix_id = fuzzed_data->ConsumeIntegral<WORD8>(); + ; + pstr_downmix_instructions_v1->target_ch_count = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_downmix_instructions_v1->target_layout = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_downmix_instructions_v1->downmix_coefficients_present = fuzzed_data->ConsumeBool(); + if (pstr_downmix_instructions_v1->downmix_coefficients_present) { + FLOAT32 dwn_mix_coeff = 0.0f; + for (s = 0; s < pstr_downmix_instructions_v1->target_layout; s++) { + dwn_mix_coeff = fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + for (ch = 0; ch < in_ch; ch++) { + pstr_downmix_instructions_v1->downmix_coeff[in_ch * s + ch] = dwn_mix_coeff; + } + } + } + } + } + + pstr_uni_drc_config->str_uni_drc_config_ext.drc_coeffs_and_instructions_uni_drc_v1_present = + fuzzed_data->ConsumeBool(); + if (pstr_uni_drc_config->str_uni_drc_config_ext + .drc_coeffs_and_instructions_uni_drc_v1_present) { + /*********** str_drc_coefficients_uni_drc_v1 *************/ + + pstr_uni_drc_config->str_uni_drc_config_ext.drc_coefficients_uni_drc_v1_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, DRC_COEFFICIENTS_UNIDRC_V1_COUNT_MAX); + for (n = 0; + n < pstr_uni_drc_config->str_uni_drc_config_ext.drc_coefficients_uni_drc_v1_count; + n++) { + ia_drc_coefficients_uni_drc_struct *pstr_drc_coefficients_uni_drc_v1 = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_drc_coefficients_uni_drc_v1[n]; + pstr_drc_coefficients_uni_drc_v1->drc_location = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_coefficients_uni_drc_v1->gain_set_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, GAIN_SET_COUNT_MAX); + for (s = 0; s < pstr_drc_coefficients_uni_drc_v1->gain_set_count; s++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_coding_profile = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_interpolation_type = + fuzzed_data->ConsumeBool(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].full_frame = + fuzzed_data->ConsumeBool(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].time_alignment = + fuzzed_data->ConsumeBool(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].time_delta_min_present = + fuzzed_data->ConsumeBool(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_BAND_COUNT); + if (pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count == 1) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].nb_points = + fuzzed_data->ConsumeIntegralInRange<WORD16>(0, MAX_GAIN_POINTS); + for (p = 0; p < pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[0] + .nb_points; + p++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[0] + .gain_points[p] + .x = fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[0] + .gain_points[p] + .y = fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + } + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].width = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].attack = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].decay = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[0] + .drc_characteristic = fuzzed_data->ConsumeIntegral<WORD8>(); + ; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[0] + .crossover_freq_index = fuzzed_data->ConsumeIntegral<WORD8>(); + } else { + for (m = 0; m < pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count; + m++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].nb_points = + fuzzed_data->ConsumeIntegralInRange<WORD16>(0, MAX_GAIN_POINTS); + for (p = 0; p < pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .nb_points; + p++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .gain_points[p] + .x = fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .gain_points[p] + .y = fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + } + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].width = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].attack = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].decay = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].drc_band_type = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .start_sub_band_index = fuzzed_data->ConsumeIntegral<WORD16>(); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .drc_characteristic = fuzzed_data->ConsumeIntegral<WORD8>(); + ; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .crossover_freq_index = fuzzed_data->ConsumeIntegral<WORD8>(); + } + } + } + } + + /*********** str_drc_instructions_uni_drc_v1 *************/ + pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, DRC_INSTRUCTIONS_UNIDRC_V1_COUNT_MAX); + for (n = 0; + n < pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count; + n++) { + ia_drc_instructions_uni_drc *pstr_drc_instructions_uni_drc = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_drc_instructions_uni_drc_v1[n]; + pstr_drc_instructions_uni_drc->drc_set_id = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->downmix_id = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->additional_downmix_id_present = fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->additional_downmix_id_count = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->drc_location = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->depends_on_drc_set_present = fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->depends_on_drc_set = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->no_independent_use = fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->drc_set_effect = fuzzed_data->ConsumeIntegral<WORD16>(); + pstr_drc_instructions_uni_drc->drc_set_target_loudness_present = + fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->drc_set_target_loudness_value_upper = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->drc_set_target_loudness_value_lower_present = + fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->drc_set_target_loudness_value_lower = + fuzzed_data->ConsumeIntegral<WORD8>(); + + gain_set_channels = fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_CHANNEL_COUNT); + for (ch = 0; ch < gain_set_channels; ch++) { + pstr_drc_instructions_uni_drc->gain_set_index[ch] = + fuzzed_data->ConsumeIntegral<WORD8>(); + } + for (; ch < MAX_CHANNEL_COUNT; ch++) { + if (gain_set_channels > 0) { + pstr_drc_instructions_uni_drc->gain_set_index[ch] = + pstr_drc_instructions_uni_drc->gain_set_index[gain_set_channels - 1]; + } else { + pstr_drc_instructions_uni_drc->gain_set_index[ch] = 0; + } + } + + pstr_drc_instructions_uni_drc->num_drc_channel_groups = + fuzzed_data->ConsumeIntegralInRange<WORD8>(0, MAX_CHANNEL_GROUP_COUNT); + for (g = 0; g < pstr_drc_instructions_uni_drc->num_drc_channel_groups; g++) { + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].gain_scaling_present[0] = + fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].attenuation_scaling[0] = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].amplification_scaling[0] = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].gain_offset_present[0] = + fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].gain_offset[0] = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + } + + pstr_drc_instructions_uni_drc->limiter_peak_target_present = fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->limiter_peak_target = + fuzzed_data->ConsumeFloatingPoint<FLOAT32>(); + pstr_drc_instructions_uni_drc->drc_instructions_type = + fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->mae_group_id = fuzzed_data->ConsumeIntegral<WORD8>(); + pstr_drc_instructions_uni_drc->mae_group_preset_id = + fuzzed_data->ConsumeIntegral<WORD8>(); + } + } + } } static VOID ixheaace_fuzzer_flag(ixheaace_input_config *pstr_in_cfg, ia_drc_input_config *pstr_drc_cfg, - FuzzedDataProvider *fuzzed_data) { + FuzzedDataProvider *fuzzed_data, WORD32 in_ch) { // Set Default value for AAC config structure pstr_in_cfg->i_bitrate = fuzzed_data->ConsumeIntegral<WORD32>(); @@ -352,21 +549,19 @@ static VOID ixheaace_fuzzer_flag(ixheaace_input_config *pstr_in_cfg, ixheaace_read_drc_config_params(&pstr_drc_cfg->str_enc_params, &pstr_drc_cfg->str_uni_drc_config, &pstr_drc_cfg->str_enc_loudness_info_set, - &pstr_drc_cfg->str_enc_gain_extension, fuzzed_data); + &pstr_drc_cfg->str_enc_gain_extension, fuzzed_data, in_ch); } } IA_ERRORCODE ia_enhaacplus_enc_pcm_data_read(std::vector<WORD8> input_vec, UWORD32 num_samples, - WORD32 num_channels, WORD16 **data) -{ + WORD32 num_channels, WORD16 **data) { UWORD32 count = 0; UWORD8 channel_no; UWORD32 sample_no = 0; UWORD32 i = 0; - while (count < num_samples) - { + while (count < num_samples) { sample_no = (count / num_channels); - channel_no = (UWORD8)(count%num_channels); + channel_no = (UWORD8)(count % num_channels); data[channel_no][sample_no] = *input_vec.data(); i++; count++; @@ -375,44 +570,39 @@ IA_ERRORCODE ia_enhaacplus_enc_pcm_data_read(std::vector<WORD8> input_vec, UWORD } static IA_ERRORCODE ixheaace_calculate_loudness_measure(ixheaace_input_config *pstr_in_cfg, - ixheaace_output_config *pstr_out_cfg, FuzzedDataProvider *fuzzed_data) -{ + ixheaace_output_config *pstr_out_cfg, + FuzzedDataProvider *fuzzed_data) { WORD32 input_size; WORD32 count = 0; IA_ERRORCODE err_code = 0; - VOID *loudness_handle = malloc_global(ixheaace_loudness_info_get_handle_size(), - DEFAULT_MEM_ALIGN_8); + VOID *loudness_handle = + malloc_global(ixheaace_loudness_info_get_handle_size(), DEFAULT_MEM_ALIGN_8); if (loudness_handle == NULL) { printf("fatal error: libxaac encoder: Memory allocation failed"); return -1; } err_code = ixheaace_loudness_init_params(loudness_handle, pstr_in_cfg, pstr_out_cfg); - + if (err_code) { free_global(loudness_handle); return -1; } - input_size = (pstr_out_cfg->samp_freq / 10)*(pstr_in_cfg->i_channels); + input_size = (pstr_out_cfg->samp_freq / 10) * (pstr_in_cfg->i_channels); WORD16 **samples = 0; - samples = (WORD16 **)malloc_global(pstr_in_cfg->i_channels * sizeof(*samples), - DEFAULT_MEM_ALIGN_8); - if (samples == NULL) - { + samples = + (WORD16 **)malloc_global(pstr_in_cfg->i_channels * sizeof(*samples), DEFAULT_MEM_ALIGN_8); + if (samples == NULL) { printf("fatal error: libxaac encoder: Memory allocation failed"); free_global(loudness_handle); return -1; } - for (count = 0; count < pstr_in_cfg->i_channels; count++) - { - samples[count] = - (WORD16 *)malloc_global((pstr_out_cfg->samp_freq / 10) * sizeof(*samples[count]), - DEFAULT_MEM_ALIGN_8); - if (samples[count] == NULL) - { + for (count = 0; count < pstr_in_cfg->i_channels; count++) { + samples[count] = (WORD16 *)malloc_global( + (pstr_out_cfg->samp_freq / 10) * sizeof(*samples[count]), DEFAULT_MEM_ALIGN_8); + if (samples[count] == NULL) { printf("fatal error: libxaac encoder: Memory allocation failed"); - while (count) - { + while (count) { count--; free_global(samples[count]); } @@ -423,14 +613,12 @@ static IA_ERRORCODE ixheaace_calculate_loudness_measure(ixheaace_input_config *p memset(samples[count], 0, (pstr_out_cfg->samp_freq / 10) * sizeof(*samples[count])); } count = 0; - while (count <= fuzzed_data->remaining_bytes()) - { + while (count <= fuzzed_data->remaining_bytes()) { std::vector<WORD8> input_vec = fuzzed_data->ConsumeBytes<WORD8>(input_size); - err_code = ia_enhaacplus_enc_pcm_data_read(input_vec, input_size, - pstr_in_cfg->i_channels, samples); + err_code = + ia_enhaacplus_enc_pcm_data_read(input_vec, input_size, pstr_in_cfg->i_channels, samples); if (err_code) { - for (count = 0; count < pstr_in_cfg->i_channels; count++) - { + for (count = 0; count < pstr_in_cfg->i_channels; count++) { free_global(samples[count]); } free_global(samples); @@ -443,8 +631,7 @@ static IA_ERRORCODE ixheaace_calculate_loudness_measure(ixheaace_input_config *p if (pstr_in_cfg->method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) { pstr_in_cfg->measured_loudness = ixheaace_measure_integrated_loudness(loudness_handle); } - for (count = 0; count < pstr_in_cfg->i_channels; count++) - { + for (count = 0; count < pstr_in_cfg->i_channels; count++) { free_global(samples[count]); } free_global(samples); @@ -485,13 +672,12 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { /* ******************************************************************/ /* Parse input configuration parameters */ /* ******************************************************************/ - ixheaace_fuzzer_flag(pstr_in_cfg, pstr_drc_cfg, &fuzzed_data); - - /*1st pass -> Loudness Measurement */ - if (pstr_in_cfg->aot == AOT_USAC) - { - err_code = ixheaace_calculate_loudness_measure(pstr_in_cfg, pstr_out_cfg, - &fuzzed_data_loudness); + ixheaace_fuzzer_flag(pstr_in_cfg, pstr_drc_cfg, &fuzzed_data, pstr_in_cfg->i_channels); + + /*1st pass -> Loudness Measurement */ + if (pstr_in_cfg->aot == AOT_USAC) { + err_code = + ixheaace_calculate_loudness_measure(pstr_in_cfg, pstr_out_cfg, &fuzzed_data_loudness); if (err_code) { if (pstr_drc_cfg) { free(pstr_drc_cfg); @@ -505,7 +691,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { return -1; } } - + err_code = ixheaace_create((pVOID)pstr_in_cfg, (pVOID)pstr_out_cfg); if (err_code) { if (pstr_drc_cfg) { @@ -550,8 +736,7 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { read_inp_data = 1; } /* Stop processing after 500 frames */ - if (num_proc_iterations > 500) - break; + if (num_proc_iterations > 500) break; } ixheaace_delete((pVOID)pstr_out_cfg); diff --git a/test/encoder/impd_drc_config_params.txt b/test/encoder/impd_drc_config_params.txt index fc2ac26..a5cb59f 100644 --- a/test/encoder/impd_drc_config_params.txt +++ b/test/encoder/impd_drc_config_params.txt @@ -1,4 +1,33 @@ #####str_drc_instructions_uni_drc##### +drc_instructions_uni_drc_count:0 +#####str_drc_coefficients_uni_drc##### +drc_coefficients_uni_drc_count:0 +#####str_downmix_instructions_v1##### +downmix_instructions_v1_count:1 +#n=0 +target_layout:1 +#s=0 +downmix_coeff:0.70794578438 +#end downmix coeeficients +#####str_drc_coefficients_uni_drc_v1##### +drc_coefficients_uni_drc_count_v1:1 +#n=0 +gain_set_count:1 +#s=0 +band_count:1 +#gain parameters m=0 +nb_points:3 +x:-60.0 +y:-40.0 +x:-30.0 +y:-30.0 +x:0.0 +y:-20.0 +width:0.01 +attack:2.0 +decay:5.0 +#end gain parameters +#####str_drc_instructions_uni_drc_v1##### drc_instructions_uni_drc_count:8 #n=0 downmix_id:0 @@ -61,14 +90,14 @@ downmix_id:0 #Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ drc_set_effect:0x0010 gain_set_channels:8 -gain_set_index:1 -gain_set_index:1 -gain_set_index:1 -gain_set_index:1 -gain_set_index:1 -gain_set_index:1 -gain_set_index:1 -gain_set_index:1 +gain_set_index:0 +gain_set_index:0 +gain_set_index:0 +gain_set_index:0 +gain_set_index:0 +gain_set_index:0 +gain_set_index:0 +gain_set_index:0 num_drc_channel_groups:1 #n=5 downmix_id:0 @@ -111,61 +140,4 @@ gain_set_index:0 gain_set_index:0 gain_set_index:0 gain_set_index:0 -num_drc_channel_groups:1 -#####str_drc_coefficients_uni_drc##### -drc_coefficients_uni_drc_count:1 -#n=0 -gain_set_count:2 -#s=0 -band_count:1 -#gain parameters m=0 -nb_points:3 -x:-60.0 -y:-40.0 -x:-30.0 -y:-30.0 -x:0.0 -y:-20.0 -width:0.01 -attack:2.0 -decay:5.0 -#end gain parameters -#s=1 -band_count:3 -#gain parameters m=0 -nb_points:2 -x:-50.0 -y:-50.0 -x:0.0 -y:-10.0 -width:0.01 -attack:2.0 -decay:5.0 -start_sub_band_index:0 -#end gain parameters -#gain parameters m=1 -nb_points:3 -x:-60.0 -y:-60.0 -x:-20.0 -y:-15.0 -x:0.0 -y:-5.0 -width:0.01 -attack:2.0 -decay:5.0 -start_sub_band_index:3 -#end gain parameters -#gain parameters m=2 -nb_points:3 -x:-80.0 -y:-80.0 -x:-30.0 -y:-60.0 -x:0.0 -y:-30.0 -width:0.01 -attack:2.0 -decay:5.0 -start_sub_band_index:44 -#end gain parameters +num_drc_channel_groups:1
\ No newline at end of file diff --git a/test/encoder/impd_drc_user_config.c b/test/encoder/impd_drc_user_config.c index c6363b7..7f2969f 100644 --- a/test/encoder/impd_drc_user_config.c +++ b/test/encoder/impd_drc_user_config.c @@ -83,7 +83,8 @@ static WORD32 impd_drc_get_integer_value(FILE *fp) { VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_enc_params, ia_drc_uni_drc_config_struct *pstr_uni_drc_config, ia_drc_loudness_info_set_struct *pstr_enc_loudness_info_set, - ia_drc_uni_drc_gain_ext_struct *pstr_enc_gain_extension) { + ia_drc_uni_drc_gain_ext_struct *pstr_enc_gain_extension, + WORD32 in_ch) { WORD32 n, g, s, m, ch, p; WORD32 gain_set_channels; @@ -243,7 +244,185 @@ VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_en pstr_uni_drc_config->downmix_instructions_count = 0; pstr_uni_drc_config->drc_description_basic_present = 0; - pstr_uni_drc_config->uni_drc_config_ext_present = 0; + + pstr_uni_drc_config->uni_drc_config_ext_present = 1; + if (pstr_uni_drc_config->uni_drc_config_ext_present) { + pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[0] = UNIDRC_CONF_EXT_V1; + + pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present = 1; + if (pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present) { + + /*********** str_downmix_instructions_v1 *************/ + pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_count = impd_drc_get_integer_value(fp); + + pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_count = + MIN(pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_count, MAX_DOWNMIX_INSTRUCTION_COUNT); + for (n = 0; n < pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_count; n++) + { + ia_drc_downmix_instructions_struct *pstr_downmix_instructions_v1 = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_downmix_instructions_v1[n]; + pstr_downmix_instructions_v1->downmix_id = n + 1; + pstr_downmix_instructions_v1->target_ch_count = 1; + pstr_downmix_instructions_v1->target_layout = impd_drc_get_integer_value(fp); + pstr_downmix_instructions_v1->downmix_coefficients_present = 1; + if (pstr_downmix_instructions_v1->downmix_coefficients_present) { + FLOAT32 dwn_mix_coeff = 0.0f; + for (s = 0; s < pstr_downmix_instructions_v1->target_layout; s++) { + dwn_mix_coeff = impd_drc_get_float_value(fp); + for (ch = 0; ch < in_ch; ch++) { + pstr_downmix_instructions_v1->downmix_coeff[in_ch * s + ch] = dwn_mix_coeff; + } + } + } + } + } + + pstr_uni_drc_config->str_uni_drc_config_ext.drc_coeffs_and_instructions_uni_drc_v1_present = 1; + if (pstr_uni_drc_config->str_uni_drc_config_ext.drc_coeffs_and_instructions_uni_drc_v1_present) { + + /*********** str_drc_coefficients_uni_drc_v1 *************/ + pstr_uni_drc_config->str_uni_drc_config_ext.drc_coefficients_uni_drc_v1_count = impd_drc_get_integer_value(fp); + + pstr_uni_drc_config->str_uni_drc_config_ext.drc_coefficients_uni_drc_v1_count = + MIN(pstr_uni_drc_config->str_uni_drc_config_ext.drc_coefficients_uni_drc_v1_count, MAX_DRC_COEFF_COUNT); + for (n = 0; n < pstr_uni_drc_config->str_uni_drc_config_ext.drc_coefficients_uni_drc_v1_count; n++) { + ia_drc_coefficients_uni_drc_struct *pstr_drc_coefficients_uni_drc_v1 = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_drc_coefficients_uni_drc_v1[n]; + pstr_drc_coefficients_uni_drc_v1->drc_location = 1; + pstr_drc_coefficients_uni_drc_v1->gain_set_count = impd_drc_get_integer_value(fp); + pstr_drc_coefficients_uni_drc_v1->gain_set_count = + MIN(pstr_drc_coefficients_uni_drc_v1->gain_set_count, GAIN_SET_COUNT_MAX); + for (s = 0; s < pstr_drc_coefficients_uni_drc_v1->gain_set_count; s++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_coding_profile = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_interpolation_type = 1; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].full_frame = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].time_alignment = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].time_delta_min_present = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count = + impd_drc_get_integer_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count = + MIN(pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count, MAX_BAND_COUNT); + if (pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count == 1) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].nb_points = + impd_drc_get_integer_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].nb_points = + MIN(pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].nb_points, + MAX_GAIN_POINTS); + for (p = 0; + p < pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].nb_points; + p++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].gain_points[p].x = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].gain_points[p].y = + impd_drc_get_float_value(fp); + } + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].width = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].attack = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].decay = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[0].drc_characteristic = + 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[0] + .crossover_freq_index = 0; + } + else { + for (m = 0; m < pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].band_count; m++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].nb_points = + impd_drc_get_integer_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].nb_points = + MIN(pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].nb_points, + MAX_GAIN_POINTS); + for (p = 0; + p < pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].nb_points; + p++) { + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .gain_points[p] + .x = impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .gain_points[p] + .y = impd_drc_get_float_value(fp); + } + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].width = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].attack = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].gain_params[m].decay = + impd_drc_get_float_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s].drc_band_type = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .start_sub_band_index = impd_drc_get_integer_value(fp); + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .drc_characteristic = 0; + pstr_drc_coefficients_uni_drc_v1->str_gain_set_params[s] + .gain_params[m] + .crossover_freq_index = 0; + } + } + } + } + + /*********** str_drc_instructions_uni_drc_v1 *************/ + pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count = impd_drc_get_integer_value(fp); + pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count = + MIN(pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count, MAX_DRC_INSTRUCTIONS_COUNT); + for (n = 0; n < pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count; n++) { + ia_drc_instructions_uni_drc *pstr_drc_instructions_uni_drc = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_drc_instructions_uni_drc_v1[n]; + pstr_drc_instructions_uni_drc->drc_set_id = n + 1; + pstr_drc_instructions_uni_drc->downmix_id = impd_drc_get_integer_value(fp); + pstr_drc_instructions_uni_drc->additional_downmix_id_present = 0; + pstr_drc_instructions_uni_drc->additional_downmix_id_count = 0; + pstr_drc_instructions_uni_drc->drc_location = 1; + pstr_drc_instructions_uni_drc->depends_on_drc_set_present = 0; + pstr_drc_instructions_uni_drc->depends_on_drc_set = 0; + pstr_drc_instructions_uni_drc->no_independent_use = 0; + pstr_drc_instructions_uni_drc->drc_set_effect = impd_drc_get_integer_value(fp); + pstr_drc_instructions_uni_drc->drc_set_target_loudness_present = 0; + pstr_drc_instructions_uni_drc->drc_set_target_loudness_value_upper = 0; + pstr_drc_instructions_uni_drc->drc_set_target_loudness_value_lower_present = 0; + pstr_drc_instructions_uni_drc->drc_set_target_loudness_value_lower = 0; + + gain_set_channels = impd_drc_get_integer_value(fp); + gain_set_channels = MIN(gain_set_channels, MAX_CHANNEL_COUNT); + for (ch = 0; ch < gain_set_channels; ch++) { + pstr_drc_instructions_uni_drc->gain_set_index[ch] = impd_drc_get_integer_value(fp); + } + for (; ch < MAX_CHANNEL_COUNT; ch++) { + if (gain_set_channels > 0) { + pstr_drc_instructions_uni_drc->gain_set_index[ch] = + pstr_drc_instructions_uni_drc->gain_set_index[gain_set_channels - 1]; + } + else { + pstr_drc_instructions_uni_drc->gain_set_index[ch] = 0; + } + } + + pstr_drc_instructions_uni_drc->num_drc_channel_groups = impd_drc_get_integer_value(fp); + pstr_drc_instructions_uni_drc->num_drc_channel_groups = + MIN(pstr_drc_instructions_uni_drc->num_drc_channel_groups, MAX_CHANNEL_GROUP_COUNT); + for (g = 0; g < pstr_drc_instructions_uni_drc->num_drc_channel_groups; g++) { + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].gain_scaling_present[0] = 0; + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].attenuation_scaling[0] = 1.5f; + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].amplification_scaling[0] = 1.5f; + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].gain_offset_present[0] = 0; + pstr_drc_instructions_uni_drc->str_gain_modifiers[g].gain_offset[0] = 8.0f; + } + + pstr_drc_instructions_uni_drc->limiter_peak_target_present = 0; + pstr_drc_instructions_uni_drc->limiter_peak_target = 0.0f; + pstr_drc_instructions_uni_drc->drc_instructions_type = 0; + pstr_drc_instructions_uni_drc->mae_group_id = 0; + pstr_drc_instructions_uni_drc->mae_group_preset_id = 0; + } + } + } pstr_enc_loudness_info_set->loudness_info_set_ext_present = 0; pstr_enc_gain_extension->uni_drc_gain_ext_present = 0; } diff --git a/test/encoder/impd_drc_user_config.h b/test/encoder/impd_drc_user_config.h index 5329460..9a31ada 100644 --- a/test/encoder/impd_drc_user_config.h +++ b/test/encoder/impd_drc_user_config.h @@ -22,4 +22,5 @@ VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_enc_params, ia_drc_uni_drc_config_struct *pstr_uni_drc_config, ia_drc_loudness_info_set_struct *pstr_enc_loudness_info_set, - ia_drc_uni_drc_gain_ext_struct *pstr_enc_gain_extension); + ia_drc_uni_drc_gain_ext_struct *pstr_enc_gain_extension, + WORD32 in_ch); diff --git a/test/encoder/ixheaace_testbench.c b/test/encoder/ixheaace_testbench.c index 2dee450..706373e 100644 --- a/test/encoder/ixheaace_testbench.c +++ b/test/encoder/ixheaace_testbench.c @@ -1260,7 +1260,8 @@ IA_ERRORCODE ia_enhaacplus_enc_main_process(ixheaace_app_context *pstr_context, memset(pstr_drc_cfg, 0, sizeof(ia_drc_input_config)); ixheaace_read_drc_config_params( pf_drc_inp, &pstr_drc_cfg->str_enc_params, &pstr_drc_cfg->str_uni_drc_config, - &pstr_drc_cfg->str_enc_loudness_info_set, &pstr_drc_cfg->str_enc_gain_extension); + &pstr_drc_cfg->str_enc_loudness_info_set, &pstr_drc_cfg->str_enc_gain_extension, + pstr_in_cfg->i_channels); pstr_drc_cfg->str_enc_params.gain_sequence_present = FALSE; for (k = 0; k < pstr_drc_cfg->str_uni_drc_config.drc_coefficients_uni_drc_count; k++) { |