aboutsummaryrefslogtreecommitdiff
path: root/decoder/drc_src
diff options
context:
space:
mode:
authorHarish Mahendrakar <harish.mahendrakar@ittiam.com>2022-12-02 20:44:13 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-12-02 20:44:13 +0000
commit107cb12c2b2e1b719eb4df15708584b4f6392668 (patch)
treeba49d720e42d9ee1fbb97899fd62d4df54c9d6a0 /decoder/drc_src
parent61803678225bdfa64badf8410aa198562f006f6b (diff)
parent2ae5f6ff8a0a12ead1cb7bab53c110039d7c8884 (diff)
downloadlibxaac-107cb12c2b2e1b719eb4df15708584b4f6392668.tar.gz
Update to v0.1.4 from upstream project am: 2ae5f6ff8amain-16k-with-phones
Original change: https://android-review.googlesource.com/c/platform/external/libxaac/+/2323113 Change-Id: Ie7744998f7d2ec5cc322d493be9bd41dafda0118 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'decoder/drc_src')
-rw-r--r--decoder/drc_src/impd_drc_api.c24
-rw-r--r--decoder/drc_src/impd_drc_api_struct_def.h8
-rw-r--r--decoder/drc_src/impd_drc_bitbuffer.c4
-rw-r--r--decoder/drc_src/impd_drc_common.h2
-rw-r--r--decoder/drc_src/impd_drc_config_params.h2
-rw-r--r--decoder/drc_src/impd_drc_dynamic_payload.c3
-rw-r--r--decoder/drc_src/impd_drc_gain_dec.c94
-rw-r--r--decoder/drc_src/impd_drc_init.c7
-rw-r--r--decoder/drc_src/impd_drc_loudness_control.c9
-rw-r--r--decoder/drc_src/impd_drc_main_td_process.c72
-rw-r--r--decoder/drc_src/impd_drc_process.c72
-rw-r--r--decoder/drc_src/impd_drc_selection_process.c2
-rw-r--r--decoder/drc_src/impd_drc_selection_process_drcset_selection.c9
-rw-r--r--decoder/drc_src/impd_drc_shape_filter.c16
-rw-r--r--decoder/drc_src/impd_drc_static_payload.c20
-rw-r--r--decoder/drc_src/impd_drc_struct.h2
16 files changed, 209 insertions, 137 deletions
diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c
index 7121a71..d31c93f 100644
--- a/decoder/drc_src/impd_drc_api.c
+++ b/decoder/drc_src/impd_drc_api.c
@@ -222,32 +222,26 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
break;
}
case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: {
- memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config +
- p_obj_drc->str_bit_handler.num_bytes_bs_drc_config,
+ memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config,
p_obj_drc->pp_mem[2],
p_obj_drc->str_bit_handler.num_byts_cur_ic);
p_obj_drc->str_bit_handler.num_bytes_bs_drc_config =
- p_obj_drc->str_bit_handler.num_bytes_bs_drc_config +
p_obj_drc->str_bit_handler.num_byts_cur_ic;
break;
}
case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: {
- memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info +
- p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info,
+ memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info,
p_obj_drc->pp_mem[2],
p_obj_drc->str_bit_handler.num_byts_cur_il);
p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info =
- p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info +
p_obj_drc->str_bit_handler.num_byts_cur_il;
break;
}
case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: {
- memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface +
- p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface,
+ memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface,
p_obj_drc->pp_mem[2],
p_obj_drc->str_bit_handler.num_byts_cur_in);
p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface =
- p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface +
p_obj_drc->str_bit_handler.num_byts_cur_in;
break;
}
@@ -271,7 +265,7 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
break;
}
case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: {
- *pi_value = p_obj_drc->str_payload.pstr_loudness_info->loudness_info
+ *pi_value = (WORD32)p_obj_drc->str_payload.pstr_loudness_info->loudness_info
->loudness_measure->method_val;
if (*pi_value < -1)
*pi_value = *pi_value * -4;
@@ -291,6 +285,14 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
p_obj_drc->str_config.sampling_rate = *pus_value;
break;
}
+ case IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE: {
+ p_obj_drc->str_config.apply_crossfade = *pus_value;
+ break;
+ }
+ case IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED: {
+ p_obj_drc->str_config.is_config_changed = *pus_value;
+ break;
+ }
case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: {
p_obj_drc->str_config.num_ch_in = *pus_value;
if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) {
@@ -351,10 +353,12 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx,
}
case IA_DRC_DEC_CONFIG_DRC_BOOST: {
p_obj_drc->str_config.boost = (*pf_value);
+ p_obj_drc->str_config.boost_set = 1;
break;
}
case IA_DRC_DEC_CONFIG_DRC_COMPRESS: {
p_obj_drc->str_config.compress = (*pf_value);
+ p_obj_drc->str_config.compress_set = 1;
break;
}
default: { return -1; }
diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h
index 265a82f..a753465 100644
--- a/decoder/drc_src/impd_drc_api_struct_def.h
+++ b/decoder/drc_src/impd_drc_api_struct_def.h
@@ -58,7 +58,11 @@ typedef struct ia_drc_config_struct {
WORD32 album_mode;
FLOAT32 boost;
FLOAT32 compress;
-
+ UWORD8 boost_set;
+ UWORD8 compress_set;
+ WORD32 apply_crossfade;
+ WORD32 is_config_changed;
+ WORD32 ln_dbgain_prev;
} ia_drc_config_struct;
/* DRC bitsteam handler */
@@ -128,7 +132,7 @@ typedef struct IA_PSM_API_Struct {
ia_mem_info_struct *p_mem_info;
pVOID *pp_mem;
struct ia_bit_buf_struct str_bit_buf, *pstr_bit_buf;
-
+ WORD32 frame_count;
} ia_drc_api_struct;
#endif
diff --git a/decoder/drc_src/impd_drc_bitbuffer.c b/decoder/drc_src/impd_drc_bitbuffer.c
index de9d020..91188c8 100644
--- a/decoder/drc_src/impd_drc_bitbuffer.c
+++ b/decoder/drc_src/impd_drc_bitbuffer.c
@@ -185,11 +185,9 @@ WORD32 impd_process_drc_bitstream_dec_gain(
WORD32* num_bits_read) {
WORD32 err_code = 0;
- WORD32 dummy;
-
impd_create_init_bit_buf(it_bit_buff, bitstream_gain, num_bytes);
- dummy = impd_read_bits_buf(it_bit_buff, num_bits_offset);
+ impd_read_bits_buf(it_bit_buff, num_bits_offset);
if (it_bit_buff->error) return it_bit_buff->error;
err_code = impd_drc_uni_gain_read(it_bit_buff, p_drc_bs_dec_struct,
diff --git a/decoder/drc_src/impd_drc_common.h b/decoder/drc_src/impd_drc_common.h
index 3dbbd2c..324e830 100644
--- a/decoder/drc_src/impd_drc_common.h
+++ b/decoder/drc_src/impd_drc_common.h
@@ -170,7 +170,7 @@ extern "C" {
#define MAX_NUM_DRC_EFFECT_TYPE_REQUESTS 15
#define MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE 256
-#define EXT_COUNT_MAX 2
+#define EXT_COUNT_MAX 8
#define UNIDRCGAINEXT_TERM 0x0
#define UNIDRCLOUDEXT_TERM 0x0
#define UNIDRCCONFEXT_TERM 0x0
diff --git a/decoder/drc_src/impd_drc_config_params.h b/decoder/drc_src/impd_drc_config_params.h
index 13a79ec..b0d19c5 100644
--- a/decoder/drc_src/impd_drc_config_params.h
+++ b/decoder/drc_src/impd_drc_config_params.h
@@ -44,4 +44,6 @@
#define IA_DRC_DEC_CONFIG_DRC_ALBUM_MODE 0x0014
#define IA_DRC_DEC_CONFIG_DRC_BOOST 0x0015
#define IA_DRC_DEC_CONFIG_DRC_COMPRESS 0x0016
+#define IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE 0x0017
+#define IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED 0x0018
#endif
diff --git a/decoder/drc_src/impd_drc_dynamic_payload.c b/decoder/drc_src/impd_drc_dynamic_payload.c
index f8a1aa9..3c0cbb8 100644
--- a/decoder/drc_src/impd_drc_dynamic_payload.c
+++ b/decoder/drc_src/impd_drc_dynamic_payload.c
@@ -353,7 +353,7 @@ WORD32 impd_parse_uni_drc_gain_ext(
ia_bit_buf_struct* it_bit_buff,
ia_uni_drc_gain_ext_struct* uni_drc_gain_ext) {
WORD32 k;
- WORD32 bit_size_len, ext_size_bits, bit_size, other_bit;
+ WORD32 bit_size_len, ext_size_bits, bit_size;
k = 0;
uni_drc_gain_ext->uni_drc_gain_ext_type[k] =
@@ -369,7 +369,6 @@ WORD32 impd_parse_uni_drc_gain_ext(
if (it_bit_buff->error) return it_bit_buff->error;
uni_drc_gain_ext->ext_bit_size[k] = bit_size + 1;
- other_bit =
impd_skip_bits_buf(it_bit_buff, uni_drc_gain_ext->ext_bit_size[k]);
if (it_bit_buff->error) return it_bit_buff->error;
k++;
diff --git a/decoder/drc_src/impd_drc_gain_dec.c b/decoder/drc_src/impd_drc_gain_dec.c
index dc7430f..6b3f40b 100644
--- a/decoder/drc_src/impd_drc_gain_dec.c
+++ b/decoder/drc_src/impd_drc_gain_dec.c
@@ -244,22 +244,22 @@ impd_map_gain(
ia_split_drc_characteristic_struct* split_drc_characteristic_source,
ia_split_drc_characteristic_struct* split_drc_characteristic_target,
FLOAT32 gain_in_db, FLOAT32* gain_out_db) {
- FLOAT32 inLevel;
+ FLOAT32 in_level=0;
WORD32 err = 0;
switch (split_drc_characteristic_source->characteristic_format) {
case CHARACTERISTIC_SIGMOID:
err = impd_compressor_io_sigmoid_inv(split_drc_characteristic_source,
- gain_in_db, &inLevel);
+ gain_in_db, &in_level);
if (err) return (err);
break;
case CHARACTERISTIC_NODES:
impd_compressor_io_nodes_inverse(split_drc_characteristic_source,
- gain_in_db, &inLevel);
+ gain_in_db, &in_level);
break;
case CHARACTERISTIC_PASS_THRU:
- inLevel = gain_in_db;
+ in_level = gain_in_db;
break;
default:
return (UNEXPECTED_ERROR);
@@ -267,23 +267,23 @@ impd_map_gain(
}
switch (split_drc_characteristic_target->characteristic_format) {
case CHARACTERISTIC_SIGMOID:
- err = impd_compressor_io_sigmoid(split_drc_characteristic_target, inLevel,
+ err = impd_compressor_io_sigmoid(split_drc_characteristic_target, in_level,
gain_out_db);
if (err) return (err);
break;
case CHARACTERISTIC_NODES:
- if (inLevel < DRC_INPUT_LOUDNESS_TARGET) {
+ if (in_level < DRC_INPUT_LOUDNESS_TARGET) {
err = impd_compressor_io_nodes_lt(split_drc_characteristic_target,
- inLevel, gain_out_db);
+ in_level, gain_out_db);
if (err) return (err);
} else {
err = impd_compressor_io_nodes_rt(split_drc_characteristic_target,
- inLevel, gain_out_db);
+ in_level, gain_out_db);
if (err) return (err);
}
break;
case CHARACTERISTIC_PASS_THRU:
- *gain_out_db = inLevel;
+ *gain_out_db = in_level;
break;
default:
break;
@@ -551,32 +551,44 @@ WORD32
impd_concatenate_segments(WORD32 drc_frame_size, WORD32 drc_band,
ia_interp_params_struct* interp_params_str,
ia_spline_nodes_struct* str_spline_nodes,
- ia_interp_buf_struct* buf_interpolation) {
- WORD32 timePrev, duration, n, err = 0;
- FLOAT32 loc_db_gain = 0.0f, prev_db_gain, slope = 0.0f, slopePrev;
+ ia_interp_buf_struct* buf_interpolation,
+ WORD32 sel_drc_index, WORD32 is_config_changed,
+ WORD32 loudness_changed) {
+ WORD32 time_prev, duration, n, err = 0;
+ FLOAT32 loc_db_gain = 0.0f, prev_db_gain, slope = 0.0f, slope_prev;
- timePrev = buf_interpolation->prev_node.time;
+ time_prev = buf_interpolation->prev_node.time;
prev_db_gain = buf_interpolation->prev_node.loc_db_gain;
- slopePrev = buf_interpolation->prev_node.slope;
+ slope_prev = buf_interpolation->prev_node.slope;
for (n = 0; n < str_spline_nodes->num_nodes; n++) {
- duration = str_spline_nodes->str_node[n].time - timePrev;
+ duration = str_spline_nodes->str_node[n].time - time_prev;
loc_db_gain = str_spline_nodes->str_node[n].loc_db_gain;
+ if (loudness_changed) {
+ if (sel_drc_index == 0 && is_config_changed == 1) {
+ loc_db_gain = str_spline_nodes->str_node[n].loc_db_gain +
+ interp_params_str->loudness_normalization_gain_db;
+ if (prev_db_gain == 0) {
+ prev_db_gain = buf_interpolation->prev_node.loc_db_gain +
+ interp_params_str->loudness_normalization_gain_db;
+ }
+ }
+ }
slope = str_spline_nodes->str_node[n].slope;
err = impd_interpolate_drc_gain(
interp_params_str, drc_band, duration, prev_db_gain, loc_db_gain,
- slopePrev, slope, buf_interpolation->lpcm_gains + MAX_SIGNAL_DELAY +
- drc_frame_size + timePrev);
+ slope_prev, slope, buf_interpolation->lpcm_gains + MAX_SIGNAL_DELAY +
+ drc_frame_size + time_prev);
if (err) return (err);
- timePrev = str_spline_nodes->str_node[n].time;
+ time_prev = str_spline_nodes->str_node[n].time;
prev_db_gain = loc_db_gain;
- slopePrev = slope;
+ slope_prev = slope;
}
buf_interpolation->str_node.loc_db_gain = loc_db_gain;
buf_interpolation->str_node.slope = slope;
- buf_interpolation->str_node.time = timePrev;
+ buf_interpolation->str_node.time = time_prev;
return (0);
}
@@ -593,8 +605,8 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
WORD32 drc_instructions_index =
ia_drc_params_struct->sel_drc_array[sel_drc_index].drc_instructions_index;
if (drc_instructions_index >= 0) {
- WORD32 b, g, gainElementIndex, err = 0;
- WORD32 parametricDrcInstanceIndex = 0;
+ WORD32 b, g, gain_element_index, err = 0;
+ WORD32 parametric_drc_instance_index = 0;
ia_interp_params_struct interp_params_str = {0};
ia_drc_instructions_struct* str_drc_instruction_str =
@@ -644,7 +656,7 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
impd_advance_buf(ia_drc_params_struct->drc_frame_size,
&(drc_gain_buffers->pstr_gain_buf[sel_drc_index]));
- gainElementIndex = 0;
+ gain_element_index = 0;
for (g = 0; g < num_drc_ch_groups; g++) {
WORD32 gainSet = 0;
WORD32 num_drc_bands = 0;
@@ -688,42 +700,46 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
ia_drc_params_struct->drc_frame_size, b, &interp_params_str,
&(pstr_drc_gain->drc_gain_sequence[seq].str_spline_nodes[0]),
&(drc_gain_buffers->pstr_gain_buf[sel_drc_index]
- .buf_interpolation[gainElementIndex]));
+ .buf_interpolation[gain_element_index]),
+ sel_drc_index, pstr_drc_config->is_config_changed,
+ pstr_drc_config->ln_gain_changed);
if (err) return (err);
- gainElementIndex++;
+ gain_element_index++;
}
} else {
if (ia_drc_params_struct->sub_band_domain_mode ==
SUBBAND_DOMAIN_MODE_OFF &&
!(p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]
+ [parametric_drc_instance_index]
.parametric_drc_type == PARAM_DRC_TYPE_LIM)) {
err = impd_parametric_drc_instance_process(
p_drc_gain_dec_structs->audio_in_out_buf.audio_in_out_buf, NULL,
NULL, &p_drc_gain_dec_structs->parametricdrc_params,
&p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]);
+ [parametric_drc_instance_index]);
if (err) return (err);
err = impd_concatenate_segments(
ia_drc_params_struct->drc_frame_size, 0, &interp_params_str,
&p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]
+ [parametric_drc_instance_index]
.str_spline_nodes,
&(drc_gain_buffers->pstr_gain_buf[sel_drc_index]
- .buf_interpolation[gainElementIndex]));
+ .buf_interpolation[gain_element_index]),
+ sel_drc_index, pstr_drc_config->is_config_changed,
+ pstr_drc_config->ln_gain_changed);
if (err) return (err);
} else if (ia_drc_params_struct->sub_band_domain_mode ==
SUBBAND_DOMAIN_MODE_OFF &&
p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]
+ [parametric_drc_instance_index]
.parametric_drc_type == PARAM_DRC_TYPE_LIM) {
FLOAT32* lpcm_gains = (drc_gain_buffers->pstr_gain_buf[sel_drc_index]
- .buf_interpolation[gainElementIndex])
+ .buf_interpolation[gain_element_index])
.lpcm_gains +
MAX_SIGNAL_DELAY;
impd_parametric_lim_type_drc_process(
@@ -731,7 +747,7 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
loudness_normalization_gain_db,
&p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]
+ [parametric_drc_instance_index]
.str_parametric_drc_type_lim_params,
lpcm_gains);
@@ -739,7 +755,7 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
SUBBAND_DOMAIN_MODE_OFF &&
!(p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]
+ [parametric_drc_instance_index]
.parametric_drc_type == PARAM_DRC_TYPE_LIM)) {
err = impd_parametric_drc_instance_process(
NULL, p_drc_gain_dec_structs->audio_in_out_buf.audio_real_buff,
@@ -747,24 +763,26 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs,
&p_drc_gain_dec_structs->parametricdrc_params,
&p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]);
+ [parametric_drc_instance_index]);
if (err) return (err);
err = impd_concatenate_segments(
ia_drc_params_struct->drc_frame_size, 0, &interp_params_str,
&p_drc_gain_dec_structs->parametricdrc_params
.str_parametric_drc_instance_params
- [parametricDrcInstanceIndex]
+ [parametric_drc_instance_index]
.str_spline_nodes,
&(drc_gain_buffers->pstr_gain_buf[sel_drc_index]
- .buf_interpolation[gainElementIndex]));
+ .buf_interpolation[gain_element_index]),
+ sel_drc_index, pstr_drc_config->is_config_changed,
+ pstr_drc_config->ln_gain_changed);
if (err) return (err);
} else {
return (UNEXPECTED_ERROR);
}
- gainElementIndex++;
- parametricDrcInstanceIndex++;
+ gain_element_index++;
+ parametric_drc_instance_index++;
}
}
}
diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c
index fa8578e..cf232e8 100644
--- a/decoder/drc_src/impd_drc_init.c
+++ b/decoder/drc_src/impd_drc_init.c
@@ -113,6 +113,8 @@ IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) {
p_obj_drc->str_config.target_loudness = -24;
p_obj_drc->str_config.loud_norm_flag = 0;
p_obj_drc->str_config.album_mode = 0;
+ p_obj_drc->str_config.boost = 1.0f;
+ p_obj_drc->str_config.compress = 1.0f;
memset(&p_obj_drc->str_bit_handler, 0, sizeof(p_obj_drc->str_bit_handler));
return IA_NO_ERROR;
@@ -410,6 +412,11 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) {
if (err_code != IA_NO_ERROR) return err_code;
}
+ if (!p_obj_drc->str_config.boost_set) p_obj_drc->str_config.boost = 1.0f;
+
+ if (!p_obj_drc->str_config.compress_set)
+ p_obj_drc->str_config.compress = 1.0f;
+
err_code = impd_drc_dec_interface_add_effect_type(
p_obj_drc->str_payload.pstr_drc_interface,
p_obj_drc->str_config.effect_type, p_obj_drc->str_config.target_loudness,
diff --git a/decoder/drc_src/impd_drc_loudness_control.c b/decoder/drc_src/impd_drc_loudness_control.c
index c377a24..e478fc4 100644
--- a/decoder/drc_src/impd_drc_loudness_control.c
+++ b/decoder/drc_src/impd_drc_loudness_control.c
@@ -734,7 +734,6 @@ WORD32 impd_init_loudness_control(
if (overall_loudness_info_present == 1) {
WORD32 requested_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS;
WORD32 other_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS;
- WORD32 requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4;
WORD32 requested_preprocessing = 0;
const WORD32* system_bonus = measurement_system_default_tbl;
@@ -761,35 +760,27 @@ WORD32 impd_init_loudness_control(
switch (pstr_drc_sel_proc_params_struct->loudness_measurement_system) {
case USER_MEASUREMENT_SYSTEM_DEFAULT:
case USER_MEASUREMENT_SYSTEM_BS_1770_4:
- requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4;
system_bonus = measurement_system_bs1770_3_tbl;
break;
case USER_MEASUREMENT_SYSTEM_USER:
- requested_measurement_system = MEASUREMENT_SYSTEM_USER;
system_bonus = measurement_system_user_tbl;
break;
case USER_MEASUREMENT_SYSTEM_EXPERT_PANEL:
- requested_measurement_system = MEASUREMENT_SYSTEM_EXPERT_PANEL;
system_bonus = measurement_system_expert_tbl;
break;
case USER_MEASUREMENT_SYSTEM_RESERVED_A:
- requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_A;
system_bonus = measurement_system_rms_a_tbl;
break;
case USER_MEASUREMENT_SYSTEM_RESERVED_B:
- requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_B;
system_bonus = measurement_system_rms_b_tbl;
break;
case USER_MEASUREMENT_SYSTEM_RESERVED_C:
- requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_C;
system_bonus = measurement_system_rms_c_tbl;
break;
case USER_MEASUREMENT_SYSTEM_RESERVED_D:
- requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_D;
system_bonus = measurement_system_rms_d_tbl;
break;
case USER_MEASUREMENT_SYSTEM_RESERVED_E:
- requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_E;
system_bonus = measurement_system_rms_e_tbl;
break;
diff --git a/decoder/drc_src/impd_drc_main_td_process.c b/decoder/drc_src/impd_drc_main_td_process.c
index 4354365..407983c 100644
--- a/decoder/drc_src/impd_drc_main_td_process.c
+++ b/decoder/drc_src/impd_drc_main_td_process.c
@@ -40,6 +40,8 @@
#include "impd_drc_api_struct_def.h"
#include "impd_drc_hashdefines.h"
#include "impd_drc_peak_limiter.h"
+IA_ERRORCODE impd_drc_set_default_bitstream_config(
+ ia_drc_config *pstr_drc_config);
static IA_ERRORCODE impd_down_mix(
ia_drc_sel_proc_output_struct *uni_drc_sel_proc_output,
@@ -84,12 +86,61 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) {
return IA_NO_ERROR;
}
+ p_obj_drc->str_payload.pstr_loudness_info->loudness_info_album_count = 0;
+ p_obj_drc->str_payload.pstr_loudness_info->loudness_info_count = 0;
+ p_obj_drc->str_payload.pstr_loudness_info->loudness_info_set_ext_present = 0;
+ p_obj_drc->str_payload.pstr_drc_config->is_config_changed =
+ p_obj_drc->str_config.is_config_changed;
+
+ if (p_obj_drc->str_config.is_config_changed == 1) {
+ err_code = impd_process_drc_bitstream_dec_loudness_info_set(
+ p_obj_drc->pstr_bit_buf, p_obj_drc->str_payload.pstr_loudness_info,
+ &p_obj_drc->str_bit_handler.bitstream_loudness_info[0],
+ p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info);
+ if (err_code != IA_NO_ERROR) return err_code;
+
+ err_code = impd_drc_uni_sel_proc_process(
+ p_obj_drc->str_payload.pstr_selection_proc,
+ p_obj_drc->str_payload.pstr_drc_config,
+ p_obj_drc->str_payload.pstr_loudness_info,
+ p_obj_drc->str_payload.pstr_drc_sel_proc_output);
+ if (err_code != IA_NO_ERROR) return err_code;
+
+ err_code = impd_process_drc_bitstream_dec_config(
+ p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf,
+ p_obj_drc->str_payload.pstr_drc_config,
+ &p_obj_drc->str_bit_handler.bitstream_drc_config[0],
+ p_obj_drc->str_bit_handler.num_bytes_bs_drc_config);
+ if (err_code == 1) {
+ memset(p_obj_drc->str_payload.pstr_drc_config, 0, sizeof(ia_drc_config));
+ err_code = impd_drc_set_default_bitstream_config(
+ p_obj_drc->str_payload.pstr_drc_config);
+ p_obj_drc->str_payload.pstr_drc_config->channel_layout
+ .base_channel_count = p_obj_drc->str_config.num_ch_in;
+ }
+
+ if (err_code != IA_NO_ERROR) return err_code;
+ }
+
+ if (p_obj_drc->frame_count == 0) {
+ p_obj_drc->str_config.ln_dbgain_prev =
+ (WORD32)p_obj_drc->str_payload.pstr_drc_sel_proc_output
+ ->loudness_normalization_gain_db;
+ }
+
+ if (!p_obj_drc->str_payload.pstr_drc_config->ln_gain_changed) {
+ if (p_obj_drc->str_payload.pstr_drc_sel_proc_output
+ ->loudness_normalization_gain_db !=
+ p_obj_drc->str_config.ln_dbgain_prev) {
+ p_obj_drc->str_payload.pstr_drc_config->ln_gain_changed = 1;
+ }
+ }
+
err_code = impd_process_drc_bitstream_dec_gain(
p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf,
p_obj_drc->str_payload.pstr_drc_config,
p_obj_drc->str_payload.pstr_drc_gain,
- &p_obj_drc->str_bit_handler
- .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs],
+ p_obj_drc->str_bit_handler.it_bit_buf,
p_obj_drc->str_bit_handler.num_bytes_bs,
p_obj_drc->str_bit_handler.num_bits_offset_bs,
&p_obj_drc->str_bit_handler.num_bits_read_bs);
@@ -202,15 +253,19 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) {
if (err_code != IA_NO_ERROR) return err_code;
- if (p_obj_drc->str_payload.pstr_drc_sel_proc_output
+ if (p_obj_drc->str_payload.pstr_drc_config->apply_drc == 0 ||
+ p_obj_drc->str_payload.pstr_drc_config->is_config_changed == 0 ||
+ p_obj_drc->str_payload.pstr_drc_config->ln_gain_changed == 0) {
+ if (p_obj_drc->str_payload.pstr_drc_sel_proc_output
->loudness_normalization_gain_db != 0.0f) {
- FLOAT32 gain_value =
- (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output
+ FLOAT32 gain_value =
+ (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output
->loudness_normalization_gain_db /
20.0);
- for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) {
- for (j = 0; j < p_obj_drc->str_config.frame_size; j++) {
- audio_buff[i][j] *= gain_value;
+ for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) {
+ for (j = 0; j < p_obj_drc->str_config.frame_size; j++) {
+ audio_buff[i][j] *= gain_value;
+ }
}
}
}
@@ -320,5 +375,6 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) {
p_obj_drc->str_config.num_ch_out *
(p_obj_drc->str_config.pcm_size >> 3);
}
+ p_obj_drc->frame_count++;
return err_code;
}
diff --git a/decoder/drc_src/impd_drc_process.c b/decoder/drc_src/impd_drc_process.c
index e4b5147..2dd97d1 100644
--- a/decoder/drc_src/impd_drc_process.c
+++ b/decoder/drc_src/impd_drc_process.c
@@ -40,13 +40,13 @@ VOID impd_apply_gains_and_add(
FLOAT32* channel_audio[], WORD32 impd_apply_gains) {
WORD32 c, b, g, i;
- WORD32 offset = 0, signalIndex = 0;
- WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX];
- WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT];
+ WORD32 offset = 0, signal_index = 0;
+ WORD32 gain_index_for_group[CHANNEL_GROUP_COUNT_MAX];
+ WORD32 signal_index_for_channel[MAX_CHANNEL_COUNT];
FLOAT32* lpcm_gains;
FLOAT32 sum;
- FLOAT32 drc_gain_last, gainThr;
- WORD32 iEnd, iStart;
+ FLOAT32 drc_gain_last = 0, gain_thr;
+ WORD32 i_end, i_start;
ia_drc_instructions_struct* str_drc_instruction_str =
&(pstr_drc_instruction_arr[drc_instructions_index]);
@@ -58,21 +58,21 @@ VOID impd_apply_gains_and_add(
if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) {
offset = ia_drc_params_struct->drc_frame_size;
}
- gainIndexForGroup[0] = 0;
+ gain_index_for_group[0] = 0;
for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) {
- gainIndexForGroup[g + 1] =
- gainIndexForGroup[g] +
+ gain_index_for_group[g + 1] =
+ gain_index_for_group[g] +
str_drc_instruction_str->band_count_of_ch_group[g];
}
- signalIndexForChannel[0] = 0;
+ signal_index_for_channel[0] = 0;
for (c = 0; c < str_drc_instruction_str->audio_num_chan - 1; c++) {
if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) {
- signalIndexForChannel[c + 1] =
- signalIndexForChannel[c] +
+ signal_index_for_channel[c + 1] =
+ signal_index_for_channel[c] +
str_drc_instruction_str->band_count_of_ch_group
[str_drc_instruction_str->channel_group_of_ch[c]];
} else {
- signalIndexForChannel[c + 1] = signalIndexForChannel[c] + 1;
+ signal_index_for_channel[c + 1] = signal_index_for_channel[c] + 1;
}
}
@@ -81,59 +81,59 @@ VOID impd_apply_gains_and_add(
b++) {
if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) {
lpcm_gains =
- pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b]
+ pstr_gain_buf->buf_interpolation[gain_index_for_group[g] + b]
.lpcm_gains +
MAX_SIGNAL_DELAY - ia_drc_params_struct->gain_delay_samples -
ia_drc_params_struct->audio_delay_samples + offset;
} else {
lpcm_gains =
- pstr_gain_buf->buf_interpolation[gainIndexForGroup[g] + b]
+ pstr_gain_buf->buf_interpolation[gain_index_for_group[g] + b]
.lpcm_gains +
MAX_SIGNAL_DELAY +
str_drc_instruction_str
->parametric_drc_look_ahead_samples[g] -
ia_drc_params_struct->audio_delay_samples;
}
- iEnd = 0;
- iStart = 0;
- while (iEnd < ia_drc_params_struct->drc_frame_size) {
+ i_end = 0;
+ i_start = 0;
+ while (i_end < ia_drc_params_struct->drc_frame_size) {
if (shape_filter_block[g].shape_flter_block_flag) {
drc_gain_last = shape_filter_block[g].drc_gain_last;
- gainThr = 0.0001f * drc_gain_last;
- while ((iEnd < ia_drc_params_struct->drc_frame_size) &&
- (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr))
- iEnd++;
+ gain_thr = 0.0001f * drc_gain_last;
+ while ((i_end < ia_drc_params_struct->drc_frame_size) &&
+ (fabs(lpcm_gains[i_end] - drc_gain_last) <= gain_thr))
+ i_end++;
} else {
- iEnd = ia_drc_params_struct->drc_frame_size;
+ i_end = ia_drc_params_struct->drc_frame_size;
}
for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
{
if (g == str_drc_instruction_str->channel_group_of_ch[c]) {
- signalIndex = signalIndexForChannel[c] + b;
+ signal_index = signal_index_for_channel[c] + b;
if (impd_apply_gains == 1) {
impd_shape_filt_block_time_process(
- &shape_filter_block[g], &lpcm_gains[0], signalIndex,
- &deinterleaved_audio[signalIndex][0], iStart, iEnd);
+ &shape_filter_block[g], &lpcm_gains[0], signal_index,
+ &deinterleaved_audio[signal_index][0], i_start, i_end);
} else {
- for (i = iStart; i < iEnd; i++) {
- deinterleaved_audio[signalIndex][i] = lpcm_gains[i];
+ for (i = i_start; i < i_end; i++) {
+ deinterleaved_audio[signal_index][i] = lpcm_gains[i];
}
}
}
}
- if ((iEnd < ia_drc_params_struct->drc_frame_size) &&
+ if ((i_end < ia_drc_params_struct->drc_frame_size) &&
(shape_filter_block[g].shape_flter_block_flag)) {
- impd_shape_filt_block_adapt(lpcm_gains[iEnd],
+ impd_shape_filt_block_adapt(lpcm_gains[i_end],
&shape_filter_block[g]);
}
- if ((iEnd == iStart) &&
+ if ((i_end == i_start) &&
(drc_gain_last == shape_filter_block[g].drc_gain_last))
break;
- iStart = iEnd;
+ i_start = i_end;
}
}
}
@@ -141,7 +141,7 @@ VOID impd_apply_gains_and_add(
}
}
- signalIndex = 0;
+ signal_index = 0;
if (str_drc_instruction_str->drc_set_id > 0) {
for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++)
@@ -153,17 +153,17 @@ VOID impd_apply_gains_and_add(
sum = 0.0f;
for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g];
b++) {
- sum += deinterleaved_audio[signalIndex + b][i];
+ sum += deinterleaved_audio[signal_index + b][i];
}
channel_audio[c][i] = sum;
}
- signalIndex += str_drc_instruction_str->band_count_of_ch_group[g];
+ signal_index += str_drc_instruction_str->band_count_of_ch_group[g];
} else {
for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) {
- channel_audio[c][i] = deinterleaved_audio[signalIndex][i];
+ channel_audio[c][i] = deinterleaved_audio[signal_index][i];
}
- signalIndex++;
+ signal_index++;
}
}
} else {
diff --git a/decoder/drc_src/impd_drc_selection_process.c b/decoder/drc_src/impd_drc_selection_process.c
index 0917845..9b4fa8e 100644
--- a/decoder/drc_src/impd_drc_selection_process.c
+++ b/decoder/drc_src/impd_drc_selection_process.c
@@ -541,7 +541,6 @@ WORD32 impd_match_eq_set(ia_drc_config* drc_config, WORD32 downmix_id,
WORD32* matching_eq_set_idx) {
ia_eq_instructions_struct* str_eq_instructions = NULL;
WORD32 i, k, n;
- WORD32 match = 0;
*matching_eq_set_count = 0;
for (i = 0; i < drc_config->str_drc_config_ext.eq_instructions_count; i++) {
str_eq_instructions =
@@ -557,7 +556,6 @@ WORD32 impd_match_eq_set(ia_drc_config* drc_config, WORD32 downmix_id,
for (n = 0; n < str_eq_instructions->drc_set_id_count; n++) {
if ((str_eq_instructions->drc_set_id[n] == ID_FOR_ANY_DRC) ||
(drc_set_id == str_eq_instructions->drc_set_id[n])) {
- match = 1;
matching_eq_set_idx[*matching_eq_set_count] = i;
(*matching_eq_set_count)++;
}
diff --git a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c
index b80d71f..676878b 100644
--- a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c
+++ b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c
@@ -203,8 +203,6 @@ WORD32 impd_get_selected_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc,
WORD32 drc_set_id_selected) {
WORD32 n;
- ia_drc_instructions_struct* str_drc_instruction_str = NULL;
-
for (n = 0; n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus;
n++) {
if (pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]
@@ -215,9 +213,6 @@ WORD32 impd_get_selected_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc,
return (EXTERNAL_ERROR);
}
pstr_drc_uni_sel_proc->drc_inst_index_sel = n;
- str_drc_instruction_str = &(
- pstr_drc_uni_sel_proc->drc_config
- .str_drc_instruction_str[pstr_drc_uni_sel_proc->drc_inst_index_sel]);
pstr_drc_uni_sel_proc->drc_instructions_index[0] =
pstr_drc_uni_sel_proc->drc_inst_index_sel;
@@ -431,10 +426,9 @@ WORD32 impd_match_effect_types(
WORD32 k, err;
WORD32 match_found_flag = 0;
WORD32 state_requested;
- WORD32 desired_effect_type_found, fallback_effect_type_found;
+ WORD32 desired_effect_type_found;
desired_effect_type_found = 0;
- fallback_effect_type_found = 0;
k = 0;
while (k < effect_type_requested_desired_count) {
state_requested = 1;
@@ -453,7 +447,6 @@ WORD32 impd_match_effect_types(
&match_found_flag, selection_candidate_count,
selection_candidate_info);
if (err) return (err);
- if (match_found_flag) fallback_effect_type_found = 1;
k++;
}
}
diff --git a/decoder/drc_src/impd_drc_shape_filter.c b/decoder/drc_src/impd_drc_shape_filter.c
index b8ca037..d2467c7 100644
--- a/decoder/drc_src/impd_drc_shape_filter.c
+++ b/decoder/drc_src/impd_drc_shape_filter.c
@@ -41,7 +41,7 @@ VOID impd_shape_filt_block_adapt(const FLOAT32 drc_gain,
shape_filter_block* shape_filter_block) {
// WORD32 err = 0;
WORD32 i;
- FLOAT32 warpedGain, x1, y1;
+ FLOAT32 warped_gain = 0, x1 = 0, y1;
shape_filter_block->drc_gain_last = drc_gain;
for (i = 0; i < 4; i++) {
if (shape_filter_block->shape_filter[i].type == SHAPE_FILTER_TYPE_OFF)
@@ -51,9 +51,9 @@ VOID impd_shape_filt_block_adapt(const FLOAT32 drc_gain,
shape_filter_block->shape_filter[i].type ==
SHAPE_FILTER_TYPE_HF_CUT) {
if (drc_gain < 1.0f)
- warpedGain = -1.0f;
+ warped_gain = -1.0f;
else
- warpedGain =
+ warped_gain =
(drc_gain - 1.0f) /
(drc_gain - 1.0f + shape_filter_block->shape_filter[i].gain_offset);
x1 = shape_filter_block->shape_filter[i].a1;
@@ -62,9 +62,9 @@ VOID impd_shape_filt_block_adapt(const FLOAT32 drc_gain,
shape_filter_block->shape_filter[i].type ==
SHAPE_FILTER_TYPE_HF_BOOST) {
if (drc_gain >= 1.0f)
- warpedGain = -1.0f;
+ warped_gain = -1.0f;
else
- warpedGain =
+ warped_gain =
(1.0f - drc_gain) /
(1.0f +
drc_gain *
@@ -72,11 +72,11 @@ VOID impd_shape_filt_block_adapt(const FLOAT32 drc_gain,
x1 = shape_filter_block->shape_filter[i].b1;
}
- if (warpedGain <= 0.0f) {
+ if (warped_gain <= 0.0f) {
y1 = x1;
- } else if (warpedGain <
+ } else if (warped_gain <
shape_filter_block->shape_filter[i].warped_gain_max) {
- y1 = x1 + shape_filter_block->shape_filter[i].factor * warpedGain;
+ y1 = x1 + shape_filter_block->shape_filter[i].factor * warped_gain;
} else {
y1 = shape_filter_block->shape_filter[i].y1_bound;
}
diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c
index 3ad9562..3c08adb 100644
--- a/decoder/drc_src/impd_drc_static_payload.c
+++ b/decoder/drc_src/impd_drc_static_payload.c
@@ -574,7 +574,7 @@ static WORD32 impd_parse_parametric_drc_instructions(
ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size,
ia_parametric_drc_instructions_struct* str_parametric_drc_instructions) {
WORD32 i = 0, err = 0, temp;
- WORD32 bit_size_len, bit_size, other_bit;
+ WORD32 bit_size_len, bit_size;
str_parametric_drc_instructions->drc_characteristic = 0;
str_parametric_drc_instructions->disable_paramteric_drc = 0;
@@ -678,7 +678,7 @@ static WORD32 impd_parse_parametric_drc_instructions(
default:
str_parametric_drc_instructions->disable_paramteric_drc = 1;
for (i = 0; i < str_parametric_drc_instructions->len_bit_size; i++) {
- other_bit = impd_read_bits_buf(it_bit_buff, 1);
+ impd_read_bits_buf(it_bit_buff, 1);
if (it_bit_buff->error) return it_bit_buff->error;
}
break;
@@ -908,7 +908,7 @@ impd_parse_drc_config_ext(ia_bit_buf_struct* it_bit_buff,
ia_drc_config* drc_config,
ia_drc_config_ext* str_drc_config_ext) {
WORD32 err = 0, i, k;
- WORD32 bit_size_len, ext_size_bits, bit_size, other_bit;
+ WORD32 bit_size_len, ext_size_bits, bit_size;
k = 0;
str_drc_config_ext->drc_config_ext_type[k] =
@@ -955,7 +955,7 @@ impd_parse_drc_config_ext(ia_bit_buf_struct* it_bit_buff,
break;
default:
for (i = 0; i < str_drc_config_ext->ext_bit_size[k]; i++) {
- other_bit = impd_read_bits_buf(it_bit_buff, 1);
+ impd_read_bits_buf(it_bit_buff, 1);
if (it_bit_buff->error) return it_bit_buff->error;
}
break;
@@ -1622,7 +1622,7 @@ impd_parse_loudness_info_set_ext(
ia_bit_buf_struct* it_bit_buff,
ia_drc_loudness_info_set_struct* loudness_info_set) {
WORD32 err = 0, i, k;
- WORD32 bit_size_len, ext_size_bits, bit_size, other_bit;
+ WORD32 bit_size_len, ext_size_bits, bit_size;
k = 0;
loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] =
@@ -1649,7 +1649,7 @@ impd_parse_loudness_info_set_ext(
for (i = 0;
i < loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k];
i++) {
- other_bit = impd_read_bits_buf(it_bit_buff, 1);
+ impd_read_bits_buf(it_bit_buff, 1);
if (it_bit_buff->error) return it_bit_buff->error;
}
break;
@@ -2199,9 +2199,9 @@ impd_parse_drc_instructions_uni_drc(
if (it_bit_buff->error) return it_bit_buff->error;
repeat_parameters_cnt += 1;
- if ((c + repeat_parameters_cnt) > MAX_CHANNEL_COUNT)
- return (UNEXPECTED_ERROR);
for (k = 0; k < repeat_parameters_cnt; k++) {
+ if (c > (MAX_CHANNEL_COUNT-1))
+ return (UNEXPECTED_ERROR);
str_drc_instruction_str->gain_set_index[c] =
str_drc_instruction_str->gain_set_index[c - 1];
str_drc_instruction_str->str_ducking_modifiers_for_channel[c] =
@@ -2343,9 +2343,9 @@ impd_parse_drc_instructions_uni_drc(
if (it_bit_buff->error) return it_bit_buff->error;
repeat_gain_set_idx_cnt += 1;
- if ((c + repeat_gain_set_idx_cnt) > MAX_CHANNEL_COUNT)
- return (UNEXPECTED_ERROR);
for (k = 0; k < repeat_gain_set_idx_cnt; k++) {
+ if (c > (MAX_CHANNEL_COUNT - 1))
+ return (UNEXPECTED_ERROR);
str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1;
c++;
}
diff --git a/decoder/drc_src/impd_drc_struct.h b/decoder/drc_src/impd_drc_struct.h
index 5aa7e30..ea07644 100644
--- a/decoder/drc_src/impd_drc_struct.h
+++ b/decoder/drc_src/impd_drc_struct.h
@@ -618,6 +618,8 @@ typedef struct ia_drc_config {
ia_channel_layout_struct channel_layout;
ia_downmix_instructions_struct
dwnmix_instructions[DOWNMIX_INSTRUCTION_COUNT_MAX];
+ WORD32 is_config_changed;
+ WORD32 ln_gain_changed;
} ia_drc_config;
typedef struct {