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