diff options
182 files changed, 3580 insertions, 6381 deletions
@@ -108,15 +108,10 @@ cc_library_static { "decoder/drc_src/impd_drc_filter_bank.c", "decoder/drc_src/impd_drc_gain_dec.c", "decoder/drc_src/impd_drc_gain_decoder.c", - "decoder/drc_src/impd_drc_host_params.c", "decoder/drc_src/impd_drc_init.c", "decoder/drc_src/impd_drc_interface_decoder.c", - "decoder/drc_src/impd_drc_interface_parser.c", "decoder/drc_src/impd_drc_loudness_control.c", - "decoder/drc_src/impd_drc_main_qmf_process.c", - "decoder/drc_src/impd_drc_main_stft_process.c", "decoder/drc_src/impd_drc_main_td_process.c", - "decoder/drc_src/impd_drc_main_td_qmf_process.c", "decoder/drc_src/impd_drc_multiband.c", "decoder/drc_src/impd_drc_parametric_dec.c", "decoder/drc_src/impd_drc_peak_limiter.c", diff --git a/CMakeLists.txt b/CMakeLists.txt index 1a17b34..471681e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,15 +121,10 @@ list( "${XAAC_ROOT}/decoder/drc_src/impd_drc_filter_bank.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_gain_dec.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_gain_decoder.c" - "${XAAC_ROOT}/decoder/drc_src/impd_drc_host_params.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_init.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_interface_decoder.c" - "${XAAC_ROOT}/decoder/drc_src/impd_drc_interface_parser.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_loudness_control.c" - "${XAAC_ROOT}/decoder/drc_src/impd_drc_main_qmf_process.c" - "${XAAC_ROOT}/decoder/drc_src/impd_drc_main_stft_process.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_main_td_process.c" - "${XAAC_ROOT}/decoder/drc_src/impd_drc_main_td_qmf_process.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_multiband.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_parametric_dec.c" "${XAAC_ROOT}/decoder/drc_src/impd_drc_peak_limiter.c" @@ -1,3 +1,3 @@ -marcone@google.com +# owners for external/libxaac +include platform/frameworks/av:/media/janitors/OWNERS-codecs essick@google.com -lajos@google.com diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg new file mode 100644 index 0000000..ecf8b8e --- /dev/null +++ b/PREUPLOAD.cfg @@ -0,0 +1,2 @@ +[Hook Scripts] +mainline_hook = ${REPO_ROOT}/frameworks/av/tools/mainline_hook_project.sh diff --git a/decoder/armv7/ixheaacd_fft_armv7.c b/decoder/armv7/ixheaacd_fft_armv7.c index f4ee8de..cf6e1b5 100644 --- a/decoder/armv7/ixheaacd_fft_armv7.c +++ b/decoder/armv7/ixheaacd_fft_armv7.c @@ -1,10 +1,10 @@ #include <stdlib.h> #include <stdio.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_interface.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> +#include "ixheaacd_basic_ops32.h" #include "ixheaacd_function_selector.h" extern const WORD32 ixheaacd_twiddle_table_fft_32x32[514]; diff --git a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c index e950ea1..75ca6b3 100644 --- a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c +++ b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_sbrdecsettings.h" @@ -37,7 +37,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_pulsedata.h" @@ -50,7 +50,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_block.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" diff --git a/decoder/armv7/ixheaacd_function_selector_armv7.c b/decoder/armv7/ixheaacd_function_selector_armv7.c index cde6269..c9f41f9 100644 --- a/decoder/armv7/ixheaacd_function_selector_armv7.c +++ b/decoder/armv7/ixheaacd_function_selector_armv7.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_sbrdecsettings.h" @@ -37,7 +37,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_pulsedata.h" @@ -53,7 +53,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_block.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -199,11 +199,11 @@ VOID(*ixheaacd_mps_complex_fft_64) WORD32 nlength) = &ixheaacd_mps_complex_fft_64_armv7; VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_armv7; VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_armv7; VOID(*ixheaacd_calc_pre_twid) @@ -215,8 +215,9 @@ VOID(*ixheaacd_calc_post_twid) const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_armv7; VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_armv7; +(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_armv7; VOID(*ixheaacd_mps_synt_out_calc) (WORD32 resolution, WORD32 *out, WORD32 *state, diff --git a/decoder/armv7/ixheaacd_qmf_dec_armv7.c b/decoder/armv7/ixheaacd_qmf_dec_armv7.c index d02d874..e87ab36 100644 --- a/decoder/armv7/ixheaacd_qmf_dec_armv7.c +++ b/decoder/armv7/ixheaacd_qmf_dec_armv7.c @@ -20,7 +20,7 @@ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" @@ -41,7 +41,7 @@ #include "ixheaacd_env_extr.h" #include "ixheaacd_qmf_dec.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_env_calc.h" #include "ixheaacd_interface.h" diff --git a/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s b/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s index 01736b1..78686c3 100644 --- a/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s +++ b/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s @@ -6,9 +6,10 @@ ixheaacd_sbr_qmfanal32_winadds_eld: STMFD sp!, {R4-R12, R14} - LDR R5, [SP, #44] @filterStates - LDR R6, [SP, #48] @timeIn - LDR R7, [SP, #52] @stride + VPUSH {D8 - D15} + LDR R5, [SP, #108] @filterStates + LDR R6, [SP, #112] @timeIn + LDR R7, [SP, #116] @stride MOV R9, R7, LSL #1 @@ -43,7 +44,7 @@ LOOP: BPL LOOP - LDR R4, [SP, #40] @winAdd + LDR R4, [SP, #104] @winAdd MOV R5, #8 VLD1.16 D0, [R0]! @tmpQ1[n + 0] load and incremented R0 by 8 @@ -242,5 +243,5 @@ LOOP_1: VMLAL.S16 Q15, D18, D19 VST1.32 {Q15}, [R11]! - + VPOP {D8 - D15} LDMFD sp!, {R4-R12, R15} diff --git a/decoder/armv8/ixheaacd_function_selector_armv8.c b/decoder/armv8/ixheaacd_function_selector_armv8.c index bf28a30..351e472 100644 --- a/decoder/armv8/ixheaacd_function_selector_armv8.c +++ b/decoder/armv8/ixheaacd_function_selector_armv8.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_sbrdecsettings.h" @@ -37,7 +37,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_pulsedata.h" @@ -53,7 +53,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_block.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -198,11 +198,11 @@ VOID(*ixheaacd_mps_complex_fft_64) WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; VOID(*ixheaacd_calc_pre_twid) @@ -214,8 +214,9 @@ VOID(*ixheaacd_calc_post_twid) const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; +(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; VOID(*ixheaacd_mps_synt_out_calc) (WORD32 resolution, WORD32 *out, WORD32 *state, diff --git a/decoder/armv8/ixheaacd_qmf_dec_armv8.c b/decoder/armv8/ixheaacd_qmf_dec_armv8.c index 112f138..2ba9e9f 100644 --- a/decoder/armv8/ixheaacd_qmf_dec_armv8.c +++ b/decoder/armv8/ixheaacd_qmf_dec_armv8.c @@ -19,7 +19,7 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" @@ -40,7 +40,7 @@ #include "ixheaacd_env_extr.h" #include "ixheaacd_qmf_dec.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_env_calc.h" #include "ixheaacd_interface.h" @@ -88,22 +88,22 @@ VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output, for (n = 1; n < DCT3_LEN / 2; n++) { temp1[0] = *ptr_forward++; temp1[1] = *ptr_reverse--; - temp1[0] = ixheaacd_add32(ixheaacd_shr32(temp1[0], LP_SHIFT_VAL), - ixheaacd_shr32(temp1[1], LP_SHIFT_VAL)); + temp1[0] = ixheaacd_add32_sat(ixheaacd_shr32(temp1[0], LP_SHIFT_VAL), + ixheaacd_shr32(temp1[1], LP_SHIFT_VAL)); temp1[2] = *(ptr_forward - 33); temp1[3] = *(ptr_reverse - 31); - temp1[1] = ixheaacd_sub32(ixheaacd_shr32(temp1[2], LP_SHIFT_VAL), - ixheaacd_shr32(temp1[3], LP_SHIFT_VAL)); + temp1[1] = ixheaacd_sub32_sat(ixheaacd_shr32(temp1[2], LP_SHIFT_VAL), + ixheaacd_shr32(temp1[3], LP_SHIFT_VAL)); twid_re = *twidle_fwd++; twid_im = *twidle_fwd; twidle_fwd += 3; - *p_out++ = ixheaacd_mult32x16in32(temp1[0], twid_re) + - ixheaacd_mult32x16in32(temp1[1], twid_im); - *p_out++ = -ixheaacd_mult32x16in32(temp1[1], twid_re) + - ixheaacd_mult32x16in32(temp1[0], twid_im); + *p_out++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32(temp1[0], twid_re), + ixheaacd_mult32x16in32(temp1[1], twid_im)); + *p_out++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(temp1[0], twid_im), + ixheaacd_mult32x16in32(temp1[1], twid_re)); } twid_re = *twidle_fwd++; @@ -113,15 +113,15 @@ VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output, temp1[1] = *ptr_reverse--; temp1[0] = *(ptr_reverse - 31); - temp1[1] = ixheaacd_sub32(ixheaacd_shr32(temp1[1], LP_SHIFT_VAL), - ixheaacd_shr32(temp1[0], LP_SHIFT_VAL)); + temp1[1] = ixheaacd_sub32_sat(ixheaacd_shr32(temp1[1], LP_SHIFT_VAL), + ixheaacd_shr32(temp1[0], LP_SHIFT_VAL)); temp1[0] = temp1[1]; - temp2[2] = ixheaacd_mult32x16in32(temp1[0], twid_re) + - ixheaacd_mult32x16in32(temp1[1], twid_im); - temp2[3] = -ixheaacd_mult32x16in32(temp1[1], twid_re) + - ixheaacd_mult32x16in32(temp1[0], twid_im); + temp2[2] = ixheaacd_add32_sat(ixheaacd_mult32x16in32(temp1[0], twid_re), + ixheaacd_mult32x16in32(temp1[1], twid_im)); + temp2[3] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(temp1[0], twid_im), + ixheaacd_mult32x16in32(temp1[1], twid_re)); ptr_forward = output; ptr_reverse = &output[DCT3_LEN - 1]; @@ -129,10 +129,12 @@ VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output, temp2[0] = *ptr_forward++; temp2[1] = *ptr_forward--; - temp1[0] = -temp2[1] - temp2[3]; - temp1[1] = temp2[0] - temp2[2]; - temp2[0] = (temp2[0] + temp2[2] + temp1[0]); - temp2[1] = (temp2[1] - temp2[3] + temp1[1]); + temp1[0] = ixheaacd_negate32_sat(ixheaacd_add32_sat(temp2[1], temp2[3])); + temp1[1] = ixheaacd_sub32_sat(temp2[0], temp2[2]); + temp2[0] = + ixheaacd_add32_sat(ixheaacd_add32_sat(temp2[0], temp2[2]), temp1[0]); + temp2[1] = + ixheaacd_add32_sat(ixheaacd_sub32_sat(temp2[1], temp2[3]), temp1[1]); temp2[0] >>= 1; temp2[1] >>= 1; @@ -154,25 +156,25 @@ VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output, twid_im = *twidle_fwd; twidle_fwd += 2; - temp1[0] = temp2[0] - temp2[2]; - temp1[1] = (temp2[0] + temp2[2]); + temp1[0] = ixheaacd_sub32_sat(temp2[0], temp2[2]); + temp1[1] = ixheaacd_add32_sat(temp2[0], temp2[2]); - temp1[2] = temp2[1] + temp2[3]; - temp1[3] = (temp2[1] - temp2[3]); + temp1[2] = ixheaacd_add32_sat(temp2[1], temp2[3]); + temp1[3] = ixheaacd_sub32_sat(temp2[1], temp2[3]); - temp1[4] = ixheaacd_mult32x16in32(temp1[0], twid_re) + - ixheaacd_mult32x16in32(temp1[2], twid_im); - temp1[5] = -ixheaacd_mult32x16in32(temp1[2], twid_re) + - ixheaacd_mult32x16in32(temp1[0], twid_im); + temp1[4] = ixheaacd_add32_sat(ixheaacd_mult32x16in32(temp1[0], twid_re), + ixheaacd_mult32x16in32(temp1[2], twid_im)); + temp1[5] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(temp1[0], twid_im), + ixheaacd_mult32x16in32(temp1[2], twid_re)); temp1[1] >>= 1; temp1[3] >>= 1; - *ptr_forward++ = temp1[1] - temp1[4]; - *ptr_forward++ = temp1[3] + temp1[5]; + *ptr_forward++ = ixheaacd_sub32_sat(temp1[1], temp1[4]); + *ptr_forward++ = ixheaacd_add32_sat(temp1[3], temp1[5]); - *ptr_reverse-- = -temp1[3] + temp1[5]; - *ptr_reverse-- = temp1[1] + temp1[4]; + *ptr_reverse-- = ixheaacd_sub32_sat(temp1[5], temp1[3]); + *ptr_reverse-- = ixheaacd_add32_sat(temp1[1], temp1[4]); } temp2[0] = *ptr_forward++; temp2[1] = *ptr_forward--; @@ -184,21 +186,21 @@ VOID ixheaacd_dct3_32(WORD32 *input, WORD32 *output, twid_im = *twidle_fwd; twidle_fwd += 2; - temp1[0] = temp2[0] - temp2[2]; - temp1[1] = (temp2[0] + temp2[2]); + temp1[0] = ixheaacd_sub32_sat(temp2[0], temp2[2]); + temp1[1] = ixheaacd_add32_sat(temp2[0], temp2[2]); - temp1[2] = temp2[1] + temp2[3]; - temp1[3] = (temp2[1] - temp2[3]); + temp1[2] = ixheaacd_add32_sat(temp2[1], temp2[3]); + temp1[3] = ixheaacd_sub32_sat(temp2[1], temp2[3]); - temp1[4] = ixheaacd_mult32x16in32(temp1[0], twid_re) - - ixheaacd_mult32x16in32(temp1[2], twid_im); - temp1[5] = ixheaacd_mult32x16in32(temp1[2], twid_re) + - ixheaacd_mult32x16in32(temp1[0], twid_im); + temp1[4] = ixheaacd_sub32_sat(ixheaacd_mult32x16in32(temp1[0], twid_re), + ixheaacd_mult32x16in32(temp1[2], twid_im)); + temp1[5] = ixheaacd_add32_sat(ixheaacd_mult32x16in32(temp1[2], twid_re), + ixheaacd_mult32x16in32(temp1[0], twid_im)); temp1[1] >>= 1; temp1[3] >>= 1; - *ptr_forward++ = temp1[1] + temp1[4]; - *ptr_forward++ = temp1[3] + temp1[5]; + *ptr_forward++ = ixheaacd_add32_sat(temp1[1], temp1[4]); + *ptr_forward++ = ixheaacd_add32_sat(temp1[3], temp1[5]); ixheaacd_radix4bfly(w_16, output, 1, 4); ixheaacd_postradixcompute4(input, output, p_table, 16); @@ -314,7 +316,7 @@ VOID ixheaacd_fwd_modulation(const WORD32 *p_time_in1, WORD32 *real_subband, *t_real_subband++ = ixheaacd_sub32_sat(temp1, temp2); ; - *t_imag_subband++ = ixheaacd_add32(temp1, temp2); + *t_imag_subband++ = ixheaacd_add32_sat(temp1, temp2); ; } @@ -332,8 +334,8 @@ VOID ixheaacd_fwd_modulation(const WORD32 *p_time_in1, WORD32 *real_subband, im = *imag_subband; cosh = *tcos++; sinh = *tcos++; - *real_subband++ = ixheaacd_add32(ixheaacd_mult32x16in32_shl(re, cosh), - ixheaacd_mult32x16in32_shl(im, sinh)); + *real_subband++ = ixheaacd_add32_sat(ixheaacd_mult32x16in32_shl(re, cosh), + ixheaacd_mult32x16in32_shl(im, sinh)); *imag_subband++ = ixheaacd_sub32_sat(ixheaacd_mult32x16in32_shl(im, cosh), ixheaacd_mult32x16in32_shl(re, sinh)); } @@ -582,27 +584,27 @@ VOID ixheaacd_esbr_radix4bfly(const WORD32 *w, WORD32 *x, WORD32 index1, mul_11 = ixheaacd_mult64(xt2_0, co30); mul_3 = ixheaacd_mult64(yt2_0, si30); - x[l2] = (WORD32)((mul_3 + mul_11) >> 32) << RADIXSHIFT; + x[l2] = ixheaacd_sat64_32(((mul_3 + mul_11) >> 32) << RADIXSHIFT); mul_5 = ixheaacd_mult64(xt2_0, si30); mul_9 = ixheaacd_mult64(yt2_0, co30); - x[l2 + 1] = (WORD32)((mul_9 - mul_5) >> 32) << RADIXSHIFT; + x[l2 + 1] = ixheaacd_sat64_32(((mul_9 - mul_5) >> 32) << RADIXSHIFT); mul_12 = ixheaacd_mult64(xt0_0, co20); mul_2 = ixheaacd_mult64(yt0_0, si20); - x[l1] = (WORD32)((mul_2 + mul_12) >> 32) << RADIXSHIFT; + x[l1] = ixheaacd_sat64_32(((mul_2 + mul_12) >> 32) << RADIXSHIFT); mul_6 = ixheaacd_mult64(xt0_0, si20); mul_8 = ixheaacd_mult64(yt0_0, co20); - x[l1 + 1] = (WORD32)((mul_8 - mul_6) >> 32) << RADIXSHIFT; + x[l1 + 1] = ixheaacd_sat64_32(((mul_8 - mul_6) >> 32) << RADIXSHIFT); mul_4 = ixheaacd_mult64(xt1_0, co10); mul_1 = ixheaacd_mult64(yt1_0, si10); - x[h2] = (WORD32)((mul_1 + mul_4) >> 32) << RADIXSHIFT; + x[h2] = ixheaacd_sat64_32(((mul_1 + mul_4) >> 32) << RADIXSHIFT); mul_10 = ixheaacd_mult64(xt1_0, si10); mul_7 = ixheaacd_mult64(yt1_0, co10); - x[h2 + 1] = (WORD32)((mul_7 - mul_10) >> 32) << RADIXSHIFT; + x[h2 + 1] = ixheaacd_sat64_32(((mul_7 - mul_10) >> 32) << RADIXSHIFT); x += 2; } @@ -718,23 +720,23 @@ VOID ixheaacd_esbr_postradixcompute4(WORD32 *ptr_y, WORD32 *ptr_x, x_6 = *x0++; x_7 = *x0++; - xh0_0 = x_0 + x_4; - xh1_0 = x_1 + x_5; - xl0_0 = x_0 - x_4; - xl1_0 = x_1 - x_5; - xh0_1 = x_2 + x_6; - xh1_1 = x_3 + x_7; - xl0_1 = x_2 - x_6; - xl1_1 = x_3 - x_7; - - n00 = xh0_0 + xh0_1; - n01 = xh1_0 + xh1_1; - n10 = xl0_0 + xl1_1; - n11 = xl1_0 - xl0_1; - n20 = xh0_0 - xh0_1; - n21 = xh1_0 - xh1_1; - n30 = xl0_0 - xl1_1; - n31 = xl1_0 + xl0_1; + xh0_0 = ixheaacd_add32_sat(x_0, x_4); + xh1_0 = ixheaacd_add32_sat(x_1, x_5); + xl0_0 = ixheaacd_sub32_sat(x_0, x_4); + xl1_0 = ixheaacd_sub32_sat(x_1, x_5); + xh0_1 = ixheaacd_add32_sat(x_2, x_6); + xh1_1 = ixheaacd_add32_sat(x_3, x_7); + xl0_1 = ixheaacd_sub32_sat(x_2, x_6); + xl1_1 = ixheaacd_sub32_sat(x_3, x_7); + + n00 = ixheaacd_add32_sat(xh0_0, xh0_1); + n01 = ixheaacd_add32_sat(xh1_0, xh1_1); + n10 = ixheaacd_add32_sat(xl0_0, xl1_1); + n11 = ixheaacd_sub32_sat(xl1_0, xl0_1); + n20 = ixheaacd_sub32_sat(xh0_0, xh0_1); + n21 = ixheaacd_sub32_sat(xh1_0, xh1_1); + n30 = ixheaacd_sub32_sat(xl0_0, xl1_1); + n31 = ixheaacd_add32_sat(xl1_0, xl0_1); y0[h2] = n00; y0[h2 + 1] = n01; @@ -754,23 +756,23 @@ VOID ixheaacd_esbr_postradixcompute4(WORD32 *ptr_y, WORD32 *ptr_x, x_e = *x2++; x_f = *x2++; - xh0_2 = x_8 + x_c; - xh1_2 = x_9 + x_d; - xl0_2 = x_8 - x_c; - xl1_2 = x_9 - x_d; - xh0_3 = x_a + x_e; - xh1_3 = x_b + x_f; - xl0_3 = x_a - x_e; - xl1_3 = x_b - x_f; - - n02 = xh0_2 + xh0_3; - n03 = xh1_2 + xh1_3; - n12 = xl0_2 + xl1_3; - n13 = xl1_2 - xl0_3; - n22 = xh0_2 - xh0_3; - n23 = xh1_2 - xh1_3; - n32 = xl0_2 - xl1_3; - n33 = xl1_2 + xl0_3; + xh0_2 = ixheaacd_add32_sat(x_8, x_c); + xh1_2 = ixheaacd_add32_sat(x_9, x_d); + xl0_2 = ixheaacd_sub32_sat(x_8, x_c); + xl1_2 = ixheaacd_sub32_sat(x_9, x_d); + xh0_3 = ixheaacd_add32_sat(x_a, x_e); + xh1_3 = ixheaacd_add32_sat(x_b, x_f); + xl0_3 = ixheaacd_sub32_sat(x_a, x_e); + xl1_3 = ixheaacd_sub32_sat(x_b, x_f); + + n02 = ixheaacd_add32_sat(xh0_2, xh0_3); + n03 = ixheaacd_add32_sat(xh1_2, xh1_3); + n12 = ixheaacd_add32_sat(xl0_2, xl1_3); + n13 = ixheaacd_sub32_sat(xl1_2, xl0_3); + n22 = ixheaacd_sub32_sat(xh0_2, xh0_3); + n23 = ixheaacd_sub32_sat(xh1_2, xh1_3); + n32 = ixheaacd_sub32_sat(xl0_2, xl1_3); + n33 = ixheaacd_add32_sat(xl1_2, xl0_3); y0[h2 + 2] = n02; y0[h2 + 3] = n03; @@ -978,8 +980,8 @@ VOID ixheaacd_esbr_cos_sin_mod(WORD32 *subband, (*ixheaacd_complex_fft_p2)(temp, &temp[8], 8, -1, &scaleshift); for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { - subband[2 * z] = temp[z] << scaleshift; - subband[2 * z + 1] = temp[z + 8] << scaleshift; + subband[2 * z] = ixheaacd_shl32_sat(temp[z], scaleshift); + subband[2 * z + 1] = ixheaacd_shl32_sat(temp[z + 8], scaleshift); } scaleshift = 0; for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { @@ -990,8 +992,8 @@ VOID ixheaacd_esbr_cos_sin_mod(WORD32 *subband, (*ixheaacd_complex_fft_p2)(temp, &temp[8], 8, -1, &scaleshift); for (z = 0; z < (qmf_bank->no_channels >> 1); z++) { - subband[64 + 2 * z] = temp[z] << scaleshift; - subband[64 + 2 * z + 1] = temp[8 + z] << scaleshift; + subband[64 + 2 * z] = ixheaacd_shl32_sat(temp[z], scaleshift); + subband[64 + 2 * z + 1] = ixheaacd_shl32_sat(temp[8 + z], scaleshift); } } @@ -1113,7 +1115,7 @@ VOID ixheaacd_esbr_fwd_modulation( *t_real_subband++ = ixheaacd_sub32_sat(temp1, temp2); ; - *t_imag_subband++ = ixheaacd_add32(temp1, temp2); + *t_imag_subband++ = ixheaacd_add32_sat(temp1, temp2); ; } @@ -1131,13 +1133,14 @@ VOID ixheaacd_esbr_fwd_modulation( im = *imag_subband; cosh = *tcos++; sinh = *tcos++; - *real_subband++ = (WORD32)((ixheaacd_add64(ixheaacd_mult64(re, cosh), - ixheaacd_mult64(im, sinh))) >> - 31); + *real_subband++ = + ixheaacd_sat64_32((ixheaacd_add64(ixheaacd_mult64(re, cosh), + ixheaacd_mult64(im, sinh))) >> + 31); *imag_subband++ = - (WORD32)((ixheaacd_sub64_sat(ixheaacd_mult64(im, cosh), - ixheaacd_mult64(re, sinh))) >> - 31); + ixheaacd_sat64_32((ixheaacd_sub64_sat(ixheaacd_mult64(im, cosh), + ixheaacd_mult64(re, sinh))) >> + 31); } } @@ -1170,7 +1173,7 @@ VOID ixheaacd_esbr_qmfsyn64_winadd(WORD32 *tmp1, WORD32 *tmp2, WORD32 *inp1, syn_out = ixheaacd_add64(syn_out, ixheaacd_mult64(tmp2[1152 + k], inp1[k + 576])); - sample_buffer[ch_fac * k] = (WORD32)(syn_out >> 31); + sample_buffer[ch_fac * k] = ixheaacd_sat64_32(syn_out >> 31); } } @@ -1276,58 +1279,58 @@ VOID ixheaacd_radix4bfly(const WORD16 *w, WORD32 *x, WORD32 index1, x_l1_0 = x[l1]; x_l2_0 = x[l2]; - xh0_0 = x_0 + x_l1_0; - xl0_0 = x_0 - x_l1_0; + xh0_0 = ixheaacd_add32_sat(x_0, x_l1_0); + xl0_0 = ixheaacd_sub32_sat(x_0, x_l1_0); - xh20_0 = x_h2_0 + x_l2_0; - xl20_0 = x_h2_0 - x_l2_0; + xh20_0 = ixheaacd_add32_sat(x_h2_0, x_l2_0); + xl20_0 = ixheaacd_sub32_sat(x_h2_0, x_l2_0); - x[0] = xh0_0 + xh20_0; - xt0_0 = xh0_0 - xh20_0; + x[0] = ixheaacd_add32_sat(xh0_0, xh20_0); + xt0_0 = ixheaacd_sub32_sat(xh0_0, xh20_0); x_1 = x[1]; x_h2_1 = x[h2 + 1]; x_l1_1 = x[l1 + 1]; x_l2_1 = x[l2 + 1]; - xh1_0 = x_1 + x_l1_1; - xl1_0 = x_1 - x_l1_1; + xh1_0 = ixheaacd_add32_sat(x_1, x_l1_1); + xl1_0 = ixheaacd_sub32_sat(x_1, x_l1_1); - xh21_0 = x_h2_1 + x_l2_1; - xl21_0 = x_h2_1 - x_l2_1; + xh21_0 = ixheaacd_add32_sat(x_h2_1, x_l2_1); + xl21_0 = ixheaacd_sub32_sat(x_h2_1, x_l2_1); - x[1] = xh1_0 + xh21_0; - yt0_0 = xh1_0 - xh21_0; + x[1] = ixheaacd_add32_sat(xh1_0, xh21_0); + yt0_0 = ixheaacd_sub32_sat(xh1_0, xh21_0); - xt1_0 = xl0_0 + xl21_0; - xt2_0 = xl0_0 - xl21_0; + xt1_0 = ixheaacd_add32_sat(xl0_0, xl21_0); + xt2_0 = ixheaacd_sub32_sat(xl0_0, xl21_0); - yt2_0 = xl1_0 + xl20_0; - yt1_0 = xl1_0 - xl20_0; + yt2_0 = ixheaacd_add32_sat(xl1_0, xl20_0); + yt1_0 = ixheaacd_sub32_sat(xl1_0, xl20_0); mul_11 = ixheaacd_mult32x16in32(xt2_0, co30); mul_3 = ixheaacd_mult32x16in32(yt2_0, si30); - x[l2] = (mul_3 + mul_11) << RADIXSHIFT; + x[l2] = ixheaacd_shl32_sat((mul_3 + mul_11), RADIXSHIFT); mul_5 = ixheaacd_mult32x16in32(xt2_0, si30); mul_9 = ixheaacd_mult32x16in32(yt2_0, co30); - x[l2 + 1] = (mul_9 - mul_5) << RADIXSHIFT; + x[l2 + 1] = ixheaacd_shl32_sat((mul_9 - mul_5), RADIXSHIFT); mul_12 = ixheaacd_mult32x16in32(xt0_0, co20); mul_2 = ixheaacd_mult32x16in32(yt0_0, si20); - x[l1] = (mul_2 + mul_12) << RADIXSHIFT; + x[l1] = ixheaacd_shl32_sat((mul_2 + mul_12), RADIXSHIFT); mul_6 = ixheaacd_mult32x16in32(xt0_0, si20); mul_8 = ixheaacd_mult32x16in32(yt0_0, co20); - x[l1 + 1] = (mul_8 - mul_6) << RADIXSHIFT; + x[l1 + 1] = ixheaacd_shl32_sat((mul_8 - mul_6), RADIXSHIFT); mul_4 = ixheaacd_mult32x16in32(xt1_0, co10); mul_1 = ixheaacd_mult32x16in32(yt1_0, si10); - x[h2] = (mul_1 + mul_4) << RADIXSHIFT; + x[h2] = ixheaacd_shl32_sat((mul_1 + mul_4), RADIXSHIFT); mul_10 = ixheaacd_mult32x16in32(xt1_0, si10); mul_7 = ixheaacd_mult32x16in32(yt1_0, co10); - x[h2 + 1] = (mul_7 - mul_10) << RADIXSHIFT; + x[h2 + 1] = ixheaacd_shl32_sat((mul_7 - mul_10), RADIXSHIFT); x += 2; } diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c index 4fea3de..62df69b 100644 --- a/decoder/drc_src/impd_drc_api.c +++ b/decoder/drc_src/impd_drc_api.c @@ -56,8 +56,6 @@ IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc); -VOID impd_drc_set_default_config_params(ia_drc_config_struct *ptr_config); - IA_ERRORCODE impd_drc_process_frame(ia_drc_api_struct *p_obj_drc); IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc); IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc); @@ -83,10 +81,10 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc); sizeof(ia_drc_sel_proc_output_struct) + \ sizeof(ia_drc_peak_limiter_struct) + sizeof(ia_drc_peak_limiter_struct) + \ sizeof(ia_drc_qmf_filt_struct) + ANALY_BUF_SIZE + SYNTH_BUF_SIZE + \ - PEAK_LIM_BUF_SIZE + MAX_BS_BUF_SIZE + /*DRC Config Bitstream*/ \ - MAX_DRC_CONFG_BUF_SIZE + /*DRC loudness info Bitstream*/ \ - MAX_LOUD_INFO_BUF_SIZE + /*DRC interface Bitstream*/ \ - MAX_INTERFACE_BUF_SIZE + \ + PEAK_LIM_BUF_SIZE + MAX_DRC_BS_BUF_SIZE + \ + MAX_DRC_CONFG_BUF_SIZE + /*DRC Config Bitstream*/ \ + MAX_LOUD_INFO_BUF_SIZE + /*DRC loudness info Bitstream*/ \ + MAX_INTERFACE_BUF_SIZE + /*DRC interface Bitstream*/ \ NUM_GAIN_DEC_INSTANCES * \ (SEL_DRC_COUNT * sizeof(ia_interp_buf_struct) * MAX_GAIN_ELE_COUNT + \ sizeof(ia_eq_set_struct) + /*non_interleaved_audio*/ \ @@ -151,19 +149,22 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, case IA_API_CMD_INIT: { switch (i_idx) { case IA_CMD_TYPE_INIT_SET_BUFF_PTR: { - p_obj_drc->p_state->persistant_ptr = + p_obj_drc->p_state->persistent_ptr = (UWORD8 *)p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] + sizeof(ia_drc_state_struct); - impd_drc_set_struct_pointer(p_obj_drc); + error_code = impd_drc_set_struct_pointer(p_obj_drc); + if (error_code) return error_code; break; } case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: { - impd_drc_set_default_config(p_obj_drc); + error_code = impd_drc_set_default_config(p_obj_drc); + if (error_code) return error_code; break; } case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: { - impd_drc_fill_mem_tables(p_obj_drc); + error_code = impd_drc_fill_mem_tables(p_obj_drc); + if (error_code) return error_code; break; } case IA_CMD_TYPE_INIT_PROCESS: { @@ -207,11 +208,16 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, } case IA_CMD_TYPE_INIT_CPY_BSF_BUFF: { memcpy(p_obj_drc->str_bit_handler.it_bit_buf + - p_obj_drc->str_bit_handler.num_bytes_bs, + p_obj_drc->str_bit_handler.num_bytes_offset_bs, p_obj_drc->pp_mem[2], p_obj_drc->str_bit_handler.num_byts_cur); p_obj_drc->str_bit_handler.num_bytes_bs = p_obj_drc->str_bit_handler.num_bytes_bs + p_obj_drc->str_bit_handler.num_byts_cur; + p_obj_drc->str_bit_handler.num_bytes_offset_bs = + p_obj_drc->str_bit_handler.num_bytes_bs; + p_obj_drc->str_bit_handler.num_total_bytes = + p_obj_drc->str_bit_handler.num_bytes_bs; + break; } case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: { @@ -268,60 +274,6 @@ 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_DEC_TYPE: { - if (*pus_value == 1) { - p_obj_drc->str_config.dec_type = DEC_TYPE_TD_QMF64; - p_obj_drc->str_config.sub_band_domain_mode = - SUBBAND_DOMAIN_MODE_QMF64; - p_obj_drc->str_config.sub_band_down_sampling_factor = - AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - p_obj_drc->str_config.sub_band_count = - AUDIO_CODEC_SUBBAND_COUNT_QMF64; - } else if (*pus_value == 2) { - p_obj_drc->str_config.dec_type = DEC_TYPE_QMF64; - p_obj_drc->str_config.sub_band_domain_mode = - SUBBAND_DOMAIN_MODE_QMF64; - p_obj_drc->str_config.sub_band_down_sampling_factor = - AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - p_obj_drc->str_config.sub_band_count = - AUDIO_CODEC_SUBBAND_COUNT_QMF64; - } else if (*pus_value == 3) { - p_obj_drc->str_config.dec_type = DEC_TYPE_STFT256; - p_obj_drc->str_config.sub_band_domain_mode = - SUBBAND_DOMAIN_MODE_STFT256; - p_obj_drc->str_config.sub_band_down_sampling_factor = - AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - p_obj_drc->str_config.sub_band_count = - AUDIO_CODEC_SUBBAND_COUNT_STFT256; - } else { - p_obj_drc->str_config.dec_type = DEC_TYPE_TD; - p_obj_drc->str_config.sub_band_domain_mode = - SUBBAND_DOMAIN_MODE_OFF; - } - - if (*pus_value < 0 || *pus_value > 3) { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DECODE_TYPE; - } - break; - } - case IA_DRC_DEC_CONFIG_PARAM_CTRL_PARAM: { - if (*pus_value < 1 || *pus_value > 39) { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CTRL_PARAM_IDX; - } - p_obj_drc->str_config.control_parameter_index = *pus_value; - break; - } - case IA_DRC_DEC_CONFIG_PARAM_PEAK_LIMITER: { - if (*pus_value < 0 || *pus_value > 1) { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PEAK_LIM_FLAG; - } - p_obj_drc->str_config.peak_limiter = *pus_value; - break; - } - - case IA_DRC_DEC_CONFIG_PARAM_VER_MODE: { - break; - } case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { if (*pus_value < 8000 || *pus_value > 96000) { return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ; @@ -338,8 +290,13 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, } case IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ: { - if ((*pus_value != 16) && (*pus_value != 32)) { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE; + switch (*pus_value) { + case 16: + case 24: + case 32: + break; + default: + return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE; } p_obj_drc->str_config.pcm_size = *pus_value; @@ -348,54 +305,9 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, } case IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT: { - if ((*pus_value != 1) && (*pus_value != 0)) { - return -1; - } - p_obj_drc->str_config.bitstream_file_format = *pus_value; - break; } case IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT: { - if ((*pus_value != 1) && (*pus_value != 0)) { - return -1; - } - p_obj_drc->str_config.interface_bitstream_present = *pus_value; - - break; - } - case IA_DRC_DEC_CONFIG_PARAM_DELAY_MODE: { - if ((*pus_value != 1) && (*pus_value != 0)) { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DELAY_MODE; - } - p_obj_drc->str_config.delay_mode = *pus_value; - - break; - } - case IA_DRC_DEC_CONFIG_PARAM_GAIN_DELAY: { - if ((*pus_value > MAX_SIGNAL_DELAY) || (*pus_value < 0)) { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_GAIN_DELAY; - } - - p_obj_drc->str_config.gain_delay_samples = *pus_value; - - break; - } - - /*Sujith: introduce error*/ - case IA_DRC_DEC_CONFIG_PARAM_AUDIO_DELAY: { - break; - } - case IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE: { - if (*pus_value < 0 || *pus_value > 1) { - return IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE; - } - p_obj_drc->str_config.constant_delay_on = *pus_value; - - break; - } - case IA_DRC_DEC_CONFIG_PARAM_ABSO_DELAY_OFF: { - p_obj_drc->str_config.absorb_delay_on = *pus_value; - break; } case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: { @@ -408,7 +320,6 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, break; } case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: { - p_obj_drc->str_bit_handler.gain_stream_flag = *pus_value; break; } @@ -460,12 +371,17 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD) { error_code = impd_process_time_domain(p_obj_drc); } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_QMF64) { - error_code = impd_init_process_audio_main_qmf(p_obj_drc); + error_code = IA_FATAL_ERROR; } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) { - error_code = impd_init_process_audio_main_stft(p_obj_drc); + error_code = IA_FATAL_ERROR; } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_TD_QMF64) { - error_code = impd_init_process_audio_main_td_qmf(p_obj_drc); + error_code = IA_FATAL_ERROR; } + p_obj_drc->str_bit_handler.byte_index_bs = + p_obj_drc->str_bit_handler.num_total_bytes - + p_obj_drc->str_bit_handler.num_bytes_bs; + p_obj_drc->str_bit_handler.num_bytes_offset_bs = 0; + break; } case IA_CMD_TYPE_DONE_QUERY: { @@ -499,22 +415,6 @@ IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, p_obj_drc->p_state->ui_exe_done = 1; break; } - case IA_API_CMD_INPUT_OVER_BS: { - p_obj_drc->str_bit_handler.cpy_over = 1; - break; - } - case IA_API_CMD_INPUT_OVER_IC_BS: { - p_obj_drc->str_bit_handler.cpy_over_ic = 1; - break; - } - case IA_API_CMD_INPUT_OVER_IL_BS: { - p_obj_drc->str_bit_handler.cpy_over_il = 1; - break; - } - case IA_API_CMD_INPUT_OVER_IN_BS: { - p_obj_drc->str_bit_handler.cpy_over_in = 1; - break; - } case IA_API_CMD_SET_INPUT_BYTES_BS: { p_obj_drc->str_bit_handler.num_byts_cur = *pus_value; break; diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h index a48cd68..6c2734a 100644 --- a/decoder/drc_src/impd_drc_api_struct_def.h +++ b/decoder/drc_src/impd_drc_api_struct_def.h @@ -71,6 +71,8 @@ typedef struct bits_handler { WORD32 num_bits_read_bs; WORD32 num_bytes_read_bs; WORD32 num_bytes_bs; + WORD32 num_bytes_offset_bs; + WORD32 num_total_bytes; WORD32 num_bits_offset_bs; WORD32 byte_index_bs; WORD32 num_byts_cur; @@ -112,7 +114,7 @@ typedef struct ia_drc_state_struct { UWORD32 ui_ir_used; WORD32 delay_in_output; WORD32 delay_adjust_samples; - pVOID persistant_ptr; + pVOID persistent_ptr; } ia_drc_state_struct; typedef struct IA_PSM_API_Struct { diff --git a/decoder/drc_src/impd_drc_bitbuffer.c b/decoder/drc_src/impd_drc_bitbuffer.c index 3750f11..de9d020 100644 --- a/decoder/drc_src/impd_drc_bitbuffer.c +++ b/decoder/drc_src/impd_drc_bitbuffer.c @@ -87,9 +87,8 @@ WORD32 impd_skip_bits_buf(ia_bit_buf_struct* it_bit_buff, WORD no_of_bits) { it_bit_buff->bit_pos = (WORD16)bit_pos; return no_of_bits; } -ia_bit_buf_struct* impd_create_bit_buf(ia_bit_buf_struct* it_bit_buff, - UWORD8* ptr_bit_buf_base, - WORD32 bit_buf_size) { +VOID impd_create_bit_buf(ia_bit_buf_struct* it_bit_buff, + UWORD8* ptr_bit_buf_base, WORD32 bit_buf_size) { it_bit_buff->ptr_bit_buf_base = ptr_bit_buf_base; it_bit_buff->ptr_bit_buf_end = ptr_bit_buf_base + bit_buf_size - 1; @@ -100,15 +99,14 @@ ia_bit_buf_struct* impd_create_bit_buf(ia_bit_buf_struct* it_bit_buff, it_bit_buff->size = bit_buf_size << 3; it_bit_buff->error = 0; - return it_bit_buff; + return; } -ia_bit_buf_struct* impd_create_init_bit_buf(ia_bit_buf_struct* it_bit_buff, - UWORD8* ptr_bit_buf_base, - WORD32 bit_buf_size) { +VOID impd_create_init_bit_buf(ia_bit_buf_struct* it_bit_buff, + UWORD8* ptr_bit_buf_base, WORD32 bit_buf_size) { impd_create_bit_buf(it_bit_buff, ptr_bit_buf_base, bit_buf_size); it_bit_buff->cnt_bits = (bit_buf_size << 3); - return (it_bit_buff); + return; } WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_drc_bs_dec_struct, @@ -121,6 +119,9 @@ WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_drc_bs_dec_struct, ia_drc_params_bs_dec_struct* ia_drc_params_struct = &p_drc_bs_dec_struct->ia_drc_params_struct; ia_drc_params_struct->drc_frame_size = frame_size; + if (sample_rate < MIN_DRC_SAMP_FREQ) { + return -1; + } ia_drc_params_struct->delta_tmin_default = impd_get_delta_tmin(sample_rate); ia_drc_params_struct->num_gain_values_max_default = ia_drc_params_struct->drc_frame_size / @@ -131,9 +132,6 @@ WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_drc_bs_dec_struct, (ia_drc_params_struct->drc_frame_size < 0.001f * sample_rate)) { return -1; } - if (sample_rate < 1000) { - return -1; - } if (ia_drc_params_struct->delta_tmin_default > ia_drc_params_struct->drc_frame_size) { @@ -159,53 +157,8 @@ WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_drc_bs_dec_struct, } } - err_code = impd_init_tbls(ia_drc_params_struct->num_gain_values_max_default, - &p_drc_bs_dec_struct->tables_default); - - return err_code; -} - -WORD32 impd_process_drc_bitstream_dec( - ia_drc_bits_dec_struct* p_drc_bs_dec_struct, ia_bit_buf_struct* it_bit_buff, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - UWORD8* bitstream_config, WORD32 num_bytes, WORD32 num_bits_offset, - WORD32* num_bits_read) { - WORD32 err_code = 0; - - WORD32 loudness_info_set_present, drc_config_present, dummy; - - if (bitstream_config == NULL) { - *num_bits_read = 0; - } else { - it_bit_buff = - impd_create_init_bit_buf(it_bit_buff, bitstream_config, num_bytes); - - dummy = impd_read_bits_buf(it_bit_buff, num_bits_offset); - if (it_bit_buff->error) return it_bit_buff->error; - - loudness_info_set_present = impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - - if (loudness_info_set_present) { - drc_config_present = impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - - if (drc_config_present) { - err_code = impd_parse_drc_config( - it_bit_buff, &p_drc_bs_dec_struct->ia_drc_params_struct, - pstr_drc_config); - - if (err_code) return (err_code); - } - - err_code = impd_parse_loudness_info_set(it_bit_buff, pstr_loudness_info); - - if (err_code) return (err_code); - } - - *num_bits_read = it_bit_buff->size - it_bit_buff->cnt_bits; - } + impd_init_tbls(ia_drc_params_struct->num_gain_values_max_default, + &p_drc_bs_dec_struct->tables_default); return err_code; } @@ -216,8 +169,7 @@ WORD32 impd_process_drc_bitstream_dec_config( WORD32 num_bytes) { WORD32 err_code = 0; - it_bit_buff = - impd_create_init_bit_buf(it_bit_buff, bitstream_config, num_bytes); + impd_create_init_bit_buf(it_bit_buff, bitstream_config, num_bytes); err_code = impd_parse_drc_config( it_bit_buff, &p_drc_bs_dec_struct->ia_drc_params_struct, pstr_drc_config); @@ -235,8 +187,7 @@ WORD32 impd_process_drc_bitstream_dec_gain( WORD32 dummy; - it_bit_buff = - impd_create_init_bit_buf(it_bit_buff, bitstream_gain, num_bytes); + impd_create_init_bit_buf(it_bit_buff, bitstream_gain, num_bytes); dummy = impd_read_bits_buf(it_bit_buff, num_bits_offset); if (it_bit_buff->error) return it_bit_buff->error; @@ -261,11 +212,9 @@ WORD32 impd_process_drc_bitstream_dec_loudness_info_set( UWORD8* bit_stream_loudness, WORD32 num_bytes_loudness) { WORD32 err_code = 0; - it_bit_buff = impd_create_init_bit_buf(it_bit_buff, bit_stream_loudness, - num_bytes_loudness); + impd_create_init_bit_buf(it_bit_buff, bit_stream_loudness, + num_bytes_loudness); err_code = impd_parse_loudness_info_set(it_bit_buff, pstr_loudness_info); - if (err_code) return (err_code); - - return 0; + return err_code; } diff --git a/decoder/drc_src/impd_drc_bitbuffer.h b/decoder/drc_src/impd_drc_bitbuffer.h index 9e29825..bb8d65a 100644 --- a/decoder/drc_src/impd_drc_bitbuffer.h +++ b/decoder/drc_src/impd_drc_bitbuffer.h @@ -34,13 +34,11 @@ typedef struct ia_bit_buf_struct { } ia_bit_buf_struct; -ia_bit_buf_struct *impd_create_bit_buf(ia_bit_buf_struct *it_bit_buff, - UWORD8 *ptr_bit_buf_base, - WORD32 bit_buf_size); +VOID impd_create_bit_buf(ia_bit_buf_struct *it_bit_buff, + UWORD8 *ptr_bit_buf_base, WORD32 bit_buf_size); -ia_bit_buf_struct *impd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff, - UWORD8 *ptr_bit_buf_base, - WORD32 bit_buf_size); +VOID impd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff, + UWORD8 *ptr_bit_buf_base, WORD32 bit_buf_size); WORD32 impd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits); diff --git a/decoder/drc_src/impd_drc_bitstream_dec_api.h b/decoder/drc_src/impd_drc_bitstream_dec_api.h index 25773d5..eb1e5ba 100644 --- a/decoder/drc_src/impd_drc_bitstream_dec_api.h +++ b/decoder/drc_src/impd_drc_bitstream_dec_api.h @@ -25,13 +25,6 @@ WORD32 impd_init_drc_bitstream_dec( WORD32 frame_size, WORD32 delay_mode, WORD32 lfe_channel_map_count, WORD32* lfe_channel_map); -WORD32 impd_process_drc_bitstream_dec( - ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, - ia_bit_buf_struct* it_bit_buff, ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - UWORD8* bitstream_config, WORD32 num_bytes, WORD32 num_bits_offset, - WORD32* num_bits_read); - WORD32 impd_process_drc_bitstream_dec_config( ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, ia_bit_buf_struct* it_bit_buff, ia_drc_config* pstr_drc_config, diff --git a/decoder/drc_src/impd_drc_common.h b/decoder/drc_src/impd_drc_common.h index 2afe708..3dbbd2c 100644 --- a/decoder/drc_src/impd_drc_common.h +++ b/decoder/drc_src/impd_drc_common.h @@ -53,6 +53,8 @@ extern "C" { #define NUM_ELE_IN_CPLX_NUM 2 #define MAX_BS_BUF_SIZE 768 +#define MAX_NUM_DRC_PAYROLL 3 +#define MAX_DRC_BS_BUF_SIZE (MAX_BS_BUF_SIZE * MAX_NUM_DRC_PAYROLL) #define MAX_DRC_CONFG_BUF_SIZE MAX_BS_BUF_SIZE #define MAX_LOUD_INFO_BUF_SIZE MAX_BS_BUF_SIZE #define MAX_INTERFACE_BUF_SIZE MAX_BS_BUF_SIZE @@ -213,6 +215,8 @@ extern "C" { #define SLOPE_FACTOR_DB_TO_LINEAR 0.1151f +#define MIN_DRC_SAMP_FREQ 1000 + #ifndef min #define min(a, b) ((a) < (b) ? (a) : (b)) #endif diff --git a/decoder/drc_src/impd_drc_dec.c b/decoder/drc_src/impd_drc_dec.c index 32da663..67dff40 100644 --- a/decoder/drc_src/impd_drc_dec.c +++ b/decoder/drc_src/impd_drc_dec.c @@ -190,6 +190,7 @@ WORD32 impd_init_selected_drc_set( } else { err = impd_select_drc_coefficients(drc_config, &drc_coefficients_uni_drc, &drc_coefficients_selected); + if (err) return err; } ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter] @@ -341,11 +342,11 @@ WORD32 impd_init_selected_drc_set( ia_filter_banks_struct); if (err) return (err); - err = impd_init_overlap_weight( + impd_init_overlap_weight( drc_coefficients_uni_drc, &(drc_config->str_drc_instruction_str[drc_instructions_selected]), ia_drc_params_struct->sub_band_domain_mode, pstr_overlap_params); - if (err) return (err); + } else { ia_gain_modifiers_struct* gain_modifiers = drc_config->str_drc_instruction_str->str_gain_modifiers_of_ch_group; diff --git a/decoder/drc_src/impd_drc_dec.h b/decoder/drc_src/impd_drc_dec.h index dbe0912..fd30f32 100644 --- a/decoder/drc_src/impd_drc_dec.h +++ b/decoder/drc_src/impd_drc_dec.h @@ -35,7 +35,7 @@ WORD32 impd_init_selected_drc_set( , shape_filter_block* shape_filter_block); -WORD32 impd_apply_gains_and_add( +VOID impd_apply_gains_and_add( ia_drc_instructions_struct* pstr_drc_instruction_arr, const WORD32 drc_instructions_index, ia_drc_params_struct* ia_drc_params_struct, diff --git a/decoder/drc_src/impd_drc_dynamic_payload.c b/decoder/drc_src/impd_drc_dynamic_payload.c index dca5466..a8a15a9 100644 --- a/decoder/drc_src/impd_drc_dynamic_payload.c +++ b/decoder/drc_src/impd_drc_dynamic_payload.c @@ -272,8 +272,10 @@ WORD32 impd_dec_times(ia_bit_buf_struct* it_bit_buff, e++; } } - str_node[k].time = time_offs + time_delta * delta_tmin; - time_offs = str_node[k].time; + time_offs += time_delta * delta_tmin; + if (time_offs >= (2 * AUDIO_CODEC_FRAME_SIZE_MAX - drc_frame_size)) + return UNEXPECTED_ERROR; + str_node[k].time = time_offs; } } return (0); @@ -295,9 +297,13 @@ WORD32 impd_drc_uni_gain_read(ia_bit_buf_struct* it_bit_buff, for (seq = 0; seq < gain_sequence_count; seq++) { WORD32 index = drc_config->str_p_loc_drc_coefficients_uni_drc[0] .gain_set_params_index_for_gain_sequence[seq]; - ia_gain_set_params_struct* gain_set_params = - &(drc_config->str_p_loc_drc_coefficients_uni_drc - ->gain_set_params[index]); + ia_gain_set_params_struct str_gain_set_params = {0}; + ia_gain_set_params_struct* gain_set_params = &str_gain_set_params; + + if (index != -1) { + gain_set_params = &(drc_config->str_p_loc_drc_coefficients_uni_drc + ->gain_set_params[index]); + } if (gain_set_params->gain_coding_profile == GAIN_CODING_PROFILE_CONSTANT) { str_spline_nodes = @@ -394,6 +400,9 @@ WORD32 impd_parse_spline_nodes(ia_bit_buf_struct* it_bit_buff, } if (it_bit_buff->ptr_bit_buf_base == NULL) { + if ((str_spline_nodes->num_nodes < 1) || + (str_spline_nodes->num_nodes > NODE_COUNT_MAX)) + return UNEXPECTED_ERROR; FLOAT32 prev_db_gain = str_spline_nodes->str_node[str_spline_nodes->num_nodes - 1].loc_db_gain; str_spline_nodes->drc_gain_coding_mode = 0; @@ -413,6 +422,9 @@ WORD32 impd_parse_spline_nodes(ia_bit_buf_struct* it_bit_buff, } else { str_spline_nodes->drc_gain_coding_mode = impd_read_bits_buf(it_bit_buff, 1); if (it_bit_buff->error == PROC_COMPLETE) { + if ((str_spline_nodes->num_nodes < 1) || + (str_spline_nodes->num_nodes > NODE_COUNT_MAX)) + return UNEXPECTED_ERROR; str_spline_nodes->drc_gain_coding_mode = 0; str_spline_nodes->str_node[0].slope = 0.0; str_spline_nodes->str_node[0].time = @@ -509,9 +521,12 @@ WORD32 impd_parse_drc_gain_sequence( } } for (k = 0; k < num_nodes_node_reservoir; k++) { - drc_gain_sequence->str_spline_nodes[i].str_node[k].time = - prev_frame_time_buf[k] - - 2 * pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size; + WORD32 tmp = prev_frame_time_buf[k] - + 2 * pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size; + if (tmp >= (2 * AUDIO_CODEC_FRAME_SIZE_MAX - + pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size)) + return UNEXPECTED_ERROR; + drc_gain_sequence->str_spline_nodes[i].str_node[k].time = tmp; } for (m = 0; m < num_nodes_cur; m++, k++) { drc_gain_sequence->str_spline_nodes[i].str_node[k].time = @@ -574,6 +589,11 @@ WORD32 impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, drc_instructions_uni_drc_v1_count = impd_read_bits_buf(it_bit_buff, 6); if (it_bit_buff->error) return it_bit_buff->error; + if (drc_config->drc_instructions_uni_drc_count + + drc_instructions_uni_drc_v1_count > + DRC_INSTRUCTIONS_COUNT_MAX) + return (UNEXPECTED_ERROR); + for (i = 0; i < drc_instructions_uni_drc_v1_count; i++) { err = impd_parse_drc_instructions_uni_drc( it_bit_buff, version, drc_config, @@ -591,9 +611,6 @@ WORD32 impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, if (str_drc_config_ext->loud_eq_instructions_flag == 1) { str_drc_config_ext->loud_eq_instructions_count = impd_read_bits_buf(it_bit_buff, 4); - if (str_drc_config_ext->loud_eq_instructions_count > - LOUD_EQ_INSTRUCTIONS_COUNT_MAX) - return UNEXPECTED_ERROR; if (it_bit_buff->error) return it_bit_buff->error; if (str_drc_config_ext->loud_eq_instructions_count > @@ -1072,7 +1089,7 @@ WORD32 impd_parser_td_filter_cascade( WORD32 impd_parse_eq_instructions( ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, ia_eq_instructions_struct* str_eq_instructions) { - WORD32 i, k, channel_count, temp; + WORD32 i, channel_count, temp; WORD32 dmix_id_present, additional_dmix_id_present, additional_dmix_id_cnt = 0; WORD32 additional_drc_set_id_present, additional_drc_set_id_cnt; @@ -1182,22 +1199,20 @@ WORD32 impd_parse_eq_instructions( str_eq_instructions->eq_ch_group_count = 0; for (i = 0; i < channel_count; i++) { - WORD32 new_group = 1; - str_eq_instructions->eq_ch_group_of_channel[i] = - impd_read_bits_buf(it_bit_buff, 7); + WORD32 tmp = impd_read_bits_buf(it_bit_buff, 7); if (it_bit_buff->error) return it_bit_buff->error; - - for (k = 0; k < i; k++) { - if (str_eq_instructions->eq_ch_group_of_channel[i] == - str_eq_instructions->eq_ch_group_of_channel[k]) { - new_group = 0; - break; - } - } - - if (new_group == 1) { - str_eq_instructions->eq_ch_group_count += 1; - } + if (tmp >= EQ_CHANNEL_GROUP_COUNT_MAX) return UNEXPECTED_ERROR; + str_eq_instructions->eq_ch_group_of_channel[i] = tmp; + } + { + WORD32 total; + WORD32 groups_used[EQ_CHANNEL_GROUP_COUNT_MAX] = {0}; + for (i = 0; i < channel_count; i++) + groups_used[str_eq_instructions->eq_ch_group_of_channel[i]] = 1; + total = 0; + for (i = 0; i < EQ_CHANNEL_GROUP_COUNT_MAX; i++) + if (groups_used[i]) total++; + str_eq_instructions->eq_ch_group_count = total; } if (str_eq_instructions->eq_ch_group_count > EQ_CHANNEL_GROUP_COUNT_MAX) @@ -1208,9 +1223,10 @@ WORD32 impd_parse_eq_instructions( if (it_bit_buff->error) return it_bit_buff->error; if (str_eq_instructions->td_filter_cascade_present) { - impd_parser_td_filter_cascade( + WORD32 err = impd_parser_td_filter_cascade( it_bit_buff, str_eq_instructions, &(str_eq_instructions->str_td_filter_cascade)); + if (err) return err; } str_eq_instructions->subband_gains_present = @@ -1219,9 +1235,10 @@ WORD32 impd_parse_eq_instructions( if (str_eq_instructions->subband_gains_present) { for (i = 0; i < str_eq_instructions->eq_ch_group_count; i++) { - str_eq_instructions->subband_gains_index[i] = - impd_read_bits_buf(it_bit_buff, 6); + WORD32 tmp = impd_read_bits_buf(it_bit_buff, 6); if (it_bit_buff->error) return it_bit_buff->error; + if (tmp >= UNIQUE_SUBBAND_GAIN_COUNT_MAX) return UNEXPECTED_ERROR; + str_eq_instructions->subband_gains_index[i] = tmp; } } diff --git a/decoder/drc_src/impd_drc_eq.c b/decoder/drc_src/impd_drc_eq.c index c9983db..c72895f 100644 --- a/decoder/drc_src/impd_drc_eq.c +++ b/decoder/drc_src/impd_drc_eq.c @@ -1254,26 +1254,6 @@ VOID impd_pole_zero_filt_process(ia_pole_zero_filt_struct* pstr_pole_zero_filt, return; } -VOID impd_subband_filter_process(ia_subband_filt_struct* pstr_subband_filt, - FLOAT32* ptr_audio_real_buff, - FLOAT32* ptr_audio_imag_buff) { - WORD32 i, j; - WORD32 eq_frame_size_subband = pstr_subband_filt->eq_frame_size_subband; - WORD32 coeff_count = pstr_subband_filt->coeff_count; - - FLOAT32* ptr_subband_coeff = pstr_subband_filt->subband_coeff; - - for (i = 0; i < eq_frame_size_subband; i++) { - for (j = 0; j < coeff_count; j++) { - ptr_audio_real_buff[j] *= ptr_subband_coeff[j]; - ptr_audio_imag_buff[j] *= ptr_subband_coeff[j]; - } - ptr_audio_real_buff += coeff_count; - ptr_audio_imag_buff += coeff_count; - } - return; -} - VOID impd_phase_align_filt_process( ia_ph_alignment_filt_struct* ph_alignment_filt, WORD32 channel, FLOAT32* ptr_audio_out) { @@ -1365,23 +1345,3 @@ WORD32 impd_process_eq_set_time_domain(ia_eq_set_struct* pstr_eq_set, return 0; } -WORD32 impd_process_eq_set_subband_domain(ia_eq_set_struct* pstr_eq_set, - WORD32 channel, - FLOAT32* ptr_audio_real_buff, - FLOAT32* ptr_audio_imag_buff) { - WORD32 g; - - if (pstr_eq_set != NULL) { - g = pstr_eq_set->eq_ch_group_of_channel[channel]; - if (g >= 0) { - if (pstr_eq_set->domain == 0) { - return (-1); - } else { - impd_subband_filter_process(&pstr_eq_set->subband_filt[g], - &ptr_audio_real_buff[0], - &ptr_audio_imag_buff[0]); - } - } - } - return (0); -} diff --git a/decoder/drc_src/impd_drc_eq.h b/decoder/drc_src/impd_drc_eq.h index d45e7ed..70c8050 100644 --- a/decoder/drc_src/impd_drc_eq.h +++ b/decoder/drc_src/impd_drc_eq.h @@ -178,11 +178,6 @@ impd_process_eq_set_td(ia_eq_set_struct* eq_set, WORD32 channel, WORD32 impd_process_eq_set_time_domain(ia_eq_set_struct* eq_set, WORD32 channel, FLOAT32* audio_in, FLOAT32* audio_out, WORD32 frame_size); -WORD32 -impd_process_eq_set_subband_domain(ia_eq_set_struct* eq_set, WORD32 channel, - FLOAT32* subbandSampleIn, - FLOAT32* subbandSampleOut); - #ifdef __cplusplus } #endif diff --git a/decoder/drc_src/impd_drc_extr_delta_coded_info.c b/decoder/drc_src/impd_drc_extr_delta_coded_info.c index a1ca0b7..babe75c 100644 --- a/decoder/drc_src/impd_drc_extr_delta_coded_info.c +++ b/decoder/drc_src/impd_drc_extr_delta_coded_info.c @@ -27,11 +27,11 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" -WORD32 impd_init_tbls(const WORD32 num_gain_max_values, - ia_tables_struct* str_tables) { +VOID impd_init_tbls(const WORD32 num_gain_max_values, + ia_tables_struct* str_tables) { impd_gen_delta_time_code_tbl(num_gain_max_values, str_tables->delta_time_code_table); - return (0); + return; } void impd_get_delta_gain_code_tbl( @@ -87,9 +87,6 @@ WORD32 impd_get_delta_tmin(const WORD32 sampling_rate) { WORD32 lowerBound = (WORD32)(0.5f + 0.0005f * sampling_rate); WORD32 result = 1; - if (sampling_rate < 1000) { - return (UNEXPECTED_ERROR); - } while (result <= lowerBound) result = result << 1; return result; } diff --git a/decoder/drc_src/impd_drc_extr_delta_coded_info.h b/decoder/drc_src/impd_drc_extr_delta_coded_info.h index b9954c0..4c28adc 100644 --- a/decoder/drc_src/impd_drc_extr_delta_coded_info.h +++ b/decoder/drc_src/impd_drc_extr_delta_coded_info.h @@ -66,8 +66,8 @@ typedef struct { ia_characteristic_node_coordinate_struct characteristicNodeCoordinate[5]; } ia_cicp_node_characteristic_param; -WORD32 -impd_init_tbls(const WORD32 num_gain_max_values, ia_tables_struct* str_tables); +VOID impd_init_tbls(const WORD32 num_gain_max_values, + ia_tables_struct* str_tables); void impd_gen_delta_time_code_tbl( const WORD32 num_gain_max_values, diff --git a/decoder/drc_src/impd_drc_fiilter_bank.c b/decoder/drc_src/impd_drc_fiilter_bank.c deleted file mode 100644 index f6637b6..0000000 --- a/decoder/drc_src/impd_drc_fiilter_bank.c +++ /dev/null @@ -1,431 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <stdio.h> -#include <stdlib.h> -#include <math.h> - -#include "impd_type_def.h" -#include "impd_drc_uni_tables.h" -#include "impd_drc_uni_common.h" -#include "impd_drc_struct.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_rom.h" - -VOID impd_compute_filt_coeff(WORD32 crossover_freq_idx, - ia_iir_filter_struct* pstr_lp_filt_coeff, - ia_iir_filter_struct* pstr_hp_filt_coeff, - ia_iir_filter_struct* pstr_ap_filt_coeff, - WORD32 filter_type) { - FLOAT32 gamma = normal_cross_freq[crossover_freq_idx].gamma; - FLOAT32 delta = normal_cross_freq[crossover_freq_idx].delta; - - if (filter_type == 0 || filter_type == 2) { - pstr_lp_filt_coeff->a0 = 1.0f; - pstr_lp_filt_coeff->a1 = 2.0f * (gamma - delta); - pstr_lp_filt_coeff->a2 = 2.0f * (gamma + delta) - 1.0f; - pstr_lp_filt_coeff->b0 = gamma; - pstr_lp_filt_coeff->b1 = 2.0f * gamma; - pstr_lp_filt_coeff->b2 = gamma; - - pstr_hp_filt_coeff->a0 = 1.0f; - pstr_hp_filt_coeff->a1 = pstr_lp_filt_coeff->a1; - pstr_hp_filt_coeff->a2 = pstr_lp_filt_coeff->a2; - pstr_hp_filt_coeff->b0 = delta; - pstr_hp_filt_coeff->b1 = -2.0f * delta; - pstr_hp_filt_coeff->b2 = delta; - } - - if (filter_type == 1 || filter_type == 2) { - pstr_ap_filt_coeff->a0 = 1.0f; - pstr_ap_filt_coeff->a1 = 2.0f * (gamma - delta); - ; - pstr_ap_filt_coeff->a2 = 2.0f * (gamma + delta) - 1.0f; - ; - pstr_ap_filt_coeff->b0 = pstr_ap_filt_coeff->a2; - pstr_ap_filt_coeff->b1 = pstr_ap_filt_coeff->a1; - pstr_ap_filt_coeff->b2 = pstr_ap_filt_coeff->a0; - } - - return; -} - -WORD32 impd_initialize_filt_bank(WORD32 num_sub_bands, - ia_gain_params_struct* gain_params, - ia_drc_filter_bank_struct* drc_filter_bank) { - ia_two_band_filt_struct* str_two_band_bank; - ia_three_band_filt_struct* str_three_band_bank; - ia_four_band_filt_struct* str_four_band_bank; - drc_filter_bank->complexity = 0; - drc_filter_bank->num_bands = num_sub_bands; - - if (num_sub_bands == 1) { - return 0; - } else if (num_sub_bands == 2) { - str_two_band_bank = &drc_filter_bank->str_two_band_bank; - impd_compute_filt_coeff(gain_params[1].crossover_freq_idx, - &(str_two_band_bank->low_pass), - &(str_two_band_bank->high_pass), NULL, 0); - } else if (num_sub_bands == 3) { - str_three_band_bank = &drc_filter_bank->str_three_band_bank; - - impd_compute_filt_coeff(gain_params[1].crossover_freq_idx, - &(str_three_band_bank->str_low_pass_stage_2), - &(str_three_band_bank->str_high_pass_stage_2), - &(str_three_band_bank->str_all_pass_stage_2), 2); - impd_compute_filt_coeff(gain_params[2].crossover_freq_idx, - &(str_three_band_bank->str_low_pass_stage_1), - &(str_three_band_bank->str_high_pass_stage_1), NULL, - 0); - } - - else if (num_sub_bands == 4) { - str_four_band_bank = &drc_filter_bank->str_four_band_bank; - - impd_compute_filt_coeff(gain_params[1].crossover_freq_idx, - &(str_four_band_bank->str_low_pass_stage_3_low), - &(str_four_band_bank->str_high_pass_stage_3_low), - &(str_four_band_bank->str_all_pass_stage_2_high), - 2); - impd_compute_filt_coeff(gain_params[2].crossover_freq_idx, - &(str_four_band_bank->str_low_pass_stage_1), - &(str_four_band_bank->str_high_pass_stage_1), NULL, - 0); - impd_compute_filt_coeff(gain_params[3].crossover_freq_idx, - &(str_four_band_bank->str_low_pass_stage_3_high), - &(str_four_band_bank->str_high_pass_stage_3_high), - &(str_four_band_bank->str_all_pass_stage_2_low), 2); - } else { - return -1; - } - - return 0; -} - -WORD32 impd_init_all_filter_banks( - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc, - ia_drc_instructions_struct* str_drc_instruction_str, - ia_filter_banks_struct* ia_filter_banks_struct) { - WORD32 err_code = 0; - WORD32 b, g, i, k, m, s, crossover_freq_idx, num_ch_in_groups, - num_ph_align_ch_groups; - WORD32 match_found = 0, num_filter; - WORD32 cascade_cross_idx[CHANNEL_GROUP_COUNT_MAX + 1] - [CHANNEL_GROUP_COUNT_MAX * 3]; - WORD32 count[CHANNEL_GROUP_COUNT_MAX + 1]; - - num_ch_in_groups = 0; - num_ph_align_ch_groups = str_drc_instruction_str->num_drc_ch_groups; - - for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { - num_ch_in_groups += str_drc_instruction_str->num_chan_per_ch_group[g]; - } - - if (num_ch_in_groups < str_drc_instruction_str->audio_num_chan) { - num_ph_align_ch_groups++; - } - - ia_filter_banks_struct->nfilter_banks = - str_drc_instruction_str->num_drc_ch_groups; - ia_filter_banks_struct->num_ph_align_ch_groups = num_ph_align_ch_groups; - - if (str_p_loc_drc_coefficients_uni_drc == NULL) { - ia_filter_banks_struct->str_drc_filter_bank->num_bands = 1; - } else { - for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { - err_code = impd_initialize_filt_bank( - str_p_loc_drc_coefficients_uni_drc - ->gain_set_params[str_drc_instruction_str - ->gain_set_index_for_channel_group[g]] - .band_count, - str_p_loc_drc_coefficients_uni_drc - ->gain_set_params[str_drc_instruction_str - ->gain_set_index_for_channel_group[g]] - .gain_params, - &(ia_filter_banks_struct->str_drc_filter_bank[g])); - if (err_code != 0) return (err_code); - } - } - - for (g = 0; g < CHANNEL_GROUP_COUNT_MAX + 1; g++) { - count[g] = 0; - } - for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { - for (b = 1; - b < str_p_loc_drc_coefficients_uni_drc - ->gain_set_params[str_drc_instruction_str - ->gain_set_index_for_channel_group[g]] - .band_count; - b++) { - crossover_freq_idx = - str_p_loc_drc_coefficients_uni_drc - ->gain_set_params[str_drc_instruction_str - ->gain_set_index_for_channel_group[g]] - .gain_params[b] - .crossover_freq_idx; - for (k = 0; k < num_ph_align_ch_groups; k++) { - if (k != g) { - cascade_cross_idx[k][count[k]] = crossover_freq_idx; - count[k]++; - if (count[k] > CHANNEL_GROUP_COUNT_MAX * 3) { - return -1; - } - } - } - } - } - - i = 0; - while (i < count[0]) { - crossover_freq_idx = cascade_cross_idx[0][i]; - match_found = 0; - for (g = 1; g < num_ph_align_ch_groups; g++) { - match_found = 0; - for (k = 0; k < count[g]; k++) { - if (cascade_cross_idx[g][k] == crossover_freq_idx) { - match_found = 1; - break; - } - } - if (match_found == 0) break; - } - if (match_found == 1) { - for (g = 0; g < num_ph_align_ch_groups; g++) { - for (m = 0; m < count[g]; m++) { - if (cascade_cross_idx[g][m] == crossover_freq_idx) { - for (s = m + 1; s < count[g]; s++) { - cascade_cross_idx[g][s - 1] = cascade_cross_idx[g][s]; - } - count[g]--; - break; - } - } - } - i = 0; - } else { - i++; - } - } - - for (g = 0; g < num_ph_align_ch_groups; g++) { - num_filter = count[g]; - if (num_filter > 0) { - for (i = 0; i < num_filter; i++) { - impd_compute_filt_coeff( - cascade_cross_idx[g][i], NULL, NULL, - &(ia_filter_banks_struct->str_drc_filter_bank[g] - .str_all_pass_cascade.str_all_pass_cascade_filter[i] - .str_all_pass_stage), - 1); - } - ia_filter_banks_struct->str_drc_filter_bank[g] - .str_all_pass_cascade.num_filter = num_filter; - } - - if (err_code != 0) return (err_code); - } - - return 0; -} - -VOID impd_iir_second_order_filter_all_pass(ia_iir_filter_struct* filter, - WORD32 chan_idx, WORD32 frame_len, - FLOAT32* input, FLOAT32* output) { - WORD32 i; - FLOAT32 tmp; - FLOAT32 a1 = filter->a1; - FLOAT32 a2 = filter->a2; - FLOAT32 b0 = filter->b0; - FLOAT32 b1 = filter->b1; - FLOAT32 b2 = filter->b2; - - FLOAT32 st1 = filter->x_p[chan_idx * 2]; - FLOAT32 st2 = filter->y_p[chan_idx * 2]; - - for (i = 0; i < frame_len; i++) { - tmp = input[i]; - output[i] = b0 * tmp + st1; - st1 = b1 * tmp - a1 * output[i] + st2; - st2 = b2 * tmp - a2 * output[i]; - } - filter->x_p[chan_idx * 2] = st1; - filter->y_p[chan_idx * 2] = st2; - - return; -} - -VOID impd_apply_low_high_filter(ia_iir_filter_struct* pstr_lp_filt_coeff, - ia_iir_filter_struct* pstr_hp_filt_coeff, - WORD32 chan_idx, WORD32 frame_len, - FLOAT32* input, FLOAT32* output[]) { - WORD32 i; - FLOAT32 tmp, tmp1; - FLOAT32 a1_l = pstr_lp_filt_coeff->a1; - FLOAT32 a2_l = pstr_lp_filt_coeff->a2; - FLOAT32 b0_l = pstr_lp_filt_coeff->b0; - FLOAT32 b1_l = pstr_lp_filt_coeff->b1; - FLOAT32 b2_l = pstr_lp_filt_coeff->b2; - - FLOAT32 st1_l = pstr_lp_filt_coeff->x_p[chan_idx * 2 + 0]; - FLOAT32 st2_l = pstr_lp_filt_coeff->x_p[chan_idx * 2 + 1]; - FLOAT32 st3_l = pstr_lp_filt_coeff->y_p[chan_idx * 2 + 0]; - FLOAT32 st4_l = pstr_lp_filt_coeff->y_p[chan_idx * 2 + 1]; - - FLOAT32 a1_h = pstr_hp_filt_coeff->a1; - FLOAT32 a2_h = pstr_hp_filt_coeff->a2; - FLOAT32 b0_h = pstr_hp_filt_coeff->b0; - FLOAT32 b1_h = pstr_hp_filt_coeff->b1; - FLOAT32 b2_h = pstr_hp_filt_coeff->b2; - - FLOAT32 st1_h = pstr_hp_filt_coeff->x_p[chan_idx * 2 + 0]; - FLOAT32 st2_h = pstr_hp_filt_coeff->x_p[chan_idx * 2 + 1]; - FLOAT32 st3_h = pstr_hp_filt_coeff->y_p[chan_idx * 2 + 0]; - FLOAT32 st4_h = pstr_hp_filt_coeff->y_p[chan_idx * 2 + 1]; - - FLOAT32* output_low = output[0]; - FLOAT32* output_high = output[1]; - - for (i = 0; i < frame_len; i++) { - tmp1 = input[i]; - tmp = b0_l * tmp1 + st1_l; - st1_l = b1_l * tmp1 - a1_l * tmp + st2_l; - st2_l = b2_l * tmp1 - a2_l * tmp; - - output_low[i] = b0_l * tmp + st3_l; - st3_l = b1_l * tmp - a1_l * output_low[i] + st4_l; - st4_l = b2_l * tmp - a2_l * output_low[i]; - - tmp = b0_h * tmp1 + st1_h; - st1_h = b1_h * tmp1 - a1_h * tmp + st2_h; - st2_h = b2_h * tmp1 - a2_h * tmp; - - output_high[i] = b0_h * tmp + st3_h; - st3_h = b1_h * tmp - a1_h * output_high[i] + st4_h; - st4_h = b2_h * tmp - a2_h * output_high[i]; - } - pstr_lp_filt_coeff->x_p[chan_idx * 2 + 0] = st1_l; - pstr_lp_filt_coeff->x_p[chan_idx * 2 + 1] = st2_l; - pstr_lp_filt_coeff->y_p[chan_idx * 2 + 0] = st3_l; - pstr_lp_filt_coeff->y_p[chan_idx * 2 + 1] = st4_l; - - pstr_hp_filt_coeff->x_p[chan_idx * 2 + 0] = st1_h; - pstr_hp_filt_coeff->x_p[chan_idx * 2 + 1] = st2_h; - pstr_hp_filt_coeff->y_p[chan_idx * 2 + 0] = st3_h; - pstr_hp_filt_coeff->y_p[chan_idx * 2 + 1] = st4_h; - - return; -} -VOID impd_two_band_filter_process(ia_two_band_filt_struct* str_two_band_bank, - WORD32 chan_idx, WORD32 frame_len, - FLOAT32* input, FLOAT32* output[]) { - ia_iir_filter_struct* pstr_lp_filt_coeff = &str_two_band_bank->low_pass; - ia_iir_filter_struct* pstr_hp_filt_coeff = &str_two_band_bank->high_pass; - - impd_apply_low_high_filter(pstr_lp_filt_coeff, pstr_hp_filt_coeff, chan_idx, - frame_len, input, output); - return; -} - -VOID impd_three_band_filter_process( - ia_three_band_filt_struct* str_three_band_bank, WORD32 c, WORD32 size, - FLOAT32* input, FLOAT32* output[]) { - WORD32 err_code = 0; - ia_iir_filter_struct* all_pass_filter; - ia_iir_filter_struct* pstr_lp_filt_coeff = - &str_three_band_bank->str_low_pass_stage_1; - ia_iir_filter_struct* pstr_hp_filt_coeff = - &str_three_band_bank->str_high_pass_stage_1; - FLOAT32* output1[2]; - output1[0] = output[0]; - output1[1] = output[1]; - - impd_apply_low_high_filter(pstr_lp_filt_coeff, pstr_hp_filt_coeff, c, size, - input, output1); - - all_pass_filter = &str_three_band_bank->str_all_pass_stage_2; - - impd_iir_second_order_filter_all_pass(all_pass_filter, c, size, output1[1], - output[2]); - pstr_lp_filt_coeff = &str_three_band_bank->str_low_pass_stage_2; - pstr_hp_filt_coeff = &str_three_band_bank->str_high_pass_stage_2; - - impd_apply_low_high_filter(pstr_lp_filt_coeff, pstr_hp_filt_coeff, c, size, - output1[0], output1); - - return; -} - -VOID impd_four_band_filter_process(ia_four_band_filt_struct* str_four_band_bank, - WORD32 cha_idx, WORD32 win_size, - FLOAT32* input, FLOAT32* output[]) { - WORD32 err_code = 0; - ia_iir_filter_struct* all_pass_filter; - ia_iir_filter_struct* pstr_lp_filt_coeff = - &str_four_band_bank->str_low_pass_stage_1; - ia_iir_filter_struct* pstr_hp_filt_coeff = - &str_four_band_bank->str_high_pass_stage_1; - FLOAT32* output1[2]; - FLOAT32* output2[2]; - output1[0] = output[0]; - output1[1] = output[1]; - output2[0] = output[2]; - output2[1] = output[3]; - - impd_apply_low_high_filter(pstr_lp_filt_coeff, pstr_hp_filt_coeff, cha_idx, - win_size, input, output1); - - all_pass_filter = &str_four_band_bank->str_all_pass_stage_2_low; - - impd_iir_second_order_filter_all_pass(all_pass_filter, cha_idx, win_size, - output1[0], output1[0]); - - all_pass_filter = &str_four_band_bank->str_all_pass_stage_2_high; - - impd_iir_second_order_filter_all_pass(all_pass_filter, cha_idx, win_size, - output1[1], output2[0]); - - pstr_lp_filt_coeff = &str_four_band_bank->str_low_pass_stage_3_low; - pstr_hp_filt_coeff = &str_four_band_bank->str_high_pass_stage_3_low; - - impd_apply_low_high_filter(pstr_lp_filt_coeff, pstr_hp_filt_coeff, cha_idx, - win_size, output1[0], output1); - - pstr_lp_filt_coeff = &str_four_band_bank->str_low_pass_stage_3_high; - pstr_hp_filt_coeff = &str_four_band_bank->str_high_pass_stage_3_high; - - impd_apply_low_high_filter(pstr_lp_filt_coeff, pstr_hp_filt_coeff, cha_idx, - win_size, output2[0], output2); - - return; -} - -VOID impd_all_pass_cascade_process( - ia_all_pass_cascade_struct* str_all_pass_cascade, WORD32 ch_idx, - WORD32 win_size, FLOAT32* input) { - WORD32 i; - - for (i = 0; i < str_all_pass_cascade->num_filter; i++) { - impd_iir_second_order_filter_all_pass( - &(str_all_pass_cascade->str_all_pass_cascade_filter[i] - .str_all_pass_stage), - ch_idx, win_size, input, input); - } - - return; -}
\ No newline at end of file diff --git a/decoder/drc_src/impd_drc_filter_bank.h b/decoder/drc_src/impd_drc_filter_bank.h index 331f0b8..da872ac 100644 --- a/decoder/drc_src/impd_drc_filter_bank.h +++ b/decoder/drc_src/impd_drc_filter_bank.h @@ -135,16 +135,15 @@ VOID impd_all_pass_cascade_process( ia_all_pass_cascade_struct* str_all_pass_cascade, WORD32 c, WORD32 size, FLOAT32* audio_in); -WORD32 -impd_shape_filt_block_init( +VOID impd_shape_filt_block_init( ia_shape_filter_block_params_struct* pstr_shape_filter_block_params, shape_filter_block* shape_filter_block); -WORD32 -impd_shape_filt_block_adapt(const FLOAT32 drc_gain, - shape_filter_block* shape_filter_block); +VOID impd_shape_filt_block_adapt(const FLOAT32 drc_gain, + shape_filter_block* shape_filter_block); -WORD32 impd_shape_filt_block_time_process( - shape_filter_block* shape_filter_block, FLOAT32* drc_gain, - const WORD32 channel, FLOAT32* audio_in, WORD32 start, WORD32 end); +VOID impd_shape_filt_block_time_process(shape_filter_block* shape_filter_block, + FLOAT32* drc_gain, const WORD32 channel, + FLOAT32* audio_in, WORD32 start, + WORD32 end); #endif diff --git a/decoder/drc_src/impd_drc_gain_dec.c b/decoder/drc_src/impd_drc_gain_dec.c index accce93..dc7430f 100644 --- a/decoder/drc_src/impd_drc_gain_dec.c +++ b/decoder/drc_src/impd_drc_gain_dec.c @@ -34,14 +34,13 @@ #include "impd_drc_eq.h" #include "impd_drc_gain_decoder.h" -extern ia_cicp_sigmoid_characteristic_param_struct +extern const ia_cicp_sigmoid_characteristic_param_struct pstr_cicp_sigmoid_characteristic_param[]; -WORD32 impd_gain_db_to_lin(ia_interp_params_struct* interp_params_str, - WORD32 drc_band, FLOAT32 in_param_db_gain, - FLOAT32 in_param_db_slope, - FLOAT32* out_param_lin_gain, - FLOAT32* out_param_lin_slope) { +VOID impd_gain_db_to_lin(ia_interp_params_struct* interp_params_str, + WORD32 drc_band, FLOAT32 in_param_db_gain, + FLOAT32 in_param_db_slope, FLOAT32* out_param_lin_gain, + FLOAT32* out_param_lin_slope) { FLOAT32 loc_db_gain = in_param_db_gain; FLOAT32 gain_ratio = 1.0; @@ -93,7 +92,7 @@ WORD32 impd_gain_db_to_lin(ia_interp_params_struct* interp_params_str, } } } - return (0); + return; } WORD32 @@ -191,8 +190,7 @@ impd_compressor_io_nodes_rt( return (0); } -WORD32 -impd_compressor_io_nodes_inverse( +VOID impd_compressor_io_nodes_inverse( ia_split_drc_characteristic_struct* split_drc_characteristic, FLOAT32 loc_db_gain, FLOAT32* in_level) { WORD32 n; @@ -238,7 +236,7 @@ impd_compressor_io_nodes_inverse( } } } - return (0); + return; } WORD32 @@ -256,9 +254,9 @@ impd_map_gain( if (err) return (err); break; case CHARACTERISTIC_NODES: - err = impd_compressor_io_nodes_inverse(split_drc_characteristic_source, - gain_in_db, &inLevel); - if (err) return (err); + impd_compressor_io_nodes_inverse(split_drc_characteristic_source, + gain_in_db, &inLevel); + break; case CHARACTERISTIC_PASS_THRU: inLevel = gain_in_db; @@ -433,15 +431,15 @@ WORD32 impd_interpolate_drc_gain(ia_interp_params_struct* interp_params_str, return (UNEXPECTED_ERROR); } + err = impd_conv_to_linear_domain(interp_params_str, drc_band, gain0, slope0, + &gain_t1, &slope_t1); + if (err) return (err); + err = impd_conv_to_linear_domain(interp_params_str, drc_band, gain1, slope1, + &gain_t2, &slope_t2); + if (err) return (err); + if (interp_params_str->gain_interpolation_type == GAIN_INTERPOLATION_TYPE_SPLINE) { - err = impd_conv_to_linear_domain(interp_params_str, drc_band, gain0, slope0, - &gain_t1, &slope_t1); - if (err) return (err); - err = impd_conv_to_linear_domain(interp_params_str, drc_band, gain1, slope1, - &gain_t2, &slope_t2); - if (err) return (err); - slope_t1 = slope_t1 / (FLOAT32)interp_params_str->delta_tmin; slope_t2 = slope_t2 / (FLOAT32)interp_params_str->delta_tmin; if ((FLOAT32)fabs((FLOAT64)slope_t1) > (FLOAT32)fabs((FLOAT64)slope_t2)) { @@ -522,14 +520,9 @@ WORD32 impd_interpolate_drc_gain(ia_interp_params_struct* interp_params_str, } } } else { - err = impd_conv_to_linear_domain(interp_params_str, drc_band, gain1, slope1, - &gain_t2, &slope_t2); - if (err) return (err); - - a = 0; - b = gain_t2; - - result[0] = gain_t2; + a = (gain_t2 - gain_t1) / (FLOAT32)gain_step_tdomain; + b = gain_t1; + result[0] = gain_t1; result[gain_step_tdomain] = gain_t2; for (n = 1; n < gain_step_tdomain; n++) { FLOAT32 t = (FLOAT32)n; @@ -539,8 +532,8 @@ WORD32 impd_interpolate_drc_gain(ia_interp_params_struct* interp_params_str, return 0; } -WORD32 -impd_advance_buf(WORD32 drc_frame_size, ia_gain_buffer_struct* pstr_gain_buf) { +VOID impd_advance_buf(WORD32 drc_frame_size, + ia_gain_buffer_struct* pstr_gain_buf) { WORD32 n; ia_interp_buf_struct* buf_interpolation; @@ -552,7 +545,7 @@ impd_advance_buf(WORD32 drc_frame_size, ia_gain_buffer_struct* pstr_gain_buf) { buf_interpolation->lpcm_gains + drc_frame_size, sizeof(FLOAT32) * (drc_frame_size + MAX_SIGNAL_DELAY)); } - return (0); + return; } WORD32 impd_concatenate_segments(WORD32 drc_frame_size, WORD32 drc_band, @@ -648,9 +641,8 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, interp_params_str.clipping_flag = 0; } - err = impd_advance_buf(ia_drc_params_struct->drc_frame_size, - &(drc_gain_buffers->pstr_gain_buf[sel_drc_index])); - if (err) return (err); + impd_advance_buf(ia_drc_params_struct->drc_frame_size, + &(drc_gain_buffers->pstr_gain_buf[sel_drc_index])); gainElementIndex = 0; for (g = 0; g < num_drc_ch_groups; g++) { @@ -734,7 +726,7 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, .buf_interpolation[gainElementIndex]) .lpcm_gains + MAX_SIGNAL_DELAY; - err = impd_parametric_lim_type_drc_process( + impd_parametric_lim_type_drc_process( p_drc_gain_dec_structs->audio_in_out_buf.audio_in_out_buf, loudness_normalization_gain_db, &p_drc_gain_dec_structs->parametricdrc_params @@ -742,7 +734,7 @@ impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, [parametricDrcInstanceIndex] .str_parametric_drc_type_lim_params, lpcm_gains); - if (err) return (err); + } else if (ia_drc_params_struct->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF && !(p_drc_gain_dec_structs->parametricdrc_params diff --git a/decoder/drc_src/impd_drc_gain_decoder.c b/decoder/drc_src/impd_drc_gain_decoder.c index 829f576..2a46c44 100644 --- a/decoder/drc_src/impd_drc_gain_decoder.c +++ b/decoder/drc_src/impd_drc_gain_decoder.c @@ -50,7 +50,7 @@ IA_ERRORCODE impd_init_drc_decode( if (err_code != IA_NO_ERROR) return (err_code); - impd_init_parametric_drc( + err_code = impd_init_parametric_drc( p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size, sample_rate, sub_band_domain_mode, &p_drc_gain_dec_structs->parametricdrc_params); @@ -309,15 +309,15 @@ IA_ERRORCODE impd_drc_process_time_domain( for (ch = 0; ch < p_drc_gain_dec_structs->eq_set->audio_num_chan; ch++) { audio_channel = audio_in_out_buf[ch]; - impd_process_eq_set_time_domain( + err_code = impd_process_eq_set_time_domain( p_drc_gain_dec_structs->eq_set, ch, audio_channel, audio_channel, p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size); + if (err_code) return (err_code); } } - err_code = impd_store_audio_io_buffer_time( - audio_in_out_buf, &p_drc_gain_dec_structs->audio_in_out_buf); - if (err_code != IA_NO_ERROR) return (err_code); + impd_store_audio_io_buffer_time(audio_in_out_buf, + &p_drc_gain_dec_structs->audio_in_out_buf); if (pstr_drc_config->apply_drc) { for (sel_drc_index = 0; @@ -332,9 +332,9 @@ IA_ERRORCODE impd_drc_process_time_domain( } if (p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter == 0) { - err_code = impd_retrieve_audio_io_buffer_time( + impd_retrieve_audio_io_buffer_time( audio_in_out_buf, &p_drc_gain_dec_structs->audio_in_out_buf); - if (err_code) return (err_code); + } else { for (sel_drc_index = 0; sel_drc_index < @@ -357,7 +357,7 @@ IA_ERRORCODE impd_drc_process_time_domain( &p_drc_gain_dec_structs->ia_filter_banks_struct, passThru); if (err_code != IA_NO_ERROR) return (err_code); - err_code = impd_apply_gains_and_add( + impd_apply_gains_and_add( str_drc_instruction_str, p_drc_gain_dec_structs->ia_drc_params_struct .sel_drc_array[sel_drc_index] @@ -368,88 +368,15 @@ IA_ERRORCODE impd_drc_process_time_domain( p_drc_gain_dec_structs->shape_filter_block, p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio, audio_in_out_buf, 1); - if (err_code != IA_NO_ERROR) return (err_code); } } } - err_code = impd_advance_audio_io_buffer_time( - &p_drc_gain_dec_structs->audio_in_out_buf); - if (err_code != IA_NO_ERROR) return (err_code); + impd_advance_audio_io_buffer_time(&p_drc_gain_dec_structs->audio_in_out_buf); return err_code; } -IA_ERRORCODE impd_drc_process_freq_domain( - ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, ia_drc_gain_struct* pstr_drc_gain, - FLOAT32* audio_real_buff[], FLOAT32* audio_imag_buff[], - FLOAT32 loudness_normalization_gain_db, FLOAT32 boost, FLOAT32 compress, - WORD32 drc_characteristic_target) { - WORD32 sel_drc_index; - IA_ERRORCODE err_code = 0; - ia_drc_instructions_struct* str_drc_instruction_str = - pstr_drc_config->str_drc_instruction_str; - - if (p_drc_gain_dec_structs->eq_set) { - WORD32 ch; - - for (ch = 0; ch < p_drc_gain_dec_structs->eq_set->audio_num_chan; ch++) { - err_code = impd_process_eq_set_subband_domain( - p_drc_gain_dec_structs->eq_set, ch, audio_real_buff[ch], - audio_imag_buff[ch]); - if (err_code != IA_NO_ERROR) return (err_code); - } - } - err_code = impd_store_audio_io_buffer_freq( - audio_real_buff, audio_imag_buff, - &p_drc_gain_dec_structs->audio_in_out_buf); - if (err_code != IA_NO_ERROR) return (err_code); - - if (pstr_drc_config->apply_drc) { - for (sel_drc_index = 0; - sel_drc_index < - p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter; - sel_drc_index++) { - err_code = impd_get_drc_gain( - p_drc_gain_dec_structs, pstr_drc_config, pstr_drc_gain, compress, - boost, drc_characteristic_target, loudness_normalization_gain_db, - sel_drc_index, &p_drc_gain_dec_structs->drc_gain_buffers); - if (err_code != IA_NO_ERROR) return (err_code); - } - - if (p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter == 0) { - err_code = impd_retrieve_audio_buffer_freq( - audio_real_buff, audio_imag_buff, - &p_drc_gain_dec_structs->audio_in_out_buf); - if (err_code != IA_NO_ERROR) return (err_code); - } else { - for (sel_drc_index = 0; - sel_drc_index < - p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter; - sel_drc_index++) { - err_code = impd_apply_gains_subband( - str_drc_instruction_str, - p_drc_gain_dec_structs->ia_drc_params_struct - .sel_drc_array[sel_drc_index] - .drc_instructions_index, - &p_drc_gain_dec_structs->ia_drc_params_struct, - &(p_drc_gain_dec_structs->drc_gain_buffers - .pstr_gain_buf[sel_drc_index]), - &p_drc_gain_dec_structs->str_overlap_params, - p_drc_gain_dec_structs->audio_in_out_buf.audio_buffer_delayed_real, - p_drc_gain_dec_structs->audio_in_out_buf.audio_buffer_delayed_imag, - audio_real_buff, audio_imag_buff); - if (err_code != IA_NO_ERROR) return (err_code); - } - } - } - - err_code = - impd_advance_audio_buff_freq(&p_drc_gain_dec_structs->audio_in_out_buf); - - return err_code; -} VOID impd_get_parametric_drc_delay( ia_drc_gain_dec_struct* p_drc_gain_dec_structs, diff --git a/decoder/drc_src/impd_drc_host_params.c b/decoder/drc_src/impd_drc_host_params.c deleted file mode 100644 index 0cfe0df..0000000 --- a/decoder/drc_src/impd_drc_host_params.c +++ /dev/null @@ -1,197 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <stdio.h> -#include "impd_type_def.h" -#include "impd_drc_extr_delta_coded_info.h" -#include "impd_drc_common.h" -#include "impd_drc_struct.h" -#include "impd_drc_interface.h" -#include "impd_drc_selection_process.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_rom.h" - -WORD32 impd_set_default_params_selection_process( - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params) { - pstr_drc_sel_proc_params->base_channel_count = -1; - pstr_drc_sel_proc_params->base_layout = -1; - pstr_drc_sel_proc_params->target_config_request_type = 0; - pstr_drc_sel_proc_params->num_downmix_id_requests = 0; - - pstr_drc_sel_proc_params->album_mode = 0; - - pstr_drc_sel_proc_params->peak_limiter = 1; - - pstr_drc_sel_proc_params->loudness_normalization_on = 0; - pstr_drc_sel_proc_params->target_loudness = -24.0f; - - pstr_drc_sel_proc_params->loudness_deviation_max = - LOUDNESS_DEVIATION_MAX_DEFAULT; - - pstr_drc_sel_proc_params->loudness_measurement_method = - USER_METHOD_DEFINITION_DEFAULT; - pstr_drc_sel_proc_params->loudness_measurement_system = - USER_MEASUREMENT_SYSTEM_DEFAULT; - pstr_drc_sel_proc_params->loudness_measurement_pre_proc = - USER_LOUDNESS_PREPROCESSING_DEFAULT; - pstr_drc_sel_proc_params->device_cut_off_frequency = 500; - pstr_drc_sel_proc_params->loudness_norm_gain_db_max = - LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT; - pstr_drc_sel_proc_params->loudness_norm_gain_modification_db = 0.0f; - pstr_drc_sel_proc_params->output_peak_level_max = 0.0f; - if (pstr_drc_sel_proc_params->peak_limiter == 1) { - pstr_drc_sel_proc_params->output_peak_level_max = 6.0f; - } - - pstr_drc_sel_proc_params->dynamic_range_control_on = 1; - pstr_drc_sel_proc_params->num_bands_supported = 4; - pstr_drc_sel_proc_params->num_drc_feature_requests = 0; - - pstr_drc_sel_proc_params->boost = 1.f; - pstr_drc_sel_proc_params->compress = 1.f; - pstr_drc_sel_proc_params->drc_characteristic_target = 0; - - return 0; -} -WORD32 impd_set_custom_params( - const WORD32 param_set_idx, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params) { - WORD32 i, k; - - const ia_loc_sys_interface_struct* system_interface = - &(loc_sys_interface[param_set_idx - 1]); - - const ia_loc_loudness_norm_ctrl_interface_struct* - loudness_norm_ctrl_interface = - &(loc_loudness_norm_ctrl_interface[param_set_idx - 1]); - const ia_loc_loudness_norm_param_interface_struct* - loudness_norm_param_interface = - &(loc_loudness_norm_param_interface[param_set_idx - 1]); - - const ia_loc_drc_interface_struct* drc_ctrl_interface = - &(loc_dyn_range_ctrl_interface[param_set_idx - 1]); - const ia_loc_requested_drc_effect_struct* requested_drc_effect_type = - &(loc_requested_drc_effect_type_str[param_set_idx - 1]); - const ia_loc_drc_parameter_interface_struct* drc_parameter_interface = - &(loc_drc_parameter_interface[param_set_idx - 1]); - - pstr_drc_sel_proc_params->target_config_request_type = - system_interface->target_config_request_type; - switch (system_interface->target_config_request_type) { - case 1: - pstr_drc_sel_proc_params->requested_target_layout = - system_interface->requested_target_layout; - break; - case 2: - pstr_drc_sel_proc_params->requested_target_ch_count = - system_interface->requested_target_ch_count; - break; - case 0: - default: - pstr_drc_sel_proc_params->num_downmix_id_requests = - system_interface->num_downmix_id_requests; - for (i = 0; i < system_interface->num_downmix_id_requests; i++) { - pstr_drc_sel_proc_params->requested_dwnmix_id[i] = - system_interface->requested_dwnmix_id[i]; - } - break; - } - - pstr_drc_sel_proc_params->loudness_normalization_on = - loudness_norm_ctrl_interface->loudness_normalization_on; - pstr_drc_sel_proc_params->target_loudness = - loudness_norm_ctrl_interface->target_loudness; - - pstr_drc_sel_proc_params->album_mode = - loudness_norm_param_interface->album_mode; - pstr_drc_sel_proc_params->peak_limiter = - loudness_norm_param_interface->peak_limiter; - pstr_drc_sel_proc_params->loudness_deviation_max = - loudness_norm_param_interface->loudness_deviation_max; - pstr_drc_sel_proc_params->loudness_measurement_method = - loudness_norm_param_interface->loudness_measurement_method; - pstr_drc_sel_proc_params->loudness_measurement_system = - loudness_norm_param_interface->loudness_measurement_system; - pstr_drc_sel_proc_params->loudness_measurement_pre_proc = - loudness_norm_param_interface->loudness_measurement_pre_proc; - pstr_drc_sel_proc_params->device_cut_off_frequency = - loudness_norm_param_interface->device_cut_off_frequency; - pstr_drc_sel_proc_params->loudness_norm_gain_db_max = - loudness_norm_param_interface->loudness_norm_gain_db_max; - pstr_drc_sel_proc_params->loudness_norm_gain_modification_db = - loudness_norm_param_interface->loudness_norm_gain_modification_db; - pstr_drc_sel_proc_params->output_peak_level_max = - loudness_norm_param_interface->output_peak_level_max; - - pstr_drc_sel_proc_params->dynamic_range_control_on = - drc_ctrl_interface->dynamic_range_control_on; - pstr_drc_sel_proc_params->num_drc_feature_requests = - drc_ctrl_interface->num_drc_feature_requests; - for (i = 0; i < drc_ctrl_interface->num_drc_feature_requests; i++) { - pstr_drc_sel_proc_params->drc_feature_req_type[i] = - drc_ctrl_interface->drc_feature_req_type[i]; - switch (drc_ctrl_interface->drc_feature_req_type[i]) { - case MATCH_EFFECT_TYPE: - pstr_drc_sel_proc_params->requested_num_drc_effects[i] = - requested_drc_effect_type->requested_num_drc_effects; - pstr_drc_sel_proc_params->desired_num_drc_effects_of_requested[i] = - requested_drc_effect_type->desired_num_drc_effects_of_requested; - for (k = 0; k < requested_drc_effect_type->requested_num_drc_effects; - k++) { - pstr_drc_sel_proc_params->requested_drc_effect_type[i][k] = - requested_drc_effect_type->requested_drc_effect_type[k]; - } - break; - case MATCH_DYNAMIC_RANGE: - pstr_drc_sel_proc_params->requested_dyn_range_measur_type[i] = - drc_ctrl_interface->requested_dyn_rng_measurement_type; - pstr_drc_sel_proc_params->requested_dyn_range_range_flag[i] = - drc_ctrl_interface->requested_dyn_range_is_single_val_flag; - pstr_drc_sel_proc_params->requested_dyn_range_value[i] = - drc_ctrl_interface->requested_dyn_range_value; - pstr_drc_sel_proc_params->requested_dyn_range_min_val[i] = - drc_ctrl_interface->requested_dyn_range_min_val; - pstr_drc_sel_proc_params->requested_dyn_range_max_val[i] = - drc_ctrl_interface->requested_dyn_range_max_val; - break; - case MATCH_DRC_CHARACTERISTIC: - pstr_drc_sel_proc_params->requested_drc_characteristic[i] = - drc_ctrl_interface->requested_drc_characteristic; - break; - default: - return (UNEXPECTED_ERROR); - } - } - - pstr_drc_sel_proc_params->boost = drc_parameter_interface->boost; - pstr_drc_sel_proc_params->compress = drc_parameter_interface->compress; - pstr_drc_sel_proc_params->drc_characteristic_target = - drc_parameter_interface->drc_characteristic_target; - - return (0); -} -WORD32 impd_eval_custom_params_selection_process( - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params) { - pstr_drc_sel_proc_params->loudness_norm_gain_db_max = - max(0.0f, pstr_drc_sel_proc_params->loudness_norm_gain_db_max); - pstr_drc_sel_proc_params->loudness_deviation_max = - max(0, pstr_drc_sel_proc_params->loudness_deviation_max); - - return (0); -} diff --git a/decoder/drc_src/impd_drc_host_params.h b/decoder/drc_src/impd_drc_host_params.h deleted file mode 100644 index 9c71245..0000000 --- a/decoder/drc_src/impd_drc_host_params.h +++ /dev/null @@ -1,41 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#ifndef IMPD_DRC_HOST_PARAMS_H -#define IMPD_DRC_HOST_PARAMS_H - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -WORD32 impd_set_default_params_selection_process( - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params); - -WORD32 impd_set_custom_params( - const WORD32 param_set_idx, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params); - -WORD32 impd_eval_custom_params_selection_process( - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c index b4711c8..cc6e2ed 100644 --- a/decoder/drc_src/impd_drc_init.c +++ b/decoder/drc_src/impd_drc_init.c @@ -41,7 +41,6 @@ #include "impd_drc_selection_process.h" #include "impd_drc_api_struct_def.h" #include "impd_drc_peak_limiter.h" -#include "impd_drc_host_params.h" #define PARAMETRIC_DRC_DELAY_MAX_DEFAULT 4096 #define EQ_DELAY_MAX_DEFAULT 256 @@ -90,7 +89,7 @@ static WORD32 impd_match_downmix(WORD32 downmix_id, WORD32 dec_downmix_id) { IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) { memset(p_obj_drc, 0, sizeof(*p_obj_drc)); - p_obj_drc->str_config.bitstream_file_format = 0; + p_obj_drc->str_config.bitstream_file_format = 1; p_obj_drc->str_config.dec_type = 0; p_obj_drc->str_config.sub_band_domain_mode = 0; p_obj_drc->str_config.sub_band_count = 0; @@ -102,10 +101,11 @@ IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_config.control_parameter_index = -1; p_obj_drc->str_config.peak_limiter = 0; p_obj_drc->str_config.delay_mode = 0; - p_obj_drc->str_config.interface_bitstream_present = 0; + p_obj_drc->str_config.interface_bitstream_present = 1; p_obj_drc->str_config.gain_delay_samples = 0; p_obj_drc->str_config.absorb_delay_on = 1; p_obj_drc->str_config.subband_domain_io_flag = 0; + p_obj_drc->str_bit_handler.gain_stream_flag = 1; p_obj_drc->str_config.constant_delay_on = 0; p_obj_drc->str_config.audio_delay_samples = 0; p_obj_drc->str_config.effect_type = 0; @@ -274,79 +274,85 @@ IA_ERRORCODE impd_drc_set_default_bitstream_config( } IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc) { - SIZE_T persistant_ptr = (SIZE_T)p_obj_drc->p_state->persistant_ptr; + SIZE_T persistent_ptr = (SIZE_T)p_obj_drc->p_state->persistent_ptr; + SIZE_T persistent_size_consumed = 0; p_obj_drc->str_payload.pstr_bitstream_dec = - (ia_drc_bits_dec_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_bits_dec_struct); + (ia_drc_bits_dec_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_bits_dec_struct); p_obj_drc->str_payload.pstr_gain_dec[0] = - (ia_drc_gain_dec_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_gain_dec_struct); + (ia_drc_gain_dec_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_gain_dec_struct); p_obj_drc->str_payload.pstr_gain_dec[1] = - (ia_drc_gain_dec_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_gain_dec_struct); + (ia_drc_gain_dec_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_gain_dec_struct); p_obj_drc->str_payload.pstr_loudness_info = - (ia_drc_loudness_info_set_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_loudness_info_set_struct); + (ia_drc_loudness_info_set_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_loudness_info_set_struct); - p_obj_drc->str_payload.pstr_drc_gain = (ia_drc_gain_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_gain_struct); + p_obj_drc->str_payload.pstr_drc_gain = (ia_drc_gain_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_gain_struct); p_obj_drc->str_payload.pstr_drc_interface = - (ia_drc_interface_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_interface_struct); + (ia_drc_interface_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_interface_struct); - p_obj_drc->str_payload.pstr_drc_config = (ia_drc_config *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_config); + p_obj_drc->str_payload.pstr_drc_config = (ia_drc_config *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_config); p_obj_drc->str_payload.pstr_selection_proc = - (ia_drc_sel_pro_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_sel_pro_struct); + (ia_drc_sel_pro_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_sel_pro_struct); - p_obj_drc->str_bit_handler.it_bit_buf = (UWORD8 *)persistant_ptr; - persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; + p_obj_drc->str_bit_handler.it_bit_buf = (UWORD8 *)persistent_ptr; + persistent_ptr = persistent_ptr + MAX_DRC_BS_BUF_SIZE; p_obj_drc->str_payload.pstr_drc_sel_proc_params = - (ia_drc_sel_proc_params_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_sel_proc_params_struct); + (ia_drc_sel_proc_params_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_sel_proc_params_struct); p_obj_drc->str_payload.pstr_drc_sel_proc_output = - (ia_drc_sel_proc_output_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_sel_proc_output_struct); + (ia_drc_sel_proc_output_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_sel_proc_output_struct); - p_obj_drc->str_bit_handler.bitstream_drc_config = (UWORD8 *)persistant_ptr; - persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; + p_obj_drc->str_bit_handler.bitstream_drc_config = (UWORD8 *)persistent_ptr; + persistent_ptr = persistent_ptr + MAX_BS_BUF_SIZE; - p_obj_drc->str_bit_handler.bitstream_loudness_info = (UWORD8 *)persistant_ptr; - persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; + p_obj_drc->str_bit_handler.bitstream_loudness_info = (UWORD8 *)persistent_ptr; + persistent_ptr = persistent_ptr + MAX_BS_BUF_SIZE; p_obj_drc->str_bit_handler.bitstream_unidrc_interface = - (UWORD8 *)persistant_ptr; - persistant_ptr = persistant_ptr + MAX_BS_BUF_SIZE; + (UWORD8 *)persistent_ptr; + persistent_ptr = persistent_ptr + MAX_BS_BUF_SIZE; p_obj_drc->str_payload.pstr_peak_limiter = - (ia_drc_peak_limiter_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_peak_limiter_struct); + (ia_drc_peak_limiter_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_peak_limiter_struct); p_obj_drc->str_payload.pstr_peak_limiter->buffer = (FLOAT32 *)((SIZE_T)p_obj_drc->str_payload.pstr_peak_limiter + sizeof(ia_drc_peak_limiter_struct)); - persistant_ptr = persistant_ptr + PEAK_LIM_BUF_SIZE; + persistent_ptr = persistent_ptr + PEAK_LIM_BUF_SIZE; p_obj_drc->str_payload.pstr_qmf_filter = - (ia_drc_qmf_filt_struct *)persistant_ptr; - persistant_ptr = persistant_ptr + sizeof(ia_drc_qmf_filt_struct); + (ia_drc_qmf_filt_struct *)persistent_ptr; + persistent_ptr = persistent_ptr + sizeof(ia_drc_qmf_filt_struct); - p_obj_drc->str_payload.pstr_qmf_filter->ana_buff = (FLOAT64 *)persistant_ptr; - persistant_ptr = persistant_ptr + ANALY_BUF_SIZE; + p_obj_drc->str_payload.pstr_qmf_filter->ana_buff = (FLOAT64 *)persistent_ptr; + persistent_ptr = persistent_ptr + ANALY_BUF_SIZE; - p_obj_drc->str_payload.pstr_qmf_filter->syn_buff = (FLOAT64 *)persistant_ptr; - persistant_ptr = persistant_ptr + SYNTH_BUF_SIZE; + p_obj_drc->str_payload.pstr_qmf_filter->syn_buff = (FLOAT64 *)persistent_ptr; + persistent_ptr = persistent_ptr + SYNTH_BUF_SIZE; + persistent_size_consumed = + (UWORD32)persistent_ptr - (UWORD32)p_obj_drc->p_state->persistent_ptr; + if (p_obj_drc->p_mem_info[IA_MEMTYPE_PERSIST].ui_size < + persistent_size_consumed) + return IA_FATAL_ERROR; - p_obj_drc->p_state->persistant_ptr = (pVOID)persistant_ptr; + p_obj_drc->p_state->persistent_ptr = (pVOID)persistent_ptr; return IA_NO_ERROR; } @@ -373,24 +379,24 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { IA_ERRORCODE err_code = IA_NO_ERROR; WORD32 i, j; - pVOID persistant_ptr = p_obj_drc->p_state->persistant_ptr; - - struct ia_bit_buf_struct *it_bit_buff; + pVOID persistent_ptr = p_obj_drc->p_state->persistent_ptr; WORD32 decDownmixIdList[NUM_GAIN_DEC_INSTANCES] = {0, 4}; p_obj_drc->p_state->delay_in_output = 0; p_obj_drc->str_payload.pstr_selection_proc->first_frame = 1; - p_obj_drc->pstr_bit_buf = impd_create_init_bit_buf( - &p_obj_drc->str_bit_buf, p_obj_drc->str_bit_handler.it_bit_buf, - p_obj_drc->str_bit_handler.num_bytes_bs / 8); - it_bit_buff = p_obj_drc->pstr_bit_buf; + impd_create_init_bit_buf(&p_obj_drc->str_bit_buf, + p_obj_drc->str_bit_handler.it_bit_buf, + p_obj_drc->str_bit_handler.num_bytes_bs / 8); + + p_obj_drc->pstr_bit_buf = &p_obj_drc->str_bit_buf; err_code = impd_init_drc_bitstream_dec( p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->str_config.sampling_rate, p_obj_drc->str_config.frame_size, p_obj_drc->str_config.delay_mode, -1, 0); + if (err_code != IA_NO_ERROR) return err_code; for (i = 0; i < NUM_GAIN_DEC_INSTANCES; i++) { err_code = impd_init_drc_decode(p_obj_drc->str_config.frame_size, @@ -399,101 +405,55 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_config.delay_mode, p_obj_drc->str_config.sub_band_domain_mode, p_obj_drc->str_payload.pstr_gain_dec[i]); + if (err_code != IA_NO_ERROR) return err_code; } - if (p_obj_drc->str_config.interface_bitstream_present) { - 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); + 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); - if (err_code != IA_NO_ERROR) return err_code; - - err_code = impd_drc_uni_selction_proc_init( - p_obj_drc->str_payload.pstr_selection_proc, 0, - p_obj_drc->str_payload.pstr_drc_interface, - p_obj_drc->str_config.sub_band_domain_mode); - if (err_code != IA_NO_ERROR) return err_code; + if (err_code != IA_NO_ERROR) return err_code; - if (p_obj_drc->str_payload.pstr_drc_interface - ->loudness_norm_parameter_interface_flag && - p_obj_drc->str_payload.pstr_drc_interface->loudness_norm_param_interface - .peak_limiter) { - p_obj_drc->str_config.peak_limiter = 1; - } - } else { - err_code = impd_set_default_params_selection_process( - p_obj_drc->str_payload.pstr_drc_sel_proc_params); - if (err_code != IA_NO_ERROR) return err_code; - err_code = - impd_set_custom_params(p_obj_drc->str_config.control_parameter_index, - p_obj_drc->str_payload.pstr_drc_sel_proc_params); - if (err_code != IA_NO_ERROR) return err_code; - err_code = impd_eval_custom_params_selection_process( - p_obj_drc->str_payload.pstr_drc_sel_proc_params); - if (err_code != IA_NO_ERROR) return err_code; - err_code = impd_drc_uni_selction_proc_init( - p_obj_drc->str_payload.pstr_selection_proc, - p_obj_drc->str_payload.pstr_drc_sel_proc_params, 0, - p_obj_drc->str_config.sub_band_domain_mode); - if (err_code != IA_NO_ERROR) return err_code; + err_code = impd_drc_uni_selction_proc_init( + p_obj_drc->str_payload.pstr_selection_proc, 0, + p_obj_drc->str_payload.pstr_drc_interface, + p_obj_drc->str_config.sub_band_domain_mode); + if (err_code != IA_NO_ERROR) return err_code; - if (p_obj_drc->str_payload.pstr_drc_sel_proc_params->peak_limiter) { - p_obj_drc->str_config.peak_limiter = 1; - } + if (p_obj_drc->str_payload.pstr_drc_interface + ->loudness_norm_parameter_interface_flag && + p_obj_drc->str_payload.pstr_drc_interface->loudness_norm_param_interface + .peak_limiter) { + p_obj_drc->str_config.peak_limiter = 1; } + p_obj_drc->str_payload.pstr_loudness_info->loudness_info_album_count = 0; p_obj_drc->str_payload.pstr_loudness_info->loudness_info_count = 0; p_obj_drc->str_payload.pstr_loudness_info->loudness_info_set_ext_present = 0; p_obj_drc->p_state->ui_exe_done = 0; - if (p_obj_drc->str_config.bitstream_file_format == - BITSTREAM_FILE_FORMAT_SPLIT) { - err_code = impd_process_drc_bitstream_dec_config( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - &p_obj_drc->str_bit_handler.bitstream_drc_config[0], - p_obj_drc->str_bit_handler.num_bytes_bs_drc_config); - - if (err_code == 1) { - memset(p_obj_drc->str_payload.pstr_drc_config, 0, sizeof(ia_drc_config)); - err_code = impd_drc_set_default_bitstream_config( - p_obj_drc->str_payload.pstr_drc_config); - p_obj_drc->str_payload.pstr_drc_config->channel_layout - .base_channel_count = p_obj_drc->str_config.num_ch_in; - } - - if (err_code != IA_NO_ERROR) return err_code; - err_code = impd_process_drc_bitstream_dec_loudness_info_set( - p_obj_drc->pstr_bit_buf, p_obj_drc->str_payload.pstr_loudness_info, - &p_obj_drc->str_bit_handler.bitstream_loudness_info[0], - p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info); - if (err_code != IA_NO_ERROR) return err_code; - - } else { - err_code = impd_process_drc_bitstream_dec( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (err_code > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; + err_code = impd_process_drc_bitstream_dec_config( + p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, + p_obj_drc->str_payload.pstr_drc_config, + &p_obj_drc->str_bit_handler.bitstream_drc_config[0], + p_obj_drc->str_bit_handler.num_bytes_bs_drc_config); + + if (err_code == 1) { + memset(p_obj_drc->str_payload.pstr_drc_config, 0, sizeof(ia_drc_config)); + err_code = impd_drc_set_default_bitstream_config( + p_obj_drc->str_payload.pstr_drc_config); + p_obj_drc->str_payload.pstr_drc_config->channel_layout.base_channel_count = + p_obj_drc->str_config.num_ch_in; } + if (err_code != IA_NO_ERROR) return err_code; + err_code = impd_process_drc_bitstream_dec_loudness_info_set( + p_obj_drc->pstr_bit_buf, p_obj_drc->str_payload.pstr_loudness_info, + &p_obj_drc->str_bit_handler.bitstream_loudness_info[0], + p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info); + if (err_code != IA_NO_ERROR) return err_code; + err_code = impd_drc_uni_sel_proc_process( p_obj_drc->str_payload.pstr_selection_proc, p_obj_drc->str_payload.pstr_drc_config, @@ -538,7 +498,8 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { , p_obj_drc->str_payload.pstr_gain_dec[i], p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, &persistant_ptr); + p_obj_drc->str_payload.pstr_loudness_info, &persistent_ptr); + if (err_code) return err_code; impd_get_parametric_drc_delay( p_obj_drc->str_payload.pstr_gain_dec[i], @@ -595,11 +556,12 @@ IA_ERRORCODE impd_drc_init(ia_drc_api_struct *p_obj_drc) { } if (p_obj_drc->str_config.peak_limiter) { - impd_peak_limiter_init( + err_code = impd_peak_limiter_init( p_obj_drc->str_payload.pstr_peak_limiter, DEFAULT_ATTACK_TIME_MS, DEFAULT_RELEASE_TIME_MS, LIM_DEFAULT_THRESHOLD, p_obj_drc->str_config.num_ch_out, p_obj_drc->str_config.sampling_rate, p_obj_drc->str_payload.pstr_peak_limiter->buffer); + if (err_code) return (err_code); } return IA_NO_ERROR; diff --git a/decoder/drc_src/impd_drc_interface_decoder.c b/decoder/drc_src/impd_drc_interface_decoder.c index 35b1f3c..4e0301c 100644 --- a/decoder/drc_src/impd_drc_interface_decoder.c +++ b/decoder/drc_src/impd_drc_interface_decoder.c @@ -30,29 +30,6 @@ #include "impd_drc_parser_interface.h" WORD32 -impd_drc_dec_interface_process(ia_bit_buf_struct* it_bit_buff, - ia_drc_interface_struct* pstr_drc_interface, - UWORD8* it_bit_buf, WORD32 num_bit_stream_bits, - WORD32* num_bits_read) { - WORD32 err = 0; - - if (it_bit_buff != NULL && num_bit_stream_bits) { - it_bit_buff = impd_create_init_bit_buf(it_bit_buff, it_bit_buf, - num_bit_stream_bits / 8); - - } else { - return -1; - } - - err = impd_unidrc_interface_read(it_bit_buff, pstr_drc_interface); - if (err) return (err); - - *num_bits_read = (it_bit_buff->size) - it_bit_buff->cnt_bits; - - return err; -} - -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) { diff --git a/decoder/drc_src/impd_drc_interface_parser.c b/decoder/drc_src/impd_drc_interface_parser.c deleted file mode 100644 index 1ae69a2..0000000 --- a/decoder/drc_src/impd_drc_interface_parser.c +++ /dev/null @@ -1,514 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <stdio.h> -#include <string.h> -#include <math.h> - -#include "impd_type_def.h" -#include "impd_drc_bitbuffer.h" -#include "impd_drc_common.h" -#include "impd_drc_interface.h" -#include "impd_drc_extr_delta_coded_info.h" -#include "impd_drc_struct.h" - -WORD32 impd_unidrc_interface_signature_read( - ia_bit_buf_struct* it_bit_buff, - ia_drc_uni_interface_signat_struct* drc_uni_interface_signature) { - // WORD32 err = 0 - WORD32 interface_signat_data_len = 0, i, tmp; - - tmp = impd_read_bits_buf(it_bit_buff, 16); - if (it_bit_buff->error) return it_bit_buff->error; - - drc_uni_interface_signature->interface_signat_type = (tmp >> 8) & 0xff; - drc_uni_interface_signature->interface_signat_data_len = tmp & 0xff; - - interface_signat_data_len = - drc_uni_interface_signature->interface_signat_data_len + 1; - for (i = 0; i < interface_signat_data_len; i++) { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - drc_uni_interface_signature->interface_signat_data[i] = (UWORD32)tmp; - } - - return (0); -} -WORD32 impd_sys_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_system_interface_struct* system_interface) { - // WORD32 err = 0; - WORD32 i = 0, tmp = 0; - - system_interface->target_config_request_type = - impd_read_bits_buf(it_bit_buff, 2); - if (it_bit_buff->error) return it_bit_buff->error; - - switch (system_interface->target_config_request_type) { - case 0: - system_interface->num_downmix_id_requests = - impd_read_bits_buf(it_bit_buff, 4); - if (it_bit_buff->error) return it_bit_buff->error; - - if (system_interface->num_downmix_id_requests == 0) { - system_interface->num_downmix_id_requests = 1; - system_interface->requested_dwnmix_id[0] = 0; - break; - } - for (i = 0; i < system_interface->num_downmix_id_requests; i++) { - system_interface->requested_dwnmix_id[i] = - impd_read_bits_buf(it_bit_buff, 7); - if (it_bit_buff->error) return it_bit_buff->error; - } - break; - case 1: - system_interface->requested_target_layout = - impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - break; - case 2: - tmp = impd_read_bits_buf(it_bit_buff, 7); - if (it_bit_buff->error) return it_bit_buff->error; - system_interface->requested_target_ch_count = tmp + 1; - break; - default: - return (1); - break; - } - return (0); -} - -WORD32 impd_loudness_norm_control_interface_read( - ia_bit_buf_struct* it_bit_buff, - ia_loudness_norm_ctrl_interface_struct* loudness_norm_ctrl_interface) { - // WORD32 err = 0; - WORD32 tmp = 0; - - loudness_norm_ctrl_interface->loudness_normalization_on = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - - if (loudness_norm_ctrl_interface->loudness_normalization_on == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 12); - if (it_bit_buff->error) return it_bit_buff->error; - loudness_norm_ctrl_interface->target_loudness = -tmp * 0.03125f; - } - return (0); -} - -WORD32 impd_loudness_norm_param_interface_read( - ia_bit_buf_struct* it_bit_buff, ia_loudness_norm_parameter_interface_struct* - loudness_norm_param_interface) { - // WORD32 err = 0; - WORD32 tmp = 0; - - tmp = impd_read_bits_buf(it_bit_buff, 3); - if (it_bit_buff->error) return it_bit_buff->error; - - loudness_norm_param_interface->album_mode = (tmp >> 2) & 1; - loudness_norm_param_interface->peak_limiter = (tmp >> 1) & 1; - loudness_norm_param_interface->change_loudness_deviation_max = tmp & 1; - - if (loudness_norm_param_interface->change_loudness_deviation_max == 1) { - loudness_norm_param_interface->loudness_deviation_max = - impd_read_bits_buf(it_bit_buff, 6); - if (it_bit_buff->error) return it_bit_buff->error; - } - - loudness_norm_param_interface->change_loudness_measur_method = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface->change_loudness_measur_method == 1) { - loudness_norm_param_interface->loudness_measurement_method = - impd_read_bits_buf(it_bit_buff, 3); - if (it_bit_buff->error) return it_bit_buff->error; - } - - loudness_norm_param_interface->change_loudness_measur_system = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface->change_loudness_measur_system == 1) { - loudness_norm_param_interface->loudness_measurement_system = - impd_read_bits_buf(it_bit_buff, 4); - if (it_bit_buff->error) return it_bit_buff->error; - } - - loudness_norm_param_interface->change_loudness_measur_pre_proc = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface->change_loudness_measur_pre_proc == 1) { - loudness_norm_param_interface->loudness_measurement_pre_proc = - impd_read_bits_buf(it_bit_buff, 2); - if (it_bit_buff->error) return it_bit_buff->error; - } - - loudness_norm_param_interface->change_device_cut_off_freq = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface->change_device_cut_off_freq == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 6); - if (it_bit_buff->error) return it_bit_buff->error; - loudness_norm_param_interface->device_cut_off_frequency = - max(min(tmp * 10, 500), 20); - } - - loudness_norm_param_interface->change_loudness_norm_gain_db_max = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface->change_loudness_norm_gain_db_max == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 6); - if (it_bit_buff->error) return it_bit_buff->error; - if (tmp < 63) { - loudness_norm_param_interface->loudness_norm_gain_db_max = tmp * 0.5f; - } else { - loudness_norm_param_interface->loudness_norm_gain_db_max = - LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT; - } - } - - loudness_norm_param_interface->change_loudness_norm_gain_modification_db = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface - ->change_loudness_norm_gain_modification_db == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 10); - if (it_bit_buff->error) return it_bit_buff->error; - loudness_norm_param_interface->loudness_norm_gain_modification_db = - -16 + tmp * 0.03125f; - } - - loudness_norm_param_interface->change_output_peak_level_max = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_norm_param_interface->change_output_peak_level_max == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 6); - if (it_bit_buff->error) return it_bit_buff->error; - loudness_norm_param_interface->output_peak_level_max = tmp * 0.5f; - } - - return (0); -} - -WORD32 impd_drc_interface_read( - ia_bit_buf_struct* it_bit_buff, - ia_dyn_rng_ctrl_interface_struct* drc_ctrl_interface) { - // WORD32 err = 0; - WORD32 i = 0, j = 0, tmp = 0; - - drc_ctrl_interface->dynamic_range_control_on = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - - if (drc_ctrl_interface->dynamic_range_control_on == 1) { - drc_ctrl_interface->num_drc_feature_requests = - impd_read_bits_buf(it_bit_buff, 3); - if (it_bit_buff->error) return it_bit_buff->error; - - for (i = 0; i < drc_ctrl_interface->num_drc_feature_requests; i++) { - drc_ctrl_interface->drc_feature_req_type[i] = - impd_read_bits_buf(it_bit_buff, 2); - if (it_bit_buff->error) return it_bit_buff->error; - - switch (drc_ctrl_interface->drc_feature_req_type[i]) { - case 0: - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - - drc_ctrl_interface->requested_num_drc_effects[i] = (tmp >> 4) & 0xf; - drc_ctrl_interface->desired_num_drc_effects_of_requested[i] = - tmp & 0xf; - - for (j = 0; j < drc_ctrl_interface->requested_num_drc_effects[i]; - j++) { - drc_ctrl_interface->requested_drc_effect_type[i][j] = - impd_read_bits_buf(it_bit_buff, 4); - if (it_bit_buff->error) return it_bit_buff->error; - } - break; - case 1: - tmp = impd_read_bits_buf(it_bit_buff, 3); - if (it_bit_buff->error) return it_bit_buff->error; - - drc_ctrl_interface->requested_dyn_rng_measurement_type[i] = - (tmp >> 1) & 3; - drc_ctrl_interface->requested_dyn_range_is_single_val_flag[i] = - tmp & 1; - - if (drc_ctrl_interface->requested_dyn_range_is_single_val_flag[i] == - 0) { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - if (tmp == 0) - drc_ctrl_interface->requested_dyn_range_value[i] = 0.0f; - else if (tmp <= 128) - drc_ctrl_interface->requested_dyn_range_value[i] = tmp * 0.25f; - else if (tmp <= 204) - drc_ctrl_interface->requested_dyn_range_value[i] = - 0.5f * tmp - 32.0f; - else - drc_ctrl_interface->requested_dyn_range_value[i] = tmp - 134.0f; - } else { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - if (tmp == 0) - drc_ctrl_interface->requested_dyn_range_min_val[i] = 0.0f; - else if (tmp <= 128) - drc_ctrl_interface->requested_dyn_range_min_val[i] = tmp * 0.25f; - else if (tmp <= 204) - drc_ctrl_interface->requested_dyn_range_min_val[i] = - 0.5f * tmp - 32.0f; - else - drc_ctrl_interface->requested_dyn_range_min_val[i] = tmp - 134.0f; - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - if (tmp == 0) - drc_ctrl_interface->requested_dyn_range_max_val[i] = 0.0f; - else if (tmp <= 128) - drc_ctrl_interface->requested_dyn_range_max_val[i] = tmp * 0.25f; - else if (tmp <= 204) - drc_ctrl_interface->requested_dyn_range_max_val[i] = - 0.5f * tmp - 32.0f; - else - drc_ctrl_interface->requested_dyn_range_max_val[i] = tmp - 134.0f; - } - break; - case 2: - drc_ctrl_interface->requested_drc_characteristic[i] = - impd_read_bits_buf(it_bit_buff, 7); - if (it_bit_buff->error) return it_bit_buff->error; - break; - default: - return (1); - break; - } - } - } - return (0); -} - -WORD32 impd_drc_param_interface_read( - ia_bit_buf_struct* it_bit_buff, - ia_drc_parameter_interface_struct* drc_parameter_interface) { - // WORD32 err = 0; - WORD32 tmp = 0; - - tmp = impd_read_bits_buf(it_bit_buff, 2); - if (it_bit_buff->error) return it_bit_buff->error; - - drc_parameter_interface->change_compress = (tmp >> 1) & 1; - drc_parameter_interface->change_boost = tmp & 1; - - if (drc_parameter_interface->change_compress == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - if (tmp < 255) { - drc_parameter_interface->compress = 1 - tmp * 0.00390625f; - } else { - drc_parameter_interface->compress = 0.f; - } - } - - if (drc_parameter_interface->change_boost == 1) { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - if (tmp < 255) { - drc_parameter_interface->boost = 1 - tmp * 0.00390625f; - } else { - drc_parameter_interface->boost = 0.f; - } - } - - drc_parameter_interface->change_drc_characteristic_target = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - - if (drc_parameter_interface->change_drc_characteristic_target == 1) { - drc_parameter_interface->drc_characteristic_target = - impd_read_bits_buf(it_bit_buff, 8); - if (it_bit_buff->error) return it_bit_buff->error; - } - return (0); -} - -static WORD32 impd_parse_loud_eq_param_interface( - ia_bit_buf_struct* it_bit_buff, ia_loudness_eq_parameter_interface_struct* - loudness_eq_parameter_interface) { - // WORD32 err = 0; - WORD32 bsSensitivity, bsPlaybackGain; - - loudness_eq_parameter_interface->loudness_eq_request_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_eq_parameter_interface->loudness_eq_request_flag) { - loudness_eq_parameter_interface->loudness_eq_request = - impd_read_bits_buf(it_bit_buff, 2); - if (it_bit_buff->error) return it_bit_buff->error; - } - loudness_eq_parameter_interface->sensitivity_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_eq_parameter_interface->sensitivity_flag) { - bsSensitivity = impd_read_bits_buf(it_bit_buff, 7); - if (it_bit_buff->error) return it_bit_buff->error; - loudness_eq_parameter_interface->sensitivity = bsSensitivity + 23.0f; - } - loudness_eq_parameter_interface->playback_gain_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (loudness_eq_parameter_interface->playback_gain_flag) { - bsPlaybackGain = impd_read_bits_buf(it_bit_buff, 7); - if (it_bit_buff->error) return it_bit_buff->error; - loudness_eq_parameter_interface->playback_gain = (FLOAT32)-bsPlaybackGain; - } - return (0); -} - -WORD32 -impd_unidrc_interface_extension_read( - ia_bit_buf_struct* it_bit_buff, - ia_drc_interface_struct* impd_drc_uni_interface, - ia_drc_uni_interface_ext_struct* drc_uni_interface_ext) { - WORD32 err = 0, i = 0, tmp = 0, dummy; - WORD32 uni_drc_interface_ext_type; - ia_specific_interface_extension_struct* specific_interface_ext; - - uni_drc_interface_ext_type = impd_read_bits_buf(it_bit_buff, 4); - if (it_bit_buff->error) return it_bit_buff->error; - - while (uni_drc_interface_ext_type != UNIDRCINTERFACEEXT_TERM) { - specific_interface_ext = - &(drc_uni_interface_ext->specific_interface_ext[i]); - specific_interface_ext->uni_drc_interface_ext_type = - uni_drc_interface_ext_type; - tmp = impd_read_bits_buf(it_bit_buff, 4); - if (it_bit_buff->error) return it_bit_buff->error; - specific_interface_ext->ext_size_bits = tmp + 4; - - tmp = - impd_read_bits_buf(it_bit_buff, specific_interface_ext->ext_size_bits); - if (it_bit_buff->error) return it_bit_buff->error; - - specific_interface_ext->ext_bit_size = tmp + 1; - - switch (uni_drc_interface_ext_type) { - case UNIDRCINTERFACEEXT_EQ: - impd_drc_uni_interface->drc_uni_interface_ext - .loudness_eq_parameter_interface_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (impd_drc_uni_interface->drc_uni_interface_ext - .loudness_eq_parameter_interface_flag) { - err = impd_parse_loud_eq_param_interface( - it_bit_buff, &(impd_drc_uni_interface->drc_uni_interface_ext - .loudness_eq_parameter_interface)); - if (err) return (err); - } - impd_drc_uni_interface->drc_uni_interface_ext.eq_ctrl_interface_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (impd_drc_uni_interface->drc_uni_interface_ext - .eq_ctrl_interface_flag) { - impd_drc_uni_interface->drc_uni_interface_ext.eq_ctrl_interface - .eq_set_purpose_request = impd_read_bits_buf(it_bit_buff, 16); - if (it_bit_buff->error) return it_bit_buff->error; - } - break; - default: - dummy = impd_read_bits_buf(it_bit_buff, - specific_interface_ext->ext_bit_size); - if (it_bit_buff->error) return it_bit_buff->error; - break; - } - - i++; - if (i == EXT_COUNT_MAX) { - return (1); - } - uni_drc_interface_ext_type = impd_read_bits_buf(it_bit_buff, 4); - if (it_bit_buff->error) return it_bit_buff->error; - } - drc_uni_interface_ext->interface_ext_count = i; - return (0); -} -WORD32 impd_unidrc_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_drc_interface_struct* uniDrcInterface) { - WORD32 err = 0; - - uniDrcInterface->interface_signat_flag = impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->interface_signat_flag == 1) { - err = impd_unidrc_interface_signature_read( - it_bit_buff, &(uniDrcInterface->drc_uni_interface_signature)); - if (err) return (err); - } - - uniDrcInterface->system_interface_flag = impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->system_interface_flag == 1) { - err = impd_sys_interface_read(it_bit_buff, - &(uniDrcInterface->system_interface)); - if (err) return (err); - } - - uniDrcInterface->loudness_norm_ctrl_interface_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->loudness_norm_ctrl_interface_flag == 1) { - err = impd_loudness_norm_control_interface_read( - it_bit_buff, &(uniDrcInterface->loudness_norm_ctrl_interface)); - if (err) return (err); - } - - uniDrcInterface->loudness_norm_parameter_interface_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->loudness_norm_parameter_interface_flag == 1) { - err = impd_loudness_norm_param_interface_read( - it_bit_buff, &(uniDrcInterface->loudness_norm_param_interface)); - if (err) return (err); - } - - uniDrcInterface->drc_interface_flag = impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->drc_interface_flag == 1) { - err = impd_drc_interface_read(it_bit_buff, - &(uniDrcInterface->drc_ctrl_interface)); - if (err) return (err); - } - - uniDrcInterface->drc_parameter_interface_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->drc_parameter_interface_flag == 1) { - err = impd_drc_param_interface_read( - it_bit_buff, &(uniDrcInterface->drc_parameter_interface)); - if (err) return (err); - } - - uniDrcInterface->drc_uni_interface_ext_flag = - impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error) return it_bit_buff->error; - if (uniDrcInterface->drc_uni_interface_ext_flag == 1) { - err = impd_unidrc_interface_extension_read( - it_bit_buff, uniDrcInterface, - &(uniDrcInterface->drc_uni_interface_ext)); - if (err) return (err); - } - - return (0); -}
\ No newline at end of file diff --git a/decoder/drc_src/impd_drc_loud_eq.c b/decoder/drc_src/impd_drc_loud_eq.c deleted file mode 100644 index ef04db2..0000000 --- a/decoder/drc_src/impd_drc_loud_eq.c +++ /dev/null @@ -1,169 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <stdio.h> -#include <stdlib.h> -#include <math.h> -#include <string.h> -#include "impd_type_def.h" -#include "impd_drc_uni_tables.h" -#include "impd_drc_uni_common.h" -#include "impd_drc_uni_interface.h" -#include "impd_drc_struct.h" -#include "impd_drc_uni_gain_dec.h" -#include "impd_drc_uni_loud_eq.h" -#include "impd_parametric_drc_dec.h" -#include "impd_drc_uni_multi_band.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_uni_process_audio.h" -#include "impd_drc_rom.h" - -WORD32 impd_parametric_drc_instance_reset( - WORD32 instance_idx, ia_parametric_drc_instance_params_struct* - pstr_parametric_drc_instance_params) { - WORD32 err = 0; - - if (pstr_parametric_drc_instance_params->parametric_drc_type == - PARAM_DRC_TYPE_FF) { - ia_parametric_drc_type_ff_params_struct* - pstr_parametric_ffwd_type_drc_params = - &(pstr_parametric_drc_instance_params - ->str_parametric_drc_type_ff_params); - err = impd_parametric_ffwd_type_drc_reset( - pstr_parametric_ffwd_type_drc_params); - if (err) return (err); - - } else { - return (UNEXPECTED_ERROR); - } - - return 0; -} - -WORD32 impd_add_drc_band_audio( - ia_drc_instructions_struct* pstr_drc_instruction_arr, - const WORD32 drc_instructions_index, - ia_drc_params_struct* ia_drc_params_struct, - ia_audio_band_buffer_struct* audio_band_buffer, FLOAT32* audio_io_buf[]) { - WORD32 g, b, i, c; - FLOAT32 sum; - WORD32 signalIndex = 0; - FLOAT32** drcBandAudio; - FLOAT32** channel_audio; - ia_drc_instructions_struct* str_drc_instruction_str; - - drcBandAudio = audio_band_buffer->non_interleaved_audio; - channel_audio = audio_io_buf; - - if (drc_instructions_index >= 0) { - str_drc_instruction_str = - &(pstr_drc_instruction_arr[drc_instructions_index]); - } else { - return -1; - } - - if (str_drc_instruction_str->drc_set_id > 0) { - for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) - - { - g = str_drc_instruction_str->channel_group_of_ch[c]; - if (g >= 0) { - for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { - sum = 0.0f; - for (b = 0; b < str_drc_instruction_str->band_count_of_ch_group[g]; - b++) { - sum += drcBandAudio[signalIndex + b][i]; - } - - channel_audio[c][i] = sum; - } - signalIndex += str_drc_instruction_str->band_count_of_ch_group[g]; - } else { - signalIndex++; - } - } - } else { - for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) - - { - for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { - channel_audio[c][i] = drcBandAudio[c][i]; - } - } - } - return (0); -} - -WORD32 removeTables(void) { return (0); } - -const ia_slope_code_table_struct* impd_get_slope_code_tbl_by_value(void) { - return (&(slopeCodeTableEntryByValue[0])); -} - -FLOAT32 impd_decode_slope_idx(const WORD32 slopeCodeIndex) { - const ia_slope_code_table_struct* slopeCodeTable = - impd_get_slope_code_tbl_by_value(); - return slopeCodeTable[slopeCodeIndex].value; -} - -FLOAT32 impd_decode_slope_idx_magnitude(const WORD32 slopeCodeIndex) { - const ia_slope_code_table_struct* slopeCodeTable = - impd_get_slope_code_tbl_by_value(); - return (FLOAT32)fabs((FLOAT64)slopeCodeTable[slopeCodeIndex].value); -} - -WORD32 impd_get_multi_band_drc_present(ia_drc_config* pstr_drc_config, - WORD32 numSets[3], - WORD32 multiBandDrcPresent[3]) { - WORD32 err = 0, k, m; - for (k = 0; k < pstr_drc_config->drc_instructions_uni_drc_count; k++) { - if ((pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] == - ID_FOR_BASE_LAYOUT) || - (pstr_drc_config->str_drc_instruction_str[k].drc_apply_to_dwnmix == - 0)) { - numSets[0]++; - } else if (pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] == - ID_FOR_ANY_DOWNMIX) { - numSets[1]++; - } else { - numSets[2]++; - } - for (m = 0; - m < pstr_drc_config->str_drc_instruction_str[k].num_drc_ch_groups; - m++) { - if (pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] - .gain_set_params[pstr_drc_config->str_drc_instruction_str - ->gain_set_index_for_channel_group[m]] - .band_count > 1) { - if ((pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] == - ID_FOR_BASE_LAYOUT) || - (pstr_drc_config->str_drc_instruction_str[k].drc_apply_to_dwnmix == - 0)) { - multiBandDrcPresent[0] = 1; - } else if (pstr_drc_config->str_drc_instruction_str[k].downmix_id[0] == - ID_FOR_ANY_DOWNMIX) { - multiBandDrcPresent[1] = 1; - } else { - multiBandDrcPresent[2] = 1; - } - } - } - } - return err; -} diff --git a/decoder/drc_src/impd_drc_loudness_control.c b/decoder/drc_src/impd_drc_loudness_control.c index 9937e18..c377a24 100644 --- a/decoder/drc_src/impd_drc_loudness_control.c +++ b/decoder/drc_src/impd_drc_loudness_control.c @@ -28,7 +28,7 @@ #include "impd_drc_selection_process.h" #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" -WORD32 impd_signal_peak_level_info( +VOID impd_signal_peak_level_info( ia_drc_config* pstr_drc_config, ia_drc_loudness_info_set_struct* pstr_loudness_info, ia_drc_instructions_struct* str_drc_instruction_str, @@ -325,7 +325,7 @@ WORD32 impd_signal_peak_level_info( } else { *peak_info_count = pre_lim_count; } - return (0); + return; } WORD32 @@ -456,8 +456,8 @@ WORD32 impd_loudness_peak_to_average_info( return (0); } -WORD32 impd_overall_loudness_present(ia_loudness_info_struct* loudness_info, - WORD32* loudness_info_present) { +VOID impd_overall_loudness_present(ia_loudness_info_struct* loudness_info, + WORD32* loudness_info_present) { WORD32 m; *loudness_info_present = 0; @@ -469,7 +469,7 @@ WORD32 impd_overall_loudness_present(ia_loudness_info_struct* loudness_info, *loudness_info_present = 1; } } - return (0); + return; } WORD32 impd_check_loud_info(WORD32 loudness_info_count, @@ -477,14 +477,14 @@ WORD32 impd_check_loud_info(WORD32 loudness_info_count, WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, WORD32* info_count, ia_loudness_info_struct* loudness_info_matching[]) { - WORD32 n, err; + WORD32 n; WORD32 loudness_info_present; for (n = 0; n < loudness_info_count; n++) { if (requested_dwnmix_id == loudness_info[n].downmix_id) { if (drc_set_id_requested == loudness_info[n].drc_set_id) { - err = impd_overall_loudness_present(&(loudness_info[n]), - &loudness_info_present); - if (err) return (err); + impd_overall_loudness_present(&(loudness_info[n]), + &loudness_info_present); + if (loudness_info_present) { loudness_info_matching[*info_count] = &(loudness_info[n]); (*info_count)++; @@ -737,7 +737,7 @@ WORD32 impd_init_loudness_control( WORD32 requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4; WORD32 requested_preprocessing = 0; - WORD32* system_bonus = measurement_system_default_tbl; + const WORD32* system_bonus = measurement_system_default_tbl; WORD32 match_measure; FLOAT32 method_val = 0; diff --git a/decoder/drc_src/impd_drc_loudness_control.h b/decoder/drc_src/impd_drc_loudness_control.h index 76acc26..589d995 100644 --- a/decoder/drc_src/impd_drc_loudness_control.h +++ b/decoder/drc_src/impd_drc_loudness_control.h @@ -30,16 +30,14 @@ impd_mixing_level_info( ia_drc_loudness_info_set_struct* pstr_loudness_info, WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, WORD32 eq_set_id_requested, FLOAT32* mixing_level); -WORD32 -impd_signal_peak_level_info(ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_instructions_struct* str_drc_instruction_str, - WORD32 requested_dwnmix_id, WORD32 album_mode, - WORD32 num_compression_eq_count, - WORD32* num_compression_eq_id, - WORD32* peak_info_count, WORD32 eq_set_id[], - FLOAT32 signal_peak_level[], - WORD32 explicit_peak_information_present[]); +VOID impd_signal_peak_level_info( + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_instructions_struct* str_drc_instruction_str, + WORD32 requested_dwnmix_id, WORD32 album_mode, + WORD32 num_compression_eq_count, WORD32* num_compression_eq_id, + WORD32* peak_info_count, WORD32 eq_set_id[], FLOAT32 signal_peak_level[], + WORD32 explicit_peak_information_present[]); WORD32 impd_extract_loudness_peak_to_average_info( diff --git a/decoder/drc_src/impd_drc_main_qmf_process.c b/decoder/drc_src/impd_drc_main_qmf_process.c deleted file mode 100644 index 3c4e711..0000000 --- a/decoder/drc_src/impd_drc_main_qmf_process.c +++ /dev/null @@ -1,254 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <math.h> -#include "impd_type_def.h" -#include "impd_memory_standards.h" -#include "impd_drc_bitbuffer.h" -#include "impd_drc_extr_delta_coded_info.h" -#include "impd_drc_common.h" -#include "impd_drc_struct.h" -#include "impd_drc_interface.h" - -#include "impd_drc_bitstream_dec_api.h" -#include "impd_drc_gain_dec.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_multi_band.h" -#include "impd_drc_process_audio.h" -#include "impd_parametric_drc_dec.h" -#include "impd_drc_eq.h" -#include "impd_drc_gain_decoder.h" -#include "impd_drc_selection_process.h" - -#include "impd_drc_peak_limiter.h" -#include "impd_drc_api_struct_def.h" - -#define BITSTREAM_FILE_FORMAT_SPLIT 1 - -static WORD32 impd_down_mix( - ia_drc_sel_proc_output_struct *uni_drc_sel_proc_output, - FLOAT32 **input_audio, WORD32 frame_len) { - WORD32 num_base_ch = uni_drc_sel_proc_output->base_channel_count; - WORD32 num_target_ch = uni_drc_sel_proc_output->target_channel_count; - WORD32 i, i_ch, o_ch; - FLOAT32 tmp_out[MAX_CHANNEL_COUNT]; - - if (uni_drc_sel_proc_output->downmix_matrix_present == 0) return 0; - - if (input_audio == 0) return 0; - - if (num_target_ch > MAX_CHANNEL_COUNT) return -1; - - if (num_target_ch > num_base_ch) return -1; - - for (i = 0; i < frame_len; i++) { - for (o_ch = 0; o_ch < num_target_ch; o_ch++) { - tmp_out[o_ch] = 0.0f; - for (i_ch = 0; i_ch < num_base_ch; i_ch++) { - tmp_out[o_ch] += input_audio[i_ch][i] * - uni_drc_sel_proc_output->downmix_matrix[i_ch][o_ch]; - } - } - for (o_ch = 0; o_ch < num_target_ch; o_ch++) { - input_audio[o_ch][i] = tmp_out[o_ch]; - } - for (; o_ch < num_base_ch; o_ch++) { - input_audio[o_ch][i] = 0.0f; - } - } - - return 0; -} - -WORD32 impd_init_process_audio_main_qmf(ia_drc_api_struct *p_obj_drc) - -{ - WORD32 error = 0, i, j, num_samples_per_channel; - FLOAT32 *input_buffer; - FLOAT32 *output_buffer; - FLOAT32 *audio_io_buf_real[10]; - FLOAT32 *audio_io_buf_imag[10]; - FLOAT32 *scratch_buffer; - WORD32 last_frame = 0; - scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; - input_buffer = (FLOAT32 *)p_obj_drc->pp_mem[2]; - output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; - - if (p_obj_drc->p_state->ui_in_bytes <= 0) { - p_obj_drc->p_state->ui_out_bytes = 0; - return 0; - } - - if ((p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in / - (p_obj_drc->str_config.pcm_size >> 3)) < - (UWORD32)p_obj_drc->str_config.frame_size) - last_frame = 1; - for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { - audio_io_buf_real[i] = - scratch_buffer + i * (p_obj_drc->str_config.frame_size + 32); - audio_io_buf_imag[i] = - scratch_buffer + - p_obj_drc->str_config.num_ch_in * p_obj_drc->str_config.frame_size + - p_obj_drc->str_config.num_ch_in * 64 + - i * (p_obj_drc->str_config.frame_size + 64); - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - audio_io_buf_real[i][j] = - input_buffer[j * p_obj_drc->str_config.num_ch_in + i]; - audio_io_buf_imag[i][j] = - input_buffer[p_obj_drc->str_config.num_ch_in * - p_obj_drc->str_config.frame_size + - j * p_obj_drc->str_config.num_ch_in + i]; - } - } - - error = impd_process_drc_bitstream_dec_gain( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (error > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - - if (p_obj_drc->str_config.bitstream_file_format == - BITSTREAM_FILE_FORMAT_SPLIT) { - if (p_obj_drc->str_bit_handler.num_bits_offset_bs != 0) { - p_obj_drc->str_bit_handler.num_bits_read_bs = - p_obj_drc->str_bit_handler.num_bits_read_bs + 8 - - p_obj_drc->str_bit_handler.num_bits_offset_bs; - p_obj_drc->str_bit_handler.num_bytes_read_bs = - p_obj_drc->str_bit_handler.num_bytes_read_bs + 1; - p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; - p_obj_drc->str_bit_handler.byte_index_bs = - p_obj_drc->str_bit_handler.byte_index_bs + 1; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs = - p_obj_drc->str_bit_handler.num_bytes_bs - 1; - } - } - } - - error = impd_drc_process_freq_domain( - p_obj_drc->str_payload.pstr_gain_dec[0], - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, audio_io_buf_real, - audio_io_buf_imag, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->boost, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->compress, - p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->drc_characteristic_target); - if (error) return -1; - - error = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_io_buf_real, p_obj_drc->str_config.frame_size); - if (error) return -1; - - error = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_io_buf_imag, p_obj_drc->str_config.frame_size); - if (error) return -1; - - error = impd_drc_process_freq_domain( - p_obj_drc->str_payload.pstr_gain_dec[1], - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, audio_io_buf_real, - audio_io_buf_imag, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->boost, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->compress, - p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->drc_characteristic_target); - if (error) return -1; - - if (p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db != 0.0f) { - FLOAT32 loudness_normalization_gain = - (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db / - 20.0); - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - audio_io_buf_real[i][j] *= loudness_normalization_gain; - audio_io_buf_imag[i][j] *= loudness_normalization_gain; - } - } - } - num_samples_per_channel = p_obj_drc->str_config.frame_size; - - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - output_buffer[j * p_obj_drc->str_config.num_ch_out + i] = - audio_io_buf_real[i][j]; - output_buffer[p_obj_drc->str_config.frame_size * - p_obj_drc->str_config.num_ch_in + - j * p_obj_drc->str_config.num_ch_out + i] = - audio_io_buf_imag[i][j]; - } - } - p_obj_drc->p_state->ui_out_bytes = - p_obj_drc->str_config.num_ch_out * (p_obj_drc->str_config.frame_size) * 4; - p_obj_drc->p_state->ui_out_bytes = - p_obj_drc->str_config.num_ch_out * - (p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in); - - if (last_frame == 0) { - if (p_obj_drc->str_config.bitstream_file_format != - BITSTREAM_FILE_FORMAT_SPLIT) { - error = impd_process_drc_bitstream_dec( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (error > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - } - return error; -} diff --git a/decoder/drc_src/impd_drc_main_stft_process.c b/decoder/drc_src/impd_drc_main_stft_process.c deleted file mode 100644 index c1e89e1..0000000 --- a/decoder/drc_src/impd_drc_main_stft_process.c +++ /dev/null @@ -1,254 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <math.h> -#include "impd_type_def.h" -#include "impd_memory_standards.h" -#include "impd_drc_bitbuffer.h" -#include "impd_drc_extr_delta_coded_info.h" -#include "impd_drc_common.h" -#include "impd_drc_struct.h" -#include "impd_drc_interface.h" -#include "impd_drc_peak_limiter.h" -#include "impd_drc_bitstream_dec_api.h" -#include "impd_drc_gain_dec.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_multi_band.h" -#include "impd_drc_process_audio.h" -#include "impd_parametric_drc_dec.h" -#include "impd_drc_eq.h" -#include "impd_drc_gain_decoder.h" -#include "impd_drc_selection_process.h" -#include "impd_drc_api_struct_def.h" - -#define BITSTREAM_FILE_FORMAT_SPLIT 1 - -static WORD32 impd_down_mix( - ia_drc_sel_proc_output_struct *uni_drc_sel_proc_output, - FLOAT32 **input_audio, WORD32 frame_len) { - WORD32 num_base_ch = uni_drc_sel_proc_output->base_channel_count; - WORD32 num_target_ch = uni_drc_sel_proc_output->target_channel_count; - WORD32 i, i_ch, o_ch; - FLOAT32 tmp_out[MAX_CHANNEL_COUNT]; - - if (uni_drc_sel_proc_output->downmix_matrix_present == 0) return 0; - - if (input_audio == 0) return 0; - - if (num_target_ch > MAX_CHANNEL_COUNT) return -1; - - if (num_target_ch > num_base_ch) return -1; - - for (i = 0; i < frame_len; i++) { - for (o_ch = 0; o_ch < num_target_ch; o_ch++) { - tmp_out[o_ch] = 0.0f; - for (i_ch = 0; i_ch < num_base_ch; i_ch++) { - tmp_out[o_ch] += input_audio[i_ch][i] * - uni_drc_sel_proc_output->downmix_matrix[i_ch][o_ch]; - } - } - for (o_ch = 0; o_ch < num_target_ch; o_ch++) { - input_audio[o_ch][i] = tmp_out[o_ch]; - } - for (; o_ch < num_base_ch; o_ch++) { - input_audio[o_ch][i] = 0.0f; - } - } - - return 0; -} - -WORD32 impd_init_process_audio_main_stft(ia_drc_api_struct *p_obj_drc) - -{ - WORD32 error = 0, i, j, num_samples_per_channel; - FLOAT32 *input_buffer; - FLOAT32 *output_buffer; - FLOAT32 *audio_io_buf_real[10]; - FLOAT32 *audio_io_buf_imag[10]; - FLOAT32 *scratch_buffer; - WORD32 last_frame = 0; - scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; - input_buffer = (FLOAT32 *)p_obj_drc->pp_mem[2]; - output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; - - if (p_obj_drc->p_state->ui_in_bytes <= 0) { - p_obj_drc->p_state->ui_out_bytes = 0; - return 0; - } - - if ((p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in / - (p_obj_drc->str_config.pcm_size >> 3)) < - (UWORD32)p_obj_drc->str_config.frame_size) - last_frame = 1; - for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { - audio_io_buf_real[i] = - scratch_buffer + i * (p_obj_drc->str_config.frame_size + 32); - audio_io_buf_imag[i] = - scratch_buffer + - p_obj_drc->str_config.num_ch_in * p_obj_drc->str_config.frame_size + - p_obj_drc->str_config.num_ch_in * 64 + - i * (p_obj_drc->str_config.frame_size + 64); - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - audio_io_buf_real[i][j] = - input_buffer[j * p_obj_drc->str_config.num_ch_in + i]; - audio_io_buf_imag[i][j] = - input_buffer[p_obj_drc->str_config.num_ch_in * - p_obj_drc->str_config.frame_size + - j * p_obj_drc->str_config.num_ch_in + i]; - } - } - - error = impd_process_drc_bitstream_dec_gain( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (error > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - - if (p_obj_drc->str_config.bitstream_file_format == - BITSTREAM_FILE_FORMAT_SPLIT) { - if (p_obj_drc->str_bit_handler.num_bits_offset_bs != 0) { - p_obj_drc->str_bit_handler.num_bits_read_bs = - p_obj_drc->str_bit_handler.num_bits_read_bs + 8 - - p_obj_drc->str_bit_handler.num_bits_offset_bs; - p_obj_drc->str_bit_handler.num_bytes_read_bs = - p_obj_drc->str_bit_handler.num_bytes_read_bs + 1; - p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; - p_obj_drc->str_bit_handler.byte_index_bs = - p_obj_drc->str_bit_handler.byte_index_bs + 1; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs = - p_obj_drc->str_bit_handler.num_bytes_bs - 1; - } - } - } - - error = impd_drc_process_freq_domain( - p_obj_drc->str_payload.pstr_gain_dec[0], - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, audio_io_buf_real, - audio_io_buf_imag, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->boost, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->compress, - p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->drc_characteristic_target); - if (error) return -1; - - error = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_io_buf_real, p_obj_drc->str_config.frame_size); - if (error) return -1; - - error = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_io_buf_imag, p_obj_drc->str_config.frame_size); - if (error) return -1; - - error = impd_drc_process_freq_domain( - p_obj_drc->str_payload.pstr_gain_dec[1], - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, audio_io_buf_real, - audio_io_buf_imag, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->boost, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->compress, - p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->drc_characteristic_target); - if (error) return -1; - - if (p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db != 0.0f) { - FLOAT32 loudness_normalization_gain = - (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db / - 20.0); - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - audio_io_buf_real[i][j] *= loudness_normalization_gain; - audio_io_buf_imag[i][j] *= loudness_normalization_gain; - } - } - } - - num_samples_per_channel = p_obj_drc->str_config.frame_size; - - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - output_buffer[j * p_obj_drc->str_config.num_ch_out + i] = - audio_io_buf_real[i][j]; - output_buffer[p_obj_drc->str_config.frame_size * - p_obj_drc->str_config.num_ch_in + - j * p_obj_drc->str_config.num_ch_out + i] = - audio_io_buf_imag[i][j]; - } - } - p_obj_drc->p_state->ui_out_bytes = - p_obj_drc->str_config.num_ch_out * (p_obj_drc->str_config.frame_size) * 4; - p_obj_drc->p_state->ui_out_bytes = - p_obj_drc->str_config.num_ch_out * - (p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in); - - if (last_frame == 0) { - if (p_obj_drc->str_config.bitstream_file_format != - BITSTREAM_FILE_FORMAT_SPLIT) { - error = impd_process_drc_bitstream_dec( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (error > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - } - - return error; -} diff --git a/decoder/drc_src/impd_drc_main_td_process.c b/decoder/drc_src/impd_drc_main_td_process.c index 6449531..4354365 100644 --- a/decoder/drc_src/impd_drc_main_td_process.c +++ b/decoder/drc_src/impd_drc_main_td_process.c @@ -75,18 +75,9 @@ static IA_ERRORCODE impd_down_mix( IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { IA_ERRORCODE err_code = IA_NO_ERROR; WORD32 i, j; - FLOAT32 *input_buffer; - WORD16 *input_buffer16, *output_buffer16; - FLOAT32 *output_buffer; FLOAT32 *audio_buff[10]; - FLOAT32 *scratch_buffer; WORD32 last_frame = 0; WORD32 num_sample_to_process; - scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; - input_buffer = (FLOAT32 *)p_obj_drc->pp_mem[2]; - output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; - input_buffer16 = (WORD16 *)p_obj_drc->pp_mem[2]; - output_buffer16 = (WORD16 *)p_obj_drc->pp_mem[3]; if (p_obj_drc->p_state->ui_in_bytes <= 0) { p_obj_drc->p_state->ui_out_bytes = 0; @@ -111,29 +102,16 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); p_obj_drc->str_bit_handler.byte_index_bs += p_obj_drc->str_bit_handler.num_bytes_read_bs; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - if (p_obj_drc->str_config.bitstream_file_format == - BITSTREAM_FILE_FORMAT_SPLIT) { - if (p_obj_drc->str_bit_handler.num_bits_offset_bs != 0) { - p_obj_drc->str_bit_handler.num_bits_read_bs = - p_obj_drc->str_bit_handler.num_bits_read_bs + 8 - - p_obj_drc->str_bit_handler.num_bits_offset_bs; - p_obj_drc->str_bit_handler.num_bytes_read_bs = - p_obj_drc->str_bit_handler.num_bytes_read_bs + 1; - p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; - p_obj_drc->str_bit_handler.byte_index_bs = - p_obj_drc->str_bit_handler.byte_index_bs + 1; - if (p_obj_drc->str_bit_handler.gain_stream_flag == 0) { - p_obj_drc->str_bit_handler.num_bytes_bs = - p_obj_drc->str_bit_handler.num_bytes_bs - 1; - } - } + if (p_obj_drc->str_bit_handler.num_bits_offset_bs != 0) { + p_obj_drc->str_bit_handler.num_bits_read_bs = + p_obj_drc->str_bit_handler.num_bits_read_bs + 8 - + p_obj_drc->str_bit_handler.num_bits_offset_bs; + p_obj_drc->str_bit_handler.num_bytes_read_bs = + p_obj_drc->str_bit_handler.num_bytes_read_bs + 1; + p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; + p_obj_drc->str_bit_handler.byte_index_bs = + p_obj_drc->str_bit_handler.byte_index_bs + 1; } num_sample_to_process = @@ -145,6 +123,8 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { if (num_sample_to_process < p_obj_drc->str_config.frame_size) last_frame = 1; if (p_obj_drc->str_config.pcm_size == 16) { + FLOAT32 *scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; + WORD16 *input_buffer16 = (WORD16 *)p_obj_drc->pp_mem[2]; for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { audio_buff[i] = scratch_buffer + i * (p_obj_drc->str_config.frame_size + 32); @@ -155,7 +135,29 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { 32767.0f; } } + } else if (p_obj_drc->str_config.pcm_size == 24) { + FLOAT32 *scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; + WORD8 *input_buffer8 = (WORD8 *)p_obj_drc->pp_mem[2]; + for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { + audio_buff[i] = + scratch_buffer + i * (p_obj_drc->str_config.frame_size + 32); + + for (j = 0; j < num_sample_to_process; j++) { + WORD32 temp; + + WORD8 *addr = + (WORD8 *)(&input_buffer8[3 * j * p_obj_drc->str_config.num_ch_in + + 3 * i]); + temp = (WORD8)(*(addr + 2)); + temp = (temp << 8) | ((WORD8)(*(addr + 1)) & 0xff); + temp = (temp << 8) | (((WORD8) * (addr)) & 0xff); + + audio_buff[i][j] = (FLOAT32)((temp) / 8388607.0f); + } + } } else { + FLOAT32 *scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; + FLOAT32 *input_buffer = (FLOAT32 *)p_obj_drc->pp_mem[2]; for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { audio_buff[i] = scratch_buffer + i * (p_obj_drc->str_config.frame_size + 32); @@ -214,6 +216,7 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { } if (p_obj_drc->str_config.peak_limiter) { + FLOAT32 *output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { output_buffer[j * p_obj_drc->str_config.num_ch_out + i] = @@ -221,11 +224,8 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { } } - err_code = - impd_limiter_process(p_obj_drc->str_payload.pstr_peak_limiter, - output_buffer, p_obj_drc->str_config.frame_size); - - if (err_code != IA_NO_ERROR) return err_code; + impd_limiter_process(p_obj_drc->str_payload.pstr_peak_limiter, + output_buffer, p_obj_drc->str_config.frame_size); for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { @@ -236,6 +236,7 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { } if (p_obj_drc->str_config.pcm_size == 16) { + WORD16 *output_buffer16 = (WORD16 *)p_obj_drc->pp_mem[3]; for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { if (audio_buff[i][j] < -1.0f) @@ -249,7 +250,30 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { (WORD16)(audio_buff[i][j] * 32767.0f); } } + } else if (p_obj_drc->str_config.pcm_size == 24) { + WORD8 *output_buffer8 = (WORD8 *)p_obj_drc->pp_mem[3]; + for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { + for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { + WORD32 temp = 0; + WORD8 *temp_addr = + &output_buffer8[3 * j * p_obj_drc->str_config.num_ch_out + 3 * i]; + + if (audio_buff[i][j] < -1.0f) + temp = -8388607; + + else if (audio_buff[i][j] > 1.0f) + temp = 8388607; + + else + temp = (WORD32)(audio_buff[i][j] * 8388607.0f); + + *temp_addr++ = (WORD8)(temp & 0xff); + *temp_addr++ = (WORD8)((WORD32)temp >> 8) & 0xff; + *temp_addr = (WORD8)((WORD32)temp >> 16) & 0xff; + } + } } else { + FLOAT32 *output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { output_buffer[j * p_obj_drc->str_config.num_ch_out + i] = @@ -263,6 +287,8 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { (p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in); if (p_obj_drc->p_state->delay_in_output != 0) { + FLOAT32 *output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; + WORD16 *output_buffer16 = (WORD16 *)p_obj_drc->pp_mem[3]; p_obj_drc->p_state->ui_out_bytes = p_obj_drc->str_config.num_ch_out * (p_obj_drc->str_config.frame_size - p_obj_drc->p_state->delay_in_output) * @@ -294,32 +320,5 @@ IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc) { p_obj_drc->str_config.num_ch_out * (p_obj_drc->str_config.pcm_size >> 3); } - - if (last_frame == 0) { - if (p_obj_drc->str_config.bitstream_file_format != - BITSTREAM_FILE_FORMAT_SPLIT) { - err_code = impd_process_drc_bitstream_dec( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (err_code > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - } - return err_code; } diff --git a/decoder/drc_src/impd_drc_main_td_qmf_process.c b/decoder/drc_src/impd_drc_main_td_qmf_process.c deleted file mode 100644 index 2697c54..0000000 --- a/decoder/drc_src/impd_drc_main_td_qmf_process.c +++ /dev/null @@ -1,364 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2018 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <math.h> -#include "impd_type_def.h" -#include "impd_memory_standards.h" -#include "impd_drc_peak_limiter.h" -#include "impd_drc_extr_delta_coded_info.h" -#include "impd_drc_common.h" -#include "impd_drc_struct.h" -#include "impd_drc_interface.h" -#include "impd_drc_bitbuffer.h" -#include "impd_drc_bitstream_dec_api.h" -#include "impd_drc_gain_dec.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_multi_band.h" -#include "impd_drc_process_audio.h" -#include "impd_parametric_drc_dec.h" -#include "impd_drc_eq.h" -#include "impd_drc_gain_decoder.h" -#include "impd_drc_selection_process.h" -#include "impd_drc_api_struct_def.h" -#include "impd_drc_hashdefines.h" -#include "impd_drc_rom.h" - -VOID process_qmf_syn_filt_bank(ia_drc_qmf_filt_struct *qmf_filt, FLOAT64 *buff, - FLOAT32 *input_real, FLOAT32 *input_imag, - FLOAT32 *output) { - WORD32 i, j; - FLOAT64 U[10 * QMF_NUM_FILT_BANDS]; - FLOAT64 W[10 * QMF_NUM_FILT_BANDS]; - - FLOAT64 tmp; - - for (i = 20 * QMF_FILT_RESOLUTION - 1; i >= 2 * QMF_FILT_RESOLUTION; i--) { - buff[i] = buff[i - 2 * QMF_FILT_RESOLUTION]; - } - - for (i = 0; i < 2 * QMF_FILT_RESOLUTION; i++) { - tmp = 0.0; - for (j = 0; j < QMF_FILT_RESOLUTION; j++) { - tmp = tmp + input_real[j] * qmf_filt->syn_tab_real[i][j] - - input_imag[j] * qmf_filt->syn_tab_imag[i][j]; - } - buff[i] = tmp; - } - - for (i = 0; i < 5; i++) { - for (j = 0; j < QMF_FILT_RESOLUTION; j++) { - U[2 * QMF_FILT_RESOLUTION * i + j] = - buff[4 * QMF_FILT_RESOLUTION * i + j]; - U[2 * QMF_FILT_RESOLUTION * i + QMF_FILT_RESOLUTION + j] = - buff[4 * QMF_FILT_RESOLUTION * i + 3 * QMF_FILT_RESOLUTION + j]; - } - } - - for (i = 0; i < 10 * QMF_FILT_RESOLUTION; i++) { - W[i] = U[i] * qmf_filter_coeff[i]; - } - - for (i = 0; i < QMF_FILT_RESOLUTION; i++) { - tmp = 0.0; - for (j = 0; j < 10; j++) { - tmp = tmp + W[QMF_FILT_RESOLUTION * j + i]; - } - output[i] = (FLOAT32)tmp; - } -} - -VOID process_qmf_ana_filt_bank(ia_drc_qmf_filt_struct *qmf_filt, FLOAT64 *buff, - FLOAT32 *input, FLOAT32 *output_real, - FLOAT32 *output_imag) { - WORD32 i, j; - FLOAT32 Z[10 * QMF_NUM_FILT_BANDS]; - FLOAT32 Y[2 * QMF_NUM_FILT_BANDS]; - - for (i = 10 * QMF_FILT_RESOLUTION - 1; i >= QMF_FILT_RESOLUTION; i--) { - buff[i] = buff[i - QMF_FILT_RESOLUTION]; - } - - for (i = QMF_FILT_RESOLUTION - 1; i >= 0; i--) { - buff[i] = input[QMF_FILT_RESOLUTION - 1 - i]; - } - - for (i = 0; i < 10 * QMF_FILT_RESOLUTION; i++) { - Z[i] = (FLOAT32)(buff[i] * qmf_filter_coeff[i]); - } - - for (i = 0; i < 2 * QMF_FILT_RESOLUTION; i++) { - Y[i] = 0.0f; - for (j = 0; j < 5; j++) { - Y[i] += Z[i + j * 2 * QMF_FILT_RESOLUTION]; - } - } - - for (i = 0; i < QMF_FILT_RESOLUTION; i++) { - output_real[i] = 0.0f; - output_imag[i] = 0.0f; - for (j = 0; j < 2 * QMF_FILT_RESOLUTION; j++) { - output_real[i] += (FLOAT32)(Y[j] * qmf_filt->ana_tab_real[i][j]); - output_imag[i] += (FLOAT32)(Y[j] * qmf_filt->ana_tab_imag[i][j]); - } - } -} - -static WORD32 impd_down_mix( - ia_drc_sel_proc_output_struct *uni_drc_sel_proc_output, - FLOAT32 **input_audio, WORD32 frame_len) { - WORD32 num_base_ch = uni_drc_sel_proc_output->base_channel_count; - WORD32 num_target_ch = uni_drc_sel_proc_output->target_channel_count; - WORD32 i, i_ch, o_ch; - FLOAT32 tmp_out[MAX_CHANNEL_COUNT]; - - if (num_target_ch > MAX_CHANNEL_COUNT) return -1; - - if (num_target_ch > num_base_ch) return -1; - - for (i = 0; i < frame_len; i++) { - for (o_ch = 0; o_ch < num_target_ch; o_ch++) { - tmp_out[o_ch] = 0.0f; - for (i_ch = 0; i_ch < num_base_ch; i_ch++) { - tmp_out[o_ch] += input_audio[i_ch][i] * - uni_drc_sel_proc_output->downmix_matrix[i_ch][o_ch]; - } - } - for (o_ch = 0; o_ch < num_target_ch; o_ch++) { - input_audio[o_ch][i] = tmp_out[o_ch]; - } - for (; o_ch < num_base_ch; o_ch++) { - input_audio[o_ch][i] = 0.0f; - } - } - - return 0; -} - -WORD32 impd_init_process_audio_main_td_qmf(ia_drc_api_struct *p_obj_drc) - -{ - WORD32 error, i, j, num_samples_per_channel; - FLOAT32 *input_buffer; - WORD16 *input_buffer16, *output_buffer16; - FLOAT32 *output_buffer; - FLOAT32 *audio_io_buf_real[10]; - FLOAT32 *audio_io_buf_imag[10]; - FLOAT32 *audio_in_out_buf[10]; - FLOAT32 *scratch_buffer; - WORD32 last_frame = 0; - error = 0; - scratch_buffer = (FLOAT32 *)p_obj_drc->pp_mem[1]; - input_buffer = (FLOAT32 *)p_obj_drc->pp_mem[2]; - output_buffer = (FLOAT32 *)p_obj_drc->pp_mem[3]; - - input_buffer16 = (WORD16 *)p_obj_drc->pp_mem[2]; - output_buffer16 = (WORD16 *)p_obj_drc->pp_mem[3]; - - if (p_obj_drc->p_state->ui_in_bytes <= 0) { - p_obj_drc->p_state->ui_out_bytes = 0; - return 0; - } - - if ((p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in / - (p_obj_drc->str_config.pcm_size >> 3)) < - (UWORD32)p_obj_drc->str_config.frame_size) - last_frame = 1; - - for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { - audio_in_out_buf[i] = scratch_buffer; - scratch_buffer = scratch_buffer + (p_obj_drc->str_config.frame_size + 32); - audio_io_buf_real[i] = - scratch_buffer + - (p_obj_drc->str_config.frame_size * p_obj_drc->str_config.num_ch_in + - 512); - audio_io_buf_imag[i] = scratch_buffer + - 2 * (p_obj_drc->str_config.frame_size * - p_obj_drc->str_config.num_ch_in + - 512); - ; - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - if (p_obj_drc->str_config.pcm_size == 16) { - audio_in_out_buf[i][j] = - ((FLOAT32)input_buffer16[j * p_obj_drc->str_config.num_ch_in + i]) / - 32767.0f; - } else { - audio_in_out_buf[i][j] = - input_buffer[j * p_obj_drc->str_config.num_ch_in + i]; - } - } - } - - error = impd_process_drc_bitstream_dec_gain( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (error > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - if (p_obj_drc->str_config.bitstream_file_format == - BITSTREAM_FILE_FORMAT_SPLIT) { - /* shift over fill-bits for frame byte alignment */ - if (p_obj_drc->str_bit_handler.num_bits_offset_bs != 0) { - p_obj_drc->str_bit_handler.num_bits_read_bs = - p_obj_drc->str_bit_handler.num_bits_read_bs + 8 - - p_obj_drc->str_bit_handler.num_bits_offset_bs; - p_obj_drc->str_bit_handler.num_bytes_read_bs = - p_obj_drc->str_bit_handler.num_bytes_read_bs + 1; - p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; - p_obj_drc->str_bit_handler.byte_index_bs = - p_obj_drc->str_bit_handler.byte_index_bs + 1; - if (p_obj_drc->str_bit_handler.gain_stream_flag == - 0) // ITTIAM: Flag for applying gain frame by frame - { - p_obj_drc->str_bit_handler.num_bytes_bs = - p_obj_drc->str_bit_handler.num_bytes_bs - 1; - } - } - } - - for (i = 0; i < p_obj_drc->str_config.num_ch_in; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j += 64) { - process_qmf_ana_filt_bank( - p_obj_drc->str_payload.pstr_qmf_filter, - p_obj_drc->str_payload.pstr_qmf_filter->ana_buff + - i * 4 * p_obj_drc->str_config.frame_size, - &(audio_in_out_buf[i][j]), &(audio_io_buf_real[i][j]), - &(audio_io_buf_imag[i][j])); - } - } - error = impd_drc_process_freq_domain( - p_obj_drc->str_payload.pstr_gain_dec[0], - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, audio_io_buf_real, - audio_io_buf_imag, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->boost, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->compress, - p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->drc_characteristic_target); - - if (error) return error; - - if (p_obj_drc->str_payload.pstr_drc_sel_proc_output->target_channel_count < - p_obj_drc->str_payload.pstr_drc_sel_proc_output->base_channel_count) { - error = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_io_buf_real, p_obj_drc->str_config.frame_size); - if (error) return error; - - error = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_io_buf_imag, p_obj_drc->str_config.frame_size); - if (error) return error; - } - - error = impd_drc_process_freq_domain( - p_obj_drc->str_payload.pstr_gain_dec[1], - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, audio_io_buf_real, - audio_io_buf_imag, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->boost, - p_obj_drc->str_payload.pstr_drc_sel_proc_output->compress, - p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->drc_characteristic_target); - if (error) return -1; - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j += 64) { - process_qmf_syn_filt_bank( - p_obj_drc->str_payload.pstr_qmf_filter, - p_obj_drc->str_payload.pstr_qmf_filter->syn_buff + - i * 4 * p_obj_drc->str_config.frame_size, - &(audio_io_buf_real[i][j]), &(audio_io_buf_imag[i][j]), - &(audio_in_out_buf[i][j])); - } - } - - if (p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db != 0.0f) { - FLOAT32 loudness_normalization_gain = - (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output - ->loudness_normalization_gain_db / - 20.0); - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - audio_io_buf_real[i][j] *= loudness_normalization_gain; - audio_io_buf_imag[i][j] *= loudness_normalization_gain; - } - } - } - - num_samples_per_channel = p_obj_drc->str_config.frame_size; - - for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { - if (p_obj_drc->str_config.pcm_size == 16) { - output_buffer16[j * p_obj_drc->str_config.num_ch_out + i] = - (WORD16)(audio_in_out_buf[i][j] * 32767.0f); - } else { - output_buffer[j * p_obj_drc->str_config.num_ch_out + i] = - audio_in_out_buf[i][j]; - } - } - } - p_obj_drc->p_state->ui_out_bytes = - p_obj_drc->str_config.num_ch_out * - (p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in); - - if (p_obj_drc->str_config.bitstream_file_format != - BITSTREAM_FILE_FORMAT_SPLIT) { - error = impd_process_drc_bitstream_dec( - p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, - &p_obj_drc->str_bit_handler - .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.num_bytes_bs, - p_obj_drc->str_bit_handler.num_bits_offset_bs, - &p_obj_drc->str_bit_handler.num_bits_read_bs); - - if (error > PROC_COMPLETE) return -1; - - p_obj_drc->str_bit_handler.num_bytes_read_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs >> 3); - p_obj_drc->str_bit_handler.num_bits_offset_bs = - (p_obj_drc->str_bit_handler.num_bits_read_bs & 7); - p_obj_drc->str_bit_handler.byte_index_bs += - p_obj_drc->str_bit_handler.num_bytes_read_bs; - p_obj_drc->str_bit_handler.num_bytes_bs -= - p_obj_drc->str_bit_handler.num_bytes_read_bs; - } - - return error; -} diff --git a/decoder/drc_src/impd_drc_multi_band.h b/decoder/drc_src/impd_drc_multi_band.h index 4d51d80..84d92c0 100644 --- a/decoder/drc_src/impd_drc_multi_band.h +++ b/decoder/drc_src/impd_drc_multi_band.h @@ -40,22 +40,19 @@ typedef struct { str_group_overlap_params[CHANNEL_GROUP_COUNT_MAX]; } ia_overlap_params_struct; -WORD32 -impd_fcenter_norm_sb_init(WORD32 num_subbands, FLOAT32* fcenter_norm_subband); +VOID impd_fcenter_norm_sb_init(WORD32 num_subbands, + FLOAT32* fcenter_norm_subband); -WORD32 -impd_generate_slope(WORD32 num_subbands, FLOAT32* fcenter_norm_subband, - FLOAT32 fcross_norm_lo, FLOAT32 fcross_norm_hi, - FLOAT32* response); +VOID impd_generate_slope(WORD32 num_subbands, FLOAT32* fcenter_norm_subband, + FLOAT32 fcross_norm_lo, FLOAT32 fcross_norm_hi, + FLOAT32* response); -WORD32 -impd_generate_overlap_weights( +VOID impd_generate_overlap_weights( WORD32 num_drc_bands, WORD32 drc_band_type, ia_gain_params_struct* gain_params, WORD32 dec_subband_count, ia_group_overlap_params_struct* pstr_group_overlap_params); -WORD32 -impd_init_overlap_weight( +VOID impd_init_overlap_weight( ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc, ia_drc_instructions_struct* str_drc_instruction_str, WORD32 sub_band_domain_mode, ia_overlap_params_struct* pstr_overlap_params); diff --git a/decoder/drc_src/impd_drc_multiband.c b/decoder/drc_src/impd_drc_multiband.c index fc60745..fbe89a2 100644 --- a/decoder/drc_src/impd_drc_multiband.c +++ b/decoder/drc_src/impd_drc_multiband.c @@ -29,19 +29,18 @@ #include "impd_drc_multi_band.h" #include "impd_drc_rom.h" -IA_ERRORCODE impd_fcenter_norm_sb_init(WORD32 num_subbands, - FLOAT32* fcenter_norm_subband) { +VOID impd_fcenter_norm_sb_init(WORD32 num_subbands, + FLOAT32* fcenter_norm_subband) { WORD32 s; for (s = 0; s < num_subbands; s++) { fcenter_norm_subband[s] = (s + 0.5f) / (2.0f * num_subbands); } - return (0); + return; } -IA_ERRORCODE impd_generate_slope(WORD32 num_sub_bands, - FLOAT32* fcenter_norm_subband, - FLOAT32 fcross_norm_lo, FLOAT32 fcross_norm_hi, - FLOAT32* response) { +VOID impd_generate_slope(WORD32 num_sub_bands, FLOAT32* fcenter_norm_subband, + FLOAT32 fcross_norm_lo, FLOAT32 fcross_norm_hi, + FLOAT32* response) { WORD32 i; FLOAT32 filter_slope = -24.0f; FLOAT32 inv_log10_2 = 3.32192809f; @@ -58,18 +57,18 @@ IA_ERRORCODE impd_generate_slope(WORD32 num_sub_bands, 10.0, norm * log10(fcenter_norm_subband[i] / fcross_norm_hi)); } } - return (0); + return; } -IA_ERRORCODE impd_generate_overlap_weights( +VOID impd_generate_overlap_weights( WORD32 num_drc_bands, WORD32 drc_band_type, ia_gain_params_struct* gain_params, WORD32 dec_subband_count, ia_group_overlap_params_struct* pstr_group_overlap_params) { FLOAT32 fcenter_norm_subband[AUDIO_CODEC_SUBBAND_COUNT_MAX]; FLOAT32 w_norm[AUDIO_CODEC_SUBBAND_COUNT_MAX]; FLOAT32 fcross_norm_lo, fcross_norm_hi; - WORD32 err, b, s, start_subband_index = 0, stop_sub_band_index = 0; - err = impd_fcenter_norm_sb_init(dec_subband_count, fcenter_norm_subband); + WORD32 b, s, start_subband_index = 0, stop_sub_band_index = 0; + impd_fcenter_norm_sb_init(dec_subband_count, fcenter_norm_subband); if (drc_band_type == 1) { fcross_norm_lo = 0.0f; @@ -124,15 +123,15 @@ IA_ERRORCODE impd_generate_overlap_weights( } } - return (0); + return; } -IA_ERRORCODE impd_init_overlap_weight( +VOID impd_init_overlap_weight( ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc, ia_drc_instructions_struct* str_drc_instruction_str, WORD32 sub_band_domain_mode, ia_overlap_params_struct* pstr_overlap_params) { - WORD32 err = 0, g; + WORD32 g; WORD32 dec_subband_count = 0; switch (sub_band_domain_mode) { case SUBBAND_DOMAIN_MODE_QMF64: @@ -148,7 +147,7 @@ IA_ERRORCODE impd_init_overlap_weight( for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { if (str_drc_instruction_str->band_count_of_ch_group[g] > 1) { - err = impd_generate_overlap_weights( + impd_generate_overlap_weights( str_drc_instruction_str->band_count_of_ch_group[g], str_p_loc_drc_coefficients_uni_drc ->gain_set_params[str_drc_instruction_str @@ -160,9 +159,8 @@ IA_ERRORCODE impd_init_overlap_weight( .gain_params, dec_subband_count, &(pstr_overlap_params->str_group_overlap_params[g])); - if (err) return (err); } } - return (0); + return; } diff --git a/decoder/drc_src/impd_drc_parametric_dec.c b/decoder/drc_src/impd_drc_parametric_dec.c index e4b3b4a..4a42fd6 100644 --- a/decoder/drc_src/impd_drc_parametric_dec.c +++ b/decoder/drc_src/impd_drc_parametric_dec.c @@ -41,7 +41,7 @@ WORD32 impd_init_parametric_drc( WORD32 drc_frame_size, WORD32 sampling_rate, WORD32 sub_band_domain_mode, ia_parametric_drc_params_struct* p_parametricdrc_params) { - WORD32 sub_band_count_tbl[4] = {0, 64, 71, 256}; + static const WORD32 sub_band_count_tbl[4] = {0, 64, 71, 256}; p_parametricdrc_params->drc_frame_size = drc_frame_size; p_parametricdrc_params->sampling_rate = sampling_rate; p_parametricdrc_params->sub_band_domain_mode = sub_band_domain_mode; @@ -478,9 +478,9 @@ WORD32 impd_init_parametric_drc_after_config( } } - impd_init_parametric_drcInstance(pstr_drc_config, instance_idx, - ch_count_from_dwnmix_id, - p_parametricdrc_params, mem_ptr); + err = impd_init_parametric_drcInstance(pstr_drc_config, instance_idx, + ch_count_from_dwnmix_id, + p_parametricdrc_params, mem_ptr); if (err) return (err); } @@ -568,7 +568,7 @@ WORD32 impd_init_lvl_est_filt_subband( FLOAT32 w0, alpha, sinw0, cosw0; FLOAT32 b0, b1, b2, a0, a1, a2; FLOAT32 num_real, num_imag, den_real, den_imag; - FLOAT32* f_bands_nrm; + const FLOAT32* f_bands_nrm; WORD32 b; WORD32 i; const FLOAT32* ptr_samp_tbl; @@ -1027,7 +1027,7 @@ WORD32 impd_parametric_ffwd_type_drc_process( return 0; } -WORD32 impd_parametric_lim_type_drc_process( +VOID impd_parametric_lim_type_drc_process( FLOAT32* samples[], FLOAT32 loudness_normalization_gain_db, ia_parametric_drc_type_lim_params_struct* pstr_parametric_lim_type_drc_params, @@ -1102,5 +1102,5 @@ WORD32 impd_parametric_lim_type_drc_process( pstr_parametric_lim_type_drc_params->cor = gain_modified; pstr_parametric_lim_type_drc_params->smooth_state_0 = pre_smoothed_gain; - return 0; + return; } diff --git a/decoder/drc_src/impd_drc_peak_limiter.c b/decoder/drc_src/impd_drc_peak_limiter.c index 2b013f7..8930279 100644 --- a/decoder/drc_src/impd_drc_peak_limiter.c +++ b/decoder/drc_src/impd_drc_peak_limiter.c @@ -62,7 +62,7 @@ WORD32 impd_peak_limiter_init(ia_drc_peak_limiter_struct *peak_limiter, return 0; } -WORD32 impd_peak_limiter_reinit(ia_drc_peak_limiter_struct *peak_limiter) { +VOID impd_peak_limiter_reinit(ia_drc_peak_limiter_struct *peak_limiter) { if (peak_limiter) { peak_limiter->delayed_input_index = 0; peak_limiter->pre_smoothed_gain = 1.0f; @@ -75,11 +75,11 @@ WORD32 impd_peak_limiter_reinit(ia_drc_peak_limiter_struct *peak_limiter) { sizeof(FLOAT32)); } - return 0; + return; } -WORD32 impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, - FLOAT32 *samples, UWORD32 frame_len) { +VOID impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, + FLOAT32 *samples, UWORD32 frame_len) { UWORD32 i, j; FLOAT32 tmp, gain; FLOAT32 min_gain = 1; @@ -177,5 +177,5 @@ WORD32 impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, peak_limiter->pre_smoothed_gain = pre_smoothed_gain; peak_limiter->min_gain = min_gain; - return 0; + return; } diff --git a/decoder/drc_src/impd_drc_peak_limiter.h b/decoder/drc_src/impd_drc_peak_limiter.h index d4ba07f..9e3aea1 100644 --- a/decoder/drc_src/impd_drc_peak_limiter.h +++ b/decoder/drc_src/impd_drc_peak_limiter.h @@ -47,7 +47,7 @@ WORD32 impd_peak_limiter_init(ia_drc_peak_limiter_struct *peak_limiter, FLOAT32 limit_threshold, UWORD32 num_channels, UWORD32 sample_rate, FLOAT32 *buffer); -WORD32 impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, - FLOAT32 *samples, UWORD32 frame_len); +VOID impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, + FLOAT32 *samples, UWORD32 frame_len); #endif diff --git a/decoder/drc_src/impd_drc_process.c b/decoder/drc_src/impd_drc_process.c index 15115a2..e4b5147 100644 --- a/decoder/drc_src/impd_drc_process.c +++ b/decoder/drc_src/impd_drc_process.c @@ -31,7 +31,7 @@ #include "impd_drc_gain_dec.h" #include "impd_drc_process_audio.h" -WORD32 impd_apply_gains_and_add( +VOID impd_apply_gains_and_add( ia_drc_instructions_struct* pstr_drc_instruction_arr, const WORD32 drc_instructions_index, ia_drc_params_struct* ia_drc_params_struct, @@ -130,6 +130,9 @@ WORD32 impd_apply_gains_and_add( impd_shape_filt_block_adapt(lpcm_gains[iEnd], &shape_filter_block[g]); } + if ((iEnd == iStart) && + (drc_gain_last == shape_filter_block[g].drc_gain_last)) + break; iStart = iEnd; } } @@ -173,184 +176,7 @@ WORD32 impd_apply_gains_and_add( } } - return (0); -} - -/* subband-domain DRC: in-place application of DRC gains to audio frame */ -WORD32 -impd_apply_gains_subband(ia_drc_instructions_struct* pstr_drc_instruction_arr, - const WORD32 drc_instructions_index, - ia_drc_params_struct* ia_drc_params_struct, - ia_gain_buffer_struct* pstr_gain_buf, - ia_overlap_params_struct* pstr_overlap_params, - FLOAT32* deinterleaved_audio_delayed_re[], - FLOAT32* deinterleaved_audio_delayed_im[], - FLOAT32* deinterleaved_audio_re[], - FLOAT32* deinterleaved_audio_im[]) { - WORD32 c, b, g, m, s; - WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; - FLOAT32* lpcm_gains; - FLOAT32 gainSb, gainLr; - ia_drc_instructions_struct* str_drc_instruction_str; - WORD32 offset = 0, signalIndex = 0; - WORD32 drc_frame_sizeSb = 0; - WORD32 nDecoderSubbands = 0; - WORD32 L = 0; /* L: downsampling factor */ - WORD32 analysisDelay = 0; - switch (ia_drc_params_struct->sub_band_domain_mode) { - case SUBBAND_DOMAIN_MODE_QMF64: - nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF64; - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF64; - break; - case SUBBAND_DOMAIN_MODE_QMF71: - nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_QMF71; - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; - analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF71; - break; - case SUBBAND_DOMAIN_MODE_STFT256: - nDecoderSubbands = AUDIO_CODEC_SUBBAND_COUNT_STFT256; - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - analysisDelay = AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_STFT256; - break; - default: - return -1; - break; - } - drc_frame_sizeSb = ia_drc_params_struct->drc_frame_size / L; - - if (drc_instructions_index >= 0) { - str_drc_instruction_str = - &(pstr_drc_instruction_arr[drc_instructions_index]); - { - if (str_drc_instruction_str->drc_set_id > 0) { - if (ia_drc_params_struct->delay_mode == DELAY_MODE_LOW_DELAY) { - offset = ia_drc_params_struct->drc_frame_size; - } - gainIndexForGroup[0] = 0; - for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups - 1; g++) { - gainIndexForGroup[g + 1] = - gainIndexForGroup[g] + - str_drc_instruction_str - ->band_count_of_ch_group[g]; /* index of first gain sequence - in channel group */ - } - - for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) - - { - g = str_drc_instruction_str->channel_group_of_ch[c]; - if (g >= 0) { - for (m = 0; m < drc_frame_sizeSb; m++) { - if (str_drc_instruction_str->band_count_of_ch_group[g] > - 1) { /* multiband DRC */ - for (s = 0; s < nDecoderSubbands; s++) { - gainSb = 0.0f; - for (b = 0; - b < str_drc_instruction_str->band_count_of_ch_group[g]; - b++) { - if (str_drc_instruction_str - ->ch_group_parametric_drc_flag[g] == 0) { - lpcm_gains = - pstr_gain_buf - ->buf_interpolation[gainIndexForGroup[g] + b] - .lpcm_gains + - MAX_SIGNAL_DELAY - - ia_drc_params_struct->gain_delay_samples - - ia_drc_params_struct->audio_delay_samples + offset; - } else { - lpcm_gains = - pstr_gain_buf - ->buf_interpolation[gainIndexForGroup[g] + b] - .lpcm_gains + - MAX_SIGNAL_DELAY + - str_drc_instruction_str - ->parametric_drc_look_ahead_samples[g] - - ia_drc_params_struct->audio_delay_samples + - analysisDelay; - } - /* get gain for this timeslot by downsampling */ - gainLr = lpcm_gains[(m * L + (L - 1) / 2)]; - gainSb += pstr_overlap_params->str_group_overlap_params[g] - .str_band_overlap_params[b] - .overlap_weight[s] * - gainLr; - } - deinterleaved_audio_re[signalIndex][m * nDecoderSubbands + - s] = - gainSb * - deinterleaved_audio_delayed_re[signalIndex] - [m * nDecoderSubbands + s]; - if (ia_drc_params_struct->sub_band_domain_mode == - SUBBAND_DOMAIN_MODE_STFT256) { /* For STFT filterbank, the - real value of the - nyquist band is stored - at the imag value of the - first band */ - if (s != 0) - deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + - s] = - gainSb * - deinterleaved_audio_delayed_im[signalIndex] - [m * nDecoderSubbands + - s]; - if (s == (nDecoderSubbands - 1)) - deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + - 0] = - gainSb * - deinterleaved_audio_delayed_im[signalIndex] - [m * nDecoderSubbands + - 0]; - } else { - deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + - s] = - gainSb * - deinterleaved_audio_delayed_im[signalIndex] - [m * nDecoderSubbands + - s]; - } - } - } else { /* single-band DRC */ - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == - 0) { - lpcm_gains = - pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]] - .lpcm_gains + - MAX_SIGNAL_DELAY - - ia_drc_params_struct->gain_delay_samples - - ia_drc_params_struct->audio_delay_samples + offset; - } else { - lpcm_gains = - pstr_gain_buf->buf_interpolation[gainIndexForGroup[g]] - .lpcm_gains + - MAX_SIGNAL_DELAY + - str_drc_instruction_str - ->parametric_drc_look_ahead_samples[g] - - ia_drc_params_struct->audio_delay_samples + analysisDelay; - } - /* get gain for this timeslot by downsampling */ - gainSb = lpcm_gains[(m * L + (L - 1) / 2)]; - for (s = 0; s < nDecoderSubbands; s++) { - deinterleaved_audio_re[signalIndex][m * nDecoderSubbands + - s] = - gainSb * - deinterleaved_audio_delayed_re[signalIndex] - [m * nDecoderSubbands + s]; - deinterleaved_audio_im[signalIndex][m * nDecoderSubbands + - s] = - gainSb * - deinterleaved_audio_delayed_im[signalIndex] - [m * nDecoderSubbands + s]; - } - } - } - } - signalIndex++; - } - } - } - } - return (0); + return; } WORD32 @@ -452,9 +278,8 @@ impd_filter_banks_process(ia_drc_instructions_struct* pstr_drc_instruction_arr, return (0); } -WORD32 -impd_store_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], - ia_audio_in_out_buf* audio_io_buf_internal) { +VOID impd_store_audio_io_buffer_time( + FLOAT32* audio_in_out_buf[], ia_audio_in_out_buf* audio_io_buf_internal) { WORD32 i, j; if (audio_io_buf_internal->audio_delay_samples) { @@ -470,43 +295,11 @@ impd_store_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], audio_io_buf_internal->audio_in_out_buf = audio_in_out_buf; } - return 0; -} - -WORD32 -impd_store_audio_io_buffer_freq(FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_audio_in_out_buf* audio_io_buf_internal) { - WORD32 i, j; - - if (audio_io_buf_internal->audio_delay_sub_band_samples) { - for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { - for (j = 0; j < audio_io_buf_internal->audio_sub_band_frame_size * - audio_io_buf_internal->audio_sub_band_count; - j++) { - audio_io_buf_internal->audio_buffer_delayed_real - [i][audio_io_buf_internal->audio_delay_sub_band_samples * - audio_io_buf_internal->audio_sub_band_count + - j] = audio_real_buff[i][j]; - audio_io_buf_internal->audio_buffer_delayed_imag - [i][audio_io_buf_internal->audio_delay_sub_band_samples * - audio_io_buf_internal->audio_sub_band_count + - j] = audio_imag_buff[i][j]; - } - } - } else { - audio_io_buf_internal->audio_buffer_delayed_real = audio_real_buff; - audio_io_buf_internal->audio_buffer_delayed_imag = audio_imag_buff; - audio_io_buf_internal->audio_real_buff = audio_real_buff; - audio_io_buf_internal->audio_imag_buff = audio_imag_buff; - } - - return 0; + return; } -WORD32 -impd_retrieve_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], - ia_audio_in_out_buf* audio_io_buf_internal) { +VOID impd_retrieve_audio_io_buffer_time( + FLOAT32* audio_in_out_buf[], ia_audio_in_out_buf* audio_io_buf_internal) { WORD32 i, j; if (audio_io_buf_internal->audio_delay_samples) { @@ -518,35 +311,11 @@ impd_retrieve_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], } } - return 0; + return; } -WORD32 -impd_retrieve_audio_buffer_freq(FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_audio_in_out_buf* audio_io_buf_internal) { - WORD32 i, j; - - if (audio_io_buf_internal->audio_delay_sub_band_samples) { - for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { - for (j = 0; j < audio_io_buf_internal->audio_sub_band_frame_size * - audio_io_buf_internal->audio_sub_band_count; - j++) { - audio_real_buff[i][j] = - audio_io_buf_internal->audio_buffer_delayed_real - [i][audio_io_buf_internal->audio_sub_band_count + j]; - audio_imag_buff[i][j] = - audio_io_buf_internal->audio_buffer_delayed_imag - [i][audio_io_buf_internal->audio_sub_band_count + j]; - } - } - } - - return 0; -} - -WORD32 -impd_advance_audio_io_buffer_time(ia_audio_in_out_buf* audio_io_buf_internal) { +VOID impd_advance_audio_io_buffer_time( + ia_audio_in_out_buf* audio_io_buf_internal) { WORD32 i; if (audio_io_buf_internal->audio_delay_samples) { for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { @@ -558,29 +327,5 @@ impd_advance_audio_io_buffer_time(ia_audio_in_out_buf* audio_io_buf_internal) { } } - return 0; -} - -WORD32 -impd_advance_audio_buff_freq(ia_audio_in_out_buf* audio_io_buf_internal) { - WORD32 i; - if (audio_io_buf_internal->audio_delay_sub_band_samples) { - for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { - memmove(audio_io_buf_internal->audio_buffer_delayed_real[i], - &audio_io_buf_internal->audio_buffer_delayed_real - [i][audio_io_buf_internal->audio_sub_band_frame_size * - audio_io_buf_internal->audio_sub_band_count], - sizeof(FLOAT32) * - audio_io_buf_internal->audio_delay_sub_band_samples * - audio_io_buf_internal->audio_sub_band_count); - memmove(audio_io_buf_internal->audio_buffer_delayed_imag[i], - &audio_io_buf_internal->audio_buffer_delayed_imag - [i][audio_io_buf_internal->audio_sub_band_frame_size * - audio_io_buf_internal->audio_sub_band_count], - sizeof(FLOAT32) * - audio_io_buf_internal->audio_delay_sub_band_samples * - audio_io_buf_internal->audio_sub_band_count); - } - } - return 0; + return; } diff --git a/decoder/drc_src/impd_drc_process_audio.h b/decoder/drc_src/impd_drc_process_audio.h index 9a60280..c7be5b2 100644 --- a/decoder/drc_src/impd_drc_process_audio.h +++ b/decoder/drc_src/impd_drc_process_audio.h @@ -46,17 +46,6 @@ typedef struct { } ia_audio_in_out_buf; WORD32 -impd_apply_gains_subband(ia_drc_instructions_struct* pstr_drc_instruction_arr, - const WORD32 drc_instructions_index, - ia_drc_params_struct* ia_drc_params_struct, - ia_gain_buffer_struct* pstr_gain_buf, - ia_overlap_params_struct* pstr_overlap_params, - FLOAT32* deinterleaved_audio_delayed_re[], - FLOAT32* deinterleaved_audio_delayed_im[], - FLOAT32* deinterleaved_audio_re[], - FLOAT32* deinterleaved_audio_im[]); - -WORD32 impd_filter_banks_process(ia_drc_instructions_struct* pstr_drc_instruction_arr, const WORD32 drc_instructions_index, ia_drc_params_struct* ia_drc_params_struct, @@ -65,29 +54,22 @@ impd_filter_banks_process(ia_drc_instructions_struct* pstr_drc_instruction_arr, ia_filter_banks_struct* ia_filter_banks_struct, const WORD32 passThru); -WORD32 -impd_store_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], - ia_audio_in_out_buf* audio_io_buf_internal); +VOID impd_store_audio_io_buffer_time( + FLOAT32* audio_in_out_buf[], ia_audio_in_out_buf* audio_io_buf_internal); -WORD32 -impd_store_audio_io_buffer_freq(FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_audio_in_out_buf* audio_io_buf_internal); +VOID impd_store_audio_io_buffer_freq( + FLOAT32* audio_real_buff[], FLOAT32* audio_imag_buff[], + ia_audio_in_out_buf* audio_io_buf_internal); -WORD32 -impd_retrieve_audio_io_buffer_time(FLOAT32* audio_in_out_buf[], - ia_audio_in_out_buf* audio_io_buf_internal); +VOID impd_retrieve_audio_io_buffer_time( + FLOAT32* audio_in_out_buf[], ia_audio_in_out_buf* audio_io_buf_internal); -WORD32 -impd_retrieve_audio_buffer_freq(FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_audio_in_out_buf* audio_io_buf_internal); - -WORD32 -impd_advance_audio_io_buffer_time(ia_audio_in_out_buf* audio_io_buf_internal); +VOID impd_retrieve_audio_buffer_freq( + FLOAT32* audio_real_buff[], FLOAT32* audio_imag_buff[], + ia_audio_in_out_buf* audio_io_buf_internal); -WORD32 -impd_advance_audio_buff_freq(ia_audio_in_out_buf* audio_io_buf_internal); +VOID impd_advance_audio_io_buffer_time( + ia_audio_in_out_buf* audio_io_buf_internal); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_rom.c b/decoder/drc_src/impd_drc_rom.c index ad264bb..6925ae2 100644 --- a/decoder/drc_src/impd_drc_rom.c +++ b/decoder/drc_src/impd_drc_rom.c @@ -250,24 +250,33 @@ const FLOAT32 dwnmix_coeff_lfe[] = { 10.0f, 6.0f, 4.5f, 3.0f, 1.5f, 0.0f, -1.5f, -3.0f, -4.5f, -6.0f, -10.0f, -15.0f, -20.0f, -30.0f, -40.0f, -1000.0f}; -WORD32 drc_characteristic_order_default[][3] = { +const WORD32 drc_characteristic_order_default[][3] = { {1, 2, -1}, {2, 3, 1}, {3, 4, 2}, {4, 5, 3}, {5, 6, 4}, {6, 5, -1}, {7, 9, -1}, {8, 10, -1}, {9, 7, -1}, {10, 8, -1}, {11, 10, 9}}; -WORD32 measurement_system_default_tbl[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; -WORD32 measurement_system_bs1770_3_tbl[] = {0, 0, 8, 0, 1, 3, 0, 5, 6, 7, 4, 2}; -WORD32 measurement_system_user_tbl[] = {0, 0, 1, 0, 8, 5, 0, 2, 3, 4, 6, 7}; -WORD32 measurement_system_expert_tbl[] = {0, 0, 3, 0, 1, 8, 0, 4, 5, 6, 7, 2}; -WORD32 measurement_system_rms_a_tbl[] = {0, 0, 5, 0, 1, 3, 0, 8, 6, 7, 4, 2}; -WORD32 measurement_system_rms_b_tbl[] = {0, 0, 5, 0, 1, 3, 0, 6, 8, 7, 4, 2}; -WORD32 measurement_system_rms_c_tbl[] = {0, 0, 5, 0, 1, 3, 0, 6, 7, 8, 4, 2}; -WORD32 measurement_system_rms_d_tbl[] = {0, 0, 3, 0, 1, 7, 0, 4, 5, 6, 8, 2}; -WORD32 measurement_system_rms_e_tbl[] = {0, 0, 1, 0, 7, 5, 0, 2, 3, 4, 6, 8}; +const WORD32 measurement_system_default_tbl[] = {0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0}; +const WORD32 measurement_system_bs1770_3_tbl[] = {0, 0, 8, 0, 1, 3, + 0, 5, 6, 7, 4, 2}; +const WORD32 measurement_system_user_tbl[] = {0, 0, 1, 0, 8, 5, + 0, 2, 3, 4, 6, 7}; +const WORD32 measurement_system_expert_tbl[] = {0, 0, 3, 0, 1, 8, + 0, 4, 5, 6, 7, 2}; +const WORD32 measurement_system_rms_a_tbl[] = {0, 0, 5, 0, 1, 3, + 0, 8, 6, 7, 4, 2}; +const WORD32 measurement_system_rms_b_tbl[] = {0, 0, 5, 0, 1, 3, + 0, 6, 8, 7, 4, 2}; +const WORD32 measurement_system_rms_c_tbl[] = {0, 0, 5, 0, 1, 3, + 0, 6, 7, 8, 4, 2}; +const WORD32 measurement_system_rms_d_tbl[] = {0, 0, 3, 0, 1, 7, + 0, 4, 5, 6, 8, 2}; +const WORD32 measurement_system_rms_e_tbl[] = {0, 0, 1, 0, 7, 5, + 0, 2, 3, 4, 6, 8}; -WORD32 measurement_method_prog_loudness_tbl[] = {0, 0, 1, 0, 0, 0, - 0, 2, 3, 4, 0, 0}; -WORD32 measurement_method_peak_loudness_tbl[] = {0, 7, 0, 0, 0, 0, - 6, 5, 4, 3, 2, 1}; +const WORD32 measurement_method_prog_loudness_tbl[] = {0, 0, 1, 0, 0, 0, + 0, 2, 3, 4, 0, 0}; +const WORD32 measurement_method_peak_loudness_tbl[] = {0, 7, 0, 0, 0, 0, + 6, 5, 4, 3, 2, 1}; const ia_loc_sys_interface_struct loc_sys_interface[] = { {0, 1, {0, 0, 0}, 0, 0}, {0, 1, {2, 0, 0}, 0, 0}, @@ -335,7 +344,7 @@ const ia_loc_drc_parameter_interface_struct loc_drc_parameter_interface[] = { {1.0f, 1.0f, 0}, {1.0f, 1.0f, 0}, }; -FLOAT32 f_bands_nrm_QMF71[71] = { +const FLOAT32 f_bands_nrm_QMF71[71] = { 0.004583300000000f, 0.000833330000000f, 0.002083300000000f, 0.005875000000000f, 0.009791700000000f, 0.014292000000000f, 0.019792000000000f, 0.027000000000000f, 0.035417000000000f, @@ -361,7 +370,7 @@ FLOAT32 f_bands_nrm_QMF71[71] = { 0.931750000000000f, 0.947370000000000f, 0.963000000000000f, 0.974540000000000f, 0.999040000000000f}; -FLOAT32 f_bands_nrm_QMF64[64] = { +const FLOAT32 f_bands_nrm_QMF64[64] = { 0.0078125000000000f, 0.0234380000000000f, 0.0390620000000000f, 0.0546880000000000f, 0.0703120000000000f, 0.0859380000000000f, 0.1015600000000000f, 0.1171900000000000f, 0.1328100000000000f, @@ -385,7 +394,7 @@ FLOAT32 f_bands_nrm_QMF64[64] = { 0.9453100000000000f, 0.9609400000000000f, 0.9765600000000000f, 0.9921900000000000f}; -FLOAT32 f_bands_nrm_STFT256[257] = { +const FLOAT32 f_bands_nrm_STFT256[257] = { 0.000000000000000f, 0.003906250000000f, 0.007812500000000f, 0.011718750000000f, 0.015625000000000f, 0.019531250000000f, 0.023437500000000f, 0.027343750000000f, 0.031250000000000f, @@ -473,646 +482,646 @@ FLOAT32 f_bands_nrm_STFT256[257] = { 0.984375000000000f, 0.988281250000000f, 0.992187500000000f, 0.996093750000000f, 1.000000000000000f}; -FLOAT64 qmf_filter_coeff[640] = {0, - -0.00055252865047, - -0.00056176925738, - -0.00049475180896, - -0.00048752279712, - -0.00048937912498, - -0.00050407143497, - -0.00052265642972, - -0.00054665656337, - -0.00056778025613, - -0.00058709304852, - -0.00061327473938, - -0.00063124935319, - -0.00065403333621, - -0.00067776907764, - -0.00069416146273, - -0.00071577364744, - -0.00072550431222, - -0.00074409418541, - -0.00074905980532, - -0.00076813719270, - -0.00077248485949, - -0.00078343322877, - -0.00077798694927, - -0.00078036647100, - -0.00078014496257, - -0.00077579773310, - -0.00076307935757, - -0.00075300014201, - -0.00073193571525, - -0.00072153919876, - -0.00069179375372, - -0.00066504150893, - -0.00063415949025, - -0.00059461189330, - -0.00055645763906, - -0.00051455722108, - -0.00046063254803, - -0.00040951214522, - -0.00035011758756, - -0.00028969811748, - -0.00020983373440, - -0.00014463809349, - -0.00006173344072, - 0.00001349497418, - 0.00010943831274, - 0.00020430170688, - 0.00029495311041, - 0.00040265402160, - 0.00051073884952, - 0.00062393761391, - 0.00074580258865, - 0.00086084433262, - 0.00098859883015, - 0.00112501551307, - 0.00125778846475, - 0.00139024948272, - 0.00154432198471, - 0.00168680832531, - 0.00183482654224, - 0.00198411407369, - 0.00214615835557, - 0.00230172547746, - 0.00246256169126, - 0.00262017586902, - 0.00278704643465, - 0.00294694477165, - 0.00311254206525, - 0.00327396134847, - 0.00344188741828, - 0.00360082681231, - 0.00376039229104, - 0.00392074323703, - 0.00408197531935, - 0.00422642692270, - 0.00437307196781, - 0.00452098527825, - 0.00466064606118, - 0.00479325608498, - 0.00491376035745, - 0.00503930226013, - 0.00514073539032, - 0.00524611661324, - 0.00534716811982, - 0.00541967759307, - 0.00548760401507, - 0.00554757145088, - 0.00559380230045, - 0.00562206432097, - 0.00564551969164, - 0.00563891995151, - 0.00562661141932, - 0.00559171286630, - 0.00554043639400, - 0.00547537830770, - 0.00538389758970, - 0.00527157587272, - 0.00513822754514, - 0.00498396877629, - 0.00481094690600, - 0.00460395301471, - 0.00438018617447, - 0.00412516423270, - 0.00384564081246, - 0.00354012465507, - 0.00320918858098, - 0.00284467578623, - 0.00245085400321, - 0.00202741761850, - 0.00157846825768, - 0.00109023290512, - 0.00058322642480, - 0.00002760451905, - -0.00054642808664, - -0.00115681355227, - -0.00180394725893, - -0.00248267236449, - -0.00319337783900, - -0.00394011240522, - -0.00472225962400, - -0.00553372111088, - -0.00637922932685, - -0.00726158168517, - -0.00817982333726, - -0.00913253296085, - -0.01011502154986, - -0.01113155480321, - -0.01218499959508, - 0.01327182200351, - 0.01439046660792, - 0.01554055533423, - 0.01673247129989, - 0.01794333813443, - 0.01918724313698, - 0.02045317933555, - 0.02174675502535, - 0.02306801692862, - 0.02441609920285, - 0.02578758475467, - 0.02718594296329, - 0.02860721736385, - 0.03005026574279, - 0.03150176087389, - 0.03297540810337, - 0.03446209487686, - 0.03596975605542, - 0.03748128504252, - 0.03900536794745, - 0.04053491705584, - 0.04206490946367, - 0.04360975421304, - 0.04514884056413, - 0.04668430272642, - 0.04821657200672, - 0.04973857556014, - 0.05125561555216, - 0.05276307465207, - 0.05424527683589, - 0.05571736482138, - 0.05716164501299, - 0.05859156836260, - 0.05998374801761, - 0.06134551717207, - 0.06268578081172, - 0.06397158980681, - 0.06522471064380, - 0.06643675122104, - 0.06760759851228, - 0.06870438283512, - 0.06976302447127, - 0.07076287107266, - 0.07170026731102, - 0.07256825833083, - 0.07336202550803, - 0.07410036424342, - 0.07474525581194, - 0.07531373362019, - 0.07580083586584, - 0.07619924793396, - 0.07649921704119, - 0.07670934904245, - 0.07681739756964, - 0.07682300113923, - 0.07672049241746, - 0.07650507183194, - 0.07617483218536, - 0.07573057565061, - 0.07515762552870, - 0.07446643947564, - 0.07364060057620, - 0.07267746427299, - 0.07158263647903, - 0.07035330735093, - 0.06896640131951, - 0.06745250215166, - 0.06576906686508, - 0.06394448059633, - 0.06196027790387, - 0.05981665708090, - 0.05751526919867, - 0.05504600343009, - 0.05240938217366, - 0.04959786763445, - 0.04663033051701, - 0.04347687821958, - 0.04014582784127, - 0.03664181168133, - 0.03295839306691, - 0.02908240060125, - 0.02503075618909, - 0.02079970728622, - 0.01637012582228, - 0.01176238327857, - 0.00696368621617, - 0.00197656014503, - -0.00320868968304, - -0.00857117491366, - -0.01412888273558, - -0.01988341292573, - -0.02582272888064, - -0.03195312745332, - -0.03827765720822, - -0.04478068215856, - -0.05148041767934, - -0.05837053268336, - -0.06544098531359, - -0.07269433008129, - -0.08013729344279, - -0.08775475365593, - -0.09555333528914, - -0.10353295311463, - -0.11168269317730, - -0.12000779846800, - -0.12850028503878, - -0.13715517611934, - -0.14597664911870, - -0.15496070710605, - -0.16409588556669, - -0.17338081721706, - -0.18281725485142, - -0.19239667457267, - -0.20212501768103, - -0.21197358538056, - -0.22196526964149, - -0.23206908706791, - -0.24230168845974, - -0.25264803095722, - -0.26310532994603, - -0.27366340405625, - -0.28432141891085, - -0.29507167170646, - -0.30590985751916, - -0.31682789136456, - -0.32781137272105, - -0.33887226938665, - -0.34999141229310, - 0.36115899031355, - 0.37237955463061, - 0.38363500139043, - 0.39492117615675, - 0.40623176767625, - 0.41756968968409, - 0.42891199207373, - 0.44025537543665, - 0.45159965356824, - 0.46293080852757, - 0.47424532146115, - 0.48552530911099, - 0.49677082545707, - 0.50798175000434, - 0.51912349702391, - 0.53022408956855, - 0.54125534487322, - 0.55220512585061, - 0.56307891401370, - 0.57385241316923, - 0.58454032354679, - 0.59511230862496, - 0.60557835389180, - 0.61591099320291, - 0.62612426956055, - 0.63619801077286, - 0.64612696959461, - 0.65590163024671, - 0.66551398801627, - 0.67496631901712, - 0.68423532934598, - 0.69332823767032, - 0.70223887193539, - 0.71094104263095, - 0.71944626349561, - 0.72774489002994, - 0.73582117582769, - 0.74368278636488, - 0.75131374561237, - 0.75870807608242, - 0.76586748650939, - 0.77277808813327, - 0.77942875190216, - 0.78583531203920, - 0.79197358416424, - 0.79784664137700, - 0.80344857518505, - 0.80876950044491, - 0.81381912706217, - 0.81857760046468, - 0.82304198905409, - 0.82722753473360, - 0.83110384571520, - 0.83469373618402, - 0.83797173378865, - 0.84095413924722, - 0.84362382812005, - 0.84598184698206, - 0.84803157770763, - 0.84978051984268, - 0.85119715249343, - 0.85230470352147, - 0.85310209497017, - 0.85357205739107, - 0.85373856005937, - 0.85357205739107, - 0.85310209497017, - 0.85230470352147, - 0.85119715249343, - 0.84978051984268, - 0.84803157770763, - 0.84598184698206, - 0.84362382812005, - 0.84095413924722, - 0.83797173378865, - 0.83469373618402, - 0.83110384571520, - 0.82722753473360, - 0.82304198905409, - 0.81857760046468, - 0.81381912706217, - 0.80876950044491, - 0.80344857518505, - 0.79784664137700, - 0.79197358416424, - 0.78583531203920, - 0.77942875190216, - 0.77277808813327, - 0.76586748650939, - 0.75870807608242, - 0.75131374561237, - 0.74368278636488, - 0.73582117582769, - 0.72774489002994, - 0.71944626349561, - 0.71094104263095, - 0.70223887193539, - 0.69332823767032, - 0.68423532934598, - 0.67496631901712, - 0.66551398801627, - 0.65590163024671, - 0.64612696959461, - 0.63619801077286, - 0.62612426956055, - 0.61591099320291, - 0.60557835389180, - 0.59511230862496, - 0.58454032354679, - 0.57385241316923, - 0.56307891401370, - 0.55220512585061, - 0.54125534487322, - 0.53022408956855, - 0.51912349702391, - 0.50798175000434, - 0.49677082545707, - 0.48552530911099, - 0.47424532146115, - 0.46293080852757, - 0.45159965356824, - 0.44025537543665, - 0.42891199207373, - 0.41756968968409, - 0.40623176767625, - 0.39492117615675, - 0.38363500139043, - 0.37237955463061, - -0.36115899031355, - -0.34999141229310, - -0.33887226938665, - -0.32781137272105, - -0.31682789136456, - -0.30590985751916, - -0.29507167170646, - -0.28432141891085, - -0.27366340405625, - -0.26310532994603, - -0.25264803095722, - -0.24230168845974, - -0.23206908706791, - -0.22196526964149, - -0.21197358538056, - -0.20212501768103, - -0.19239667457267, - -0.18281725485142, - -0.17338081721706, - -0.16409588556669, - -0.15496070710605, - -0.14597664911870, - -0.13715517611934, - -0.12850028503878, - -0.12000779846800, - -0.11168269317730, - -0.10353295311463, - -0.09555333528914, - -0.08775475365593, - -0.08013729344279, - -0.07269433008129, - -0.06544098531359, - -0.05837053268336, - -0.05148041767934, - -0.04478068215856, - -0.03827765720822, - -0.03195312745332, - -0.02582272888064, - -0.01988341292573, - -0.01412888273558, - -0.00857117491366, - -0.00320868968304, - 0.00197656014503, - 0.00696368621617, - 0.01176238327857, - 0.01637012582228, - 0.02079970728622, - 0.02503075618909, - 0.02908240060125, - 0.03295839306691, - 0.03664181168133, - 0.04014582784127, - 0.04347687821958, - 0.04663033051701, - 0.04959786763445, - 0.05240938217366, - 0.05504600343009, - 0.05751526919867, - 0.05981665708090, - 0.06196027790387, - 0.06394448059633, - 0.06576906686508, - 0.06745250215166, - 0.06896640131951, - 0.07035330735093, - 0.07158263647903, - 0.07267746427299, - 0.07364060057620, - 0.07446643947564, - 0.07515762552870, - 0.07573057565061, - 0.07617483218536, - 0.07650507183194, - 0.07672049241746, - 0.07682300113923, - 0.07681739756964, - 0.07670934904245, - 0.07649921704119, - 0.07619924793396, - 0.07580083586584, - 0.07531373362019, - 0.07474525581194, - 0.07410036424342, - 0.07336202550803, - 0.07256825833083, - 0.07170026731102, - 0.07076287107266, - 0.06976302447127, - 0.06870438283512, - 0.06760759851228, - 0.06643675122104, - 0.06522471064380, - 0.06397158980681, - 0.06268578081172, - 0.06134551717207, - 0.05998374801761, - 0.05859156836260, - 0.05716164501299, - 0.05571736482138, - 0.05424527683589, - 0.05276307465207, - 0.05125561555216, - 0.04973857556014, - 0.04821657200672, - 0.04668430272642, - 0.04514884056413, - 0.04360975421304, - 0.04206490946367, - 0.04053491705584, - 0.03900536794745, - 0.03748128504252, - 0.03596975605542, - 0.03446209487686, - 0.03297540810337, - 0.03150176087389, - 0.03005026574279, - 0.02860721736385, - 0.02718594296329, - 0.02578758475467, - 0.02441609920285, - 0.02306801692862, - 0.02174675502535, - 0.02045317933555, - 0.01918724313698, - 0.01794333813443, - 0.01673247129989, - 0.01554055533423, - 0.01439046660792, - -0.01327182200351, - -0.01218499959508, - -0.01113155480321, - -0.01011502154986, - -0.00913253296085, - -0.00817982333726, - -0.00726158168517, - -0.00637922932685, - -0.00553372111088, - -0.00472225962400, - -0.00394011240522, - -0.00319337783900, - -0.00248267236449, - -0.00180394725893, - -0.00115681355227, - -0.00054642808664, - 0.00002760451905, - 0.00058322642480, - 0.00109023290512, - 0.00157846825768, - 0.00202741761850, - 0.00245085400321, - 0.00284467578623, - 0.00320918858098, - 0.00354012465507, - 0.00384564081246, - 0.00412516423270, - 0.00438018617447, - 0.00460395301471, - 0.00481094690600, - 0.00498396877629, - 0.00513822754514, - 0.00527157587272, - 0.00538389758970, - 0.00547537830770, - 0.00554043639400, - 0.00559171286630, - 0.00562661141932, - 0.00563891995151, - 0.00564551969164, - 0.00562206432097, - 0.00559380230045, - 0.00554757145088, - 0.00548760401507, - 0.00541967759307, - 0.00534716811982, - 0.00524611661324, - 0.00514073539032, - 0.00503930226013, - 0.00491376035745, - 0.00479325608498, - 0.00466064606118, - 0.00452098527825, - 0.00437307196781, - 0.00422642692270, - 0.00408197531935, - 0.00392074323703, - 0.00376039229104, - 0.00360082681231, - 0.00344188741828, - 0.00327396134847, - 0.00311254206525, - 0.00294694477165, - 0.00278704643465, - 0.00262017586902, - 0.00246256169126, - 0.00230172547746, - 0.00214615835557, - 0.00198411407369, - 0.00183482654224, - 0.00168680832531, - 0.00154432198471, - 0.00139024948272, - 0.00125778846475, - 0.00112501551307, - 0.00098859883015, - 0.00086084433262, - 0.00074580258865, - 0.00062393761391, - 0.00051073884952, - 0.00040265402160, - 0.00029495311041, - 0.00020430170688, - 0.00010943831274, - 0.00001349497418, - -0.00006173344072, - -0.00014463809349, - -0.00020983373440, - -0.00028969811748, - -0.00035011758756, - -0.00040951214522, - -0.00046063254803, - -0.00051455722108, - -0.00055645763906, - -0.00059461189330, - -0.00063415949025, - -0.00066504150893, - -0.00069179375372, - -0.00072153919876, - -0.00073193571525, - -0.00075300014201, - -0.00076307935757, - -0.00077579773310, - -0.00078014496257, - -0.00078036647100, - -0.00077798694927, - -0.00078343322877, - -0.00077248485949, - -0.00076813719270, - -0.00074905980532, - -0.00074409418541, - -0.00072550431222, - -0.00071577364744, - -0.00069416146273, - -0.00067776907764, - -0.00065403333621, - -0.00063124935319, - -0.00061327473938, - -0.00058709304852, - -0.00056778025613, - -0.00054665656337, - -0.00052265642972, - -0.00050407143497, - -0.00048937912498, - -0.00048752279712, - -0.00049475180896, - -0.00056176925738, - -0.00055252865047}; +const FLOAT64 qmf_filter_coeff[640] = {0, + -0.00055252865047, + -0.00056176925738, + -0.00049475180896, + -0.00048752279712, + -0.00048937912498, + -0.00050407143497, + -0.00052265642972, + -0.00054665656337, + -0.00056778025613, + -0.00058709304852, + -0.00061327473938, + -0.00063124935319, + -0.00065403333621, + -0.00067776907764, + -0.00069416146273, + -0.00071577364744, + -0.00072550431222, + -0.00074409418541, + -0.00074905980532, + -0.00076813719270, + -0.00077248485949, + -0.00078343322877, + -0.00077798694927, + -0.00078036647100, + -0.00078014496257, + -0.00077579773310, + -0.00076307935757, + -0.00075300014201, + -0.00073193571525, + -0.00072153919876, + -0.00069179375372, + -0.00066504150893, + -0.00063415949025, + -0.00059461189330, + -0.00055645763906, + -0.00051455722108, + -0.00046063254803, + -0.00040951214522, + -0.00035011758756, + -0.00028969811748, + -0.00020983373440, + -0.00014463809349, + -0.00006173344072, + 0.00001349497418, + 0.00010943831274, + 0.00020430170688, + 0.00029495311041, + 0.00040265402160, + 0.00051073884952, + 0.00062393761391, + 0.00074580258865, + 0.00086084433262, + 0.00098859883015, + 0.00112501551307, + 0.00125778846475, + 0.00139024948272, + 0.00154432198471, + 0.00168680832531, + 0.00183482654224, + 0.00198411407369, + 0.00214615835557, + 0.00230172547746, + 0.00246256169126, + 0.00262017586902, + 0.00278704643465, + 0.00294694477165, + 0.00311254206525, + 0.00327396134847, + 0.00344188741828, + 0.00360082681231, + 0.00376039229104, + 0.00392074323703, + 0.00408197531935, + 0.00422642692270, + 0.00437307196781, + 0.00452098527825, + 0.00466064606118, + 0.00479325608498, + 0.00491376035745, + 0.00503930226013, + 0.00514073539032, + 0.00524611661324, + 0.00534716811982, + 0.00541967759307, + 0.00548760401507, + 0.00554757145088, + 0.00559380230045, + 0.00562206432097, + 0.00564551969164, + 0.00563891995151, + 0.00562661141932, + 0.00559171286630, + 0.00554043639400, + 0.00547537830770, + 0.00538389758970, + 0.00527157587272, + 0.00513822754514, + 0.00498396877629, + 0.00481094690600, + 0.00460395301471, + 0.00438018617447, + 0.00412516423270, + 0.00384564081246, + 0.00354012465507, + 0.00320918858098, + 0.00284467578623, + 0.00245085400321, + 0.00202741761850, + 0.00157846825768, + 0.00109023290512, + 0.00058322642480, + 0.00002760451905, + -0.00054642808664, + -0.00115681355227, + -0.00180394725893, + -0.00248267236449, + -0.00319337783900, + -0.00394011240522, + -0.00472225962400, + -0.00553372111088, + -0.00637922932685, + -0.00726158168517, + -0.00817982333726, + -0.00913253296085, + -0.01011502154986, + -0.01113155480321, + -0.01218499959508, + 0.01327182200351, + 0.01439046660792, + 0.01554055533423, + 0.01673247129989, + 0.01794333813443, + 0.01918724313698, + 0.02045317933555, + 0.02174675502535, + 0.02306801692862, + 0.02441609920285, + 0.02578758475467, + 0.02718594296329, + 0.02860721736385, + 0.03005026574279, + 0.03150176087389, + 0.03297540810337, + 0.03446209487686, + 0.03596975605542, + 0.03748128504252, + 0.03900536794745, + 0.04053491705584, + 0.04206490946367, + 0.04360975421304, + 0.04514884056413, + 0.04668430272642, + 0.04821657200672, + 0.04973857556014, + 0.05125561555216, + 0.05276307465207, + 0.05424527683589, + 0.05571736482138, + 0.05716164501299, + 0.05859156836260, + 0.05998374801761, + 0.06134551717207, + 0.06268578081172, + 0.06397158980681, + 0.06522471064380, + 0.06643675122104, + 0.06760759851228, + 0.06870438283512, + 0.06976302447127, + 0.07076287107266, + 0.07170026731102, + 0.07256825833083, + 0.07336202550803, + 0.07410036424342, + 0.07474525581194, + 0.07531373362019, + 0.07580083586584, + 0.07619924793396, + 0.07649921704119, + 0.07670934904245, + 0.07681739756964, + 0.07682300113923, + 0.07672049241746, + 0.07650507183194, + 0.07617483218536, + 0.07573057565061, + 0.07515762552870, + 0.07446643947564, + 0.07364060057620, + 0.07267746427299, + 0.07158263647903, + 0.07035330735093, + 0.06896640131951, + 0.06745250215166, + 0.06576906686508, + 0.06394448059633, + 0.06196027790387, + 0.05981665708090, + 0.05751526919867, + 0.05504600343009, + 0.05240938217366, + 0.04959786763445, + 0.04663033051701, + 0.04347687821958, + 0.04014582784127, + 0.03664181168133, + 0.03295839306691, + 0.02908240060125, + 0.02503075618909, + 0.02079970728622, + 0.01637012582228, + 0.01176238327857, + 0.00696368621617, + 0.00197656014503, + -0.00320868968304, + -0.00857117491366, + -0.01412888273558, + -0.01988341292573, + -0.02582272888064, + -0.03195312745332, + -0.03827765720822, + -0.04478068215856, + -0.05148041767934, + -0.05837053268336, + -0.06544098531359, + -0.07269433008129, + -0.08013729344279, + -0.08775475365593, + -0.09555333528914, + -0.10353295311463, + -0.11168269317730, + -0.12000779846800, + -0.12850028503878, + -0.13715517611934, + -0.14597664911870, + -0.15496070710605, + -0.16409588556669, + -0.17338081721706, + -0.18281725485142, + -0.19239667457267, + -0.20212501768103, + -0.21197358538056, + -0.22196526964149, + -0.23206908706791, + -0.24230168845974, + -0.25264803095722, + -0.26310532994603, + -0.27366340405625, + -0.28432141891085, + -0.29507167170646, + -0.30590985751916, + -0.31682789136456, + -0.32781137272105, + -0.33887226938665, + -0.34999141229310, + 0.36115899031355, + 0.37237955463061, + 0.38363500139043, + 0.39492117615675, + 0.40623176767625, + 0.41756968968409, + 0.42891199207373, + 0.44025537543665, + 0.45159965356824, + 0.46293080852757, + 0.47424532146115, + 0.48552530911099, + 0.49677082545707, + 0.50798175000434, + 0.51912349702391, + 0.53022408956855, + 0.54125534487322, + 0.55220512585061, + 0.56307891401370, + 0.57385241316923, + 0.58454032354679, + 0.59511230862496, + 0.60557835389180, + 0.61591099320291, + 0.62612426956055, + 0.63619801077286, + 0.64612696959461, + 0.65590163024671, + 0.66551398801627, + 0.67496631901712, + 0.68423532934598, + 0.69332823767032, + 0.70223887193539, + 0.71094104263095, + 0.71944626349561, + 0.72774489002994, + 0.73582117582769, + 0.74368278636488, + 0.75131374561237, + 0.75870807608242, + 0.76586748650939, + 0.77277808813327, + 0.77942875190216, + 0.78583531203920, + 0.79197358416424, + 0.79784664137700, + 0.80344857518505, + 0.80876950044491, + 0.81381912706217, + 0.81857760046468, + 0.82304198905409, + 0.82722753473360, + 0.83110384571520, + 0.83469373618402, + 0.83797173378865, + 0.84095413924722, + 0.84362382812005, + 0.84598184698206, + 0.84803157770763, + 0.84978051984268, + 0.85119715249343, + 0.85230470352147, + 0.85310209497017, + 0.85357205739107, + 0.85373856005937, + 0.85357205739107, + 0.85310209497017, + 0.85230470352147, + 0.85119715249343, + 0.84978051984268, + 0.84803157770763, + 0.84598184698206, + 0.84362382812005, + 0.84095413924722, + 0.83797173378865, + 0.83469373618402, + 0.83110384571520, + 0.82722753473360, + 0.82304198905409, + 0.81857760046468, + 0.81381912706217, + 0.80876950044491, + 0.80344857518505, + 0.79784664137700, + 0.79197358416424, + 0.78583531203920, + 0.77942875190216, + 0.77277808813327, + 0.76586748650939, + 0.75870807608242, + 0.75131374561237, + 0.74368278636488, + 0.73582117582769, + 0.72774489002994, + 0.71944626349561, + 0.71094104263095, + 0.70223887193539, + 0.69332823767032, + 0.68423532934598, + 0.67496631901712, + 0.66551398801627, + 0.65590163024671, + 0.64612696959461, + 0.63619801077286, + 0.62612426956055, + 0.61591099320291, + 0.60557835389180, + 0.59511230862496, + 0.58454032354679, + 0.57385241316923, + 0.56307891401370, + 0.55220512585061, + 0.54125534487322, + 0.53022408956855, + 0.51912349702391, + 0.50798175000434, + 0.49677082545707, + 0.48552530911099, + 0.47424532146115, + 0.46293080852757, + 0.45159965356824, + 0.44025537543665, + 0.42891199207373, + 0.41756968968409, + 0.40623176767625, + 0.39492117615675, + 0.38363500139043, + 0.37237955463061, + -0.36115899031355, + -0.34999141229310, + -0.33887226938665, + -0.32781137272105, + -0.31682789136456, + -0.30590985751916, + -0.29507167170646, + -0.28432141891085, + -0.27366340405625, + -0.26310532994603, + -0.25264803095722, + -0.24230168845974, + -0.23206908706791, + -0.22196526964149, + -0.21197358538056, + -0.20212501768103, + -0.19239667457267, + -0.18281725485142, + -0.17338081721706, + -0.16409588556669, + -0.15496070710605, + -0.14597664911870, + -0.13715517611934, + -0.12850028503878, + -0.12000779846800, + -0.11168269317730, + -0.10353295311463, + -0.09555333528914, + -0.08775475365593, + -0.08013729344279, + -0.07269433008129, + -0.06544098531359, + -0.05837053268336, + -0.05148041767934, + -0.04478068215856, + -0.03827765720822, + -0.03195312745332, + -0.02582272888064, + -0.01988341292573, + -0.01412888273558, + -0.00857117491366, + -0.00320868968304, + 0.00197656014503, + 0.00696368621617, + 0.01176238327857, + 0.01637012582228, + 0.02079970728622, + 0.02503075618909, + 0.02908240060125, + 0.03295839306691, + 0.03664181168133, + 0.04014582784127, + 0.04347687821958, + 0.04663033051701, + 0.04959786763445, + 0.05240938217366, + 0.05504600343009, + 0.05751526919867, + 0.05981665708090, + 0.06196027790387, + 0.06394448059633, + 0.06576906686508, + 0.06745250215166, + 0.06896640131951, + 0.07035330735093, + 0.07158263647903, + 0.07267746427299, + 0.07364060057620, + 0.07446643947564, + 0.07515762552870, + 0.07573057565061, + 0.07617483218536, + 0.07650507183194, + 0.07672049241746, + 0.07682300113923, + 0.07681739756964, + 0.07670934904245, + 0.07649921704119, + 0.07619924793396, + 0.07580083586584, + 0.07531373362019, + 0.07474525581194, + 0.07410036424342, + 0.07336202550803, + 0.07256825833083, + 0.07170026731102, + 0.07076287107266, + 0.06976302447127, + 0.06870438283512, + 0.06760759851228, + 0.06643675122104, + 0.06522471064380, + 0.06397158980681, + 0.06268578081172, + 0.06134551717207, + 0.05998374801761, + 0.05859156836260, + 0.05716164501299, + 0.05571736482138, + 0.05424527683589, + 0.05276307465207, + 0.05125561555216, + 0.04973857556014, + 0.04821657200672, + 0.04668430272642, + 0.04514884056413, + 0.04360975421304, + 0.04206490946367, + 0.04053491705584, + 0.03900536794745, + 0.03748128504252, + 0.03596975605542, + 0.03446209487686, + 0.03297540810337, + 0.03150176087389, + 0.03005026574279, + 0.02860721736385, + 0.02718594296329, + 0.02578758475467, + 0.02441609920285, + 0.02306801692862, + 0.02174675502535, + 0.02045317933555, + 0.01918724313698, + 0.01794333813443, + 0.01673247129989, + 0.01554055533423, + 0.01439046660792, + -0.01327182200351, + -0.01218499959508, + -0.01113155480321, + -0.01011502154986, + -0.00913253296085, + -0.00817982333726, + -0.00726158168517, + -0.00637922932685, + -0.00553372111088, + -0.00472225962400, + -0.00394011240522, + -0.00319337783900, + -0.00248267236449, + -0.00180394725893, + -0.00115681355227, + -0.00054642808664, + 0.00002760451905, + 0.00058322642480, + 0.00109023290512, + 0.00157846825768, + 0.00202741761850, + 0.00245085400321, + 0.00284467578623, + 0.00320918858098, + 0.00354012465507, + 0.00384564081246, + 0.00412516423270, + 0.00438018617447, + 0.00460395301471, + 0.00481094690600, + 0.00498396877629, + 0.00513822754514, + 0.00527157587272, + 0.00538389758970, + 0.00547537830770, + 0.00554043639400, + 0.00559171286630, + 0.00562661141932, + 0.00563891995151, + 0.00564551969164, + 0.00562206432097, + 0.00559380230045, + 0.00554757145088, + 0.00548760401507, + 0.00541967759307, + 0.00534716811982, + 0.00524611661324, + 0.00514073539032, + 0.00503930226013, + 0.00491376035745, + 0.00479325608498, + 0.00466064606118, + 0.00452098527825, + 0.00437307196781, + 0.00422642692270, + 0.00408197531935, + 0.00392074323703, + 0.00376039229104, + 0.00360082681231, + 0.00344188741828, + 0.00327396134847, + 0.00311254206525, + 0.00294694477165, + 0.00278704643465, + 0.00262017586902, + 0.00246256169126, + 0.00230172547746, + 0.00214615835557, + 0.00198411407369, + 0.00183482654224, + 0.00168680832531, + 0.00154432198471, + 0.00139024948272, + 0.00125778846475, + 0.00112501551307, + 0.00098859883015, + 0.00086084433262, + 0.00074580258865, + 0.00062393761391, + 0.00051073884952, + 0.00040265402160, + 0.00029495311041, + 0.00020430170688, + 0.00010943831274, + 0.00001349497418, + -0.00006173344072, + -0.00014463809349, + -0.00020983373440, + -0.00028969811748, + -0.00035011758756, + -0.00040951214522, + -0.00046063254803, + -0.00051455722108, + -0.00055645763906, + -0.00059461189330, + -0.00063415949025, + -0.00066504150893, + -0.00069179375372, + -0.00072153919876, + -0.00073193571525, + -0.00075300014201, + -0.00076307935757, + -0.00077579773310, + -0.00078014496257, + -0.00078036647100, + -0.00077798694927, + -0.00078343322877, + -0.00077248485949, + -0.00076813719270, + -0.00074905980532, + -0.00074409418541, + -0.00072550431222, + -0.00071577364744, + -0.00069416146273, + -0.00067776907764, + -0.00065403333621, + -0.00063124935319, + -0.00061327473938, + -0.00058709304852, + -0.00056778025613, + -0.00054665656337, + -0.00052265642972, + -0.00050407143497, + -0.00048937912498, + -0.00048752279712, + -0.00049475180896, + -0.00056176925738, + -0.00055252865047}; const ia_filter_bank_params_struct normal_cross_freq[FILTER_BANK_PARAMETER_COUNT] = { diff --git a/decoder/drc_src/impd_drc_rom.h b/decoder/drc_src/impd_drc_rom.h index 9add85d..d9432fd 100644 --- a/decoder/drc_src/impd_drc_rom.h +++ b/decoder/drc_src/impd_drc_rom.h @@ -66,20 +66,20 @@ extern const FLOAT32 dwnmix_coeff[]; extern const FLOAT32 dwnmix_coeff_lfe[]; -extern WORD32 drc_characteristic_order_default[][3]; +extern const WORD32 drc_characteristic_order_default[][3]; -extern WORD32 measurement_system_default_tbl[]; +extern const WORD32 measurement_system_default_tbl[]; -extern WORD32 measurement_system_bs1770_3_tbl[]; -extern WORD32 measurement_system_user_tbl[]; -extern WORD32 measurement_system_expert_tbl[]; -extern WORD32 measurement_system_rms_a_tbl[]; -extern WORD32 measurement_system_rms_b_tbl[]; -extern WORD32 measurement_system_rms_c_tbl[]; -extern WORD32 measurement_system_rms_d_tbl[]; -extern WORD32 measurement_system_rms_e_tbl[]; -extern WORD32 measurement_method_prog_loudness_tbl[]; -extern WORD32 measurement_method_peak_loudness_tbl[]; +extern const WORD32 measurement_system_bs1770_3_tbl[]; +extern const WORD32 measurement_system_user_tbl[]; +extern const WORD32 measurement_system_expert_tbl[]; +extern const WORD32 measurement_system_rms_a_tbl[]; +extern const WORD32 measurement_system_rms_b_tbl[]; +extern const WORD32 measurement_system_rms_c_tbl[]; +extern const WORD32 measurement_system_rms_d_tbl[]; +extern const WORD32 measurement_system_rms_e_tbl[]; +extern const WORD32 measurement_method_prog_loudness_tbl[]; +extern const WORD32 measurement_method_peak_loudness_tbl[]; #define MAX_NUM_DOWNMIX_ID_REQUESTS_LOCAL 3 @@ -151,11 +151,11 @@ typedef struct { extern const ia_loc_drc_parameter_interface_struct loc_drc_parameter_interface[]; -extern FLOAT32 f_bands_nrm_QMF71[71]; -extern FLOAT32 f_bands_nrm_QMF64[64]; -extern FLOAT32 f_bands_nrm_STFT256[257]; +extern const FLOAT32 f_bands_nrm_QMF71[71]; +extern const FLOAT32 f_bands_nrm_QMF64[64]; +extern const FLOAT32 f_bands_nrm_STFT256[257]; -FLOAT64 qmf_filter_coeff[640]; +extern const FLOAT64 qmf_filter_coeff[640]; extern const ia_filter_bank_params_struct normal_cross_freq[FILTER_BANK_PARAMETER_COUNT]; diff --git a/decoder/drc_src/impd_drc_sel_proc_drc_set_sel.h b/decoder/drc_src/impd_drc_sel_proc_drc_set_sel.h index 6c96751..0a83b74 100644 --- a/decoder/drc_src/impd_drc_sel_proc_drc_set_sel.h +++ b/decoder/drc_src/impd_drc_sel_proc_drc_set_sel.h @@ -167,8 +167,7 @@ impd_drc_sel_proc_init_sel_proc_params( ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct); -WORD32 -impd_drc_sel_proc_init_interface_params( +VOID impd_drc_sel_proc_init_interface_params( ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, ia_drc_interface_struct* pstr_drc_interface); diff --git a/decoder/drc_src/impd_drc_selection_process.c b/decoder/drc_src/impd_drc_selection_process.c index 57f8b9c..fa84ff1 100644 --- a/decoder/drc_src/impd_drc_selection_process.c +++ b/decoder/drc_src/impd_drc_selection_process.c @@ -59,9 +59,8 @@ WORD32 impd_drc_uni_selction_proc_init( pstr_drc_uni_sel_proc->eq_set_id_valid_flag[i] = 0; } } - err = impd_drc_sel_proc_init_interface_params(pstr_drc_uni_sel_proc, - pstr_drc_interface); - if (err) return (err); + impd_drc_sel_proc_init_interface_params(pstr_drc_uni_sel_proc, + pstr_drc_interface); pstr_drc_uni_sel_proc->subband_domain_mode = subband_domain_mode; @@ -129,7 +128,6 @@ impd_drc_uni_sel_proc_process( pstr_drc_uni_sel_proc->loudness_info_set_flag || pstr_drc_uni_sel_proc->sel_proc_request_flag) { WORD32 repeat_selection = 1; - WORD32 loop_cnt = 0; err = impd_manage_drc_complexity(pstr_drc_uni_sel_proc, pstr_drc_config); if (err) return (err); @@ -170,9 +168,10 @@ impd_drc_uni_sel_proc_process( for (i = SUB_DRC_COUNT - 1; i >= 0; i--) { WORD32 drc_instructions_index = pstr_drc_uni_sel_proc->drc_instructions_index[i]; + ia_drc_instructions_struct* str_drc_instruction_str; if (drc_instructions_index < 0) continue; - ia_drc_instructions_struct* str_drc_instruction_str = + str_drc_instruction_str = &(pstr_drc_uni_sel_proc->drc_config .str_drc_instruction_str[drc_instructions_index]); @@ -213,11 +212,6 @@ impd_drc_uni_sel_proc_process( err = impd_manage_complexity(pstr_drc_uni_sel_proc, pstr_drc_config, &repeat_selection); if (err) return (err); - - loop_cnt++; - if (loop_cnt > 100) { - return (UNEXPECTED_ERROR); - } } pstr_drc_uni_sel_proc->sel_proc_request_flag = 0; @@ -955,9 +949,10 @@ WORD32 impd_manage_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, } else { complexityPerCoeff = 2.0f; } - impd_find_downmix(pstr_drc_config, - uni_drc_sel_proc_output->active_downmix_id, - &dwnmix_instructions); + err = impd_find_downmix(pstr_drc_config, + uni_drc_sel_proc_output->active_downmix_id, + &dwnmix_instructions); + if (err) return (err); if (dwnmix_instructions->downmix_coefficients_present == 1) { for (i = 0; i < uni_drc_sel_proc_output->base_channel_count; i++) { for (j = 0; j < uni_drc_sel_proc_output->target_channel_count; j++) { 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 7e2bb62..b80d71f 100644 --- a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c +++ b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c @@ -31,7 +31,7 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" -static WORD32 effect_types_request_table[] = { +static const WORD32 effect_types_request_table[] = { EFFECT_BIT_NIGHT, EFFECT_BIT_NOISY, EFFECT_BIT_LIMITED, EFFECT_BIT_LOWLEVEL, EFFECT_BIT_DIALOG, EFFECT_BIT_GENERAL_COMPR, EFFECT_BIT_EXPAND, EFFECT_BIT_ARTISTIC}; @@ -673,9 +673,9 @@ WORD32 impd_match_drc_characteristic( WORD32 k, err; WORD32 match_found_flag = 0; - WORD32* drc_characteristic_order = + const WORD32* drc_characteristic_order = drc_characteristic_order_default[requested_drc_characteristic - 1]; - WORD32 drc_characteristic_order_count = + const WORD32 drc_characteristic_order_count = sizeof(drc_characteristic_order_default[requested_drc_characteristic]) / sizeof(WORD32); k = 0; @@ -786,14 +786,13 @@ WORD32 impd_drc_set_preselection( if (loudness_info_count > MAX_LOUDNESS_INFO_COUNT) return UNEXPECTED_ERROR; - err = impd_signal_peak_level_info( + impd_signal_peak_level_info( pstr_drc_config, pstr_loudness_info, str_drc_instruction_str, requested_dwnmix_id[d], pstr_drc_sel_proc_params_struct->album_mode, num_compression_eq_count, num_compression_eq_id, &peak_info_count, eq_set_id_Peak, signal_peak_level, explicit_peak_information_present); - if (err) return (err); for (l = 0; l < loudness_info_count; l++) { WORD32 match_found_flag = 0; @@ -899,17 +898,17 @@ WORD32 impd_drc_set_preselection( loudness_normalization_gain_db, loudness); if (err) return (err); - err = impd_signal_peak_level_info( + impd_signal_peak_level_info( pstr_drc_config, pstr_loudness_info, str_drc_instruction_str, requested_dwnmix_id[d], pstr_drc_sel_proc_params_struct->album_mode, num_compression_eq_count, num_compression_eq_id, &peak_info_count, eq_set_id_Peak, signal_peak_level, explicit_peak_information_present); - if (err) return (err); for (l = 0; l < loudness_info_count; l++) { WORD32 match_found_flag = 0; WORD32 p; + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; for (p = 0; p < peak_info_count; p++) { if (eq_set_id_Peak[p] == eq_set_id_loudness[l]) { if (eq_set_id_valid_flag[eq_set_id_Peak[p]] == 1) { @@ -924,7 +923,6 @@ WORD32 impd_drc_set_preselection( signal_peak_level[p] + loudness_normalization_gain_db[l] - pstr_drc_sel_proc_params_struct->output_peak_level_max); adjustment = min(adjustment, max(0.0f, loudness_deviation_max)); - if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; selection_candidate_info[k].loudness_norm_db_gain_adjusted = loudness_normalization_gain_db[l] - adjustment; @@ -967,11 +965,9 @@ WORD32 impd_drc_set_preselection( } } } + if (k > SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; *selection_candidate_count = k; - - if (*selection_candidate_count > SELECTION_CANDIDATE_COUNT_MAX) { - return UNEXPECTED_ERROR; - } else if (pstr_drc_sel_proc_params_struct->dynamic_range_control_on == 1) { + if (pstr_drc_sel_proc_params_struct->dynamic_range_control_on == 1) { n = 0; for (k = 0; k < *selection_candidate_count; k++) { str_drc_instruction_str = @@ -1129,10 +1125,11 @@ WORD32 impd_drc_set_final_selection( WORD32 eq_purpose_requested = pstr_drc_sel_proc_params_struct->eq_set_purpose_request; - impd_match_eq_set_purpose(pstr_drc_config, eq_purpose_requested, - eq_set_id_valid_flag, selection_candidate_count, - selection_candidate_info, - selection_candidate_info_step_2); + err = impd_match_eq_set_purpose( + pstr_drc_config, eq_purpose_requested, eq_set_id_valid_flag, + selection_candidate_count, selection_candidate_info, + selection_candidate_info_step_2); + if (err) return (err); } output_level_min = 10000.0f; @@ -1172,6 +1169,7 @@ WORD32 impd_drc_set_final_selection( if (pstr_drc_sel_proc_params_struct->requested_dwnmix_id [selection_candidate_info_step_2[i].downmix_id_request_index] == str_drc_instruction_str->downmix_id[n]) { + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); @@ -1529,11 +1527,12 @@ WORD32 impd_select_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, .drc_set_id; *eq_set_id_selected = selection_candidate_info[0].eq_set_id; - impd_select_loud_eq( + err = impd_select_loud_eq( pstr_drc_config, pstr_drc_sel_proc_params_struct->requested_dwnmix_id [selection_candidate_info[0].downmix_id_request_index], *drc_set_id_selected, *eq_set_id_selected, loud_eq_id_sel); + if (err) return (err); if (selection_candidate_count > 0) { pstr_drc_uni_sel_proc->uni_drc_sel_proc_output .loudness_normalization_gain_db = diff --git a/decoder/drc_src/impd_drc_selection_process_init.c b/decoder/drc_src/impd_drc_selection_process_init.c index 1cb234a..4a1ae63 100644 --- a/decoder/drc_src/impd_drc_selection_process_init.c +++ b/decoder/drc_src/impd_drc_selection_process_init.c @@ -127,8 +127,7 @@ impd_drc_sel_proc_init_sel_proc_params( return 0; } -WORD32 -impd_drc_sel_proc_init_interface_params( +VOID impd_drc_sel_proc_init_interface_params( ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, ia_drc_interface_struct* pstr_drc_interface) { WORD32 i, j; @@ -526,5 +525,5 @@ impd_drc_sel_proc_init_interface_params( } } - return 0; + return; } diff --git a/decoder/drc_src/impd_drc_shape_filter.c b/decoder/drc_src/impd_drc_shape_filter.c index ef16658..b8ca037 100644 --- a/decoder/drc_src/impd_drc_shape_filter.c +++ b/decoder/drc_src/impd_drc_shape_filter.c @@ -37,8 +37,8 @@ #include "impd_drc_gain_decoder.h" #include "impd_drc_rom.h" -WORD32 impd_shape_filt_block_adapt(const FLOAT32 drc_gain, - shape_filter_block* shape_filter_block) { +VOID impd_shape_filt_block_adapt(const FLOAT32 drc_gain, + shape_filter_block* shape_filter_block) { // WORD32 err = 0; WORD32 i; FLOAT32 warpedGain, x1, y1; @@ -99,10 +99,10 @@ WORD32 impd_shape_filt_block_adapt(const FLOAT32 drc_gain, shape_filter_block->shape_filter[i].a1 = y1; } } - return (0); + return; } -WORD32 resetshape_flter_block(shape_filter_block* shape_filter_block) { +VOID resetshape_flter_block(shape_filter_block* shape_filter_block) { WORD32 i, c; shape_filter_block->drc_gain_last = -1.0f; impd_shape_filt_block_adapt(1.0f, shape_filter_block); @@ -114,10 +114,10 @@ WORD32 resetshape_flter_block(shape_filter_block* shape_filter_block) { shape_filter_block->shape_filter[i].audio_out_state_2[c] = 0.0f; } } - return (0); + return; } -WORD32 impd_shape_filt_block_init( +VOID impd_shape_filt_block_init( ia_shape_filter_block_params_struct* shape_flter_block_params, shape_filter_block* shape_filter_block) { // WORD32 err = 0; @@ -235,13 +235,14 @@ WORD32 impd_shape_filt_block_init( } resetshape_flter_block(shape_filter_block); shape_filter_block->shape_flter_block_flag = 1; - return (0); + return; } -WORD32 impd_shape_filt_block_time_process( - shape_filter_block* shape_filter_block, FLOAT32* drc_gain, - const WORD32 channel, FLOAT32* audio_in, WORD32 start, WORD32 end) { - WORD32 i, j, err = 0; +VOID impd_shape_filt_block_time_process(shape_filter_block* shape_filter_block, + FLOAT32* drc_gain, const WORD32 channel, + FLOAT32* audio_in, WORD32 start, + WORD32 end) { + WORD32 i, j; FLOAT32 audio_out; if (shape_filter_block->shape_flter_block_flag) { @@ -303,5 +304,5 @@ WORD32 impd_shape_filt_block_time_process( } } - return err; + return; } diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c index 95f5aeb..6eb5a23 100644 --- a/decoder/drc_src/impd_drc_static_payload.c +++ b/decoder/drc_src/impd_drc_static_payload.c @@ -338,7 +338,7 @@ impd_parametric_drc_parse_gain_set_params( str_parametric_drc_gain_set_params->parametric_drc_id = (temp >> 3) & 0xf; str_parametric_drc_gain_set_params->side_chain_config_type = temp & 7; - if (str_parametric_drc_gain_set_params->side_chain_config_type) { + if (str_parametric_drc_gain_set_params->side_chain_config_type == 1) { temp = impd_read_bits_buf(it_bit_buff, 8); if (it_bit_buff->error) return it_bit_buff->error; @@ -443,9 +443,13 @@ static WORD32 impd_parametric_drc_gen_virtual_gain_sets( str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = 0; drc_config->drc_coefficients_drc_count += 1; } - str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = - str_p_loc_drc_coefficients_uni_drc->gain_set_count + - str_drc_coeff_param_drc->parametric_drc_gain_set_count; + { + WORD32 tmp = str_p_loc_drc_coefficients_uni_drc->gain_set_count + + str_drc_coeff_param_drc->parametric_drc_gain_set_count; + if (tmp > GAIN_SET_COUNT_MAX) return UNEXPECTED_ERROR; + str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = tmp; + } + for (i = str_p_loc_drc_coefficients_uni_drc->gain_set_count; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus; i++) { str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count = 1; @@ -518,9 +522,12 @@ static WORD32 impd_parametic_drc_parse_coeff( if (it_bit_buff->error) return it_bit_buff->error; str_drc_coeff_param_drc->drc_location = (temp >> 1) & 0xf; + if (str_drc_coeff_param_drc->drc_location < 1 || + str_drc_coeff_param_drc->drc_location > 4) + return UNEXPECTED_ERROR; str_drc_coeff_param_drc->parametric_drc_frame_size_format = temp & 1; - if (str_drc_coeff_param_drc->parametric_drc_frame_size) { + if (str_drc_coeff_param_drc->parametric_drc_frame_size_format) { code = impd_read_bits_buf(it_bit_buff, 15); if (it_bit_buff->error) return it_bit_buff->error; str_drc_coeff_param_drc->parametric_drc_frame_size = code + 1; @@ -532,6 +539,7 @@ static WORD32 impd_parametic_drc_parse_coeff( str_drc_coeff_param_drc->parametric_drc_delay_max_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; if (str_drc_coeff_param_drc->parametric_drc_delay_max_present) { temp = impd_read_bits_buf(it_bit_buff, 8); if (it_bit_buff->error) return it_bit_buff->error; @@ -723,6 +731,8 @@ WORD32 impd_parse_ch_layout(ia_bit_buf_struct* it_bit_buff, channel_layout->base_channel_count = impd_read_bits_buf(it_bit_buff, 7); if (it_bit_buff->error) return it_bit_buff->error; + if (channel_layout->base_channel_count > MAX_CHANNEL_COUNT) + return (UNEXPECTED_ERROR); if (ia_drc_params_struct->lfe_channel_map_count != -1 && channel_layout->base_channel_count != ia_drc_params_struct->lfe_channel_map_count) { @@ -767,6 +777,8 @@ impd_parse_dwnmix_instructions( dwnmix_instructions->downmix_id = (temp >> 16) & 0x7f; dwnmix_instructions->target_channel_count = (temp >> 9) & 0x7f; + if (dwnmix_instructions->target_channel_count > MAX_CHANNEL_COUNT) + return (UNEXPECTED_ERROR); dwnmix_instructions->target_layout = (temp >> 1) & 0xff; dwnmix_instructions->downmix_coefficients_present = temp & 1; @@ -1219,6 +1231,9 @@ impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, if (err) return (err); } + if ((drc_config->drc_instructions_uni_drc_count + + drc_config->dwnmix_instructions_count) >= DRC_INSTRUCTIONS_COUNT_MAX) + return (UNEXPECTED_ERROR); impd_drc_gen_instructions_for_drc_off(drc_config); return (0); } @@ -1440,13 +1455,15 @@ impd_dec_gain_modifiers(ia_bit_buf_struct* it_bit_buff, WORD32 version, } } if (band_count == 1) { + WORD32 tmp; pstr_gain_modifiers->shape_filter_flag = impd_read_bits_buf(it_bit_buff, 1); if (it_bit_buff->error) return it_bit_buff->error; if (pstr_gain_modifiers->shape_filter_flag) { - pstr_gain_modifiers->shape_filter_idx = - impd_read_bits_buf(it_bit_buff, 4); + tmp = impd_read_bits_buf(it_bit_buff, 4); if (it_bit_buff->error) return it_bit_buff->error; + if (tmp >= (SHAPE_FILTER_COUNT_MAX + 1)) return UNEXPECTED_ERROR; + pstr_gain_modifiers->shape_filter_idx = tmp; } } } else if (version == 0) { @@ -1663,6 +1680,9 @@ impd_drc_parse_coeff( drc_frame_size = impd_read_bits_buf(it_bit_buff, 15); if (it_bit_buff->error) return it_bit_buff->error; str_p_loc_drc_coefficients_uni_drc->drc_frame_size = drc_frame_size + 1; + if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size > + MAX_DRC_FRAME_SIZE) + return UNEXPECTED_ERROR; } str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; @@ -1695,12 +1715,14 @@ impd_drc_parse_coeff( ia_drc_params_struct->drc_frame_size / str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] .time_delt_min_val; - err = impd_init_tbls( - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] - .num_gain_max_values, - &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] - .str_tables)); - if (err) return (err); + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .num_gain_max_values > + (N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX / 2 - 1)) + return (UNEXPECTED_ERROR); + impd_init_tbls(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .num_gain_max_values, + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .str_tables)); } gain_sequence_count += str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; @@ -1871,12 +1893,14 @@ impd_drc_parse_coeff( ia_drc_params_struct->drc_frame_size / str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] .time_delt_min_val; - err = impd_init_tbls( - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] - .num_gain_max_values, - &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] - .str_tables)); - if (err) return (err); + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .num_gain_max_values > + (N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX / 2 - 1)) + return (UNEXPECTED_ERROR); + impd_init_tbls(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .num_gain_max_values, + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .str_tables)); } } @@ -2152,8 +2176,7 @@ impd_parse_drc_instructions_uni_drc( WORD32 bs_gain_set_idx; bs_gain_set_idx = impd_read_bits_buf(it_bit_buff, 6); if (it_bit_buff->error) return it_bit_buff->error; - if ((bs_gain_set_idx == 0) || (bs_gain_set_idx > GAIN_SET_COUNT_MAX)) - return UNEXPECTED_ERROR; + if (bs_gain_set_idx > GAIN_SET_COUNT_MAX) return UNEXPECTED_ERROR; str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; impd_dec_ducking_scaling( it_bit_buff, @@ -2257,6 +2280,7 @@ impd_parse_drc_instructions_uni_drc( (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) ? ducking_sequence : unique_idx[g]; + if (set < 0) return UNEXPECTED_ERROR; str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] .ducking_scaling = unique_scaling[g]; @@ -2305,8 +2329,7 @@ impd_parse_drc_instructions_uni_drc( bs_gain_set_idx = (temp >> 1) & 0x7f; repeat_gain_set_idx = temp & 1; - if ((bs_gain_set_idx == 0) || (bs_gain_set_idx > GAIN_SET_COUNT_MAX)) - return UNEXPECTED_ERROR; + if (bs_gain_set_idx > GAIN_SET_COUNT_MAX) return UNEXPECTED_ERROR; str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; c++; @@ -2368,6 +2391,7 @@ impd_parse_drc_instructions_uni_drc( WORD32 set, band_count; set = unique_idx[g]; + if (set < 0) return UNEXPECTED_ERROR; str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; if (str_p_loc_drc_coefficients_uni_drc != NULL && diff --git a/decoder/drc_src/impd_drc_tables.c b/decoder/drc_src/impd_drc_tables.c deleted file mode 100644 index b099b5e..0000000 --- a/decoder/drc_src/impd_drc_tables.c +++ /dev/null @@ -1,102 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#include <stdio.h> -#include <math.h> - -#include "impd_type_def.h" -#include "impd_drc_uni_tables.h" -#include "impd_drc_uni_common.h" -#include "impd_drc_struct.h" -#include "impd_drc_filter_bank.h" -#include "impd_drc_rom.h" - -WORD32 impd_init_tbls(const WORD32 num_gain_max_values, - ia_tables_struct* str_tables) { - impd_gen_delta_time_code_tbl(num_gain_max_values, - str_tables->delta_time_code_table); - return (0); -} - -void impd_get_slope_code_tbl_and_size( - ia_slope_code_table_struct const** slope_code_tbl_entry, - WORD32* num_slope_code_tbl_entries) { - *slope_code_tbl_entry = &(slopeCodeTableEntryBySize[0]); - *num_slope_code_tbl_entries = kNumSlopeValuesTable; -} - -void impd_get_delta_gain_code_tbl( - const WORD32 gain_coding_profile, - ia_delta_gain_code_table_struct const** delta_time_code_tbl, - WORD32* num_entries) { - if (gain_coding_profile == GAIN_CODING_PROFILE_CLIPPING) { - *delta_time_code_tbl = deltaGainCodeTableProfile2BySize; - *num_entries = kNumDeltaGainValuesTableProfile2; - } else { - *delta_time_code_tbl = deltaGainCodeTableBySize; - *num_entries = kNumDeltaGainValuesTable; - } -} - -void impd_gen_delta_time_code_tbl( - const WORD32 num_gain_max_values, - ia_delta_time_code_table_entry_struct* delta_time_code_tbl_item) { - WORD32 n, k; - - WORD32 Z = 1; - while ((1 << Z) < 2 * num_gain_max_values) { - Z++; - } - - delta_time_code_tbl_item[0].size = -1; - delta_time_code_tbl_item[0].code = -1; - delta_time_code_tbl_item[0].value = -1; - - delta_time_code_tbl_item[1].size = 2; - delta_time_code_tbl_item[1].code = 0x0; - delta_time_code_tbl_item[1].value = 1; - for (n = 0; n < 4; n++) { - delta_time_code_tbl_item[n + 2].size = 4; - delta_time_code_tbl_item[n + 2].code = 0x4 + n; - delta_time_code_tbl_item[n + 2].value = n + 2; - } - for (n = 0; n < 8; n++) { - delta_time_code_tbl_item[n + 6].size = 5; - delta_time_code_tbl_item[n + 6].code = 0x10 + n; - delta_time_code_tbl_item[n + 6].value = n + 6; - } - - k = 2 * num_gain_max_values - 14 + 1; - for (n = 0; n < k; n++) { - delta_time_code_tbl_item[n + 14].size = 2 + Z; - delta_time_code_tbl_item[n + 14].code = (0x3 << Z) + n; - delta_time_code_tbl_item[n + 14].value = n + 14; - } -} - -WORD32 -impd_get_delta_tmin(const WORD32 sampling_rate) { - WORD32 lowerBound = (WORD32)(0.5f + 0.0005f * sampling_rate); - WORD32 result = 1; - if (sampling_rate < 1000) { - return (UNEXPECTED_ERROR); - } - while (result <= lowerBound) result = result << 1; - return result; -} diff --git a/decoder/drc_src/impd_drc_uni_common.h b/decoder/drc_src/impd_drc_uni_common.h deleted file mode 100644 index f661405..0000000 --- a/decoder/drc_src/impd_drc_uni_common.h +++ /dev/null @@ -1,162 +0,0 @@ -/****************************************************************************** - * - * Copyright (C) 2015 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at: - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ***************************************************************************** - * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore -*/ -#ifndef IMPD_DRC_UNI_COMMON_H -#define IMPD_DRC_UNI_COMMON_H - -#ifdef __cplusplus -extern "C" { -#endif - -#define AMD1_SYNTAX 0 -#define MPEG_D_DRC_EXTENSION_V1 0 -#define AMD1_PARAMETRIC_LIMITER 0 - -#define MPEG_H_SYNTAX 0 - -#define EQ_IS_SUPPORTED 1 - -#define MEASURE_AVERAGE_BITRATE 0 -#define DEBUG_NODES 0 - -#define DRC_GAIN_DEBUG_FILE 0 -#define DEBUG_BITSTREAM 0 -#define DEBUG_DRC_SELECTION 0 -#define DEBUG_WARNINGS 0 -#define ENABLE_ADDITIONAL_TESTS 1 - -#define SPEAKER_POS_COUNT_MAX 128 -#define DOWNMIX_COEFF_COUNT_MAX 32 * 32 -#define MAX_CHANNEL_COUNT 128 -#define BAND_COUNT_MAX 8 -#define SEQUENCE_COUNT_MAX 24 -#define GAIN_SET_COUNT_MAX SEQUENCE_COUNT_MAX -#define MEASUREMENT_COUNT_MAX 16 -#define DOWNMIX_INSTRUCTION_COUNT_MAX 16 -#define DRC_COEFF_COUNT_MAX 8 -#define DRC_INSTRUCTIONS_COUNT_MAX (DOWNMIX_INSTRUCTION_COUNT_MAX + 20) -#define LOUDNESS_INFO_COUNT_MAX (DOWNMIX_INSTRUCTION_COUNT_MAX + 20) -#define AUDIO_CODEC_FRAME_SIZE_MAX 4096 -#define DRC_CODEC_FRAME_SIZE_MAX (AUDIO_CODEC_FRAME_SIZE_MAX / 8) -#define NODE_COUNT_MAX DRC_CODEC_FRAME_SIZE_MAX -#define CHANNEL_GROUP_COUNT_MAX SEQUENCE_COUNT_MAX -#define SUB_DRC_COUNT 4 -#define SEL_DRC_COUNT 3 -#define DOWNMIX_ID_COUNT_MAX 8 -#define MAX_SIGNAL_DELAY 4500 - -#define DELAY_MODE_REGULAR_DELAY 0 -#define DELAY_MODE_LOW_DELAY 1 -#define DELAY_MODE_DEFAULT DELAY_MODE_REGULAR_DELAY - -#define FEATURE_REQUEST_COUNT_MAX 10 -#define EFFECT_TYPE_REQUEST_COUNT_MAX 10 - -#define SELECTION_CANDIDATE_COUNT_MAX 32 - -#define PROC_COMPLETE 1 -#define UNEXPECTED_ERROR 2 -#define PARAM_ERROR 3 -#define EXTERNAL_ERROR 4 -#define ERRORHANDLING 5 -#define BITSTREAM_ERROR 6 - -#define UNDEFINED_LOUDNESS_VALUE 1000.0f -#define ID_FOR_BASE_LAYOUT 0x0 -#define ID_FOR_ANY_DOWNMIX 0x7F -#define ID_FOR_NO_DRC 0x0 -#define ID_FOR_ANY_DRC 0x3F -#define ID_FOR_ANY_EQ 0x3F - -#define LOCATION_MP4_INSTREAM_UNIDRC 0x1 -#define LOCATION_MP4_DYN_RANGE_INFO 0x2 -#define LOCATION_MP4_COMPRESSION_VALUE 0x3 -#define LOCATION_SELECTED LOCATION_MP4_INSTREAM_UNIDRC - -#define AUDIO_CODEC_SUBBAND_COUNT_MAX 256 - -#define SUBBAND_DOMAIN_MODE_OFF 0 -#define SUBBAND_DOMAIN_MODE_QMF64 1 -#define SUBBAND_DOMAIN_MODE_QMF71 2 -#define SUBBAND_DOMAIN_MODE_STFT256 3 - -#define AUDIO_CODEC_SUBBAND_COUNT_QMF64 64 -#define AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64 64 -#define AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF64 320 - -#define AUDIO_CODEC_SUBBAND_COUNT_QMF71 71 -#define AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71 64 -#define AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_QMF71 320 + 384 - -#define AUDIO_CODEC_SUBBAND_COUNT_STFT256 256 -#define AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256 256 -#define AUDIO_CODEC_SUBBAND_ANALYSE_DELAY_STFT256 256 - -#define MAX_NUM_DOWNMIX_ID_REQUESTS 15 -#define MAX_NUM_DRC_FEATURE_REQUESTS 7 -#define MAX_NUM_DRC_EFFECT_TYPE_REQUESTS 15 -#define MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE 256 - -#define EXT_COUNT_MAX 2 -#define UNIDRCGAINEXT_TERM 0x0 -#define UNIDRCLOUDEXT_TERM 0x0 -#define UNIDRCCONFEXT_TERM 0x0 -#define UNIDRCINTERFACEEXT_TERM 0x0 - -#define MAXPACKETLOSSTIME 2.5f - -#define SLOPE_FACTOR_DB_TO_LINEAR 0.1151f - -#ifndef min -#define min(a, b) ((a) < (b) ? (a) : (b)) -#endif -#ifndef max -#define max(a, b) ((a) > (b) ? (a) : (b)) -#endif - -#ifndef bool -#define bool WORD32 -#endif - -typedef struct ia_drc_sel_proc_output_struct { - FLOAT32 output_peak_level_db; - FLOAT32 loudness_normalization_gain_db; - FLOAT32 output_loudness; - - WORD32 sel_drc_set_ids[SUB_DRC_COUNT]; - WORD32 sel_downmix_ids[SUB_DRC_COUNT]; - WORD32 num_sel_drc_sets; - - WORD32 active_downmix_id; - WORD32 base_channel_count; - WORD32 target_channel_count; - WORD32 target_layout; - WORD32 downmix_matrix_present; - FLOAT32 downmix_matrix[MAX_CHANNEL_COUNT][MAX_CHANNEL_COUNT]; - - FLOAT32 boost; - FLOAT32 compress; - WORD32 drc_characteristic_target; - -} ia_drc_sel_proc_output_struct; - -#ifdef __cplusplus -} -#endif -#endif diff --git a/decoder/drc_src/impd_parametric_drc_dec.h b/decoder/drc_src/impd_parametric_drc_dec.h index 6829246..d4ca172 100644 --- a/decoder/drc_src/impd_parametric_drc_dec.h +++ b/decoder/drc_src/impd_parametric_drc_dec.h @@ -179,12 +179,11 @@ impd_parametric_ffwd_type_drc_process(FLOAT32* audio_in_out_buf[], pstr_parametric_ffwd_type_drc_params, ia_spline_nodes_struct* str_spline_nodes); -WORD32 -impd_parametric_lim_type_drc_process(FLOAT32* audio_in_out_buf[], - FLOAT32 loudness_normalization_gain_db, - ia_parametric_drc_type_lim_params_struct* - pstr_parametric_lim_type_drc_params, - FLOAT32* lpcm_gains); +VOID impd_parametric_lim_type_drc_process( + FLOAT32* audio_in_out_buf[], FLOAT32 loudness_normalization_gain_db, + ia_parametric_drc_type_lim_params_struct* + pstr_parametric_lim_type_drc_params, + FLOAT32* lpcm_gains); #ifdef __cplusplus } diff --git a/decoder/generic/ixheaacd_function_selector_generic.c b/decoder/generic/ixheaacd_function_selector_generic.c index 08aac1b..b6c34a5 100644 --- a/decoder/generic/ixheaacd_function_selector_generic.c +++ b/decoder/generic/ixheaacd_function_selector_generic.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_sbrdecsettings.h" @@ -37,7 +37,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_pulsedata.h" @@ -53,7 +53,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_block.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -199,11 +199,11 @@ VOID(*ixheaacd_mps_complex_fft_64) WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; VOID(*ixheaacd_calc_pre_twid) @@ -215,8 +215,9 @@ VOID(*ixheaacd_calc_post_twid) const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; +(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; VOID(*ixheaacd_mps_synt_out_calc) (WORD32 resolution, WORD32 *out, WORD32 *state, @@ -249,4 +250,3 @@ VOID(*ixheaacd_scale_factor_process) WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec; #endif - diff --git a/decoder/generic/ixheaacd_qmf_dec_generic.c b/decoder/generic/ixheaacd_qmf_dec_generic.c index 4b5120f..85e7a5b 100644 --- a/decoder/generic/ixheaacd_qmf_dec_generic.c +++ b/decoder/generic/ixheaacd_qmf_dec_generic.c @@ -20,7 +20,7 @@ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" @@ -41,7 +41,7 @@ #include "ixheaacd_env_extr.h" #include "ixheaacd_qmf_dec.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_env_calc.h" #include "ixheaacd_interface.h" diff --git a/decoder/ixheaacd_Windowing.c b/decoder/ixheaacd_Windowing.c index 41450a3..bf384b4 100644 --- a/decoder/ixheaacd_Windowing.c +++ b/decoder/ixheaacd_Windowing.c @@ -20,9 +20,9 @@ #include "ixheaacd_cnst.h" #include "ixheaacd_constants.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_type_def.h" +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_windows.h" diff --git a/decoder/ixheaacd_aac_config.h b/decoder/ixheaacd_aac_config.h index bfe7a39..c57db29 100644 --- a/decoder/ixheaacd_aac_config.h +++ b/decoder/ixheaacd_aac_config.h @@ -60,5 +60,6 @@ #define IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF 0x0023 #define IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE 0x0024 #define IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS 0x0025 +#define IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES 0x0026 #endif /* IXHEAACD_AAC_CONFIG_H */ diff --git a/decoder/ixheaacd_aac_imdct.c b/decoder/ixheaacd_aac_imdct.c index 88b23eb..43f2025 100644 --- a/decoder/ixheaacd_aac_imdct.c +++ b/decoder/ixheaacd_aac_imdct.c @@ -18,22 +18,22 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_intrinsics.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_function_selector.h" #include "ixheaacd_audioobjtypes.h" @@ -2008,14 +2008,14 @@ VOID ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, x_h2_0 = x[h2]; x_h2_1 = x[h2 + 1]; - xh0_0 = x_0 + x_l1_0; - xh1_0 = x_1 + x_l1_1; - xl0_0 = x_0 - x_l1_0; - xl1_0 = x_1 - x_l1_1; - xh20_0 = x_h2_0 + x_l2_0; - xh21_0 = x_h2_1 + x_l2_1; - xl20_0 = x_h2_0 - x_l2_0; - xl21_0 = x_h2_1 - x_l2_1; + xh0_0 = ixheaacd_add32_sat(x_0, x_l1_0); + xh1_0 = ixheaacd_add32_sat(x_1, x_l1_1); + xl0_0 = ixheaacd_sub32_sat(x_0, x_l1_0); + xl1_0 = ixheaacd_sub32_sat(x_1, x_l1_1); + xh20_0 = ixheaacd_add32_sat(x_h2_0, x_l2_0); + xh21_0 = ixheaacd_add32_sat(x_h2_1, x_l2_1); + xl20_0 = ixheaacd_sub32_sat(x_h2_0, x_l2_0); + xl21_0 = ixheaacd_sub32_sat(x_h2_1, x_l2_1); x0 = x; x2 = x0; @@ -2026,14 +2026,14 @@ VOID ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, if (!predj) x += fft_jmp; if (!predj) j = 0; - x0[0] = xh0_0 + xh20_0; - x0[1] = xh1_0 + xh21_0; - xt0_0 = xh0_0 - xh20_0; - yt0_0 = xh1_0 - xh21_0; - xt1_0 = xl0_0 + xl21_0; - yt2_0 = xl1_0 + xl20_0; - xt2_0 = xl0_0 - xl21_0; - yt1_0 = xl1_0 - xl20_0; + x0[0] = ixheaacd_add32_sat(xh0_0, xh20_0); + x0[1] = ixheaacd_add32_sat(xh1_0, xh21_0); + xt0_0 = ixheaacd_sub32_sat(xh0_0, xh20_0); + yt0_0 = ixheaacd_sub32_sat(xh1_0, xh21_0); + xt1_0 = ixheaacd_add32_sat(xl0_0, xl21_0); + yt2_0 = ixheaacd_add32_sat(xl1_0, xl20_0); + xt2_0 = ixheaacd_sub32_sat(xl0_0, xl21_0); + yt1_0 = ixheaacd_sub32_sat(xl1_0, xl20_0); x2[h2] = MPYHIRC(si10, yt1_0) + MPYHIRC(co10, xt1_0) + @@ -2095,33 +2095,33 @@ VOID ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, x_7 = x0[7]; x0 += 8; - xh0_0 = x_0 + x_4; - xh1_0 = x_1 + x_5; - xl0_0 = x_0 - x_4; - xl1_0 = x_1 - x_5; - xh0_1 = x_2 + x_6; - xh1_1 = x_3 + x_7; - xl0_1 = x_2 - x_6; - xl1_1 = x_3 - x_7; - - n00 = xh0_0 + xh0_1; - n01 = xh1_0 + xh1_1; - n10 = xl0_0 + xl1_1; - n11 = xl1_0 - xl0_1; - n20 = xh0_0 - xh0_1; - n21 = xh1_0 - xh1_1; - n30 = xl0_0 - xl1_1; - n31 = xl1_0 + xl0_1; + xh0_0 = ixheaacd_add32_sat(x_0, x_4); + xh1_0 = ixheaacd_add32_sat(x_1, x_5); + xl0_0 = ixheaacd_sub32_sat(x_0, x_4); + xl1_0 = ixheaacd_sub32_sat(x_1, x_5); + xh0_1 = ixheaacd_add32_sat(x_2, x_6); + xh1_1 = ixheaacd_add32_sat(x_3, x_7); + xl0_1 = ixheaacd_sub32_sat(x_2, x_6); + xl1_1 = ixheaacd_sub32_sat(x_3, x_7); + + n00 = ixheaacd_add32_sat(xh0_0, xh0_1); + n01 = ixheaacd_add32_sat(xh1_0, xh1_1); + n10 = ixheaacd_add32_sat(xl0_0, xl1_1); + n11 = ixheaacd_sub32_sat(xl1_0, xl0_1); + n20 = ixheaacd_sub32_sat(xh0_0, xh0_1); + n21 = ixheaacd_sub32_sat(xh1_0, xh1_1); + n30 = ixheaacd_sub32_sat(xl0_0, xl1_1); + n31 = ixheaacd_add32_sat(xl1_0, xl0_1); if (radix == 2) { - n00 = x_0 + x_2; - n01 = x_1 + x_3; - n20 = x_0 - x_2; - n21 = x_1 - x_3; - n10 = x_4 + x_6; - n11 = x_5 + x_7; - n30 = x_4 - x_6; - n31 = x_5 - x_7; + n00 = ixheaacd_add32_sat(x_0, x_2); + n01 = ixheaacd_add32_sat(x_1, x_3); + n20 = ixheaacd_sub32_sat(x_0, x_2); + n21 = ixheaacd_sub32_sat(x_1, x_3); + n10 = ixheaacd_add32_sat(x_4, x_6); + n11 = ixheaacd_add32_sat(x_5, x_7); + n30 = ixheaacd_sub32_sat(x_4, x_6); + n31 = ixheaacd_sub32_sat(x_5, x_7); } y0[2 * h2] = n00; @@ -2143,33 +2143,33 @@ VOID ixheaacd_fft32x32_ld_dec(ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, x_f = x2[7]; x2 += 8; - xh0_2 = x_8 + x_c; - xh1_2 = x_9 + x_d; - xl0_2 = x_8 - x_c; - xl1_2 = x_9 - x_d; - xh0_3 = x_a + x_e; - xh1_3 = x_b + x_f; - xl0_3 = x_a - x_e; - xl1_3 = x_b - x_f; - - n02 = xh0_2 + xh0_3; - n03 = xh1_2 + xh1_3; - n12 = xl0_2 + xl1_3; - n13 = xl1_2 - xl0_3; - n22 = xh0_2 - xh0_3; - n23 = xh1_2 - xh1_3; - n32 = xl0_2 - xl1_3; - n33 = xl1_2 + xl0_3; + xh0_2 = ixheaacd_add32_sat(x_8, x_c); + xh1_2 = ixheaacd_add32_sat(x_9, x_d); + xl0_2 = ixheaacd_sub32_sat(x_8, x_c); + xl1_2 = ixheaacd_sub32_sat(x_9, x_d); + xh0_3 = ixheaacd_add32_sat(x_a, x_e); + xh1_3 = ixheaacd_add32_sat(x_b, x_f); + xl0_3 = ixheaacd_sub32_sat(x_a, x_e); + xl1_3 = ixheaacd_sub32_sat(x_b, x_f); + + n02 = ixheaacd_add32_sat(xh0_2, xh0_3); + n03 = ixheaacd_add32_sat(xh1_2, xh1_3); + n12 = ixheaacd_add32_sat(xl0_2, xl1_3); + n13 = ixheaacd_sub32_sat(xl1_2, xl0_3); + n22 = ixheaacd_sub32_sat(xh0_2, xh0_3); + n23 = ixheaacd_sub32_sat(xh1_2, xh1_3); + n32 = ixheaacd_sub32_sat(xl0_2, xl1_3); + n33 = ixheaacd_add32_sat(xl1_2, xl0_3); if (radix == 2) { - n02 = x_8 + x_a; - n03 = x_9 + x_b; - n22 = x_8 - x_a; - n23 = x_9 - x_b; - n12 = x_c + x_e; - n13 = x_d + x_f; - n32 = x_c - x_e; - n33 = x_d - x_f; + n02 = ixheaacd_add32_sat(x_8, x_a); + n03 = ixheaacd_add32_sat(x_9, x_b); + n22 = ixheaacd_sub32_sat(x_8, x_a); + n23 = ixheaacd_sub32_sat(x_9, x_b); + n12 = ixheaacd_add32_sat(x_c, x_e); + n13 = ixheaacd_add32_sat(x_d, x_f); + n32 = ixheaacd_sub32_sat(x_c, x_e); + n33 = ixheaacd_sub32_sat(x_d, x_f); } y0[2 * h2 + 2] = n02; diff --git a/decoder/ixheaacd_aac_rom.c b/decoder/ixheaacd_aac_rom.c index ca52137..8c3d426 100644 --- a/decoder/ixheaacd_aac_rom.c +++ b/decoder/ixheaacd_aac_rom.c @@ -18,9 +18,9 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_intrinsics.h" // -1 is appended at the end of each table to identify diff --git a/decoder/ixheaacd_aac_tns.c b/decoder/ixheaacd_aac_tns.c index 3fbaf9a..641fdc7 100644 --- a/decoder/ixheaacd_aac_tns.c +++ b/decoder/ixheaacd_aac_tns.c @@ -18,19 +18,19 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_error_codes.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -63,15 +63,6 @@ static PLATFORM_INLINE WORD32 ixheaacd_mac32_tns_sat(WORD32 a, WORD32 b, return (result); } -static PLATFORM_INLINE WORD64 mac32x32in64_dual(WORD32 a, WORD32 b, WORD64 c) { - WORD64 result; - WORD64 temp_result; - - temp_result = (WORD64)a * (WORD64)b; - result = c + (temp_result); - return (result); -} - VOID ixheaacd_tns_decode_coefficients( const ia_filter_info_struct *filter, WORD32 *a, ia_aac_dec_tables_struct *ptr_aac_tables) { @@ -294,7 +285,7 @@ VOID ixheaacd_tns_ar_filter_fixed_non_neon_armv7(WORD32 *spectrum, WORD32 size, WORD32 acc1; y = ixheaacd_shl32_sat((*spectrum), scale_spec); for (j = order; j > 0; j--) { - acc = mac32x32in64_dual(state[j - 1], lpc[j], acc); + acc = ixheaacd_mac32x32in64_dual(state[j - 1], lpc[j], acc); state[j] = state[j - 1]; } acc1 = (WORD32)(acc >> 32); @@ -349,7 +340,7 @@ VOID ixheaacd_tns_ar_filter_fixed_armv8(WORD32 *spectrum, WORD32 size, } acc1 = (WORD32)(acc >> 32); - y = ixheaacd_sub32(y, ixheaacd_shl32_sat(acc1, 1)); + y = ixheaacd_sub32_sat(y, ixheaacd_shl32_sat(acc1, 1)); state[0] = ixheaacd_shl32_sat(y, shift_value); *spectrum = y >> scale_spec; @@ -387,11 +378,15 @@ VOID ixheaacd_tns_ar_filter_dec(WORD32 *spectrum, WORD32 size, WORD32 inc, WORD32 acc; if ((order & 3) != 0) { - for (i = order + 1; i < ((WORD32)(order & 0xfffffffc) + 4); i++) { + for (i = order + 1; i < ((WORD32)(order & (~3)) + 4); i++) { lpc[i] = 0; } - lpc[i] = 0; - order = ((order & 0xfffffffc) + 4); + if (i < (MAX_ORDER + 1)) { + lpc[i] = 0; + order = ((order & (~3)) + 4); + } else { + order = MAX_ORDER; + } } for (i = 0; i < order; i++) { diff --git a/decoder/ixheaacd_aacdecoder.c b/decoder/ixheaacd_aacdecoder.c index 19770ad..6c26d2d 100644 --- a/decoder/ixheaacd_aacdecoder.c +++ b/decoder/ixheaacd_aacdecoder.c @@ -20,21 +20,21 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_definitions.h" @@ -56,13 +56,10 @@ #include "ixheaacd_sbr_payload.h" #include "ixheaacd_common_rom.h" - -#include <ixheaacd_type_def.h> - #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_stereo.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_hybrid.h" @@ -405,6 +402,7 @@ WORD32 ixheaacd_aacdec_decodeframe( error_code = ixheaacd_individual_ch_stream( it_bit_buff, aac_dec_handle, ele_ch, frame_length, total_channels, object_type, eld_specific_config, ele_type); + if (error_code) return error_code; if (ptr_adts_crc_info->crc_active == 1) { ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, @@ -428,13 +426,14 @@ WORD32 ixheaacd_aacdec_decodeframe( num_ch = num_ch + ele_ch; break; } else { - ixheaacd_channel_pair_process( + error_code = ixheaacd_channel_pair_process( aac_dec_handle->pstr_aac_dec_ch_info, ele_ch, aac_dec_handle->pstr_aac_tables, total_channels, object_type, aac_spect_data_resil_flag, eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data, (void *)aac_dec_handle); + if (error_code) return error_code; num_ch = num_ch + ele_ch; } } @@ -457,16 +456,16 @@ WORD32 ixheaacd_aacdec_decodeframe( if (error_code) { aac_dec_handle->frame_status = 0; - - break; + return error_code; } else { - ixheaacd_channel_pair_process( + error_code = ixheaacd_channel_pair_process( aac_dec_handle->pstr_aac_dec_ch_info, 1, aac_dec_handle->pstr_aac_tables, total_channels, object_type, aac_spect_data_resil_flag, eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data, (void *)aac_dec_handle); + if (error_code) return error_code; } } else { error_code = @@ -651,7 +650,7 @@ WORD32 ixheaacd_aacdec_decodeframe( { if (object_type == AOT_ER_AAC_LD) { - WORD16 temp = ixheaacd_ltp_decode( + IA_ERRORCODE temp = ixheaacd_ltp_decode( it_bit_buff, ptr_ics_info, object_type, aac_dec_handle->samples_per_frame, LEFT); @@ -666,6 +665,7 @@ WORD32 ixheaacd_aacdec_decodeframe( error_code = ixheaacd_individual_ch_stream( it_bit_buff, aac_dec_handle, ele_ch, frame_length, total_channels, object_type, eld_specific_config, ele_type); + if (error_code) return error_code; if (ptr_adts_crc_info->crc_active == 1) { ixheaacd_adts_crc_end_reg(ptr_adts_crc_info, it_bit_buff, @@ -689,13 +689,14 @@ WORD32 ixheaacd_aacdec_decodeframe( num_ch = num_ch + ele_ch; break; } else { - ixheaacd_channel_pair_process( + error_code = ixheaacd_channel_pair_process( aac_dec_handle->pstr_aac_dec_ch_info, ele_ch, aac_dec_handle->pstr_aac_tables, total_channels, object_type, aac_spect_data_resil_flag, eld_specific_config.aac_sf_data_resil_flag, aac_scratch_ptrs->in_data, aac_scratch_ptrs->out_data, (void *)aac_dec_handle); + if (error_code) return error_code; num_ch = num_ch + ele_ch; } } @@ -710,7 +711,8 @@ WORD32 ixheaacd_aacdec_decodeframe( cnt_bits = (frame_size * 8 - bits_decoded); if (cnt_bits >= 8) { - ixheaacd_extension_payload(it_bit_buff, cnt_bits); + error_code = ixheaacd_extension_payload(it_bit_buff, cnt_bits); + if (error_code) return error_code; } if (((object_type == AOT_ER_AAC_ELD) || @@ -786,9 +788,10 @@ WORD32 ixheaacd_aacdec_decodeframe( scratch[0] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[2]; scratch[1] = (WORD32 *)aac_scratch_ptrs->extra_scr_4k[1]; - ixheaacd_drc_map_channels( + error_code = ixheaacd_drc_map_channels( pstr_drc_dec, aac_dec_handle->channels, aac_dec_handle->pstr_aac_dec_ch_info[0]->str_ics_info.frame_length); + if (error_code) return error_code; for (ch = 0; ch < aac_dec_handle->channels; ch++) { WORD32 *overlap1 = aac_dec_handle->ptr_aac_dec_static_channel_info[ch] diff --git a/decoder/ixheaacd_aacpluscheck.c b/decoder/ixheaacd_aacpluscheck.c index 15d74c3..8c7266e 100644 --- a/decoder/ixheaacd_aacpluscheck.c +++ b/decoder/ixheaacd_aacpluscheck.c @@ -20,22 +20,22 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_defines.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -158,9 +158,7 @@ FLAG ixheaacd_check_for_sbr_payload( } it_bit_buff->ptr_read_next += count - 1; it_bit_buff->cnt_bits -= ((count - 1) << 3); - } } - if (it_bit_buff->cnt_bits < 0) ret = -1; return (ret); } diff --git a/decoder/ixheaacd_acelp_bitparse.c b/decoder/ixheaacd_acelp_bitparse.c index 17f669b..c5afc8c 100644 --- a/decoder/ixheaacd_acelp_bitparse.c +++ b/decoder/ixheaacd_acelp_bitparse.c @@ -20,7 +20,7 @@ #include <math.h> #include <stdio.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_acelp_com.h" #include "ixheaacd_windows.h" @@ -48,9 +48,9 @@ #include "ixheaacd_main.h" #include "ixheaacd_func_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" +#include "ixheaacd_error_standards.h" WORD32 ixheaacd_get_mode_lpc(WORD32 lpc_set, ia_bit_buf_struct *it_bit_buff, WORD32 *nk_mode) { @@ -264,7 +264,7 @@ VOID ixheaacd_fac_decoding(WORD32 fac_length, WORD32 k, WORD32 *fac_prm, } } -UWORD8 ixheaacd_num_bites_celp_coding[8][4] = { +const UWORD8 ixheaacd_num_bites_celp_coding[8][4] = { {5, 5, 5, 5}, {9, 9, 5, 5}, {9, 9, 9, 9}, {13, 13, 9, 9}, {13, 13, 13, 13}, {16, 16, 16, 16}, {1, 5, 1, 5}, {1, 5, 5, 5}}; @@ -273,7 +273,7 @@ VOID ixheaacd_acelp_decoding(WORD32 k, ia_usac_data_struct *usac_data, ia_bit_buf_struct *it_bit_buff, WORD32 chan) { WORD32 sfr, kk; WORD32 nb_subfr = usac_data->num_subfrm; - UWORD8 *ptr_num_bits = + const UWORD8 *ptr_num_bits = &ixheaacd_num_bites_celp_coding[pstr_td_frame_data->acelp_core_mode][0]; chan = 0; @@ -325,12 +325,14 @@ VOID ixheaacd_acelp_decoding(WORD32 k, ia_usac_data_struct *usac_data, } } -VOID ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, pWORD32 quant, - WORD32 k, WORD32 first_tcx_flag, - ia_td_frame_data_struct *pstr_td_frame_data, - ia_bit_buf_struct *it_bit_buff +IA_ERRORCODE ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, pWORD32 quant, + WORD32 k, WORD32 first_tcx_flag, + ia_td_frame_data_struct *pstr_td_frame_data, + ia_bit_buf_struct *it_bit_buff + + ) { + IA_ERRORCODE err = IA_NO_ERROR; - ) { pstr_td_frame_data->noise_factor[k] = ixheaacd_read_bits_buf(it_bit_buff, 3); pstr_td_frame_data->global_gain[k] = ixheaacd_read_bits_buf(it_bit_buff, 7); @@ -356,8 +358,11 @@ VOID ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, pWORD32 quant, } } - ixheaacd_arith_data(pstr_td_frame_data, quant, usac_data, it_bit_buff, - (first_tcx_flag), k); + err = ixheaacd_arith_data(pstr_td_frame_data, quant, usac_data, it_bit_buff, + (first_tcx_flag), k); + if (err) return err; + + return IA_NO_ERROR; } WORD32 ixheaacd_lpd_channel_stream(ia_usac_data_struct *usac_data, @@ -438,8 +443,9 @@ WORD32 ixheaacd_lpd_channel_stream(ia_usac_data_struct *usac_data, pstr_td_frame_data->tcx_lg[k] = 0; k += 1; } else { - ixheaacd_tcx_coding(usac_data, quant, k, first_tcx_flag, - pstr_td_frame_data, it_bit_buff); + err = ixheaacd_tcx_coding(usac_data, quant, k, first_tcx_flag, + pstr_td_frame_data, it_bit_buff); + if (err) return err; last_lpd_mode = pstr_td_frame_data->mod[k]; quant += pstr_td_frame_data->tcx_lg[k]; @@ -557,4 +563,4 @@ VOID ixheaacd_td_frm_dec(ia_usac_data_struct *usac_data, WORD32 k, p_ioverlap[i] = 0; } } -}
\ No newline at end of file +} diff --git a/decoder/ixheaacd_acelp_com.h b/decoder/ixheaacd_acelp_com.h index 363f25f..6b12afe 100644 --- a/decoder/ixheaacd_acelp_com.h +++ b/decoder/ixheaacd_acelp_com.h @@ -62,7 +62,7 @@ VOID ixheaacd_lpc_coeff_wt_apply(FLOAT32 *a, FLOAT32 *ap); VOID ixheaacd_acelp_pitch_sharpening(FLOAT32 *x, WORD32 pit_lag); -VOID ixheaacd_acelp_decode_pulses_per_track(WORD32 index[], WORD16 nbbits, +VOID ixheaacd_acelp_decode_pulses_per_track(WORD32 index[], const WORD16 nbbits, FLOAT32 code[]); #endif diff --git a/decoder/ixheaacd_acelp_decode.c b/decoder/ixheaacd_acelp_decode.c index 73a7c9f..e209a33 100644 --- a/decoder/ixheaacd_acelp_decode.c +++ b/decoder/ixheaacd_acelp_decode.c @@ -23,7 +23,7 @@ #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" @@ -218,7 +218,8 @@ static VOID ixheaacd_d_acelp_decode_1p_n1(WORD32 index, WORD32 N, return; } -VOID ixheaacd_acelp_decode_pulses_per_track(WORD32 cb_index[], WORD16 code_bits, +VOID ixheaacd_acelp_decode_pulses_per_track(WORD32 cb_index[], + const WORD16 code_bits, FLOAT32 code_vec[]) { WORD32 track_idx, index, ixheaacd_drc_offset, pos[6], i; memset(code_vec, 0, 64 * sizeof(FLOAT32)); @@ -349,8 +350,8 @@ WORD32 ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data, FLOAT32 tmp, pitch_gain, gain_code, voicing_factor, r_v, innov_energy, pitch_energy, mean_ener_code; FLOAT32 gain_smooth, gain_code0, cpe; - FLOAT32 code[LEN_SUBFR], synth_temp[128 + 16]; - FLOAT32 post_process_exc[LEN_SUBFR]; + FLOAT32 code[LEN_SUBFR] = {0}, synth_temp[128 + 16] = {0}; + FLOAT32 post_process_exc[LEN_SUBFR] = {0}; FLOAT32 gain_smooth_factor; FLOAT32 *ptr_lp_filt_coeff; WORD32 pitch_min; @@ -358,9 +359,9 @@ WORD32 ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data, WORD32 pitch_fr1; WORD32 pitch_max; WORD32 subfr_nb = 0; - WORD16 num_codebits_table[8] = {20, 28, 36, 44, 52, 64, 12, 16}; - FLOAT32 x[FAC_LENGTH], xn2[2 * FAC_LENGTH + 16]; - WORD32 int_x[FAC_LENGTH]; + static const WORD16 num_codebits_table[8] = {20, 28, 36, 44, 52, 64, 12, 16}; + FLOAT32 x[FAC_LENGTH] = {0}, xn2[2 * FAC_LENGTH + 16] = {0}; + WORD32 int_x[FAC_LENGTH] = {0}; WORD32 TTT; WORD32 len_subfr = usac_data->len_subfrm; WORD32 fac_length; diff --git a/decoder/ixheaacd_acelp_mdct.c b/decoder/ixheaacd_acelp_mdct.c index 63713cd..e6de7e6 100644 --- a/decoder/ixheaacd_acelp_mdct.c +++ b/decoder/ixheaacd_acelp_mdct.c @@ -20,7 +20,7 @@ #include <stdlib.h> #include <math.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -46,9 +46,8 @@ #include "ixheaacd_func_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" extern const WORD32 ixheaacd_pre_post_twid_cos_sin_512[4][512]; extern const WORD32 ixheaacd_pre_post_twid_cos_sin_384[4][384]; @@ -208,7 +207,8 @@ WORD32 ixheaacd_acelp_mdct(WORD32 *ptr_in, WORD32 *ptr_out, WORD32 *preshift, ixheaacd_pre_twid(ptr_in, ptr_data_r, ptr_data_i, length / 2, ptr_pre_post_twid); - ixheaacd_complex_fft(ptr_data_r, ptr_data_i, length / 2, -1, preshift); + err = ixheaacd_complex_fft(ptr_data_r, ptr_data_i, length / 2, -1, preshift); + if (err) return err; *preshift += 1; ixheaacd_post_twid(ptr_data_r, ptr_data_i, ptr_out, length / 2, diff --git a/decoder/ixheaacd_acelp_tools.c b/decoder/ixheaacd_acelp_tools.c index 430b6f4..b3d752f 100644 --- a/decoder/ixheaacd_acelp_tools.c +++ b/decoder/ixheaacd_acelp_tools.c @@ -19,14 +19,14 @@ */ #include <math.h> #include <memory.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_cnst.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" -static FLOAT32 ixheaacd_gamma_table[17] = { +static const FLOAT32 ixheaacd_gamma_table[17] = { 1.0f, 0.92f, 0.8464f, 0.778688f, 0.716393f, 0.659082f, 0.606355f, 0.557847f, 0.513219f, 0.472161f, 0.434389f, 0.399637f, 0.367666f, 0.338253f, 0.311193f, 0.286298f, 0.263394f}; diff --git a/decoder/ixheaacd_adts_crc_check.c b/decoder/ixheaacd_adts_crc_check.c index 6761a76..b908332 100644 --- a/decoder/ixheaacd_adts_crc_check.c +++ b/decoder/ixheaacd_adts_crc_check.c @@ -17,16 +17,15 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> #include "ixheaacd_bitbuffer.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_pulsedata.h" diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 1947a24..2a03695 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -20,13 +20,13 @@ #include <string.h> #include <stdio.h> #include <stdlib.h> +#include <assert.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_error_standards.h" @@ -45,12 +45,12 @@ #include "ixheaacd_bitbuffer.h" #include "ixheaacd_adts.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -440,8 +440,14 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, } case IA_CMD_TYPE_INIT_PROCESS: { WORD32 err_code = 0; - err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec); + if (p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) { + err_code = IA_FATAL_ERROR; + } else { + err_code = ixheaacd_dec_init(p_obj_exhaacplus_dec); + } if (err_code != 0) { + if (err_code < 0) + p_obj_exhaacplus_dec->p_state_aac->fatal_err_present = 1; p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed = p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes; } @@ -701,6 +707,20 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, if (i_idx >= 0 && i_idx <= 8) { *pui_value = pvalue[i_idx]; + } else if (IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES == i_idx) { + WORD32 *ptri_value = (WORD32 *)pv_value; + ia_audio_specific_config_struct *ptr_audio_specific_config = + ((ia_audio_specific_config_struct *) + p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); + + for (i = 0; i < MAX_AUDIO_PREROLLS + 1; i++) { + if (ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .preroll_bytes[i] == 0) { + break; + } + } + + *ptri_value = i; } else if (IA_ENHAACPLUS_DEC_CONFIG_EXT_ELE_PTR == i_idx) { ia_audio_specific_config_struct *ptr_audio_specific_config = ((ia_audio_specific_config_struct *) @@ -762,15 +782,29 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, ia_audio_specific_config_struct *ptr_audio_specific_config = ((ia_audio_specific_config_struct *) p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); - *ptri_value = ptr_audio_specific_config->str_usac_config - .str_usac_dec_config.usac_ext_gain_payload_len; + WORD32 preroll_counter = ptr_audio_specific_config->str_usac_config + .str_usac_dec_config.preroll_counter; + *ptri_value = + ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[preroll_counter]; } else if (IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF == i_idx) { + WORD32 payload_buffer_offeset = 0; ia_audio_specific_config_struct *ptr_audio_specific_config = ((ia_audio_specific_config_struct *) p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); + WORD32 preroll_counter = ptr_audio_specific_config->str_usac_config + .str_usac_dec_config.preroll_counter; + for (i = 0; i < (UWORD32)preroll_counter; i++) + payload_buffer_offeset += + ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[i] * + sizeof(WORD8); *pp_value = ptr_audio_specific_config->str_usac_config - .str_usac_dec_config.usac_ext_gain_payload_buf; - } else { + .str_usac_dec_config.usac_ext_gain_payload_buf + + payload_buffer_offeset; + } + + else { return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CONFIG_PARAM; } break; @@ -806,12 +840,15 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, switch (i_idx) { case IA_CMD_TYPE_DO_EXECUTE: { WORD32 err_code = 0; - if (!p_obj_exhaacplus_dec->p_state_aac->ui_init_done) { + if (!p_obj_exhaacplus_dec->p_state_aac->ui_init_done || + p_obj_exhaacplus_dec->p_state_aac->fatal_err_present) { err_code = IA_FATAL_ERROR; } else { err_code = ixheaacd_dec_execute(p_obj_exhaacplus_dec); } if (err_code != IA_NO_ERROR) { + if (err_code < 0) + p_obj_exhaacplus_dec->p_state_aac->fatal_err_present = 1; p_obj_exhaacplus_dec->p_state_aac->i_bytes_consumed = p_obj_exhaacplus_dec->p_state_aac->ui_in_bytes; } @@ -840,7 +877,24 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, break; } case IA_API_CMD_GET_OUTPUT_BYTES: { - *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes; + if (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_USAC) { + ia_audio_specific_config_struct *ptr_audio_specific_config = + ((ia_audio_specific_config_struct *) + p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); + + WORD32 preroll_counter = ptr_audio_specific_config->str_usac_config + .str_usac_dec_config.preroll_counter; + + *pui_value = ptr_audio_specific_config->str_usac_config + .str_usac_dec_config.preroll_bytes[preroll_counter]; + + preroll_counter++; + if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) return IA_FATAL_ERROR; + ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .preroll_counter = preroll_counter; + } else { + *pui_value = p_obj_exhaacplus_dec->p_state_aac->ui_out_bytes; + } break; } case IA_API_CMD_INPUT_OVER: { @@ -1075,7 +1129,7 @@ ixheaacd_persistent_buffer_sizes(WORD32 num_channel) { return (size_buffers); } -IA_ERRORCODE ixheaacd_fill_aac_mem_tables( +VOID ixheaacd_fill_aac_mem_tables( ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec) { ia_mem_info_struct *p_mem_info_aac; @@ -1174,11 +1228,11 @@ IA_ERRORCODE ixheaacd_fill_aac_mem_tables( { p_mem_info_aac = &p_obj_exhaacplus_dec->p_mem_info_aac[IA_ENHAACPLUS_DEC_OUTPUT_IDX]; - p_mem_info_aac->ui_size = num_channels * IA_ENHAACPLUS_DEC_OUT_BUF_SIZE; + p_mem_info_aac->ui_size = IA_ENHAACPLUS_DEC_OUT_BUF_SIZE; p_mem_info_aac->ui_alignment = 8; p_mem_info_aac->ui_type = IA_MEMTYPE_OUTPUT; } - return IA_NO_ERROR; + return; } IA_ERRORCODE ixheaacd_dec_table_api( @@ -1929,6 +1983,7 @@ IA_ERRORCODE ixheaacd_dec_init( WORD ch_idx_err = 0; WORD persistent_used_t = 0; WORD channel_check = 0; + WORD cc_channel_check = 0; WORD max_ch_num = p_obj_exhaacplus_dec->aac_config.ui_max_channels; i = 0; @@ -1953,30 +2008,34 @@ IA_ERRORCODE ixheaacd_dec_init( while (p_obj_exhaacplus_dec->aac_config.element_type[i] >= 0 && p_obj_exhaacplus_dec->aac_config.element_type[i] <= 3) { WORD32 channel = 0; - if (p_obj_exhaacplus_dec->aac_config.element_type[i] == 0 || - p_obj_exhaacplus_dec->aac_config.element_type[i] == 3) { - channel = 1; - } - - if (p_obj_exhaacplus_dec->aac_config.element_type[i] == 1) { - channel = 2; - } - - if (p_obj_exhaacplus_dec->aac_config.element_type[i] == 2) { - if (max_ch_num > 2) { - if (p_obj_exhaacplus_dec->aac_config.element_instance_order[i] != - p_obj_exhaacplus_dec->aac_config.ui_coupling_channel) { + switch (p_obj_exhaacplus_dec->aac_config.element_type[i]) { + case 0: + case 3: + channel = 1; + break; + case 1: + channel = 2; + break; + case 2: + if (max_ch_num > 2) { + if (p_obj_exhaacplus_dec->aac_config.element_instance_order[i] != + p_obj_exhaacplus_dec->aac_config.ui_coupling_channel) { + i++; + continue; + } + channel = 1; + } else { i++; continue; } - channel = 1; - } else - - { - i++; - continue; - } + cc_channel_check++; + break; + default: + assert(0); } + + if (cc_channel_check > MAX_CC_CHANNEL_NUM) + return IA_ENHAACPLUS_DEC_EXE_FATAL_UNIMPLEMENTED_CCE; if (ps_enable == 1) { channel = 2; } @@ -2034,9 +2093,19 @@ IA_ERRORCODE ixheaacd_dec_init( p_state_enhaacplus_dec->str_sbr_dec_info[i]->xaac_jmp_buf = &(p_state_enhaacplus_dec->xaac_jmp_buf); } + if (sbr_present_flag && + ((p_obj_exhaacplus_dec->p_state_aac->audio_object_type == + AOT_AAC_LC) || + (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == + AOT_SBR) || + (p_obj_exhaacplus_dec->p_state_aac->audio_object_type == AOT_PS))) + p_obj_exhaacplus_dec->aac_config.flag_to_stereo = 1; i++; } + p_state_enhaacplus_dec->pers_mem_ptr = + (WORD8 *)p_state_enhaacplus_dec->aac_persistent_mem_v + + persistent_used_t; p_obj_exhaacplus_dec->aac_config.i_channel_mask = ixheaacd_get_channel_mask(p_obj_exhaacplus_dec); @@ -2203,7 +2272,37 @@ IA_ERRORCODE ixheaacd_dec_execute( WORD32 frames_done = p_obj_exhaacplus_dec->p_state_aac->frame_counter; + ia_dec_data_struct *pstr_dec_data = + (ia_dec_data_struct *)(p_obj_exhaacplus_dec->p_state_aac + ->pstr_dec_data); + + if (pstr_dec_data->str_usac_data.down_samp_sbr != 0) return IA_FATAL_ERROR; + if (p_obj_exhaacplus_dec->p_state_aac->ui_input_over == 0) { + ia_audio_specific_config_struct *ptr_audio_specific_config = + ((ia_audio_specific_config_struct *) + p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); + + ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .preroll_counter = 0; + { + WORD32 iii = 0; + for (iii = 0; iii < (MAX_AUDIO_PREROLLS + 1); iii++) { + ((ia_dec_data_struct *)(p_obj_exhaacplus_dec->p_state_aac + ->pstr_dec_data)) + ->str_frame_data.str_audio_specific_config.str_usac_config + .str_usac_dec_config.usac_ext_gain_payload_len[iii] = 0; + ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[iii] = + 0; // reinitilize the payload len buff + ptr_audio_specific_config->str_usac_config.str_usac_dec_config + .preroll_bytes[iii] = 0; + } + } + + ((ia_dec_data_struct *)(p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data)) + ->str_frame_data.str_audio_specific_config.str_usac_config + .str_usac_dec_config.preroll_counter = 0; error_code = ixheaacd_dec_main( p_obj_exhaacplus_dec, inbuffer, outbuffer, &out_bytes, frames_done, pcm_size, &p_obj_exhaacplus_dec->p_state_aac->num_of_output_ch); @@ -2362,7 +2461,7 @@ IA_ERRORCODE ixheaacd_dec_execute( p_state_enhaacplus_dec, (ia_sampling_rate_info_struct *)&p_obj_exhaacplus_dec->aac_tables .pstr_huffmann_tables->str_sample_rate_info[0]); - if (result < 0) return result; + if (result) return result; if (!p_state_enhaacplus_dec->latm_initialized) { p_state_enhaacplus_dec->sampling_rate = p_state_enhaacplus_dec->latm_struct_element.layer_info[0][0] @@ -2446,14 +2545,12 @@ IA_ERRORCODE ixheaacd_dec_execute( WORD32 pers_used = 0; skip_full_decode = 1; pers_used = ixheaacd_set_aac_persistent_buffers( - (WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v + (8 * 1024), - channel); + p_state_enhaacplus_dec->pers_mem_ptr, channel); { struct ia_aac_persistent_struct *aac_persistent_mem = - (struct ia_aac_persistent_struct - *)((WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v + - (8 * 1024)); + (struct ia_aac_persistent_struct *) + p_state_enhaacplus_dec->pers_mem_ptr; aac_persistent_mem->str_aac_decoder.pstr_aac_tables = &p_obj_exhaacplus_dec->aac_tables; aac_persistent_mem->str_aac_decoder.pstr_common_tables = @@ -2470,8 +2567,7 @@ IA_ERRORCODE ixheaacd_dec_execute( p_state_enhaacplus_dec->pstr_stream_sbr[ch_idx], - channel, - (WORD8 *)p_state_enhaacplus_dec->aac_scratch_mem_v + (8 * 1024), + channel, p_state_enhaacplus_dec->pers_mem_ptr, p_state_enhaacplus_dec->frame_length ); diff --git a/decoder/ixheaacd_arith_dec.c b/decoder/ixheaacd_arith_dec.c index 14bb414..6c6069c 100644 --- a/decoder/ixheaacd_arith_dec.c +++ b/decoder/ixheaacd_arith_dec.c @@ -19,11 +19,11 @@ */ #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -49,10 +49,10 @@ #define ARITH_ESCAPE 16 -UWORD16 ixheaacd_ari_cf_r[3][4] = { +static const UWORD16 ixheaacd_ari_cf_r[3][4] = { {12571, 10569, 3696, 0}, {12661, 5700, 3751, 0}, {10827, 6884, 2929, 0}}; -static UWORD16 ixheaacd_ari_lookup_m[742] = { +static const UWORD16 ixheaacd_ari_lookup_m[742] = { 0x01, 0x34, 0x0D, 0x13, 0x12, 0x25, 0x00, 0x3A, 0x05, 0x00, 0x21, 0x13, 0x1F, 0x1A, 0x1D, 0x36, 0x24, 0x2B, 0x1B, 0x33, 0x37, 0x29, 0x1D, 0x33, 0x37, 0x33, 0x37, 0x33, 0x37, 0x33, 0x2C, 0x00, 0x21, 0x13, 0x25, 0x2A, @@ -116,7 +116,7 @@ static UWORD16 ixheaacd_ari_lookup_m[742] = { 0x27, 0x17, 0x27, 0x17, 0x27, 0x17, 0x27, 0x17, 0x27, 0x17, 0x27, 0x17, 0x27, 0x17, 0x27, 0x17, 0x27, 0x15, 0x27, 0x27, 0x15, 0x27}; -static UWORD32 ixheaacd_ari_hash_m[742] = { +static const UWORD32 ixheaacd_ari_hash_m[742] = { 0x00000104UL >> 8, 0x0000030AUL >> 8, 0x00000510UL >> 8, 0x00000716UL >> 8, 0x00000A1FUL >> 8, 0x00000F2EUL >> 8, 0x00011100UL >> 8, 0x00111103UL >> 8, 0x00111306UL >> 8, 0x00111436UL >> 8, 0x00111623UL >> 8, 0x00111929UL >> 8, @@ -304,7 +304,7 @@ static UWORD32 ixheaacd_ari_hash_m[742] = { 0x06000F27UL >> 8, 0x069FFF17UL >> 8, 0x06FFFF17UL >> 8, 0x08110017UL >> 8, 0x08EFFF15UL >> 8, 0xFFFFFF00UL >> 8}; -static UWORD8 ixheaacd_ari_hash_m_1[742] = { +static const UWORD8 ixheaacd_ari_hash_m_1[742] = { (UWORD8)0x04, (UWORD8)0x0A, (UWORD8)0x10, (UWORD8)0x16, (UWORD8)0x1F, (UWORD8)0x2E, (UWORD8)0x00, (UWORD8)0x03, (UWORD8)0x06, (UWORD8)0x36, (UWORD8)0x23, (UWORD8)0x29, (UWORD8)0x2E, (UWORD8)0x1B, (UWORD8)0x35, @@ -455,7 +455,7 @@ static UWORD8 ixheaacd_ari_hash_m_1[742] = { (UWORD8)0x2F, (UWORD8)0x27, (UWORD8)0x17, (UWORD8)0x17, (UWORD8)0x17, (UWORD8)0x15, (UWORD8)0x00}; -UWORD16 ixheaacd_ari_cf_m[64][17] = { +static const UWORD16 ixheaacd_ari_cf_m[64][17] = { {708, 706, 579, 569, 568, 567, 479, 469, 297, 138, 97, 91, 72, 52, 38, 34, 0}, {7619, 6917, 6519, 6412, 5514, 5003, 4683, 4563, 3907, 3297, 3125, 3060, @@ -1625,8 +1625,8 @@ const WORD32 ixheaacd_pow_table_Q13[1025] = {0, 84441795, 84551870}; -static WORD32 ixheaacd_esc_nb_offset[8] = {0, 131072, 262144, 393216, - 524288, 655360, 786432, 917504}; +static const WORD32 ixheaacd_esc_nb_offset[8] = { + 0, 131072, 262144, 393216, 524288, 655360, 786432, 917504}; static void ixheaacd_arith_map_context(WORD32 pres_n, WORD32 prev_n, WORD8 *c_prev, WORD8 *c, @@ -1730,34 +1730,26 @@ static WORD32 ixheaacd_arith_decode(ia_bit_buf_struct *it_bit_buff, UWORD16 const *cum_freq, WORD32 cfl) { register WORD32 symbol; register WORD32 low, high, range, value; - register WORD32 cum; + register WORD32 cumulative; register UWORD16 const *p; register UWORD16 const *q; - WORD32 short_value, i = 16; - int shift_value; - if (it_bit_buff->cnt_bits < 16) { - shift_value = 16 - it_bit_buff->cnt_bits; - short_value = ixheaacd_read_bits_buf(it_bit_buff, it_bit_buff->cnt_bits); - short_value <<= shift_value; - } else { - shift_value = 0; - short_value = ixheaacd_read_bits_buf(it_bit_buff, 16); - } - low = s->low; high = s->high; value = s->value; range = high - low + 1; - cum = ((((WORD32)(value - low + 1)) << 14) - ((WORD32)1)) / ((WORD32)range); + cumulative = ((((WORD32)(value - low + 1)) << 14) - ((WORD32)1)) / ((WORD32)range); + + if (it_bit_buff->cnt_bits == 0) + if (cumulative <= 0) return -1; p = cum_freq - 1; do { q = p + (cfl >> 1); - if (*q > cum) { + if (*q > cumulative) { p = q; cfl++; } @@ -1786,12 +1778,14 @@ static WORD32 ixheaacd_arith_decode(ia_bit_buf_struct *it_bit_buff, low += low; high += high + 1; - i--; - value = (value << 1) | ((short_value >> i) & 1); + if (it_bit_buff->cnt_bits > 0) + value = (value << 1) | ixheaacd_read_bits_buf(it_bit_buff, 1); + else + value = (value << 1); + bit_count++; } - ixheaacd_read_bidirection(it_bit_buff, -(i - shift_value)); s->low = low; s->high = high; s->value = value; @@ -1847,10 +1841,6 @@ WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, if (esc_nb > 7) { esc_nb = 7; } - if (esc_nb < 0) { - esc_nb = 0; - return -1; - } } if (m == 0) { @@ -1891,8 +1881,8 @@ WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, if (bit_count > 0) { bit_count_5 = bit_count >> 5; - for (i = 0; i < bit_count_5; i++) ixheaacd_read_bits_buf(it_bit_buff, 32); - ixheaacd_read_bits_buf(it_bit_buff, bit_count & 31); + bit_count_5 = (bit_count_5 * 32) + (bit_count & 31); + ixheaacd_skip_bits_buf(it_bit_buff, bit_count_5); } for (i = 0; i < pres_n; i++) { diff --git a/decoder/ixheaacd_avq_dec.c b/decoder/ixheaacd_avq_dec.c index 15c228c..af11cef 100644 --- a/decoder/ixheaacd_avq_dec.c +++ b/decoder/ixheaacd_avq_dec.c @@ -23,10 +23,10 @@ #include <math.h> #include <assert.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_acelp_com.h" extern const WORD32 ixheaacd_factorial_7[8]; @@ -50,11 +50,12 @@ static VOID ixheaacd_nearest_neighbor_2d(WORD32 x[], WORD32 y[], WORD32 count, sum = 0; for (i = 0; i < 8; i++) { if (x[i] < 0) { - y[i] = -2 * (((WORD32)(1 - x[i])) >> 1); + y[i] = ixheaacd_negate32_sat( + ixheaacd_shl32_sat((ixheaacd_sub32_sat(1, x[i]) >> 1), 1)); } else { - y[i] = 2 * (((WORD32)(1 + x[i])) >> 1); + y[i] = ixheaacd_shl32_sat((ixheaacd_add32_sat(1, x[i]) >> 1), 1); } - sum += y[i]; + sum = ixheaacd_add32_sat(sum, y[i]); if (x[i] % 2 != 0) { if (x[i] < 0) { @@ -89,7 +90,7 @@ static VOID ixheaacd_nearest_neighbor_2d(WORD32 x[], WORD32 y[], WORD32 count, y[j] -= 2; rem_temp[j] = ixheaacd_add32_sat(rem_temp[j], (2 << count)); } else { - y[j] += 2; + y[j] = ixheaacd_add32_sat(y[j], 2); rem_temp[j] = ixheaacd_sub32_sat(rem_temp[j], (2 << count)); } } @@ -114,14 +115,14 @@ VOID ixheaacd_voronoi_search(WORD32 x[], WORD32 y[], WORD32 count, WORD32 *rem1, rem2[i] = ixheaacd_sub32_sat(rem2[i], (1 << count)); } } else { - x1[i] = x[i] - 1; + x1[i] = ixheaacd_sub32_sat(x[i], 1); } } ixheaacd_nearest_neighbor_2d(x1, y1, count, rem2); for (i = 0; i < 8; i++) { - y1[i] += 1; + y1[i] = ixheaacd_add32_sat(y1[i], 1); } e0 = e1 = 0; @@ -164,11 +165,11 @@ VOID ixheaacd_voronoi_idx_dec(WORD32 *kv, WORD32 m, WORD32 *y, WORD32 count) { y[0] = ixheaacd_add32_sat( y[0], ixheaacd_add32_sat(ixheaacd_sat64_32((WORD64)4 * (WORD64)kv[0]), sum)); - z[0] = (y[0] - 2) >> count; + z[0] = (ixheaacd_sub32_sat(y[0], 2)) >> count; if (m != 0) - rem1[0] = (y[0] - 2) % m; + rem1[0] = (ixheaacd_sub32_sat(y[0], 2)) % m; else - rem1[0] = (y[0] - 2); + rem1[0] = ixheaacd_sub32_sat(y[0], 2); memcpy(rem2, rem1, 8 * sizeof(WORD32)); @@ -177,7 +178,9 @@ VOID ixheaacd_voronoi_idx_dec(WORD32 *kv, WORD32 m, WORD32 *y, WORD32 count) { ptr1 = y; ptr2 = v; for (i = 0; i < 8; i++) { - *ptr1++ -= ixheaacd_sat64_32((WORD64)m * (WORD64)*ptr2++); + *ptr1 = ixheaacd_sub32_sat(*ptr1, + ixheaacd_sat64_32((WORD64)m * (WORD64)*ptr2++)); + ptr1++; } } @@ -306,4 +309,4 @@ VOID ixheaacd_rotated_gosset_mtx_dec(WORD32 qn, WORD32 code_book_idx, } } return; -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_avq_rom.c b/decoder/ixheaacd_avq_rom.c index af2b803..1251923 100644 --- a/decoder/ixheaacd_avq_rom.c +++ b/decoder/ixheaacd_avq_rom.c @@ -17,7 +17,7 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_acelp_com.h" #include "ixheaacd_cnst.h" @@ -402,7 +402,7 @@ const FLOAT32 ixheaacd_interpol_filt[INTER_LP_FIL_LEN] = { 0.001151f, 0.000259f, -0.000417f, -0.000618f, -0.000434f, -0.000133f, 0.000063f, 0.000098f, 0.000048f, 0.000007f, 0.000000f}; -FLOAT32 ixheaacd_weight_table_avq[16 * 256] = { +const FLOAT32 ixheaacd_weight_table_avq[16 * 256] = { 51.35722351f, 56.66270447f, 56.93847275f, 47.94641876f, 51.14369583f, 55.13227081f, 55.94912338f, 55.60356140f, 55.40005112f, 55.63003922f, 56.32114792f, 58.34404755f, 58.28456116f, 57.81193161f, 57.67873764f, diff --git a/decoder/ixheaacd_basic_funcs.c b/decoder/ixheaacd_basic_funcs.c index d684368..6df28fc 100644 --- a/decoder/ixheaacd_basic_funcs.c +++ b/decoder/ixheaacd_basic_funcs.c @@ -18,15 +18,14 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> -#include <ixheaacd_basic_ops.h> - -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" +#include "ixheaacd_basic_op.h" +#include "ixheaacd_basic_ops.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" diff --git a/decoder/ixheaacd_basic_ops.c b/decoder/ixheaacd_basic_ops.c index f36a1ae..3887210 100644 --- a/decoder/ixheaacd_basic_ops.c +++ b/decoder/ixheaacd_basic_ops.c @@ -18,11 +18,11 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> +#include "ixheaacd_basic_ops32.h" #include "ixheaacd_windows.h" static PLATFORM_INLINE WORD32 ixheaacd_mult32_sh1(WORD32 a, WORD32 b) { @@ -65,7 +65,8 @@ VOID ixheaacd_combine_fac(WORD32 *src1, WORD32 *src2, WORD32 *dest, WORD32 len, } } else { for (i = 0; i < len; i++) { - *dest = ixheaacd_add32_sat(*src1, ((*src2) << (output_q - fac_q))); + *dest = ixheaacd_add32_sat( + *src1, ixheaacd_shl32_sat((*src2), (output_q - fac_q))); dest++; src1++; src2++; @@ -86,7 +87,8 @@ WORD8 ixheaacd_windowing_long1(WORD32 *src1, WORD32 *src2, ((ixheaacd_mult32_sh1(*src1, *win_fwd)) >> (shift1 - shift2)), ixheaacd_mult32_sh1(*src2, *win_rev)); *(dest + (vlen - (2 * i)) - 1) = ixheaacd_add32_sat( - ((ixheaacd_mult32_sh1(-(*src1), *win_rev)) >> (shift1 - shift2)), + ((ixheaacd_mult32_sh1(ixheaacd_negate32_sat(*src1), *win_rev)) >> + (shift1 - shift2)), ixheaacd_mult32_sh1(*rsrc2, *win_fwd)); src1++; @@ -104,7 +106,7 @@ WORD8 ixheaacd_windowing_long1(WORD32 *src1, WORD32 *src2, ((ixheaacd_mult32_sh1(*src2, *win_rev)) >> (shift2 - shift1))); *(dest + (vlen - (2 * i)) - 1) = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-(*src1), *win_rev), + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(*src1), *win_rev), ((ixheaacd_mult32_sh1(*rsrc2, *win_fwd)) >> (shift2 - shift1))); src1++; src2++; @@ -139,10 +141,11 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls; i++) { dest[i] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1], - *win_fwd) >> + (ixheaacd_mult32_sh1( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]), + *win_fwd) >> (shiftp - fac_q)), (*fac_data_out)); win_fwd++; @@ -152,20 +155,21 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, for (; i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3); i++) { - dest[i] = - ixheaacd_add32_sat((-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1] >> - (shiftp - fac_q)), - (*fac_data_out)); + dest[i] = ixheaacd_add32_sat( + (ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]) >> + (shiftp - fac_q)), + (*fac_data_out)); fac_data_out++; } for (; i < ixheaacd_drc_offset->n_long; i++) { - dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1] >> - (shiftp - fac_q); + dest[i] = + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]) >> + (shiftp - fac_q); } return (fac_q); } else { @@ -176,10 +180,11 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls; i++) { dest[i] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1], - *win_fwd) >> + (ixheaacd_mult32_sh1( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]), + *win_fwd) >> (shiftp - shift_olap)), (*fac_data_out) >> (fac_q - shift_olap)); win_fwd++; @@ -189,20 +194,21 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, for (; i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3); i++) { - dest[i] = - ixheaacd_add32_sat((-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1] >> - (shiftp - shift_olap)), - (*fac_data_out) >> (fac_q - shift_olap)); + dest[i] = ixheaacd_add32_sat( + (ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]) >> + (shiftp - shift_olap)), + (*fac_data_out) >> (fac_q - shift_olap)); fac_data_out++; } for (; i < ixheaacd_drc_offset->n_long; i++) { - dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1] >> - (shiftp - shift_olap); + dest[i] = + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]) >> + (shiftp - shift_olap); } return (shift_olap); } @@ -218,10 +224,11 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls; i++) { dest[i] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1], - *win_fwd), + ixheaacd_mult32_sh1( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]), + *win_fwd), (*fac_data_out) >> (fac_q - shiftp)); win_fwd++; fac_data_out++; @@ -230,17 +237,19 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, for (; i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3); i++) { - dest[i] = ixheaacd_add32_sat(-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1], - (*fac_data_out) >> (fac_q - shiftp)); + dest[i] = ixheaacd_add32_sat( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]), + (*fac_data_out) >> (fac_q - shiftp)); fac_data_out++; } for (; i < ixheaacd_drc_offset->n_long; i++) { - dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1]; + dest[i] = + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]); } return (shiftp); } else { @@ -251,10 +260,11 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls; i++) { dest[i] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1], - *win_fwd) >> + (ixheaacd_mult32_sh1( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]), + *win_fwd) >> (shiftp - shift_olap)), (*fac_data_out) >> (fac_q - shift_olap)); win_fwd++; @@ -264,20 +274,21 @@ WORD8 ixheaacd_windowing_long2(WORD32 *src1, const WORD32 *win_fwd, for (; i < ixheaacd_drc_offset->n_flat_ls + (ixheaacd_drc_offset->lfac * 3); i++) { - dest[i] = - ixheaacd_add32_sat((-src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1] >> - (shiftp - shift_olap)), - (*fac_data_out) >> (fac_q - shift_olap)); + dest[i] = ixheaacd_add32_sat( + (ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]) >> + (shiftp - shift_olap)), + (*fac_data_out) >> (fac_q - shift_olap)); fac_data_out++; } for (; i < ixheaacd_drc_offset->n_long; i++) { - dest[i] = -src1[ixheaacd_drc_offset->n_long / 2 + - ixheaacd_drc_offset->n_flat_ls + - ixheaacd_drc_offset->lfac - i - 1] >> - (shiftp - shift_olap); + dest[i] = + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long / 2 + + ixheaacd_drc_offset->n_flat_ls + + ixheaacd_drc_offset->lfac - i - 1]) >> + (shiftp - shift_olap); } return (shift_olap); } @@ -308,8 +319,9 @@ WORD8 ixheaacd_windowing_long3(WORD32 *src1, const WORD32 *win_fwd, i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls; i++) { dest[i] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long - i - 1], - *win_fwd) >> + (ixheaacd_mult32_sh1( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]), + *win_fwd) >> (shiftp - shift_olap)), ixheaacd_mult32_sh1(over_lap[i], *win_rev)); win_fwd++; @@ -318,7 +330,8 @@ WORD8 ixheaacd_windowing_long3(WORD32 *src1, const WORD32 *win_fwd, for (; i < ixheaacd_drc_offset->n_long; i++) { dest[i] = - -src1[ixheaacd_drc_offset->n_long - i - 1] >> (shiftp - shift_olap); + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]) >> + (shiftp - shift_olap); } return (shift_olap); @@ -340,15 +353,17 @@ WORD8 ixheaacd_windowing_long3(WORD32 *src1, const WORD32 *win_fwd, i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->n_trans_ls; i++) { dest[i] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[ixheaacd_drc_offset->n_long - i - 1], - *win_fwd), + ixheaacd_mult32_sh1( + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]), + *win_fwd), ixheaacd_mult32_sh1(over_lap[i], *win_rev) >> (shift_olap - shiftp)); win_fwd++; win_rev--; } for (; i < ixheaacd_drc_offset->n_long; i++) { - dest[i] = -src1[ixheaacd_drc_offset->n_long - i - 1]; + dest[i] = + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_long - i - 1]); } return (shiftp); @@ -369,7 +384,8 @@ VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp, for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short; i++) { dest[i] = ixheaacd_mult32_sh1( - -src1[ixheaacd_drc_offset->n_short - i - 1], src2[i]); + ixheaacd_negate32_sat(src1[ixheaacd_drc_offset->n_short - i - 1]), + src2[i]); } for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac; @@ -390,9 +406,11 @@ VOID ixheaacd_windowing_short1(WORD32 *src1, WORD32 *src2, WORD32 *fp, if (ixheaacd_drc_offset->n_short > ixheaacd_drc_offset->lfac) { for (i = ixheaacd_drc_offset->lfac; i < ixheaacd_drc_offset->n_short; i++) { - dest[i] = ixheaacd_mult32_sh1( - -src1[ixheaacd_drc_offset->n_short - i - 1], src2[i]) >> - (shiftp - shift_olap); + dest[i] = + ixheaacd_mult32_sh1(ixheaacd_negate32_sat( + src1[ixheaacd_drc_offset->n_short - i - 1]), + src2[i]) >> + (shiftp - shift_olap); } for (; i < ixheaacd_drc_offset->n_flat_ls + ixheaacd_drc_offset->lfac; @@ -423,7 +441,7 @@ VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, (ixheaacd_mult32_sh1(fp[i], *win_rev) >> (shift_olap - shiftp))); fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[i], *win_rev), + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[i]), *win_rev), (ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1], *win_fwd) >> (shift_olap - shiftp))); @@ -443,7 +461,8 @@ VOID ixheaacd_windowing_short2(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, ixheaacd_mult32_sh1(fp[i], *win_rev)); fp[ixheaacd_drc_offset->n_short - i - 1] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[i], *win_rev) >> (shiftp - shift_olap)), + (ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[i]), *win_rev) >> + (shiftp - shift_olap)), ixheaacd_mult32_sh1(fp[ixheaacd_drc_offset->n_short - i - 1], *win_fwd)); @@ -467,11 +486,13 @@ WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp, if (shift_olap > shiftp) { for (i = 0; i < n_short / 2; i++) { fp[i] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_rev), + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short / 2 - i - 1]), + *win_rev), (fp[i] >> (shift_olap - shiftp))); fp[n_short - i - 1] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_fwd), + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short / 2 - i - 1]), + *win_fwd), (fp[n_short - i - 1] >> (shift_olap - shiftp))); win_rev--; win_fwd++; @@ -480,12 +501,14 @@ WORD8 ixheaacd_windowing_short3(WORD32 *src1, WORD32 *win_rev, WORD32 *fp, } else { for (i = 0; i < n_short / 2; i++) { fp[i] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_rev) >> + (ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short / 2 - i - 1]), + *win_rev) >> (shiftp - shift_olap)), fp[i]); fp[n_short - i - 1] = ixheaacd_add32_sat( - (ixheaacd_mult32_sh1(-src1[n_short / 2 - i - 1], *win_fwd) >> + (ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short / 2 - i - 1]), + *win_fwd) >> (shiftp - shift_olap)), fp[n_short - i - 1]); @@ -511,7 +534,8 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, fp[i]); fp[n_short - i - 1] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short / 2 + i], *win_rev) >> + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short / 2 + i]), + *win_rev) >> (shiftp - output_q), fp[n_short - i - 1]); @@ -521,12 +545,14 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, if (flag == 1) { for (; i < n_short; i++) { fp[i + n_short / 2] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_fwd1) >> + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short - i - 1]), + *win_fwd1) >> (shiftp - output_q), (fp[i + n_short / 2] >> (shift_olap - output_q))); fp[3 * n_short - n_short / 2 - i - 1] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_rev1) >> + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short - i - 1]), + *win_rev1) >> (shiftp - output_q), (fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q))); @@ -535,11 +561,11 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, } } else { for (; i < n_short; i++) { - fp[i + n_short / 2] = - ixheaacd_add32_sat(-src1[n_short - i - 1] >> (shiftp - output_q), - fp[i + n_short / 2] >> (shift_olap - output_q)); + fp[i + n_short / 2] = ixheaacd_add32_sat( + ixheaacd_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q), + fp[i + n_short / 2] >> (shift_olap - output_q)); fp[3 * n_short - n_short / 2 - i - 1] = ixheaacd_add32_sat( - -src1[n_short - i - 1] >> (shiftp - output_q), + ixheaacd_negate32_sat(src1[n_short - i - 1]) >> (shiftp - output_q), fp[3 * n_short - n_short / 2 - i - 1] >> (shift_olap - output_q)); } } @@ -552,7 +578,8 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, fp[i] >> (output_q - shift_olap)); fp[n_short - i - 1] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short / 2 + i], *win_rev) >> + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short / 2 + i]), + *win_rev) >> (shiftp - shift_olap), fp[n_short - i - 1]); @@ -562,12 +589,14 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, if (flag == 1) { for (; i < n_short; i++) { fp[i + n_short / 2] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_fwd1) >> + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short - i - 1]), + *win_fwd1) >> (shiftp - shift_olap), fp[i + n_short / 2]); fp[3 * n_short - n_short / 2 - i - 1] = ixheaacd_add32_sat( - ixheaacd_mult32_sh1(-src1[n_short - i - 1], *win_rev1) >> + ixheaacd_mult32_sh1(ixheaacd_negate32_sat(src1[n_short - i - 1]), + *win_rev1) >> (shiftp - shift_olap), fp[3 * n_short - n_short / 2 - i - 1]); @@ -577,10 +606,12 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, } else { for (; i < n_short; i++) { fp[i + n_short / 2] = - ixheaacd_add32_sat(-src1[n_short - i - 1] >> (shiftp - shift_olap), + ixheaacd_add32_sat(ixheaacd_negate32_sat(src1[n_short - i - 1]) >> + (shiftp - shift_olap), fp[i + n_short / 2]); fp[3 * n_short - n_short / 2 - i - 1] = - ixheaacd_add32_sat(-src1[n_short - i - 1] >> (shiftp - shift_olap), + ixheaacd_add32_sat(ixheaacd_negate32_sat(src1[n_short - i - 1]) >> + (shiftp - shift_olap), fp[3 * n_short - n_short / 2 - i - 1]); } } @@ -599,7 +630,26 @@ VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1, } } else { for (i = 0; i < len; i++) { - *dest = *src << (shift2 - shift1); + *dest = ixheaacd_shl32_sat((*src), (shift2 - shift1)); + src++; + dest++; + } + } +} + +VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len, + WORD8 shift1, WORD8 shift2) { + WORD32 i; + if (shift1 > shift2) { + for (i = 0; i < len; i++) { + *dest = ixheaacd_add32_sat((*src >> (shift1 - shift2)), ADJ_SCALE); + src++; + dest++; + } + } else { + for (i = 0; i < len; i++) { + *dest = ixheaacd_add32_sat(ixheaacd_shl32_sat((*src), (shift2 - shift1)), + ADJ_SCALE); src++; dest++; } diff --git a/decoder/ixheaacd_basic_ops.h b/decoder/ixheaacd_basic_ops.h index 602ddd5..e22538b 100644 --- a/decoder/ixheaacd_basic_ops.h +++ b/decoder/ixheaacd_basic_ops.h @@ -130,7 +130,7 @@ static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64_dual(WORD32 a, WORD32 b, WORD64 temp_result; temp_result = (WORD64)a * (WORD64)b; - result = c + (temp_result); + result = ixheaacd_add64_sat(c, temp_result); return (result); } diff --git a/decoder/ixheaacd_basic_ops32.h b/decoder/ixheaacd_basic_ops32.h index f9a5299..365bfbe 100644 --- a/decoder/ixheaacd_basic_ops32.h +++ b/decoder/ixheaacd_basic_ops32.h @@ -180,11 +180,8 @@ static PLATFORM_INLINE WORD32 ixheaacd_add32_sat(WORD32 a, WORD32 b) { sum = (WORD64)a + (WORD64)b; - if ((((WORD32)a ^ (WORD32)b) & (WORD32)MIN_32) == 0) { - if (((WORD32)sum ^ (WORD32)a) & (WORD32)MIN_32) { - sum = (a < 0) ? MIN_32 : MAX_32; - } - } + if (sum >= MAX_32) return MAX_32; + if (sum <= MIN_32) return MIN_32; return (WORD32)sum; } @@ -212,11 +209,8 @@ static PLATFORM_INLINE WORD32 ixheaacd_sub32_sat(WORD32 a, WORD32 b) { diff = (WORD64)a - (WORD64)b; - if ((((WORD32)a ^ (WORD32)b) & (WORD32)MIN_32) != 0) { - if (((WORD32)diff ^ (WORD32)a) & (WORD32)MIN_32) { - diff = (a < 0L) ? MIN_32 : MAX_32; - } - } + if (diff >= MAX_32) return MAX_32; + if (diff <= MIN_32) return MIN_32; return (WORD32)diff; } diff --git a/decoder/ixheaacd_basic_ops40.h b/decoder/ixheaacd_basic_ops40.h index 8f11089..06fbbb2 100644 --- a/decoder/ixheaacd_basic_ops40.h +++ b/decoder/ixheaacd_basic_ops40.h @@ -293,9 +293,9 @@ static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64(WORD64 sum, WORD32 a, return (sum); } -static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64_7(WORD64 sum, - const WORD32 *a, +static PLATFORM_INLINE WORD64 ixheaacd_mac32x32in64_7(const WORD32 *a, const WORD16 *b) { + WORD64 sum; sum = (WORD64)a[0] * (WORD64)b[0]; sum += (WORD64)a[1] * (WORD64)b[1]; sum += (WORD64)a[2] * (WORD64)b[2]; diff --git a/decoder/ixheaacd_bit_extract.h b/decoder/ixheaacd_bit_extract.h index 4ee2add..44fb4d2 100644 --- a/decoder/ixheaacd_bit_extract.h +++ b/decoder/ixheaacd_bit_extract.h @@ -69,10 +69,10 @@ VOID ixheaacd_acelp_decoding(WORD32 k, ia_usac_data_struct *usac_data, ia_td_frame_data_struct *pstr_td_frame_data, ia_bit_buf_struct *it_bit_buff, WORD32 chan); -VOID ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, WORD32 *quant, - WORD32 k, WORD32 first_tcx_flag, - ia_td_frame_data_struct *pstr_td_frame_data, - ia_bit_buf_struct *it_bit_buff); +IA_ERRORCODE ixheaacd_tcx_coding(ia_usac_data_struct *usac_data, WORD32 *quant, + WORD32 k, WORD32 first_tcx_flag, + ia_td_frame_data_struct *pstr_td_frame_data, + ia_bit_buf_struct *it_bit_buff); WORD32 ixheaacd_win_seq_select(WORD32 window_sequence_curr, WORD32 window_sequence_last); diff --git a/decoder/ixheaacd_bitbuffer.c b/decoder/ixheaacd_bitbuffer.c index 0882689..8b203d4 100644 --- a/decoder/ixheaacd_bitbuffer.c +++ b/decoder/ixheaacd_bitbuffer.c @@ -17,17 +17,18 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ + #include <string.h> -#include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> #include <assert.h> +#include "ixheaacd_sbr_common.h" +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_bitbuffer.h" @@ -50,7 +51,7 @@ WORD32 ixheaacd_skip_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; WORD bit_pos = it_bit_buff->bit_pos; - if (it_bit_buff->cnt_bits < no_of_bits) + if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0) longjmp(*(it_bit_buff->xaac_jmp_buf), IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES); it_bit_buff->cnt_bits -= no_of_bits; @@ -73,7 +74,12 @@ WORD32 ixheaacd_show_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; WORD bit_pos = it_bit_buff->bit_pos; - if (it_bit_buff->cnt_bits < no_of_bits) { + if (no_of_bits == 0) { + return 0; + } + + if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0 || + no_of_bits > 25) { longjmp(*(it_bit_buff->xaac_jmp_buf), IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES); } @@ -81,7 +87,7 @@ WORD32 ixheaacd_show_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { ret_val = (UWORD32)*ptr_read_next; bit_pos -= no_of_bits; - while (bit_pos < 0) { + while (bit_pos < -1) { bit_pos += 8; ptr_read_next++; @@ -90,6 +96,12 @@ WORD32 ixheaacd_show_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { ret_val |= (UWORD32)*ptr_read_next; } + if (bit_pos == -1) { + bit_pos += 8; + ret_val <<= 8; + ptr_read_next++; + } + ret_val = ret_val << ((31 - no_of_bits) - bit_pos) >> (32 - no_of_bits); return ret_val; @@ -104,7 +116,8 @@ WORD32 ixheaacd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { return 0; } - if (it_bit_buff->cnt_bits < no_of_bits) { + if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0 || + no_of_bits > 25) { longjmp(*(it_bit_buff->xaac_jmp_buf), IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES); } @@ -113,25 +126,19 @@ WORD32 ixheaacd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { ret_val = (UWORD32)*ptr_read_next; bit_pos -= no_of_bits; - if (0 == it_bit_buff->cnt_bits) { - while (bit_pos < -1) { - bit_pos += 8; - ptr_read_next++; - ret_val <<= 8; - ret_val |= (UWORD32)*ptr_read_next; - } + while (bit_pos < -1) { bit_pos += 8; - ret_val <<= 8; ptr_read_next++; - } else { - while (bit_pos < 0) { - bit_pos += 8; - ptr_read_next++; - ret_val <<= 8; + ret_val <<= 8; - ret_val |= (UWORD32)*ptr_read_next; - } + ret_val |= (UWORD32)*ptr_read_next; + } + + if (bit_pos == -1) { + bit_pos += 8; + ret_val <<= 8; + ptr_read_next++; } ret_val = ret_val << ((31 - no_of_bits) - bit_pos) >> (32 - no_of_bits); @@ -140,8 +147,8 @@ WORD32 ixheaacd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits) { return ret_val; } -UWORD32 ixheaacd_aac_read_byte(UWORD8 **ptr_read_next, WORD32 *bit_pos, - WORD32 *readword) { +VOID ixheaacd_aac_read_byte(UWORD8 **ptr_read_next, WORD32 *bit_pos, + WORD32 *readword) { UWORD8 *v = *ptr_read_next; WORD32 bits_consumed = *bit_pos; @@ -153,12 +160,11 @@ UWORD32 ixheaacd_aac_read_byte(UWORD8 **ptr_read_next, WORD32 *bit_pos, } *bit_pos = bits_consumed; *ptr_read_next = v; - return 1; + return; } -UWORD32 ixheaacd_aac_read_byte_corr1(UWORD8 **ptr_read_next, - WORD32 *ptr_bit_pos, WORD32 *readword, - UWORD8 *p_bit_buf_end) { +VOID ixheaacd_aac_read_byte_corr1(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, + WORD32 *readword, UWORD8 *p_bit_buf_end) { UWORD8 *v = *ptr_read_next; WORD32 bits_consumed = *ptr_bit_pos; WORD32 temp_bit_count = 0; @@ -174,11 +180,11 @@ UWORD32 ixheaacd_aac_read_byte_corr1(UWORD8 **ptr_read_next, } *ptr_bit_pos = bits_consumed + temp_bit_count; *ptr_read_next = v; - return 1; + return; } -UWORD32 ixheaacd_aac_read_byte_corr(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, - WORD32 *readword, UWORD8 *p_bit_buf_end) { +VOID ixheaacd_aac_read_byte_corr(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, + WORD32 *readword, UWORD8 *p_bit_buf_end) { UWORD8 *v = *ptr_read_next; WORD32 bits_consumed = *ptr_bit_pos; @@ -194,7 +200,7 @@ UWORD32 ixheaacd_aac_read_byte_corr(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, } *ptr_bit_pos = bits_consumed; *ptr_read_next = v; - return 1; + return; } WORD32 ixheaacd_aac_read_bit(ia_bit_buf_struct *it_bit_buff) { @@ -232,7 +238,7 @@ WORD32 ixheaacd_aac_read_bit_rev(ia_bit_buf_struct *it_bit_buff) { UWORD32 temp; WORD no_of_bits = 1; - if (it_bit_buff->cnt_bits < no_of_bits) { + if (it_bit_buff->cnt_bits < no_of_bits || it_bit_buff->cnt_bits < 0) { longjmp(*(it_bit_buff->xaac_jmp_buf), IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES); } diff --git a/decoder/ixheaacd_bitbuffer.h b/decoder/ixheaacd_bitbuffer.h index d029971..f3a23b6 100644 --- a/decoder/ixheaacd_bitbuffer.h +++ b/decoder/ixheaacd_bitbuffer.h @@ -100,9 +100,9 @@ ia_bit_buf_struct *ixheaacd_create_bit_buf(ia_bit_buf_struct *it_bit_buff, UWORD8 *ptr_bit_buf_base, WORD32 bit_buf_size); -ia_bit_buf_struct *ixheaacd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff, - UWORD8 *ptr_bit_buf_base, - WORD32 bit_buf_size); +VOID ixheaacd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff, + UWORD8 *ptr_bit_buf_base, + WORD32 bit_buf_size); WORD32 ixheaacd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits); @@ -116,15 +116,14 @@ VOID ixheaacd_read_bidirection(ia_bit_buf_struct *it_bit_buff, UWORD32 ixheaacd_aac_showbits_32(UWORD8 *ptr_read_next, WORD32 cnt_bits, WORD32 *increment); -UWORD32 ixheaacd_aac_read_byte(UWORD8 **ptr_read_next, WORD32 *bit_pos, - WORD32 *readword); +VOID ixheaacd_aac_read_byte(UWORD8 **ptr_read_next, WORD32 *bit_pos, + WORD32 *readword); -UWORD32 ixheaacd_aac_read_byte_corr(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, - WORD32 *readword, UWORD8 *p_bit_buf_end); +VOID ixheaacd_aac_read_byte_corr(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, + WORD32 *readword, UWORD8 *p_bit_buf_end); -UWORD32 ixheaacd_aac_read_byte_corr1(UWORD8 **ptr_read_next, - WORD32 *ptr_bit_pos, WORD32 *readword, - UWORD8 *p_bit_buf_end); +VOID ixheaacd_aac_read_byte_corr1(UWORD8 **ptr_read_next, WORD32 *ptr_bit_pos, + WORD32 *readword, UWORD8 *p_bit_buf_end); #define get_no_bits_available(it_bit_buff) ((it_bit_buff)->cnt_bits) #define ixheaacd_no_bits_read(it_bit_buff) \ diff --git a/decoder/ixheaacd_block.c b/decoder/ixheaacd_block.c index d67e817..2784edd 100644 --- a/decoder/ixheaacd_block.c +++ b/decoder/ixheaacd_block.c @@ -18,17 +18,17 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_pulsedata.h" @@ -44,7 +44,7 @@ #include "ixheaacd_block.h" #include "ixheaacd_channel.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_tns.h" #include "ixheaacd_sbrdecoder.h" @@ -59,7 +59,9 @@ static PLATFORM_INLINE WORD32 ixheaacd_shr32_drc(WORD32 a, WORD32 b) { WORD32 out_val; b = ((UWORD32)(b << 24) >> 24); - if (b >= 31) { + if (b == 0) { + out_val = a; + } else if (b >= 31) { if (a < 0) out_val = -1; else diff --git a/decoder/ixheaacd_block.h b/decoder/ixheaacd_block.h index 52f9484..739116c 100644 --- a/decoder/ixheaacd_block.h +++ b/decoder/ixheaacd_block.h @@ -65,14 +65,14 @@ VOID ixheaacd_read_scale_factor_data( ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 object_type); -WORD16 ixheaacd_read_spectral_data( +IA_ERRORCODE ixheaacd_read_spectral_data( ia_bit_buf_struct *it_bit_buff, ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 total_channels, WORD32 frame_size, WORD32 object_type, WORD32 aac_spect_data_resil_flag, WORD32 aac_sf_data_resil_flag); -WORD16 ixheaacd_read_section_data( +IA_ERRORCODE ixheaacd_read_section_data( ia_bit_buf_struct *it_bit_buff, ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag, diff --git a/decoder/ixheaacd_channel.c b/decoder/ixheaacd_channel.c index 6ebe402..ddbe43d 100644 --- a/decoder/ixheaacd_channel.c +++ b/decoder/ixheaacd_channel.c @@ -19,18 +19,18 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_error_codes.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -48,7 +48,7 @@ #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_stereo.h" @@ -67,7 +67,7 @@ #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_audioobjtypes.h" #include "ixheaacd_sbrdecoder.h" #include "ixheaacd_memory_standards.h" @@ -198,7 +198,7 @@ WORD32 ixheaacd_read_pulse_data(ia_bit_buf_struct *it_bit_buff, return error_code; } -static WORD16 ixheaacd_read_block_data( +static IA_ERRORCODE ixheaacd_read_block_data( ia_bit_buf_struct *it_bit_buff, ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 total_channels, @@ -308,10 +308,11 @@ static WORD16 ixheaacd_read_block_data( return error_code; } -WORD16 ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff, - ia_ics_info_struct *ptr_ics_info, WORD32 object_type, - WORD32 frame_size, WORD32 ch) { - WORD32 retval = AAC_DEC_OK; +IA_ERRORCODE ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff, + ia_ics_info_struct *ptr_ics_info, + WORD32 object_type, WORD32 frame_size, + WORD32 ch) { + IA_ERRORCODE retval = AAC_DEC_OK; if (ptr_ics_info->predictor_data_present) { if (ch == 0) { @@ -522,7 +523,7 @@ WORD16 ixheaacd_individual_ch_stream( if ((object_type == AOT_ER_AAC_LD) && (aac_dec_handle->pstr_aac_dec_ch_info[LEFT]->common_window) && (ele_type == ID_CPE)) { - WORD16 temp = + IA_ERRORCODE temp = ixheaacd_ltp_decode(it_bit_buff, ptr_ics_info, object_type, aac_dec_handle->samples_per_frame, 1); @@ -580,19 +581,21 @@ VOID ixheaacd_read_ms_data( } } -VOID ixheaacd_channel_pair_process( +IA_ERRORCODE ixheaacd_channel_pair_process( ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info[], WORD32 num_ch, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 total_channels, WORD32 object_type, WORD32 aac_spect_data_resil_flag, WORD32 aac_sf_data_resil_flag, WORD32 *in_data, WORD32 *out_data, void *self_ptr) { WORD32 channel; + IA_ERRORCODE err = IA_NO_ERROR; ia_aac_decoder_struct *self = self_ptr; if (aac_spect_data_resil_flag && ((object_type == AOT_ER_AAC_LD) || (object_type == AOT_ER_AAC_ELD))) { for (channel = 0; channel < num_ch; channel++) { - ixheaacd_cblock_inv_quant_spect_data(ptr_aac_dec_channel_info[channel], - ptr_aac_tables); + err = ixheaacd_cblock_inv_quant_spect_data( + ptr_aac_dec_channel_info[channel], ptr_aac_tables); + if (err) return err; ixheaacd_cblock_scale_spect_data(ptr_aac_dec_channel_info[channel], ptr_aac_tables, num_ch, object_type, aac_sf_data_resil_flag); @@ -665,6 +668,7 @@ VOID ixheaacd_channel_pair_process( NULL); } } + return err; } VOID ixheaacd_set_corr_info( @@ -722,7 +726,7 @@ VOID ixheaacd_pulse_data_apply(ia_pulse_info_struct *ptr_pulse_info, } } -WORD16 ixheaacd_read_spectral_data( +IA_ERRORCODE ixheaacd_read_spectral_data( ia_bit_buf_struct *it_bit_buff, ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 total_channels, @@ -1060,6 +1064,7 @@ WORD32 ixheaacd_cblock_inv_quant_spect_data( ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, ia_aac_dec_tables_struct *ptr_aac_tables) { int window, group, grp_win, band; + IA_ERRORCODE err = IA_NO_ERROR; int sf_bands_transmitted = ptr_aac_dec_channel_info->str_ics_info.max_sfb; WORD8 *ptr_code_book = ptr_aac_dec_channel_info->ptr_code_book; const WORD16 *band_offsets = (WORD16 *)ixheaacd_getscalefactorbandoffsets( @@ -1098,14 +1103,16 @@ WORD32 ixheaacd_cblock_inv_quant_spect_data( if (out1 <= 0) { out1 = sub_d(temp, out1); if (out1 > 127) { - ixheaacd_inv_quant(&out1, ptr_pow_table_Q13); + err = ixheaacd_inv_quant(&out1, ptr_pow_table_Q13); + if (err) return err; } else out1 = ptr_pow_table_Q13[out1]; ptr_spec_coef[i] = -out1; } else { if (out1 > 127) { - ixheaacd_inv_quant(&out1, ptr_pow_table_Q13); + err = ixheaacd_inv_quant(&out1, ptr_pow_table_Q13); + if (err) return err; } else out1 = ptr_pow_table_Q13[out1]; diff --git a/decoder/ixheaacd_channel.h b/decoder/ixheaacd_channel.h index 0bf1b5e..47b740a 100644 --- a/decoder/ixheaacd_channel.h +++ b/decoder/ixheaacd_channel.h @@ -40,7 +40,7 @@ enum { #define LEFT 0 #define RIGHT 1 -VOID ixheaacd_channel_pair_process( +IA_ERRORCODE ixheaacd_channel_pair_process( ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info[], WORD32 num_ch, ia_aac_dec_tables_struct *ptr_aac_tables, WORD32 total_channels, WORD32 object_type, WORD32 aac_spect_data_resil_flag, diff --git a/decoder/ixheaacd_channelinfo.h b/decoder/ixheaacd_channelinfo.h index 1e451c9..b582c0e 100644 --- a/decoder/ixheaacd_channelinfo.h +++ b/decoder/ixheaacd_channelinfo.h @@ -332,8 +332,9 @@ WORD16 ixheaacd_ics_read(ia_bit_buf_struct *it_bit_buff, WORD8 num_swb_window[2], WORD32 object_type, WORD32 common_window, WORD32 frame_size); -WORD16 ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff, - ia_ics_info_struct *ptr_ics_info, WORD32 object_type, - WORD32 frame_size, WORD32 ch); +IA_ERRORCODE ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff, + ia_ics_info_struct *ptr_ics_info, + WORD32 object_type, WORD32 frame_size, + WORD32 ch); #endif /* #ifndef IXHEAACD_CHANNELINFO_H */ diff --git a/decoder/ixheaacd_common_initfuncs.c b/decoder/ixheaacd_common_initfuncs.c index bc5f5ff..d315f1c 100644 --- a/decoder/ixheaacd_common_initfuncs.c +++ b/decoder/ixheaacd_common_initfuncs.c @@ -19,16 +19,15 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" -#include <ixheaacd_type_def.h> #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -50,7 +49,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -75,7 +74,7 @@ #include "ixheaacd_multichannel.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_adts_crc_check.h" #include "ixheaacd_function_selector.h" @@ -147,41 +146,35 @@ ia_bit_buf_struct *ixheaacd_create_bit_buf(ia_bit_buf_struct *it_bit_buff, return it_bit_buff; } -ia_bit_buf_struct *ixheaacd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff, - UWORD8 *ptr_bit_buf_base, - WORD32 bit_buf_size) { +VOID ixheaacd_create_init_bit_buf(ia_bit_buf_struct *it_bit_buff, + UWORD8 *ptr_bit_buf_base, + WORD32 bit_buf_size) { ixheaacd_create_bit_buf(it_bit_buff, ptr_bit_buf_base, bit_buf_size); it_bit_buff->cnt_bits = (bit_buf_size << 3); - return (it_bit_buff); + return; } VOID ixheaacd_read_bidirection(ia_bit_buf_struct *it_bit_buff, WORD32 ixheaacd_drc_offset) { if (ixheaacd_drc_offset != 0) { - WORD32 bit_offset; - + WORD32 byte_offset; + if ((it_bit_buff->cnt_bits < 0) || + (it_bit_buff->cnt_bits - ixheaacd_drc_offset < 0) || + (it_bit_buff->cnt_bits - ixheaacd_drc_offset > it_bit_buff->size)) { + longjmp(*(it_bit_buff->xaac_jmp_buf), + IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES); + } it_bit_buff->cnt_bits = it_bit_buff->cnt_bits - ixheaacd_drc_offset; it_bit_buff->bit_pos = it_bit_buff->bit_pos - ixheaacd_drc_offset; - bit_offset = it_bit_buff->bit_pos >> 3; - it_bit_buff->bit_pos = it_bit_buff->bit_pos - (bit_offset << 3); + byte_offset = it_bit_buff->bit_pos >> 3; + it_bit_buff->bit_pos = it_bit_buff->bit_pos - (byte_offset << 3); - if (bit_offset) { + if (byte_offset) { UWORD8 *ptr_read_next; - WORD32 temp; ptr_read_next = it_bit_buff->ptr_read_next; - ptr_read_next = ptr_read_next - (bit_offset); - - temp = it_bit_buff->ptr_bit_buf_end - it_bit_buff->ptr_bit_buf_base + 1; - - if (ptr_read_next > it_bit_buff->ptr_bit_buf_end) { - ptr_read_next -= temp; - } - - if (ptr_read_next < it_bit_buff->ptr_bit_buf_base) { - ptr_read_next += temp; - } + ptr_read_next = ptr_read_next - (byte_offset); it_bit_buff->ptr_read_next = ptr_read_next; } diff --git a/decoder/ixheaacd_common_lpfuncs.c b/decoder/ixheaacd_common_lpfuncs.c index a9df44e..c9ab2dd 100644 --- a/decoder/ixheaacd_common_lpfuncs.c +++ b/decoder/ixheaacd_common_lpfuncs.c @@ -17,18 +17,16 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include "string.h" +#include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> - -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -50,7 +48,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -77,7 +75,7 @@ #include "ixheaacd_multichannel.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" static PLATFORM_INLINE UWORD32 @@ -217,7 +215,6 @@ VOID ixheaacd_read_data_stream_element(ia_bit_buf_struct *it_bit_buff, } it_bit_buff->ptr_read_next += cnt; it_bit_buff->cnt_bits -= ((cnt) << 3); - } VOID ixheaacd_read_fill_element(ia_bit_buf_struct *it_bit_buff, @@ -250,7 +247,6 @@ VOID ixheaacd_read_fill_element(ia_bit_buf_struct *it_bit_buff, } it_bit_buff->ptr_read_next += count - 1; it_bit_buff->cnt_bits -= ((count - 1) << 3); - } } } diff --git a/decoder/ixheaacd_common_rom.c b/decoder/ixheaacd_common_rom.c index e442f8f..819d6f2 100644 --- a/decoder/ixheaacd_common_rom.c +++ b/decoder/ixheaacd_common_rom.c @@ -18,16 +18,16 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -43,7 +43,7 @@ #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" diff --git a/decoder/ixheaacd_config.h b/decoder/ixheaacd_config.h index c6a540e..c78ce8f 100644 --- a/decoder/ixheaacd_config.h +++ b/decoder/ixheaacd_config.h @@ -161,6 +161,7 @@ typedef struct { #define DRC_BAND_COUNT_MAX BAND_COUNT_MAX #define SPEAKER_POS_COUNT_MAX (128) #define DOWNMIX_COEFF_COUNT_MAX (32 * 32) +#define MAX_AUDIO_PREROLLS 3 typedef struct { UINT32 tw_mdct; @@ -185,10 +186,13 @@ typedef struct { WORD32 usac_ext_ele_payload_present[USAC_MAX_ELEMENTS]; WORD32 usac_cfg_ext_info_len[USAC_MAX_CONFIG_EXTENSIONS]; WORD32 usac_ext_ele_payload_len[USAC_MAX_ELEMENTS]; - WORD32 usac_ext_gain_payload_len; + WORD32 usac_ext_gain_payload_len[MAX_AUDIO_PREROLLS + 2]; UWORD8 usac_cfg_ext_info_buf[USAC_MAX_CONFIG_EXTENSIONS][768]; UWORD8 usac_ext_ele_payload_buf[USAC_MAX_ELEMENTS][768]; - UWORD8 usac_ext_gain_payload_buf[768]; + UWORD8 usac_ext_gain_payload_buf[MAX_AUDIO_PREROLLS * 768]; + UWORD32 preroll_bytes[MAX_AUDIO_PREROLLS + + 2]; // Contain the number of bytes in each preroll + WORD32 preroll_counter; // count the number of prerolls in a frame. WORD32 preroll_flag; diff --git a/decoder/ixheaacd_constants.h b/decoder/ixheaacd_constants.h index 9c8d6d8..3ac0065 100644 --- a/decoder/ixheaacd_constants.h +++ b/decoder/ixheaacd_constants.h @@ -63,9 +63,14 @@ #define MAX_16 (WORD16)0x7fff #define MIN_16 (WORD16)0x8000 +#define MAX_24 (WORD32)0x007fffff +#define MIN_24 (WORD32)0xff800000 + #define NULLPTR ((VOID *)0) #define IT_NULL ((VOID *)0) + +#define ADJ_SCALE 11 /*****************************************************************************/ /* function macros */ /*****************************************************************************/ diff --git a/decoder/ixheaacd_create.c b/decoder/ixheaacd_create.c index 962b98c..6990399 100644 --- a/decoder/ixheaacd_create.c +++ b/decoder/ixheaacd_create.c @@ -22,7 +22,7 @@ #include <string.h> #include <assert.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_cnst.h" @@ -60,13 +60,12 @@ #include "ixheaacd_arith_dec.h" -#include <ixheaacd_type_def.h> #include "ixheaacd_memory_standards.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_common_rom.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -99,19 +98,19 @@ #include "ixheaacd_func_def.h" #include "ixheaacd_interface.h" -extern ia_huff_code_word_struct ixheaacd_huff_book_scl[]; +extern const ia_huff_code_word_struct ixheaacd_huff_book_scl[]; -extern WORD32 ixheaacd_book_scl_index[]; -extern WORD16 ixheaacd_book_scl_code_book[]; +extern const WORD32 ixheaacd_book_scl_index[]; +extern const WORD16 ixheaacd_book_scl_code_book[]; -extern ia_usac_samp_rate_info ixheaacd_samp_rate_info[]; +extern const ia_usac_samp_rate_info ixheaacd_samp_rate_info[]; extern const WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)]; const WORD32 ixheaacd_sampl_freq_idx_table[17] = { 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350, -1, -1, -1, -1}; -static VOID ixheaacd_info_init(ia_usac_samp_rate_info *ptr_samp_info, +static VOID ixheaacd_info_init(const ia_usac_samp_rate_info *ptr_samp_info, WORD32 block_size_samples, ia_sfb_info_struct *pstr_sfb_info_long, ia_sfb_info_struct *pstr_sfb_info_short, @@ -279,8 +278,11 @@ WORD32 ixheaacd_decode_init( for (i = 0; i < MAX_NUM_CHANNELS; i++) { usac_data->str_tddec[i] = &usac_data->arr_str_tddec[i]; - usac_data->str_tddec[i]->fscale = - ((fscale)*usac_data->ccfl) / LEN_SUPERFRAME; + if (usac_data->ccfl == 768) + usac_data->str_tddec[i]->fscale = pstr_stream_config->sampling_frequency; + else + usac_data->str_tddec[i]->fscale = + ((fscale)*usac_data->ccfl) / LEN_SUPERFRAME; usac_data->len_subfrm = usac_data->ccfl / 4; usac_data->num_subfrm = (MAX_NUM_SUBFR * usac_data->ccfl) / LEN_SUPERFRAME; diff --git a/decoder/ixheaacd_decode_main.c b/decoder/ixheaacd_decode_main.c index 8bb71da..7ee1bcd 100644 --- a/decoder/ixheaacd_decode_main.c +++ b/decoder/ixheaacd_decode_main.c @@ -19,21 +19,20 @@ */ #include <stdlib.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" +#include "ixheaacd_constants.h" #include "ixheaacd_error_standards.h" #include "ixheaacd_memory_standards.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_env_extr_part.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_common_rom.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" - #include "ixheaacd_lt_predict.h" - #include "ixheaacd_channelinfo.h" #include "ixheaacd_sbr_common.h" #include "ixheaacd_drc_data_struct.h" @@ -45,44 +44,33 @@ #include "ixheaacd_latmdemux.h" #include "ixheaacd_aacdec.h" #include "ixheaacd_sbr_common.h" - #include "ixheaacd_mps_polyphase.h" #include "ixheaacd_config.h" #include "ixheaacd_mps_dec.h" - #include "ixheaacd_struct_def.h" - -#include <ixheaacd_type_def.h> #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" - #include "ixheaacd_tns_usac.h" #include "ixheaacd_cnst.h" - #include "ixheaacd_acelp_info.h" - #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_info.h" #include "ixheaacd_sbrdecoder.h" #include "ixheaacd_mps_polyphase.h" #include "ixheaacd_sbr_const.h" #include "ixheaacd_main.h" - #include "ixheaacd_arith_dec.h" - #include "ixheaacd_config.h" #include "ixheaacd_struct.h" - #include "ixheaacd_create.h" - #include "ixheaacd_dec_main.h" - +#include "ixheaacd_error_standards.h" VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, WORD32 pcmsize, FLOAT32 (*out_samples)[4096], WORD32 *out_bytes, WORD32 num_channel_out) { WORD32 num; WORD32 i; - WORD64 write_local; + FLOAT32 sample; WORD16 *out_buf = (WORD16 *)outbuffer; @@ -90,31 +78,30 @@ VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, if (pcmsize == 16) { for (i = 0; i < num; i++) { - write_local = - ((WORD64)(out_samples[i % num_channel_out][i / num_channel_out])); + sample = (out_samples[i % num_channel_out][i / num_channel_out]); - if (write_local > 32767) { - write_local = 32767; - } - if (write_local < -32768) { - write_local = -32768; + if (sample > MAX_16) { + sample = MAX_16; + } else if (sample < MIN_16) { + sample = MIN_16; } - out_buf[i] = (WORD16)write_local; + out_buf[i] = (WORD16)sample; } *out_bytes = num * sizeof(WORD16); } else { WORD8 *out_24bit = (WORD8 *)out_buf; for (i = 0; i < num; i++) { - write_local = ((WORD64)( - out_samples[i % num_channel_out][i / num_channel_out] * 256)); + WORD32 write_local; + sample = (out_samples[i % num_channel_out][i / num_channel_out] * 256); - if (write_local > 8388607) { - write_local = 8388607; - } - if (write_local < -8388608) { - write_local = -8388608; + if (sample > MAX_24) { + sample = MAX_24; + } else if (sample < MIN_24) { + sample = MIN_24; } + write_local = (WORD32)sample; + *out_24bit++ = (WORD32)write_local & 0xff; *out_24bit++ = ((WORD32)write_local >> 8) & 0xff; *out_24bit++ = ((WORD32)write_local >> 16) & 0xff; @@ -141,8 +128,7 @@ static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, WORD32 num_pre_roll_frames = 0; WORD32 frame_idx = 0; - WORD32 frame_len[18] = { - 0}; // max of escapedValue(2, 4, 0) i.e. 2^2 -1 + 2^4 -1; + WORD32 frame_len[MAX_AUDIO_PREROLLS] = {0}; WORD32 temp = 0; WORD32 config_len = 0; @@ -196,6 +182,8 @@ static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, num_pre_roll_frames += val_add; } + if (num_pre_roll_frames > MAX_AUDIO_PREROLLS) return IA_FATAL_ERROR; + for (frame_idx = 0; frame_idx < num_pre_roll_frames; frame_idx++) { WORD32 au_len = 0; // escapedValued(16,16,0) au_len = ixheaacd_read_bits_buf(temp_buff, 16); @@ -259,6 +247,7 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, } { + WORD32 tot_out_bytes = 0; pstr_dec_data = (ia_dec_data_struct *)aac_dec_handle->pstr_dec_data; if (frames_done == 0) { @@ -297,6 +286,8 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, config_len = ixheaacd_audio_preroll_parsing(pstr_dec_data, &config[0], &preroll_units, &preroll_frame_offset[0]); + + if (config_len == IA_FATAL_ERROR) return IA_FATAL_ERROR; } if (config_len != 0) { @@ -386,25 +377,61 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, num_samples_out = pstr_dec_data->str_usac_data.output_samples; - ixheaacd_samples_sat(outbuffer, num_samples_out, pcmsize, + ixheaacd_samples_sat((WORD8 *)outbuffer + tot_out_bytes, num_samples_out, + pcmsize, pstr_dec_data->str_usac_data.time_sample_vector, out_bytes, *num_channel_out); - pstr_audio_specific_config->str_usac_config.str_usac_dec_config - .usac_ext_gain_payload_len = - pstr_dec_data->str_frame_data.str_audio_specific_config - .str_usac_config.str_usac_dec_config.usac_ext_gain_payload_len; - memcpy(pstr_audio_specific_config->str_usac_config.str_usac_dec_config - .usac_ext_gain_payload_buf, - pstr_dec_data->str_frame_data.str_audio_specific_config - .str_usac_config.str_usac_dec_config.usac_ext_gain_payload_buf, - pstr_dec_data->str_frame_data.str_audio_specific_config - .str_usac_config.str_usac_dec_config - .usac_ext_gain_payload_len * - sizeof(WORD8)); + { + WORD32 preroll_counter = + pstr_dec_data->str_frame_data.str_audio_specific_config + .str_usac_config.str_usac_dec_config.preroll_counter; + + UWORD8 i; // for looping index used for payload calculation + WORD32 payload_buffer_offset = 0; + WORD32 copy_bytes = + pstr_dec_data->str_frame_data.str_audio_specific_config + .str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[preroll_counter] * + sizeof(WORD8); + + pstr_audio_specific_config->str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[preroll_counter] = + pstr_dec_data->str_frame_data.str_audio_specific_config + .str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[preroll_counter]; + + for (i = 0; i < preroll_counter; i++) + payload_buffer_offset += + pstr_dec_data->str_frame_data.str_audio_specific_config + .str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_len[i] * + sizeof(WORD8); + + memcpy(pstr_audio_specific_config->str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_buf + + payload_buffer_offset, + pstr_dec_data->str_frame_data.str_audio_specific_config + .str_usac_config.str_usac_dec_config + .usac_ext_gain_payload_buf + + payload_buffer_offset, + copy_bytes); + + pstr_audio_specific_config->str_usac_config.str_usac_dec_config + .preroll_bytes[preroll_counter] = *out_bytes; + + preroll_counter++; + + if (preroll_counter > (MAX_AUDIO_PREROLLS + 1)) return IA_FATAL_ERROR; + + pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config + .str_usac_dec_config.preroll_counter = preroll_counter; + } access_units++; preroll_units--; + tot_out_bytes += (*out_bytes); } while (preroll_units >= 0); + *out_bytes = tot_out_bytes; } return err; diff --git a/decoder/ixheaacd_definitions.h b/decoder/ixheaacd_definitions.h index 8762096..78b9af0 100644 --- a/decoder/ixheaacd_definitions.h +++ b/decoder/ixheaacd_definitions.h @@ -39,13 +39,18 @@ #define IA_MPS_DEC_INPUT_IDX (2) #define IA_MPS_DEC_MPS_INPUT_IDX (3) #define IA_MPS_DEC_OUTPUT_IDX (4) +#define IA_MAX_PREROLL_FRAMES (4) +#define IA_MAX_OUTPUT_PCM_SIZE (3) +#define IA_MAX_USAC_CH (2) +#define IA_MAX_OUT_SAMPLES_PER_FRAME (4096) #define IA_ENHAACPLUS_DEC_INP_BUF_SIZE (6144 / 8) #define IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME (1024) -#define IA_ENHAACPLUS_DEC_OUT_BUF_SIZE \ - (2 * IA_ENHAACPLUS_DEC_SAMPLES_PER_FRAME * sizeof(WORD16)) +#define IA_ENHAACPLUS_DEC_OUT_BUF_SIZE \ + (IA_MAX_USAC_CH * IA_MAX_PREROLL_FRAMES * IA_MAX_OUT_SAMPLES_PER_FRAME * \ + IA_MAX_OUTPUT_PCM_SIZE) #define IA_MPS_DEC_INP_BUF_SIZE (0) #define IA_MPS_DEC_OUT_BUF_SIZE (0) diff --git a/decoder/ixheaacd_drc_freq_dec.c b/decoder/ixheaacd_drc_freq_dec.c index 48a83e3..cd6b81d 100644 --- a/decoder/ixheaacd_drc_freq_dec.c +++ b/decoder/ixheaacd_drc_freq_dec.c @@ -18,9 +18,9 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <string.h> -#include "stdio.h" -#include "math.h" -#include <ixheaacd_type_def.h> +#include <stdio.h> +#include <math.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_common.h" #include "ixheaacd_cnst.h" @@ -31,7 +31,7 @@ #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_error_standards.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_defines.h" @@ -56,9 +56,6 @@ #include "ixheaacd_sbr_payload.h" #include "ixheaacd_common_rom.h" - -#include <ixheaacd_type_def.h> - #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" @@ -115,7 +112,7 @@ static PLATFORM_INLINE WORD32 ixheaacd_mult32x16in32_shift25(WORD32 a, return (result); } -static WORD32 ixheaacd_drc_pow_tbl_2_q29[] = { +static const WORD32 ixheaacd_drc_pow_tbl_2_q29[] = { 536870912, 537242967, 537615991, 537988562, 538361391, 538734479, 539108539, 539482144, 539856009, 540230847, 540605230, 540979873, 541354776, 541730654, 542106077, 542481760, 542858421, 543234626, @@ -284,7 +281,7 @@ static WORD32 ixheaacd_drc_pow_tbl_2_q29[] = { 1066324778, 1067063748, 1067804642, 1068544637, 1069285146, 1070027582, 1070769118, 1071511168, 1072253732, 1072998229}; -static WORD32 ixheaacd_drc_pow_tbl_1_2_q29[] = { +static const WORD32 ixheaacd_drc_pow_tbl_1_2_q29[] = { 536870912, 536499115, 536126866, 535755584, 535384559, 535013791, 534642573, 534272319, 533902321, 533531874, 533162389, 532793160, 532424187, 532054765, 531686303, 531318096, 530949443, 530581746, 530214304, 529847117, 529479484, @@ -878,7 +875,7 @@ VOID ixheaacd_drc_apply(ia_drc_dec_struct *pstr_drc_dec, WORD32 drc_band, spec_pos, start_pos, end_pos; WORD32 low_hi, drc_norm, drc_freq_fac; WORD32 drc_fac, div_val, mod_val, ret_val, offset_value; - WORD32 *table; + const WORD32 *table; ixheaac_drc_data_struct *pstr_drc_data; WORD32 num_qmf_sub_sample = (frame_size >> 5); WORD32 num_qmf_sub_sample_by_2 = (frame_size >> 6); diff --git a/decoder/ixheaacd_dsp_fft32x32s.c b/decoder/ixheaacd_dsp_fft32x32s.c index 0e6a89f..d13b053 100644 --- a/decoder/ixheaacd_dsp_fft32x32s.c +++ b/decoder/ixheaacd_dsp_fft32x32s.c @@ -18,18 +18,18 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_dsp_fft32x32s.h" #include "ixheaacd_intrinsics.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" VOID ixheaacd_inv_dit_fft_8pt_dec(WORD32 *y, WORD32 *real, WORD32 *imag) { WORD32 a0, a1, a2, a3, a00, a10, a20, a30; diff --git a/decoder/ixheaacd_env_calc.c b/decoder/ixheaacd_env_calc.c index 8d31290..dd873a8 100644 --- a/decoder/ixheaacd_env_calc.c +++ b/decoder/ixheaacd_env_calc.c @@ -18,12 +18,12 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_intrinsics.h" @@ -33,7 +33,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -47,7 +47,7 @@ #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" @@ -60,7 +60,7 @@ #include "ixheaacd_env_extr.h" #include "ixheaacd_env_calc.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_qmf_dec.h" @@ -664,7 +664,7 @@ VOID ixheaacd_calc_subband_gains(ia_freq_band_data_struct *pstr_freq_band_data, #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3) -VOID ixheaacd_calc_sbrenvelope( +IA_ERRORCODE ixheaacd_calc_sbrenvelope( ia_sbr_scale_fact_struct *ptr_sbr_scale_fac, ia_sbr_calc_env_struct *ptr_sbr_calc_env, ia_sbr_header_data_struct *ptr_header_data, @@ -681,7 +681,7 @@ VOID ixheaacd_calc_sbrenvelope( WORD32 freq_res; WORD32 num_env = ptr_frame_data->str_frame_info_details.num_env; WORD16 *ptr_border_vec = ptr_frame_data->str_frame_info_details.border_vec; - + IA_ERRORCODE err_code = IA_NO_ERROR; WORD16 *ptr_noise_floor; ia_freq_band_data_struct *pstr_freq_band_data = ptr_header_data->pstr_freq_band_data; @@ -809,8 +809,12 @@ VOID ixheaacd_calc_sbrenvelope( start_pos = SBR_TIME_STEP * ptr_border_vec[i]; end_pos = SBR_TIME_STEP * ptr_border_vec[i + 1]; } + if ((start_pos >= MAX_ENV_COLS) || (end_pos > MAX_ENV_COLS)) + return IA_FATAL_ERROR; freq_res = ptr_frame_data->str_frame_info_details.freq_res[i]; + if (noise_floor_idx >= MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR; + if (ptr_border_vec[i] == ptr_frame_data->str_frame_info_details .noise_border_vec[noise_floor_idx + 1]) { @@ -944,6 +948,7 @@ VOID ixheaacd_calc_sbrenvelope( } else { ptr_sbr_calc_env->tansient_env_prev = -1; } + return err_code; } VOID ixheaacd_equalize_filt_buff_exp(WORD16 *ptr_filt_buf, WORD16 *nrg_gain, diff --git a/decoder/ixheaacd_env_calc.h b/decoder/ixheaacd_env_calc.h index 7941ab3..139dae1 100644 --- a/decoder/ixheaacd_env_calc.h +++ b/decoder/ixheaacd_env_calc.h @@ -31,7 +31,7 @@ typedef struct { WORD16 harm_index; } ia_sbr_calc_env_struct; -VOID ixheaacd_calc_sbrenvelope( +IA_ERRORCODE ixheaacd_calc_sbrenvelope( ia_sbr_scale_fact_struct *sbr_scale_factor, ia_sbr_calc_env_struct *ptr_sbr_calc_env, ia_sbr_header_data_struct *ptr_header_data, @@ -45,7 +45,7 @@ VOID ixheaacd_calc_sbrenvelope( VOID ixheaacd_reset_sbrenvelope_calc(ia_sbr_calc_env_struct *ptr_calc_env); -WORD32 ixheaacd_derive_lim_band_tbl( +VOID ixheaacd_derive_lim_band_tbl( ia_sbr_header_data_struct *ptr_header_data, const ia_patch_param_struct *p_str_patch_param, WORD16 num_patches, ixheaacd_misc_tables *pstr_common_tables); diff --git a/decoder/ixheaacd_env_dec.c b/decoder/ixheaacd_env_dec.c index e363def..ac8b3c9 100644 --- a/decoder/ixheaacd_env_dec.c +++ b/decoder/ixheaacd_env_dec.c @@ -18,36 +18,31 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <string.h> +#include <math.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_error_standards.h" - #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" - -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" - #include "ixheaacd_env_extr.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_env_dec.h" #include "ixheaacd_sbr_const.h" - #include "ixheaacd_basic_funcs.h" -#include "math.h" - #define add16_m(a, b) ((a) + (b)) #define sub16_m(a, b) ((a) - (b)) @@ -58,7 +53,7 @@ static VOID ixheaacd_dequant_esbr_env_data(FLOAT32 *ptr_env_sf, WORD32 num_noise_fac, WORD32 amp_res, FLOAT32 *ptr_noise_floor) { WORD32 i; - FLOAT32 array[2] = {0.5f, 1.0f}; + static const FLOAT32 array[2] = {0.5f, 1.0f}; FLOAT32 a_flt = array[amp_res]; for (i = 0; i < num_env_sf; i++) { @@ -328,7 +323,7 @@ VOID ixheaacd_dequant_env_data(ia_sbr_frame_info_data_struct *ptr_sbr_data, WORD32 exponent; WORD32 exp_add = (7 + NRG_EXP_OFFSET); WORD16 *ptr_env_sf = ptr_sbr_data->int_env_sf_arr; - WORD32 mant_arr[2] = {0x4000, 0x5a80}; + static const WORD32 mant_arr[2] = {0x4000, 0x5a80}; amp_res_1 = (1 - amp_res); @@ -433,7 +428,8 @@ IA_ERRORCODE ixheaacd_calc_noise_floor( memcpy(ptr2, ptr1, sizeof(WORD16) * (num_nf_bands)); - if (ptr_sbr_data->coupling_mode != COUPLING_BAL) { + if ((ptr_sbr_data->coupling_mode != COUPLING_BAL) || + (ptr_header_data->usac_flag)) { WORD32 noise_floor_exp, tot_nf_bands; tot_nf_bands = (num_nf_bands * num_noise_env); @@ -551,8 +547,8 @@ VOID ixheaacd_sbr_env_dequant_coup( WORD32 i; FLOAT32 temp_l, temp_r; - FLOAT32 pan_offset[2] = {24.0f, 12.0f}; - FLOAT32 a_arr[2] = {0.5f, 1.0f}; + static const FLOAT32 pan_offset[2] = {24.0f, 12.0f}; + static const FLOAT32 a_arr[2] = {0.5f, 1.0f}; FLOAT32 a = a_arr[amp_res]; @@ -648,6 +644,9 @@ WORD32 ixheaacd_dec_sbrdata(ia_sbr_header_data_struct *ptr_header_data_ch_0, } if (ptr_sbr_data_ch_0->coupling_mode) { + ptr_sbr_data_ch_0->num_noise_sfac = + ptr_header_data_ch_1->pstr_freq_band_data->num_nf_bands * + ptr_sbr_data_ch_1->str_frame_info_details.num_noise_env; ixheaacd_sbr_env_dequant_coup_fix(ptr_header_data_ch_0, ptr_sbr_data_ch_0, ptr_sbr_data_ch_1, ptr_common_tables); diff --git a/decoder/ixheaacd_env_extr.c b/decoder/ixheaacd_env_extr.c index 728d8a1..11d5660 100644 --- a/decoder/ixheaacd_env_extr.c +++ b/decoder/ixheaacd_env_extr.c @@ -18,16 +18,17 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <string.h> +#include <math.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -40,13 +41,11 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" -#include <math.h> - #include "ixheaacd_sbr_const.h" #include "ixheaacd_intrinsics.h" @@ -120,6 +119,7 @@ static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data, WORD32 sum_length = 0; WORD32 length_bits = 4; UWORD8 pvc_id_bits = PVC_ID_BITS; + IA_ERRORCODE err = IA_NO_ERROR; div_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_DIV_MODE_BITS); ns_mode = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, PVC_NS_MODE_BITS); @@ -224,7 +224,7 @@ static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data, for (i = 0; i < PVC_NUM_TIME_SLOTS; i++) { ptr_pvc_data->pvc_id[i] = pvc_id[i]; } - return 0; + return err; } static VOID ixheaacd_pvc_env_dtdf_data( @@ -564,9 +564,10 @@ static WORD16 ixheaacd_validate_frame_info( return 1; } -static WORD16 ixheaacd_read_extn_data( - ia_sbr_header_data_struct *ptr_header_data, ia_ps_dec_struct *ptr_ps_dec, - ia_bit_buf_struct *it_bit_buff, ia_ps_tables_struct *ps_tables_ptr) { +static VOID ixheaacd_read_extn_data(ia_sbr_header_data_struct *ptr_header_data, + ia_ps_dec_struct *ptr_ps_dec, + ia_bit_buf_struct *it_bit_buff, + ia_ps_tables_struct *ps_tables_ptr) { WORD i; WORD extended_data; WORD no_bits_left; @@ -596,7 +597,7 @@ static WORD16 ixheaacd_read_extn_data( case EXTENSION_ID_PS_CODING: if (ptr_ps_dec == NULL) { - return 0; + return; } if (!(ptr_ps_dec->force_mono || ps_read)) { @@ -605,7 +606,7 @@ static WORD16 ixheaacd_read_extn_data( (WORD16)no_bits_left, ps_tables_ptr)); - if (no_bits_left < 0) return 0; + if (no_bits_left < 0) return; ptr_header_data->channel_mode = PS_STEREO; ps_read = 1; @@ -620,11 +621,11 @@ static WORD16 ixheaacd_read_extn_data( } } - if (no_bits_left < 0) return 0; + if (no_bits_left < 0) return; ixheaacd_read_bits_buf(it_bit_buff, no_bits_left); } - return 1; + return; } WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, @@ -671,8 +672,9 @@ WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, ptr_pvc_data->pvc_mode = ptr_header_data->pvc_mode; - ixheaacd_read_esbr_pvc_envelope(ptr_pvc_data, it_bit_buff, - usac_independency_flag); + err_code = ixheaacd_read_esbr_pvc_envelope(ptr_pvc_data, it_bit_buff, + usac_independency_flag); + if (err_code) return err_code; ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data, it_bit_buff, env_extr_tables_ptr); @@ -686,15 +688,14 @@ WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, ptr_frame_data->coupling_mode = COUPLING_OFF; - return 0; + return err_code; } -WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_ps_dec_struct *ptr_ps_dec, - ia_bit_buf_struct *it_bit_buff, - ia_sbr_tables_struct *ptr_sbr_tables, - WORD audio_object_type) { +IA_ERRORCODE ixheaacd_sbr_read_sce( + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct *ptr_frame_data, ia_ps_dec_struct *ptr_ps_dec, + ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables, + WORD audio_object_type) { WORD32 bit; WORD32 i; WORD32 hbe_flag = ptr_header_data->hbe_flag; @@ -702,6 +703,7 @@ WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data, WORD32 usac_flag = ptr_header_data->usac_flag; ia_env_extr_tables_struct *env_extr_tables_ptr = ptr_sbr_tables->env_extr_tables_ptr; + IA_ERRORCODE err = IA_NO_ERROR; ptr_frame_data->coupling_mode = COUPLING_OFF; @@ -712,8 +714,8 @@ WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data, if (audio_object_type == AOT_ER_AAC_ELD || audio_object_type == AOT_ER_AAC_LD) { if (ptr_frame_data->eld_sbr_flag == 1) { - if (!ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data)) - return 0; + err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data); + if (err) return err; } } else { if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data, @@ -797,16 +799,16 @@ WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data, return 1; } -WORD8 ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct **ptr_frame_data, - ia_bit_buf_struct *it_bit_buff, - ia_sbr_tables_struct *ptr_sbr_tables, - WORD audio_object_type) { +IA_ERRORCODE ixheaacd_sbr_read_cpe( + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct **ptr_frame_data, + ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables, + WORD audio_object_type) { WORD32 i, k, bit, num_ch = 2; WORD32 num_if_bands = ptr_header_data->pstr_freq_band_data->num_if_bands; WORD32 hbe_flag = ptr_header_data->hbe_flag; WORD32 usac_flag = ptr_header_data->usac_flag; - + IA_ERRORCODE err = IA_NO_ERROR; ia_env_extr_tables_struct *env_extr_tables_ptr = ptr_sbr_tables->env_extr_tables_ptr; bit = ixheaacd_read_bits_buf(it_bit_buff, 1); @@ -899,8 +901,8 @@ WORD8 ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct *ptr_header_data, if (audio_object_type == AOT_ER_AAC_ELD || audio_object_type == AOT_ER_AAC_LD) { if (ptr_frame_data[i]->eld_sbr_flag == 1) { - if (!ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data[i])) - return 0; + err = ixheaacd_extract_frame_info_ld(it_bit_buff, ptr_frame_data[i]); + if (err) return err; } } else { if (!ixheaacd_sbr_time_freq_grid_info(it_bit_buff, ptr_frame_data[i], @@ -942,13 +944,19 @@ WORD8 ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct *ptr_header_data, ptr_frame_data[1]->sbr_invf_mode[i] = ptr_frame_data[0]->sbr_invf_mode[i]; } - ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0], it_bit_buff, - env_extr_tables_ptr, audio_object_type); + if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[0], + it_bit_buff, env_extr_tables_ptr, + audio_object_type)) { + return 0; + } ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[0], it_bit_buff, env_extr_tables_ptr); - ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1], it_bit_buff, - env_extr_tables_ptr, audio_object_type); + if (!ixheaacd_read_sbr_env_data(ptr_header_data, ptr_frame_data[1], + it_bit_buff, env_extr_tables_ptr, + audio_object_type)) { + return 0; + } ixheaacd_read_sbr_noise_floor_data(ptr_header_data, ptr_frame_data[1], it_bit_buff, env_extr_tables_ptr); @@ -1324,13 +1332,14 @@ WORD16 ixheaacd_read_sbr_env_data( return 1; } -int ixheaacd_extract_frame_info_ld( +IA_ERRORCODE ixheaacd_extract_frame_info_ld( ia_bit_buf_struct *it_bit_buff, ia_sbr_frame_info_data_struct *h_frame_data) { int abs_bord_lead = 0, num_rel_lead = 0, num_rel_trail = 0, bs_num_env = 0, frame_class, temp, env, k, abs_bord_trail = 0, middle_bord = 0, bs_num_noise, transient_env_temp = 0, bs_transient_position = 0; + IA_ERRORCODE err = IA_NO_ERROR; WORD16 time_border[MAX_ENVELOPES + 1]; WORD16 time_border_noise[2 + 1]; WORD16 f[MAX_ENVELOPES + 1]; @@ -1450,7 +1459,7 @@ int ixheaacd_extract_frame_info_ld( memcpy(v_frame_info->noise_border_vec, time_border_noise, (bs_num_noise + 1) * sizeof(WORD16)); - return 1; + return err; } WORD32 ixheaacd_pvc_time_freq_grid_info( @@ -1551,7 +1560,7 @@ WORD16 ixheaacd_sbr_time_freq_grid_info( bs_var_bord = 0, temp = 0; WORD32 freq_res_0 = 0, frame_class; WORD32 abs_bord_lead, abs_bord_trail, num_rel_trail, num_rel_lead; - WORD32 pointer_bits_array[7] = {1, 2, 2, 3, 3, 3, 3}; + static const WORD32 pointer_bits_array[7] = {1, 2, 2, 3, 3, 3, 3}; ia_frame_info_struct *p_fixfix_tab; ia_frame_info_struct *p_frame_info = &ptr_frame_data->str_frame_info_details; @@ -1733,4 +1742,4 @@ WORD16 ixheaacd_sbr_time_freq_grid_info( p_frame_info->border_vec[bs_num_env]; } return 1; -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_env_extr.h b/decoder/ixheaacd_env_extr.h index 109dfe2..32b1421 100644 --- a/decoder/ixheaacd_env_extr.h +++ b/decoder/ixheaacd_env_extr.h @@ -31,6 +31,7 @@ #define ROUNDING (1 << (EXP_BITS - 1)) #define NRG_EXP_OFFSET 16 #define NOISE_EXP_OFFSET 38 +#define MAX_QMF_SUB_BANDS 64 typedef const UWORD16 *ia_huffman_data_type; @@ -100,13 +101,13 @@ typedef struct { WORD32 gate_mode[4]; WORD8 harm_flag_varlen_prev[64]; WORD8 harm_flag_varlen[64]; - FLOAT32 qmapped_pvc[64][48]; - FLOAT32 env_tmp[64][48]; - FLOAT32 noise_level_pvc[64][48]; - FLOAT32 nrg_est_pvc[64][48]; - FLOAT32 nrg_ref_pvc[64][48]; - FLOAT32 nrg_gain_pvc[64][48]; - FLOAT32 nrg_tone_pvc[64][48]; + FLOAT32 qmapped_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; + FLOAT32 env_tmp[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; + FLOAT32 noise_level_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; + FLOAT32 nrg_est_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; + FLOAT32 nrg_ref_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; + FLOAT32 nrg_gain_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; + FLOAT32 nrg_tone_pvc[MAX_QMF_SUB_BANDS][MAX_FREQ_COEFFS_SBR]; WORD32 stereo_config_idx; FLAG reset_flag; FLAG mps_sbr_flag; @@ -118,18 +119,17 @@ typedef struct { } ia_sbr_frame_info_data_struct; -WORD8 ixheaacd_sbr_read_sce(ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_ps_dec_struct *ptr_ps_dec, - ia_bit_buf_struct *it_bit_buff, - ia_sbr_tables_struct *ptr_sbr_tables, - WORD audio_object_type); +IA_ERRORCODE ixheaacd_sbr_read_sce( + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct *ptr_frame_data, ia_ps_dec_struct *ptr_ps_dec, + ia_bit_buf_struct *it_bit_buff, ia_sbr_tables_struct *ptr_sbr_tables, + WORD audio_object_type); -WORD8 ixheaacd_sbr_read_cpe(ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct **ptr_frame_data, - ia_bit_buf_struct *itt_bit_buf, - ia_sbr_tables_struct *ptr_sbr_tables, - WORD audio_object_type); +IA_ERRORCODE ixheaacd_sbr_read_cpe( + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct **ptr_frame_data, + ia_bit_buf_struct *itt_bit_buf, ia_sbr_tables_struct *ptr_sbr_tables, + WORD audio_object_type); WORD32 ixheaacd_sbr_read_header_data( ia_sbr_header_data_struct *ptr_sbr_header, ia_bit_buf_struct *it_bit_buf, @@ -138,8 +138,9 @@ WORD32 ixheaacd_sbr_read_header_data( WORD32 ixheaacd_ssc_huff_dec(ia_huffman_data_type h, ia_bit_buf_struct *it_bit_buff); -int ixheaacd_extract_frame_info_ld(ia_bit_buf_struct *it_bit_buff, - ia_sbr_frame_info_data_struct *h_frame_data); +IA_ERRORCODE ixheaacd_extract_frame_info_ld( + ia_bit_buf_struct *it_bit_buff, + ia_sbr_frame_info_data_struct *h_frame_data); WORD32 ixheaacd_pvc_time_freq_grid_info( ia_bit_buf_struct *it_bit_buff, diff --git a/decoder/ixheaacd_error_handler.h b/decoder/ixheaacd_error_handler.h index 83cbdc1..f4b3ac1 100644 --- a/decoder/ixheaacd_error_handler.h +++ b/decoder/ixheaacd_error_handler.h @@ -40,6 +40,8 @@ #define IA_ERROR_CLASS_E 0xE #define IA_ERROR_CLASS_F 0xF +#define IA_MAX_ERROR_SUB_CODE 28 + typedef struct { pWORD8 pb_module_name; pWORD8 ppb_class_names[16]; diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c index a3382c3..492287d 100644 --- a/decoder/ixheaacd_esbr_envcal.c +++ b/decoder/ixheaacd_esbr_envcal.c @@ -21,7 +21,7 @@ #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_error_standards.h" #include "ixheaacd_sbr_const.h" #include "ixheaacd_sbrdecsettings.h" @@ -30,11 +30,9 @@ #include "ixheaacd_drc_data_struct.h" #include "ixheaacd_drc_dec.h" #include "ixheaacd_sbrdecoder.h" - #include "ixheaacd_bitbuffer.h" - #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_sbr_scale.h" @@ -45,6 +43,8 @@ #include "ixheaacd_esbr_rom.h" +#define ABS(A) fabs(A) + VOID ixheaacd_shellsort(WORD32 *in, WORD32 n) { WORD32 i, j, v; WORD32 inc = 1; @@ -207,12 +207,14 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, } for (i = 0; i < bs_num_env; i++) { + if (kk > MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR; if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++; start_pos = p_frame_info->border_vec[i]; end_pos = p_frame_info->border_vec[i + 1]; - + if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR)) + return IA_FATAL_ERROR; for (t = start_pos; t < end_pos; t++) { band_loop_end = num_sf_bands[p_frame_info->freq_res[i]]; @@ -224,6 +226,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, for (k = 0; k < ui - li; k++) { o = (k + li >= ui2) ? o + 1 : o; + if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR; ui2 = freq_band_table_noise[o + 1]; frame_data->qmapped_pvc[c][t] = @@ -238,12 +241,14 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, next = -1; for (i = 0; i < bs_num_env; i++) { + if (kk > MAX_NOISE_ENVELOPES) return IA_FATAL_ERROR; if (p_frame_info->border_vec[i] == p_frame_info->noise_border_vec[kk]) kk++, next++; start_pos = pvc_frame_info->border_vec[i]; end_pos = pvc_frame_info->border_vec[i + 1]; - + if ((start_pos < 0) || (end_pos > MAX_FREQ_COEFFS_SBR)) + return IA_FATAL_ERROR; for (t = start_pos; t < end_pos; t++) { for (c = 0; c < 64; c++) { env_tmp[c][t] = env_out[64 * t + c]; @@ -301,6 +306,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, for (k = 0; k < ui - li; k++) { o = (k + li >= ui2) ? o + 1 : o; + if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR; ui2 = freq_band_table_noise[o + 1]; nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t]; nrg_tone_pvc[c][t] = 0.0f; @@ -419,6 +425,7 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, for (k = 0; k < ui - li; k++) { o = (k + li >= ui2) ? o + 1 : o; + if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR; ui2 = freq_band_table_noise[o + 1]; nrg_est_pvc[c][t] = (!int_mode) ? nrg : nrg_est_pvc[c][t]; nrg_tone_pvc[c][t] = 0.0f; @@ -610,7 +617,9 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, c -= (ui - li); for (k = 0; k < ui - li; k++) { + FLOAT64 guard = 1e-17; o = (k + li >= ui2) ? o + 1 : o; + if (o >= MAX_NOISE_COEFFS) return IA_FATAL_ERROR; ui2 = frame_data->pstr_sbr_header->pstr_freq_band_data ->freq_band_tbl_noise[o + 1]; nrg_ref[c] = sfb_nrg[m]; @@ -624,16 +633,16 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, (harmonics[c] && (i >= trans_env || (*harm_flag_prev)[c + sub_band_start])) ? sqrt(nrg_ref[c] * tmp / - noise_floor[next * num_nf_bands + o]) + ABS(noise_floor[next * num_nf_bands + o] + guard)) : nrg_tone[c]); } else { if (noise_absc_flag) nrg_gain[c] = (FLOAT32)sqrt(nrg_ref[c] / (nrg_est[c] + 1)); else - nrg_gain[c] = - (FLOAT32)sqrt(nrg_ref[c] * tmp / - ((nrg_est[c] + 1) * - (noise_floor[next * num_nf_bands + o]))); + nrg_gain[c] = (FLOAT32)sqrt( + nrg_ref[c] * tmp / + ((nrg_est[c] + 1) * + ABS(noise_floor[next * num_nf_bands + o] + guard))); } noise_level[c] = (FLOAT32)sqrt(nrg_ref[c] * tmp); c++; @@ -778,6 +787,10 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, frame_data->var_len_id_prev = 1; } + if ((frame_data->str_frame_info_details.num_noise_env < 1) || + (frame_data->str_frame_info_details.num_noise_env > 2)) + return IA_FATAL_ERROR; + for (i = 0; i < num_nf_bands; i++) { prev_env_noise_level[i] = frame_data->flt_noise_floor diff --git a/decoder/ixheaacd_esbr_fft.c b/decoder/ixheaacd_esbr_fft.c index 24916ae..8a5b616 100644 --- a/decoder/ixheaacd_esbr_fft.c +++ b/decoder/ixheaacd_esbr_fft.c @@ -20,9 +20,9 @@ #include <stdio.h> #include <stdlib.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> +#include "ixheaacd_basic_ops32.h" #define PLATFORM_INLINE __inline @@ -35,7 +35,7 @@ (j) = _ >> (m); \ } while (0) -extern FLOAT32 ixheaacd_twiddle_table_fft_float[514]; +extern const FLOAT32 ixheaacd_twiddle_table_fft_float[514]; const FLOAT32 ixheaacd_twidle_tbl_48[64]; const FLOAT32 ixheaacd_twidle_tbl_24[32]; diff --git a/decoder/ixheaacd_esbr_polyphase.c b/decoder/ixheaacd_esbr_polyphase.c index d51a14c..8da3c57 100644 --- a/decoder/ixheaacd_esbr_polyphase.c +++ b/decoder/ixheaacd_esbr_polyphase.c @@ -17,7 +17,8 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include <string.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" #include "ixheaacd_sbr_common.h" @@ -28,7 +29,7 @@ #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbrdecoder.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_sbr_scale.h" @@ -44,8 +45,6 @@ #include "ixheaacd_qmf_poly.h" #include "ixheaacd_esbr_rom.h" -#include "string.h" - WORD32 ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) { WORD32 idx; WORD32 anal_size = 2 * ptr_hbe_txposer->synth_size; @@ -252,4 +251,4 @@ WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, } } return 0; -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_esbr_rom.c b/decoder/ixheaacd_esbr_rom.c index 095e180..9a65972 100644 --- a/decoder/ixheaacd_esbr_rom.c +++ b/decoder/ixheaacd_esbr_rom.c @@ -17,8 +17,9 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_const.h" +#include "ixheaacd_esbr_rom.h" const FLOAT32 ixheaacd_sub_samp_qmf_window_coeff[40 + 80 + 120 + 160 + 200 + 240 + 320 + 400] = { @@ -941,19 +942,18 @@ const FLOAT32 ixheaacd_hphase_tbl[2][8] = {{1.0f, 0.0f, -1.0f, 0.0f}, const FLOAT32 ixheaacd_g_lim_gains[4] = {0.70795f, 1.0f, 1.41254f, 1e10f}; -typedef const FLOAT32 FIR_FILTER[5]; -FIR_FILTER ixheaacd_fir_0 = {1.0f}; -FIR_FILTER ixheaacd_fir_1 = {0.33333333333333f, 0.66666666666666f}; -FIR_FILTER ixheaacd_fir_2 = {0.12500000000000f, 0.37500000000000f, - 0.50000000000000f}; -FIR_FILTER ixheaacd_fir_3 = {0.05857864376269f, 0.20000000000000f, - 0.34142135623731f, 0.40000000000000f}; -FIR_FILTER ixheaacd_fir_4 = {0.03183050093751f, 0.11516383427084f, - 0.21816949906249f, 0.30150283239582f, - 0.33333333333333f}; -FIR_FILTER *ixheaacd_fir_table[5] = {&ixheaacd_fir_0, &ixheaacd_fir_1, - &ixheaacd_fir_2, &ixheaacd_fir_3, - &ixheaacd_fir_4}; +const FIR_FILTER ixheaacd_fir_0 = {1.0f}; +const FIR_FILTER ixheaacd_fir_1 = {0.33333333333333f, 0.66666666666666f}; +const FIR_FILTER ixheaacd_fir_2 = {0.12500000000000f, 0.37500000000000f, + 0.50000000000000f}; +const FIR_FILTER ixheaacd_fir_3 = {0.05857864376269f, 0.20000000000000f, + 0.34142135623731f, 0.40000000000000f}; +const FIR_FILTER ixheaacd_fir_4 = {0.03183050093751f, 0.11516383427084f, + 0.21816949906249f, 0.30150283239582f, + 0.33333333333333f}; +const FIR_FILTER* const ixheaacd_fir_table[5] = { + &ixheaacd_fir_0, &ixheaacd_fir_1, &ixheaacd_fir_2, &ixheaacd_fir_3, + &ixheaacd_fir_4}; const FLOAT32 ixheaacd_q_gamma_table[4] = {0.0f, 1.0f, 2.0f, 4.0f}; const WORD32 ixheaacd_start_subband2kL_tbl[33] = { diff --git a/decoder/ixheaacd_esbr_rom.h b/decoder/ixheaacd_esbr_rom.h index 253f8c3..34eef98 100644 --- a/decoder/ixheaacd_esbr_rom.h +++ b/decoder/ixheaacd_esbr_rom.h @@ -27,13 +27,13 @@ extern const FLOAT32 ixheaacd_hphase_tbl[2][8]; extern const FLOAT32 ixheaacd_g_lim_gains[4]; -typedef const FLOAT32 FIR_FILTER[5]; -extern FIR_FILTER ixheaacd_fir_0; -extern FIR_FILTER ixheaacd_fir_1; -extern FIR_FILTER ixheaacd_fir_2; -extern FIR_FILTER ixheaacd_fir_3; -extern FIR_FILTER ixheaacd_fir_4; -extern FIR_FILTER *ixheaacd_fir_table[5]; +typedef FLOAT32 FIR_FILTER[5]; +extern const FIR_FILTER ixheaacd_fir_0; +extern const FIR_FILTER ixheaacd_fir_1; +extern const FIR_FILTER ixheaacd_fir_2; +extern const FIR_FILTER ixheaacd_fir_3; +extern const FIR_FILTER ixheaacd_fir_4; +extern const FIR_FILTER* const ixheaacd_fir_table[5]; extern const FLOAT32 ixheaacd_q_gamma_table[4]; extern const WORD32 ixheaacd_start_subband2kL_tbl[33]; extern const FLOAT32 ixheaacd_cos_table_trans_qmf[7][32 * 2]; @@ -47,15 +47,15 @@ extern const FLOAT32 ixheaacd_hbe_x_prod_cos_table_trans_3[2 * (128 + 128)]; extern const FLOAT32 ixheaacd_hbe_x_prod_cos_table_trans_4[2 * (128 + 128)]; extern const FLOAT32 ixheaacd_hbe_x_prod_cos_table_trans_4_1[2 * (128 + 128)]; -extern const FLOAT32 ixheaacd_synth_cos_table_kl_4[8 * 4]; -extern const FLOAT32 ixheaacd_synth_cos_table_kl_8[16 * 8]; -extern const FLOAT32 ixheaacd_synth_cos_table_kl_12[24 * 12]; -extern const FLOAT32 ixheaacd_synth_cos_table_kl_16[32 * 16]; +extern const FLOAT32 ixheaacd_synth_cos_table_kl_4[16]; +extern const FLOAT32 ixheaacd_synth_cos_table_kl_8[32]; +extern const FLOAT32 ixheaacd_synth_cos_table_kl_12[48]; +extern const FLOAT32 ixheaacd_synth_cos_table_kl_16[64]; extern const FLOAT32 ixheaacd_synth_cos_table_kl_20[40 * 20]; -extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_8[8 * 8 * 2]; -extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_16[16 * 16 * 2]; -extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_24[24 * 24 * 2]; -extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_32[32 * 32 * 2]; -extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_40[40 * 80 * 2]; +extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_8[32]; +extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_16[64]; +extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_24[96]; +extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_32[128]; +extern const FLOAT32 ixheaacd_analy_cos_sin_table_kl_40[40 * 40 * 2]; extern const FLOAT32 ixheaacd_sel_case[5][8]; #endif diff --git a/decoder/ixheaacd_ext_ch_ele.c b/decoder/ixheaacd_ext_ch_ele.c index 01506e7..f72526d 100644 --- a/decoder/ixheaacd_ext_ch_ele.c +++ b/decoder/ixheaacd_ext_ch_ele.c @@ -21,7 +21,7 @@ #include <string.h> #include <stdlib.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_cnst.h" @@ -50,9 +50,8 @@ #include "ixheaacd_bit_extract.h" #include "ixheaacd_constants.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_func_def.h" @@ -70,7 +69,7 @@ const WORD16 ixheaacd_mdst_fcoeff_long_sin_kbd[] = {-1499, -1876, -17718, 0, const WORD16 ixheaacd_mdst_fcoeff_long_kbd_sin[] = {-1499, 1876, -17718, 0, 17718, -1876, 1499}; -const WORD16 *ixheaacd_mdst_fcoeff_longshort_curr[2][2] = { +const WORD16 *const ixheaacd_mdst_fcoeff_longshort_curr[2][2] = { {ixheaacd_mdst_fcoeff_long_sin, ixheaacd_mdst_fcoeff_long_sin_kbd}, {ixheaacd_mdst_fcoeff_long_kbd_sin, ixheaacd_mdst_fcoeff_long_kbd}}; @@ -83,7 +82,7 @@ const WORD16 ixheaacd_mdst_fcoeff_start_sin_kbd[] = {-3433, -3447, -18608, 0, const WORD16 ixheaacd_mdst_fcoeff_start_kbd_sin[] = {-4863, -1525, -19918, 0, 19918, 1525, 4863}; -const WORD16 *ixheaacd_mdst_fcoeff_start_curr[2][2] = { +const WORD16 *const ixheaacd_mdst_fcoeff_start_curr[2][2] = { {ixheaacd_mdst_fcoeff_start_sin, ixheaacd_mdst_fcoeff_start_sin_kbd}, {ixheaacd_mdst_fcoeff_start_kbd_sin, ixheaacd_mdst_fcoeff_start_kbd}}; @@ -96,7 +95,7 @@ const WORD16 ixheaacd_mdst_fcoeff_stop_sin_kbd[] = {-4863, 1525, -19918, 0, const WORD16 ixheaacd_mdst_fcoeff_stop_kbd_sin[] = {-3433, 3447, -18608, 0, 18608, -3447, 3433}; -const WORD16 *ixheaacd_mdst_fcoeff_stop_cur[2][2] = { +const WORD16 *const ixheaacd_mdst_fcoeff_stop_cur[2][2] = { {ixheaacd_mdst_fcoeff_stop_sin, ixheaacd_mdst_fcoeff_stop_sin_kbd}, {ixheaacd_mdst_fcoeff_stop_kbd_sin, ixheaacd_mdst_fcoeff_stop_kbd}}; @@ -109,7 +108,7 @@ const WORD16 ixheaacd_mdst_fcoeff_stopstart_sin_kbd[] = {-6797, -46, -20808, 0, const WORD16 ixheaacd_mdst_fcoeff_stopstart_kbd_sin[] = {-6797, 46, -20808, 0, 20808, 46, 6797}; -const WORD16 *ixheaacd_mdst_fcoeff_stopstart_cur[2][2] = { +const WORD16 *const ixheaacd_mdst_fcoeff_stopstart_cur[2][2] = { {ixheaacd_mdst_fcoeff_stopstart_sin, ixheaacd_mdst_fcoeff_stopstart_sin_kbd}, {ixheaacd_mdst_fcoeff_stopstart_kbd_sin, @@ -125,10 +124,10 @@ const WORD16 ixheaacd_mdst_fcoeff_stop_stopstart_left_sin[] = { const WORD16 ixheaacd_mdst_fcoeff_stop_stopstart_left_kbd[] = { 857, 866, 871, 873, 871, 866, 857}; -const WORD16 *ixheaacd_mdst_fcoeff_l_s_start_left_prev[2] = { +const WORD16 *const ixheaacd_mdst_fcoeff_l_s_start_left_prev[2] = { ixheaacd_mdst_fcoeff_l_s_start_left_sin, ixheaacd_mdst_fcoeff_l_s_start_left_kbd}; -const WORD16 *ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[2] = { +const WORD16 *const ixheaacd_mdst_fcoeff_stop_stopstart_left_prev[2] = { ixheaacd_mdst_fcoeff_stop_stopstart_left_sin, ixheaacd_mdst_fcoeff_stop_stopstart_left_kbd}; @@ -148,12 +147,12 @@ void ixheaacd_usac_cplx_save_prev(ia_sfb_info_struct *info, WORD32 *l_spec, sizeof(WORD32) * info->bins_per_sbk); } -static WORD32 ixheaacd_cplx_pred_data( +static VOID ixheaacd_cplx_pred_data( ia_usac_data_struct *usac_data, ia_usac_tmp_core_coder_struct *pstr_core_coder, WORD32 num_window_groups, ia_bit_buf_struct *it_bit_buff) { ia_huff_code_book_struct *ptr_huff_code_book = &ixheaacd_book; - ia_huff_code_word_struct *ptr_huff_code_word = + const ia_huff_code_word_struct *ptr_huff_code_word = ptr_huff_code_book->pstr_huff_code_word; WORD32 cplx_pred_all; WORD32 delta_code_time; @@ -252,7 +251,7 @@ static WORD32 ixheaacd_cplx_pred_data( } } - return 1; + return; } static WORD32 ixheaacd_read_ms_mask( @@ -371,14 +370,12 @@ static VOID ixheaacd_filter_and_add(const WORD32 *in, const WORD32 length, out++; for (i = 3; i < length - 4; i += 2) { - sum = 0; - sum = ixheaacd_mac32x32in64_7(sum, &in[i - 3], filter); + sum = ixheaacd_mac32x32in64_7(&in[i - 3], filter); *out = ixheaacd_add32_sat( *out, ixheaacd_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15))); out++; - sum = 0; - sum = ixheaacd_mac32x32in64_7(sum, &in[i - 2], filter); + sum = ixheaacd_mac32x32in64_7(&in[i - 2], filter); *out = ixheaacd_add32_sat( *out, ixheaacd_sat64_32((((WORD64)sum * (WORD64)factor_even) >> 15))); out++; @@ -412,15 +409,13 @@ static VOID ixheaacd_filter_and_add(const WORD32 *in, const WORD32 length, *out, ixheaacd_sat64_32((((WORD64)sum * (WORD64)factor_odd) >> 15))); } -static WORD32 ixheaacd_estimate_dmx_im(const WORD32 *dmx_re, - const WORD32 *dmx_re_prev, - WORD32 *dmx_im, - ia_sfb_info_struct *pstr_sfb_info, - WORD32 window, const WORD32 w_shape, - const WORD32 prev_w_shape) { +static VOID ixheaacd_estimate_dmx_im(const WORD32 *dmx_re, + const WORD32 *dmx_re_prev, WORD32 *dmx_im, + ia_sfb_info_struct *pstr_sfb_info, + WORD32 window, const WORD32 w_shape, + const WORD32 prev_w_shape) { WORD32 i; const WORD16 *mdst_fcoeff_curr, *mdst_fcoeff_prev; - WORD32 err = 0; switch (window) { case ONLY_LONG_SEQUENCE: @@ -464,10 +459,10 @@ static WORD32 ixheaacd_estimate_dmx_im(const WORD32 *dmx_re, dmx_re += pstr_sfb_info->bins_per_sbk; dmx_im += pstr_sfb_info->bins_per_sbk; } - return err; + return; } -static WORD32 ixheaacd_cplx_pred_upmixing( +static VOID ixheaacd_cplx_pred_upmixing( ia_usac_data_struct *usac_data, WORD32 *l_spec, WORD32 *r_spec, ia_usac_tmp_core_coder_struct *pstr_core_coder, WORD32 chn) { ia_sfb_info_struct *pstr_sfb_info = usac_data->pstr_sfb_info[chn]; @@ -476,9 +471,8 @@ static WORD32 ixheaacd_cplx_pred_upmixing( WORD32 grp, sfb, grp_len, i = 0, k; WORD32 *dmx_re_prev = usac_data->dmx_re_prev; - const WORD32(*alpha_q_re)[SFB_NUM_MAX] = usac_data->alpha_q_re; - const WORD32(*alpha_q_im)[SFB_NUM_MAX] = usac_data->alpha_q_im; - WORD32 err = 0; + WORD32(*alpha_q_re)[SFB_NUM_MAX] = usac_data->alpha_q_re; + WORD32(*alpha_q_im)[SFB_NUM_MAX] = usac_data->alpha_q_im; UWORD8(*cplx_pred_used)[SFB_NUM_MAX] = usac_data->cplx_pred_used; @@ -513,11 +507,10 @@ static WORD32 ixheaacd_cplx_pred_upmixing( if (pstr_core_coder->complex_coef) { WORD32 *p_dmx_re_prev = pstr_core_coder->use_prev_frame ? dmx_re_prev : NULL; - err = ixheaacd_estimate_dmx_im(dmx_re, p_dmx_re_prev, dmx_im, pstr_sfb_info, - usac_data->window_sequence[chn], - usac_data->window_shape[chn], - usac_data->window_shape_prev[chn]); - if (err == -1) return err; + ixheaacd_estimate_dmx_im(dmx_re, p_dmx_re_prev, dmx_im, pstr_sfb_info, + usac_data->window_sequence[chn], + usac_data->window_shape[chn], + usac_data->window_shape_prev[chn]); for (grp = 0, i = 0; grp < pstr_sfb_info->num_groups; grp++) { for (grp_len = 0; grp_len < pstr_sfb_info->group_len[grp]; grp_len++) { @@ -570,7 +563,7 @@ static WORD32 ixheaacd_cplx_pred_upmixing( } } - return err; + return; } static VOID ixheaacd_cplx_prev_mdct_dmx(ia_sfb_info_struct *pstr_sfb_info, @@ -867,10 +860,9 @@ WORD32 ixheaacd_core_coder_data(WORD32 id, ia_usac_data_struct *usac_data, if (nr_core_coder_channels == 2 && pstr_core_coder->core_mode[0] == 0 && pstr_core_coder->core_mode[1] == 0) { if (pstr_core_coder->ms_mask_present[0] == 3) { - err_code = ixheaacd_cplx_pred_upmixing( - usac_data, usac_data->coef_fix[left], usac_data->coef_fix[right], - pstr_core_coder, left); - if (err_code == -1) return err_code; + ixheaacd_cplx_pred_upmixing(usac_data, usac_data->coef_fix[left], + usac_data->coef_fix[right], pstr_core_coder, + left); } else if (pstr_core_coder->ms_mask_present[0] > 0) { ixheaacd_ms_stereo( diff --git a/decoder/ixheaacd_fft.c b/decoder/ixheaacd_fft.c index fdc2e13..0932097 100644 --- a/decoder/ixheaacd_fft.c +++ b/decoder/ixheaacd_fft.c @@ -20,10 +20,10 @@ #include <stdlib.h> #include <stdio.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_interface.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> +#include "ixheaacd_basic_ops32.h" #include "ixheaacd_basic_ops40.h" #include "ixheaacd_function_selector.h" @@ -1806,17 +1806,17 @@ VOID ixheaacd_complex_fft_p3(WORD32 *xr, WORD32 *xi, WORD32 nlength, return; } -VOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength, - WORD32 fft_mode, WORD32 *preshift) { +WORD32 ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 nlength, + WORD32 fft_mode, WORD32 *preshift) { if (nlength & (nlength - 1)) { if ((nlength != 24) && (nlength != 48) && (nlength != 96) && (nlength != 192) && (nlength != 384)) { printf("%d point FFT not supported", nlength); - exit(0); + return IA_FATAL_ERROR; } ixheaacd_complex_fft_p3(data_r, data_i, nlength, fft_mode, preshift); } else (*ixheaacd_complex_fft_p2)(data_r, data_i, nlength, fft_mode, preshift); - return; + return 0; } diff --git a/decoder/ixheaacd_freq_sca.c b/decoder/ixheaacd_freq_sca.c index 1694307..f24e344 100644 --- a/decoder/ixheaacd_freq_sca.c +++ b/decoder/ixheaacd_freq_sca.c @@ -22,15 +22,15 @@ #include <stdlib.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -39,7 +39,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" @@ -49,13 +49,13 @@ #include "ixheaacd_freq_sca.h" #include "ixheaacd_intrinsics.h" -WORD32 ixheaacd_samp_rate_table[12] = {92017, 75132, 55426, 46009, - 37566, 27713, 23004, 18783, - 13856, 11502, 9391, 16428320}; +const WORD32 ixheaacd_samp_rate_table[12] = {92017, 75132, 55426, 46009, + 37566, 27713, 23004, 18783, + 13856, 11502, 9391, 16428320}; -WORD32 ixheaacd_v_offset_40[16] = {3 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, - 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, - 2 + 1, 2 + 1, 1 + 1, 0}; +const WORD32 ixheaacd_v_offset_40[16] = { + 3 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, + 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 2 + 1, 1 + 1, 0}; static WORD32 ixheaacd_int_div(WORD32 num, WORD32 den) { if (den != 0) { @@ -105,38 +105,9 @@ VOID ixheaacd_aac_shellsort(WORD16 *in, WORD32 n) { } WORD32 -ixheaacd_calc_start_band(WORD32 fs, const WORD32 start_freq, +ixheaacd_calc_start_band(WORD32 fs_mapped, const WORD32 start_freq, FLOAT32 upsamp_fac) { WORD32 k0_min; - WORD32 fs_mapped = 0; - - if (upsamp_fac == 4) { - fs = fs / 2; - } - - if (fs >= 0 && fs < 18783) { - fs_mapped = 16000; - } else if (fs >= 18783 && fs < 23004) { - fs_mapped = 22050; - } else if (fs >= 23004 && fs < 27713) { - fs_mapped = 24000; - } else if (fs >= 27713 && fs < 35777) { - fs_mapped = 32000; - } else if (fs >= 35777 && fs < 42000) { - fs_mapped = 40000; - } else if (fs >= 42000 && fs < 46009) { - fs_mapped = 44100; - } else if (fs >= 46009 && fs < 55426) { - fs_mapped = 48000; - } else if (fs >= 55426 && fs < 75132) { - fs_mapped = 64000; - } else if (fs >= 75132 && fs < 92017) { - fs_mapped = 88200; - } else if (fs >= 92017) { - fs_mapped = 96000; - } else { - return -1; - } if (upsamp_fac == 4) { if (fs_mapped < 32000) { @@ -253,16 +224,51 @@ ixheaacd_calc_stop_band(WORD32 fs, const WORD32 stop_freq, FLOAT32 upsamp_fac) { result = k1_min; for (i = 0; i < stop_freq; i++) { - result = result + arr_diff_stop_freq[i]; + result = ixheaacd_add32_sat(result, arr_diff_stop_freq[i]); } return (result); } -void ixheaacd_calc_k0_k2_bands(const WORD32 samp_freq, const WORD32 start_freq, - const WORD32 stop_freq, FLOAT32 upsamp_fac, - WORD16 *ptr_k0, WORD16 *ptr_k2) { +IA_ERRORCODE ixheaacd_calc_k0_k2_bands(const WORD32 samp_freq, + const WORD32 start_freq, + const WORD32 stop_freq, + FLOAT32 upsamp_fac, WORD16 *ptr_k0, + WORD16 *ptr_k2) { + IA_ERRORCODE err_code = IA_NO_ERROR; + + WORD32 fs_mapped = 0; + WORD32 fs = samp_freq; + + if (upsamp_fac == 4) { + fs = fs / 2; + } + + if (fs >= 0 && fs < 18783) { + fs_mapped = 16000; + } else if (fs >= 18783 && fs < 23004) { + fs_mapped = 22050; + } else if (fs >= 23004 && fs < 27713) { + fs_mapped = 24000; + } else if (fs >= 27713 && fs < 35777) { + fs_mapped = 32000; + } else if (fs >= 35777 && fs < 42000) { + fs_mapped = 40000; + } else if (fs >= 42000 && fs < 46009) { + fs_mapped = 44100; + } else if (fs >= 46009 && fs < 55426) { + fs_mapped = 48000; + } else if (fs >= 55426 && fs < 75132) { + fs_mapped = 64000; + } else if (fs >= 75132 && fs < 92017) { + fs_mapped = 88200; + } else if (fs >= 92017) { + fs_mapped = 96000; + } else { + return -1; + } + /* Update start_freq struct */ - *ptr_k0 = ixheaacd_calc_start_band(samp_freq, start_freq, upsamp_fac); + *ptr_k0 = ixheaacd_calc_start_band(fs_mapped, start_freq, upsamp_fac); /*Update stop_freq struct */ if (stop_freq < 14) { @@ -277,9 +283,10 @@ void ixheaacd_calc_k0_k2_bands(const WORD32 samp_freq, const WORD32 start_freq, if (*ptr_k2 > 64) { *ptr_k2 = 64; } + return err_code; } -WORD16 ixheaacd_calc_master_frq_bnd_tbl( +IA_ERRORCODE ixheaacd_calc_master_frq_bnd_tbl( ia_freq_band_data_struct *pstr_freq_band_data, ia_sbr_header_data_struct *ptr_header_data, ixheaacd_misc_tables *pstr_common_tables) { @@ -297,13 +304,16 @@ WORD16 ixheaacd_calc_master_frq_bnd_tbl( WORD16 upsamp_fac = ptr_header_data->upsamp_fac; WORD16 *f_master_tbl = pstr_freq_band_data->f_master_tbl; WORD16 num_mf_bands; + IA_ERRORCODE err_code = IA_NO_ERROR; k1 = 0; incr = 0; dk = 0; - ixheaacd_calc_k0_k2_bands(fs, ptr_header_data->start_freq, - ptr_header_data->stop_freq, upsamp_fac, &k0, &k2); + err_code = ixheaacd_calc_k0_k2_bands(fs, ptr_header_data->start_freq, + ptr_header_data->stop_freq, upsamp_fac, + &k0, &k2); + if (err_code) return err_code; if (k2 > NO_SYNTHESIS_CHANNELS) { k2 = NO_SYNTHESIS_CHANNELS; @@ -401,8 +411,7 @@ WORD16 ixheaacd_calc_master_frq_bnd_tbl( num_bands1 = bands * num_bands1; if (ptr_header_data->alter_scale) { - num_bands1 = num_bands1 * (0x6276); - num_bands1 = num_bands1 >> 15; + num_bands1 = (WORD32)(((WORD64)num_bands1 * (0x6276)) >> 15); } num_bands1 = num_bands1 + 0x1000; @@ -421,10 +430,6 @@ WORD16 ixheaacd_calc_master_frq_bnd_tbl( ixheaacd_aac_shellsort(vec_dk0, num_bands0); - if (vec_dk0[0] == 0) { - return -1; - } - f_master_tbl[0] = k0; for (k = 1; k <= num_bands0; k++) @@ -610,7 +615,7 @@ WORD32 ixheaacd_derive_noise_freq_bnd_tbl( kx = pstr_freq_band_data->freq_band_table[HIGH][0]; if (ptr_header_data->noise_bands == 0) { - pstr_freq_band_data->num_nf_bands = 1; + temp = 1; } else { temp = pstr_common_tables->log_dual_is_table[k2] - pstr_common_tables->log_dual_is_table[kx]; @@ -620,13 +625,12 @@ WORD32 ixheaacd_derive_noise_freq_bnd_tbl( if (temp == 0) { temp = 1; } - pstr_freq_band_data->num_nf_bands = temp; } - pstr_freq_band_data->num_if_bands = pstr_freq_band_data->num_nf_bands; - - if (pstr_freq_band_data->num_nf_bands > MAX_NOISE_COEFFS) { + if (temp > MAX_NOISE_COEFFS) { return -1; } + pstr_freq_band_data->num_nf_bands = temp; + pstr_freq_band_data->num_if_bands = pstr_freq_band_data->num_nf_bands; { WORD16 i_k, k; WORD16 num, den; diff --git a/decoder/ixheaacd_func_def.h b/decoder/ixheaacd_func_def.h index d914cb1..07591f1 100644 --- a/decoder/ixheaacd_func_def.h +++ b/decoder/ixheaacd_func_def.h @@ -41,8 +41,8 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, FLOAT32 fsynth[], WORD32 first_lpd_flag, WORD32 short_fac_flag, WORD32 bpf_control_info); -WORD32 ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec, - ia_usac_data_struct *usac_data, WORD32 i_ch); +VOID ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec, + ia_usac_data_struct *usac_data, WORD32 i_ch); VOID ixheaacd_acelp_update(ia_usac_data_struct *usac_data, FLOAT32 signal_out[], ia_usac_lpd_decoder_handle st); @@ -72,8 +72,8 @@ VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data, VOID ixheaacd_fac_decoding(WORD32 fac_len, WORD32 k, WORD32 *fac_prm, ia_bit_buf_struct *it_bit_buff); -VOID ixheaacd_lpc_to_td(FLOAT32 *lpc_coeffs, WORD32 lpc_order, - FLOAT32 *mdct_gains, WORD32 lg); +WORD32 ixheaacd_lpc_to_td(FLOAT32 *lpc_coeffs, WORD32 lpc_order, + FLOAT32 *mdct_gains, WORD32 lg); VOID ixheaacd_noise_shaping(FLOAT32 x[], WORD32 lg, WORD32 fdns_npts, FLOAT32 old_gains[], FLOAT32 new_gains[]); diff --git a/decoder/ixheaacd_function_selector.h b/decoder/ixheaacd_function_selector.h index 99fc367..daa5aac 100644 --- a/decoder/ixheaacd_function_selector.h +++ b/decoder/ixheaacd_function_selector.h @@ -23,7 +23,7 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_intrinsics.h" @@ -34,7 +34,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -48,7 +48,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" @@ -147,12 +147,14 @@ extern VOID (*ixheaacd_complex_fft_p2)(WORD32 *xr, WORD32 *xi, WORD32 nlength, extern VOID (*ixheaacd_mps_complex_fft_64)(WORD32 *ptr_x, WORD32 *fin_re, WORD32 *fin_im, WORD32 nlength); -extern VOID (*ixheaacd_mps_synt_pre_twiddle)(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, +extern VOID (*ixheaacd_mps_synt_pre_twiddle)(WORD32 *ptr_in, + const WORD32 *table_re, + const WORD32 *table_im, WORD32 resolution); -extern VOID (*ixheaacd_mps_synt_post_twiddle)(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, +extern VOID (*ixheaacd_mps_synt_post_twiddle)(WORD32 *ptr_in, + const WORD32 *table_re, + const WORD32 *table_im, WORD32 resolution); extern VOID (*ixheaacd_calc_pre_twid)(WORD32 *ptr_x, WORD32 *r_ptr, @@ -166,8 +168,8 @@ extern VOID (*ixheaacd_calc_post_twid)(WORD32 *ptr_x, WORD32 *r_ptr, const WORD32 *sin_ptr); extern VOID (*ixheaacd_mps_synt_post_fft_twiddle)( - WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state); + WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, + const WORD32 *table_im, WORD32 *state); extern VOID (*ixheaacd_mps_synt_out_calc)(WORD32 resolution, WORD32 *out, WORD32 *state, const WORD32 *filter_coeff); diff --git a/decoder/ixheaacd_fwd_alias_cnx.c b/decoder/ixheaacd_fwd_alias_cnx.c index 32f50b9..4441dab 100644 --- a/decoder/ixheaacd_fwd_alias_cnx.c +++ b/decoder/ixheaacd_fwd_alias_cnx.c @@ -21,7 +21,7 @@ #include <string.h> #include <math.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" #include "ixheaacd_tns_usac.h" @@ -40,9 +40,8 @@ #include "ixheaacd_arith_dec.h" #include "ixheaacd_windows.h" #include "ixheaacd_constants.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_func_def.h" #include "ixheaacd_acelp_com.h" diff --git a/decoder/ixheaacd_hbe_trans.c b/decoder/ixheaacd_hbe_trans.c index 19c8cbb..26965ca 100644 --- a/decoder/ixheaacd_hbe_trans.c +++ b/decoder/ixheaacd_hbe_trans.c @@ -21,7 +21,7 @@ #include <stdlib.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" @@ -42,7 +42,7 @@ #include "ixheaacd_sbr_const.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_sbr_scale.h" @@ -61,8 +61,8 @@ #include "ixheaacd_qmf_poly.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_op.h" #include "ixheaacd_esbr_rom.h" @@ -235,8 +235,9 @@ WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, ptr_hbe_txposer->no_bins * ptr_hbe_txposer->synth_size, ptr_hbe_txposer->synth_size * sizeof(FLOAT32)); - ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns, qmf_buf_real, - qmf_buf_imag); + err_code = ixheaacd_real_synth_filt(ptr_hbe_txposer, num_columns, + qmf_buf_real, qmf_buf_imag); + if (err_code) return err_code; for (i = 0; i < HBE_OPER_WIN_LEN - 1; i++) { memcpy(ptr_hbe_txposer->qmf_in_buf[i], @@ -576,7 +577,7 @@ VOID ixheaacd_hbe_xprod_proc_4(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, max_n1 = max_n2 = max_trans_fac = 0; for (tr = 1; tr < 4; tr++) { - temp_fac = (2.0f * qmf_band_idx + 1 - tr * p) * 0.25; + temp_fac = (2.0 * qmf_band_idx + 1 - tr * p) * 0.25; n1 = ((WORD32)(temp_fac)) << 1; n2 = ((WORD32)(temp_fac + p)) << 1; @@ -1083,7 +1084,7 @@ VOID ixheaacd_hbe_post_anal_xprod2(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, WORD32 n1, n2; FLOAT64 temp_fac; FLOAT32 mag_cmplx_gain = 1.666666667f; - temp_fac = (2.0f * qmf_band_idx + 1 - p) * 0.5; + temp_fac = (2.0 * qmf_band_idx + 1 - p) * 0.5; n1 = ((WORD32)(temp_fac)) << 1; n2 = ((WORD32)(temp_fac + p)) << 1; diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c index f888798..573d67a 100644 --- a/decoder/ixheaacd_headerdecode.c +++ b/decoder/ixheaacd_headerdecode.c @@ -18,22 +18,22 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <stdlib.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_error_standards.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_sbr_common.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_hybrid.h" @@ -316,7 +316,7 @@ WORD32 ixheaacd_find_syncword(ia_adts_header_struct *adts, WORD32 ixheaacd_adtsframe(ia_adts_header_struct *adts, struct ia_bit_buf_struct *it_bit_buff) { WORD32 tmp; - + IA_ERRORCODE err = IA_NO_ERROR; WORD32 crc_reg; ia_adts_crc_info_struct *ptr_adts_crc_info = it_bit_buff->pstr_adts_crc_info; ptr_adts_crc_info->crc_active = 1; @@ -324,7 +324,8 @@ WORD32 ixheaacd_adtsframe(ia_adts_header_struct *adts, ixheaacd_read_bidirection(it_bit_buff, -12); crc_reg = ixheaacd_adts_crc_start_reg(ptr_adts_crc_info, it_bit_buff, CRC_ADTS_HEADER_LEN); - ixheaacd_find_syncword(adts, it_bit_buff); + err = ixheaacd_find_syncword(adts, it_bit_buff); + if (err) return err; tmp = ixheaacd_read_bits_buf(it_bit_buff, 10); @@ -488,6 +489,8 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, WORD32 tmp; WORD32 cnt_bits = it_bit_buff->cnt_bits; WORD32 dummy = 0; + UWORD32 aot_init; + ia_audio_specific_config_struct *pstr_audio_specific_config; memset(aac_state_struct->ia_audio_specific_config, 0, @@ -501,6 +504,8 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, aac_state_struct->p_config->str_prog_config.alignment_bits = it_bit_buff->bit_pos; + aot_init = aac_state_struct->audio_object_type; + aac_state_struct->audio_object_type = ixheaacd_read_bits_buf(it_bit_buff, 5); if (aac_state_struct->audio_object_type == 31) { @@ -541,6 +546,10 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, ixheaacd_read_bits_buf(it_bit_buff, 5); } + if (aac_state_struct->header_dec_done) { + if (aac_state_struct->audio_object_type != aot_init) return IA_FATAL_ERROR; + } + if (((aac_state_struct->audio_object_type >= AOT_AAC_MAIN && aac_state_struct->audio_object_type <= AOT_AAC_LTP) || aac_state_struct->audio_object_type == AOT_AAC_SCAL || @@ -995,9 +1004,11 @@ WORD32 ixheaacd_aac_headerdecode( (header_len - bytes_taken)) { ia_adts_header_struct adts_loc = {0}; - handle_bit_buff = ixheaacd_create_init_bit_buf( + ixheaacd_create_init_bit_buf( &it_bit_buff, (UWORD8 *)(buffer + adts.aac_frame_length), - (WORD16)(header_len - adts.aac_frame_length)); + (WORD16)(header_len - bytes_taken - adts.aac_frame_length)); + + handle_bit_buff = &it_bit_buff; adts_loc.sync_word = (WORD16)ixheaacd_read_bits_buf(handle_bit_buff, 12); diff --git a/decoder/ixheaacd_huff_code_reorder.c b/decoder/ixheaacd_huff_code_reorder.c index c7ef853..0cc07ed 100644 --- a/decoder/ixheaacd_huff_code_reorder.c +++ b/decoder/ixheaacd_huff_code_reorder.c @@ -19,7 +19,7 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" diff --git a/decoder/ixheaacd_huff_tools.c b/decoder/ixheaacd_huff_tools.c index 5b0d39b..e57bf34 100644 --- a/decoder/ixheaacd_huff_tools.c +++ b/decoder/ixheaacd_huff_tools.c @@ -20,29 +20,18 @@ #include <stdlib.h> #include <stdio.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_interface.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_info.h" #include "ixheaacd_bitbuffer.h" -WORD32 ixheaacd_qsort_cmp(const VOID *va, const VOID *vb) { - const ia_huff_code_word_struct *huff1, *huff2; - - huff1 = (ia_huff_code_word_struct *)va; - huff2 = (ia_huff_code_word_struct *)vb; - if (huff1->len < huff2->len) return -1; - if ((huff1->len == huff2->len) && (huff1->code_word < huff2->code_word)) - return -1; - return 1; -} - VOID ixheaacd_hufftab(ia_huff_code_book_struct *ptr_huff_code_book, - ia_huff_code_word_struct *ptr_huff_code_word, - WORD16 *code_book_tbl, WORD32 *index, WORD32 dim, - WORD32 lav, WORD32 lav_incr_esc, WORD32 sign_code_book, - UWORD8 max_code_word_len) { + const ia_huff_code_word_struct *ptr_huff_code_word, + const WORD16 *code_book_tbl, const WORD32 *index, + WORD32 dim, WORD32 lav, WORD32 lav_incr_esc, + WORD32 sign_code_book, UWORD8 max_code_word_len) { WORD32 i, num; if (!sign_code_book) { @@ -64,14 +53,11 @@ VOID ixheaacd_hufftab(ia_huff_code_book_struct *ptr_huff_code_book, ptr_huff_code_book->code_book_tbl = code_book_tbl; ptr_huff_code_book->idx_tbl = index; ptr_huff_code_book->max_code_word_len = max_code_word_len; - - qsort(ptr_huff_code_word, num, sizeof(ia_huff_code_word_struct), - ixheaacd_qsort_cmp); } -WORD32 ixheaacd_huff_codeword(ia_huff_code_word_struct *ptr_huff_code_word, - UWORD16 data_present, - ia_bit_buf_struct *it_bit_buff) +WORD32 ixheaacd_huff_codeword( + const ia_huff_code_word_struct *ptr_huff_code_word, UWORD16 data_present, + ia_bit_buf_struct *it_bit_buff) { WORD32 i, j; diff --git a/decoder/ixheaacd_hufftables.c b/decoder/ixheaacd_hufftables.c index c9c9232..6cf9e1e 100644 --- a/decoder/ixheaacd_hufftables.c +++ b/decoder/ixheaacd_hufftables.c @@ -19,52 +19,51 @@ */ #include <limits.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_interface.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_info.h" -ia_huff_code_word_struct ixheaacd_huff_book_scl[] = { - - {0, 18, 262120}, {1, 18, 262118}, {2, 18, 262119}, {3, 18, 262117}, - {4, 19, 524277}, {5, 19, 524273}, {6, 19, 524269}, {7, 19, 524278}, - {8, 19, 524270}, {9, 19, 524271}, {10, 19, 524272}, {11, 19, 524284}, - {12, 19, 524285}, {13, 19, 524287}, {14, 19, 524286}, {15, 19, 524279}, - {16, 19, 524280}, {17, 19, 524283}, {18, 19, 524281}, {19, 18, 262116}, - {20, 19, 524282}, {21, 18, 262115}, {22, 17, 131055}, {23, 17, 131056}, - {24, 16, 65525}, {25, 17, 131054}, {26, 16, 65522}, {27, 16, 65523}, - {28, 16, 65524}, {29, 16, 65521}, {30, 15, 32758}, {31, 15, 32759}, - {32, 14, 16377}, {33, 14, 16373}, {34, 14, 16375}, {35, 14, 16371}, - {36, 14, 16374}, {37, 14, 16370}, {38, 13, 8183}, {39, 13, 8181}, - {40, 12, 4089}, {41, 12, 4087}, {42, 12, 4086}, {43, 11, 2041}, - {44, 12, 4084}, {45, 11, 2040}, {46, 10, 1017}, {47, 10, 1015}, - {48, 10, 1013}, {49, 9, 504}, {50, 9, 503}, {51, 8, 250}, - {52, 8, 248}, {53, 8, 246}, {54, 7, 121}, {55, 6, 58}, - {56, 6, 56}, {57, 5, 26}, {58, 4, 11}, {59, 3, 4}, - {60, 1, 0}, {61, 4, 10}, {62, 4, 12}, {63, 5, 27}, - {64, 6, 57}, {65, 6, 59}, {66, 7, 120}, {67, 7, 122}, - {68, 8, 247}, {69, 8, 249}, {70, 9, 502}, {71, 9, 505}, - {72, 10, 1012}, {73, 10, 1014}, {74, 10, 1016}, {75, 11, 2037}, - {76, 11, 2036}, {77, 11, 2038}, {78, 11, 2039}, {79, 12, 4085}, - {80, 12, 4088}, {81, 13, 8180}, {82, 13, 8182}, {83, 13, 8184}, - {84, 14, 16376}, {85, 14, 16372}, {86, 16, 65520}, {87, 15, 32756}, - {88, 16, 65526}, {89, 15, 32757}, {90, 18, 262114}, {91, 19, 524249}, - {92, 19, 524250}, {93, 19, 524251}, {94, 19, 524252}, {95, 19, 524253}, - {96, 19, 524254}, {97, 19, 524248}, {98, 19, 524242}, {99, 19, 524243}, - {100, 19, 524244}, {101, 19, 524245}, {102, 19, 524246}, {103, 19, 524274}, - {104, 19, 524255}, {105, 19, 524263}, {106, 19, 524264}, {107, 19, 524265}, - {108, 19, 524266}, {109, 19, 524267}, {110, 19, 524262}, {111, 19, 524256}, - {112, 19, 524257}, {113, 19, 524258}, {114, 19, 524259}, {115, 19, 524260}, - {116, 19, 524261}, {117, 19, 524247}, {118, 19, 524268}, {119, 19, 524276}, - {120, 19, 524275}}; -WORD32 ixheaacd_book_scl_index[33] = { +const ia_huff_code_word_struct ixheaacd_huff_book_scl[] = { + {60, 1, 0}, {59, 3, 4}, {61, 4, 10}, {58, 4, 11}, + {62, 4, 12}, {57, 5, 26}, {63, 5, 27}, {56, 6, 56}, + {64, 6, 57}, {55, 6, 58}, {65, 6, 59}, {66, 7, 120}, + {54, 7, 121}, {67, 7, 122}, {53, 8, 246}, {68, 8, 247}, + {52, 8, 248}, {69, 8, 249}, {51, 8, 250}, {70, 9, 502}, + {50, 9, 503}, {49, 9, 504}, {71, 9, 505}, {72, 10, 1012}, + {48, 10, 1013}, {73, 10, 1014}, {47, 10, 1015}, {74, 10, 1016}, + {46, 10, 1017}, {76, 11, 2036}, {75, 11, 2037}, {77, 11, 2038}, + {78, 11, 2039}, {45, 11, 2040}, {43, 11, 2041}, {44, 12, 4084}, + {79, 12, 4085}, {42, 12, 4086}, {41, 12, 4087}, {80, 12, 4088}, + {40, 12, 4089}, {81, 13, 8180}, {39, 13, 8181}, {82, 13, 8182}, + {38, 13, 8183}, {83, 13, 8184}, {37, 14, 16370}, {35, 14, 16371}, + {85, 14, 16372}, {33, 14, 16373}, {36, 14, 16374}, {34, 14, 16375}, + {84, 14, 16376}, {32, 14, 16377}, {87, 15, 32756}, {89, 15, 32757}, + {30, 15, 32758}, {31, 15, 32759}, {86, 16, 65520}, {29, 16, 65521}, + {26, 16, 65522}, {27, 16, 65523}, {28, 16, 65524}, {24, 16, 65525}, + {88, 16, 65526}, {25, 17, 131054}, {22, 17, 131055}, {23, 17, 131056}, + {90, 18, 262114}, {21, 18, 262115}, {19, 18, 262116}, {3, 18, 262117}, + {1, 18, 262118}, {2, 18, 262119}, {0, 18, 262120}, {98, 19, 524242}, + {99, 19, 524243}, {100, 19, 524244}, {101, 19, 524245}, {102, 19, 524246}, + {117, 19, 524247}, {97, 19, 524248}, {91, 19, 524249}, {92, 19, 524250}, + {93, 19, 524251}, {94, 19, 524252}, {95, 19, 524253}, {96, 19, 524254}, + {104, 19, 524255}, {111, 19, 524256}, {112, 19, 524257}, {113, 19, 524258}, + {114, 19, 524259}, {115, 19, 524260}, {116, 19, 524261}, {110, 19, 524262}, + {105, 19, 524263}, {106, 19, 524264}, {107, 19, 524265}, {108, 19, 524266}, + {109, 19, 524267}, {118, 19, 524268}, {6, 19, 524269}, {8, 19, 524270}, + {9, 19, 524271}, {10, 19, 524272}, {5, 19, 524273}, {103, 19, 524274}, + {120, 19, 524275}, {119, 19, 524276}, {4, 19, 524277}, {7, 19, 524278}, + {15, 19, 524279}, {16, 19, 524280}, {18, 19, 524281}, {20, 19, 524282}, + {17, 19, 524283}, {11, 19, 524284}, {12, 19, 524285}, {14, 19, 524286}, + {13, 19, 524287}}; +const WORD32 ixheaacd_book_scl_index[33] = { 0x00000000, 0x10100004, 0x2040000c, 0x00a0003b, 0x30d0007a, 0x412000fa, 0x516001f9, 0x61c003f9, 0x722007f9, 0x82800ff9, 0x92d01ff8, 0xa3503ff9, 0xb400fff6, 0xc431fff0, 0x0687ffef, 0x0707fff7, 0x0747fffb, 0x0767fffd, 0x0777fffe, 0x0787ffff, 0x0030000b, 0x0060001b, 0x00f000f7, 0x014001f7, 0x01a003f7, 0x020007f7, 0x02600ff7, 0x02c01ff7, 0x03303ff7, 0x03907ff7, 0x0421ffef, 0x14a3ffe8, 0x0587ffdf}; -WORD16 ixheaacd_book_scl_code_book[122] = { +const WORD16 ixheaacd_book_scl_code_book[122] = { 0x0013, 0x0781, 0x0763, 0x07a4, 0x0744, 0x07c4, 0x0725, 0x07e5, 0x0706, 0x0806, 0x06e6, 0x0826, 0x0847, 0x06c7, 0x0867, 0x06a8, 0x0888, 0x0688, 0x08a8, 0x0668, 0x08c9, 0x0649, 0x0629, 0x08e9, 0x090a, 0x060a, 0x092a, diff --git a/decoder/ixheaacd_hybrid.c b/decoder/ixheaacd_hybrid.c index 3dcaa92..49e846a 100644 --- a/decoder/ixheaacd_hybrid.c +++ b/decoder/ixheaacd_hybrid.c @@ -19,15 +19,15 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -37,7 +37,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" diff --git a/decoder/ixheaacd_imdct.c b/decoder/ixheaacd_imdct.c index 02929b0..08a89fc 100644 --- a/decoder/ixheaacd_imdct.c +++ b/decoder/ixheaacd_imdct.c @@ -22,8 +22,8 @@ #include <stdlib.h> #include <string.h> -#include <ixheaacd_type_def.h> -#include <ixheaacd_interface.h> +#include "ixheaacd_type_def.h" +#include "ixheaacd_interface.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -49,9 +49,8 @@ #include "ixheaacd_vec_baisc_ops.h" #include "ixheaacd_constants.h" #include "ixheaacd_function_selector.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_func_def.h" @@ -136,11 +135,12 @@ void ixheaacd_calc_post_twid_dec(WORD32 *xptr, WORD32 *r_ptr, WORD32 *i_ptr, } } -static void ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints, - WORD32 *preshift, WORD32 *tmp_data) { +static WORD32 ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints, + WORD32 *preshift, WORD32 *tmp_data) { WORD32 *data_r; WORD32 *data_i; WORD32 nlength = npoints >> 1; + WORD32 err = 0; const WORD32 *cos_ptr; const WORD32 *sin_ptr; @@ -165,17 +165,20 @@ static void ixheaacd_fft_based_imdct(WORD32 *data, WORD32 npoints, } (*ixheaacd_calc_pre_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr); - ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift); + err = ixheaacd_complex_fft(data_r, data_i, nlength, 1, preshift); + if (err) return err; (*ixheaacd_calc_post_twid)(data, data_r, data_i, nlength, cos_ptr, sin_ptr); + return err; } #define N_LONG_LEN_MAX 1024 -void ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, - WORD32 *tmp_data) { +WORD32 ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, + WORD32 *tmp_data) { WORD32 preshift = 0; WORD32 i; WORD32 k = (npoints / 2); + WORD32 err = 0; while (((k & 1) == 0) & (k != 1)) { k = k >> 1; @@ -189,27 +192,35 @@ void ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, preshift++; } - ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data); + err = ixheaacd_fft_based_imdct(imdct_in, npoints / 2, &preshift, tmp_data); + if (err) return err; preshift += 2; *qshift -= preshift; + return err; } -WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch, - WORD32 n_long, WORD32 lfac, WORD32 *fac_idata) { +IA_ERRORCODE ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch, + WORD32 n_long, WORD32 lfac, + WORD32 *fac_idata, WORD8 *q_fac) { WORD32 gain_fac, scale, k, *i_aq, itemp = 0, *izir; - WORD32 int_aq[ORDER + 1], intzir[2 * LEN_FRAME], x_in[FAC_LENGTH]; + WORD32 int_aq[ORDER + 1] = {0}; + WORD32 intzir[2 * LEN_FRAME] = {0}; + WORD32 x_in[FAC_LENGTH] = {0}; FLOAT32 gain, ztemp, ftemp, pow10, rem10; FLOAT32 qfac1; - WORD8 qshift1, qshift2 = 0, qshift3 = 0; - WORD32 quo, rem, preshift = 0; + WORD8 qshift1 = 0; + WORD8 qshift2 = 0; + WORD8 qshift3 = 0; + WORD32 preshift = 0; + IA_ERRORCODE err = IA_NO_ERROR; FLOAT32 *last_lpc = usac_data->lpc_prev[i_ch]; FLOAT32 *acelp_in = usac_data->acelp_in[i_ch]; WORD32 *fac_data = usac_data->fac_data[i_ch]; WORD32 *ptr_scratch = &usac_data->scratch_buffer[0]; - quo = fac_data[0] / 28; - rem = fac_data[0] % 28; + WORD32 quo = fac_data[0] / 28; + WORD32 rem = fac_data[0] % 28; pow10 = ixheaacd_pow10(quo); rem10 = (FLOAT32)ixheaacd_power_10_table[rem]; @@ -270,9 +281,12 @@ WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch, x_in[lfac / 2 + k] = fac_data[lfac - 2 * k]; } - ixheaacd_fr_alias_cnx_fix(x_in, n_long / 4, lfac, i_aq, izir, fac_idata + 16, - &qshift1, qshift2, qshift3, &preshift, ptr_scratch); + err = ixheaacd_fr_alias_cnx_fix(x_in, n_long / 4, lfac, i_aq, izir, + fac_idata + 16, &qshift1, qshift2, qshift3, + &preshift, ptr_scratch); + if (err) return err; preshift += 4; + *q_fac = (qshift1 - preshift); if (acelp_in != NULL) { for (k = 0; k < 2 * lfac; k++) { @@ -280,13 +294,13 @@ WORD8 ixheaacd_cal_fac_data(ia_usac_data_struct *usac_data, WORD32 i_ch, ixheaacd_mul32_sh(fac_idata[k + 16], gain_fac, (WORD8)(scale)); } } - return (qshift1 - preshift); + return IA_NO_ERROR; } -static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data, - WORD32 i_ch, WORD32 *fac_data_out, - offset_lengths *ixheaacd_drc_offset, - WORD8 fac_q) { +static IA_ERRORCODE ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data, + WORD32 i_ch, WORD32 *fac_data_out, + offset_lengths *ixheaacd_drc_offset, + WORD8 fac_q) { FLOAT32 qfac; WORD32 overlap_data_buf[2 * N_LONG_LEN_MAX] = {0}; WORD32 *window_short, k, *window_short_prev_ptr; @@ -321,9 +335,10 @@ static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data, for (k = 0; k < 8; k++) { shiftp = input_q; - ixheaacd_acelp_imdct(p_in_ibuffer + (k * ixheaacd_drc_offset->n_short), - 2 * ixheaacd_drc_offset->n_short, &shiftp, - scratch_mem); + err_code = ixheaacd_acelp_imdct( + p_in_ibuffer + (k * ixheaacd_drc_offset->n_short), + 2 * ixheaacd_drc_offset->n_short, &shiftp, scratch_mem); + if (err_code) return err_code; } max_shift = @@ -411,10 +426,10 @@ static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data, return 0; } -static WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data, - WORD32 i_ch, WORD32 *fac_idata, - offset_lengths *ixheaacd_drc_offset, - WORD8 fac_q) { +static IA_ERRORCODE ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data, + WORD32 i_ch, WORD32 *fac_idata, + offset_lengths *ixheaacd_drc_offset, + WORD8 fac_q) { FLOAT32 qfac; WORD32 *window_long_prev, k, i, *window_short_prev_ptr; @@ -440,8 +455,9 @@ static WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data, ixheaacd_normalize(p_in_ibuffer, max_shift, ixheaacd_drc_offset->n_long); shiftp = max_shift + 6; - ixheaacd_acelp_imdct(p_in_ibuffer, 2 * ixheaacd_drc_offset->n_long, &shiftp, - scratch_mem); + err_code = ixheaacd_acelp_imdct(p_in_ibuffer, 2 * ixheaacd_drc_offset->n_long, + &shiftp, scratch_mem); + if (err_code) return err_code; max_shift = ixheaacd_calc_max_spectralline(p_in_ibuffer, ixheaacd_drc_offset->n_long); @@ -483,13 +499,13 @@ static WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data, for (i = 0; i < ixheaacd_drc_offset->n_long / 2; i++) { p_overlap_ibuffer[ixheaacd_drc_offset->n_long / 2 + i] = - -p_in_ibuffer[i] >> (shiftp - shift_olap); + ixheaacd_negate32_sat(p_in_ibuffer[i]) >> (shiftp - shift_olap); p_overlap_ibuffer[ixheaacd_drc_offset->n_long / 2 - i - 1] = - -p_in_ibuffer[i] >> (shiftp - shift_olap); + ixheaacd_negate32_sat(p_in_ibuffer[i]) >> (shiftp - shift_olap); } - ixheaacd_scale_down(p_out_ibuffer, p_out_ibuffer, ixheaacd_drc_offset->n_long, - output_q, 15); + ixheaacd_scale_down_adj(p_out_ibuffer, p_out_ibuffer, + ixheaacd_drc_offset->n_long, output_q, 15); if (td_frame_prev) { qfac = 1.0f / (FLOAT32)(1 << 15); @@ -515,6 +531,7 @@ WORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch) { WORD32 td_frame_prev = usac_data->td_frame_prev[i_ch]; WORD32 fac_apply = usac_data->fac_data_present[i_ch]; WORD32 window_sequence = usac_data->window_sequence[i_ch]; + IA_ERRORCODE err = IA_NO_ERROR; ixheaacd_drc_offset.n_long = usac_data->ccfl; ixheaacd_drc_offset.n_short = ixheaacd_drc_offset.n_long >> 3; @@ -537,17 +554,21 @@ WORD32 ixheaacd_fd_frm_dec(ia_usac_data_struct *usac_data, WORD32 i_ch) { ixheaacd_drc_offset.n_trans_ls = ixheaacd_drc_offset.n_short; } - if (fac_apply) - fac_q = ixheaacd_cal_fac_data(usac_data, i_ch, ixheaacd_drc_offset.n_long, - ixheaacd_drc_offset.lfac, fac_idata); - - if (window_sequence != EIGHT_SHORT_SEQUENCE) - ixheaacd_fd_imdct_long(usac_data, i_ch, fac_idata, &ixheaacd_drc_offset, - fac_q); + if (fac_apply) { + err = ixheaacd_cal_fac_data(usac_data, i_ch, ixheaacd_drc_offset.n_long, + ixheaacd_drc_offset.lfac, fac_idata, &fac_q); + if (err) return err; + } - else - ixheaacd_fd_imdct_short(usac_data, i_ch, fac_idata, &ixheaacd_drc_offset, - fac_q); + if (window_sequence != EIGHT_SHORT_SEQUENCE) { + err = ixheaacd_fd_imdct_long(usac_data, i_ch, fac_idata, + &ixheaacd_drc_offset, fac_q); + if (err) return err; + } else { + err = ixheaacd_fd_imdct_short(usac_data, i_ch, fac_idata, + &ixheaacd_drc_offset, fac_q); + if (err) return err; + } - return 0; -}
\ No newline at end of file + return err; +} diff --git a/decoder/ixheaacd_info.h b/decoder/ixheaacd_info.h index d6de7eb..3f4d485 100644 --- a/decoder/ixheaacd_info.h +++ b/decoder/ixheaacd_info.h @@ -61,9 +61,9 @@ typedef struct { WORD32 off; WORD32 sign_code_book; UWORD16 max_code_word_len; - ia_huff_code_word_struct *pstr_huff_code_word; - WORD16 *code_book_tbl; - WORD32 *idx_tbl; + const ia_huff_code_word_struct *pstr_huff_code_word; + const WORD16 *code_book_tbl; + const WORD32 *idx_tbl; } ia_huff_code_book_struct; typedef struct { @@ -98,12 +98,13 @@ typedef struct { extern ia_huff_code_book_struct ixheaacd_book; VOID ixheaacd_hufftab(ia_huff_code_book_struct *ptr_huff_code_book, - ia_huff_code_word_struct *ptr_huff_code_word, - WORD16 *code_book_tbl, WORD32 *index, WORD32 dim, - WORD32 lav, WORD32 lav_incr_esc, WORD32 sign_code_book, - UWORD8 max_code_word_len); + const ia_huff_code_word_struct *ptr_huff_code_word, + const WORD16 *code_book_tbl, const WORD32 *index, + WORD32 dim, WORD32 lav, WORD32 lav_incr_esc, + WORD32 sign_code_book, UWORD8 max_code_word_len); -WORD32 ixheaacd_huff_codeword(ia_huff_code_word_struct *h, UWORD16 data_present, +WORD32 ixheaacd_huff_codeword(const ia_huff_code_word_struct *h, + UWORD16 data_present, ia_bit_buf_struct *it_bit_buff); #endif /* IXHEAACD_INFO_H */ diff --git a/decoder/ixheaacd_init_config.c b/decoder/ixheaacd_init_config.c index 9efd983..fc2dd09 100644 --- a/decoder/ixheaacd_init_config.c +++ b/decoder/ixheaacd_init_config.c @@ -22,7 +22,7 @@ #include <stdarg.h> #include <assert.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" @@ -32,7 +32,7 @@ #include "ixheaacd_env_extr_part.h" #include "ixheaacd_aac_rom.h" #include "ixheaacd_common_rom.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -66,6 +66,11 @@ #include "ixheaacd_error_codes.h" +static const WORD32 sampling_rate_tbl[] = { + 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, + 8000, 7350, 0, 0, 57600, 51200, 40000, 38400, 34150, 28800, 25600, + 20000, 19200, 17075, 14400, 12800, 9600, 0, 0, 0}; + UWORD32 ixheaacd_sbr_ratio(UWORD32 core_sbr_framelength_idx) { UWORD32 sbr_ratio_index = 0x0FF; @@ -88,22 +93,13 @@ UWORD32 ixheaacd_sbr_ratio(UWORD32 core_sbr_framelength_idx) { return sbr_ratio_index; } -WORD32 ixheaacd_get_sample_freq_indx(WORD32 sampling_freq) { - WORD32 sampling_rate_tbl[] = {96000, 88200, 64000, 48000, 44100, 32000, - 24000, 22050, 16000, 12000, 11025, 8000, - 7350, 0, 0, 0}; - +static WORD32 ixheaacd_get_sample_freq_indx(WORD32 sampling_freq) { WORD32 index; - WORD32 tbl_size = sizeof(sampling_rate_tbl) / sizeof(WORD32) - 1; + const WORD32 tbl_size = sizeof(sampling_rate_tbl) / sizeof(WORD32) - 1; for (index = 0; index < tbl_size; index++) { if (sampling_rate_tbl[index] == sampling_freq) break; } - - if (index > tbl_size) { - return tbl_size - 1; - } - return index; } UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx, @@ -192,6 +188,11 @@ static VOID ixheaacd_get_usac_chan_conf(ia_usac_config_struct *pstr_usac_config, pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_L; pstr_usac_config->output_channel_pos[1] = BS_OUTPUT_CHANNEL_POS_R; break; + case 8: + pstr_usac_config->num_out_channels = 2; + pstr_usac_config->output_channel_pos[0] = BS_OUTPUT_CHANNEL_POS_NA; + pstr_usac_config->output_channel_pos[1] = BS_OUTPUT_CHANNEL_POS_NA; + break; default: assert(0); @@ -292,7 +293,7 @@ WORD32 ixheaacd_ext_element_config( return 0; } -VOID ixheaacd_mps212_config( +IA_ERRORCODE ixheaacd_mps212_config( ia_bit_buf_struct *it_bit_buff, ia_usac_dec_mps_config_struct *pstr_usac_mps212_config, WORD32 stereo_config_index) { @@ -306,6 +307,8 @@ VOID ixheaacd_mps212_config( pstr_usac_mps212_config->bs_decorr_config = ixheaacd_read_bits_buf(it_bit_buff, 2); + if (pstr_usac_mps212_config->bs_decorr_config > MAX_DECOR_CONFIG_IDX) + return IA_FATAL_ERROR; pstr_usac_mps212_config->bs_high_rate_mode = ixheaacd_read_bits_buf(it_bit_buff, 1); @@ -319,12 +322,17 @@ VOID ixheaacd_mps212_config( if (pstr_usac_mps212_config->bs_ott_bands_phase_present) { pstr_usac_mps212_config->bs_ott_bands_phase = ixheaacd_read_bits_buf(it_bit_buff, 5); + if (pstr_usac_mps212_config->bs_ott_bands_phase > MAX_PARAMETER_BANDS) + return IA_FATAL_ERROR; } if (stereo_config_index > 1) { pstr_usac_mps212_config->bs_residual_bands = ixheaacd_read_bits_buf(it_bit_buff, 5); + if (pstr_usac_mps212_config->bs_residual_bands > MAX_PARAMETER_BANDS) + return IA_FATAL_ERROR; + pstr_usac_mps212_config->bs_ott_bands_phase = max(pstr_usac_mps212_config->bs_ott_bands_phase, pstr_usac_mps212_config->bs_residual_bands); @@ -336,9 +344,11 @@ VOID ixheaacd_mps212_config( if (pstr_usac_mps212_config->bs_temp_shape_config == 2) pstr_usac_mps212_config->bs_env_quant_mode = ixheaacd_read_bits_buf(it_bit_buff, 1); + + return IA_NO_ERROR; } -VOID ixheaacd_cpe_config( +IA_ERRORCODE ixheaacd_cpe_config( ia_bit_buf_struct *it_bit_buff, ia_usac_dec_element_config_struct *pstr_usac_element_config, WORD32 sbr_ratio_index) { @@ -357,9 +367,11 @@ VOID ixheaacd_cpe_config( } if (pstr_usac_element_config->stereo_config_index > 0) - ixheaacd_mps212_config(it_bit_buff, - &(pstr_usac_element_config->str_usac_mps212_config), - pstr_usac_element_config->stereo_config_index); + return ixheaacd_mps212_config( + it_bit_buff, &(pstr_usac_element_config->str_usac_mps212_config), + pstr_usac_element_config->stereo_config_index); + + return IA_NO_ERROR; } WORD32 ixheaacd_decoder_config( @@ -393,7 +405,7 @@ WORD32 ixheaacd_decoder_config( ixheaacd_read_bits_buf(it_bit_buff, 1); pstr_usac_element_config->noise_filling = ixheaacd_read_bits_buf(it_bit_buff, 1); - + pstr_usac_element_config->stereo_config_index = 0; if (sbr_ratio_index > 0) ixheaacd_sbr_config(it_bit_buff, &(pstr_usac_element_config->str_usac_sbr_config)); @@ -401,8 +413,9 @@ WORD32 ixheaacd_decoder_config( break; case ID_USAC_CPE: - ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, - sbr_ratio_index); + if (ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, + sbr_ratio_index) != IA_NO_ERROR) + return IA_FATAL_ERROR; if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2) return -1; @@ -412,6 +425,7 @@ WORD32 ixheaacd_decoder_config( pstr_usac_element_config->tw_mdct = 0; pstr_usac_element_config->noise_filling = 0; + pstr_usac_element_config->stereo_config_index = 0; break; case ID_USAC_EXT: @@ -462,6 +476,8 @@ WORD32 ixheaacd_config_extension( ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_type), 4, 8, 16); ixheaacd_read_escape_value(it_bit_buff, &(usac_config_ext_len), 4, 8, 16); + if (usac_config_ext_len > 768) return IA_FATAL_ERROR; + switch (usac_config_ext_type) { case ID_CONFIG_EXT_FILL: for (i = 0; i < usac_config_ext_len; i++) { @@ -509,12 +525,6 @@ WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, } } else { - static const WORD32 sampling_rate_tbl[] = { - 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, - 16000, 12000, 11025, 8000, 7350, 0, 0, 57600, - 51200, 40000, 38400, 34150, 28800, 25600, 20000, 19200, - 17075, 14400, 12800, 9600, 0, 0, 0}; - pstr_usac_conf->usac_sampling_frequency = sampling_rate_tbl[pstr_usac_conf->usac_sampling_frequency_index]; } @@ -527,7 +537,9 @@ WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, pstr_usac_conf->channel_configuration_index = ixheaacd_read_bits_buf(it_bit_buff, 5); - if (pstr_usac_conf->channel_configuration_index >= 3) return -1; + if ((pstr_usac_conf->channel_configuration_index >= 3) && + (pstr_usac_conf->channel_configuration_index != 8)) + return -1; if (pstr_usac_conf->channel_configuration_index == 0) { UWORD32 i; diff --git a/decoder/ixheaacd_initfuncs.c b/decoder/ixheaacd_initfuncs.c index e95f504..c00dc74 100644 --- a/decoder/ixheaacd_initfuncs.c +++ b/decoder/ixheaacd_initfuncs.c @@ -18,23 +18,23 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_common.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_definitions.h" @@ -56,13 +56,10 @@ #include "ixheaacd_sbr_payload.h" #include "ixheaacd_common_rom.h" - -#include <ixheaacd_type_def.h> - #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_hybrid.h" diff --git a/decoder/ixheaacd_interface.h b/decoder/ixheaacd_interface.h index 07f7963..4a9c263 100644 --- a/decoder/ixheaacd_interface.h +++ b/decoder/ixheaacd_interface.h @@ -71,17 +71,22 @@ VOID ixheaacd_complex_ifft_p2_asm(const WORD32 *table, WORD32 nlength, VOID ixheaacd_complex_fft_p2_asm(const WORD32 *table, WORD32 nlength, WORD32 *ptr_x, WORD32 *ptr_y); -VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, WORD32 resolution); +VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 resolution); -VOID ixheaacd_mps_synt_pre_twiddle_armv7(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, WORD32 resolution); +VOID ixheaacd_mps_synt_pre_twiddle_armv7(WORD32 *ptr_in, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 resolution); -VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, WORD32 resolution); +VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 resolution); -VOID ixheaacd_mps_synt_post_twiddle_armv7(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, WORD32 resolution); +VOID ixheaacd_mps_synt_post_twiddle_armv7(WORD32 *ptr_in, + const WORD32 *table_re, + const WORD32 *table_im, + WORD32 resolution); VOID ixheaacd_calc_pre_twid_dec(WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, WORD32 nlength, const WORD32 *cos_ptr, @@ -100,12 +105,16 @@ VOID ixheaacd_calc_post_twid_armv7(WORD32 *ptr_x, WORD32 *r_ptr, WORD32 *i_ptr, const WORD32 *sin_ptr); VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re, - WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state); + WORD32 *fin_im, + const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state); VOID ixheaacd_mps_synt_post_fft_twiddle_armv7(WORD32 resolution, WORD32 *fin_re, - WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state); + WORD32 *fin_im, + const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state); VOID ixheaacd_mps_synt_out_calc_dec(WORD32 resolution, WORD32 *out, WORD32 *state, const WORD32 *filter_coeff); diff --git a/decoder/ixheaacd_latmdemux.c b/decoder/ixheaacd_latmdemux.c index 09c609d..ecceb04 100644 --- a/decoder/ixheaacd_latmdemux.c +++ b/decoder/ixheaacd_latmdemux.c @@ -19,7 +19,7 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" #include "ixheaacd_basic_ops16.h" @@ -27,7 +27,7 @@ #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_defines.h" @@ -53,9 +53,6 @@ #include "ixheaacd_sbr_payload.h" #include "ixheaacd_common_rom.h" - -#include <ixheaacd_type_def.h> - #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" diff --git a/decoder/ixheaacd_longblock.c b/decoder/ixheaacd_longblock.c index 7ac686b..1f41387 100644 --- a/decoder/ixheaacd_longblock.c +++ b/decoder/ixheaacd_longblock.c @@ -18,18 +18,18 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_bitbuffer.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_pulsedata.h" @@ -58,7 +58,7 @@ #define LONG_BLOCK_SECT_LEN 5 #define SHORT_BLOCK_SECT_LEN 3 -WORD16 ixheaacd_read_section_data( +IA_ERRORCODE ixheaacd_read_section_data( ia_bit_buf_struct *it_bit_buff, ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD32 aac_spect_data_resil_flag, WORD32 aac_sect_data_resil_flag, diff --git a/decoder/ixheaacd_lpc.c b/decoder/ixheaacd_lpc.c index a1c9fb6..6bbb902 100644 --- a/decoder/ixheaacd_lpc.c +++ b/decoder/ixheaacd_lpc.c @@ -24,7 +24,7 @@ #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" #include "ixheaacd_tns_usac.h" @@ -46,8 +46,8 @@ #include "ixheaacd_windows.h" #include "ixheaacd_acelp_com.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #define LSF_GAP_F 50.0f #define FREQ_MAX_F 6400.0f @@ -57,7 +57,7 @@ extern const FLOAT32 lsf_init[ORDER]; extern const FLOAT32 ixheaacd_fir_lp_filt[1 + FILTER_DELAY]; -WORD32 ixheaacd_pow_10_i_by_128[128] = { +const WORD32 ixheaacd_pow_10_i_by_128[128] = { 16384, 17788, 19312, 20968, 22765, 24716, 26835, 29135, 31632, 34343, 37287, 40483, 43953, 47720, 51810, 56251, 61072, 66307, 71990, 78161, 84860, @@ -137,6 +137,19 @@ void ixheaacd_reset_acelp_data_fix(ia_usac_data_struct *usac_data, for (i = 0; i < (usac_data->ccfl) / 2 - fac_length; i++) { ptr_overlap_buf[(usac_data->ccfl) / 2 + fac_length + i] = 0; } + + if (ptr_overlap_buf != NULL) { + for (i = 0; i < (usac_data->len_subfrm) / 2 - fac_length; i++) { + st->exc_prev[i] = 0.0f; + } + for (i = 0; i < 2 * fac_length + 1; i++) { + st->exc_prev[(usac_data->len_subfrm) / 2 - fac_length + i] = + ptr_overlap_buf[i + usac_data->ccfl / 2 - fac_length - 1] / + (float)(16384); + } + } else { + ixheaacd_memset(st->exc_prev, 1 + (2 * FAC_LENGTH)); + } } return; @@ -155,7 +168,6 @@ VOID ixheaacd_fix2flt_data(ia_usac_data_struct *usac_data, } ixheaacd_memset(st->lp_flt_coeff_a_prev, 2 * (ORDER + 1)); - ixheaacd_memset(st->exc_prev, 1 + (2 * FAC_LENGTH)); ixheaacd_memset(st->xcitation_prev, MAX_PITCH + INTER_LP_FIL_ORDER + 1); ixheaacd_memset(st->synth_prev, MAX_PITCH + SYNTH_DELAY_LMAX); ixheaacd_memset(st->bpf_prev, FILTER_DELAY + LEN_SUBFR); @@ -421,10 +433,10 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, memcpy(ptr_scratch, &pstr_td_frame_data->fac_data[0], 129 * sizeof(WORD32)); - for (i = 0; i < 64; i++) { + for (i = 0; i < fac_length / 2; i++) { pstr_td_frame_data->fac_data[i] = ptr_scratch[2 * i + 1] << 16; - pstr_td_frame_data->fac_data[64 + i] = ptr_scratch[fac_length - 2 * i] - << 16; + pstr_td_frame_data->fac_data[fac_length / 2 + i] = + ptr_scratch[fac_length - 2 * i] << 16; } err = ixheaacd_fwd_alias_cancel_tool(usac_data, pstr_td_frame_data, @@ -505,8 +517,9 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, ixheaacd_interpolation_lsp_params(st->lspold, lsp_curr, lp_flt_coff_a, num_subfr); - ixheaacd_acelp_alias_cnx(usac_data, pstr_td_frame_data, k, lp_flt_coff_a, - stability_factor, st); + err = ixheaacd_acelp_alias_cnx(usac_data, pstr_td_frame_data, k, + lp_flt_coff_a, stability_factor, st); + if (err) return err; if ((st->mode_prev != 0) && bpf_control_info) { i = (k * num_subfr) + num_subfr_by2; @@ -533,8 +546,9 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, ixheaacd_lpc_coef_gen(st->lspold, lsp_curr, lp_flt_coff_a, n_subfr, ORDER); - ixheaacd_tcx_mdct(usac_data, pstr_td_frame_data, k, lp_flt_coff_a, - subfr_len, st); + err = ixheaacd_tcx_mdct(usac_data, pstr_td_frame_data, k, lp_flt_coff_a, + subfr_len, st); + if (err) return err; k += (1 << (mode - 1)); } @@ -596,9 +610,9 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, return err; } -WORD32 ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec, - ia_usac_data_struct *usac_data, WORD32 i_ch) { - WORD32 err = 0, i, k; +VOID ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec, + ia_usac_data_struct *usac_data, WORD32 i_ch) { + WORD32 i, k; WORD32 *ptr_overlap = &usac_data->overlap_data_ptr[i_ch][0]; WORD32 len_fr, lpd_sbf_len, lpd_delay, num_subfr_by2, synth_delay, fac_length; @@ -637,7 +651,7 @@ WORD32 ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec, (1 + (2 * FAC_LENGTH)) * sizeof(FLOAT32)); } - return err; + return; } WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, @@ -707,7 +721,7 @@ WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, signal_out, (lpd_sbf_len + 2) * LEN_SUBFR + LEN_SUBFR, - len_fr - (lpd_sbf_len + 2) * LEN_SUBFR, + len_fr - (lpd_sbf_len + 4) * LEN_SUBFR, st->bpf_prev); if (err != 0) return err; diff --git a/decoder/ixheaacd_lpc_dec.c b/decoder/ixheaacd_lpc_dec.c index f7c8892..3dda040 100644 --- a/decoder/ixheaacd_lpc_dec.c +++ b/decoder/ixheaacd_lpc_dec.c @@ -17,10 +17,8 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#define DEBUG - #include <math.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" #include "ixheaacd_tns_usac.h" @@ -38,16 +36,16 @@ #include "ixheaacd_func_def.h" #include "ixheaacd_acelp_com.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #define LSF_GAP 50.0f #define FREQ_MAX 6400.0f #define FREQ_DIV 400.0f -static FLOAT32 factor_table[4] = {60.0f, 65.0f, 64.0f, 63.0f}; +static const FLOAT32 factor_table[4] = {60.0f, 65.0f, 64.0f, 63.0f}; VOID ixheaacd_lsf_weight_2st_flt(FLOAT32 *lsfq, FLOAT32 *w, WORD32 mode) { WORD32 i; @@ -102,12 +100,12 @@ static WORD32 ixheaacd_decoding_avq_tool(WORD32 *read_arr, WORD32 *nvecq) { static WORD32 ixheaacd_avq_first_approx_abs(FLOAT32 *lsf, WORD32 *indx) { WORD32 i; - extern FLOAT32 ixheaacd_dico_lsf_abs_8b_flt[]; - extern FLOAT32 ixheaacd_weight_table_avq[]; + extern const FLOAT32 ixheaacd_dico_lsf_abs_8b_flt[]; + extern const FLOAT32 ixheaacd_weight_table_avq[]; WORD32 position = 0; WORD32 avq[ORDER]; FLOAT32 d[ORDER + 1], lsf_min; - FLOAT32 *ptr_w; + const FLOAT32 *ptr_w; ptr_w = &ixheaacd_weight_table_avq[(indx[0] * ORDER)]; @@ -241,4 +239,4 @@ VOID ixheaacd_alg_vec_dequant(ia_td_frame_data_struct *pstr_td_frame_data, lpc_index += pos; } -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_lpfuncs.c b/decoder/ixheaacd_lpfuncs.c index 5a83aac..44433a0 100644 --- a/decoder/ixheaacd_lpfuncs.c +++ b/decoder/ixheaacd_lpfuncs.c @@ -19,21 +19,21 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_definitions.h" @@ -56,13 +56,10 @@ #include "ixheaacd_sbr_payload.h" #include "ixheaacd_common_rom.h" - -#include <ixheaacd_type_def.h> - #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_hybrid.h" diff --git a/decoder/ixheaacd_lpp_tran.c b/decoder/ixheaacd_lpp_tran.c index 95d60e5..f096825 100644 --- a/decoder/ixheaacd_lpp_tran.c +++ b/decoder/ixheaacd_lpp_tran.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -40,7 +40,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -54,7 +54,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" @@ -541,18 +541,18 @@ static PLATFORM_INLINE VOID ixheaacd_filt_step3_lp(WORD len, WORD32 coef1, WORD32 temp = ixheaacd_mult32x16hin32(prev2, coef2); pqmf_real_low += 64; - *pqmf_real_high = - ixheaacd_add32((curr >> LPC_SCALE_FACTOR), - ((ixheaacd_mac32x16hin32(temp, prev1, coef1)) << 1)); + *pqmf_real_high = ixheaacd_add32_sat( + (curr >> LPC_SCALE_FACTOR), + (ixheaacd_shl32_sat(ixheaacd_mac32x16hin32(temp, prev1, coef1), 1))); pqmf_real_high += 64; prev2 = *pqmf_real_low; temp = ixheaacd_mult32x16hin32(prev1, coef2); pqmf_real_low += 64; - *pqmf_real_high = - ixheaacd_add32((prev2 >> LPC_SCALE_FACTOR), - ((ixheaacd_mac32x16hin32(temp, curr, coef1)) << 1)); + *pqmf_real_high = ixheaacd_add32_sat( + (prev2 >> LPC_SCALE_FACTOR), + (ixheaacd_shl32_sat(ixheaacd_mac32x16hin32(temp, curr, coef1), 1))); pqmf_real_high += 64; prev1 = prev2; @@ -957,8 +957,8 @@ VOID ixheaacd_hf_generator(ia_sbr_hf_generator_struct *hf_generator, max_val = ixheaacd_add32_sat( max_val, ixheaacd_mult32(cov_matrix.phi_12_im, cov_matrix.phi_12_im)); - v = ixheaacd_sub32(ixheaacd_mult32(cov_matrix.phi_11, cov_matrix.phi_22), - max_val) + v = ixheaacd_sub32_sat( + ixheaacd_mult32(cov_matrix.phi_11, cov_matrix.phi_22), max_val) << 1; cov_matrix.d = v; @@ -978,8 +978,8 @@ VOID ixheaacd_hf_generator(ia_sbr_hf_generator_struct *hf_generator, modulus_d = ixheaacd_abs32_sat(cov_matrix.d); tmp_r = - (ixheaacd_sub32( - ixheaacd_sub32( + (ixheaacd_sub32_sat( + ixheaacd_sub32_sat( ixheaacd_mult32(cov_matrix.phi_01, cov_matrix.phi_12), ixheaacd_mult32(cov_matrix.phi_01_im, cov_matrix.phi_12_im)), ixheaacd_mult32(cov_matrix.phi_02, cov_matrix.phi_11))) >> @@ -1022,12 +1022,12 @@ VOID ixheaacd_hf_generator(ia_sbr_hf_generator_struct *hf_generator, inverse_r11 = (WORD16)(*ixheaacd_fix_div)( 0x40000000, (cov_matrix.phi_11 << norm_r11)); - tmp_r = ixheaacd_add32( + tmp_r = ixheaacd_add32_sat( ixheaacd_add32( (cov_matrix.phi_01 >> (LPC_SCALE_FACTOR + 1)), ixheaacd_mult32x16in32(cov_matrix.phi_12, alpha_real[1])), ixheaacd_mult32x16in32(cov_matrix.phi_12_im, alpha_imag[1])); - tmp_i = ixheaacd_sub32( + tmp_i = ixheaacd_sub32_sat( ixheaacd_add32( (cov_matrix.phi_01_im >> (LPC_SCALE_FACTOR + 1)), ixheaacd_mult32x16in32(cov_matrix.phi_12, alpha_imag[1])), @@ -1058,13 +1058,13 @@ VOID ixheaacd_hf_generator(ia_sbr_hf_generator_struct *hf_generator, } } - if (ixheaacd_add32((alpha_real[0] * alpha_real[0]), - (alpha_imag[0] * alpha_imag[0])) >= 0x40000000L) { + if (ixheaacd_add32_sat((alpha_real[0] * alpha_real[0]), + (alpha_imag[0] * alpha_imag[0])) >= 0x40000000L) { reset_lpc_coeff = 1; } - if (ixheaacd_add32((alpha_real[1] * alpha_real[1]), - (alpha_imag[1] * alpha_imag[1])) >= 0x40000000L) { + if (ixheaacd_add32_sat((alpha_real[1] * alpha_real[1]), + (alpha_imag[1] * alpha_imag[1])) >= 0x40000000L) { reset_lpc_coeff = 1; } @@ -1091,9 +1091,11 @@ VOID ixheaacd_hf_generator(ia_sbr_hf_generator_struct *hf_generator, continue; } - while (high_band >= - hf_generator->pstr_settings->bw_borders[bw_index[patch]]) { - bw_index[patch] = (bw_index[patch] + 1); + while ((bw_index[patch] < MAX_NUM_PATCHES - 1) && + (bw_index[patch] < MAX_NUM_NOISE_VALUES) && + (high_band >= + hf_generator->pstr_settings->bw_borders[bw_index[patch]])) { + bw_index[patch]++; } bw = ixheaacd_extract16h(bw_array[bw_index[patch]]); diff --git a/decoder/ixheaacd_lt_predict.c b/decoder/ixheaacd_lt_predict.c index 8d00bc8..83fc9cc 100644 --- a/decoder/ixheaacd_lt_predict.c +++ b/decoder/ixheaacd_lt_predict.c @@ -22,14 +22,14 @@ #include <stdio.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_audioobjtypes.h" #include "ixheaacd_bitbuffer.h" diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c index 3540e55..98f6646 100644 --- a/decoder/ixheaacd_mps_dec.c +++ b/decoder/ixheaacd_mps_dec.c @@ -19,8 +19,12 @@ */ #include <stdlib.h> #include <stdio.h> +#include <math.h> -#include <ixheaacd_type_def.h> +#include <assert.h> +#include <string.h> + +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" @@ -28,9 +32,9 @@ #include "ixheaacd_memory_standards.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_common_rom.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -65,19 +69,15 @@ #include "ixheaacd_mps_hybfilter.h" #include "ixheaacd_mps_nlc_dec.h" #include "ixheaacd_mps_huff_tab.h" +#include "ixheaacd_error_standards.h" -#include "math.h" - -#include <assert.h> -#include <string.h> - -extern ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes; -extern ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes; -extern ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes; -extern ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes; -extern ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes; -extern ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes; -extern ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes; +extern const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes; +extern const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes; +extern const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes; +extern const ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes; +extern const ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes; +extern const ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes; +extern const ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes; WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, WORD32 residual_coding, @@ -126,8 +126,9 @@ WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, if ((self->residual_coding) && (self->res_bands > 0)) ixheaacd_mps_qmf_hybrid_analysis_init(&self->hyb_filt_state[1]); - ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count, - self->config->bs_decorr_config); + err_code = ixheaacd_mps_decor_init(&(self->mps_decor), self->hyb_band_count, + self->config->bs_decorr_config); + if (err_code != IA_NO_ERROR) return err_code; ixheaacd_mps_init_pre_and_post_matrix(self); @@ -152,11 +153,11 @@ WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, return 0; } -static FLOAT32 ixheaacd_tsd_mul_re[] = { +static const FLOAT32 ixheaacd_tsd_mul_re[] = { 1.0f, 0.707106781186548f, 0.0f, -0.707106781186548f, -1.0f, -0.707106781186548f, 0.0f, 0.707106781186548f}; -static FLOAT32 ixheaacd_tsd_mul_im[] = { +static const FLOAT32 ixheaacd_tsd_mul_im[] = { 0.0f, 0.707106781186548f, 1.0f, 0.707106781186548f, 0.0f, -0.707106781186548f, -1.0f, -0.707106781186548f}; @@ -332,10 +333,10 @@ WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, #define min(a, b) (((a) < (b)) ? (a) : (b)) -static WORD32 ixheaacd_mps_pcm_decode(ia_handle_bit_buf_struct it_bit_buff, - WORD32* out_data_1, WORD32* out_data_2, - WORD32 ixheaacd_drc_offset, - WORD32 num_val, WORD32 num_levels) { +static VOID ixheaacd_mps_pcm_decode(ia_handle_bit_buf_struct it_bit_buff, + WORD32* out_data_1, WORD32* out_data_2, + WORD32 ixheaacd_drc_offset, WORD32 num_val, + WORD32 num_levels) { WORD32 i = 0, j = 0, idx = 0; WORD32 max_grp_len = 0, grp_len = 0, next_val = 0, grp_val = 0; UWORD32 data = 0; @@ -410,12 +411,12 @@ static WORD32 ixheaacd_mps_pcm_decode(ia_handle_bit_buf_struct it_bit_buff, } } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_read(ia_handle_bit_buf_struct it_bit_buff, - const WORD32 (*node_tab)[][2], - WORD32* out_data) { +static VOID ixheaacd_mps_huff_read(ia_handle_bit_buf_struct it_bit_buff, + const WORD32 (*node_tab)[][2], + WORD32* out_data) { WORD32 node = 0; UWORD32 next_bit = 0; @@ -426,18 +427,18 @@ static WORD32 ixheaacd_mps_huff_read(ia_handle_bit_buf_struct it_bit_buff, *out_data = node; - return 1; + return; } -static WORD32 ixheaacd_mps_huff_read_2d(ia_handle_bit_buf_struct it_bit_buff, - const WORD32 (*node_tab)[][2], - WORD32 out_data[2], WORD32* escape) +static VOID ixheaacd_mps_huff_read_2d(ia_handle_bit_buf_struct it_bit_buff, + const WORD32 (*node_tab)[][2], + WORD32 out_data[2], WORD32* escape) { WORD32 huff_2d_8bit = 0; WORD32 node = 0; - if (!ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node)) return 0; + ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node); *escape = (node == 0); if (*escape) { @@ -449,11 +450,11 @@ static WORD32 ixheaacd_mps_huff_read_2d(ia_handle_bit_buf_struct it_bit_buff, out_data[1] = huff_2d_8bit & 0xf; } - return 1; + return; } -static WORD32 ixheaacd_mps_sym_restore(ia_handle_bit_buf_struct it_bit_buff, - WORD32 lav, WORD32 data[2]) { +static VOID ixheaacd_mps_sym_restore(ia_handle_bit_buf_struct it_bit_buff, + WORD32 lav, WORD32 data[2]) { WORD32 tmp = 0; UWORD32 sym_bit = 0; @@ -485,11 +486,11 @@ static WORD32 ixheaacd_mps_sym_restore(ia_handle_bit_buf_struct it_bit_buff, } } - return 1; + return; } -static WORD32 ixheaacd_mps_sym_restoreipd(ia_handle_bit_buf_struct it_bit_buff, - WORD32 lav, WORD32 data[2]) { +static VOID ixheaacd_mps_sym_restoreipd(ia_handle_bit_buf_struct it_bit_buff, + WORD32 lav, WORD32 data[2]) { WORD32 tmp = 0; UWORD32 sym_bit = 0; @@ -513,21 +514,21 @@ static WORD32 ixheaacd_mps_sym_restoreipd(ia_handle_bit_buf_struct it_bit_buff, } } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_pilot(ia_handle_bit_buf_struct it_bit_buff, - const WORD32 (*node_tab)[][2], - WORD32* pilot_data) { +static VOID ixheaacd_mps_huff_dec_pilot(ia_handle_bit_buf_struct it_bit_buff, + const WORD32 (*node_tab)[][2], + WORD32* pilot_data) { WORD32 node = 0; - if (!ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node)) return 0; + ixheaacd_mps_huff_read(it_bit_buff, node_tab, &node); *pilot_data = -(node + 1); - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_cld_1d( +static VOID ixheaacd_mps_huff_dec_cld_1d( ia_handle_bit_buf_struct it_bit_buff, const ia_huff_cld_node_1d_struct* huff_nodes, WORD32* out_data, WORD32 num_val, WORD32 p0_flag) { @@ -536,18 +537,16 @@ static WORD32 ixheaacd_mps_huff_dec_cld_1d( UWORD32 data = 0; if (p0_flag) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld, - &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld, + &node); out_data[0] = -(node + 1); ixheaacd_drc_offset = 1; } for (i = ixheaacd_drc_offset; i < num_val; i++) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&huff_nodes->node_tab, &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->node_tab, &node); od = -(node + 1); if (od != 0) { @@ -560,10 +559,10 @@ static WORD32 ixheaacd_mps_huff_dec_cld_1d( out_data[i] = od; } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_ipd_1d( +static VOID ixheaacd_mps_huff_dec_ipd_1d( ia_handle_bit_buf_struct it_bit_buff, const ia_huff_ipd_node_1d_struct* huff_nodes, WORD32* out_data, WORD32 num_val, WORD32 p0_flag) { @@ -571,26 +570,24 @@ static WORD32 ixheaacd_mps_huff_dec_ipd_1d( WORD32 od = 0; if (p0_flag) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, &node)) - return 0; + ixheaacd_mps_huff_read( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, + &node); out_data[0] = -(node + 1); ixheaacd_drc_offset = 1; } for (i = ixheaacd_drc_offset; i < num_val; i++) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&huff_nodes->node_tab, &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->node_tab, &node); od = -(node + 1); out_data[i] = od; } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_icc_1d( +static VOID ixheaacd_mps_huff_dec_icc_1d( ia_handle_bit_buf_struct it_bit_buff, const ia_huff_icc_node_1d_struct* huff_nodes, WORD32* out_data, WORD32 num_val, WORD32 p0_flag) { @@ -599,18 +596,16 @@ static WORD32 ixheaacd_mps_huff_dec_icc_1d( UWORD32 data = 0; if (p0_flag) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc, - &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc, + &node); out_data[0] = -(node + 1); ixheaacd_drc_offset = 1; } for (i = ixheaacd_drc_offset; i < num_val; i++) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&huff_nodes->node_tab, &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->node_tab, &node); od = -(node + 1); if (od != 0) { @@ -623,10 +618,10 @@ static WORD32 ixheaacd_mps_huff_dec_icc_1d( out_data[i] = od; } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_cld_2d( +static VOID ixheaacd_mps_huff_dec_cld_2d( ia_handle_bit_buf_struct it_bit_buff, const ia_huff_cld_node_2d_struct* huff_nodes, WORD32 out_data[][2], WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) { @@ -637,54 +632,47 @@ static WORD32 ixheaacd_mps_huff_dec_cld_2d( WORD32 esc_data[MAXBANDS][2] = {{0}}; WORD32 esc_idx[MAXBANDS] = {0}; - if (!ixheaacd_mps_huff_read( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, &node)) - return 0; + ixheaacd_mps_huff_read( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, + &node); data = -(node + 1); lav = 2 * data + 3; if (p0_data[0] != NULL) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld, - &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld, + &node); *p0_data[0] = -(node + 1); } if (p0_data[1] != NULL) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld, - &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.cld, + &node); *p0_data[1] = -(node + 1); } for (i = 0; i < num_val; i += ch_fac) { switch (lav) { case 3: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav3, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav3, + out_data[i], &escape); break; case 5: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav5, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav5, + out_data[i], &escape); break; case 7: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav7, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav7, + out_data[i], &escape); break; case 9: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav9, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav9, + out_data[i], &escape); break; default: break; @@ -693,14 +681,13 @@ static WORD32 ixheaacd_mps_huff_dec_cld_2d( if (escape) { esc_idx[esc_contrl++] = i; } else { - if (!ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i])) return 0; + ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i]); } } if (esc_contrl > 0) { - if (!ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0, - 2 * esc_contrl, (2 * lav + 1))) - return 0; + ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0, + 2 * esc_contrl, (2 * lav + 1)); for (i = 0; i < esc_contrl; i++) { out_data[esc_idx[i]][0] = esc_data[0][i] - lav; @@ -708,10 +695,10 @@ static WORD32 ixheaacd_mps_huff_dec_cld_2d( } } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_icc_2d( +static VOID ixheaacd_mps_huff_dec_icc_2d( ia_handle_bit_buf_struct it_bit_buff, const ia_huff_icc_node_2d_struct* huff_nodes, WORD32 out_data[][2], WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) { @@ -722,68 +709,60 @@ static WORD32 ixheaacd_mps_huff_dec_icc_2d( WORD32 esc_data[2][MAXBANDS] = {{0}}; WORD32 esc_idx[MAXBANDS] = {0}; - if (!ixheaacd_mps_huff_read( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, &node)) - return 0; + ixheaacd_mps_huff_read( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, + &node); data = -(node + 1); lav = 2 * data + 1; if (p0_data[0] != NULL) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc, - &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc, + &node); *p0_data[0] = -(node + 1); } if (p0_data[1] != NULL) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc, - &node)) - return 0; + ixheaacd_mps_huff_read(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_part0_nodes.icc, + &node); *p0_data[1] = -(node + 1); } for (i = 0; i < num_val; i += ch_fac) { switch (lav) { case 1: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav1, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav1, + out_data[i], &escape); break; case 3: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav3, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav3, + out_data[i], &escape); break; case 5: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav5, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav5, + out_data[i], &escape); break; case 7: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav7, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav7, + out_data[i], &escape); break; } if (escape) { esc_idx[esc_contrl++] = i; } else { - if (!ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i])) return 0; + ixheaacd_mps_sym_restore(it_bit_buff, lav, out_data[i]); } } if (esc_contrl > 0) { - if (!ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0, - 2 * esc_contrl, (2 * lav + 1))) - return 0; + ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0, + 2 * esc_contrl, (2 * lav + 1)); for (i = 0; i < esc_contrl; i++) { out_data[esc_idx[i]][0] = esc_data[0][i] - lav; @@ -791,10 +770,10 @@ static WORD32 ixheaacd_mps_huff_dec_icc_2d( } } - return 1; + return; } -static WORD32 ixheaacd_mps_huff_dec_ipd_2d( +static VOID ixheaacd_mps_huff_dec_ipd_2d( ia_handle_bit_buf_struct it_bit_buff, const ia_huff_ipd_node_2d_struct* huff_nodes, WORD32 out_data[][2], WORD32 num_val, WORD32 ch_fac, WORD32* p0_data[2]) { @@ -805,10 +784,9 @@ static WORD32 ixheaacd_mps_huff_dec_ipd_2d( WORD32 esc_data[2][MAXBANDS] = {{0}}; WORD32 esc_idx[MAXBANDS] = {0}; - if (!ixheaacd_mps_huff_read( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, &node)) - return 0; + ixheaacd_mps_huff_read( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_lav_idx_nodes.node_tab, + &node); data = -(node + 1); if (data == 0) @@ -819,59 +797,52 @@ static WORD32 ixheaacd_mps_huff_dec_ipd_2d( lav = 2 * data + 1; if (p0_data[0] != NULL) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, &node)) - return 0; + ixheaacd_mps_huff_read( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, + &node); *p0_data[0] = -(node + 1); } if (p0_data[1] != NULL) { - if (!ixheaacd_mps_huff_read( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, &node)) - return 0; + ixheaacd_mps_huff_read( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_ipd_nodes.hp0.node_tab, + &node); *p0_data[1] = -(node + 1); } for (i = 0; i < num_val; i += ch_fac) { switch (lav) { case 1: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav1, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav1, + out_data[i], &escape); break; case 3: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav3, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav3, + out_data[i], &escape); break; case 5: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav5, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav5, + out_data[i], &escape); break; case 7: - if (!ixheaacd_mps_huff_read_2d(it_bit_buff, - (ia_huff_node_struct)&huff_nodes->lav7, - out_data[i], &escape)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&huff_nodes->lav7, + out_data[i], &escape); break; } if (escape) { esc_idx[esc_contrl++] = i; } else { - if (!ixheaacd_mps_sym_restoreipd(it_bit_buff, lav, out_data[i])) return 0; + ixheaacd_mps_sym_restoreipd(it_bit_buff, lav, out_data[i]); } } if (esc_contrl > 0) { - if (!ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0, - 2 * esc_contrl, (2 * lav + 1))) - return 0; + ixheaacd_mps_pcm_decode(it_bit_buff, esc_data[0], esc_data[1], 0, + 2 * esc_contrl, (2 * lav + 1)); for (i = 0; i < esc_contrl; i++) { out_data[esc_idx[i]][0] = esc_data[0][i] - lav; @@ -879,7 +850,7 @@ static WORD32 ixheaacd_mps_huff_dec_ipd_2d( } } - return 1; + return; } static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff, @@ -917,21 +888,17 @@ static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff, switch (data_type) { case CLD: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_pilot( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.cld, - pilot_data)) - return 0; + ixheaacd_mps_huff_dec_pilot( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.cld, + pilot_data); } break; case ICC: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_pilot( - it_bit_buff, - (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.icc, - pilot_data)) - return 0; + ixheaacd_mps_huff_dec_pilot( + it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_pilot_nodes.icc, + pilot_data); } break; @@ -972,48 +939,42 @@ static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff, switch (data_type) { case CLD: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_cld_1d( - it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1], - out_data_1, num_val_1_int, p0_flag[0])) - return 0; + ixheaacd_mps_huff_dec_cld_1d( + it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1], + out_data_1, num_val_1_int, p0_flag[0]); } if (out_data_2 != NULL) { - if (!ixheaacd_mps_huff_dec_cld_1d( - it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2], - out_data_2, num_val_2_int, p0_flag[1])) - return 0; + ixheaacd_mps_huff_dec_cld_1d( + it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2], + out_data_2, num_val_2_int, p0_flag[1]); } break; case ICC: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_icc_1d( - it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1], - out_data_1, num_val_1_int, p0_flag[0])) - return 0; + ixheaacd_mps_huff_dec_icc_1d( + it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1], + out_data_1, num_val_1_int, p0_flag[0]); } if (out_data_2 != NULL) { - if (!ixheaacd_mps_huff_dec_icc_1d( - it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2], - out_data_2, num_val_2_int, p0_flag[1])) - return 0; + ixheaacd_mps_huff_dec_icc_1d( + it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2], + out_data_2, num_val_2_int, p0_flag[1]); } break; case IPD: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_ipd_1d( - it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1], - out_data_1, num_val_1_int, p0_flag[0])) - return 0; + ixheaacd_mps_huff_dec_ipd_1d( + it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1], + out_data_1, num_val_1_int, p0_flag[0]); } if (out_data_2 != NULL) { - if (!ixheaacd_mps_huff_dec_ipd_1d( - it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2], - out_data_2, num_val_2_int, p0_flag[1])) - return 0; + ixheaacd_mps_huff_dec_ipd_1d( + it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2], + out_data_2, num_val_2_int, p0_flag[1]); } break; @@ -1056,93 +1017,75 @@ static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff, case CLD: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_cld_2d( - it_bit_buff, - &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_1][FREQ_PAIR], - pair_vec, num_val_1_int, 2, p0_data_1)) - return 0; + ixheaacd_mps_huff_dec_cld_2d( + it_bit_buff, + &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_1][FREQ_PAIR], + pair_vec, num_val_1_int, 2, p0_data_1); if (df_rest_flag_1) { - if (!ixheaacd_mps_huff_dec_cld_1d( - it_bit_buff, - &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1], - out_data_1_int + num_val_1_int, 1, 0)) - return 0; + ixheaacd_mps_huff_dec_cld_1d( + it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_1], + out_data_1_int + num_val_1_int, 1, 0); } } if (out_data_2 != NULL) { - if (!ixheaacd_mps_huff_dec_cld_2d( - it_bit_buff, - &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_2][FREQ_PAIR], - pair_vec + 1, num_val_2_int, 2, p0_data_2)) - return 0; + ixheaacd_mps_huff_dec_cld_2d( + it_bit_buff, + &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy_2][FREQ_PAIR], + pair_vec + 1, num_val_2_int, 2, p0_data_2); if (df_rest_flag_2) { - if (!ixheaacd_mps_huff_dec_cld_1d( - it_bit_buff, - &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2], - out_data_2_int + num_val_2_int, 1, 0)) - return 0; + ixheaacd_mps_huff_dec_cld_1d( + it_bit_buff, &ixheaacd_huff_cld_nodes.h_1_dim[huff_yy_2], + out_data_2_int + num_val_2_int, 1, 0); } } break; case ICC: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_icc_2d( - it_bit_buff, - &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_1][FREQ_PAIR], - pair_vec, num_val_1_int, 2, p0_data_1)) - return 0; + ixheaacd_mps_huff_dec_icc_2d( + it_bit_buff, + &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_1][FREQ_PAIR], + pair_vec, num_val_1_int, 2, p0_data_1); if (df_rest_flag_1) { - if (!ixheaacd_mps_huff_dec_icc_1d( - it_bit_buff, - &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1], - out_data_1_int + num_val_1_int, 1, 0)) - return 0; + ixheaacd_mps_huff_dec_icc_1d( + it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_1], + out_data_1_int + num_val_1_int, 1, 0); } } if (out_data_2 != NULL) { - if (!ixheaacd_mps_huff_dec_icc_2d( - it_bit_buff, - &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_2][FREQ_PAIR], - pair_vec + 1, num_val_2_int, 2, p0_data_2)) - return 0; + ixheaacd_mps_huff_dec_icc_2d( + it_bit_buff, + &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy_2][FREQ_PAIR], + pair_vec + 1, num_val_2_int, 2, p0_data_2); if (df_rest_flag_2) { - if (!ixheaacd_mps_huff_dec_icc_1d( - it_bit_buff, - &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2], - out_data_2_int + num_val_2_int, 1, 0)) - return 0; + ixheaacd_mps_huff_dec_icc_1d( + it_bit_buff, &ixheaacd_huff_icc_nodes.h_1_dim[huff_yy_2], + out_data_2_int + num_val_2_int, 1, 0); } } break; case IPD: if (out_data_1 != NULL) { - if (!ixheaacd_mps_huff_dec_ipd_2d( - it_bit_buff, - &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_1][FREQ_PAIR], - pair_vec, num_val_1_int, 2, p0_data_1)) - return 0; + ixheaacd_mps_huff_dec_ipd_2d( + it_bit_buff, + &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_1][FREQ_PAIR], + pair_vec, num_val_1_int, 2, p0_data_1); if (df_rest_flag_1) { - if (!ixheaacd_mps_huff_dec_ipd_1d( - it_bit_buff, - &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1], - out_data_1_int + num_val_1_int, 1, 0)) - return 0; + ixheaacd_mps_huff_dec_ipd_1d( + it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_1], + out_data_1_int + num_val_1_int, 1, 0); } } if (out_data_2 != NULL) { - if (!ixheaacd_mps_huff_dec_ipd_2d( - it_bit_buff, - &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_2][FREQ_PAIR], - pair_vec + 1, num_val_2_int, 2, p0_data_2)) - return 0; + ixheaacd_mps_huff_dec_ipd_2d( + it_bit_buff, + &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy_2][FREQ_PAIR], + pair_vec + 1, num_val_2_int, 2, p0_data_2); if (df_rest_flag_2) { - if (!ixheaacd_mps_huff_dec_ipd_1d( - it_bit_buff, - &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2], - out_data_2_int + num_val_2_int, 1, 0)) - return 0; + ixheaacd_mps_huff_dec_ipd_1d( + it_bit_buff, &ixheaacd_huff_ipd_nodes.h_1_dim[huff_yy_2], + out_data_2_int + num_val_2_int, 1, 0); } } break; @@ -1192,27 +1135,24 @@ static WORD32 ixheaacd_huff_decode(ia_handle_bit_buf_struct it_bit_buff, switch (data_type) { case CLD: - if (!ixheaacd_mps_huff_dec_cld_2d( - it_bit_buff, - &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy][TIME_PAIR], - pair_vec, num_val_1_int, 1, p0_data_1)) - return 0; + ixheaacd_mps_huff_dec_cld_2d( + it_bit_buff, + &ixheaacd_huff_cld_nodes.h_2_dim[huff_yy][TIME_PAIR], + pair_vec, num_val_1_int, 1, p0_data_1); break; case ICC: - if (!ixheaacd_mps_huff_dec_icc_2d( - it_bit_buff, - &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy][TIME_PAIR], - pair_vec, num_val_1_int, 1, p0_data_1)) - return 0; + ixheaacd_mps_huff_dec_icc_2d( + it_bit_buff, + &ixheaacd_huff_icc_nodes.h_2_dim[huff_yy][TIME_PAIR], + pair_vec, num_val_1_int, 1, p0_data_1); break; case IPD: - if (!ixheaacd_mps_huff_dec_ipd_2d( - it_bit_buff, - &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy][TIME_PAIR], - pair_vec, num_val_1_int, 1, p0_data_1)) - return 0; + ixheaacd_mps_huff_dec_ipd_2d( + it_bit_buff, + &ixheaacd_huff_ipd_nodes.h_2_dim[huff_yy][TIME_PAIR], + pair_vec, num_val_1_int, 1, p0_data_1); break; default: @@ -1286,10 +1226,10 @@ static VOID ixheaacd_mps_diff_time_dec_fwd(WORD32* prev_data, WORD32* diff_data, } } -static WORD32 ixheaacd_attach_lsb(ia_handle_bit_buf_struct it_bit_buff, - WORD32* in_data_msb, - WORD32 ixheaacd_drc_offset, WORD32 num_lsb, - WORD32 num_val, WORD32* out_data) { +static VOID ixheaacd_attach_lsb(ia_handle_bit_buf_struct it_bit_buff, + WORD32* in_data_msb, WORD32 ixheaacd_drc_offset, + WORD32 num_lsb, WORD32 num_val, + WORD32* out_data) { WORD32 i = 0, lsb = 0, msb = 0; UWORD32 data = 0; @@ -1305,7 +1245,7 @@ static WORD32 ixheaacd_attach_lsb(ia_handle_bit_buf_struct it_bit_buff, out_data[i] = msb - ixheaacd_drc_offset; } - return 0; + return; } WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff, @@ -1378,7 +1318,7 @@ WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff, default: fprintf(stderr, "Unknown type of data!\n"); - return 0; + return -1; } data = ixheaacd_read_bits_buf(it_bit_buff, 1); @@ -1397,9 +1337,8 @@ WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff, pcm_val = data_bands; } - if (!ixheaacd_mps_pcm_decode(it_bit_buff, data_array[0], data_array[1], - quant_offset, pcm_val, quant_levels)) - return 0; + ixheaacd_mps_pcm_decode(it_bit_buff, data_array[0], data_array[1], + quant_offset, pcm_val, quant_levels); } else { if (pair_flag) { @@ -1500,19 +1439,18 @@ WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct it_bit_buff, sizeof(WORD32) * data_bands); } - return 1; + return IA_NO_ERROR; } -WORD32 ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct it_bit_buff, - WORD32* out_data, WORD32 num_val) { +VOID ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct it_bit_buff, + WORD32* out_data, WORD32 num_val) { WORD32 val_rcvd = 0, dummy = 0, i = 0, val = 0, len = 0; WORD32 rl_data[2] = {0}; while (val_rcvd < num_val) { - if (!ixheaacd_mps_huff_read_2d( - it_bit_buff, (ia_huff_node_struct)&ixheaacd_huff_reshape_nodes, - rl_data, &dummy)) - return 0; + ixheaacd_mps_huff_read_2d(it_bit_buff, + (ia_huff_node_struct)&ixheaacd_huff_reshape_nodes, + rl_data, &dummy); val = rl_data[0]; len = rl_data[1] + 1; for (i = val_rcvd; i < val_rcvd + len; i++) { @@ -1521,5 +1459,5 @@ WORD32 ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct it_bit_buff, val_rcvd += len; } - return 1; + return; } diff --git a/decoder/ixheaacd_mps_dec.h b/decoder/ixheaacd_mps_dec.h index 527cb2e..845b723 100644 --- a/decoder/ixheaacd_mps_dec.h +++ b/decoder/ixheaacd_mps_dec.h @@ -60,8 +60,8 @@ typedef struct ia_mps_decor_filt_struct { WORD32 den_len; ia_cmplx_flt_struct state[MAX_DECORR_FIL_ORDER + 1]; - FLOAT32 *num; - FLOAT32 *den; + const FLOAT32 *num; + const FLOAT32 *den; } ia_mps_decor_filt_struct; @@ -200,7 +200,7 @@ typedef struct ia_mps_dec_state_struct { WORD32 qmf_band_count; WORD32 hyb_band_count; - WORD32 *hyb_band_to_processing_band_table; + const WORD32 *hyb_band_to_processing_band_table; WORD32 res_ch_count; diff --git a/decoder/ixheaacd_mps_decor.h b/decoder/ixheaacd_mps_decor.h index 3d9f6df..4f856f5 100644 --- a/decoder/ixheaacd_mps_decor.h +++ b/decoder/ixheaacd_mps_decor.h @@ -24,7 +24,7 @@ #define ONE_MINUS_DECOR_ALPHA (1 - DECOR_ALPHA) #define DECOR_GAMMA (1.5f) -VOID ixheaacd_mps_decor_init(ia_mps_decor_struct_handle, int, int); +IA_ERRORCODE ixheaacd_mps_decor_init(ia_mps_decor_struct_handle, int, int); VOID ixheaacd_mps_decor_apply( ia_mps_decor_struct_handle self, diff --git a/decoder/ixheaacd_mps_decorr.c b/decoder/ixheaacd_mps_decorr.c index 0d2622f..33b6aa5 100644 --- a/decoder/ixheaacd_mps_decorr.c +++ b/decoder/ixheaacd_mps_decorr.c @@ -23,7 +23,7 @@ #include <string.h> #include <assert.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" @@ -35,43 +35,51 @@ #include "ixheaacd_mps_decor.h" #include "ixheaacd_mps_hybfilter.h" - +#include "ixheaacd_error_standards.h" #include "ixheaacd_constants.h" -static WORD32 ixheaacd_decorr_delay[] = {11, 10, 5, 2}; - -static WORD32 ixheaacd_qmf_split_freq_0[] = {3, 15, 24, 65}; -static WORD32 ixheaacd_qmf_split_freq_1[] = {3, 50, 65, 65}; -static WORD32 ixheaacd_qmf_split_freq_2[] = {0, 15, 65, 65}; - -static FLOAT32 ixheaacd_lattice_coeff_0_filt_den_coeff[DECORR_FILT_0_ORD + 1] = - {1.000000f, -0.314818f, -0.256828f, -0.173641f, -0.115077f, 0.000599f, - 0.033343f, 0.122672f, -0.356362f, 0.128058f, 0.089800f}; -static FLOAT32 ixheaacd_lattice_coeff_0_filt_num_coeff[DECORR_FILT_0_ORD + 1] = - {0.089800f, 0.128058f, -0.356362f, 0.122672f, 0.033343f, 0.000599f, - -0.115077f, -0.173641f, -0.256828f, -0.314818f, 1.000000f}; - -static FLOAT32 ixheaacd_lattice_coeff_1_filt_den_coeff[DECORR_FILT_1_ORD + 1] = - {1.000000f, -0.287137f, -0.088940f, 0.123204f, -0.126111f, - 0.064218f, 0.045768f, -0.016264f, -0.122100f}; -static FLOAT32 ixheaacd_lattice_coeff_1_filt_num_coeff[DECORR_FILT_1_ORD + 1] = - {-0.122100f, -0.016264f, 0.045768f, 0.064218f, -0.126111f, - 0.123204f, -0.088940f, -0.287137f, 1.000000f}; - -static FLOAT32 ixheaacd_lattice_coeff_2_filt_den_coeff[DECORR_FILT_2_ORD + 1] = - {1.000000f, 0.129403f, -0.032633f, 0.035700f}; -static FLOAT32 ixheaacd_lattice_coeff_2_filt_num_coeff[DECORR_FILT_2_ORD + 1] = - {0.035700f, -0.032633f, 0.129403f, 1.000000f}; - -static FLOAT32 ixheaacd_lattice_coeff_3_filt_den_coeff[DECORR_FILT_3_ORD + 1] = - {1.000000f, 0.034742f, -0.013000f}; -static FLOAT32 ixheaacd_lattice_coeff_3_filt_num_coeff[DECORR_FILT_3_ORD + 1] = - {-0.013000f, 0.034742f, 1.000000f}; - -extern WORD32 +static const WORD32 ixheaacd_decorr_delay[] = {11, 10, 5, 2}; + +static const WORD32 ixheaacd_qmf_split_freq_0[] = {3, 15, 24, 65}; +static const WORD32 ixheaacd_qmf_split_freq_1[] = {3, 50, 65, 65}; +static const WORD32 ixheaacd_qmf_split_freq_2[] = {0, 15, 65, 65}; + +static const FLOAT32 + ixheaacd_lattice_coeff_0_filt_den_coeff[DECORR_FILT_0_ORD + 1] = { + 1.000000f, -0.314818f, -0.256828f, -0.173641f, -0.115077f, 0.000599f, + 0.033343f, 0.122672f, -0.356362f, 0.128058f, 0.089800f}; +static const FLOAT32 + ixheaacd_lattice_coeff_0_filt_num_coeff[DECORR_FILT_0_ORD + 1] = { + 0.089800f, 0.128058f, -0.356362f, 0.122672f, 0.033343f, 0.000599f, + -0.115077f, -0.173641f, -0.256828f, -0.314818f, 1.000000f}; + +static const FLOAT32 + ixheaacd_lattice_coeff_1_filt_den_coeff[DECORR_FILT_1_ORD + 1] = { + 1.000000f, -0.287137f, -0.088940f, 0.123204f, -0.126111f, + 0.064218f, 0.045768f, -0.016264f, -0.122100f}; +static const FLOAT32 + ixheaacd_lattice_coeff_1_filt_num_coeff[DECORR_FILT_1_ORD + 1] = { + -0.122100f, -0.016264f, 0.045768f, 0.064218f, -0.126111f, + 0.123204f, -0.088940f, -0.287137f, 1.000000f}; + +static const FLOAT32 + ixheaacd_lattice_coeff_2_filt_den_coeff[DECORR_FILT_2_ORD + 1] = { + 1.000000f, 0.129403f, -0.032633f, 0.035700f}; +static const FLOAT32 + ixheaacd_lattice_coeff_2_filt_num_coeff[DECORR_FILT_2_ORD + 1] = { + 0.035700f, -0.032633f, 0.129403f, 1.000000f}; + +static const FLOAT32 + ixheaacd_lattice_coeff_3_filt_den_coeff[DECORR_FILT_3_ORD + 1] = { + 1.000000f, 0.034742f, -0.013000f}; +static const FLOAT32 + ixheaacd_lattice_coeff_3_filt_num_coeff[DECORR_FILT_3_ORD + 1] = { + -0.013000f, 0.034742f, 1.000000f}; + +extern const WORD32 ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS]; -static WORD32 ixheaacd_hybrid_to_qmf_map[MAX_HYBRID_BANDS_MPS] = { +static const WORD32 ixheaacd_hybrid_to_qmf_map[MAX_HYBRID_BANDS_MPS] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, @@ -185,10 +193,10 @@ static VOID ixheaacd_mps_decor_energy_adjustment( } } -void ixheaacd_mps_decor_init(ia_mps_decor_struct_handle self, WORD32 subbands, - WORD32 decor_config) { +IA_ERRORCODE ixheaacd_mps_decor_init(ia_mps_decor_struct_handle self, + WORD32 subbands, WORD32 decor_config) { WORD32 i, reverb_band; - WORD32 *splitfreq; + const WORD32 *splitfreq; switch (decor_config) { case 0: @@ -201,7 +209,7 @@ void ixheaacd_mps_decor_init(ia_mps_decor_struct_handle self, WORD32 subbands, splitfreq = ixheaacd_qmf_split_freq_2; break; default: - return; + return IA_FATAL_ERROR; } self->num_bins = subbands; @@ -218,7 +226,7 @@ void ixheaacd_mps_decor_init(ia_mps_decor_struct_handle self, WORD32 subbands, self->decor_nrg_smooth.num_bins = self->num_bins; - return; + return IA_NO_ERROR; } VOID ixheaacd_mps_decor_apply( diff --git a/decoder/ixheaacd_mps_hybrid_filt.c b/decoder/ixheaacd_mps_hybrid_filt.c index be53625..044f4b1 100644 --- a/decoder/ixheaacd_mps_hybrid_filt.c +++ b/decoder/ixheaacd_mps_hybrid_filt.c @@ -19,7 +19,7 @@ */ #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" @@ -28,14 +28,16 @@ #include "ixheaacd_mps_interface.h" #include "ixheaacd_mps_polyphase.h" +#include "ixheaacd_constants.h" +#include "ixheaacd_basic_ops32.h" #include "ixheaacd_mps_hybfilter.h" -extern WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER]; -extern WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER]; -extern WORD32 ixheaacd_cosine[8][13]; -extern WORD32 ixheaacd_sine[8][13]; -extern WORD32 ixheaacd_cosine2[2][13]; +extern const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER]; +extern const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER]; +extern const WORD32 ixheaacd_cosine[8][13]; +extern const WORD32 ixheaacd_sine[8][13]; +extern const WORD32 ixheaacd_cosine2[2][13]; static WORD32 ixheaacd_mps_mult32_local(WORD32 a, WORD32 b, WORD16 shift) { WORD64 temp; @@ -47,7 +49,7 @@ static WORD32 ixheaacd_mps_mult32_local(WORD32 a, WORD32 b, WORD16 shift) { static VOID ixheaacd_mps_hyb_filt_type1( ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[8][MAX_TIME_SLOTS], - WORD32 num_samples, WORD32 *filt_coeff) + WORD32 num_samples, const WORD32 *filt_coeff) { WORD32 i, n, q; @@ -71,13 +73,14 @@ static VOID ixheaacd_mps_hyb_filt_type1( in_re = (WORD32)(input[n + i].re); in_im = (WORD32)(input[n + i].im); - in_re = in_re << shift; - in_im = in_im << shift; + in_re = ixheaacd_shl32_sat(in_re, shift); + in_im = ixheaacd_shl32_sat(in_im, shift); coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; - temp = ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30) - - ixheaacd_mps_mult32_local(in_im, modulation_fac_im, 30); + temp = ixheaacd_sub32_sat( + ixheaacd_mps_mult32_local(in_re, modulation_fac_re, 30), + ixheaacd_mps_mult32_local(in_im, modulation_fac_im, 30)); if (temp >= 1073741823) temp = 1073741823; @@ -87,8 +90,9 @@ static VOID ixheaacd_mps_hyb_filt_type1( temp = ixheaacd_mps_mult32_local(coeff, temp, 30); acc_re = acc_re + (WORD64)temp; - temp = ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30) + - ixheaacd_mps_mult32_local(in_re, modulation_fac_im, 30); + temp = ixheaacd_add32_sat( + ixheaacd_mps_mult32_local(in_im, modulation_fac_re, 30), + ixheaacd_mps_mult32_local(in_re, modulation_fac_im, 30)); if (temp >= 1073741823) temp = 1073741823; @@ -107,7 +111,7 @@ static VOID ixheaacd_mps_hyb_filt_type1( static VOID ixheaacd_mps_hyb_filt_type2( ia_cmplx_w32_struct *input, ia_cmplx_w32_struct output[2][MAX_TIME_SLOTS], - WORD32 num_samples, WORD32 *filt_coeff) + WORD32 num_samples, const WORD32 *filt_coeff) { WORD32 i, n, q; @@ -130,8 +134,8 @@ static VOID ixheaacd_mps_hyb_filt_type2( in_re = (WORD32)(input[n + i].re); in_im = (WORD32)(input[n + i].im); - in_re = in_re << shift; - in_im = in_im << shift; + in_re = ixheaacd_shl32_sat(in_re, shift); + in_im = ixheaacd_shl32_sat(in_im, shift); coeff = filt_coeff[QMF_HYBRID_FILT_ORDER - 1 - n]; diff --git a/decoder/ixheaacd_mps_interface.h b/decoder/ixheaacd_mps_interface.h index a488aef..0ca9892 100644 --- a/decoder/ixheaacd_mps_interface.h +++ b/decoder/ixheaacd_mps_interface.h @@ -24,9 +24,9 @@ WORD32 ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, WORD32 residual_coding, ia_usac_dec_mps_config_struct* usac_mps_config); -VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct* self, - WORD32 independency_flag, - ia_handle_bit_buf_struct it_bit_buff); +IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct* self, + WORD32 independency_flag, + ia_handle_bit_buf_struct it_bit_buff); WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, FLOAT32** pointers[4], FLOAT32 (*out_samples)[4096]); diff --git a/decoder/ixheaacd_mps_nlc_dec.h b/decoder/ixheaacd_mps_nlc_dec.h index bbb2e94..e210f6c 100644 --- a/decoder/ixheaacd_mps_nlc_dec.h +++ b/decoder/ixheaacd_mps_nlc_dec.h @@ -54,7 +54,7 @@ WORD32 ixheaacd_mps_ecdatapairdec(ia_handle_bit_buf_struct strm, WORD32 pair_flag, WORD32 coarse_flag, WORD32 independency_flag); -WORD32 ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct strm, WORD32 *out_data, - WORD32 num_val); +VOID ixheaacd_mps_huff_decode(ia_handle_bit_buf_struct strm, WORD32 *out_data, + WORD32 num_val); #endif diff --git a/decoder/ixheaacd_mps_parse.c b/decoder/ixheaacd_mps_parse.c index 7f45d3f..81a8592 100644 --- a/decoder/ixheaacd_mps_parse.c +++ b/decoder/ixheaacd_mps_parse.c @@ -18,97 +18,97 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <math.h> -#include <ixheaacd_type_def.h> +#include <assert.h> +#include <stdio.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" - #include "ixheaacd_mps_polyphase.h" - #include "ixheaacd_mps_dec.h" #include "ixheaacd_mps_interface.h" #include "ixheaacd_mps_nlc_dec.h" #include "ixheaacd_mps_hybfilter.h" - -#include <assert.h> -#include <stdio.h> +#include "ixheaacd_error_standards.h" #define min(a, b) ((a) < (b) ? (a) : (b)) #define max(a, b) ((a) > (b) ? (a) : (b)) -static int ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4}; +static const int ixheaacd_freq_res_table[] = {0, 28, 20, 14, 10, 7, 5, 4}; -static int +static const int ixheaacd_hybrid_band_71_to_processing_band_4_map[MAX_HYBRID_BANDS_MPS] = { 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3}; -static int +static const int ixheaacd_hybrid_band_71_to_processing_band_5_map[MAX_HYBRID_BANDS_MPS] = { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4}; -static int +static const int ixheaacd_hybrid_band_71_to_processing_band_7_map[MAX_HYBRID_BANDS_MPS] = { 0, 0, 0, 0, 0, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6}; -static int +static const int ixheaacd_hybrid_band_71_to_processing_band_10_map[MAX_HYBRID_BANDS_MPS] = { 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9}; -static int +static const int ixheaacd_hybrid_band_71_to_processing_band_14_map[MAX_HYBRID_BANDS_MPS] = { 0, 0, 0, 0, 1, 1, 2, 3, 4, 4, 5, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13}; -int ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = { - 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, - 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}; +const int + ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS] = { + 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 14, + 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19}; -int ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = { - 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, - 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, - 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}; +const int + ixheaacd_hybrid_band_71_to_processing_band_28_map[MAX_HYBRID_BANDS_MPS] = { + 1, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 21, 22, 22, 22, 23, 23, 23, + 23, 24, 24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, + 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27}; -static float ixheaacd_mps_clip_gain_table[] = {1.000000f, 1.189207f, 1.414213f, - 1.681792f, 2.000000f, 2.378414f, - 2.828427f, 4.000000f}; +static const float ixheaacd_mps_clip_gain_table[] = { + 1.000000f, 1.189207f, 1.414213f, 1.681792f, + 2.000000f, 2.378414f, 2.828427f, 4.000000f}; -static int ixheaacd_mps_stride_table[] = {1, 2, 5, 28}; +static const int ixheaacd_mps_stride_table[] = {1, 2, 5, 28}; -static float ixheaacd_cld_de_quant_table[] = { +static const float ixheaacd_cld_de_quant_table[] = { -150.0, -45.0, -40.0, -35.0, -30.0, -25.0, -22.0, -19.0, -16.0, -13.0, -10.0, -8.0, -6.0, -4.0, -2.0, 0.0, 2.0, 4.0, 6.0, 8.0, 10.0, 13.0, 16.0, 19.0, 22.0, 25.0, 30.0, 35.0, 40.0, 45.0, 150.0}; -static float ixheaacd_icc_de_quant_table[] = { +static const float ixheaacd_icc_de_quant_table[] = { 1.0000f, 0.9370f, 0.84118f, 0.60092f, 0.36764f, 0.0f, -0.5890f, -0.9900f}; -float ixheaacd_ipd_de_quant_table[] = { +const float ixheaacd_ipd_de_quant_table[] = { 0.f, 0.392699082f, 0.785398163f, 1.178097245f, 1.570796327f, 1.963495408f, 2.35619449f, 2.748893572f, 3.141592654f, 3.534291735f, 3.926990817f, 4.319689899f, 4.71238898f, 5.105088062f, 5.497787144f, 5.890486225f}; -int ixheaacd_ipd_de_quant_table_q28[] = { +const int ixheaacd_ipd_de_quant_table_q28[] = { 0, 105414360, 210828720, 316243072, 421657440, 527071776, 632486144, 737900480, 843314880, 948729216, 1054143552, 1159557888, 1264972288, 1370386688, 1475800960, 1581215360}; -static int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512}; +static const int ixheaacd_smoothing_time_table[] = {64, 128, 256, 512}; -static int ixheaacd_inverse_smoothing_time_table_q30[] = {16777216, 8388608, - 4194304, 2097152}; +static const int ixheaacd_inverse_smoothing_time_table_q30[] = { + 16777216, 8388608, 4194304, 2097152}; static WORD32 bound_check(WORD32 var, WORD32 lower_bound, WORD32 upper_bound) { var = min(var, upper_bound); @@ -240,7 +240,7 @@ static int ixheaacd_mps_getstridemap(int freq_res_stride, int band_start, return data_bands; } -static VOID ixheaacd_mps_ecdata_decoding( +static IA_ERRORCODE ixheaacd_mps_ecdata_decoding( ia_mps_dec_state_struct *self, ia_handle_bit_buf_struct bitstream, int data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], int datatype) { int i, j, pb, set_index, bs_data_pair, data_bands, old_quant_coarse_xxx; @@ -250,6 +250,7 @@ static VOID ixheaacd_mps_ecdata_decoding( int *lastdata = NULL; ia_mps_data_struct *frame_xxx_data = NULL; int default_val = 0; + IA_ERRORCODE err = IA_NO_ERROR; ia_mps_bs_frame *frame = &(self->bs_frame); @@ -315,10 +316,11 @@ static VOID ixheaacd_mps_ecdata_decoding( lastdata[pb] = lastdata[strides[pb]]; } - ixheaacd_mps_ecdatapairdec( + err = ixheaacd_mps_ecdatapairdec( bitstream, data, lastdata, datatype, set_index, data_bands, bs_data_pair, frame_xxx_data->bs_quant_coarse_xxx[set_index], frame->independency_flag && (i == 0)); + if (err) return err; for (pb = 0; pb < data_bands; pb++) { for (j = strides[pb]; j < strides[pb + 1]; j++) { @@ -346,11 +348,12 @@ static VOID ixheaacd_mps_ecdata_decoding( } } } + return err; } -VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, - int usac_independency_flag, - ia_handle_bit_buf_struct bitstream) { +IA_ERRORCODE ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, + int usac_independency_flag, + ia_handle_bit_buf_struct bitstream) { int i, bs_frame_type, data_bands, bs_temp_shape_enable, num_of_temp_shape_ch; int ps, pg, ts, pb; int env_shape_data[MAX_TIME_SLOTS]; @@ -358,8 +361,9 @@ VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, int bits_param_slot = 0; ia_mps_bs_frame *frame = &(self->bs_frame); + IA_ERRORCODE err = IA_NO_ERROR; - if (self->parse_nxt_frame == 0) return; + if (self->parse_nxt_frame == 0) return IA_NO_ERROR; self->num_parameter_sets_prev = self->num_parameter_sets; @@ -390,8 +394,11 @@ VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, frame->independency_flag = 1; } - ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD); - ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC); + err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_cld_idx, CLD); + if (err) return err; + + err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->cmp_icc_idx, ICC); + if (err) return err; if (self->config->bs_phase_coding) { self->bs_phase_mode = ixheaacd_read_bits_buf(bitstream, 1); @@ -408,7 +415,9 @@ VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, self->opd_smoothing_mode = 0; } else { self->opd_smoothing_mode = ixheaacd_read_bits_buf(bitstream, 1); - ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data, IPD); + err = ixheaacd_mps_ecdata_decoding(self, bitstream, frame->ipd_idx_data, + IPD); + if (err) return err; } } @@ -499,12 +508,12 @@ VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, UWORD64 c_64; unsigned short b; unsigned short r[1]; - unsigned short table_64[] = {6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, - 42, 44, 46, 48, 49, 51, 52, 53, 55, 56, 57, - 58, 58, 59, 60, 60, 60, 61, 61, 61, 61}; - unsigned short table_32[] = {5, 9, 13, 16, 18, 20, 22, 24, - 25, 26, 27, 28, 29, 29, 30, 30}; - unsigned short *tab = NULL; + static const unsigned short table_64[] = { + 6, 11, 16, 20, 23, 27, 30, 33, 35, 38, 40, 42, 44, 46, 48, 49, + 51, 52, 53, 55, 56, 57, 58, 58, 59, 60, 60, 60, 61, 61, 61, 61}; + static const unsigned short table_32[] = {5, 9, 13, 16, 18, 20, 22, 24, + 25, 26, 27, 28, 29, 29, 30, 30}; + unsigned const short *tab = NULL; int k; unsigned short h; WORD32 nbits_tr_slots = 0; @@ -598,6 +607,7 @@ VOID ixheaacd_mps_frame_parsing(ia_mps_dec_state_struct *self, } self->parse_nxt_frame = 0; + return err; } static VOID ixheaacd_mps_createmapping(int map[MAX_PARAMETER_BANDS + 1], diff --git a/decoder/ixheaacd_mps_poly_filt.c b/decoder/ixheaacd_mps_poly_filt.c index 1d5ea47..315f0c7 100644 --- a/decoder/ixheaacd_mps_poly_filt.c +++ b/decoder/ixheaacd_mps_poly_filt.c @@ -21,24 +21,23 @@ #include <stdio.h> #include <string.h> #include <math.h> -#include <ixheaacd_type_def.h> -#include <ixheaacd_interface.h> +#include "ixheaacd_type_def.h" +#include "ixheaacd_interface.h" #include "ixheaacd_mps_polyphase.h" -#include <ixheaacd_type_def.h> #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" #include "ixheaacd_mps_dec.h" #include "ixheaacd_mps_interface.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> +#include "ixheaacd_basic_ops32.h" #include "ixheaacd_function_selector.h" extern const WORD32 ixheaacd_mps_polyphase_filter_coeff_fix[10 * MAX_NUM_QMF_BANDS_SAC / 2]; -extern WORD32 ixheaacd_mps_pre_re[64]; -extern WORD32 ixheaacd_mps_pre_im[64]; -extern WORD32 ixheaacd_mps_post_re[128]; -extern WORD32 ixheaacd_mps_post_im[128]; +extern const WORD32 ixheaacd_mps_pre_re[64]; +extern const WORD32 ixheaacd_mps_pre_im[64]; +extern const WORD32 ixheaacd_mps_post_re[128]; +extern const WORD32 ixheaacd_mps_post_im[128]; static PLATFORM_INLINE WORD32 ixheaacd_mult32(WORD32 a, WORD32 b) { WORD32 result; @@ -67,8 +66,9 @@ static VOID ixheaacd_float_to_int32(FLOAT32 *in, WORD32 *out, WORD32 q_factor, for (loop = 0; loop < sample; loop++) out[loop] = (WORD32)(in[loop] * temp); } -VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, WORD32 resolution) { +VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 resolution) { WORD32 tmp, k; for (k = 0; k < 2 * resolution; k += 2) { tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k >> 1]), @@ -81,24 +81,27 @@ VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, WORD32 *table_re, } } -VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, WORD32 *table_re, - WORD32 *table_im, WORD32 resolution) { +VOID ixheaacd_mps_synt_post_twiddle_dec(WORD32 *ptr_in, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 resolution) { WORD32 tmp, k; for (k = 0; k < 2 * resolution; k += 2) { tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k]), ixheaacd_mult32(ptr_in[k + 1], table_im[k])); - ptr_in[k + 1] = - ixheaacd_add32_sat(ixheaacd_mult32(-ptr_in[k], table_im[k]), - ixheaacd_mult32(ptr_in[k + 1], table_re[k])); + ptr_in[k + 1] = ixheaacd_add32_sat( + ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k]), + ixheaacd_mult32(ptr_in[k + 1], table_re[k])); ptr_in[k] = tmp; } } VOID ixheaacd_mps_synt_post_fft_twiddle_dec(WORD32 resolution, WORD32 *fin_re, - WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state) { + WORD32 *fin_im, + const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state) { WORD32 l; for (l = 0; l < 2 * resolution; l++) { state[2 * resolution - l - 1] = diff --git a/decoder/ixheaacd_mps_pre_mix.c b/decoder/ixheaacd_mps_pre_mix.c index 36426cf..c490e78 100644 --- a/decoder/ixheaacd_mps_pre_mix.c +++ b/decoder/ixheaacd_mps_pre_mix.c @@ -17,7 +17,11 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include <math.h> +#include <memory.h> + +#include <assert.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" #include "ixheaacd_mps_polyphase.h" @@ -25,15 +29,9 @@ #include "ixheaacd_mps_dec.h" #include "ixheaacd_mps_interface.h" -#include <ixheaacd_type_def.h> #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> - -#include <math.h> -#include <memory.h> - -#include <assert.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #undef ABS_THR #define ABS_THR 1.0e-9f @@ -58,13 +56,11 @@ extern const WORD32 ixheaacd_c_l_table_Q31[31]; extern const WORD32 ixheaacd_sin_table_Q31[8][31]; extern const WORD32 ixheaacd_cos_table_Q31[8][31]; extern const WORD32 ixheaacd_atan_table_Q28[16][8][31]; -extern WORD32 ixheaacd_ipd_de_quant_table_q28[16]; +extern const WORD32 ixheaacd_ipd_de_quant_table_q28[16]; #define P_PI 3.1415926535897932 #define PI_IN_Q28 843314880 -extern WORD32 ixheaacd_ipd_de_quant_table_q28[16]; - #define P_PI 3.1415926535897932 #define PI_IN_Q28 843314880 diff --git a/decoder/ixheaacd_mps_rom.c b/decoder/ixheaacd_mps_rom.c index 858f7f3..6dd2ded 100644 --- a/decoder/ixheaacd_mps_rom.c +++ b/decoder/ixheaacd_mps_rom.c @@ -23,7 +23,7 @@ #include <string.h> #include <assert.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" @@ -34,7 +34,7 @@ #include "ixheaacd_mps_nlc_dec.h" #include "ixheaacd_mps_huff_tab.h" -ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes = { +const ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes = { {{{{-1, 1}, {-2, 2}, {-3, 3}, {-4, 4}, {-5, 5}, {-6, 6}, {-7, 7}, {-8, 8}, {-9, 9}, {-10, 10}, {-11, 11}, {-12, 12}, {-13, 13}, {15, 14}, {-14, 16}, {-15, 17}, {-16, 18}, {-17, 19}, @@ -375,7 +375,7 @@ ia_huff_cld_nodes_struct ixheaacd_huff_cld_nodes = { {-23, 93}, {-7, 94}, {-147, -148}, {-116, -131}, {-25, 95}, {-40, 0}, {0, 0}, {0, 0}, {0, 0}}}}}}; -ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes = { +const ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes = { {{{{-1, 1}, {-2, 2}, {-3, 3}, {-4, 4}, {-5, 5}, {-6, 6}, {-7, -8}}}, {{{-1, 1}, {-2, 2}, {-3, 3}, {-4, 4}, {-5, 5}, {-6, 6}, {-7, -8}}}, {{{-1, 1}, {-2, 2}, {-3, 3}, {-4, 4}, {-5, 5}, {-6, 6}, {-7, -8}}}}, @@ -586,7 +586,7 @@ ia_huff_icc_nodes_struct ixheaacd_huff_icc_nodes = { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}}}}}; -ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes = { +const ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes = { {{{-1, 1}, {-8, 2}, {-2, 3}, {5, 4}, {-7, 6}, {-3, -5}, {-4, -6}}}, {{{{-1, 1}, {-8, 2}, {-2, 3}, {5, 4}, {-3, -7}, {-6, 6}, {-4, -5}}}, {{{-1, 1}, {-2, 2}, {-8, 3}, {-3, 4}, {-7, 5}, {-4, 6}, {-5, -6}}}, @@ -790,7 +790,7 @@ ia_huff_ipd_nodes_struct ixheaacd_huff_ipd_nodes = { {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}, {0, 0}}}}}}; -ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes = { +const ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes = { {{2, 1}, {4, 3}, {6, 5}, {8, 7}, {10, 9}, {12, 11}, {14, 13}, {-8, 15}, {-9, 16}, {-10, 17}, {-18, 18}, {-17, -19}, {-16, 19}, {-11, -20}, {-15, -21}, {-7, 20}, {-22, 21}, {-12, -14}, @@ -803,7 +803,7 @@ ia_huff_pt0_nodes_struct ixheaacd_huff_part0_nodes = { {-5, 18}, {-4, -19}, {-3, 19}, {-1, 20}, {-2, -20}, {22, 21}, {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}}; -ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes = { +const ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes = { {{2, 1}, {4, 3}, {6, 5}, {8, 7}, {10, 9}, {12, 11}, {14, 13}, {-8, 15}, {-9, 16}, {-10, 17}, {-18, 18}, {-17, -19}, {-16, 19}, {-11, -20}, {-15, -21}, {-7, 20}, {-22, 21}, {-12, -14}, @@ -816,10 +816,10 @@ ia_huff_pt0_nodes_struct ixheaacd_huff_pilot_nodes = { {-5, 18}, {-4, -19}, {-3, 19}, {-1, 20}, {-2, -20}, {22, 21}, {-21, 23}, {-22, -26}, {-23, 24}, {-24, -25}}}; -ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes = { +const ia_huff_lav_nodes_struct ixheaacd_huff_lav_idx_nodes = { {{-1, 1}, {-2, 2}, {-3, -4}}}; -ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes = { +const ia_huff_res_nodes_struct ixheaacd_huff_reshape_nodes = { {{2, 1}, {4, 3}, {6, 5}, {-33, 7}, {-17, 8}, {-49, 9}, {-34, 10}, {12, 11}, {-18, -35}, {-50, 13}, {15, 14}, {-40, 16}, {-36, 17}, {-19, 18}, {-1, -37}, {-51, 19}, {21, 20}, {-38, -65}, @@ -4762,7 +4762,7 @@ const WORD32 0x0070c8a4, 0xffeff6cb, 0x006b47fa, 0xfff0065d, 0x0065fde5, 0xffefc9b9, 0x006090c3, 0xffed978a, 0x005b5370, 0xffede50e}; -WORD32 ixheaacd_mps_pre_re[64] = { +const WORD32 ixheaacd_mps_pre_re[64] = { 0x01fff621, 0x01ffa72e, 0x01ff0956, 0x01fe1caf, 0x01fce15f, 0x01fb5797, 0x01f97f92, 0x01f7599a, 0x01f4e603, 0x01f2252f, 0x01ef178a, 0x01ebbd8c, 0x01e817ba, 0x01e426a4, 0x01dfeae6, 0x01db6526, 0x01d69617, 0x01d17e77, @@ -4775,7 +4775,7 @@ WORD32 ixheaacd_mps_pre_re[64] = { 0x00764d3e, 0x006a0a7f, 0x005db766, 0x005155d9, 0x0044e7c1, 0x00386f0a, 0x002bed9e, 0x001f656d, 0x0012d864, 0x00064873}; -WORD32 ixheaacd_mps_pre_im[64] = { +const WORD32 ixheaacd_mps_pre_im[64] = { 0x00064874, 0x0012d865, 0x001f656e, 0x002beda0, 0x00386f0b, 0x0044e7c3, 0x005155da, 0x005db767, 0x006a0a80, 0x00764d3f, 0x00827dc0, 0x008e9a22, 0x009aa086, 0x00a68f12, 0x00b263ef, 0x00be1d49, 0x00c9b953, 0x00d53641, @@ -4788,7 +4788,7 @@ WORD32 ixheaacd_mps_pre_im[64] = { 0x01f2252f, 0x01f4e603, 0x01f7599a, 0x01f97f92, 0x01fb5797, 0x01fce15f, 0x01fe1caf, 0x01ff0956, 0x01ffa72f, 0x01fff621}; -WORD32 ixheaacd_mps_post_re[128] = { +const WORD32 ixheaacd_mps_post_re[128] = { 0x7fffffff, 0x7ff62182, 0x7fd8878d, 0x7fa736b3, 0x7f62368e, 0x7f0991c2, 0x7e9d55fa, 0x7e1d93e8, 0x7d8a5f3d, 0x7ce3ceae, 0x7c29fbea, 0x7b5d0399, 0x7a7d0555, 0x798a23ab, 0x7884840c, 0x776c4ed3, 0x7641af33, 0x7504d33b, @@ -4812,7 +4812,7 @@ WORD32 ixheaacd_mps_post_re[128] = { 0x8275a09e, 0x81e26bf8, 0x8162a9ea, 0x80f66e27, 0x809dc95f, 0x8058c93f, 0x8027786a, 0x8009de7a}; -WORD32 ixheaacd_mps_post_im[128] = { +const WORD32 ixheaacd_mps_post_im[128] = { 0x00000000, 0x03242ac0, 0x0647d97f, 0x096a904d, 0x0c8bd363, 0x0fab2732, 0x12c81077, 0x15e2144e, 0x18f8b847, 0x1c0b8277, 0x1f19f989, 0x2223a4d4, 0x25280c6e, 0x2826b93a, 0x2b1f34fe, 0x2e110a76, 0x30fbc563, 0x33def29e, @@ -4836,15 +4836,15 @@ WORD32 ixheaacd_mps_post_im[128] = { 0x18f8b78f, 0x15e21395, 0x12c80fbd, 0x0fab2678, 0x0c8bd2a9, 0x096a8f92, 0x0647d8c3, 0x03242a04}; -WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = { +const WORD32 ixheaacd_ia_mps_hyb_filter_coeff_8[QMF_HYBRID_FILT_ORDER] = { 8011005, 24378459, 48821601, 78019304, 106140545, 126634002, 134217728, 126634002, 106140545, 78019304, 48821601, 24378459, 8011805}; -WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = { +const WORD32 ixheaacd_mps_hyb_filter_coeff_2[QMF_HYBRID_FILT_ORDER] = { 0, 20395592, 0, -78309485, 0, 328528819, 536870911, 328528819, 0, -78309485, 0, 20395592, 0}; -WORD32 ixheaacd_cosine[8][13] = { +const WORD32 ixheaacd_cosine[8][13] = { { -759250175, -410903263, -46, 410903167, 759250111, 992008063, 1073741823, 992008063, 759250111, 410903167, -46, -410903263, @@ -4883,7 +4883,7 @@ WORD32 ixheaacd_cosine[8][13] = { {-759249407, -410902399, 704, 410903679, 759250367, 992008191, 1073741823, 992008191, 759250367, 410903679, 704, -410902399, -759249407}}; -WORD32 ixheaacd_sine[8][13] = { +const WORD32 ixheaacd_sine[8][13] = { { 759250047, 992008063, 1073741823, 992008127, 759250111, 410903231, 0, -410903231, -759250111, -992008127, -1073741823, -992008063, -759250047, @@ -4915,7 +4915,7 @@ WORD32 ixheaacd_sine[8][13] = { {-759250879, -992008447, -1073741823, -992007871, -759249855, -410903039, 0, 410903039, 759249855, 992007871, 1073741823, 992008447, 759250879}}; -WORD32 ixheaacd_cosine2[2][13] = { +const WORD32 ixheaacd_cosine2[2][13] = { { 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, 1073741823, diff --git a/decoder/ixheaacd_mps_smoothing.c b/decoder/ixheaacd_mps_smoothing.c index 9a46d5c..f4917a4 100644 --- a/decoder/ixheaacd_mps_smoothing.c +++ b/decoder/ixheaacd_mps_smoothing.c @@ -17,18 +17,17 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include <math.h> +#include <stdlib.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" #include "ixheaacd_mps_polyphase.h" #include "ixheaacd_mps_dec.h" #include "ixheaacd_mps_interface.h" -#include <math.h> -#include <stdlib.h> -#include <ixheaacd_type_def.h> #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" VOID ixheaacd_mps_pre_matrix_mix_matrix_smoothing( ia_mps_dec_state_struct *self) { diff --git a/decoder/ixheaacd_mps_temp_process.c b/decoder/ixheaacd_mps_temp_process.c index 43e5781..736996c 100644 --- a/decoder/ixheaacd_mps_temp_process.c +++ b/decoder/ixheaacd_mps_temp_process.c @@ -17,7 +17,13 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include <math.h> +#include <float.h> +#include <memory.h> + +#include <assert.h> + +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" #include "ixheaacd_mps_polyphase.h" @@ -26,25 +32,19 @@ #include "ixheaacd_mps_process.h" -#include <math.h> -#include <float.h> -#include <memory.h> - -#include <assert.h> - #include "ixheaacd_common_rom.h" #include "ixheaacd_defines.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" @@ -67,13 +67,13 @@ #define max(a, b) ((a > b) ? (a) : (b)) #define min(a, b) ((a < b) ? (a) : (b)) -static FLOAT32 ixheaacd_bp[BP_SIZE] = { +static const FLOAT32 ixheaacd_bp[BP_SIZE] = { 0.0000f, 0.0005f, 0.0092f, 0.0587f, 0.2580f, 0.7392f, 0.9791f, 0.9993f, 1.0000f, 1.0000f, 1.0000f, 1.0000f, 0.9999f, 0.9984f, 0.9908f, 0.9639f, 0.8952f, 0.7711f, 0.6127f, 0.4609f, 0.3391f, 0.2493f, 0.1848f, 0.1387f, 0.1053f}; -static FLOAT32 ixheaacd_gf[BP_SIZE] = { +static const FLOAT32 ixheaacd_gf[BP_SIZE] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 1e-008f, 8.1e-007f, 3.61e-006f, 8.41e-006f, 1.6e-005f, 2.704e-005f, 3.969e-005f, 5.625e-005f, 7.396e-005f, @@ -241,4 +241,4 @@ WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) { ixheaacd_mps_synt_calc(self); return err; -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_mps_temp_reshape.c b/decoder/ixheaacd_mps_temp_reshape.c index 428fabd..fd8e62c 100644 --- a/decoder/ixheaacd_mps_temp_reshape.c +++ b/decoder/ixheaacd_mps_temp_reshape.c @@ -17,7 +17,8 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include <math.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_config.h" @@ -25,7 +26,6 @@ #include "ixheaacd_mps_dec.h" #include "ixheaacd_mps_interface.h" -#include <math.h> #define max(a, b) ((a) > (b) ? (a) : (b)) @@ -38,7 +38,7 @@ #define GES_ALPHA (0.99637864f) #define GES_BETA (0.9643691f) -extern WORD32 +extern const WORD32 ixheaacd_hybrid_band_71_to_processing_band_20_map[MAX_HYBRID_BANDS_MPS]; VOID ixheaacd_mps_env_init(ia_mps_dec_state_struct *self) { @@ -191,4 +191,4 @@ VOID ixheaacd_mps_time_env_shaping(ia_mps_dec_state_struct *self) { } } } -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_multichannel.c b/decoder/ixheaacd_multichannel.c index ae20586..d914ad2 100644 --- a/decoder/ixheaacd_multichannel.c +++ b/decoder/ixheaacd_multichannel.c @@ -19,7 +19,7 @@ */ #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_common.h" #include "ixheaacd_constants.h" @@ -74,7 +74,7 @@ #include "ixheaacd_headerdecode.h" #include "ixheaacd_multichannel.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" WORD cblock_decode_huff_symbol(UWORD8 *ptr_read_next, WORD32 bit_pos, const UWORD16 *huff_ori, WORD16 *input, diff --git a/decoder/ixheaacd_pns_js_thumb.c b/decoder/ixheaacd_pns_js_thumb.c index 534ec5b..39985dc 100644 --- a/decoder/ixheaacd_pns_js_thumb.c +++ b/decoder/ixheaacd_pns_js_thumb.c @@ -17,24 +17,26 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> -#include "string.h" +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_error_codes.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" #include "ixheaacd_aac_imdct.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_pulsedata.h" @@ -57,10 +59,6 @@ #include "ixheaacd_tns.h" #include "ixheaacd_function_selector.h" -#include <string.h> -#include <stdio.h> -#include <stdlib.h> - static PLATFORM_INLINE WORD16 ixheaacd_is_correlation( ia_aac_dec_channel_info_struct *ptr_aac_dec_channel_info, WORD16 pns_band) { ia_pns_correlation_info_struct *ptr_corr_info = @@ -440,4 +438,4 @@ VOID ixheaacd_aac_tns_process( } } } -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_pred_vec_block.c b/decoder/ixheaacd_pred_vec_block.c index 7831d07..11ea410 100644 --- a/decoder/ixheaacd_pred_vec_block.c +++ b/decoder/ixheaacd_pred_vec_block.c @@ -21,7 +21,7 @@ #include <stdlib.h> #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_const.h" #include "ixheaacd_pvc_dec.h" diff --git a/decoder/ixheaacd_process.c b/decoder/ixheaacd_process.c index d9e7175..f1c7202 100644 --- a/decoder/ixheaacd_process.c +++ b/decoder/ixheaacd_process.c @@ -21,15 +21,14 @@ #include <string.h> #include <math.h> -#include <ixheaacd_type_def.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_memory_standards.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_env_extr_part.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_common_rom.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_pns.h" @@ -110,6 +109,7 @@ IA_ERRORCODE ixheaacd_esbr_process(ia_usac_data_struct *usac_data, WORD32 stereo_config_idx, WORD16 num_channels, WORD32 audio_object_type) { + WORD32 ch; WORD32 err_code = 0; ia_aac_dec_sbr_bitstream_struct *esbr_bit_str = &usac_data->esbr_bit_str[0]; ia_handle_sbr_dec_inst_struct self = usac_data->pstr_esbr_dec; @@ -128,6 +128,13 @@ IA_ERRORCODE ixheaacd_esbr_process(ia_usac_data_struct *usac_data, self->sbr_mode = usac_data->sbr_mode; self->aot_usac_flag = usac_data->usac_flag; + for (ch = 0; ch < num_channels; ch++) { + if ((self->pstr_sbr_channel[ch] + ->str_sbr_dec.str_synthesis_qmf_bank.qmf_filter_state_size) < + QMF_FILTER_STATE_SYN_SIZE) + return IA_FATAL_ERROR; + } + err_code = ixheaacd_applysbr(self, esbr_bit_str, NULL, &num_channels, 1, 0, 0, &sbr_scratch_struct, 0, 1, 0, it_bit_buff, NULL, 0, audio_object_type); @@ -173,7 +180,7 @@ static WORD32 ixheaacd_read_ext_element( UWORD32 usac_ext_element_present; UWORD32 usac_ext_element_use_dft_length; UWORD32 pay_load_length, tmp; - UWORD32 i; + WORD32 i; usac_ext_element_present = ixheaacd_read_bits_buf(it_bit_buff, 1); if (usac_ext_element_present) { @@ -197,12 +204,22 @@ static WORD32 ixheaacd_read_ext_element( tmp = ixheaacd_read_bits_buf(it_bit_buff, 2); if (pstr_usac_dec_config->usac_ext_ele_payload_present[elem_idx]) { - for (i = 0; i < pay_load_length; i++) { - pstr_usac_dec_config->usac_ext_gain_payload_buf - [i + pstr_usac_dec_config->usac_ext_gain_payload_len] = + WORD32 preroll_counter = pstr_usac_dec_config->preroll_counter; + int payload_buffer_offeset = 0; + for (i = 0; i < preroll_counter; i++) + payload_buffer_offeset += + pstr_usac_dec_config->usac_ext_gain_payload_len[i] * + sizeof(WORD8); + if ((pay_load_length + payload_buffer_offeset) > + (MAX_AUDIO_PREROLLS * 768)) + return IA_FATAL_ERROR; + for (i = 0; i < ((WORD32)pay_load_length); i++) { + pstr_usac_dec_config + ->usac_ext_gain_payload_buf[i + payload_buffer_offeset] = ixheaacd_read_bits_buf(it_bit_buff, 8); } - pstr_usac_dec_config->usac_ext_gain_payload_len += pay_load_length; + pstr_usac_dec_config->usac_ext_gain_payload_len[preroll_counter] += + pay_load_length; } else { if (it_bit_buff->cnt_bits < (WORD32)(pay_load_length << 3)) { longjmp(*(it_bit_buff->xaac_jmp_buf), @@ -295,7 +312,6 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, WORD32 num_ch_out = 0; WORD32 num_elements = pstr_usac_dec_config->num_elements; - pstr_usac_dec_config->usac_ext_gain_payload_len = 0; pstr_usac_data->usac_independency_flg = ixheaacd_read_bits_buf(it_bit_buff, 1); @@ -354,15 +370,16 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, if (err_code < 0) return err_code; } - if (stereo_config_index > 0) { + if (stereo_config_index > 0 && pstr_usac_data->sbr_ratio_idx > 0) { FLOAT32 **ptr_inp[2 * 2]; WORD32 ch; *num_out_channels = p_state_aac_dec->mps_dec_handle.out_ch_count; - ixheaacd_mps_frame_parsing(&p_state_aac_dec->mps_dec_handle, - pstr_usac_data->usac_independency_flg, - it_bit_buff); + err = ixheaacd_mps_frame_parsing( + &p_state_aac_dec->mps_dec_handle, + pstr_usac_data->usac_independency_flg, it_bit_buff); + if (err) return err; for (ch = 0; ch < nr_core_coder_channels; ch++) { ptr_inp[2 * ch] = diff --git a/decoder/ixheaacd_ps_bitdec.c b/decoder/ixheaacd_ps_bitdec.c index 73ac4e0..d255f48 100644 --- a/decoder/ixheaacd_ps_bitdec.c +++ b/decoder/ixheaacd_ps_bitdec.c @@ -17,24 +17,24 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include "string.h" +#include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -275,4 +275,4 @@ VOID ixheaacd_decode_ps_data(ia_ps_dec_struct *ptr_ps_dec) { if (ptr_ps_dec->icc_mode == 2) ixheaacd_map_34_params_to_20(ptr_ps_dec->icc_par_table[e]); } -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_ps_dec.c b/decoder/ixheaacd_ps_dec.c index f8cd6ec..f576ca8 100644 --- a/decoder/ixheaacd_ps_dec.c +++ b/decoder/ixheaacd_ps_dec.c @@ -19,17 +19,17 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops_arr.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -39,7 +39,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -51,7 +51,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" diff --git a/decoder/ixheaacd_ps_dec.h b/decoder/ixheaacd_ps_dec.h index c4f957d..f441d35 100644 --- a/decoder/ixheaacd_ps_dec.h +++ b/decoder/ixheaacd_ps_dec.h @@ -110,8 +110,8 @@ typedef struct { ia_hybrid_struct str_hybrid; } ia_ps_dec_struct; -WORD32 ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec, - VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf); +VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec, + VOID *sbr_persistent_mem, WORD32 *ptr_overlap_buf); VOID ixheaacd_decorr_filter1_dec(ia_ps_dec_struct *ptr_ps_dec, ia_ps_tables_struct *ps_tables_ptr, diff --git a/decoder/ixheaacd_pvc_rom.c b/decoder/ixheaacd_pvc_rom.c index 3cf4ad5..f590ee5 100644 --- a/decoder/ixheaacd_pvc_rom.c +++ b/decoder/ixheaacd_pvc_rom.c @@ -17,7 +17,7 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_sbr_const.h" #include "ixheaacd_pvc_dec.h" diff --git a/decoder/ixheaacd_qmf_dec.c b/decoder/ixheaacd_qmf_dec.c index 8833289..8e8076e 100644 --- a/decoder/ixheaacd_qmf_dec.c +++ b/decoder/ixheaacd_qmf_dec.c @@ -20,7 +20,7 @@ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" @@ -41,7 +41,7 @@ #include "ixheaacd_env_extr.h" #include "ixheaacd_qmf_dec.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_env_calc.h" #include "ixheaacd_interface.h" diff --git a/decoder/ixheaacd_rev_vlc.c b/decoder/ixheaacd_rev_vlc.c index 5c51f64..2092174 100644 --- a/decoder/ixheaacd_rev_vlc.c +++ b/decoder/ixheaacd_rev_vlc.c @@ -20,7 +20,7 @@ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" #include "ixheaacd_basic_ops32.h" diff --git a/decoder/ixheaacd_rom.c b/decoder/ixheaacd_rom.c index 9467156..0e10e6a 100644 --- a/decoder/ixheaacd_rom.c +++ b/decoder/ixheaacd_rom.c @@ -17,7 +17,7 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -224,11 +224,11 @@ const WORD16 ixheaacd_sfb_8_960[] = { const WORD16 ixheaacd_sfb_8_120[] = {4, 8, 12, 16, 20, 24, 28, 36, 44, 52, 60, 72, 88, 108, 120}; -WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)] = { +const WORD32 ixheaacd_sampling_boundaries[(1 << LEN_SAMP_IDX)] = { 92017, 75132, 55426, 46009, 37566, 27713, 23004, 18783, 13856, 11502, 9391, 0, 0, 0, 0, 0}; -ia_usac_samp_rate_info ixheaacd_samp_rate_info[(1 << LEN_SAMP_IDX)] = { +const ia_usac_samp_rate_info ixheaacd_samp_rate_info[(1 << LEN_SAMP_IDX)] = { {96000, 41, ixheaacd_sfb_96_1024, 12, ixheaacd_sfb_96_128, 40, ixheaacd_sfb_96_960, 12, ixheaacd_sfb_96_120, 37, ixheaacd_sfb_96_768, 12, @@ -3606,7 +3606,7 @@ const FLOAT64 ixheaacd_power_10_table[28] = { 5.179474679231, 5.623413251903, 6.105402296585, 6.628703161826, 7.196856730012, 7.813707376518, 8.483428982441, 9.210553176895}; -float ixheaacd_dico_lsf_abs_8b_flt[16 * 256] = { +const FLOAT32 ixheaacd_dico_lsf_abs_8b_flt[16 * 256] = { 377.3749f, 688.0079f, 1147.3799f, 1461.0438f, 1786.7794f, 2143.6711f, 2522.1946f, 2889.7402f, 3263.6023f, 3628.4624f, 4005.4351f, 4379.4170f, 4783.9556f, 5157.1753f, 5555.1797f, 5926.6816f, 601.5123f, 1066.8242f, diff --git a/decoder/ixheaacd_sbr_const.h b/decoder/ixheaacd_sbr_const.h index 9137c93..ecf3478 100644 --- a/decoder/ixheaacd_sbr_const.h +++ b/decoder/ixheaacd_sbr_const.h @@ -97,8 +97,9 @@ #define MAX_NUM_QMF_BANDS_ESBR 128 #define SBR_HF_ADJ_OFFSET 2 +#define MPS_SBR_DELAY 6 /* 6 qmf samples */ -#define ESBR_HBE_DELAY_OFFSET 32 +#define ESBR_HBE_DELAY_OFFSET 32 /* 32 qmf samples */ #define HBE_OPER_WIN_LEN (13) #define NO_QMF_SYNTH_CHANNELS 64 diff --git a/decoder/ixheaacd_sbr_crc.c b/decoder/ixheaacd_sbr_crc.c index ee6c9b9..7dede60 100644 --- a/decoder/ixheaacd_sbr_crc.c +++ b/decoder/ixheaacd_sbr_crc.c @@ -17,7 +17,7 @@ ***************************************************************************** * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_sbr_crc.h" diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c index e58f2d4..671f4d6 100644 --- a/decoder/ixheaacd_sbr_dec.c +++ b/decoder/ixheaacd_sbr_dec.c @@ -19,15 +19,15 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -36,7 +36,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -56,7 +56,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" @@ -450,26 +450,6 @@ VOID ixheaacd_esbr_synthesis_filt_block( ia_sbr_frame_info_data_struct *ptr_frame_data, WORD32 apply_processing, FLOAT32 **qmf_buf_real, FLOAT32 **qmf_buf_imag, WORD32 stereo_config_idx, ia_sbr_tables_struct *sbr_tables_ptr, WORD32 mps_sbr_flag, WORD32 ch_fac) { - WORD32 i, k, p1; - WORD32 *ptr_filt_states; - WORD32 *ptr_filt_states_1; - WORD32 *ptr_filt_states_2; - WORD32 *filter_l; - WORD32 *ploc_qmf_buf_real; - WORD32 *ploc_qmf_buf_imag; - WORD32 out_scalefactor; - WORD32 sixty4; - WORD32 no_synthesis_channels; - WORD32 ixheaacd_drc_offset; - FLOAT32 *syn_buffer; - WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local; - WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]); - - ia_sbr_qmf_filter_bank_struct *qmf_bank = - &ptr_sbr_dec->str_synthesis_qmf_bank; - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr = - sbr_tables_ptr->qmf_dec_tables_ptr; - if (!mps_sbr_flag) { ixheaacd_esbr_synthesis_regrp(&qmf_buf_real[0][0], &qmf_buf_imag[0][0], ptr_sbr_dec, ptr_frame_data, ptr_header_data, @@ -479,74 +459,94 @@ VOID ixheaacd_esbr_synthesis_filt_block( ptr_sbr_dec, stereo_config_idx); } - out_scalefactor = 5; - qmf_bank->no_channels = 64; - qmf_bank->esbr_cos_twiddle = - (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64; - qmf_bank->esbr_alt_sin_twiddle = - (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64; - - qmf_bank->filter_pos_syn_32 += - qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32; - qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c; + if (stereo_config_idx <= 0) { + WORD32 i, k, p1; + WORD32 *ptr_filt_states; + WORD32 *ptr_filt_states_1; + WORD32 *ptr_filt_states_2; + WORD32 *filter_l; + WORD32 *ploc_qmf_buf_real; + WORD32 *ploc_qmf_buf_imag; + WORD32 out_scalefactor; + WORD32 sixty4; + WORD32 no_synthesis_channels; + WORD32 ixheaacd_drc_offset; + FLOAT32 *syn_buffer; + WORD32 *local_qmf_buffer = ptr_sbr_dec->sbr_scratch_local; + WORD32 *time_out = &(ptr_sbr_dec->sbr_scratch_local[128]); + ia_sbr_qmf_filter_bank_struct *qmf_bank = + &ptr_sbr_dec->str_synthesis_qmf_bank; + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr = + sbr_tables_ptr->qmf_dec_tables_ptr; + out_scalefactor = 5; + qmf_bank->no_channels = 64; + qmf_bank->esbr_cos_twiddle = + (WORD32 *)qmf_dec_tables_ptr->esbr_sin_cos_twiddle_l64; + qmf_bank->esbr_alt_sin_twiddle = + (WORD32 *)qmf_dec_tables_ptr->esbr_alt_sin_twiddle_l64; + + qmf_bank->filter_pos_syn_32 += + qmf_dec_tables_ptr->esbr_qmf_c - qmf_bank->p_filter_32; + qmf_bank->p_filter_32 = qmf_dec_tables_ptr->esbr_qmf_c; + + sixty4 = NO_SYNTHESIS_CHANNELS; + + ptr_filt_states = qmf_bank->filter_states_32; + + no_synthesis_channels = qmf_bank->no_channels; + ptr_filt_states_1 = &ptr_filt_states[0]; + ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels; + + filter_l = qmf_bank->filter_pos_syn_32; + + p1 = 0; + + ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset; - sixty4 = NO_SYNTHESIS_CHANNELS; - - ptr_filt_states = qmf_bank->filter_states_32; + for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { + for (k = 0; k < 64; k++) { + local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64); + local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64); + } + ploc_qmf_buf_real = local_qmf_buffer; + ploc_qmf_buf_imag = local_qmf_buffer + 64; - no_synthesis_channels = qmf_bank->no_channels; - ptr_filt_states_1 = &ptr_filt_states[0]; - ptr_filt_states_2 = ptr_filt_states_1 + no_synthesis_channels; + ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real, + &ptr_sbr_dec->str_synthesis_qmf_bank, + sbr_tables_ptr->qmf_dec_tables_ptr); - filter_l = qmf_bank->filter_pos_syn_32; + ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag, + &ptr_filt_states[ixheaacd_drc_offset], + no_synthesis_channels, + out_scalefactor + 1); - p1 = 0; + ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2, + filter_l, &time_out[0], ch_fac); - ixheaacd_drc_offset = qmf_bank->ixheaacd_drc_offset; + syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64; + for (k = 0; k < 64; k++) { + syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16); + } - for (i = 0; i < ptr_sbr_dec->str_codec_qmf_bank.num_time_slots; i++) { - for (k = 0; k < 64; k++) { - local_qmf_buffer[k + 0] = (WORD32)(qmf_buf_real[i][k] * 64); - local_qmf_buffer[k + 64] = (WORD32)(qmf_buf_imag[i][k] * 64); - } - ploc_qmf_buf_real = local_qmf_buffer; - ploc_qmf_buf_imag = local_qmf_buffer + 64; + ptr_filt_states_1 += sixty4; + ptr_filt_states_2 -= sixty4; + sixty4 = -sixty4; + ixheaacd_drc_offset -= 128; - ixheaacd_esbr_inv_modulation(ploc_qmf_buf_real, - &ptr_sbr_dec->str_synthesis_qmf_bank, - sbr_tables_ptr->qmf_dec_tables_ptr); + if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280; - ixheaacd_shiftrountine_with_rnd_hq(ploc_qmf_buf_real, ploc_qmf_buf_imag, - &ptr_filt_states[ixheaacd_drc_offset], - no_synthesis_channels, - out_scalefactor + 1); + filter_l += 64; - ixheaacd_esbr_qmfsyn64_winadd(ptr_filt_states_1, ptr_filt_states_2, - filter_l, &time_out[0], ch_fac); + if (filter_l == qmf_bank->p_filter_32 + 640) + filter_l = (WORD32 *)qmf_bank->p_filter_32; - syn_buffer = ptr_sbr_dec->time_sample_buf + i * 64; - for (k = 0; k < 64; k++) { - syn_buffer[k] = (FLOAT32)time_out[k] / (1 << 16); + p1 += no_synthesis_channels; } - ptr_filt_states_1 += sixty4; - ptr_filt_states_2 -= sixty4; - sixty4 = -sixty4; - ixheaacd_drc_offset -= 128; - - if (ixheaacd_drc_offset < 0) ixheaacd_drc_offset += 1280; - - filter_l += 64; - - if (filter_l == qmf_bank->p_filter_32 + 640) - filter_l = (WORD32 *)qmf_bank->p_filter_32; - - p1 += no_synthesis_channels; + qmf_bank->filter_pos_syn_32 = filter_l; + qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset; } - qmf_bank->filter_pos_syn_32 = filter_l; - qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset; - if (!mps_sbr_flag) ptr_frame_data->reset_flag = 0; if (apply_processing && !mps_sbr_flag) { @@ -653,11 +653,14 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, WORD32 core_frame_size = ptr_header_data->core_frame_size; if (hbe_flag) { - codec_x_delay = 32; + codec_x_delay = ESBR_HBE_DELAY_OFFSET; } if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { codec_x_delay = 2 * codec_x_delay; } + /* fixed decoder delay for bitstreams with SBR 4:1 and stereoConfigIndex 3 + */ + if (mps_sbr_flag) op_delay = MPS_SBR_DELAY; if (hbe_flag || mps_sbr_flag) { core_syn_ch_index = num_anal_bands; @@ -749,10 +752,13 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac; if (sbr_mode == PVC_SBR) { - ixheaacd_pvc_process( + err_code = ixheaacd_pvc_process( ptr_pvc_data, ptr_header_data->pstr_freq_band_data->sub_band_start, ptr_frame_data->str_pvc_frame_info.border_vec[0], &pvc_qmf_enrg_arr[0], &pvc_dec_out_buf[0]); + + if (err_code) return err_code; + ptr_pvc_data->prev_pvc_flg = 1; } else { memset(pvc_dec_out_buf, 0, 1024 * sizeof(FLOAT32)); @@ -880,6 +886,7 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, if (apply_processing) { WORD16 degree_alias[NO_SYNTHESIS_CHANNELS]; WORD16 *border_vec = ptr_frame_data->str_frame_info_details.border_vec; + IA_ERRORCODE error_code = IA_NO_ERROR; if (low_pow_flag) { memset(degree_alias, 0, NO_SYNTHESIS_CHANNELS * sizeof(WORD16)); @@ -919,13 +926,14 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, audio_object_type); } - ixheaacd_calc_sbrenvelope( + error_code = ixheaacd_calc_sbrenvelope( &ptr_sbr_dec->str_sbr_scale_fact, &ptr_sbr_dec->str_sbr_calc_env, ptr_header_data, ptr_frame_data, ptr_frame_data_prev, p_arr_qmf_buf_real, p_arr_qmf_buf_imag, degree_alias, low_pow_flag, sbr_tables_ptr, pstr_common_tables, ptr_work_buf_core + (LPC_ORDER << (6 + !low_pow_flag)), audio_object_type); + if (error_code) return error_code; memcpy(ptr_frame_data_prev->sbr_invf_mode, ptr_frame_data->sbr_invf_mode, ptr_header_data->pstr_freq_band_data->num_if_bands * sizeof(WORD32)); diff --git a/decoder/ixheaacd_sbr_rom.c b/decoder/ixheaacd_sbr_rom.c index a827c8f..4bca7de 100644 --- a/decoder/ixheaacd_sbr_rom.c +++ b/decoder/ixheaacd_sbr_rom.c @@ -19,12 +19,12 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_defines.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -39,7 +39,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" diff --git a/decoder/ixheaacd_sbrdec_initfuncs.c b/decoder/ixheaacd_sbrdec_initfuncs.c index 524b80a..f779c84 100644 --- a/decoder/ixheaacd_sbrdec_initfuncs.c +++ b/decoder/ixheaacd_sbrdec_initfuncs.c @@ -19,23 +19,23 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_sbr_const.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_defines.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -49,7 +49,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_ps_bitdec.h" @@ -77,7 +77,7 @@ WORD32 ixheaacd_getsize_sbr_persistent() { return (ALIGN_SIZE64(sizeof(ia_sbr_pers_struct))); } -WORD32 ixheaacd_esbr_hbe_data_init( +VOID ixheaacd_esbr_hbe_data_init( ia_esbr_hbe_txposer_struct *pstr_esbr_hbe_txposer, const WORD32 num_aac_samples, WORD32 samp_fac_4_flag, const WORD32 num_out_samples, VOID *persistent_hbe_mem) { @@ -126,7 +126,7 @@ WORD32 ixheaacd_esbr_hbe_data_init( pstr_esbr_hbe_txposer->upsamp_4_flag = samp_fac_4_flag; } - return 0; + return; } VOID ixheaacd_set_sbr_persistent_table_pointer( @@ -552,16 +552,13 @@ ia_handle_sbr_dec_inst_struct ixheaacd_init_sbr( if (channel != 1) { if (ps_enable) { if (audio_object_type == AOT_ER_AAC_ELD) - err = (WORD16)ixheaacd_create_psdec( + ixheaacd_create_psdec( sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec, sbr_persistent_mem, &ptr_overlap_buf[512 * 4]); else - err = (WORD16)ixheaacd_create_psdec( + ixheaacd_create_psdec( sbr_persistent_mem->str_sbr_dec_inst.pstr_ps_stereo_dec, sbr_persistent_mem, ptr_overlap_buf); - if (err) { - return NULL; - } } } @@ -791,7 +788,7 @@ static PLATFORM_INLINE VOID ixheaacd_init_sbr_prev_framedata( ptr_prev_data->max_qmf_subband_aac = 0; } -static PLATFORM_INLINE WORD32 +static PLATFORM_INLINE VOID ixheaacd_create_hyb_filterbank(ia_hybrid_struct *ptr_hybrid, WORD32 **p_ptr, ia_sbr_tables_struct *sbr_tables_ptr) { WORD16 i, ptr_step; @@ -827,10 +824,10 @@ ixheaacd_create_hyb_filterbank(ia_hybrid_struct *ptr_hybrid, WORD32 **p_ptr, *p_ptr = ptr; - return 0; + return; } -static PLATFORM_INLINE WORD16 ixheaacd_create_hf_generator( +static PLATFORM_INLINE VOID ixheaacd_create_hf_generator( ia_sbr_hf_generator_struct *ptr_hf_gen_str, WORD16 num_columns, WORD16 chan, VOID *sbr_persistent_mem_v, WORD32 ps_enable) { WORD16 i; @@ -863,12 +860,12 @@ static PLATFORM_INLINE WORD16 ixheaacd_create_hf_generator( if (chan == 0) { ptr_hf_gen_str->pstr_settings->num_columns = num_columns; } - return 0; + return; } -WORD32 ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec, - VOID *sbr_persistent_mem_v, - WORD32 *ptr_overlap_buf) { +VOID ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec, + VOID *sbr_persistent_mem_v, + WORD32 *ptr_overlap_buf) { ia_sbr_pers_struct *sbr_persistent_mem = (ia_sbr_pers_struct *)sbr_persistent_mem_v; @@ -952,10 +949,10 @@ WORD32 ixheaacd_create_psdec(ia_ps_dec_struct *ptr_ps_dec, (NO_IID_GROUPS + 2) * 2 * sizeof(WORD16)); memset(ptr_ps_dec->h21_h22_vec, 0, sizeof(ptr_ps_dec->h21_h22_vec)); - return 0; + return; } -static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_anal_qmfbank( +static PLATFORM_INLINE VOID ixheaacd_create_cplx_anal_qmfbank( ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf, ia_sbr_scale_fact_struct *sbr_scale_factor, WORD16 no_bins, WORD16 usb, WORD16 chan, WORD16 *sbr_qmf_analy_states, WORD32 *sbr_qmf_analy_states_32, @@ -1014,10 +1011,10 @@ static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_anal_qmfbank( ptr_sbr_qmf->anal_filter_states + NO_ANALYSIS_CHANNELS; } - return 0; + return; } -static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_synt_qmfbank( +static PLATFORM_INLINE VOID ixheaacd_create_cplx_synt_qmfbank( ia_sbr_qmf_filter_bank_struct *ptr_sbr_qmf, WORD16 no_bins, WORD16 lsb, WORD16 usb, WORD16 chan, FLAG down_sample_flag, WORD16 *sbr_qmf_synth_states, WORD32 *sbr_qmf_synth_states_32, @@ -1027,14 +1024,13 @@ static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_synt_qmfbank( WORD32 qmf_filter_state_size; memset(ptr_sbr_qmf, 0, sizeof(ia_sbr_qmf_filter_bank_struct)); + qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE; if (down_sample_flag) { L = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED; - qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE_DOWN_SAMPLED; ptr_sbr_qmf->usb = NO_SYNTHESIS_CHANNELS_DOWN_SAMPLED; } else { L = NO_SYNTHESIS_CHANNELS; - qmf_filter_state_size = QMF_FILTER_STATE_SYN_SIZE; ptr_sbr_qmf->usb = usb; } @@ -1075,7 +1071,7 @@ static PLATFORM_INLINE WORD32 ixheaacd_create_cplx_synt_qmfbank( ptr_sbr_qmf->sixty4 = NO_SYNTHESIS_CHANNELS; } - return 0; + return; } WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table, @@ -1133,13 +1129,9 @@ WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table, ixheaacd_init_sbr_prev_framedata(ptr_sbr_channel->pstr_prev_frame_data, time_slots); - err = ixheaacd_create_hf_generator(&hs->str_hf_generator, - hs->str_codec_qmf_bank.num_time_slots, - chan, sbr_persistent_mem, ps_enable); - - if (err) { - return (-1); - } + ixheaacd_create_hf_generator(&hs->str_hf_generator, + hs->str_codec_qmf_bank.num_time_slots, chan, + sbr_persistent_mem, ps_enable); hs->ptr_sbr_overlap_buf = sbr_persistent_mem->ptr_sbr_overlap_buf[chan]; diff --git a/decoder/ixheaacd_sbrdec_lpfuncs.c b/decoder/ixheaacd_sbrdec_lpfuncs.c index 33213ec..5e535dc 100644 --- a/decoder/ixheaacd_sbrdec_lpfuncs.c +++ b/decoder/ixheaacd_sbrdec_lpfuncs.c @@ -20,23 +20,23 @@ #include <string.h> #include <math.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_sbr_const.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_defines.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -50,7 +50,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_ps_bitdec.h" @@ -73,11 +73,12 @@ #define ALIGN_SIZE64(x) ((((x) + 7) >> 3) << 3) -static FLOAT32 ixheaacd_new_bw_table[4][4] = {{0.00f, 0.60f, 0.90f, 0.98f}, - {0.60f, 0.75f, 0.90f, 0.98f}, - {0.00f, 0.75f, 0.90f, 0.98f}, - {0.00f, 0.75f, 0.90f, 0.98f}}; -static WORD32 ixheaacd_inew_bw_table[4][4] = { +static const FLOAT32 ixheaacd_new_bw_table[4][4] = { + {0.00f, 0.60f, 0.90f, 0.98f}, + {0.60f, 0.75f, 0.90f, 0.98f}, + {0.00f, 0.75f, 0.90f, 0.98f}, + {0.00f, 0.75f, 0.90f, 0.98f}}; +static const WORD32 ixheaacd_inew_bw_table[4][4] = { {0x00000000, 0x4ccccccd, 0x73333333, 0x7d70a3d7}, {0x4ccccccd, 0x60000000, 0x73333333, 0x7d70a3d7}, {0x00000000, 0x60000000, 0x73333333, 0x7d70a3d7}, @@ -89,7 +90,7 @@ VOID ixheaacd_reset_sbrenvelope_calc(ia_sbr_calc_env_struct *h_cal_env) { h_cal_env->start_up = 1; } -WORD32 ixheaacd_derive_lim_band_tbl( +VOID ixheaacd_derive_lim_band_tbl( ia_sbr_header_data_struct *ptr_header_data, const ia_patch_param_struct *p_str_patch_param, WORD16 num_patches, ixheaacd_misc_tables *pstr_common_tables) { @@ -110,8 +111,8 @@ WORD32 ixheaacd_derive_lim_band_tbl( WORD16 sub_band_start = f_low_tbl[0]; WORD16 sub_band_end = f_low_tbl[num_low_bnd]; - WORD16 limbnd_per_oct[4] = {(WORD16)0x2000, (WORD16)0x2666, (WORD16)0x4000, - (WORD16)0x6000}; + static const WORD16 limbnd_per_oct[4] = {(WORD16)0x2000, (WORD16)0x2666, + (WORD16)0x4000, (WORD16)0x6000}; if (limiter_bands == 0) { f_lim_tbl[0] = 0; @@ -185,7 +186,7 @@ WORD32 ixheaacd_derive_lim_band_tbl( } *num_lf_bands = nr_lim; - return 0; + return; } VOID ixheaacd_lean_sbrconcealment( @@ -355,13 +356,16 @@ WORD32 ixheaacd_reset_hf_generator(ia_sbr_hf_generator_struct *ptr_hf_gen_str, while (((sb - usb) < 0) && (patch < MAX_NUM_PATCHES)) { ia_patch_param_struct *ptr_loc_patch_param = &p_str_patch_param[patch]; - + WORD16 abs_sb, flag_break = 0; ptr_loc_patch_param->guard_start_band = sb; sb = (sb + GUARDBANDS); ptr_loc_patch_param->dst_start_band = sb; num_bands_in_patch = (goal_sb - sb); - + if ((num_bands_in_patch <= 0) && + ((num_bands_in_patch - (lsb - src_start_band)) < 0)) { + flag_break = 1; + } if ((num_bands_in_patch - (lsb - src_start_band)) >= 0) { patch_stride = sb - src_start_band; patch_stride = (WORD16)(patch_stride & ~1); @@ -386,9 +390,12 @@ WORD32 ixheaacd_reset_hf_generator(ia_sbr_hf_generator_struct *ptr_hf_gen_str, } src_start_band = SHIFT_START_SB; + abs_sb = ixheaacd_abs16_sat((WORD16)((sb - goal_sb))) - 3; - if ((ixheaacd_abs16_sat((WORD16)((sb - goal_sb))) - 3) < 0) { + if (abs_sb < 0) { goal_sb = usb; + } else { + if (flag_break == 1) break; } } @@ -413,6 +420,8 @@ WORD32 ixheaacd_reset_hf_generator(ia_sbr_hf_generator_struct *ptr_hf_gen_str, temp = ixheaacd_max32(temp, p_str_patch_param[patch].src_end_band); } + if (sb > temp) return IA_FATAL_ERROR; + pstr_transposer_settings->start_patch = sb; pstr_transposer_settings->stop_patch = temp; diff --git a/decoder/ixheaacd_sbrdecoder.c b/decoder/ixheaacd_sbrdecoder.c index 4ab91f7..06452b3 100644 --- a/decoder/ixheaacd_sbrdecoder.c +++ b/decoder/ixheaacd_sbrdecoder.c @@ -19,23 +19,23 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_sbr_const.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_defines.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -49,7 +49,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_ps_bitdec.h" @@ -203,7 +203,7 @@ static WORD32 ixheaacd_sbr_dec_reset(ia_sbr_dec_struct *ptr_sbr_dec, err |= ixheaacd_reset_hf_generator(&ptr_sbr_dec->str_hf_generator, ptr_header_data, audio_object_type); - err |= ixheaacd_derive_lim_band_tbl( + ixheaacd_derive_lim_band_tbl( ptr_header_data, ptr_sbr_dec->str_hf_generator.pstr_settings->str_patch_param, ptr_sbr_dec->str_hf_generator.pstr_settings->num_patches, @@ -213,10 +213,9 @@ static WORD32 ixheaacd_sbr_dec_reset(ia_sbr_dec_struct *ptr_sbr_dec, return err; } -WORD32 ixheaacd_prepare_upsamp(ia_sbr_header_data_struct **ptr_header_data, - ia_sbr_channel_struct *pstr_sbr_channel[2], - WORD32 num_channels) { - WORD16 err = 0; +VOID ixheaacd_prepare_upsamp(ia_sbr_header_data_struct **ptr_header_data, + ia_sbr_channel_struct *pstr_sbr_channel[2], + WORD32 num_channels) { WORD32 lr; ia_sbr_qmf_filter_bank_struct *sbr_qmf_bank; @@ -235,7 +234,7 @@ WORD32 ixheaacd_prepare_upsamp(ia_sbr_header_data_struct **ptr_header_data, sbr_qmf_bank->usb = NO_ANALYSIS_CHANNELS; ptr_header_data[lr]->sync_state = UPSAMPLING; } - return err; + return; } IA_ERRORCODE ixheaacd_applysbr( @@ -500,6 +499,7 @@ IA_ERRORCODE ixheaacd_applysbr( if (err || (ptr_header_data[k]->sync_state == SBR_NOT_INITIALIZED)) { WORD32 lr1 = ps_enable ? 2 : num_channels; ixheaacd_prepare_upsamp(ptr_header_data, pstr_sbr_channel, lr1); + if (err) return err; } if (frame_status && (ptr_header_data[k]->sync_state == SBR_ACTIVE)) { @@ -521,6 +521,7 @@ IA_ERRORCODE ixheaacd_applysbr( frame_status = ixheaacd_sbr_read_sce( ptr_header_data[k], ptr_frame_data[k], self->pstr_ps_stereo_dec, it_bit_buff, self->pstr_sbr_tables, audio_object_type); + if (frame_status < 0) return frame_status; } else if (ptr_frame_data[k]->sbr_mode == PVC_SBR) { frame_status = ixheaacd_sbr_read_pvc_sce( ptr_frame_data[k], it_bit_buff, 0, self->ptr_pvc_data_str, diff --git a/decoder/ixheaacd_spectrum_dec.c b/decoder/ixheaacd_spectrum_dec.c index c827a02..8d73ee6 100644 --- a/decoder/ixheaacd_spectrum_dec.c +++ b/decoder/ixheaacd_spectrum_dec.c @@ -20,7 +20,7 @@ #include <math.h> #include <stdio.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" @@ -45,11 +45,6 @@ #include "ixheaacd_bit_extract.h" #include "ixheaacd_func_def.h" - -#include <math.h> -#include <stdio.h> -#include <string.h> - #include "ixheaacd_interface.h" #include "ixheaacd_info.h" @@ -91,8 +86,9 @@ VOID ixheaacd_read_tns_u(ia_sfb_info_struct *ptr_sfb_info, WORD16 *sp, tmp, s_mask, n_mask; ia_tns_filter_struct *tns_filt; ia_tns_info_struct *pstr_tns_info; - static WORD16 sgn_mask[] = {0x2, 0x4, 0x8}; - static WORD16 neg_mask[] = {(WORD16)0xfffc, (WORD16)0xfff8, (WORD16)0xfff0}; + static const WORD16 sgn_mask[] = {0x2, 0x4, 0x8}; + static const WORD16 neg_mask[] = {(WORD16)0xfffc, (WORD16)0xfff8, + (WORD16)0xfff0}; WORD16 n_filt_bits; WORD16 start_band_bits; @@ -457,4 +453,4 @@ WORD32 ixheaacd_fd_channel_stream( } return 0; -} +}
\ No newline at end of file diff --git a/decoder/ixheaacd_stereo.c b/decoder/ixheaacd_stereo.c index ac0f313..28a3e31 100644 --- a/decoder/ixheaacd_stereo.c +++ b/decoder/ixheaacd_stereo.c @@ -18,21 +18,21 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_pulsedata.h" diff --git a/decoder/ixheaacd_struct_def.h b/decoder/ixheaacd_struct_def.h index ee52f0c..d348d99 100644 --- a/decoder/ixheaacd_struct_def.h +++ b/decoder/ixheaacd_struct_def.h @@ -32,6 +32,7 @@ #define MAX_NUM_OTT_AT \ (MAX_OUTPUT_CHANNELS * ((1 << MAX_ARBITRARY_TREE_LEVELS) - 1)) #define MAX_PARAMETER_BANDS (28) +#define MAX_DECOR_CONFIG_IDX (2) #define MAX_HYBRID_BANDS (MAX_NUM_QMF_BANDS - 3 + 10) @@ -234,6 +235,8 @@ typedef struct ia_aac_dec_state_struct { ia_sbr_header_data_struct str_sbr_config; jmp_buf xaac_jmp_buf; WORD32 decode_create_done; + WORD32 fatal_err_present; + WORD8 *pers_mem_ptr; } ia_aac_dec_state_struct; typedef struct ia_exhaacplus_dec_api_struct { @@ -273,7 +276,7 @@ VOID ixheaacd_allocate_mem_persistent( WORD32 ixheaacd_dec_mem_api(ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec, WORD32 i_cmd, WORD32 i_idx, VOID *pv_value); -WORD32 ixheaacd_fill_aac_mem_tables( +VOID ixheaacd_fill_aac_mem_tables( ia_exhaacplus_dec_api_struct *p_obj_exhaacplus_dec); WORD32 ixheaacd_decoder_2_ga_hdr( diff --git a/decoder/ixheaacd_tcx_fwd_alcnx.c b/decoder/ixheaacd_tcx_fwd_alcnx.c index bf579d2..411bf35 100644 --- a/decoder/ixheaacd_tcx_fwd_alcnx.c +++ b/decoder/ixheaacd_tcx_fwd_alcnx.c @@ -22,7 +22,7 @@ #include <stdio.h> #include <math.h> #include <string.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -50,9 +50,8 @@ #include "ixheaacd_acelp_com.h" #include "ixheaacd_constants.h" -#include <ixheaacd_type_def.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" static FLOAT32 ixheaacd_randomsign(UWORD32 *seed); #define ABS(A) ((A) < 0 ? (-A) : (A)) @@ -236,10 +235,12 @@ WORD32 ixheaacd_tcx_mdct(ia_usac_data_struct *usac_data, ixheaacd_low_fq_deemphasis(x, lg, alfd_gains); ixheaacd_lpc_coeff_wt_apply(lp_flt_coff_a + (ORDER + 1), i_ap); - ixheaacd_lpc_to_td(i_ap, ORDER, gain1, usac_data->len_subfrm / 4); + err = ixheaacd_lpc_to_td(i_ap, ORDER, gain1, usac_data->len_subfrm / 4); + if (err) return err; ixheaacd_lpc_coeff_wt_apply(lp_flt_coff_a + (2 * (ORDER + 1)), i_ap); - ixheaacd_lpc_to_td(i_ap, ORDER, gain2, usac_data->len_subfrm / 4); + err = ixheaacd_lpc_to_td(i_ap, ORDER, gain2, usac_data->len_subfrm / 4); + if (err) return err; energy = 0.01f; for (i = 0; i < lg; i++) energy += x[i] * x[i]; diff --git a/decoder/ixheaacd_tcx_fwd_mdct.c b/decoder/ixheaacd_tcx_fwd_mdct.c index 8778224..de153bb 100644 --- a/decoder/ixheaacd_tcx_fwd_mdct.c +++ b/decoder/ixheaacd_tcx_fwd_mdct.c @@ -24,11 +24,10 @@ #include <string.h> #include "ixheaacd_cnst.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_acelp_com.h" -#include <ixheaacd_type_def.h> #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -49,8 +48,8 @@ #include "ixheaacd_sbr_const.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_main.h" #include "ixheaacd_arith_dec.h" @@ -114,7 +113,7 @@ VOID ixheaacd_lsp_to_lp_conversion(FLOAT32 *lsp, FLOAT32 *lp_flt_coff_a) { return; } -VOID ixheaacd_lpc_to_td(float *coeff, WORD32 order, float *gains, WORD32 lg) { +WORD32 ixheaacd_lpc_to_td(float *coeff, WORD32 order, float *gains, WORD32 lg) { FLOAT32 data_r[LEN_SUPERFRAME * 2]; FLOAT32 data_i[LEN_SUPERFRAME * 2]; FLOAT64 avg_fac; @@ -126,6 +125,7 @@ VOID ixheaacd_lpc_to_td(float *coeff, WORD32 order, float *gains, WORD32 lg) { FLOAT32 ftemp = 0; FLOAT32 tmp, qfac; WORD32 i, size_n; + WORD32 err = 0; size_n = 2 * lg; avg_fac = PI / (FLOAT32)(size_n); @@ -153,7 +153,8 @@ VOID ixheaacd_lpc_to_td(float *coeff, WORD32 order, float *gains, WORD32 lg) { idata_i[i] = (WORD32)(data_i[i] * ((WORD64)1 << qshift)); } - ixheaacd_complex_fft(idata_r, idata_i, size_n, -1, &preshift); + err = ixheaacd_complex_fft(idata_r, idata_i, size_n, -1, &preshift); + if (err) return err; qfac = 1.0f / ((FLOAT32)((WORD64)1 << (qshift - preshift))); @@ -167,7 +168,7 @@ VOID ixheaacd_lpc_to_td(float *coeff, WORD32 order, float *gains, WORD32 lg) { (FLOAT32)(1.0f / sqrt(data_r[i] * data_r[i] + data_i[i] * data_i[i])); } - return; + return err; } VOID ixheaacd_noise_shaping(FLOAT32 r[], WORD32 lg, WORD32 M, FLOAT32 g1[], diff --git a/decoder/ixheaacd_td_mdct.h b/decoder/ixheaacd_td_mdct.h index 934d969..ed8f13c 100644 --- a/decoder/ixheaacd_td_mdct.h +++ b/decoder/ixheaacd_td_mdct.h @@ -25,7 +25,7 @@ WORD8 ixheaacd_float2fix(FLOAT32 *x, WORD32 *int_x, WORD32 length); VOID ixheaacd_fix2float(WORD32 *int_xn1, FLOAT32 *xn1, WORD32 length, WORD8 *shiftp, WORD32 *preshift); -VOID ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 len, - WORD32 fft_mode, WORD32 *preshift); +WORD32 ixheaacd_complex_fft(WORD32 *data_r, WORD32 *data_i, WORD32 len, + WORD32 fft_mode, WORD32 *preshift); #endif diff --git a/decoder/ixheaacd_thumb_ps_dec.c b/decoder/ixheaacd_thumb_ps_dec.c index 9810148..39b7b72 100644 --- a/decoder/ixheaacd_thumb_ps_dec.c +++ b/decoder/ixheaacd_thumb_ps_dec.c @@ -19,17 +19,17 @@ */ #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops_arr.h" #include "ixheaacd_basic_ops.h" #include "ixheaacd_defines.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_basic_funcs.h" @@ -37,7 +37,7 @@ #include "ixheaacd_sbrdecsettings.h" #include "ixheaacd_defines.h" #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_pulsedata.h" #include "ixheaacd_drc_data_struct.h" @@ -48,12 +48,12 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_env_extr.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_ps_dec.h" #include "ixheaacd_qmf_dec.h" diff --git a/decoder/ixheaacd_tns.c b/decoder/ixheaacd_tns.c index 9a6cdf1..a16736c 100644 --- a/decoder/ixheaacd_tns.c +++ b/decoder/ixheaacd_tns.c @@ -20,7 +20,7 @@ #include <math.h> #include <stdio.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_bitbuffer.h" #include "ixheaacd_interface.h" @@ -42,9 +42,9 @@ #include "ixheaacd_main.h" #include "ixheaacd_arith_dec.h" #include "ixheaacd_function_selector.h" -#include <ixheaacd_constants.h> -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_constants.h" +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops40.h" #define sfb_offset(x) (((x) > 0) ? sfb_top[(x)-1] : 0) diff --git a/decoder/ixheaacd_vec_baisc_ops.h b/decoder/ixheaacd_vec_baisc_ops.h index a71ccfd..c57e17d 100644 --- a/decoder/ixheaacd_vec_baisc_ops.h +++ b/decoder/ixheaacd_vec_baisc_ops.h @@ -58,4 +58,7 @@ WORD8 ixheaacd_windowing_short4(WORD32 *src1, WORD32 *win_fwd, WORD32 *fp, VOID ixheaacd_scale_down(WORD32 *dest, WORD32 *src, WORD32 len, WORD8 shift1, WORD8 shift2); +VOID ixheaacd_scale_down_adj(WORD32 *dest, WORD32 *src, WORD32 len, + WORD8 shift1, WORD8 shift2); + #endif diff --git a/decoder/ixheaacd_windows.h b/decoder/ixheaacd_windows.h index 05fc0f5..7d3a614 100644 --- a/decoder/ixheaacd_windows.h +++ b/decoder/ixheaacd_windows.h @@ -47,8 +47,8 @@ extern const FLOAT32 ixheaacd__sine_window256[256]; WORD32 ixheaacd_calc_window(WORD32 **win, WORD32 len, WORD32 wfun_select); -void ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, - WORD32 *scratch); +WORD32 ixheaacd_acelp_imdct(WORD32 *imdct_in, WORD32 npoints, WORD8 *qshift, + WORD32 *scratch); typedef struct { WORD32 lfac; diff --git a/decoder/x86/ixheaacd_function_selector_x86.c b/decoder/x86/ixheaacd_function_selector_x86.c index e70ab9a..f9c71fa 100644 --- a/decoder/x86/ixheaacd_function_selector_x86.c +++ b/decoder/x86/ixheaacd_function_selector_x86.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_sbrdecsettings.h" @@ -37,7 +37,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_pulsedata.h" @@ -53,7 +53,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_block.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -198,11 +198,11 @@ VOID(*ixheaacd_mps_complex_fft_64) WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; VOID(*ixheaacd_calc_pre_twid) @@ -214,8 +214,9 @@ VOID(*ixheaacd_calc_post_twid) const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; +(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; VOID(*ixheaacd_mps_synt_out_calc) (WORD32 resolution, WORD32 *out, WORD32 *state, diff --git a/decoder/x86_64/ixheaacd_function_selector_x86_64.c b/decoder/x86_64/ixheaacd_function_selector_x86_64.c index e70ab9a..f9c71fa 100644 --- a/decoder/x86_64/ixheaacd_function_selector_x86_64.c +++ b/decoder/x86_64/ixheaacd_function_selector_x86_64.c @@ -20,15 +20,15 @@ #include <stdio.h> #include <string.h> #include "ixheaacd_sbr_common.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_constants.h" -#include <ixheaacd_basic_ops32.h> -#include <ixheaacd_basic_ops16.h> -#include <ixheaacd_basic_ops40.h> +#include "ixheaacd_basic_ops32.h" +#include "ixheaacd_basic_ops16.h" +#include "ixheaacd_basic_ops40.h" #include "ixheaacd_basic_ops.h" -#include <ixheaacd_basic_op.h> +#include "ixheaacd_basic_op.h" #include "ixheaacd_intrinsics.h" #include "ixheaacd_common_rom.h" #include "ixheaacd_sbrdecsettings.h" @@ -37,7 +37,7 @@ #include "ixheaacd_pns.h" -#include <ixheaacd_aac_rom.h> +#include "ixheaacd_aac_rom.h" #include "ixheaacd_aac_imdct.h" #include "ixheaacd_pulsedata.h" @@ -53,7 +53,7 @@ #include "ixheaacd_sbr_scale.h" #include "ixheaacd_lpp_tran.h" #include "ixheaacd_env_extr_part.h" -#include <ixheaacd_sbr_rom.h> +#include "ixheaacd_sbr_rom.h" #include "ixheaacd_block.h" #include "ixheaacd_hybrid.h" #include "ixheaacd_ps_dec.h" @@ -198,11 +198,11 @@ VOID(*ixheaacd_mps_complex_fft_64) WORD32 nlength) = &ixheaacd_mps_complex_fft_64_dec; VOID(*ixheaacd_mps_synt_pre_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_pre_twiddle_dec; VOID(*ixheaacd_mps_synt_post_twiddle) -(WORD32 *ptr_in, WORD32 *table_re, WORD32 *table_im, +(WORD32 *ptr_in, const WORD32 *table_re, const WORD32 *table_im, WORD32 resolution) = &ixheaacd_mps_synt_post_twiddle_dec; VOID(*ixheaacd_calc_pre_twid) @@ -214,8 +214,9 @@ VOID(*ixheaacd_calc_post_twid) const WORD32 *cos_ptr, const WORD32 *sin_ptr) = &ixheaacd_calc_post_twid_dec; VOID(*ixheaacd_mps_synt_post_fft_twiddle) -(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, WORD32 *table_re, - WORD32 *table_im, WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; +(WORD32 resolution, WORD32 *fin_re, WORD32 *fin_im, const WORD32 *table_re, + const WORD32 *table_im, + WORD32 *state) = &ixheaacd_mps_synt_post_fft_twiddle_dec; VOID(*ixheaacd_mps_synt_out_calc) (WORD32 resolution, WORD32 *out, WORD32 *state, diff --git a/libxaac_blocklist.txt b/libxaac_blocklist.txt index f7c61b7..5943f5c 100644 --- a/libxaac_blocklist.txt +++ b/libxaac_blocklist.txt @@ -1,5 +1,5 @@ [cfi] -# CFI blacklist for external/libhevc +# CFI blacklist for external/libxaac # assembly functions where CFI has issues fun:ixheaacd_fix_div_armv7 diff --git a/test/ixheaacd_error.c b/test/ixheaacd_error.c index aa88755..279f819 100644 --- a/test/ixheaacd_error.c +++ b/test/ixheaacd_error.c @@ -18,7 +18,7 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ #include <stdio.h> -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_error_standards.h" #include "ixheaacd_error_handler.h" @@ -33,11 +33,17 @@ */ /*****************************************************************************/ /* Non Fatal Errors */ -pWORD8 ixheaacd_ppb_api_non_fatal[] = { - (pWORD8) "No Error", (pWORD8) "API Command not supported", - (pWORD8) "API Command type not supported"}; +pWORD8 ixheaacd_ppb_api_non_fatal[IA_MAX_ERROR_SUB_CODE] = { + (pWORD8) "No Error", + (pWORD8) "API Command not supported", + (pWORD8) "API Command type not supported", + (pWORD8) "DRC Unexpected Error", + (pWORD8) "DRC Param Error", + (pWORD8) "DRC External Error", + (pWORD8) "DRC Errorhandling", + (pWORD8) "DRC Bitstream Error"}; /* Fatal Errors */ -pWORD8 ixheaacd_ppb_api_fatal[] = { +pWORD8 ixheaacd_ppb_api_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Invalid Memory Table Index", (pWORD8) "Invalid Library ID String Index", (pWORD8) "NULL Pointer: Memory Allocation Error", @@ -50,7 +56,7 @@ pWORD8 ixheaacd_ppb_api_fatal[] = { */ /*****************************************************************************/ /* Non Fatal Errors */ -pWORD8 ixheaacd_ppb_config_non_fatal[] = { +pWORD8 ixheaacd_ppb_config_non_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Invalid Output PCM WORD Size. Setting to default, 16 ", (pWORD8) "Invalid Down-mix flag option. Setting to default, 0 ", (pWORD8) "Invalid 8 khz output flag option. Setting to default, 0 ", @@ -78,20 +84,20 @@ pWORD8 ixheaacd_ppb_config_non_fatal[] = { (pWORD8) "Invalid constant delay mode", (pWORD8) "Invalid effect type"}; /* Fatal Errors */ -pWORD8 ixheaacd_ppb_config_fatal[] = { +pWORD8 ixheaacd_ppb_config_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Invalid Sample rate specified for RAW decoding"}; /*****************************************************************************/ /* Class 2: Initialization Errors */ /*****************************************************************************/ /* Non Fatal Errors */ -pWORD8 ixheaacd_ppb_init_non_fatal[] = { +pWORD8 ixheaacd_ppb_init_non_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8)"Both 16 kHz and 8 kHz output config set. Giving 16 kHz output", (pWORD8)"Output sampling frequency is 8 kHz, 16 kHz output disabled ", (pWORD8)"Header not found at the beginning of input data continuing syncing" }; /* Fatal Errors */ -pWORD8 ixheaacd_ppb_init_fatal[] = { +pWORD8 ixheaacd_ppb_init_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "AAC Decoder initialization failed", (pWORD8) "End of input reached during initialization", (pWORD8) "No. of channels in stream greater than max channels defined", @@ -101,7 +107,7 @@ pWORD8 ixheaacd_ppb_init_fatal[] = { */ /*****************************************************************************/ /* Non Fatal Errors */ -pWORD8 ixheaacd_ppb_exe_non_fatal[] = { +pWORD8 ixheaacd_ppb_exe_non_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8)"ADTS syncronization is lost. Re-syncing", (pWORD8)"Though SBR was present in previous frame, not present in current frame (SBR turned off)", (pWORD8)"SBR was not present in previous frame, but it is present in current frame (SBR turned on)", @@ -117,10 +123,10 @@ pWORD8 ixheaacd_ppb_exe_non_fatal[] = { (pWORD8)"The base sampling frequency has changed in ADTS header", (pWORD8)"Pulse Data exceeds the permitted boundary", (pWORD8)"Invalid code ixheaacd_book number in ia_huffman_data_type decoding", -// (pWORD8)"The base sampling frequency has changed in ADTS header" +// (pWORD8)"The base sampling frequency has changed in ADTS header" }; /* Fatal Errors */ -pWORD8 ixheaacd_ppb_exe_fatal[] = { +pWORD8 ixheaacd_ppb_exe_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Channel coupling not supported", (pWORD8) "TNS data range is errorneous", (pWORD8) "Invalid LOAS header", (pWORD8) "Invalid ER profile", (pWORD8) "Invalid DRC data"}; @@ -202,7 +208,7 @@ VOID ixheaacd_error_handler_init() { /*****************************************************************************/ /* Non Fatal Errors */ /* Fatal Errors */ -pWORD8 ixheaacd_ppb_ia_testbench_mem_file_man_fatal[] = { +pWORD8 ixheaacd_ppb_ia_testbench_mem_file_man_fatal[IA_MAX_ERROR_SUB_CODE] = { (pWORD8) "Memory Allocation Error", (pWORD8) "File Open Failed"}; /*****************************************************************************/ @@ -317,10 +323,15 @@ IA_ERRORCODE ixheaacd_error_handler(ia_error_info_struct *p_mod_err_info, if (pb_context != NULL) { printf("%s: ", pb_context); } - if (err_sub_code != 2047) + if (err_sub_code >= IA_MAX_ERROR_SUB_CODE || + p_mod_err_info->ppppb_error_msg_pointers[is_fatal][err_class] + [err_sub_code] == NULL) { + printf("error unlisted"); + } else { printf("%s\n", p_mod_err_info ->ppppb_error_msg_pointers[is_fatal][err_class][err_sub_code]); + } } return IA_NO_ERROR; -} +}
\ No newline at end of file diff --git a/test/ixheaacd_main.c b/test/ixheaacd_main.c index 757c78a..4d793b2 100644 --- a/test/ixheaacd_main.c +++ b/test/ixheaacd_main.c @@ -24,7 +24,7 @@ #define AOSP_CHANGE #include "ixheaacd_fileifc.h" -#include <ixheaacd_type_def.h> +#include "ixheaacd_type_def.h" #include "ixheaacd_error_standards.h" #include "ixheaacd_error_handler.h" #include "ixheaacd_apicmd_standards.h" @@ -800,6 +800,9 @@ int ixheaacd_main_process(WORD32 argc, pWORD8 argv[]) { UWORD32 ui_init_done, ui_exec_done; pWORD8 pb_inp_buf = 0, pb_out_buf = 0; + /* Number of Prerolls variable */ + WORD32 num_preroll = 0; + // pWORD16 litt2big; UWORD32 ui_inp_size = 0; @@ -1662,104 +1665,123 @@ int ixheaacd_main_process(WORD32 argc, pWORD8 argv[]) { _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - if (mpeg_d_drc_on == 1) { - if (ui_exec_done != 1) { - VOID *p_array; // ITTIAM:buffer to handle gain payload - WORD32 buf_size = 0; // ITTIAM:gain payload length - WORD32 bit_str_fmt = 1; - WORD32 gain_stream_flag = 1; - - err_code = (*p_ia_process_api)( - pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, - IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN, &buf_size); - _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + err_code = (*p_ia_process_api)( + pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, + IA_ENHAACPLUS_DEC_CONFIG_GET_NUM_PRE_ROLL_FRAMES, &num_preroll); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + { + WORD32 preroll_frame_offset = 0; + do { + if (mpeg_d_drc_on == 1) { + if (ui_exec_done != 1) { + VOID *p_array; // ITTIAM:buffer to handle gain payload + WORD32 buf_size = 0; // ITTIAM:gain payload length + WORD32 bit_str_fmt = 1; + WORD32 gain_stream_flag = 1; + + err_code = (*p_ia_process_api)( + pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, + IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_LEN, &buf_size); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + err_code = (*p_ia_process_api)( + pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, + IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF, &p_array); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + if (buf_size > 0) { + /*Set bitstream_split_format */ + err_code = ia_drc_dec_api( + pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, + IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt); + + memcpy(drc_ip_buf, p_array, buf_size); + /* Set number of bytes to be processed */ + err_code = + ia_drc_dec_api(pv_ia_drc_process_api_obj, + IA_API_CMD_SET_INPUT_BYTES_BS, 0, &buf_size); + + err_code = ia_drc_dec_api( + pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, + IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG, &gain_stream_flag); + + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + /* Execute process */ + err_code = + ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_INIT, + IA_CMD_TYPE_INIT_CPY_BSF_BUFF, NULL); + + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + + mpegd_drc_present = 1; + } + } + } + /* How much buffer is used in input buffers */ + err_code = (*p_ia_process_api)(pv_ia_process_api_obj, + IA_API_CMD_GET_CURIDX_INPUT_BUF, 0, + &i_bytes_consumed); - err_code = (*p_ia_process_api)( - pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, - IA_ENHAACPLUS_DEC_CONFIG_GAIN_PAYLOAD_BUF, &p_array); + // printf("bytes_consumed: %d \n", i_bytes_consumed); _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - if (buf_size > 0) { - /*Set bitstream_split_format */ - err_code = ia_drc_dec_api( - pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, - IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT, &bit_str_fmt); + /* Get the output bytes */ + err_code = + (*p_ia_process_api)(pv_ia_process_api_obj, + IA_API_CMD_GET_OUTPUT_BYTES, 0, &i_out_bytes); - memcpy(drc_ip_buf, p_array, buf_size); - /* Set number of bytes to be processed */ - err_code = - ia_drc_dec_api(pv_ia_drc_process_api_obj, - IA_API_CMD_SET_INPUT_BYTES_BS, 0, &buf_size); + _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_GAIN_STREAM_FLAG, &gain_stream_flag); + if (err_code_reinit != 0) memset(pb_out_buf, 0, i_out_bytes); - _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + i_total_bytes += i_out_bytes; - /* Execute process */ - err_code = ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_INIT, - IA_CMD_TYPE_INIT_CPY_BSF_BUFF, NULL); + if (mpegd_drc_present == 1) { + memcpy(drc_ip_buf, pb_out_buf + preroll_frame_offset, i_out_bytes); + preroll_frame_offset += i_out_bytes; + err_code = (*p_ia_process_api)( + pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, + IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode); _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - mpegd_drc_present = 1; - } - } - } - /* How much buffer is used in input buffers */ - err_code = (*p_ia_process_api)(pv_ia_process_api_obj, - IA_API_CMD_GET_CURIDX_INPUT_BUF, 0, - &i_bytes_consumed); - - // printf("bytes_consumed: %d \n", i_bytes_consumed); - _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - - /* Get the output bytes */ - err_code = (*p_ia_process_api)( - pv_ia_process_api_obj, IA_API_CMD_GET_OUTPUT_BYTES, 0, &i_out_bytes); - - _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + if (i_sbr_mode != 0) { + WORD32 frame_length; + if (i_sbr_mode == 1) { + frame_length = 2048; + } else if (i_sbr_mode == 3) { + frame_length = 4096; + } else { + frame_length = 1024; + } + + err_code = ia_drc_dec_api( + pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, + IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE, &frame_length); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + } - if (err_code_reinit != 0) memset(pb_out_buf, 0, i_out_bytes); + err_code = + ia_drc_dec_api(pv_ia_drc_process_api_obj, + IA_API_CMD_SET_INPUT_BYTES, 0, &i_out_bytes); - i_total_bytes += i_out_bytes; + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - if (mpegd_drc_present == 1) { - memcpy(drc_ip_buf, pb_out_buf, i_out_bytes); + err_code = + ia_drc_dec_api(pv_ia_drc_process_api_obj, IA_API_CMD_EXECUTE, + IA_CMD_TYPE_DO_EXECUTE, NULL); - err_code = (*p_ia_process_api)( - pv_ia_process_api_obj, IA_API_CMD_GET_CONFIG_PARAM, - IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE, &i_sbr_mode); - _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); + _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - if (i_sbr_mode != 0) { - WORD32 frame_length; - if (i_sbr_mode == 1) { - frame_length = 2048; - } else if (i_sbr_mode == 3) { - frame_length = 4096; + memcpy(pb_out_buf, drc_op_buf, i_out_bytes); } else { - frame_length = 1024; + memmove(pb_out_buf, pb_out_buf + preroll_frame_offset, i_out_bytes); + preroll_frame_offset += i_out_bytes; } - err_code = ia_drc_dec_api( - pv_ia_drc_process_api_obj, IA_API_CMD_SET_CONFIG_PARAM, - IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE, &frame_length); - _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_INPUT_BYTES, 0, &i_out_bytes); - - _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_EXECUTE, - IA_CMD_TYPE_DO_EXECUTE, NULL); - - _IA_HANDLE_ERROR(p_proc_err_info, (pWORD8) "", err_code); - - memcpy(pb_out_buf, drc_op_buf, i_out_bytes); + num_preroll--; + } while (num_preroll > 0); } if (total_samples != 0) // Usac stream @@ -2090,4 +2112,4 @@ int main(WORD32 argc, char *argv[]) { mpeg_d_drc_on = 0; return IA_NO_ERROR; -} /* end ixheaacd_main */ +} /* end ixheaacd_main */
\ No newline at end of file |
