diff options
author | Harish Mahendrakar <harish.mahendrakar@ittiam.com> | 2022-12-02 20:44:13 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-12-02 20:44:13 +0000 |
commit | 107cb12c2b2e1b719eb4df15708584b4f6392668 (patch) | |
tree | ba49d720e42d9ee1fbb97899fd62d4df54c9d6a0 /decoder/drc_src | |
parent | 61803678225bdfa64badf8410aa198562f006f6b (diff) | |
parent | 2ae5f6ff8a0a12ead1cb7bab53c110039d7c8884 (diff) | |
download | libxaac-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.c | 24 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_api_struct_def.h | 8 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_bitbuffer.c | 4 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_common.h | 2 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_config_params.h | 2 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_dynamic_payload.c | 3 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_gain_dec.c | 94 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_init.c | 7 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_loudness_control.c | 9 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_main_td_process.c | 72 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_process.c | 72 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_selection_process.c | 2 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_selection_process_drcset_selection.c | 9 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_shape_filter.c | 16 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_static_payload.c | 20 | ||||
-rw-r--r-- | decoder/drc_src/impd_drc_struct.h | 2 |
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 { |