aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkshay Ragir <akshay.ragir@ittiam.com>2024-05-06 19:21:31 +0530
committerAkshay Ragir <akshay.ragir@ittiam.com>2024-05-07 13:20:31 +0530
commitb9598d0c6c94b3b6096c1c9d63305bbfec58667b (patch)
treea647b31f41bad5e424f4b93f0408bcf7aba10b86
parent12e2e71b241cd7523ed69adb4ff7307f488fea8d (diff)
downloadlibxaac-b9598d0c6c94b3b6096c1c9d63305bbfec58667b.tar.gz
UniDrcv1 configuration support when DRC is enabled
Tests done: Smoke test
-rw-r--r--encoder/drc_src/impd_drc_api.c205
-rw-r--r--encoder/drc_src/impd_drc_enc.c12
-rw-r--r--encoder/drc_src/impd_drc_mux.c7
-rw-r--r--encoder/drc_src/impd_drc_uni_drc.h2
-rw-r--r--encoder/ixheaace_api.c17
-rw-r--r--fuzzer/xaac_enc_fuzzer.cpp279
-rw-r--r--test/encoder/impd_drc_config_params.txt104
-rw-r--r--test/encoder/impd_drc_user_config.c183
-rw-r--r--test/encoder/impd_drc_user_config.h3
-rw-r--r--test/encoder/ixheaace_testbench.c3
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++) {