From 3dfa708b6e57ff81cb016cfc1cf3c6e508184405 Mon Sep 17 00:00:00 2001 From: akshayragir833 <110660198+akshayragir833@users.noreply.github.com> Date: Mon, 28 Jul 2025 17:40:45 +0530 Subject: [PATCH 01/27] Loudness leveling support for encoder and decoder (#99) * Loudness leveling support for encoder and decoder - Addition of loudness leveling support to encoder and decoder as per ISO/IEC 23003-4:2020/Amd.2:2023(E) Testing: Encoder: Smoke-test Decoder: CTS and Conformance for x86, x86_64, armv7 and armv8 are passing * Addressed review comments * Addressed minor nits in documentation --------- Co-authored-by: Akshay Ragir <100833@ittiam.com> --- Android.bp | 2 + README_dec.md | 10 +- cmake/utils.cmake | 1 + decoder/drc_src/impd_drc_api.c | 8 +- decoder/drc_src/impd_drc_api_struct_def.h | 3 + decoder/drc_src/impd_drc_common.h | 3 + decoder/drc_src/impd_drc_config_params.h | 3 + decoder/drc_src/impd_drc_dynamic_payload.c | 40 +++++ decoder/drc_src/impd_drc_init.c | 26 ++- decoder/drc_src/impd_drc_interface.h | 5 + decoder/drc_src/impd_drc_interface_decoder.c | 17 +- decoder/drc_src/impd_drc_parser.h | 4 + decoder/drc_src/impd_drc_selection_process.h | 4 + ...d_drc_selection_process_drcset_selection.c | 15 ++ .../drc_src/impd_drc_selection_process_init.c | 8 + decoder/drc_src/impd_drc_static_payload.c | 7 + decoder/drc_src/impd_drc_struct.h | 3 + decoder/ixheaacd_aac_config.h | 4 + decoder/ixheaacd_api.c | 24 ++- decoder/ixheaacd_error_codes.h | 5 +- decoder/ixheaacd_struct_def.h | 3 + encoder/drc_src/impd_drc_api.c | 93 ++++++++++- encoder/drc_src/impd_drc_common_enc.h | 7 + encoder/drc_src/impd_drc_mux.c | 157 +++++++++++++++++- encoder/drc_src/impd_drc_uni_drc.h | 4 + encoder/ixheaace_sbr_env_est.c | 2 +- encoder/ixheaace_sbr_env_est.h | 3 +- encoder/ixheaace_sbr_env_est_init.c | 3 +- encoder/ixheaace_sbr_main.c | 2 +- encoder/ixheaace_sbr_tran_det.h | 3 +- encoder/ixheaace_sbr_tran_det_hp.c | 13 +- fuzzer/xaac_dec_fuzzer.cpp | 13 ++ fuzzer/xaac_enc_fuzzer.cpp | 33 +++- test/Android.bp | 4 +- test/decoder/impd_drc_config_params.h | 4 +- test/decoder/ixheaacd_error.c | 14 +- test/decoder/ixheaacd_main.c | 38 ++++- test/decoder/xaacdec.cmake | 4 +- test/encoder/impd_drc_config_params.txt | 88 ++-------- test/encoder/impd_drc_user_config.c | 36 +++- test/encoder/ixheaace_testbench.c | 41 +++++ test/encoder/xaacenc.cmake | 4 +- 42 files changed, 634 insertions(+), 127 deletions(-) diff --git a/Android.bp b/Android.bp index 58d76bb..99f361d 100644 --- a/Android.bp +++ b/Android.bp @@ -28,6 +28,7 @@ cc_library_static { host_supported: true, cflags: [ "-O3", + "-DLOUDNESS_LEVELING_SUPPORT", ], export_include_dirs: [ @@ -354,6 +355,7 @@ cc_library_static { host_supported: true, cflags: [ "-O3", + "-DLOUDNESS_LEVELING_SUPPORT", ], export_include_dirs: [ diff --git a/README_dec.md b/README_dec.md index 02d57dd..ae7edff 100644 --- a/README_dec.md +++ b/README_dec.md @@ -39,8 +39,8 @@ A single API is used to get and set configurations and execute the decode thread |IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_PEAK_LIMITER | Sets the flag to disable/enable peak limiter | |IA_API_CMD_SET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_FRAMELENGTH_FLAG | Sets to flag to indicate whether decoder should decode for frame length 960 or 1024 | |IA_API_CMD_SET_CONFIG_PARAM | IA_XHEAAC_DEC_CONFIG_PARAM_DRC_TARGET_LEVEL | Sets the value of DRC target level | -|IA_API_CMD_SET_CONFIG_PARAM | IA_XHEAAC_DEC_CONFIG_ERROR_CONCEALMENT | Sets to flag to disable/enable error concealment | -|IA_API_CMD_SET_CONFIG_PARAM | IA_XHEAAC_DEC_CONFIG_PARAM_ESBR | Sets to flag to disable/enable eSBR | +|IA_API_CMD_SET_CONFIG_PARAM | IA_XHEAAC_DEC_CONFIG_ERROR_CONCEALMENT | Sets the flag to disable/enable error concealment | +|IA_API_CMD_SET_CONFIG_PARAM | IA_XHEAAC_DEC_CONFIG_PARAM_ESBR | Sets the flag to disable/enable eSBR | |IA_API_CMD_GET_N_MEMTABS | 0 | Gets the number of memory types | |IA_API_CMD_GET_N_TABLES | 0 | Gets the number of tables | |IA_API_CMD_GET_MEM_INFO_SIZE | 0 | Gets the size of the memory type being referred to by the index | @@ -66,6 +66,7 @@ A single API is used to get and set configurations and execute the decode thread |IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS | Gets the value of DRC target loudness | |IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM | Gets the value of DRC loudness normalization level | |IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_PARAM_AOT | Gets the value of audio object type | +|IA_API_CMD_GET_CONFIG_PARAM | IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING | Gets the value of loudness leveling flag | |IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR | Gets the extension element pointer | |IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_BUF_SIZES | Gets the extension element buffer sizes | |IA_API_CMD_GET_CONFIG_PARAM | IA_ENHAACPLUS_DEC_CONFIG_NUM_ELE | Gets the number of configuration elements | @@ -132,7 +133,7 @@ A single API is used to get and set configurations and execute the decode thread |IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS | Sets the number of channels in the input stream/data | |IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ | Sets the PCM word size of the input data | |IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT | Sets the bit stream format | -|IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT | Sets the DRC decoder’s interface present flag to 1 or 0 | +|IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT | Sets the DRC decoders interface present flag to 1 or 0 | |IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE | Sets the frame size | |IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE | Sets the value of DRC effect type | |IA_API_CMD_SET_CONFIG_PARAM | IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS | Sets the value of DRC target loudness | @@ -191,6 +192,7 @@ Command line usage : [-peak_limiter_off:] [-err_conceal:] [-esbr:] +[-loudness_leveling:] where, is the input AAC-LC/HE-AACv1/HE-AACv2/AAC-LD/AAC-ELD/AAC-ELDv2/USAC file name. @@ -222,8 +224,10 @@ where, is to enable/disable peak limiter. Default value is 0. is to enable/disable error concealment. Default value is 0. is to enable/disable eSBR. Default value is 1. + is to enable / disable loudness leveling. Default value is 1. ``` +Note: `loudness_leveling_flag` is applicable only if `LOUDNESS_LEVELING_SUPPORT` macro is enabled. Sample CLI: ``` -ifile:in_file.aac -ofile:out_file.wav -pcmsz:16 diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 922c8d0..5d9cd37 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -50,6 +50,7 @@ function(libxaac_add_definitions) elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") add_definitions(-DX86_64 -D_X86_64_) endif() + add_definitions(-DLOUDNESS_LEVELING_SUPPORT) endfunction() # Adds libraries needed for executables diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c index 94ddccc..d9f0466 100644 --- a/decoder/drc_src/impd_drc_api.c +++ b/decoder/drc_src/impd_drc_api.c @@ -246,7 +246,7 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, case IA_API_CMD_SET_CONFIG_PARAM: { switch (i_idx) { case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { - if (*pus_value < 8000 || *pus_value > 96000) { + if (*pus_value == 0 || *pus_value > 96000) { return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ; } p_obj_drc->str_config.sampling_rate = *pus_value; @@ -328,6 +328,12 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, p_obj_drc->str_config.compress_set = 1; break; } +#ifdef LOUDNESS_LEVELING_SUPPORT + case IA_DRC_DEC_CONFIG_DRC_LOUDNESS_LEVELING: { + p_obj_drc->str_config.loudness_leveling_flag = *pus_value; + break; + } +#endif default: { return -1; } } break; diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h index a753465..de1a637 100644 --- a/decoder/drc_src/impd_drc_api_struct_def.h +++ b/decoder/drc_src/impd_drc_api_struct_def.h @@ -63,6 +63,9 @@ typedef struct ia_drc_config_struct { WORD32 apply_crossfade; WORD32 is_config_changed; WORD32 ln_dbgain_prev; +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 loudness_leveling_flag; +#endif } ia_drc_config_struct; /* DRC bitsteam handler */ diff --git a/decoder/drc_src/impd_drc_common.h b/decoder/drc_src/impd_drc_common.h index bf0f9dd..db57fe2 100644 --- a/decoder/drc_src/impd_drc_common.h +++ b/decoder/drc_src/impd_drc_common.h @@ -193,6 +193,9 @@ extern "C" { #define UNIDRCCONFEXT_V1 0x2 #define UNIDRCLOUDEXT_EQ 0x1 #define UNIDRCINTERFACEEXT_EQ 0x1 +#ifdef LOUDNESS_LEVELING_SUPPORT +#define UNIDRCCONFEXT_LEVELING (0x4) +#endif #define LOUD_EQ_REQUEST_OFF 0x0 #define LOUD_EQ_REQUEST_LIGHT 0x1 diff --git a/decoder/drc_src/impd_drc_config_params.h b/decoder/drc_src/impd_drc_config_params.h index b0d19c5..2bc6ab7 100644 --- a/decoder/drc_src/impd_drc_config_params.h +++ b/decoder/drc_src/impd_drc_config_params.h @@ -46,4 +46,7 @@ #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 +#ifdef LOUDNESS_LEVELING_SUPPORT +#define IA_DRC_DEC_CONFIG_DRC_LOUDNESS_LEVELING 0x0019 +#endif #endif diff --git a/decoder/drc_src/impd_drc_dynamic_payload.c b/decoder/drc_src/impd_drc_dynamic_payload.c index 3c0cbb8..e005198 100644 --- a/decoder/drc_src/impd_drc_dynamic_payload.c +++ b/decoder/drc_src/impd_drc_dynamic_payload.c @@ -28,6 +28,10 @@ #include "impd_drc_parser.h" #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" +#ifdef LOUDNESS_LEVELING_SUPPORT +#include "impd_drc_error_codes.h" +#include "ixheaacd_error_codes.h" +#endif WORD32 impd_parse_loud_eq_instructions( ia_bit_buf_struct* it_bit_buff, ia_loud_eq_instructions_struct* loud_eq_instructions); @@ -646,6 +650,42 @@ WORD32 impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, return 0; } +#ifdef LOUDNESS_LEVELING_SUPPORT +IA_ERROR_CODE impd_leveling_instructions(ia_bit_buf_struct* it_bit_buff, + ia_drc_config* pstr_drc_config) { + WORD32 i; + IA_ERROR_CODE err = IA_NO_ERROR; + WORD32 drc_instruction_uni_drc_count = pstr_drc_config->drc_instructions_uni_drc_count; + + for (i = 0; i < drc_instruction_uni_drc_count; ++i) { + if ((pstr_drc_config->str_drc_instruction_str[i].drc_set_effect & (1 << 11)) != 0) { + pstr_drc_config->str_drc_instruction_str[i].leveling_present = + impd_read_bits_buf(it_bit_buff, 1); + + if (pstr_drc_config->str_drc_instruction_str[i].leveling_present) { + WORD32 ducking_only_drc_set_present = impd_read_bits_buf(it_bit_buff, 1); + + if (ducking_only_drc_set_present) { + pstr_drc_config->drc_instructions_uni_drc_count++; + + if (pstr_drc_config->drc_instructions_uni_drc_count > DRC_INSTRUCTIONS_COUNT_MAX) { + return IA_XHEAAC_DEC_INIT_NONFATAL_MAX_INSTRUCTIONS_ERROR; + } + + err = impd_parse_drc_instructions_uni_drc( + it_bit_buff, 1, pstr_drc_config, + &pstr_drc_config + ->str_drc_instruction_str[pstr_drc_config->drc_instructions_uni_drc_count - + 1]); + if (err) return err; + } + } + } + } + return err; +} +#endif + WORD32 impd_parse_filt_block(ia_bit_buf_struct* it_bit_buff, ia_filt_block_struct* str_filter_block, WORD32 block_count) { diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c index 870b759..bc0af38 100644 --- a/decoder/drc_src/impd_drc_init.c +++ b/decoder/drc_src/impd_drc_init.c @@ -58,10 +58,15 @@ impd_drc_dec_interface_process(ia_bit_buf_struct *it_bit_buff, WORD32 *num_bits_read); WORD32 -impd_drc_dec_interface_add_effect_type( - ia_drc_interface_struct *pstr_drc_interface, WORD32 drc_effect_type, - WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost, - FLOAT32 compress); +impd_drc_dec_interface_add_effect_type(ia_drc_interface_struct *pstr_drc_interface, + WORD32 drc_effect_type, WORD32 target_loudness, + WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost, + FLOAT32 compress +#ifdef LOUDNESS_LEVELING_SUPPORT + , + WORD32 loudness_leveling_flag +#endif +); #define BITSTREAM_FILE_FORMAT_SPLIT 1 #define LIM_DEFAULT_THRESHOLD (0.89125094f) @@ -411,10 +416,15 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { 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, - p_obj_drc->str_config.loud_norm_flag, p_obj_drc->str_config.album_mode, - p_obj_drc->str_config.boost, p_obj_drc->str_config.compress); + p_obj_drc->str_payload.pstr_drc_interface, p_obj_drc->str_config.effect_type, + p_obj_drc->str_config.target_loudness, p_obj_drc->str_config.loud_norm_flag, + p_obj_drc->str_config.album_mode, p_obj_drc->str_config.boost, + p_obj_drc->str_config.compress +#ifdef LOUDNESS_LEVELING_SUPPORT + , + p_obj_drc->str_config.loudness_leveling_flag +#endif + ); if (err_code != IA_NO_ERROR) return err_code; diff --git a/decoder/drc_src/impd_drc_interface.h b/decoder/drc_src/impd_drc_interface.h index a0e7039..c05ae3b 100644 --- a/decoder/drc_src/impd_drc_interface.h +++ b/decoder/drc_src/impd_drc_interface.h @@ -42,6 +42,11 @@ typedef struct { typedef struct { WORD32 interface_ext_count; ia_specific_interface_extension_struct specific_interface_ext[EXT_COUNT_MAX]; + +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 loudness_leveling_on; +#endif + WORD32 loudness_eq_parameter_interface_flag; WORD32 eq_ctrl_interface_flag; ia_loudness_eq_parameter_interface_struct loudness_eq_parameter_interface; diff --git a/decoder/drc_src/impd_drc_interface_decoder.c b/decoder/drc_src/impd_drc_interface_decoder.c index 557ea2f..b7bd430 100644 --- a/decoder/drc_src/impd_drc_interface_decoder.c +++ b/decoder/drc_src/impd_drc_interface_decoder.c @@ -29,10 +29,15 @@ #include "impd_drc_parser_interface.h" WORD32 -impd_drc_dec_interface_add_effect_type( - ia_drc_interface_struct* pstr_drc_interface, WORD32 drc_effect_type, - WORD32 target_loudness, WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost, - FLOAT32 compress) { +impd_drc_dec_interface_add_effect_type(ia_drc_interface_struct* pstr_drc_interface, + WORD32 drc_effect_type, WORD32 target_loudness, + WORD32 loud_norm, WORD32 album_mode, FLOAT32 boost, + FLOAT32 compress +#ifdef LOUDNESS_LEVELING_SUPPORT + , + WORD32 loudness_leveling_flag +#endif +) { WORD32 err = 0; WORD32 i = 0; @@ -65,7 +70,9 @@ impd_drc_dec_interface_add_effect_type( } pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness = (FLOAT32)target_loudness; - +#ifdef LOUDNESS_LEVELING_SUPPORT + pstr_drc_interface->drc_uni_interface_ext.loudness_leveling_on = loudness_leveling_flag; +#endif pstr_drc_interface->loudness_norm_parameter_interface_flag = 1; pstr_drc_interface->loudness_norm_param_interface.album_mode = album_mode; pstr_drc_interface->loudness_norm_param_interface.peak_limiter = 0; diff --git a/decoder/drc_src/impd_drc_parser.h b/decoder/drc_src/impd_drc_parser.h index 75c548b..92018a0 100644 --- a/decoder/drc_src/impd_drc_parser.h +++ b/decoder/drc_src/impd_drc_parser.h @@ -73,6 +73,10 @@ impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, ia_drc_config_ext* str_drc_config_ext); +#ifdef LOUDNESS_LEVELING_SUPPORT +WORD32 impd_leveling_instructions(ia_bit_buf_struct* it_bit_buff, ia_drc_config* pstr_drc_config); +#endif + WORD32 impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, ia_drc_params_bs_dec_struct* ia_drc_params_struct, diff --git a/decoder/drc_src/impd_drc_selection_process.h b/decoder/drc_src/impd_drc_selection_process.h index 4fdabe3..fba45e0 100644 --- a/decoder/drc_src/impd_drc_selection_process.h +++ b/decoder/drc_src/impd_drc_selection_process.h @@ -82,6 +82,10 @@ typedef struct ia_drc_sel_proc_params_struct { FLOAT32 playback_gain; WORD32 eq_set_purpose_request; +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 loudness_leveling_on; +#endif + FLOAT32 boost; FLOAT32 compress; WORD32 drc_characteristic_target; 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 153e2f5..9317e8c 100644 --- a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c +++ b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c @@ -30,6 +30,9 @@ #include "impd_drc_loudness_control.h" #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" +#ifdef LOUDNESS_LEVELING_SUPPORT +#include "ixheaac_error_standards.h" +#endif static const WORD32 effect_types_request_table[] = { EFFECT_BIT_NIGHT, EFFECT_BIT_NOISY, EFFECT_BIT_LIMITED, @@ -170,6 +173,12 @@ WORD32 impd_get_ducking_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { for (k = 0; k < str_drc_instruction_str->dwnmix_id_count; k++) { if (str_drc_instruction_str->downmix_id[k] == requested_dwnmix_id) { +#ifdef LOUDNESS_LEVELING_SUPPORT + if (drc_instructions_index != -1) break; + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_leveling_on == 0 && + str_drc_instruction_str->leveling_present == 1) + continue; +#endif drc_instructions_index = n; } } @@ -186,6 +195,12 @@ WORD32 impd_get_ducking_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { for (k = 0; k < str_drc_instruction_str->dwnmix_id_count; k++) { if (str_drc_instruction_str->downmix_id[k] == ID_FOR_BASE_LAYOUT) { +#ifdef LOUDNESS_LEVELING_SUPPORT + if (drc_instructions_index != -1) break; + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_leveling_on == 0 && + str_drc_instruction_str->leveling_present == 1) + continue; +#endif drc_instructions_index = n; } } diff --git a/decoder/drc_src/impd_drc_selection_process_init.c b/decoder/drc_src/impd_drc_selection_process_init.c index 4a1ae63..667a4b6 100644 --- a/decoder/drc_src/impd_drc_selection_process_init.c +++ b/decoder/drc_src/impd_drc_selection_process_init.c @@ -104,6 +104,10 @@ WORD32 impd_drc_sel_proc_init_dflt( pstr_drc_uni_sel_proc->eq_inst_index[0] = -1; pstr_drc_uni_sel_proc->eq_inst_index[1] = -1; pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + +#ifdef LOUDNESS_LEVELING_SUPPORT + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_leveling_on = 1; +#endif } else { return 1; } @@ -133,6 +137,10 @@ VOID impd_drc_sel_proc_init_interface_params( WORD32 i, j; if (pstr_drc_uni_sel_proc != NULL && pstr_drc_interface != NULL) { +#ifdef LOUDNESS_LEVELING_SUPPORT + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_leveling_on = + pstr_drc_interface->drc_uni_interface_ext.loudness_leveling_on; +#endif if (pstr_drc_interface->system_interface_flag) { if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params .target_config_request_type != diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c index 54e5162..816b9c9 100644 --- a/decoder/drc_src/impd_drc_static_payload.c +++ b/decoder/drc_src/impd_drc_static_payload.c @@ -954,6 +954,13 @@ impd_parse_drc_config_ext(ia_bit_buf_struct* it_bit_buff, drc_config, str_drc_config_ext); if (err) return (err); break; + +#ifdef LOUDNESS_LEVELING_SUPPORT + case UNIDRCCONFEXT_LEVELING: + err = impd_leveling_instructions(it_bit_buff, drc_config); + if (err) return err; + break; +#endif default: for (i = 0; i < str_drc_config_ext->ext_bit_size[k]; i++) { impd_read_bits_buf(it_bit_buff, 1); diff --git a/decoder/drc_src/impd_drc_struct.h b/decoder/drc_src/impd_drc_struct.h index ea07644..a8e63bc 100644 --- a/decoder/drc_src/impd_drc_struct.h +++ b/decoder/drc_src/impd_drc_struct.h @@ -424,6 +424,9 @@ typedef struct { WORD32 gain_set_idx_of_ch_group_parametric_drc[CHANNEL_GROUP_COUNT_MAX]; WORD32 parametric_drc_look_ahead_samples[CHANNEL_GROUP_COUNT_MAX]; WORD32 parametric_drc_look_ahead_samples_max; +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 leveling_present; +#endif } ia_drc_instructions_struct; typedef struct { diff --git a/decoder/ixheaacd_aac_config.h b/decoder/ixheaacd_aac_config.h index b31cee3..0e6e072 100644 --- a/decoder/ixheaacd_aac_config.h +++ b/decoder/ixheaacd_aac_config.h @@ -65,6 +65,10 @@ #define IA_XHEAAC_DEC_CONFIG_PARAM_ESBR 0x0028 +#ifdef LOUDNESS_LEVELING_SUPPORT +#define IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING 0x0029 +#endif + #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_PCM_WDSZ IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_SAMP_FREQ IA_XHEAAC_DEC_CONFIG_PARAM_SAMP_FREQ #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_NUM_CHANNELS IA_XHEAAC_DEC_CONFIG_PARAM_NUM_CHANNELS diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 1608968..31157d2 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -480,7 +480,9 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd, p_obj_exhaacplus_dec->aac_config.ui_drc_set = 0; p_obj_exhaacplus_dec->aac_config.ui_flush_cmd = 0; p_obj_exhaacplus_dec->aac_config.output_level = -1; - +#ifdef LOUDNESS_LEVELING_SUPPORT + p_obj_exhaacplus_dec->aac_config.ui_loudness_leveling_flag = 1; +#endif p_obj_exhaacplus_dec->aac_config.ui_max_channels = 6; p_obj_exhaacplus_dec->aac_config.ui_coupling_channel = 0; @@ -789,6 +791,16 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd, p_obj_exhaacplus_dec->aac_config.ui_enh_sbr = *pui_value_signed; break; } +#ifdef LOUDNESS_LEVELING_SUPPORT + case IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING: { + if (((*pui_value_signed) != 0) && ((*pui_value_signed) != 1)) { + p_obj_exhaacplus_dec->aac_config.ui_loudness_leveling_flag = 1; + return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_LOUDNESS_LEVELING_FLAG); + } + p_obj_exhaacplus_dec->aac_config.ui_loudness_leveling_flag = *pui_value_signed; + break; + } +#endif default: { return IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM; } } break; @@ -931,7 +943,15 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd, } else { *pui_value = AOT_AAC_LC; } - } else { + } +#ifdef LOUDNESS_LEVELING_SUPPORT + else if (IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING == i_idx) { + WORD32 *ui_value = + (WORD32 *)(&p_obj_exhaacplus_dec->aac_config.ui_loudness_leveling_flag); + *pui_value = *ui_value; + } +#endif + else { return IA_XHEAAC_DEC_API_FATAL_INVALID_CONFIG_PARAM; } break; diff --git a/decoder/ixheaacd_error_codes.h b/decoder/ixheaacd_error_codes.h index 2e4c985..4d2a2fc 100644 --- a/decoder/ixheaacd_error_codes.h +++ b/decoder/ixheaacd_error_codes.h @@ -63,6 +63,9 @@ #define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_HQ_FLAG 0x00000815 #define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_FRAMELENGTHFLAG 0x00000816 #define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_ESBR_FLAG 0x00000817 +#ifdef LOUDNESS_LEVELING_SUPPORT +#define IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_LOUDNESS_LEVELING_FLAG 0x00000818 +#endif /* Fatal Errors */ #define IA_XHEAAC_DEC_CONFIG_FATAL_INVALID_SAMPLE_RATE 0xFFFF8800 @@ -75,7 +78,7 @@ #define IA_XHEAAC_DEC_INIT_NONFATAL_EC_INIT_FAIL 0x00001002 #define IA_XHEAAC_DEC_INIT_NONFATAL_INSUFFICIENT_INPUT_BYTES 0x00001003 #define IA_XHEAAC_DEC_INIT_NONFATAL_DECODE_FRAME_ERROR 0x00001004 - +#define IA_XHEAAC_DEC_INIT_NONFATAL_MAX_INSTRUCTIONS_ERROR 0x00001005 /* Fatal Errors */ #define IA_XHEAAC_DEC_INIT_FATAL_DEC_INIT_FAIL 0xFFFF9000 #define IA_XHEAAC_DEC_INIT_FATAL_EO_INPUT_REACHED 0xFFFF9001 diff --git a/decoder/ixheaacd_struct_def.h b/decoder/ixheaacd_struct_def.h index a098594..fea3b56 100644 --- a/decoder/ixheaacd_struct_def.h +++ b/decoder/ixheaacd_struct_def.h @@ -137,6 +137,9 @@ typedef struct { WORD32 ui_err_conceal; FLAG first_frame; +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 ui_loudness_leveling_flag; +#endif } ia_aac_dec_config_struct; typedef struct ia_aac_dec_state_struct { diff --git a/encoder/drc_src/impd_drc_api.c b/encoder/drc_src/impd_drc_api.c index 5527b6d..60034b9 100644 --- a/encoder/drc_src/impd_drc_api.c +++ b/encoder/drc_src/impd_drc_api.c @@ -88,6 +88,15 @@ IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_confi } IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->str_drc_instructions_uni_drc[i].limiter_peak_target, MIN_LIMITER_PEAK_TARGET, 0.0f); +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].drc_set_effect & + EFFECT_BIT_DUCK_SELF) { + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->str_drc_instructions_uni_drc[i].leveling_present, + 0, 1); + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config->str_drc_instructions_uni_drc[i].ducking_only_set_present, 0, 1); + } +#endif } IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config->drc_coefficients_uni_drc_count, 0, @@ -395,6 +404,16 @@ IA_ERRORCODE impd_drc_validate_config_params(ia_drc_input_config *pstr_inp_confi IMPD_DRC_BOUND_CHECK( pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].limiter_peak_target, MIN_LIMITER_PEAK_TARGET, 0.0f); +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].drc_set_effect & + EFFECT_BIT_DUCK_SELF) { + IMPD_DRC_BOUND_CHECK( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].leveling_present, 0, 1); + IMPD_DRC_BOUND_CHECK(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .ducking_only_set_present, + 0, 1); + } +#endif } } } @@ -423,8 +442,67 @@ static IA_ERRORCODE impd_drc_validate_drc_instructions( if (profile_found == FALSE) { return IA_EXHEAACE_CONFIG_FATAL_DRC_INVALID_CONFIG; } +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].drc_set_effect & + EFFECT_BIT_DUCK_SELF) { + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].leveling_present && + pstr_uni_drc_config->str_drc_instructions_uni_drc[i].ducking_only_set_present) { + if (i < pstr_uni_drc_config->drc_instructions_uni_drc_count - 1) { + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i + 1].drc_set_effect != + EFFECT_BIT_DUCK_SELF && + pstr_uni_drc_config->str_drc_instructions_uni_drc[i + 1].drc_set_effect != + EFFECT_BIT_DUCK_OTHER) { + pstr_uni_drc_config->str_drc_instructions_uni_drc[i + 1].drc_set_effect = + EFFECT_BIT_DUCK_SELF; + } + pstr_uni_drc_config->str_drc_instructions_uni_drc[i + 1].leveling_present = 0; + pstr_uni_drc_config->str_drc_instructions_uni_drc[i + 1].ducking_only_set_present = 0; + } else { + pstr_uni_drc_config->str_drc_instructions_uni_drc[i].ducking_only_set_present = 0; + } + } else if (!pstr_uni_drc_config->str_drc_instructions_uni_drc[i].leveling_present && + pstr_uni_drc_config->str_drc_instructions_uni_drc[i].ducking_only_set_present) { + pstr_uni_drc_config->str_drc_instructions_uni_drc[i].ducking_only_set_present = 0; + } + } +#endif } - +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_uni_drc_config->uni_drc_config_ext_present) { + ia_drc_uni_drc_config_ext_struct *pstr_uni_drc_config_ext = + &pstr_uni_drc_config->str_uni_drc_config_ext; + for (i = 0; i < pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count; i++) { + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].drc_set_effect & + EFFECT_BIT_DUCK_SELF) { + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].leveling_present && + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .ducking_only_set_present) { + if (i < pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count - 1) { + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i + 1].drc_set_effect != + EFFECT_BIT_DUCK_SELF && + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i + 1].drc_set_effect != + EFFECT_BIT_DUCK_OTHER) { + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i + 1].drc_set_effect = + EFFECT_BIT_DUCK_SELF; + } + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i + 1].leveling_present = 0; + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i + 1] + .ducking_only_set_present = 0; + } else { + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].ducking_only_set_present = + 0; + } + } else if (!pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .leveling_present && + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i] + .ducking_only_set_present) { + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].ducking_only_set_present = + 0; + } + } + } + } +#endif return IA_NO_ERROR; } @@ -461,6 +539,18 @@ IA_ERRORCODE impd_drc_enc_init(VOID *pstr_drc_state, VOID *ptr_drc_scratch, if (err_code) { return err_code; } +#ifdef LOUDNESS_LEVELING_SUPPORT + err_code = impd_drc_validate_drc_instructions(&pstr_inp_config->str_uni_drc_config); + + if (err_code & IA_FATAL_ERROR) { + return IA_EXHEAACE_CONFIG_FATAL_DRC_INVALID_CONFIG; + } + + pstr_drc_state_local->str_enc_params = pstr_inp_config->str_enc_params; + pstr_drc_state_local->str_uni_drc_config = pstr_inp_config->str_uni_drc_config; + pstr_drc_state_local->str_enc_gain_extension = pstr_inp_config->str_enc_gain_extension; + pstr_drc_state_local->str_gain_enc.str_uni_drc_config = pstr_inp_config->str_uni_drc_config; +#else pstr_drc_state_local->str_enc_params = pstr_inp_config->str_enc_params; pstr_drc_state_local->str_uni_drc_config = pstr_inp_config->str_uni_drc_config; pstr_drc_state_local->str_enc_gain_extension = pstr_inp_config->str_enc_gain_extension; @@ -469,6 +559,7 @@ IA_ERRORCODE impd_drc_enc_init(VOID *pstr_drc_state, VOID *ptr_drc_scratch, if (err_code & IA_FATAL_ERROR) { return IA_EXHEAACE_CONFIG_FATAL_DRC_INVALID_CONFIG; } +#endif err_code = impd_drc_write_uni_drc_config(pstr_drc_state_local, &bit_count, 1); if (err_code & IA_FATAL_ERROR) { diff --git a/encoder/drc_src/impd_drc_common_enc.h b/encoder/drc_src/impd_drc_common_enc.h index 1bb46e3..c6a3626 100644 --- a/encoder/drc_src/impd_drc_common_enc.h +++ b/encoder/drc_src/impd_drc_common_enc.h @@ -36,7 +36,11 @@ #define MAX_CHANNEL_GROUP_COUNT (MAX_SEQUENCE_COUNT) #define MAX_ADDITIONAL_DOWNMIX_ID (7) #define DELAY_MODE_REGULAR_DELAY (0) +#ifdef LOUDNESS_LEVELING_SUPPORT +#define MAX_EXT_COUNT (3) +#else #define MAX_EXT_COUNT (2) +#endif #define MAX_GAIN_POINTS (256) #define MAX_DRC_INSTRUCTIONS_BASIC_COUNT (15) @@ -46,6 +50,9 @@ #define UNIDRC_CONF_EXT_PARAM_DRC (0x1) #define UNIDRC_CONF_EXT_V1 (0x2) #define UNIDRC_LOUD_EXT_EQ (0x1) +#ifdef LOUDNESS_LEVELING_SUPPORT +#define UNIDRCCONFEXT_LEVELING (0x4) +#endif #define MAX_PARAM_DRC_INSTRUCTIONS_COUNT (8) diff --git a/encoder/drc_src/impd_drc_mux.c b/encoder/drc_src/impd_drc_mux.c index 43bb87e..fa3aac1 100644 --- a/encoder/drc_src/impd_drc_mux.c +++ b/encoder/drc_src/impd_drc_mux.c @@ -1099,6 +1099,97 @@ static IA_ERRORCODE impd_drc_write_drc_instruct_uni_drc( return err_code; } +#ifdef LOUDNESS_LEVELING_SUPPORT +static UWORD32 get_num_ducking_only_drc_sets( + ia_drc_instructions_uni_drc const *pstr_drc_instructions_uni_drc, + UWORD32 drc_intructions_uni_drc_count) { + UWORD32 num_ducking_only_drc_sets = 0; + for (UWORD16 i = 0; i < drc_intructions_uni_drc_count; i++) { + if (pstr_drc_instructions_uni_drc[i].ducking_only_set_present) { + num_ducking_only_drc_sets++; + } + } + + return num_ducking_only_drc_sets; +} + +static WORD32 write_loudness_leveling_extension(ia_bit_buf_struct *it_bit_buf, + ia_drc_uni_drc_config_struct *pstr_uni_drc_config, + ia_drc_gain_enc_struct *pstr_gain_enc, + VOID *ptr_scratch, WORD32 *bit_cnt) { + IA_ERRORCODE err_code = IA_NO_ERROR; + WORD32 bit_cnt_local = 0; + WORD32 drc_instructions_uni_drc_count_v1 = + pstr_uni_drc_config->str_uni_drc_config_ext.drc_instructions_uni_drc_v1_count; + WORD32 drc_instructions_uni_drc_count = pstr_uni_drc_config->drc_instructions_uni_drc_count; + WORD32 version = 0; + WORD16 ducking_set_expected = 0; + // V0 instructions + for (WORD16 i = 0; i < drc_instructions_uni_drc_count; i++) { + ia_drc_instructions_uni_drc *pstr_drc_instruction = + &pstr_uni_drc_config->str_drc_instructions_uni_drc[i]; + if (pstr_drc_instruction->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + if (ducking_set_expected) { + ia_drc_instructions_uni_drc *pstr_drc_instruction_prev = + &pstr_uni_drc_config->str_drc_instructions_uni_drc[i - 1]; + if (pstr_drc_instruction_prev->ducking_only_set_present) { + err_code = impd_drc_write_drc_instruct_uni_drc(it_bit_buf, version, pstr_uni_drc_config, + pstr_gain_enc, pstr_drc_instruction, + ptr_scratch, &bit_cnt_local); + if (err_code & IA_FATAL_ERROR) { + return (err_code); + } + } + ducking_set_expected = 0; + } else { + bit_cnt_local += + iusace_write_bits_buf(it_bit_buf, pstr_drc_instruction->leveling_present, 1); + if (pstr_drc_instruction->leveling_present) { + ducking_set_expected = 1; + bit_cnt_local += iusace_write_bits_buf( + it_bit_buf, pstr_drc_instruction->ducking_only_set_present, 1); + continue; + } + } + } + } + + // V1 instructions + version = 1; + ducking_set_expected = 0; + for (WORD16 i = 0; i < drc_instructions_uni_drc_count_v1; i++) { + ia_drc_instructions_uni_drc *pstr_drc_instruction = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_drc_instructions_uni_drc_v1[i]; + if (pstr_drc_instruction->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + if (ducking_set_expected) { + ia_drc_instructions_uni_drc *pstr_drc_instruction_prev = + &pstr_uni_drc_config->str_uni_drc_config_ext.str_drc_instructions_uni_drc_v1[i - 1]; + if (pstr_drc_instruction_prev->ducking_only_set_present) { + err_code = impd_drc_write_drc_instruct_uni_drc(it_bit_buf, version, pstr_uni_drc_config, + pstr_gain_enc, pstr_drc_instruction, + ptr_scratch, &bit_cnt_local); + if (err_code & IA_FATAL_ERROR) { + return (err_code); + } + } + ducking_set_expected = 0; + } else { + bit_cnt_local += + iusace_write_bits_buf(it_bit_buf, pstr_drc_instruction->leveling_present, 1); + if (pstr_drc_instruction->leveling_present) { + ducking_set_expected = 1; + bit_cnt_local += iusace_write_bits_buf( + it_bit_buf, pstr_drc_instruction->ducking_only_set_present, 1); + continue; + } + } + } + } + *bit_cnt += bit_cnt_local; + return IA_NO_ERROR; +} +#endif + static VOID impd_drc_write_gain_params(ia_bit_buf_struct *it_bit_buf, const WORD32 version, const WORD32 band_count, const WORD32 drc_band_type, ia_drc_gain_params_struct *pstr_gain_params, @@ -2536,6 +2627,9 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( pstr_uni_drc_config_ext->uni_drc_config_ext_type[counter] != UNIDRC_CONF_EXT_TERM) { switch (pstr_uni_drc_config_ext->uni_drc_config_ext_type[counter]) { case UNIDRC_CONF_EXT_PARAM_DRC: { +#ifdef LOUDNESS_LEVELING_SUPPORT + bit_cnt_local_ext = 0; +#endif // LOUDNESS_LEVELING_SUPPORT err_code = impd_drc_write_drc_coeff_parametric_drc( ptr_bit_buf_ext, pstr_uni_drc_config, &(pstr_uni_drc_config_ext->str_drc_coeff_parametric_drc), &bit_cnt_local_ext); @@ -2559,6 +2653,9 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( } break; case UNIDRC_CONF_EXT_V1: { version = 1; +#ifdef LOUDNESS_LEVELING_SUPPORT + bit_cnt_local_ext = 0; +#endif // LOUDNESS_LEVELING_SUPPORT bit_cnt_local_ext += iusace_write_bits_buf( ptr_bit_buf_ext, pstr_uni_drc_config_ext->downmix_instructions_v1_present, 1); if (pstr_uni_drc_config_ext->downmix_instructions_v1_present == 1) { @@ -2583,10 +2680,27 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( &(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[idx]), &bit_cnt_local_ext); } +#ifdef LOUDNESS_LEVELING_SUPPORT + UWORD32 num_ducking_only_drc_sets = get_num_ducking_only_drc_sets( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1, + pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count); + bit_cnt_local_ext += + iusace_write_bits_buf(ptr_bit_buf_ext, + pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count - + num_ducking_only_drc_sets, + 6); +#else bit_cnt_local_ext += iusace_write_bits_buf( ptr_bit_buf_ext, pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count, 6); +#endif for (idx = 0; idx < pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count; idx++) { +#ifdef LOUDNESS_LEVELING_SUPPORT + if (idx > 0 && pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[idx - 1] + .ducking_only_set_present) { + continue; + } +#endif err_code = impd_drc_write_drc_instruct_uni_drc( ptr_bit_buf_ext, version, pstr_uni_drc_config, pstr_gain_enc, &(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[idx]), ptr_scratch, @@ -2632,6 +2746,17 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( } } } break; + +#ifdef LOUDNESS_LEVELING_SUPPORT + case UNIDRCCONFEXT_LEVELING: { + bit_cnt_local_ext = 0; + err_code = write_loudness_leveling_extension( + ptr_bit_buf_ext, pstr_uni_drc_config, pstr_gain_enc, ptr_scratch, &bit_cnt_local_ext); + if (err_code & IA_FATAL_ERROR) { + return (err_code); + } + } break; +#endif default: break; } @@ -2639,6 +2764,9 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( pstr_uni_drc_config_ext->ext_bit_size[counter] = bit_cnt_local_ext; bit_size = pstr_uni_drc_config_ext->ext_bit_size[counter] - 1; ext_size_bits = (WORD32)(log((FLOAT32)bit_size) / log(2.f)) + 1; +#ifdef LOUDNESS_LEVELING_SUPPORT + ext_size_bits = (ext_size_bits < 4) ? 4 : ext_size_bits; +#endif // LOUDNESS_LEVELING_SUPPORT bit_size_len = ext_size_bits - 4; bit_cnt_local += iusace_write_bits_buf(it_bit_buf, bit_size_len, 4); @@ -2693,10 +2821,26 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( it_bit_buf, version, &(pstr_uni_drc_config_ext->str_drc_coefficients_uni_drc_v1[idx]), &bit_cnt_local); } - +#ifdef LOUDNESS_LEVELING_SUPPORT + UWORD32 num_ducking_only_drc_sets = get_num_ducking_only_drc_sets( + pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1, + pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count); + bit_cnt_local += + iusace_write_bits_buf(it_bit_buf, + pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count - + num_ducking_only_drc_sets, + 6); +#else bit_cnt_local += iusace_write_bits_buf( it_bit_buf, pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count, 6); +#endif for (idx = 0; idx < pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count; idx++) { +#ifdef LOUDNESS_LEVELING_SUPPORT + if (idx > 0 && pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[idx - 1] + .ducking_only_set_present) { + continue; + } +#endif err_code = impd_drc_write_drc_instruct_uni_drc( it_bit_buf, version, pstr_uni_drc_config, pstr_gain_enc, &(pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[idx]), ptr_scratch, @@ -2741,6 +2885,15 @@ static IA_ERRORCODE impd_drc_write_uni_drc_config_extn( } } } break; +#ifdef LOUDNESS_LEVELING_SUPPORT + case UNIDRCCONFEXT_LEVELING: { + err_code = write_loudness_leveling_extension(it_bit_buf, pstr_uni_drc_config, + pstr_gain_enc, ptr_scratch, &bit_cnt_local); + if (err_code & IA_FATAL_ERROR) { + return (err_code); + } + } break; +#endif default: for (idx = 0; idx < pstr_uni_drc_config_ext->ext_bit_size[counter]; idx++) { bit_cnt_local += iusace_write_bits_buf(it_bit_buf, 0, 1); @@ -3019,7 +3172,7 @@ IA_ERRORCODE impd_drc_write_measured_loudness_info(ia_drc_enc_state *pstr_drc_st return (err_code); } pstr_drc_state->drc_config_ext_data_size_bit = bit_cnt_lis; - + return err_code; } diff --git a/encoder/drc_src/impd_drc_uni_drc.h b/encoder/drc_src/impd_drc_uni_drc.h index 13e43ca..7cb720b 100644 --- a/encoder/drc_src/impd_drc_uni_drc.h +++ b/encoder/drc_src/impd_drc_uni_drc.h @@ -388,6 +388,10 @@ typedef struct { WORD32 multiband_audio_signal_count; WORD32 channel_group_is_parametric_drc[MAX_CHANNEL_GROUP_COUNT]; WORD32 gain_set_idx_for_ch_group_parametric_drc[MAX_CHANNEL_GROUP_COUNT]; +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 leveling_present; + WORD32 ducking_only_set_present; +#endif } ia_drc_instructions_uni_drc; typedef struct { diff --git a/encoder/ixheaace_sbr_env_est.c b/encoder/ixheaace_sbr_env_est.c index a02e0bd..9f78654 100644 --- a/encoder/ixheaace_sbr_env_est.c +++ b/encoder/ixheaace_sbr_env_est.c @@ -2155,7 +2155,7 @@ IA_ERRORCODE ixheaace_extract_sbr_envelope(FLOAT32 *ptr_in_time, FLOAT32 *ptr_co } else if (pstr_sbr_extract_env->time_step == 4) { ixheaace_detect_transient_4_1(pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch], - pstr_sbr_extract_env->time_step, pstr_sbr_cfg->sbr_codec); + pstr_sbr_extract_env->time_step); } else { ixheaace_detect_transient(pstr_sbr_extract_env->ptr_y_buffer, &pstr_env_ch[ch]->str_sbr_trans_detector, transient_info[ch], diff --git a/encoder/ixheaace_sbr_env_est.h b/encoder/ixheaace_sbr_env_est.h index ffcee6f..a53a626 100644 --- a/encoder/ixheaace_sbr_env_est.h +++ b/encoder/ixheaace_sbr_env_est.h @@ -47,8 +47,7 @@ ixheaace_create_extract_sbr_envelope(WORD32 ch, ixheaace_pstr_sbr_extract_envelope pstr_sbr_ext_env, WORD32 start_index, WORD32 *ptr_common_buffer2, FLOAT32 *ptr_sbr_env_r_buf, FLOAT32 *ptr_sbr_env_i_buf, - WORD32 is_ld_sbr, WORD32 frame_flag_480, - ixheaace_sbr_codec_type sbr_codec); + WORD32 frame_flag_480, ixheaace_sbr_codec_type sbr_codec); struct ixheaace_str_sbr_config_data; struct ixheaace_str_sbr_bitstream_data; diff --git a/encoder/ixheaace_sbr_env_est_init.c b/encoder/ixheaace_sbr_env_est_init.c index 2f2d8d1..f2dfbf6 100644 --- a/encoder/ixheaace_sbr_env_est_init.c +++ b/encoder/ixheaace_sbr_env_est_init.c @@ -62,8 +62,7 @@ ixheaace_create_extract_sbr_envelope(WORD32 ch, ixheaace_pstr_sbr_extract_envelope pstr_sbr_ext_env, WORD32 start_index, WORD32 *ptr_common_buffer2, FLOAT32 *ptr_sbr_env_r_buf, FLOAT32 *ptr_sbr_env_i_buf, - WORD32 is_ld_sbr, WORD32 frame_flag_480, - ixheaace_sbr_codec_type sbr_codec) { + WORD32 frame_flag_480, ixheaace_sbr_codec_type sbr_codec) { WORD32 i; WORD32 y_buffer_length, r_buffer_length; WORD32 offset = 0; diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 64b6a2f..893d215 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -262,7 +262,7 @@ static IA_ERRORCODE ixheaace_create_env_channel( } err_code = ixheaace_create_extract_sbr_envelope( ch, &pstr_env->str_sbr_extract_env, start_index, ptr_common_buffer2, ptr_sbr_env_r_buf, - ptr_sbr_env_i_buf, params->is_ld_sbr, params->frame_flag_480, params->sbr_codec); + ptr_sbr_env_i_buf, params->frame_flag_480, params->sbr_codec); if (err_code) { return err_code; } diff --git a/encoder/ixheaace_sbr_tran_det.h b/encoder/ixheaace_sbr_tran_det.h index 20ec440..0d184f8 100644 --- a/encoder/ixheaace_sbr_tran_det.h +++ b/encoder/ixheaace_sbr_tran_det.h @@ -61,8 +61,7 @@ VOID ixheaace_detect_transient(FLOAT32 **ptr_energies, VOID ixheaace_detect_transient_4_1(FLOAT32 **ptr_energies, ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_det, - WORD32 *ptr_tran_vector, WORD32 time_step, - ixheaace_sbr_codec_type sbr_codec); + WORD32 *ptr_tran_vector, WORD32 time_step); VOID ixheaace_detect_transient_eld(FLOAT32 **ptr_energies, ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_det, diff --git a/encoder/ixheaace_sbr_tran_det_hp.c b/encoder/ixheaace_sbr_tran_det_hp.c index 2fb8846..539d620 100644 --- a/encoder/ixheaace_sbr_tran_det_hp.c +++ b/encoder/ixheaace_sbr_tran_det_hp.c @@ -162,8 +162,7 @@ VOID ixheaace_detect_transient(FLOAT32 **ptr_energies, } static VOID ixheaace_calc_thresholds_4_1(FLOAT32 **ptr_energies, WORD32 num_cols, WORD32 num_rows, - FLOAT32 *ptr_thresholds, - ixheaace_sbr_codec_type sbr_codec, WORD32 time_step) { + FLOAT32 *ptr_thresholds, WORD32 time_step) { FLOAT32 mean_val, std_val, thr; FLOAT32 *ptr_energy; FLOAT32 inv_num_cols = 1.0f / (FLOAT32)((num_cols + num_cols / 2) / time_step); @@ -207,7 +206,7 @@ static VOID ixheaace_extract_transient_candidates_4_1(FLOAT32 **ptr_energies, FLOAT32 *ptr_thresholds, FLOAT32 *ptr_transients, WORD32 num_cols, WORD32 start_band, WORD32 stop_band, - WORD32 buf_len, WORD32 time_step) + WORD32 time_step) { WORD32 idx; @@ -233,8 +232,7 @@ static VOID ixheaace_extract_transient_candidates_4_1(FLOAT32 **ptr_energies, VOID ixheaace_detect_transient_4_1(FLOAT32 **ptr_energies, ixheaace_pstr_sbr_trans_detector pstr_sbr_trans_det, - WORD32 *ptr_tran_vector, WORD32 time_step, - ixheaace_sbr_codec_type sbr_codec) { + WORD32 *ptr_tran_vector, WORD32 time_step) { WORD32 i; WORD32 no_cols = pstr_sbr_trans_det->no_cols; WORD32 qmf_start_sample = time_step * 4; @@ -246,12 +244,11 @@ VOID ixheaace_detect_transient_4_1(FLOAT32 **ptr_energies, ixheaace_calc_thresholds_4_1(ptr_energies, pstr_sbr_trans_det->no_cols, pstr_sbr_trans_det->no_rows, pstr_sbr_trans_det->ptr_thresholds, - sbr_codec, time_step); + time_step); ixheaace_extract_transient_candidates_4_1( ptr_energies, pstr_sbr_trans_det->ptr_thresholds, pstr_sbr_trans_det->ptr_transients, - pstr_sbr_trans_det->no_cols, 0, pstr_sbr_trans_det->no_rows, - pstr_sbr_trans_det->buffer_length, time_step); + pstr_sbr_trans_det->no_cols, 0, pstr_sbr_trans_det->no_rows, time_step); for (i = 0; i < no_cols; i++) { if ((ptr_trans[i] < 0.9f * ptr_trans[i - 1]) && (ptr_trans[i - 1] > int_thr)) { diff --git a/fuzzer/xaac_dec_fuzzer.cpp b/fuzzer/xaac_dec_fuzzer.cpp index 555ba29..98fd5c4 100644 --- a/fuzzer/xaac_dec_fuzzer.cpp +++ b/fuzzer/xaac_dec_fuzzer.cpp @@ -240,6 +240,10 @@ enum { DRC_BOOST_OFFSET, DRC_COMPRESS_OFFSET, DRC_EFFECT_OFFSET +#ifdef LOUDNESS_LEVELING_SUPPORT + , + DRC_LOUDNESS_LEVELING_OFFSET +#endif }; IA_ERRORCODE Codec::initXAACDrc(const uint8_t* data, size_t size) { @@ -295,6 +299,15 @@ IA_ERRORCODE Codec::initXAACDrc(const uint8_t* data, size_t size) { err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM, IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE, &ui_drc_val); +#ifdef LOUDNESS_LEVELING_SUPPORT + // DRC_LOUDNESS_LEVELING_FLAG + size_t flagOffset = std::min((size_t)DRC_LOUDNESS_LEVELING_OFFSET, size - 1); + uint8_t loudnessFlag = data[flagOffset]; + ui_drc_val = (unsigned int)loudnessFlag; + err_code = ixheaacd_dec_api(mXheaacCodecHandle, IA_API_CMD_SET_CONFIG_PARAM, + IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING, &ui_drc_val); +#endif + return IA_NO_ERROR; } diff --git a/fuzzer/xaac_enc_fuzzer.cpp b/fuzzer/xaac_enc_fuzzer.cpp index 530d6a1..4b11e8e 100644 --- a/fuzzer/xaac_enc_fuzzer.cpp +++ b/fuzzer/xaac_enc_fuzzer.cpp @@ -56,7 +56,10 @@ static VOID ixheaace_read_drc_config_params( WORD32 in_ch) { WORD32 n, g, s, m, ch, p; WORD32 gain_set_channels; - +#ifdef LOUDNESS_LEVELING_SUPPORT + UWORD32 loudness_leveling_extension_present = 0; + UWORD32 config_extension_count = 0; +#endif pstr_enc_params->gain_sequence_present = fuzzed_data->ConsumeBool(); pstr_enc_params->delay_mode = fuzzed_data->ConsumeBool(); pstr_uni_drc_config->sample_rate_present = fuzzed_data->ConsumeBool(); @@ -121,6 +124,13 @@ static VOID ixheaace_read_drc_config_params( pstr_drc_instructions_uni_drc->drc_instructions_type = fuzzed_data->ConsumeIntegral(); pstr_drc_instructions_uni_drc->mae_group_id = fuzzed_data->ConsumeIntegral(); pstr_drc_instructions_uni_drc->mae_group_preset_id = fuzzed_data->ConsumeIntegral(); +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_drc_instructions_uni_drc->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + pstr_drc_instructions_uni_drc->leveling_present = fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->ducking_only_set_present = fuzzed_data->ConsumeBool(); + loudness_leveling_extension_present = 1; + } +#endif } pstr_uni_drc_config->drc_coefficients_uni_drc_count = @@ -305,7 +315,13 @@ static VOID ixheaace_read_drc_config_params( pstr_enc_gain_extension->uni_drc_gain_ext_present = fuzzed_data->ConsumeBool(); if (pstr_uni_drc_config->uni_drc_config_ext_present) { +#ifdef LOUDNESS_LEVELING_SUPPORT + pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[config_extension_count] = + UNIDRC_CONF_EXT_V1; + config_extension_count++; +#else pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[0] = UNIDRC_CONF_EXT_V1; +#endif pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present = fuzzed_data->ConsumeBool(); if (pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present) { @@ -496,8 +512,23 @@ static VOID ixheaace_read_drc_config_params( pstr_drc_instructions_uni_drc->mae_group_id = fuzzed_data->ConsumeIntegral(); pstr_drc_instructions_uni_drc->mae_group_preset_id = fuzzed_data->ConsumeIntegral(); +#ifdef LOUDNESS_LEVELING_SUPPORT + + if (pstr_drc_instructions_uni_drc->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + pstr_drc_instructions_uni_drc->leveling_present = fuzzed_data->ConsumeBool(); + pstr_drc_instructions_uni_drc->ducking_only_set_present = fuzzed_data->ConsumeBool(); + loudness_leveling_extension_present = 1; + } +#endif } } +#ifdef LOUDNESS_LEVELING_SUPPORT + if (loudness_leveling_extension_present) { + pstr_uni_drc_config->str_uni_drc_config_ext + .uni_drc_config_ext_type[config_extension_count] = UNIDRCCONFEXT_LEVELING; + config_extension_count++; + } +#endif } } diff --git a/test/Android.bp b/test/Android.bp index 61a7c83..b534c2d 100644 --- a/test/Android.bp +++ b/test/Android.bp @@ -21,7 +21,8 @@ cc_test { "-DECLIPSE", "-DDRC_ENABLE", "-DMULTICHANNEL_ENABLE", - "-DENABLE_DRC" + "-DENABLE_DRC", + "-DLOUDNESS_LEVELING_SUPPORT", ], include_dirs: [ @@ -50,6 +51,7 @@ cc_test { cflags: [ "-O3", "-D_X86_", + "-DLOUDNESS_LEVELING_SUPPORT", ], include_dirs: [ diff --git a/test/decoder/impd_drc_config_params.h b/test/decoder/impd_drc_config_params.h index 36ca1fe..47f7873 100644 --- a/test/decoder/impd_drc_config_params.h +++ b/test/decoder/impd_drc_config_params.h @@ -44,7 +44,9 @@ #define IA_DRC_DEC_CONFIG_PARAM_APPLY_CROSSFADE 0x0017 #define IA_DRC_DEC_CONFIG_PARAM_CONFIG_CHANGED 0x0018 - +#ifdef LOUDNESS_LEVELING_SUPPORT +#define IA_DRC_DEC_CONFIG_DRC_LOUDNESS_LEVELING 0x0019 +#endif #define IA_API_CMD_SET_INPUT_BYTES_BS 0x0026 #define IA_API_CMD_SET_INPUT_BYTES_IC_BS 0x0027 #define IA_API_CMD_SET_INPUT_BYTES_IL_BS 0x0029 diff --git a/test/decoder/ixheaacd_error.c b/test/decoder/ixheaacd_error.c index 78b96ef..82d4b5a 100644 --- a/test/decoder/ixheaacd_error.c +++ b/test/decoder/ixheaacd_error.c @@ -75,7 +75,12 @@ pWORD8 ixheaacd_ppb_config_non_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Invalid target loudness value", (pWORD8) "Invalid HQ eSBR flag option. Setting to default 0", (pWORD8) "Invalid frame length flag option. Setting to default 0", - (pWORD8) "Invalid eSBR flag option. Setting to default 1"}; + (pWORD8) "Invalid eSBR flag option. Setting to default 1" +#ifdef LOUDNESS_LEVELING_SUPPORT + , + (pWORD8) "Invalid Loudness leveling flag option. Setting to default 1" +#endif +}; /* Fatal Errors */ pWORD8 ixheaacd_ppb_config_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Invalid Sample rate specified for RAW decoding"}; @@ -87,7 +92,12 @@ pWORD8 ixheaacd_ppb_config_fatal[IA_MAX_ERROR_SUB_CODE] = { pWORD8 ixheaacd_ppb_init_non_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Header not found at the beginning of input data continuing syncing", (pWORD8) "Invalid number of QMF bands", (pWORD8) "Decoder initialization failed", - (pWORD8) "Input bytes insufficient for decoding", (pWORD8) "Error in AAC decoding"}; + (pWORD8) "Input bytes insufficient for decoding", (pWORD8) "Error in AAC decoding" +#ifdef LOUDNESS_LEVELING_SUPPORT + , + (pWORD8) "DRC instruction count exceeded" +#endif +}; /* Fatal Errors */ pWORD8 ixheaacd_ppb_init_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "AAC Decoder initialization failed", diff --git a/test/decoder/ixheaacd_main.c b/test/decoder/ixheaacd_main.c index b7e6c8c..987baec 100644 --- a/test/decoder/ixheaacd_main.c +++ b/test/decoder/ixheaacd_main.c @@ -667,6 +667,17 @@ IA_ERRORCODE ixheaacd_set_config_param(WORD32 argc, pWORD8 argv[], _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); ec_enable = ui_err_conceal; } +#ifdef LOUDNESS_LEVELING_SUPPORT + /* For loudness leveling*/ + if (!strncmp((pCHAR8)argv[i], "-loudness_leveling:", 19)) { + pCHAR8 pb_arg_val = (pCHAR8)(argv[i] + 19); + UWORD32 loudness_leveling_flag = atoi(pb_arg_val); + err_code = (*p_ia_process_api)(p_ia_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, + IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING, + &loudness_leveling_flag); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + } +#endif } return IA_NO_ERROR; @@ -899,7 +910,9 @@ int ixheaacd_main_process(WORD32 argc, pWORD8 argv[]) { WORD32 drc_flag = 0; WORD32 mpegd_drc_present = 0; WORD32 uo_num_chan; - +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD32 i_loudness_leveling_flag = 1; +#endif /* The process API function */ IA_ERRORCODE(*p_ia_process_api) (pVOID p_ia_process_api_obj, WORD32 i_cmd, WORD32 i_idx, pVOID pv_value); @@ -1410,6 +1423,22 @@ int ixheaacd_main_process(WORD32 argc, pWORD8 argv[]) { _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); } +#ifdef LOUDNESS_LEVELING_SUPPORT + /*Set loudness leveling */ + + { + err_code = (*p_ia_process_api)(pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, + IA_XHEAAC_DEC_CONFIG_PARAM_DRC_LOUDNESS_LEVELING, + &i_loudness_leveling_flag); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + err_code = + ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, + IA_DRC_DEC_CONFIG_DRC_LOUDNESS_LEVELING, &i_loudness_leveling_flag); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + } +#endif + /*Set loud_norm_flag*/ { err_code = (*p_ia_process_api)( @@ -2238,6 +2267,9 @@ void print_usage() { printf("\n[-peak_limiter_off:]"); printf("\n[-err_conceal:]"); printf("\n[-esbr:]"); +#ifdef LOUDNESS_LEVELING_SUPPORT + printf("\n[-loudness_leveling:]"); +#endif printf("\n\nwhere, \n is the input AAC-LC/HE-AACv1/HE-AACv2//AAC-LD/AAC-ELD/AAC-ELDv2/USAC file name"); printf("\n is a text file which contains metadata."); printf("\n To be given when -mp4:1 is enabled"); @@ -2294,6 +2326,10 @@ void print_usage() { printf("\n is to enable / disable error concealment."); printf("\n Default value is 0"); printf("\n is to enable / disable eSBR. Default value is 1\n\n"); +#ifdef LOUDNESS_LEVELING_SUPPORT + printf("\n is to enable / disable loudness leveling."); + printf("\n Default value is 1"); +#endif } /*******************************************************************************/ diff --git a/test/decoder/xaacdec.cmake b/test/decoder/xaacdec.cmake index 51f8fed..f849989 100644 --- a/test/decoder/xaacdec.cmake +++ b/test/decoder/xaacdec.cmake @@ -15,13 +15,13 @@ if(MSVC) xaacdec PROPERTIES COMPILE_FLAGS - "-UARM_PROFILE_HW -UARM_PROFILE_BOARD -DDRC_ENABLE -DMULTICHANNEL_ENABLE -DECLIPSE -DWIN32 -D_CRT_SECURE_NO_WARNINGS" + "-UARM_PROFILE_HW -UARM_PROFILE_BOARD -DDRC_ENABLE -DMULTICHANNEL_ENABLE -DECLIPSE -DWIN32 -D_CRT_SECURE_NO_WARNINGS -DLOUDNESS_LEVELING_SUPPORT" ) else() set_target_properties( xaacdec PROPERTIES COMPILE_FLAGS - "-UARM_PROFILE_HW -UARM_PROFILE_BOARD -DDRC_ENABLE -DMULTICHANNEL_ENABLE -DECLIPSE -DWIN32" + "-UARM_PROFILE_HW -UARM_PROFILE_BOARD -DDRC_ENABLE -DMULTICHANNEL_ENABLE -DECLIPSE -DWIN32 -DLOUDNESS_LEVELING_SUPPORT" ) endif() diff --git a/test/encoder/impd_drc_config_params.txt b/test/encoder/impd_drc_config_params.txt index a5cb59f..da7e9a1 100644 --- a/test/encoder/impd_drc_config_params.txt +++ b/test/encoder/impd_drc_config_params.txt @@ -1,3 +1,8 @@ +#In order to support DRC AMD-2(ISO/IEC 23003-4:2020/Amd. 2:2023(E)), `leveling_present` and `ducking_only_set` fields are introduced in DRC config file. +#For a given DRC effect, when both `leveling_present` and `ducking_only_set` are set to 1, automatically the next drc instruction is treated as ducking only set. +#For example, if the second DRC effect is marked as 2048/4096 with `leveling_present` is set to 1 and `ducking_only_set` is set to 1, then the third DRC effect will be treated as ducking-only. +#For the last drc instruction, `leveling_present` and `ducking_only_set` fields are ignored and reset to 0. Maximum supported instructions are 8. + #####str_drc_instructions_uni_drc##### drc_instructions_uni_drc_count:0 #####str_drc_coefficients_uni_drc##### @@ -28,10 +33,9 @@ attack:2.0 decay:5.0 #end gain parameters #####str_drc_instructions_uni_drc_v1##### -drc_instructions_uni_drc_count:8 +drc_instructions_uni_drc_count_v1:3 #n=0 downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ drc_set_effect:0x0001 gain_set_channels:8 gain_set_index:0 @@ -45,8 +49,7 @@ gain_set_index:0 num_drc_channel_groups:1 #n=1 downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0002 +drc_set_effect:0x800 gain_set_channels:8 gain_set_index:0 gain_set_index:0 @@ -57,80 +60,13 @@ gain_set_index:0 gain_set_index:0 gain_set_index:0 num_drc_channel_groups:1 +#leveling present flag +leveling_present:1 +#if ducking_only_set is one next drc instruction's set effect is set to 0x800 (ducking/leveling self) +ducking_only_set:1 #n=2 downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0004 -gain_set_channels:8 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -num_drc_channel_groups:1 -#n=3 -downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0008 -gain_set_channels:8 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -num_drc_channel_groups:1 -#n=4 -downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0010 -gain_set_channels:8 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -num_drc_channel_groups:1 -#n=5 -downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0020 -gain_set_channels:8 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -num_drc_channel_groups:1 -#n=6 -downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0040 -gain_set_channels:8 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -gain_set_index:0 -num_drc_channel_groups:1 -#n=7 -downmix_id:0 -#Different drc_effect values are present in impeghe_drc_uni_drc.h file with prefix EFFECT_BIT_ -drc_set_effect:0x0080 +drc_set_effect:0x0800 gain_set_channels:8 gain_set_index:0 gain_set_index:0 diff --git a/test/encoder/impd_drc_user_config.c b/test/encoder/impd_drc_user_config.c index 7f2969f..037d15a 100644 --- a/test/encoder/impd_drc_user_config.c +++ b/test/encoder/impd_drc_user_config.c @@ -92,7 +92,10 @@ VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_en pstr_uni_drc_config->sample_rate_present = 1; pstr_uni_drc_config->str_drc_coefficients_uni_drc->drc_frame_size_present = 0; pstr_uni_drc_config->loudness_info_set_present = 1; - +#ifdef LOUDNESS_LEVELING_SUPPORT + WORD16 loudness_leveling_extension_present = 0; + UWORD32 config_extension_count = 0; +#endif /*********** str_drc_instructions_uni_drc *************/ pstr_uni_drc_config->drc_instructions_uni_drc_count = impd_drc_get_integer_value(fp); @@ -145,8 +148,15 @@ VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_en pstr_drc_instructions_uni_drc->drc_instructions_type = 0; pstr_drc_instructions_uni_drc->mae_group_id = 0; pstr_drc_instructions_uni_drc->mae_group_preset_id = 0; - } +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_drc_instructions_uni_drc->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + pstr_drc_instructions_uni_drc->leveling_present = impd_drc_get_integer_value(fp); + pstr_drc_instructions_uni_drc->ducking_only_set_present = impd_drc_get_integer_value(fp); + loudness_leveling_extension_present = 1; + } +#endif // LOUDNESS_LEVELING_SUPPORT + } /*********** str_drc_coefficients_uni_drc *************/ pstr_uni_drc_config->drc_coefficients_uni_drc_count = impd_drc_get_integer_value(fp); @@ -247,7 +257,13 @@ VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_en pstr_uni_drc_config->uni_drc_config_ext_present = 1; if (pstr_uni_drc_config->uni_drc_config_ext_present) { +#ifdef LOUDNESS_LEVELING_SUPPORT + pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[config_extension_count] = + UNIDRC_CONF_EXT_V1; + config_extension_count++; +#else pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[0] = UNIDRC_CONF_EXT_V1; +#endif pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present = 1; if (pstr_uni_drc_config->str_uni_drc_config_ext.downmix_instructions_v1_present) { @@ -420,9 +436,25 @@ VOID ixheaace_read_drc_config_params(FILE *fp, ia_drc_enc_params_struct *pstr_en pstr_drc_instructions_uni_drc->drc_instructions_type = 0; pstr_drc_instructions_uni_drc->mae_group_id = 0; pstr_drc_instructions_uni_drc->mae_group_preset_id = 0; +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_drc_instructions_uni_drc->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + pstr_drc_instructions_uni_drc->leveling_present = impd_drc_get_integer_value(fp); + pstr_drc_instructions_uni_drc->ducking_only_set_present = + impd_drc_get_integer_value(fp); + loudness_leveling_extension_present = 1; + } +#endif // LOUDNESS_LEVELING_SUPPORT } } } + +#ifdef LOUDNESS_LEVELING_SUPPORT + if (loudness_leveling_extension_present) { + pstr_uni_drc_config->str_uni_drc_config_ext.uni_drc_config_ext_type[config_extension_count] = + UNIDRCCONFEXT_LEVELING; + config_extension_count++; + } +#endif pstr_enc_loudness_info_set->loudness_info_set_ext_present = 0; pstr_enc_gain_extension->uni_drc_gain_ext_present = 0; } diff --git a/test/encoder/ixheaace_testbench.c b/test/encoder/ixheaace_testbench.c index 6260b90..7b6290d 100644 --- a/test/encoder/ixheaace_testbench.c +++ b/test/encoder/ixheaace_testbench.c @@ -577,6 +577,20 @@ static VOID ixheaace_print_drc_config_params(ixheaace_input_config *pstr_input_c pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].limiter_peak_target) { flag = 1; } +#ifdef LOUDNESS_LEVELING_SUPPORT + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].drc_set_effect != + pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].drc_set_effect) { + flag = 1; + } + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].leveling_present != + pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].leveling_present) { + flag = 1; + } + if (pstr_uni_drc_config->str_drc_instructions_uni_drc[i].ducking_only_set_present != + pstr_uni_drc_config_user->str_drc_instructions_uni_drc[i].ducking_only_set_present) { + flag = 1; + } +#endif } if (flag == 1) { printf("\nDRC : Invalid config str_drc_instructions_uni_drc"); @@ -653,6 +667,33 @@ static VOID ixheaace_print_drc_config_params(ixheaace_input_config *pstr_input_c printf("\nDRC : Invalid config: str_drc_coefficients_uni_drc"); flag = 0; } +#ifdef LOUDNESS_LEVELING_SUPPORT + ia_drc_uni_drc_config_ext_struct *pstr_uni_drc_config_ext = + &pstr_uni_drc_config->str_uni_drc_config_ext; + ia_drc_uni_drc_config_ext_struct *pstr_uni_drc_config_ext_user = + &pstr_uni_drc_config_user->str_uni_drc_config_ext; + + for (i = 0; i < pstr_uni_drc_config_ext->drc_instructions_uni_drc_v1_count; i++) { + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].drc_set_effect != + pstr_uni_drc_config_ext_user->str_drc_instructions_uni_drc_v1[i].drc_set_effect) { + flag = 1; + } + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].leveling_present != + pstr_uni_drc_config_ext_user->str_drc_instructions_uni_drc_v1[i].leveling_present) { + flag = 1; + } + if (pstr_uni_drc_config_ext->str_drc_instructions_uni_drc_v1[i].ducking_only_set_present != + pstr_uni_drc_config_ext_user->str_drc_instructions_uni_drc_v1[i] + .ducking_only_set_present) { + flag = 1; + } + } + + if (flag == 1) { + printf("\nDRC : Invalid config str_drc_instructions_uni_drc_v1"); + flag = 0; + } +#endif for (i = 0; i < pstr_enc_loudness_info_set->loudness_info_count; i++) { if (pstr_enc_loudness_info_set->str_loudness_info[i].sample_peak_level != pstr_enc_loudness_info_set_user->str_loudness_info[i].sample_peak_level) { diff --git a/test/encoder/xaacenc.cmake b/test/encoder/xaacenc.cmake index a7930d2..edf6b45 100644 --- a/test/encoder/xaacenc.cmake +++ b/test/encoder/xaacenc.cmake @@ -18,12 +18,12 @@ if (MSVC) xaacenc PROPERTIES COMPILE_FLAGS - "-D_CRT_SECURE_NO_WARNINGS -D_X86_") + "-D_CRT_SECURE_NO_WARNINGS -D_X86_ -DLOUDNESS_LEVELING_SUPPORT") else() set_target_properties( xaacenc PROPERTIES COMPILE_FLAGS - "-D_X86_ -c -O3 -Wall -Wsequence-point -Wunused-function" + "-D_X86_ -c -O3 -Wall -Wsequence-point -Wunused-function -DLOUDNESS_LEVELING_SUPPORT" ) endif() From 1f798f1cc5b784fcc5af8777e0c7c2e7da5620db Mon Sep 17 00:00:00 2001 From: ShashankPathmudi <146080254+ShashankPathmudi@users.noreply.github.com> Date: Wed, 30 Jul 2025 12:13:09 +0530 Subject: [PATCH 02/27] Fix for UBSAN issue observed with libxaac decoder (#98) * Fix for UBSAN issue observed with libxaac decoder Significance: - This change propogates the error returned from ixheaacd_heaac_mps_apply to ixheaacd_dec_execute. Testing: - All previous fuzzer crashes are tested. No crash observed. - CTS and Conformance for x86, x86_64, armv7 and armv8 are passing. * Fix for UBSAN issue observed with libxaac Decoder Significance: - Comparison is made against IA_NO_ERROR using 'not equal to', instead of checking for equality with IA_FATAL_ERROR Testing: - All previous fuzzer crashes are tested. No crash observed. - CTS and Conformance for x86, x86_64, armv7 and armv8 are passing. --- decoder/ixheaacd_api.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 31157d2..5e6a0ac 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -3676,9 +3676,12 @@ IA_ERRORCODE ixheaacd_dec_execute( p_obj_exhaacplus_dec->p_state_aac->heaac_mps_handle.ec_flag = p_obj_exhaacplus_dec->aac_config.ui_err_conceal; - ixheaacd_heaac_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer, - mps_buffer, - p_state_enhaacplus_dec->ui_mps_out_bytes); + error_code = ixheaacd_heaac_mps_apply(p_obj_exhaacplus_dec, actual_out_buffer, mps_buffer, + p_state_enhaacplus_dec->ui_mps_out_bytes); + + if (error_code != IA_NO_ERROR) { + return error_code; + } p_state_enhaacplus_dec->heaac_mps_handle.mps_decode = 1; p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes = From 433d6c3eb6d5177fecf2cf34bff84c8f434f6d55 Mon Sep 17 00:00:00 2001 From: wrapper Date: Mon, 4 Aug 2025 20:50:17 +0700 Subject: [PATCH 03/27] fix ASC, fix full bandwidth for non USAC --- encoder/ixheaace_asc_write.c | 16 +++++++--------- encoder/ixheaace_enc_init.c | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/encoder/ixheaace_asc_write.c b/encoder/ixheaace_asc_write.c index 3bf2736..356dc11 100644 --- a/encoder/ixheaace_asc_write.c +++ b/encoder/ixheaace_asc_write.c @@ -412,6 +412,7 @@ WORD32 ixheaace_get_audiospecific_config_bytes( pstr_audio_specific_config->sampling_frequency /= 2; if ((AOT_SBR == aot) || (AOT_PS == aot)) { + ext_aot = aot; aot = AOT_AAC_LC; } } @@ -460,9 +461,12 @@ WORD32 ixheaace_get_audiospecific_config_bytes( bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, (pstr_audio_specific_config->channel_configuration), 4); + if (ext_aot != -1) aot = ext_aot; + if ((AOT_SBR == aot) || (AOT_PS == aot)) { ext_aot = AOT_SBR; sbr_present_flag = 1; + tmp = 0x0f; for (i = 0; i < sizeof(ia_sampl_freq_table) / sizeof(ia_sampl_freq_table[0]); i++) { if (ia_sampl_freq_table[i] == pstr_audio_specific_config->ext_sampling_frequency) { @@ -470,18 +474,12 @@ WORD32 ixheaace_get_audiospecific_config_bytes( break; } } + pstr_audio_specific_config->ext_samp_freq_index = (UWORD32)tmp; - bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, - (pstr_audio_specific_config->ext_samp_freq_index), 4); - if (pstr_audio_specific_config->ext_samp_freq_index == 0xf) { - bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, - (pstr_audio_specific_config->ext_sampling_frequency), 24); - } + if (AOT_PS == aot) { ps_present_flag = 1; } - - bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, AOT_AAC_LC, 5); } switch (aot) { case AOT_AAC_ELD: { @@ -506,7 +504,7 @@ WORD32 ixheaace_get_audiospecific_config_bytes( ext_id = 0x2b7; bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, ext_id, 11); - bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, aot, 5); + bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, ext_aot, 5); bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, sbr_present_flag, 1); if (sbr_present_flag) { bit_cnt += iusace_write_bits_buf(pstr_it_bit_buff, diff --git a/encoder/ixheaace_enc_init.c b/encoder/ixheaace_enc_init.c index dc6ba74..da43291 100644 --- a/encoder/ixheaace_enc_init.c +++ b/encoder/ixheaace_enc_init.c @@ -374,7 +374,7 @@ IA_ERRORCODE ia_enhaacplus_enc_aac_enc_open(iexheaac_encoder_str **ppstr_exheaac WORD32 tns_mask = config.use_tns; if (config.full_bandwidth) { - pstr_exheaac_encoder->config.band_width = config.core_sample_rate >> 2; + pstr_exheaac_encoder->config.band_width = config.core_sample_rate >> (aot == AOT_USAC ? 2 : 1); } else { ixheaace_determine_bandwidth(pstr_exheaac_encoder->config.band_width, config.bit_rate, config.core_sample_rate, pstr_element_info->n_channels_in_el, From 17b657d7c3ff4ef8950e75016821d792669227b8 Mon Sep 17 00:00:00 2001 From: wrapper Date: Mon, 4 Aug 2025 20:52:12 +0700 Subject: [PATCH 04/27] 32-bit floating point samples, adjustable bandwidth --- encoder/ixheaace_api.c | 25 +++++++++++++++---------- encoder/ixheaace_write_adts_adif.c | 2 +- test/encoder/ixheaace_testbench.c | 7 +++++++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/encoder/ixheaace_api.c b/encoder/ixheaace_api.c index 6d5c47e..406026a 100644 --- a/encoder/ixheaace_api.c +++ b/encoder/ixheaace_api.c @@ -831,7 +831,7 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str return err_code; } - if (pstr_input_config->ui_pcm_wd_sz != 16) { + if (pstr_input_config->ui_pcm_wd_sz != 16 && pstr_input_config->ui_pcm_wd_sz != 32) { return (IA_EXHEAACE_CONFIG_FATAL_PCM_WDSZ); } if ((pstr_input_config->aac_config.inv_quant != 0) && @@ -1213,6 +1213,8 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str } pstr_api_struct->config[0].aac_config.full_bandwidth = pstr_input_config->aac_config.full_bandwidth; + pstr_api_struct->config[0].aac_config.band_width = + pstr_input_config->aac_config.bandwidth; } return IA_NO_ERROR; @@ -2692,6 +2694,7 @@ static IA_ERRORCODE ia_enhaacplus_enc_execute(ixheaace_api_struct *pstr_api_stru iexheaac_encoder_str **pstr_aac_enc; iaace_config *pstr_aac_config; pWORD16 pw_inp_buf = NULL; + pFLOAT32 pw_inp_buf_float = NULL; pUWORD8 pub_out_buf = NULL; FLOAT32 *ptr_input_buffer = NULL; FLOAT32 *ptr_input_buffer_mps = NULL; @@ -2729,6 +2732,8 @@ static IA_ERRORCODE ia_enhaacplus_enc_execute(ixheaace_api_struct *pstr_api_stru pstr_aac_enc = pstr_api_struct->pstr_state->aac_enc_pers_mem; pw_inp_buf = (pWORD16)pstr_api_struct->pp_mem[IA_ENHAACPLUSENC_INPUT_IDX]; + pw_inp_buf_float = (pFLOAT32)pstr_api_struct->pp_mem[IA_ENHAACPLUSENC_INPUT_IDX]; + if (ele_idx == 0) { pstr_api_struct->pstr_state->i_out_bytes = 0; pub_out_buf = ((pUWORD8)pstr_api_struct->pp_mem[IA_ENHAACPLUSENC_OUTPUT_IDX]); @@ -2851,25 +2856,25 @@ static IA_ERRORCODE ia_enhaacplus_enc_execute(ixheaace_api_struct *pstr_api_stru (!((pstr_api_struct->pstr_mps_212_enc != NULL) && pstr_api_struct->pstr_state->mps_enable))) { for (idx = 0; idx < (num_samples_read); idx++) { - ptr_input_buffer[write_off_set + idx] = (FLOAT32)pw_inp_buf[idx]; + ptr_input_buffer[write_off_set + idx] = pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[idx] : (pw_inp_buf_float[idx] * 32767); } } else if (pstr_api_struct->config[ele_idx].i_channels == 1) { for (idx = 0; idx < num_samples_read; idx++) { ptr_input_buffer[write_off_set + (IXHEAACE_MAX_CH_IN_BS_ELE * idx)] = - (FLOAT32)pw_inp_buf[idx]; + pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[idx] : (pw_inp_buf_float[idx] * 32767); } } else if ((pstr_api_struct->pstr_mps_212_enc != NULL) && pstr_api_struct->pstr_state->mps_enable) { ptr_input_buffer_mps = pstr_api_struct->pstr_state->time_signal_mps; for (idx = 0; idx < (num_samples_read / 2); idx++) { - ptr_input_buffer_mps[idx] = (FLOAT32)pw_inp_buf[2 * idx]; + ptr_input_buffer_mps[idx] = pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[2 * idx] : (pw_inp_buf_float[2 * idx] * 32767); ptr_input_buffer_mps[(num_samples_read / 2) + idx] = - (FLOAT32)pw_inp_buf[(2 * idx) + 1]; + pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[(2 * idx) + 1] : (pw_inp_buf_float[(2 * idx) + 1] * 32767); } } } else { for (idx = 0; idx < (num_samples_read + write_off_set); idx++) { - ptr_input_buffer[idx] = (FLOAT32)pw_inp_buf[idx]; + ptr_input_buffer[idx] = pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[idx] : (pw_inp_buf_float[idx] * 32767); } } } else { @@ -2877,9 +2882,9 @@ static IA_ERRORCODE ia_enhaacplus_enc_execute(ixheaace_api_struct *pstr_api_stru slot = pstr_api_struct->config[ele_idx].element_slot; for (idx = 0; idx < num_samples_read / 2; idx++) { ptr_input_buffer[2 * idx + write_off_set] = - (FLOAT32)pw_inp_buf[total_channels * idx + slot]; + pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[total_channels * idx + slot] : (pw_inp_buf_float[total_channels * idx + slot] * 32767); ptr_input_buffer[2 * idx + write_off_set + 1] = - (FLOAT32)pw_inp_buf[total_channels * idx + slot + 1]; + pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[total_channels * idx + slot + 1] : (pw_inp_buf_float[total_channels * idx + slot + 1] * 32767); } } @@ -2887,14 +2892,14 @@ static IA_ERRORCODE ia_enhaacplus_enc_execute(ixheaace_api_struct *pstr_api_stru slot = pstr_api_struct->config[ele_idx].element_slot; for (idx = 0; idx < num_samples_read; idx++) { ptr_input_buffer[write_off_set + (IXHEAACE_MAX_CH_IN_BS_ELE * idx)] = - (FLOAT32)pw_inp_buf[total_channels * idx + slot]; + pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[total_channels * idx + slot] : (pw_inp_buf_float[total_channels * idx + slot] * 32767); } } if (pstr_api_struct->config[ele_idx].i_channels == 6) { ptr_input_buffer_mps = pstr_api_struct->pstr_state->time_signal_mps; for (idx = 0; idx < num_samples_read; idx++) { - ptr_input_buffer_mps[idx] = (FLOAT32)pw_inp_buf[idx]; + ptr_input_buffer_mps[idx] = pstr_api_struct->config->ui_pcm_wd_sz == 16 ? (FLOAT32)pw_inp_buf[idx] : (pw_inp_buf_float[idx] * 32767); } } } diff --git a/encoder/ixheaace_write_adts_adif.c b/encoder/ixheaace_write_adts_adif.c index 2cda5bb..0442ef8 100644 --- a/encoder/ixheaace_write_adts_adif.c +++ b/encoder/ixheaace_write_adts_adif.c @@ -310,7 +310,7 @@ WORD32 ia_enhaacplus_enc_write_ADTS_header(pUWORD8 buffer, WORD32 bytes_used, WO if (write_flag) { /* Fixed ADTS header */ ia_enhaacplus_enc_putbit(pstr_bitstream, 0xFFFF, 12); /* 12 bit Syncword */ - ia_enhaacplus_enc_putbit(pstr_bitstream, 1 /*aacStateStruct->aacConfigSturct.mpegVersion*/, + ia_enhaacplus_enc_putbit(pstr_bitstream, 0 /*aacStateStruct->aacConfigSturct.mpegVersion*/, 1); /* ID == 0 for MPEG4 AAC, 1 for MPEG2 AAC */ ia_enhaacplus_enc_putbit(pstr_bitstream, 0, 2); /* layer == 0 */ ia_enhaacplus_enc_putbit(pstr_bitstream, 1, 1); /* protection absent */ diff --git a/test/encoder/ixheaace_testbench.c b/test/encoder/ixheaace_testbench.c index 7b6290d..624a9da 100644 --- a/test/encoder/ixheaace_testbench.c +++ b/test/encoder/ixheaace_testbench.c @@ -218,6 +218,7 @@ void ia_enhaacplus_enc_print_usage() { printf("\n[-aot:]"); printf("\n[-esbr:]"); printf("\n[-full_bandwidth:]"); + printf("\n[-bandwidth:]"); printf("\n[-max_out_buffer_per_ch:]"); printf("\n[-tree_cfg:]"); printf("\n[-usac:]"); @@ -269,6 +270,7 @@ void ia_enhaacplus_enc_print_usage() { printf( "\n Enable use of full bandwidth of input. Valid values are " "0(disable full bandwidth) and 1(enable full bandwidth). Default is 0."); + printf("\n specifies the bandwidth for the input (cutoff). Default is 0."); printf("\n is the maximum size of bit reservoir to be used."); printf( "\n Valid values are from -1 to 6144. -1 will omit use of bit reservoir. Default is " @@ -362,6 +364,11 @@ static VOID ixheaace_parse_config_param(WORD32 argc, pWORD8 argv[], pVOID ptr_en char *pb_arg_val = (char *)argv[i] + 16; pstr_enc_api->input_config.aac_config.full_bandwidth = atoi(pb_arg_val); } + /* Bandwidth */ + if (!strncmp((const char *)argv[i], "-bandwidth:", 11)) { + char *pb_arg_val = (char *)argv[i] + 11; + pstr_enc_api->input_config.aac_config.bandwidth = atoi(pb_arg_val); + } /* frame size */ if (!strncmp((const char *)argv[i], "-framesize:", 11)) { char *pb_arg_val = (char *)argv[i] + 11; From 07e7c9dde81e483f25c285c00721ccb764f22ca4 Mon Sep 17 00:00:00 2001 From: wrapper Date: Wed, 6 Aug 2025 19:24:37 +0700 Subject: [PATCH 05/27] floating --- decoder/ixheaacd_api.c | 2 +- decoder/ixheaacd_decode_main.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 5e6a0ac..c4ae8e0 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -579,7 +579,7 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd, break; } case IA_XHEAAC_DEC_CONFIG_PARAM_PCM_WDSZ: { - if ((*pui_value != 16) && (*pui_value != 24)) { + if ((*pui_value != 16) && (*pui_value != 24) && (*pui_value != 32)) { p_obj_exhaacplus_dec->aac_config.ui_pcm_wdsz = 16; return (IA_XHEAAC_DEC_CONFIG_NONFATAL_INVALID_PCM_WDSZ); } diff --git a/decoder/ixheaacd_decode_main.c b/decoder/ixheaacd_decode_main.c index 982a6aa..d827687 100644 --- a/decoder/ixheaacd_decode_main.c +++ b/decoder/ixheaacd_decode_main.c @@ -88,6 +88,7 @@ VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, FLOAT32 write_local_float; WORD16 *out_buf = (WORD16 *)outbuffer; + FLOAT32 *out_buf_float = (FLOAT32 *)outbuffer; num = num_channel_out * num_samples_out; @@ -105,6 +106,20 @@ VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, } *out_bytes = num * sizeof(WORD16); + } else if (pcmsize == 32) { + for (i = 0; i < num; i++) { + write_local_float = + (out_samples[i % num_channel_out][i / num_channel_out]); + + if (write_local_float > 32767.0f) { + write_local_float = 32767.0f; + } else if (write_local_float < -32768.0f) { + write_local_float = -32768.0f; + } + out_buf_float[i] = write_local_float / 32767; + } + + *out_bytes = num * sizeof(FLOAT32); } else { WORD8 *out_24bit = (WORD8 *)out_buf; for (i = 0; i < num; i++) { From 56a15e2211a82b0f3e3b5635c30291ee302fc7a5 Mon Sep 17 00:00:00 2001 From: wrapper Date: Sat, 9 Aug 2025 23:06:33 +0700 Subject: [PATCH 06/27] disable sample rate limit --- encoder/ixheaace_sbr_main.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 893d215..2089c8b 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -386,6 +386,7 @@ ixheaace_is_sbr_setting_available(UWORD32 bitrate, UWORD32 num_output_channels, WORD32 idx_ch; WORD32 idx_entry; +#if 0 switch (num_output_channels) { case MONO: if (sample_rate_input < 16000 || sample_rate_input > 48000) { @@ -396,6 +397,7 @@ ixheaace_is_sbr_setting_available(UWORD32 bitrate, UWORD32 num_output_channels, return 0; } } +#endif *ptr_core_sr = sample_rate_input / 2; From 3d995a0119a8b6bd781b5c831942b9c28d2e948c Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 10 Aug 2025 10:09:01 +0700 Subject: [PATCH 07/27] new encode tables --- encoder/ixheaace_api.c | 2 + encoder/ixheaace_rom.c | 43 +++++++ encoder/ixheaace_sbr_main.c | 2 +- encoder/ixheaace_sbr_rom.c | 232 ++++++++++++++++++++++++++++++++++++ 4 files changed, 278 insertions(+), 1 deletion(-) diff --git a/encoder/ixheaace_api.c b/encoder/ixheaace_api.c index 406026a..22fe7e4 100644 --- a/encoder/ixheaace_api.c +++ b/encoder/ixheaace_api.c @@ -901,6 +901,7 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str (AOT_AAC_ELD == pstr_input_config->aot)) { pstr_api_struct->config[ele_idx].aac_classic = 0; } +#ifndef AAC_NEW_TABLES if (pstr_api_struct->config[ele_idx].sample_rate < 32000) { if (pstr_api_struct->config[ele_idx].aac_classic == 0) { pstr_api_struct->config[ele_idx].aac_classic = 1; @@ -912,6 +913,7 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str pstr_input_config->aot = AOT_AAC_LD; } } +#endif pstr_api_struct->config[ele_idx].eldsbr_found = !(pstr_api_struct->config[ele_idx].aac_classic); } diff --git a/encoder/ixheaace_rom.c b/encoder/ixheaace_rom.c index 532fee9..732e64a 100644 --- a/encoder/ixheaace_rom.c +++ b/encoder/ixheaace_rom.c @@ -1620,6 +1620,7 @@ const ixheaace_temporal_noise_shaping_tables ixheaace_enhaacplus_enc_tns_tab = { {8000, 39, 14, 39, 14, 31, 30}}, /*tns_info_tab[5]*/ +#ifndef AAC_NEW_TABLES {{4000, 12000, {1.2f, 1800, 16000, 0.6f}, @@ -1654,7 +1655,49 @@ const ixheaace_temporal_noise_shaping_tables ixheaace_enhaacplus_enc_tns_tab = { {1.41f, 3750, 16000, 0.3f}, {1.41f, 2500, 16000, 0.5f}, {1.41f, 3750, 16000, 0.3f}}}, +#else + {{4000, + 12000, + {1.2f, 1800, 16000, 0.6f}, + {1.2f, 2500, 16000, 0.6f}, + {1.2f, 1800, 16000, 0.6f}, + {1.2f, 2500, 16000, 0.6f}}, + {12001, + 20000, + {1.41f, 2500, 16000, 0.6f}, + {1.41f, 3750, 16000, 0.6f}, + {1.41f, 2500, 16000, 0.6f}, + {1.41f, 3750, 16000, 0.6f}}, + + {20001, + 28000, + {1.41f, 2500, 16000, 0.5f}, + {1.41f, 3750, 16000, 0.5f}, + {1.41f, 2500, 16000, 0.5f}, + {1.41f, 3750, 16000, 0.5f}}, + + {28001, + 36000, + {1.41f, 2500, 16000, 0.8f}, + {1.41f, 3750, 16000, 0.3f}, + {1.41f, 2500, 16000, 0.5f}, + {1.41f, 3750, 16000, 0.3f}}, + + {36001, + 52000, + {1.41f, 2500, 16000, 0.5f}, + {1.41f, 3750, 16000, 0.1f}, + {1.41f, 2500, 16000, 0.5f}, + {1.41f, 3750, 16000, 0.1f}}, + + {52001, + 576000, + {1.41f, 2500, 16000, 0.3f}, + {1.41f, 3750, 16000, 0.1f}, + {1.41f, 2500, 16000, 0.3f}, + {1.41f, 3750, 16000, 0.1f}}}, +#endif /*tns_coeff_3[8]*/ {-0.98480773f, -0.866025389f, -0.642787576f, -0.342020154f, 0.0f, 0.433883727f, 0.781831503f, diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 2089c8b..522870d 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -386,7 +386,7 @@ ixheaace_is_sbr_setting_available(UWORD32 bitrate, UWORD32 num_output_channels, WORD32 idx_ch; WORD32 idx_entry; -#if 0 +#ifndef AAC_NEW_TABLES switch (num_output_channels) { case MONO: if (sample_rate_input < 16000 || sample_rate_input > 48000) { diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 90e94c5..5ecdc6c 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -621,6 +621,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {0.05857864376269f, 0.2f, 0.34142135623731f, 0.4f}, {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000}, +#ifndef AAC_NEW_TABLES {{{{8000, 10000, {7, 11}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {10000, 12000, {11, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {12000, 48001, {14, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -738,6 +739,237 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {0}}} }, +#else + {{{ + /*** 8000hz 1ch ***/ + {8000, 10000, {7, 11}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {10000, 12000, {11, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {14, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 24000, {14, 14}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {24000, 32000, {14, 14}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {32000, 48001, {14, 15}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 8000hz 2ch ***/ + {16000, 24000, {6, 9}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {9, 11}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {11, 11}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {13, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {14, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 11025hz 1ch ***/ + {8000, 10000, {5, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {10000, 12000, {8, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {12, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 20000, {12, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {20000, 24000, {13, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {24000, 32000, {14, 14}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {32000, 48000, {15, 15}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {48000, 64001, {15, 15}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 11025hz 2ch ***/ + {16000, 24000, {7, 9}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {10, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {12, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {13, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {14, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 12000hz 1ch ***/ + {8000, 10000, {4, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {10000, 12000, {7, 11}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {11, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 20000, {11, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {20000, 24000, {12, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {24000, 32000, {13, 13}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {32000, 48000, {14, 14}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {48000, 64001, {15, 15}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 12000hz 2ch ***/ + {16000, 24000, {6, 9}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {9, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {11, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {12, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {13, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {14, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 16000hz 1ch ***/ + {6000, 8000, {0, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {8000, 10000, {1, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {10000, 12000, {2, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {4, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 18000, {4, 8}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {18000, 22000, {6, 11}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {22000, 28000, {10, 12}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {28000, 36000, {12, 13}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 44000, {14, 13}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 64001, {15, 13}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 16000hz 2ch ***/ + {16000, 24000, {4, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {8, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {10, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {13, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {15, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 22050hz 1ch ***/ + {8000, 11369, {1, 1}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {11369, 16000, {3, 4}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 18000, {3, 5}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {18000, 22000, {4, 8}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {22000, 28000, {7, 8}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {28000, 36000, {10, 9}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 44000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 52000, {13, 11}, 1, {2, 0, 0}, IXHEAACE_SBR_MODE_MONO}, + {52000, 68000, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {68000, 96001, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 22050hz 2ch ***/ + {16000, 24000, {2, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {5, 6}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 32000, {5, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {32000, 36000, {7, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {10, 9}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {12, 9}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {13, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 101000, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {101000, 128001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 24000hz 1ch ***/ + {8000, 12000, {1, 1}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {3, 4}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 18000, {3, 5}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {18000, 22000, {4, 8}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {22000, 28000, {7, 8}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {28000, 36000, {10, 9}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 44000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 52000, {13, 11}, 1, {3, 0, 0}, IXHEAACE_SBR_MODE_MONO}, + {52000, 68000, {15, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {68000, 96001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 24000hz 2ch ***/ + {16000, 24000, {2, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {5, 6}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {7, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {10, 9}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {12, 9}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {13, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 128001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 32000hz 1ch ***/ + {24000, 36000, {4, 4}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 60000, {7, 6}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 8}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {72000, 100000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 160001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 32000hz 2ch ***/ + {32000, 60000, {4, 4}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {11, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {12, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {13, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 256001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 44100hz 1ch ***/ + {12000, 16000, {0, 0}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {16000, 22000, {1, 1}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {22000, 30000, {2, 3}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {30000, 36000, {4, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 40000, {5, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {40000, 48000, {6, 5}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {48000, 60000, {7, 6}, 1, {3, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 6}, 1, {3, 0, 0}, IXHEAACE_SBR_MODE_MONO}, + {72000, 88000, {10, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {88000, 160001, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {160001, 288001, {13, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 44100hz 2ch ***/ + {12000, 16000, {0, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {16000, 22000, {1, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {22000, 26000, {2, 1}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {26000, 30000, {3, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {30000, 34000, {3, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {34000, 38000, {4, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {38000, 44000, {5, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {44000, 52000, {6, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {52000, 60000, {8, 5}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {60000, 68000, {9, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {68000, 76000, {10, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 90000, {11, 7}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {90000, 112000, {11, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 132000, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {132000, 180000, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {180000, 288001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 48000hz 1ch ***/ + {12000, 16000, {0, 0}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {16000, 22000, {1, 1}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {22000, 30000, {2, 3}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {30000, 36000, {4, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 40000, {5, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {40000, 48000, {6, 5}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {48000, 60000, {7, 6}, 1, {3, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 6}, 1, {3, 0, 0}, IXHEAACE_SBR_MODE_MONO}, + {72000, 88000, {10, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {88000, 160001, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {160001, 288001, {13, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 48000hz 2ch ***/ + {12000, 16000, {0, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {16000, 22000, {0, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {22000, 26000, {1, 1}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {26000, 30000, {2, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {30000, 34000, {3, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {34000, 38000, {4, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {38000, 44000, {2, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {44000, 52000, {6, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {52000, 60000, {8, 5}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {60000, 68000, {9, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {68000, 76000, {10, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 90000, {11, 7}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {90000, 112000, {11, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 132000, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {132000, 180000, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {180000, 288001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}} + + }, +#endif {{{{0}}}, {{{0}}}, From 65ed01a2f40b9635a85ef0036ccd730641afbccf Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 10 Aug 2025 10:15:44 +0700 Subject: [PATCH 08/27] update encode --- cmake/utils.cmake | 1 + encoder/ixheaace_sbr_main.c | 2 +- encoder/ixheaace_sbr_rom.h | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/cmake/utils.cmake b/cmake/utils.cmake index 5d9cd37..3196501 100644 --- a/cmake/utils.cmake +++ b/cmake/utils.cmake @@ -51,6 +51,7 @@ function(libxaac_add_definitions) add_definitions(-DX86_64 -D_X86_64_) endif() add_definitions(-DLOUDNESS_LEVELING_SUPPORT) + add_definitions(-DAAC_NEW_TABLES) endfunction() # Adds libraries needed for executables diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 522870d..9e00eab 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -100,7 +100,7 @@ FLOAT32 *ixheaace_get_hbe_resample_buffer(ixheaace_pstr_sbr_enc pstr_env_enc) { static FLAG ia_enhaacplus_enc_get_sbr_tuning_table_idx( UWORD32 bitrate, UWORD32 num_ch, UWORD32 sample_rate, ixheaace_str_qmf_tabs *pstr_qmf_tab, UWORD32 *ptr_closest_br, WORD32 *ptr_idx_sr, WORD32 *ptr_idx_ch, WORD32 *ptr_idx_entry, - ixheaace_sbr_tuning_tables sbr_tune_table[10][2][10]) { + ixheaace_sbr_tuning_tables sbr_tune_table[10][2][16]) { WORD32 found = 0; WORD32 i_sr, br_closest_lower_idx_sr = -1, br_closest_upper_idx_sr = -1; WORD32 br_closest_lower_idx_ch = -1, br_closest_upper_idx_sch = -1; diff --git a/encoder/ixheaace_sbr_rom.h b/encoder/ixheaace_sbr_rom.h index c4dc0e6..55ec490 100644 --- a/encoder/ixheaace_sbr_rom.h +++ b/encoder/ixheaace_sbr_rom.h @@ -120,8 +120,8 @@ typedef struct { ixheaace_str_frame_info_sbr frame_480_info4_2048; const FLOAT32 ptr_smooth_filter[4]; UWORD32 supported_sample_rate[9]; - ixheaace_sbr_tuning_tables sbr_tuning_table_lc[10][2][10]; - ixheaace_sbr_tuning_tables sbr_tuning_table_ld[10][2][10]; + ixheaace_sbr_tuning_tables sbr_tuning_table_lc[10][2][16]; + ixheaace_sbr_tuning_tables sbr_tuning_table_ld[10][2][16]; } ixheaace_str_qmf_tabs; typedef struct { From b21dc24ee59ae227f8e4719fef7f352983fd05db Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 10 Aug 2025 10:18:01 +0700 Subject: [PATCH 09/27] size again --- encoder/ixheaace_sbr_main.c | 2 +- encoder/ixheaace_sbr_rom.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 9e00eab..9e13b13 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -100,7 +100,7 @@ FLOAT32 *ixheaace_get_hbe_resample_buffer(ixheaace_pstr_sbr_enc pstr_env_enc) { static FLAG ia_enhaacplus_enc_get_sbr_tuning_table_idx( UWORD32 bitrate, UWORD32 num_ch, UWORD32 sample_rate, ixheaace_str_qmf_tabs *pstr_qmf_tab, UWORD32 *ptr_closest_br, WORD32 *ptr_idx_sr, WORD32 *ptr_idx_ch, WORD32 *ptr_idx_entry, - ixheaace_sbr_tuning_tables sbr_tune_table[10][2][16]) { + ixheaace_sbr_tuning_tables sbr_tune_table[10][2][20]) { WORD32 found = 0; WORD32 i_sr, br_closest_lower_idx_sr = -1, br_closest_upper_idx_sr = -1; WORD32 br_closest_lower_idx_ch = -1, br_closest_upper_idx_sch = -1; diff --git a/encoder/ixheaace_sbr_rom.h b/encoder/ixheaace_sbr_rom.h index 55ec490..59b2eef 100644 --- a/encoder/ixheaace_sbr_rom.h +++ b/encoder/ixheaace_sbr_rom.h @@ -120,8 +120,8 @@ typedef struct { ixheaace_str_frame_info_sbr frame_480_info4_2048; const FLOAT32 ptr_smooth_filter[4]; UWORD32 supported_sample_rate[9]; - ixheaace_sbr_tuning_tables sbr_tuning_table_lc[10][2][16]; - ixheaace_sbr_tuning_tables sbr_tuning_table_ld[10][2][16]; + ixheaace_sbr_tuning_tables sbr_tuning_table_lc[10][2][20]; + ixheaace_sbr_tuning_tables sbr_tuning_table_ld[10][2][20]; } ixheaace_str_qmf_tabs; typedef struct { From 938e3892fb1274eb08705c3693b84104e4cf1a10 Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 10 Aug 2025 10:20:00 +0700 Subject: [PATCH 10/27] tns too --- encoder/ixheaace_rom.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encoder/ixheaace_rom.h b/encoder/ixheaace_rom.h index eb9e882..e85b300 100644 --- a/encoder/ixheaace_rom.h +++ b/encoder/ixheaace_rom.h @@ -100,7 +100,7 @@ typedef struct { extern const ixheaace_quant_tables ixheaace_enc_quant_tab; typedef struct { const ixheaace_temporal_noise_shaping_max_table tns_max_bands_table[12]; - const ixheaace_temporal_noise_shaping_info_tab tns_info_tab[5]; + const ixheaace_temporal_noise_shaping_info_tab tns_info_tab[6]; const FLOAT32 tns_coeff_3[8]; const FLOAT32 tns_coeff_3_borders[8]; const FLOAT32 tns_coeff_4[16]; From aadabc426a99c8aca593c838d10756a0fc6ff475 Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 10 Aug 2025 11:46:26 +0700 Subject: [PATCH 11/27] new eld bitrates --- encoder/ixheaace_sbr_rom.c | 140 +++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 5ecdc6c..1a9daa7 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -970,6 +970,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { }, #endif +#ifndef AAC_NEW_TABLES {{{{0}}}, {{{0}}}, @@ -1056,7 +1057,146 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {144000, 176000, {12, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {176000, 256001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}} +#else + {{{{0}}}, + {{{0}}}, + + {{ + /*** 12000hz 1ch ***/ + {8000, 32000, {1, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + {0}}}, + + {{ + /*** 16000hz 1ch ***/ + {8000, 10000, {1, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {10000, 12000, {2, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {4, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 18000, {4, 9}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {18000, 22000, {7, 12}, 3, {1, 6, 9}, IXHEAACE_SBR_MODE_MONO}, + {22000, 28000, {6, 9}, 3, {2, 3, 6}, IXHEAACE_SBR_MODE_MONO}, + {28000, 36000, {8, 12}, 3, {2, 9, 12}, IXHEAACE_SBR_MODE_MONO}, + {36000, 44000, {10, 12}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 64001, {11, 13}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 16000hz 2ch ***/ + {16000, 24000, {4, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {8, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {10, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {13, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {10, 11}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {14, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 22050hz 1ch ***/ + {8000, 11369, {1, 1}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {11369, 16000, {1, 3}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 18000, {2, 4}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {18000, 22000, {4, 5}, 3, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {22000, 28000, {5, 6}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {28000, 36000, {7, 8}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 44000, {9, 9}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 52000, {12, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {52000, 70000, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {70000, 88001, {14, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 22050hz 2ch ***/ + {16000, 24000, {0, 0}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {3, 5}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 32000, {3, 7}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {32000, 36000, {5, 7}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {5, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {7, 8}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {9, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {10, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 82000, {12, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {82000, 128001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 24000hz 1ch ***/ + {8000, 12000, {1, 1}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {12000, 16000, {1, 3}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {16000, 18000, {1, 4}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, + {18000, 22000, {4, 8}, 2, {2, 3, 6}, IXHEAACE_SBR_MODE_MONO}, + {22000, 28000, {3, 8}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {28000, 36000, {4, 8}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 56000, {8, 9}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {56000, 70000, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {70000, 88001, {14, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 24000hz 2ch ***/ + {16000, 24000, {0, 0}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {24000, 28000, {3, 5}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {28000, 36000, {5, 7}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {36000, 44000, {4, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {44000, 52000, {6, 8}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {52000, 60000, {9, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 76000, {11, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 88000, {12, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {88000, 128001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 32000hz 1ch ***/ + {24000, 36000, {4, 4}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 60000, {7, 6}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 8}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {72000, 100000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 160001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 32000hz 2ch ***/ + {32000, 60000, {4, 4}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {7, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {9, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {11, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 256001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 44100hz 1ch ***/ + {24000, 36000, {4, 9}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 60000, {8, 6}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {72000, 100000, {11, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 160001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 44100hz 2ch ***/ + {32000, 60000, {4, 4}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {7, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {10, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {12, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 256001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}, + + {{ + /*** 48000hz 1ch ***/ + {24000, 36000, {4, 3}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 60000, {4, 4}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {72000, 100000, {11, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 160001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {0}}, + { + /*** 48000hz 2ch ***/ + {32000, 60000, {4, 9}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {7, 10}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {9, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {11, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 176000, {12, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {176000, 256001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {0}}}} +#endif }; /*End of QMF Tables*/ From 80a67bda85225d6c4a1b122691004dec170c0612 Mon Sep 17 00:00:00 2001 From: wrapper Date: Mon, 11 Aug 2025 13:01:12 +0700 Subject: [PATCH 12/27] fix broken freq scaling --- encoder/ixheaace_sbr_freq_scaling.c | 66 ++++++++++++++++++----------- encoder/ixheaace_sbr_rom.c | 3 ++ encoder/ixheaace_sbr_rom.h | 3 ++ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/encoder/ixheaace_sbr_freq_scaling.c b/encoder/ixheaace_sbr_freq_scaling.c index 7eec5a9..192907e 100644 --- a/encoder/ixheaace_sbr_freq_scaling.c +++ b/encoder/ixheaace_sbr_freq_scaling.c @@ -158,31 +158,31 @@ static WORD32 ixheaace_get_start_freq(WORD32 fs, WORD32 start_freq) { WORD32 minimum_k0; switch (fs) { - case 16000: + case 8000: minimum_k0 = 24; break; - case 22050: + case 11025: minimum_k0 = 17; break; - case 24000: + case 12000: minimum_k0 = 16; break; - case 32000: + case 16000: minimum_k0 = 16; break; - case 44100: + case 22050: minimum_k0 = 12; break; - case 48000: + case 24000: minimum_k0 = 11; break; - case 64000: + case 32000: minimum_k0 = 10; break; - case 88200: + case 44100: minimum_k0 = 7; break; - case 96000: + case 48000: minimum_k0 = 7; break; default: @@ -190,30 +190,30 @@ static WORD32 ixheaace_get_start_freq(WORD32 fs, WORD32 start_freq) { } switch (fs) { - case 16000: { + case 8000: { return (minimum_k0 + vector_offset_16k[start_freq]); } break; - case 22050: { + case 11025: { return (minimum_k0 + vector_offset_22k[start_freq]); } break; - case 24000: { + case 12000: { return (minimum_k0 + vector_offset_24k[start_freq]); } break; - case 32000: { + case 16000: { return (minimum_k0 + vector_offset_32k[start_freq]); } break; - case 44100: - case 48000: - case 64000: { + case 22050: + case 24000: + case 32000: { return (minimum_k0 + vector_offset_44_48_64[start_freq]); } break; - case 88200: - case 96000: { + case 44100: + case 48000: { return (minimum_k0 + vector_offset_88_96[start_freq]); } break; @@ -230,36 +230,54 @@ static WORD32 ixheaace_get_stop_freq(WORD32 fs, WORD32 stop_freq) { WORD32 v_dstop[13]; switch (fs) { - case 16000: + case 8000: k1_min = ixheaace_stop_freq_16k[0]; v_stop_freq = (WORD32 *)&ixheaace_stop_freq_16k[0]; break; - case 22050: + case 11025: k1_min = ixheaace_stop_freq_22k[0]; v_stop_freq = (WORD32 *)&ixheaace_stop_freq_22k[0]; break; - case 24000: + case 12000: k1_min = ixheaace_stop_freq_24k[0]; v_stop_freq = (WORD32 *)&ixheaace_stop_freq_24k[0]; break; - case 32000: + case 16000: k1_min = 32; v_stop_freq = (WORD32 *)vector_stop_freq_32; break; - case 44100: + case 22050: k1_min = 23; v_stop_freq = (WORD32 *)vector_stop_freq_44; break; - case 48000: + case 24000: k1_min = 21; v_stop_freq = (WORD32 *)vector_stop_freq_48; break; + case 32000: + k1_min = 20; + + v_stop_freq = (WORD32 *)vector_stop_freq_64; + break; + + case 44100: + k1_min = 15; + + v_stop_freq = (WORD32 *)vector_stop_freq_88; + break; + + case 48000: + k1_min = 13; + + v_stop_freq = (WORD32 *)vector_stop_freq_96; + break; + default: v_stop_freq = (WORD32 *)vector_stop_freq_32; k1_min = 21; /* illegal fs */ diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 1a9daa7..435fc2e 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -48,6 +48,9 @@ const WORD32 vector_offset_def[] = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 2 const WORD32 vector_stop_freq_32[14] = {32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61, 64}; const WORD32 vector_stop_freq_44[14] = {23, 25, 27, 29, 32, 34, 37, 40, 43, 47, 51, 55, 59, 64}; const WORD32 vector_stop_freq_48[14] = {21, 23, 25, 27, 30, 32, 35, 38, 42, 45, 49, 54, 59, 64}; +const WORD32 vector_stop_freq_64[14] = {20, 22, 24, 26, 28, 31, 34, 37, 41, 45, 49, 54, 59, 64}; +const WORD32 vector_stop_freq_88[14] = {15, 17, 19, 21, 23, 26, 29, 33, 37, 41, 46, 51, 57, 64}; +const WORD32 vector_stop_freq_96[14] = {13, 15, 17, 19, 21, 24, 27, 31, 35, 39, 44, 50, 57, 64}; const ixheaace_str_ps_tab ia_enhaacplus_enc_ps_tab = { /*a_hyb_res[3]*/ diff --git a/encoder/ixheaace_sbr_rom.h b/encoder/ixheaace_sbr_rom.h index 59b2eef..02ca808 100644 --- a/encoder/ixheaace_sbr_rom.h +++ b/encoder/ixheaace_sbr_rom.h @@ -181,6 +181,9 @@ extern const WORD32 vector_offset_def[]; extern const WORD32 vector_stop_freq_32[14]; extern const WORD32 vector_stop_freq_44[14]; extern const WORD32 vector_stop_freq_48[14]; +extern const WORD32 vector_stop_freq_64[14]; +extern const WORD32 vector_stop_freq_88[14]; +extern const WORD32 vector_stop_freq_96[14]; /* Resampler tables */ extern const ixheaace_resampler_table ixheaace_resamp_2_to_1_iir_filt_params; From b743f48ca1b6e828fbaec722218711c8413da02f Mon Sep 17 00:00:00 2001 From: wrapper Date: Mon, 11 Aug 2025 17:27:52 +0700 Subject: [PATCH 13/27] going pic --- CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 82539b7..4996c67 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -27,3 +27,5 @@ include("${XAAC_ROOT}/encoder/libxaacenc.cmake") include("${XAAC_ROOT}/test/encoder/xaacenc.cmake") include("${XAAC_ROOT}/fuzzer/xaac_enc_fuzzer.cmake") +set_property(TARGET libxaacenc PROPERTY POSITION_INDEPENDENT_CODE 1) +set_property(TARGET libxaacdec PROPERTY POSITION_INDEPENDENT_CODE 1) From d3d43727c5cfc3f16ce75af7b3961921acbf26af Mon Sep 17 00:00:00 2001 From: wrapper Date: Wed, 13 Aug 2025 07:17:36 +0700 Subject: [PATCH 14/27] fix freq scaling again --- encoder/ixheaace_api.c | 2 +- encoder/ixheaace_sbr_freq_scaling.c | 64 ++++++++++++++--------------- encoder/ixheaace_sbr_main.c | 2 +- encoder/ixheaace_sbr_rom.c | 2 +- 4 files changed, 35 insertions(+), 35 deletions(-) diff --git a/encoder/ixheaace_api.c b/encoder/ixheaace_api.c index 22fe7e4..ea870d4 100644 --- a/encoder/ixheaace_api.c +++ b/encoder/ixheaace_api.c @@ -1215,7 +1215,7 @@ static IA_ERRORCODE ixheaace_set_config_params(ixheaace_api_struct *pstr_api_str } pstr_api_struct->config[0].aac_config.full_bandwidth = pstr_input_config->aac_config.full_bandwidth; - pstr_api_struct->config[0].aac_config.band_width = + pstr_api_struct->config[0].aac_config.band_width = pstr_input_config->aac_config.bandwidth; } diff --git a/encoder/ixheaace_sbr_freq_scaling.c b/encoder/ixheaace_sbr_freq_scaling.c index 192907e..e3e7921 100644 --- a/encoder/ixheaace_sbr_freq_scaling.c +++ b/encoder/ixheaace_sbr_freq_scaling.c @@ -158,31 +158,31 @@ static WORD32 ixheaace_get_start_freq(WORD32 fs, WORD32 start_freq) { WORD32 minimum_k0; switch (fs) { - case 8000: + case 16000: minimum_k0 = 24; break; - case 11025: + case 22050: minimum_k0 = 17; break; - case 12000: - minimum_k0 = 16; - break; - case 16000: - minimum_k0 = 16; - break; - case 22050: - minimum_k0 = 12; - break; case 24000: - minimum_k0 = 11; + minimum_k0 = 16; break; case 32000: - minimum_k0 = 10; + minimum_k0 = 16; break; case 44100: - minimum_k0 = 7; + minimum_k0 = 12; break; case 48000: + minimum_k0 = 11; + break; + case 64000: + minimum_k0 = 10; + break; + case 88200: + minimum_k0 = 7; + break; + case 96000: minimum_k0 = 7; break; default: @@ -190,30 +190,30 @@ static WORD32 ixheaace_get_start_freq(WORD32 fs, WORD32 start_freq) { } switch (fs) { - case 8000: { + case 16000: { return (minimum_k0 + vector_offset_16k[start_freq]); } break; - case 11025: { + case 22050: { return (minimum_k0 + vector_offset_22k[start_freq]); } break; - case 12000: { + case 24000: { return (minimum_k0 + vector_offset_24k[start_freq]); } break; - case 16000: { + case 32000: { return (minimum_k0 + vector_offset_32k[start_freq]); } break; - case 22050: - case 24000: - case 32000: { + case 44100: + case 48000: + case 64000: { return (minimum_k0 + vector_offset_44_48_64[start_freq]); } break; - case 44100: - case 48000: { + case 88200: + case 96000: { return (minimum_k0 + vector_offset_88_96[start_freq]); } break; @@ -230,49 +230,49 @@ static WORD32 ixheaace_get_stop_freq(WORD32 fs, WORD32 stop_freq) { WORD32 v_dstop[13]; switch (fs) { - case 8000: + case 16000: k1_min = ixheaace_stop_freq_16k[0]; v_stop_freq = (WORD32 *)&ixheaace_stop_freq_16k[0]; break; - case 11025: + case 22050: k1_min = ixheaace_stop_freq_22k[0]; v_stop_freq = (WORD32 *)&ixheaace_stop_freq_22k[0]; break; - case 12000: + case 24000: k1_min = ixheaace_stop_freq_24k[0]; v_stop_freq = (WORD32 *)&ixheaace_stop_freq_24k[0]; break; - case 16000: + case 32000: k1_min = 32; v_stop_freq = (WORD32 *)vector_stop_freq_32; break; - case 22050: + case 44100: k1_min = 23; v_stop_freq = (WORD32 *)vector_stop_freq_44; break; - case 24000: + case 48000: k1_min = 21; v_stop_freq = (WORD32 *)vector_stop_freq_48; break; - case 32000: + case 64000: k1_min = 20; v_stop_freq = (WORD32 *)vector_stop_freq_64; break; - case 44100: + case 88200: k1_min = 15; v_stop_freq = (WORD32 *)vector_stop_freq_88; break; - case 48000: + case 96000: k1_min = 13; v_stop_freq = (WORD32 *)vector_stop_freq_96; diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 9e13b13..b8594e8 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -967,7 +967,7 @@ ixheaace_env_open(ixheaace_pstr_sbr_enc *pstr_env_encoder, ixheaace_pstr_sbr_cfg pstr_env_enc->str_sbr_cfg.stereo_mode = (params->codec_settings.num_channels == 2) ? params->stereo_mode : IXHEAACE_SBR_MODE_MONO; - if (params->codec_settings.sample_freq <= 24000) { + if (params->codec_settings.sample_freq <= 24000 || !params->is_ld_sbr) { pstr_env_enc->str_sbr_hdr.sample_rate_mode = IXHEAACE_DUAL_RATE; if (params->sbr_codec == USAC_SBR) { pstr_env_enc->str_sbr_cfg.sample_freq = 2 * params->codec_settings.sample_freq; diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 435fc2e..8856138 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -1068,7 +1068,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {{ /*** 12000hz 1ch ***/ {8000, 32000, {1, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, - {0}}, + {0}}, { {0}}}, From 68e3e867f82fac0c38a331dfc09cd30b9f0b5c41 Mon Sep 17 00:00:00 2001 From: wrapper Date: Thu, 14 Aug 2025 09:56:39 +0700 Subject: [PATCH 15/27] fix stop freq --- encoder/ixheaace_sbr_rom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 8856138..576b3bc 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -48,7 +48,7 @@ const WORD32 vector_offset_def[] = {0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 2 const WORD32 vector_stop_freq_32[14] = {32, 34, 36, 38, 40, 42, 44, 46, 49, 52, 55, 58, 61, 64}; const WORD32 vector_stop_freq_44[14] = {23, 25, 27, 29, 32, 34, 37, 40, 43, 47, 51, 55, 59, 64}; const WORD32 vector_stop_freq_48[14] = {21, 23, 25, 27, 30, 32, 35, 38, 42, 45, 49, 54, 59, 64}; -const WORD32 vector_stop_freq_64[14] = {20, 22, 24, 26, 28, 31, 34, 37, 41, 45, 49, 54, 59, 64}; +const WORD32 vector_stop_freq_64[14] = {20, 22, 24, 26, 29, 31, 34, 37, 41, 45, 49, 54, 59, 64}; const WORD32 vector_stop_freq_88[14] = {15, 17, 19, 21, 23, 26, 29, 33, 37, 41, 46, 51, 57, 64}; const WORD32 vector_stop_freq_96[14] = {13, 15, 17, 19, 21, 24, 27, 31, 35, 39, 44, 50, 57, 64}; From 06aa3c1ba5aa49f1b96c4e99d33a4862424eed3f Mon Sep 17 00:00:00 2001 From: wrapper Date: Thu, 14 Aug 2025 10:58:44 +0700 Subject: [PATCH 16/27] fix stop freq 2 --- encoder/ixheaace_sbr_freq_scaling.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/encoder/ixheaace_sbr_freq_scaling.c b/encoder/ixheaace_sbr_freq_scaling.c index e3e7921..1f08fbd 100644 --- a/encoder/ixheaace_sbr_freq_scaling.c +++ b/encoder/ixheaace_sbr_freq_scaling.c @@ -231,16 +231,16 @@ static WORD32 ixheaace_get_stop_freq(WORD32 fs, WORD32 stop_freq) { switch (fs) { case 16000: - k1_min = ixheaace_stop_freq_16k[0]; - v_stop_freq = (WORD32 *)&ixheaace_stop_freq_16k[0]; + k1_min = ixheaace_usac_stop_freq_16k[0]; + v_stop_freq = (WORD32 *)&ixheaace_usac_stop_freq_16k[0]; break; case 22050: - k1_min = ixheaace_stop_freq_22k[0]; - v_stop_freq = (WORD32 *)&ixheaace_stop_freq_22k[0]; + k1_min = ixheaace_usac_stop_freq_22k[0]; + v_stop_freq = (WORD32 *)&ixheaace_usac_stop_freq_22k[0]; break; case 24000: - k1_min = ixheaace_stop_freq_24k[0]; - v_stop_freq = (WORD32 *)&ixheaace_stop_freq_24k[0]; + k1_min = ixheaace_usac_stop_freq_24k[0]; + v_stop_freq = (WORD32 *)&ixheaace_usac_stop_freq_24k[0]; break; case 32000: k1_min = 32; From b828e892751ddf59aca1dc624045133baad031e5 Mon Sep 17 00:00:00 2001 From: wrapper Date: Thu, 14 Aug 2025 13:42:29 +0700 Subject: [PATCH 17/27] fix sbr setting --- encoder/ixheaace_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encoder/ixheaace_api.c b/encoder/ixheaace_api.c index ea870d4..749cac6 100644 --- a/encoder/ixheaace_api.c +++ b/encoder/ixheaace_api.c @@ -2478,7 +2478,7 @@ static IA_ERRORCODE ia_enhaacplus_enc_init(ixheaace_api_struct *pstr_api_struct, pstr_aac_config->bit_rate, (pstr_api_struct->pstr_state->mps_enable ? 1 - : pstr_api_struct->config[ele_idx].chmode_nchannels), + : pstr_aac_config->num_out_channels), pstr_aac_config->sample_rate, &core_sample_rate, pstr_api_struct->spectral_band_replication_tabs.ptr_qmf_tab, pstr_api_struct->pstr_state->aot)) { From ddcb11cbc86158269439ff2c9d234bbd89a242b6 Mon Sep 17 00:00:00 2001 From: wrapper Date: Thu, 14 Aug 2025 16:55:43 +0700 Subject: [PATCH 18/27] fix mean division by 0 --- encoder/ixheaace_sbr_noise_floor_est.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/encoder/ixheaace_sbr_noise_floor_est.c b/encoder/ixheaace_sbr_noise_floor_est.c index c5fcd99..344d2b0 100644 --- a/encoder/ixheaace_sbr_noise_floor_est.c +++ b/encoder/ixheaace_sbr_noise_floor_est.c @@ -136,8 +136,10 @@ static VOID ia_enhaacplus_enc_qmf_based_noise_floor_detection( mean_org += ton_org; mean_sbr += ton_sbr; } - mean_org /= (stop_channel - start_channel); - mean_sbr /= (stop_channel - start_channel); + if ((stop_channel - start_channel) > 0) { + mean_org /= (stop_channel - start_channel); + mean_sbr /= (stop_channel - start_channel); + } } if (mean_org < SBR_TON_MEAN_P0009 && mean_sbr < SBR_TON_MEAN_P0009) { From f398a9836342e6d57ec7eb8e837936fa6796c25e Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 15 Aug 2025 13:12:09 +0700 Subject: [PATCH 19/27] correct aot --- decoder/ixheaacd_api.c | 3 +++ decoder/ixheaacd_struct_def.h | 2 ++ 2 files changed, 5 insertions(+) diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index c4ae8e0..53cb371 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -940,6 +940,7 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_xheaac_dec_obj, WORD32 i_cmd, } else { *pui_value = p_obj_exhaacplus_dec->p_state_aac->audio_object_type; } + if (*pui_value == AOT_AAC_LC) *pui_value = p_obj_exhaacplus_dec->p_state_aac->init_sbr_flag ? (p_obj_exhaacplus_dec->p_state_aac->init_ps_flag ? AOT_PS : AOT_SBR) : AOT_AAC_LC; } else { *pui_value = AOT_AAC_LC; } @@ -2530,6 +2531,8 @@ IA_ERRORCODE ixheaacd_dec_init( p_obj_exhaacplus_dec->aac_config.ui_n_channels = num_channels_1; p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate; p_state_enhaacplus_dec->ui_init_done = 1; + p_state_enhaacplus_dec->init_sbr_flag = sbr_present_flag; + p_state_enhaacplus_dec->init_ps_flag = p_obj_exhaacplus_dec->aac_config.ui_sbr_mode == 1; memcpy(it_bit_buff, &temp_bit_buff, sizeof(struct ia_bit_buf_struct)); diff --git a/decoder/ixheaacd_struct_def.h b/decoder/ixheaacd_struct_def.h index fea3b56..8518407 100644 --- a/decoder/ixheaacd_struct_def.h +++ b/decoder/ixheaacd_struct_def.h @@ -162,6 +162,8 @@ typedef struct ia_aac_dec_state_struct { UWORD32 ui_input_over; UWORD32 header_dec_done; WORD32 frame_counter; + WORD32 init_sbr_flag; + WORD32 init_ps_flag; ia_aac_decoder_struct *pstr_aac_dec_info[MAX_BS_ELEMENT]; UWORD32 ch_config; From 90c8770efeb21a51f0707c13bfc6747b94333421 Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 15 Aug 2025 14:13:18 +0700 Subject: [PATCH 20/27] fix aot detect --- decoder/ixheaacd_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 53cb371..2645d4a 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -2532,7 +2532,7 @@ IA_ERRORCODE ixheaacd_dec_init( p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate; p_state_enhaacplus_dec->ui_init_done = 1; p_state_enhaacplus_dec->init_sbr_flag = sbr_present_flag; - p_state_enhaacplus_dec->init_ps_flag = p_obj_exhaacplus_dec->aac_config.ui_sbr_mode == 1; + p_state_enhaacplus_dec->init_ps_flag = p_obj_exhaacplus_dec->aac_config.ui_channel_mode == 1; memcpy(it_bit_buff, &temp_bit_buff, sizeof(struct ia_bit_buf_struct)); From 1feae4f6e0c884610b19feb65ae08c3497bb6caf Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 15 Aug 2025 14:18:49 +0700 Subject: [PATCH 21/27] again --- decoder/ixheaacd_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 2645d4a..3504a10 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -2532,7 +2532,7 @@ IA_ERRORCODE ixheaacd_dec_init( p_obj_exhaacplus_dec->aac_config.ui_samp_freq = sample_rate; p_state_enhaacplus_dec->ui_init_done = 1; p_state_enhaacplus_dec->init_sbr_flag = sbr_present_flag; - p_state_enhaacplus_dec->init_ps_flag = p_obj_exhaacplus_dec->aac_config.ui_channel_mode == 1; + p_state_enhaacplus_dec->init_ps_flag = !p_obj_exhaacplus_dec->aac_config.ui_channel_mode; memcpy(it_bit_buff, &temp_bit_buff, sizeof(struct ia_bit_buf_struct)); From ce9ef54af5d08f4ffdde2b11b8436cdf4a73d076 Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 22 Aug 2025 16:06:28 +0700 Subject: [PATCH 22/27] add downsampled frequency scaling --- encoder/ixheaace_sbr_freq_scaling.c | 38 +++++++++++++++++++++++++++++ encoder/ixheaace_sbr_freq_scaling.h | 4 +++ encoder/ixheaace_sbr_main.c | 13 ++++++++++ encoder/ixheaace_sbr_main.h | 2 ++ 4 files changed, 57 insertions(+) diff --git a/encoder/ixheaace_sbr_freq_scaling.c b/encoder/ixheaace_sbr_freq_scaling.c index 1f08fbd..3df4e07 100644 --- a/encoder/ixheaace_sbr_freq_scaling.c +++ b/encoder/ixheaace_sbr_freq_scaling.c @@ -371,6 +371,44 @@ ixheaace_get_sbr_start_freq_raw(WORD32 start_freq, WORD32 qmf_bands, WORD32 fs) return result; } +WORD32 ixheaace_get_sbr_stop_freq_raw(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs) { + WORD32 result; + + if (stop_freq < 0 || stop_freq > 13) { + return -1; + } + + result = ixheaace_get_stop_freq(fs, stop_freq); + + result = (result * fs / qmf_bands + 1) >> 1; + + return result; +} + +WORD32 ixheaace_get_downsampled_stop_freq(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs, + WORD32 start_freq, ixheaace_sr_mode sample_rate_mode, + WORD32 sbr_ratio_idx, ixheaace_sbr_codec_type sbr_codec) +{ + WORD32 new_stop_freq; + WORD32 stop_freq_downsampled = fs / 4; + WORD32 result; + WORD32 k0; + WORD32 k2; + + while (stop_freq && ixheaace_get_sbr_stop_freq_raw(stop_freq, qmf_bands, fs) > stop_freq_downsampled) { + stop_freq--; + } + + new_stop_freq = ixheaace_get_sbr_stop_freq_raw(stop_freq, qmf_bands, fs); + if (new_stop_freq > stop_freq_downsampled) return -1; + + result = ixheaace_find_start_and_stop_band(fs, qmf_bands / 2, start_freq, stop_freq, + sample_rate_mode, &k0, &k2, sbr_ratio_idx, sbr_codec); + if (result != IA_NO_ERROR) return -1; + + return stop_freq; +} + static WORD32 ixheaace_number_of_bands(WORD32 b_p_o, WORD32 start, WORD32 stop, FLOAT32 warp_fac) { WORD32 result = 0; diff --git a/encoder/ixheaace_sbr_freq_scaling.h b/encoder/ixheaace_sbr_freq_scaling.h index fe107e1..29e74b1 100644 --- a/encoder/ixheaace_sbr_freq_scaling.h +++ b/encoder/ixheaace_sbr_freq_scaling.h @@ -43,3 +43,7 @@ ixheaace_find_start_and_stop_band(const WORD32 sampling_freq, const WORD32 num_c ixheaace_sbr_codec_type sbr_codec); WORD32 ixheaace_get_sbr_start_freq_raw(WORD32 start_freq, WORD32 qmf_bands, WORD32 fs); +WORD32 ixheaace_get_sbr_stop_freq_raw(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs); +WORD32 ixheaace_get_downsampled_stop_freq(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs, + WORD32 start_freq, ixheaace_sr_mode sample_rate_mode, + WORD32 sbr_ratio_idx, ixheaace_sbr_codec_type sbr_codec); \ No newline at end of file diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index b8594e8..273446f 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -435,6 +435,7 @@ VOID ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config, UWORD UWORD32 std_br, ixheaace_str_qmf_tabs *pstr_qmf_tab, WORD32 aot, WORD32 is_esbr_4_1) { FLAG table_found = IXHEAACE_TABLE_IDX_NOT_FOUND; + WORD32 downsample_stop; WORD32 idx_sr = 0; WORD32 idx_ch = 0; WORD32 idx_entry = 0; @@ -514,6 +515,16 @@ VOID ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config, UWORD } } + if (pstr_config->is_single_rate) { + downsample_stop = ixheaace_get_downsampled_stop_freq(pstr_config->stop_freq, IXHEAACE_QMF_CHANNELS, fs_core, + pstr_config->start_freq, IXHEAACE_SINGLE_RATE, pstr_config->sbr_ratio_idx, + pstr_config->sbr_codec); + if (downsample_stop >= 0) { + pstr_config->is_single_rate_found = 1; + pstr_config->stop_freq = downsample_stop; + } + } + if (pstr_config->sbr_codec == ELD_SBR) { pstr_config->send_header_data_time = -1; if ((num_ch == NUM_CHANS_MONO) && (bit_rate <= 22000)) { @@ -597,6 +608,8 @@ VOID ixheaace_initialize_sbr_defaults(ixheaace_pstr_sbr_cfg pstr_config) { pstr_config->sbr_harmonic = 0; pstr_config->sbr_ratio_idx = 0; // NO_SBR pstr_config->use_low_freq_res = 0; + pstr_config->is_single_rate = 0; + pstr_config->is_single_rate_found = 0; } static IA_ERRORCODE ia_enhaacplus_enc_update_freq_band_tab( diff --git a/encoder/ixheaace_sbr_main.h b/encoder/ixheaace_sbr_main.h index f84dccd..9456ca9 100644 --- a/encoder/ixheaace_sbr_main.h +++ b/encoder/ixheaace_sbr_main.h @@ -85,6 +85,8 @@ typedef struct ixheaace_str_sbr_cfg { WORD32 hq_esbr; ixheaace_sbr_codec_type sbr_codec; WORD32 use_low_freq_res; + WORD32 is_single_rate; + WORD32 is_single_rate_found; } ixheaace_str_sbr_cfg, *ixheaace_pstr_sbr_cfg; typedef struct ixheaace_str_sbr_enc *ixheaace_pstr_sbr_enc; From c10720f05ddcff8022bf61df5ab0283be9dcdda1 Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 22 Aug 2025 19:34:35 +0700 Subject: [PATCH 23/27] Revert "add downsampled frequency scaling" This reverts commit ce9ef54af5d08f4ffdde2b11b8436cdf4a73d076. --- encoder/ixheaace_sbr_freq_scaling.c | 38 ----------------------------- encoder/ixheaace_sbr_freq_scaling.h | 4 --- encoder/ixheaace_sbr_main.c | 13 ---------- encoder/ixheaace_sbr_main.h | 2 -- 4 files changed, 57 deletions(-) diff --git a/encoder/ixheaace_sbr_freq_scaling.c b/encoder/ixheaace_sbr_freq_scaling.c index 3df4e07..1f08fbd 100644 --- a/encoder/ixheaace_sbr_freq_scaling.c +++ b/encoder/ixheaace_sbr_freq_scaling.c @@ -371,44 +371,6 @@ ixheaace_get_sbr_start_freq_raw(WORD32 start_freq, WORD32 qmf_bands, WORD32 fs) return result; } -WORD32 ixheaace_get_sbr_stop_freq_raw(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs) { - WORD32 result; - - if (stop_freq < 0 || stop_freq > 13) { - return -1; - } - - result = ixheaace_get_stop_freq(fs, stop_freq); - - result = (result * fs / qmf_bands + 1) >> 1; - - return result; -} - -WORD32 ixheaace_get_downsampled_stop_freq(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs, - WORD32 start_freq, ixheaace_sr_mode sample_rate_mode, - WORD32 sbr_ratio_idx, ixheaace_sbr_codec_type sbr_codec) -{ - WORD32 new_stop_freq; - WORD32 stop_freq_downsampled = fs / 4; - WORD32 result; - WORD32 k0; - WORD32 k2; - - while (stop_freq && ixheaace_get_sbr_stop_freq_raw(stop_freq, qmf_bands, fs) > stop_freq_downsampled) { - stop_freq--; - } - - new_stop_freq = ixheaace_get_sbr_stop_freq_raw(stop_freq, qmf_bands, fs); - if (new_stop_freq > stop_freq_downsampled) return -1; - - result = ixheaace_find_start_and_stop_band(fs, qmf_bands / 2, start_freq, stop_freq, - sample_rate_mode, &k0, &k2, sbr_ratio_idx, sbr_codec); - if (result != IA_NO_ERROR) return -1; - - return stop_freq; -} - static WORD32 ixheaace_number_of_bands(WORD32 b_p_o, WORD32 start, WORD32 stop, FLOAT32 warp_fac) { WORD32 result = 0; diff --git a/encoder/ixheaace_sbr_freq_scaling.h b/encoder/ixheaace_sbr_freq_scaling.h index 29e74b1..fe107e1 100644 --- a/encoder/ixheaace_sbr_freq_scaling.h +++ b/encoder/ixheaace_sbr_freq_scaling.h @@ -43,7 +43,3 @@ ixheaace_find_start_and_stop_band(const WORD32 sampling_freq, const WORD32 num_c ixheaace_sbr_codec_type sbr_codec); WORD32 ixheaace_get_sbr_start_freq_raw(WORD32 start_freq, WORD32 qmf_bands, WORD32 fs); -WORD32 ixheaace_get_sbr_stop_freq_raw(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs); -WORD32 ixheaace_get_downsampled_stop_freq(WORD32 stop_freq, WORD32 qmf_bands, WORD32 fs, - WORD32 start_freq, ixheaace_sr_mode sample_rate_mode, - WORD32 sbr_ratio_idx, ixheaace_sbr_codec_type sbr_codec); \ No newline at end of file diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index 273446f..b8594e8 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -435,7 +435,6 @@ VOID ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config, UWORD UWORD32 std_br, ixheaace_str_qmf_tabs *pstr_qmf_tab, WORD32 aot, WORD32 is_esbr_4_1) { FLAG table_found = IXHEAACE_TABLE_IDX_NOT_FOUND; - WORD32 downsample_stop; WORD32 idx_sr = 0; WORD32 idx_ch = 0; WORD32 idx_entry = 0; @@ -515,16 +514,6 @@ VOID ixheaace_adjust_sbr_settings(const ixheaace_pstr_sbr_cfg pstr_config, UWORD } } - if (pstr_config->is_single_rate) { - downsample_stop = ixheaace_get_downsampled_stop_freq(pstr_config->stop_freq, IXHEAACE_QMF_CHANNELS, fs_core, - pstr_config->start_freq, IXHEAACE_SINGLE_RATE, pstr_config->sbr_ratio_idx, - pstr_config->sbr_codec); - if (downsample_stop >= 0) { - pstr_config->is_single_rate_found = 1; - pstr_config->stop_freq = downsample_stop; - } - } - if (pstr_config->sbr_codec == ELD_SBR) { pstr_config->send_header_data_time = -1; if ((num_ch == NUM_CHANS_MONO) && (bit_rate <= 22000)) { @@ -608,8 +597,6 @@ VOID ixheaace_initialize_sbr_defaults(ixheaace_pstr_sbr_cfg pstr_config) { pstr_config->sbr_harmonic = 0; pstr_config->sbr_ratio_idx = 0; // NO_SBR pstr_config->use_low_freq_res = 0; - pstr_config->is_single_rate = 0; - pstr_config->is_single_rate_found = 0; } static IA_ERRORCODE ia_enhaacplus_enc_update_freq_band_tab( diff --git a/encoder/ixheaace_sbr_main.h b/encoder/ixheaace_sbr_main.h index 9456ca9..f84dccd 100644 --- a/encoder/ixheaace_sbr_main.h +++ b/encoder/ixheaace_sbr_main.h @@ -85,8 +85,6 @@ typedef struct ixheaace_str_sbr_cfg { WORD32 hq_esbr; ixheaace_sbr_codec_type sbr_codec; WORD32 use_low_freq_res; - WORD32 is_single_rate; - WORD32 is_single_rate_found; } ixheaace_str_sbr_cfg, *ixheaace_pstr_sbr_cfg; typedef struct ixheaace_str_sbr_enc *ixheaace_pstr_sbr_enc; From e33d5a718e134f8014cc6e4bb82ffc8c13d5ab2f Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 22 Aug 2025 19:35:23 +0700 Subject: [PATCH 24/27] make dual rate unlikely --- encoder/ixheaace_sbr_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index b8594e8..f67cbad 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -967,7 +967,7 @@ ixheaace_env_open(ixheaace_pstr_sbr_enc *pstr_env_encoder, ixheaace_pstr_sbr_cfg pstr_env_enc->str_sbr_cfg.stereo_mode = (params->codec_settings.num_channels == 2) ? params->stereo_mode : IXHEAACE_SBR_MODE_MONO; - if (params->codec_settings.sample_freq <= 24000 || !params->is_ld_sbr) { + if (0) { pstr_env_enc->str_sbr_hdr.sample_rate_mode = IXHEAACE_DUAL_RATE; if (params->sbr_codec == USAC_SBR) { pstr_env_enc->str_sbr_cfg.sample_freq = 2 * params->codec_settings.sample_freq; From 29b7a4eb4c532f37e41e26c86d5f9d16ae05d9c3 Mon Sep 17 00:00:00 2001 From: wrapper Date: Fri, 22 Aug 2025 19:48:17 +0700 Subject: [PATCH 25/27] fix --- encoder/ixheaace_sbr_main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encoder/ixheaace_sbr_main.c b/encoder/ixheaace_sbr_main.c index f67cbad..62928da 100644 --- a/encoder/ixheaace_sbr_main.c +++ b/encoder/ixheaace_sbr_main.c @@ -967,7 +967,7 @@ ixheaace_env_open(ixheaace_pstr_sbr_enc *pstr_env_encoder, ixheaace_pstr_sbr_cfg pstr_env_enc->str_sbr_cfg.stereo_mode = (params->codec_settings.num_channels == 2) ? params->stereo_mode : IXHEAACE_SBR_MODE_MONO; - if (0) { + if (1) { pstr_env_enc->str_sbr_hdr.sample_rate_mode = IXHEAACE_DUAL_RATE; if (params->sbr_codec == USAC_SBR) { pstr_env_enc->str_sbr_cfg.sample_freq = 2 * params->codec_settings.sample_freq; From d2211d963d3b1827c00580be94f6684ebc8de2d0 Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 24 Aug 2025 09:14:50 +0700 Subject: [PATCH 26/27] retweak --- encoder/ixheaace_sbr_rom.c | 144 ++++++++++++++----------------------- 1 file changed, 53 insertions(+), 91 deletions(-) diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 576b3bc..0a739ed 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -744,7 +744,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { }, #else {{{ - /*** 8000hz 1ch ***/ + /*** 8000hz 1ch SBR_AAC ***/ {8000, 10000, {7, 11}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {10000, 12000, {11, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {12000, 16000, {14, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -753,7 +753,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {32000, 48001, {14, 15}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 8000hz 2ch ***/ + /*** 8000hz 2ch SBR_AAC ***/ {16000, 24000, {6, 9}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {24000, 28000, {9, 11}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {28000, 36000, {11, 11}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, @@ -765,7 +765,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {0}}}, {{ - /*** 11025hz 1ch ***/ + /*** 11025hz 1ch SBR_AAC ***/ {8000, 10000, {5, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {10000, 12000, {8, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {12000, 16000, {12, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -773,10 +773,10 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {20000, 24000, {13, 13}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {24000, 32000, {14, 14}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {32000, 48000, {15, 15}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {48000, 64001, {15, 15}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {48000, 66001, {15, 15}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 11025hz 2ch ***/ + /*** 11025hz 2ch SBR_AAC ***/ {16000, 24000, {7, 9}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {24000, 28000, {10, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {28000, 36000, {12, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, @@ -784,11 +784,11 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {44000, 52000, {14, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {52000, 60000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 132301, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 12000hz 1ch ***/ + /*** 12000hz 1ch SBR_AAC ***/ {8000, 10000, {4, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {10000, 12000, {7, 11}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {12000, 16000, {11, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -796,10 +796,10 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {20000, 24000, {12, 12}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {24000, 32000, {13, 13}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {32000, 48000, {14, 14}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {48000, 64001, {15, 15}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {48000, 72001, {15, 15}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 12000hz 2ch ***/ + /*** 12000hz 2ch SBR_AAC ***/ {16000, 24000, {6, 9}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {24000, 28000, {9, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {28000, 36000, {11, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, @@ -807,11 +807,11 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {44000, 52000, {13, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {52000, 60000, {14, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 144001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 16000hz 1ch ***/ + /*** 16000hz 1ch SBR_AAC ***/ {6000, 8000, {0, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {8000, 10000, {1, 0}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {10000, 12000, {2, 6}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -821,10 +821,10 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {22000, 28000, {10, 12}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {28000, 36000, {12, 13}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {36000, 44000, {14, 13}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {44000, 64001, {15, 13}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 96001, {15, 13}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 16000hz 2ch ***/ + /*** 16000hz 2ch SBR_AAC ***/ {16000, 24000, {4, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {24000, 28000, {8, 10}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {28000, 36000, {10, 12}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, @@ -832,11 +832,11 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {44000, 52000, {15, 13}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {52000, 60000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {60000, 76000, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {76000, 128001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 192001, {15, 13}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 22050hz 1ch ***/ + /*** 22050hz 1ch SBR_AAC ***/ {8000, 11369, {1, 1}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {11369, 16000, {3, 4}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {16000, 18000, {3, 5}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -844,12 +844,10 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {22000, 28000, {7, 8}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {28000, 36000, {10, 9}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {36000, 44000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {44000, 52000, {13, 11}, 1, {2, 0, 0}, IXHEAACE_SBR_MODE_MONO}, - {52000, 68000, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, - {68000, 96001, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 132151, {13, 12}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 22050hz 2ch ***/ + /*** 22050hz 2ch SBR_AAC ***/ {16000, 24000, {2, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {24000, 28000, {5, 6}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {28000, 32000, {5, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, @@ -858,11 +856,11 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {44000, 52000, {12, 9}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {52000, 60000, {13, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {60000, 101000, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {101000, 128001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {101000, 264601, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 24000hz 1ch ***/ + /*** 24000hz 1ch SBR_AAC ***/ {8000, 12000, {1, 1}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {12000, 16000, {3, 4}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {16000, 18000, {3, 5}, 3, {1, 0, 6}, IXHEAACE_SBR_MODE_MONO}, @@ -870,12 +868,10 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {22000, 28000, {7, 8}, 2, {2, 0, 6}, IXHEAACE_SBR_MODE_MONO}, {28000, 36000, {10, 9}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {36000, 44000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {44000, 52000, {13, 11}, 1, {3, 0, 0}, IXHEAACE_SBR_MODE_MONO}, - {52000, 68000, {15, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, - {68000, 96001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + {44000, 144001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 24000hz 2ch ***/ + /*** 24000hz 2ch SBR_AAC ***/ {16000, 24000, {2, 1}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {24000, 28000, {5, 6}, 3, {1, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {28000, 36000, {7, 8}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, @@ -883,92 +879,58 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { {44000, 52000, {12, 9}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {52000, 60000, {13, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {60000, 76000, {14, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {76000, 128001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {76000, 288001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 32000hz 1ch ***/ + /*** 32000hz 1ch SBR_AAC ***/ {24000, 36000, {4, 4}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {36000, 60000, {7, 6}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {60000, 72000, {9, 8}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {72000, 100000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {100000, 160001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 192001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 32000hz 2ch ***/ + /*** 32000hz 2ch SBR_AAC ***/ {32000, 60000, {4, 4}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {60000, 80000, {11, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {80000, 112000, {12, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {112000, 144000, {13, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {144000, 256001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {60000, 80000, {7, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {9, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {11, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 384001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 44100hz 1ch ***/ - {12000, 16000, {0, 0}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {16000, 22000, {1, 1}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {22000, 30000, {2, 3}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {30000, 36000, {4, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {36000, 40000, {5, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {40000, 48000, {6, 5}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {48000, 60000, {7, 6}, 1, {3, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {60000, 72000, {9, 6}, 1, {3, 0, 0}, IXHEAACE_SBR_MODE_MONO}, - {72000, 88000, {10, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, - {88000, 160001, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, - {160001, 288001, {13, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + /*** 44100hz 1ch SBR_AAC ***/ + {24000, 36000, {4, 4}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 60000, {7, 6}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 8}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {72000, 100000, {11, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 264601, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 44100hz 2ch ***/ - {12000, 16000, {0, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {16000, 22000, {1, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {22000, 26000, {2, 1}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {26000, 30000, {3, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {30000, 34000, {3, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {34000, 38000, {4, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {38000, 44000, {5, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {44000, 52000, {6, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {52000, 60000, {8, 5}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {60000, 68000, {9, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {68000, 76000, {10, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {76000, 90000, {11, 7}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {90000, 112000, {11, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {112000, 132000, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {132000, 180000, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {180000, 288001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + /*** 44100hz 2ch SBR_AAC ***/ + {32000, 60000, {4, 4}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {7, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {9, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {11, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 529201, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}}, {{ - /*** 48000hz 1ch ***/ - {12000, 16000, {0, 0}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {16000, 22000, {1, 1}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {22000, 30000, {2, 3}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {30000, 36000, {4, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {36000, 40000, {5, 4}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {40000, 48000, {6, 5}, 0, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {48000, 60000, {7, 6}, 1, {3, 0, 3}, IXHEAACE_SBR_MODE_MONO}, - {60000, 72000, {9, 6}, 1, {3, 0, 0}, IXHEAACE_SBR_MODE_MONO}, - {72000, 88000, {10, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, - {88000, 160001, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, - {160001, 288001, {13, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_MONO}, + /*** 48000hz 1ch SBR_AAC ***/ + {24000, 36000, {4, 9}, 3, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {36000, 60000, {7, 10}, 2, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {60000, 72000, {9, 10}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {72000, 100000, {11, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, + {100000, 288001, {13, 11}, 1, {2, 0, 3}, IXHEAACE_SBR_MODE_MONO}, {0}}, { - /*** 48000hz 2ch ***/ - {12000, 16000, {0, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {16000, 22000, {0, 0}, 0, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {22000, 26000, {1, 1}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {26000, 30000, {2, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {30000, 34000, {3, 3}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {34000, 38000, {4, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {38000, 44000, {2, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {44000, 52000, {6, 4}, 0, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {52000, 60000, {8, 5}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {60000, 68000, {9, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {68000, 76000, {10, 6}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {76000, 90000, {11, 7}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {90000, 112000, {11, 8}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {112000, 132000, {12, 9}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {132000, 180000, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, - {180000, 288001, {15, 12}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + /*** 48000hz 2ch SBR_AAC ***/ + {32000, 60000, {4, 9}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {7, 10}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {80000, 112000, {9, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {112000, 144000, {11, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, + {144000, 576001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {0}}} }, From 1e660479c865ba2af3f86a4bf9ccd00289817243 Mon Sep 17 00:00:00 2001 From: wrapper Date: Sun, 24 Aug 2025 13:31:40 +0700 Subject: [PATCH 27/27] fix sbr 2 --- encoder/ixheaace_sbr_rom.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/encoder/ixheaace_sbr_rom.c b/encoder/ixheaace_sbr_rom.c index 0a739ed..bb52192 100644 --- a/encoder/ixheaace_sbr_rom.c +++ b/encoder/ixheaace_sbr_rom.c @@ -927,7 +927,7 @@ const ixheaace_str_qmf_tabs ixheaace_qmf_tab = { { /*** 48000hz 2ch SBR_AAC ***/ {32000, 60000, {4, 9}, 3, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, - {60000, 80000, {7, 10}, 2, {3, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, + {60000, 80000, {7, 10}, 2, {2, 0, -3}, IXHEAACE_SBR_MODE_SWITCH_LRC}, {80000, 112000, {9, 10}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {112000, 144000, {11, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT}, {144000, 576001, {13, 11}, 1, {3, 0, -3}, IXHEAACE_SBR_MODE_LEFT_RIGHT},