diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-10 19:02:20 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-10 19:02:20 +0000 |
commit | 9947dc2a0fbe88503e22f45ba9be1a431184e80a (patch) | |
tree | f4e0df5cb15e791d60b23b54a710f3d4d608193a | |
parent | 5cbd77d071247c9d656eb400a2d50a6f0c75cede (diff) | |
parent | b3226ce6f80c78946aa3190cec158fb9852272ea (diff) | |
download | libxaac-pie-r2-release.tar.gz |
Snap for 4832339 from b3226ce6f80c78946aa3190cec158fb9852272ea to pi-releaseandroid-vts-9.0_r4android-cts-9.0_r3android-cts-9.0_r2android-cts-9.0_r1android-9.0.0_r8android-9.0.0_r7android-9.0.0_r6android-9.0.0_r5android-9.0.0_r3android-9.0.0_r2android-9.0.0_r1pie-r2-s1-releasepie-r2-release
Change-Id: Ic41dd8d45a55d57083c9a434ccea941be36a891f
152 files changed, 21287 insertions, 22302 deletions
diff --git a/decoder/armv7/ixheaacd_complex_fft_p2.s b/decoder/armv7/ixheaacd_complex_fft_p2.s index e427088..3845d87 100644 --- a/decoder/armv7/ixheaacd_complex_fft_p2.s +++ b/decoder/armv7/ixheaacd_complex_fft_p2.s @@ -50,21 +50,21 @@ FIRST_STAGE_R4: ADD r0, r0, #4 CMP r0, lr, ASR #1 - ADD r4, r4, r6 @x0r = x0r + x2r@ - ADD r5, r5, r7 @x0i = x0i + x2i@ + ADD r4, r4, r6 @x0r = x0r + x2r@ + ADD r5, r5, r7 @x0i = x0i + x2i@ SUB r6, r4, r6, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r7, r5, r7, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r8, r8, r10 @x1r = x1r + x3r@ - ADD r9, r9, r11 @x1i = x1i + x3i@ + ADD r8, r8, r10 @x1r = x1r + x3r@ + ADD r9, r9, r11 @x1i = x1i + x3i@ SUB r1, r8, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r9, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r8 @x0r = x0r + x1r@ - ADD r5, r5, r9 @x0i = x0i + x1i@ + ADD r4, r4, r8 @x0r = x0r + x1r@ + ADD r5, r5, r9 @x0i = x0i + x1i@ SUB r8, r4, r8, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r9, r5, r9, lsl#1 @x1i = x0i - (x1i << 1) - ADD r6, r6, r11 @x2r = x2r + x3i@ - SUB r7, r7, r1 @x2i = x2i - x3r@ + ADD r6, r6, r11 @x2r = x2r + x3i@ + SUB r7, r7, r1 @x2i = x2i - x3r@ SUB r10, r6, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r11, r7, r1, lsl#1 @x3r = x2i + (x3r << 1)@ @@ -108,23 +108,23 @@ LOOP_TRIVIAL_TWIDDLE: @MOV r10,r10,ASR #1 @MOV r11,r11,ASR #1 - ADD r4, r4, r8 @x0r = x0r + x2r@ - ADD r5, r5, r9 @x0i = x0i + x2i@ + ADD r4, r4, r8 @x0r = x0r + x2r@ + ADD r5, r5, r9 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl #1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl #1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r2, r6, r10, lsl #1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl #1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ @MOV r4,r4,ASR #1 @MOV r5,r5,ASR #1 SUB r6, r4, r6, lsl #1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl #1 @x1i = x0i - (x1i << 1) - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r2 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r2 @x2i = x2i - x3r@ SUB r10, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r11, r9, r2, lsl#1 @x3r = x2i + (x3r << 1) @@ -241,23 +241,23 @@ RADIX4_BFLY: ADD r4, r8, r4 @x0r = x0r + x2r@ - ADD r5, r9, r5 @x0i = x0i + x2i@ + ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r10 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r10 @x2i = x2i - x3r@ SUB r4, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r5, r9, r10, lsl#1 @x3r = x2i + (x3r << 1) @@ -504,20 +504,20 @@ RADIX4_BFLY_3: ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r10 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r10 @x2i = x2i - x3r@ SUB r4, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r5, r9, r10, lsl#1 @x3r = x2i + (x3r << 1) @@ -634,20 +634,20 @@ RADIX4_BFLY_4: ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - SUB r7, r7, r11 @x1i = x1i - x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + SUB r7, r7, r11 @x1i = x1i - x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ ADD r11, r7, r11, lsl#1 @x3i = x1i + (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r10 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r10 @x2i = x2i - x3r@ SUB r4, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r5, r9, r10, lsl#1 @x3r = x2i + (x3r << 1) diff --git a/decoder/armv7/ixheaacd_complex_ifft_p2.s b/decoder/armv7/ixheaacd_complex_ifft_p2.s index 81c9716..ce89139 100644 --- a/decoder/armv7/ixheaacd_complex_ifft_p2.s +++ b/decoder/armv7/ixheaacd_complex_ifft_p2.s @@ -50,21 +50,21 @@ FIRST_STAGE_R4: ADD r0, r0, #4 CMP r0, lr, ASR #1 - ADD r4, r4, r6 @x0r = x0r + x2r@ - ADD r5, r5, r7 @x0i = x0i + x2i@ + ADD r4, r4, r6 @x0r = x0r + x2r@ + ADD r5, r5, r7 @x0i = x0i + x2i@ SUB r6, r4, r6, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r7, r5, r7, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r8, r8, r10 @x1r = x1r + x3r@ - ADD r9, r9, r11 @x1i = x1i + x3i@ + ADD r8, r8, r10 @x1r = x1r + x3r@ + ADD r9, r9, r11 @x1i = x1i + x3i@ SUB r1, r8, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r9, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r8 @x0r = x0r + x1r@ - ADD r5, r5, r9 @x0i = x0i + x1i@ + ADD r4, r4, r8 @x0r = x0r + x1r@ + ADD r5, r5, r9 @x0i = x0i + x1i@ SUB r8, r4, r8, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r9, r5, r9, lsl#1 @x1i = x0i - (x1i << 1) - SUB r6, r6, r11 @x2r = x2r - x3i@ - ADD r7, r7, r1 @x2i = x2i + x3r@ + SUB r6, r6, r11 @x2r = x2r - x3i@ + ADD r7, r7, r1 @x2i = x2i + x3r@ ADD r10, r6, r11, lsl#1 @x3i = x2r + (x3i << 1)@ SUB r11, r7, r1, lsl#1 @x3r = x2i - (x3r << 1)@ @@ -108,23 +108,23 @@ LOOP_TRIVIAL_TWIDDLE: @MOV r10,r10,ASR #1 @MOV r11,r11,ASR #1 - ADD r4, r4, r8 @x0r = x0r + x2r@ - ADD r5, r5, r9 @x0i = x0i + x2i@ + ADD r4, r4, r8 @x0r = x0r + x2r@ + ADD r5, r5, r9 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl #1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl #1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r2, r6, r10, lsl #1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl #1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ @MOV r4,r4,ASR #1 @MOV r5,r5,ASR #1 SUB r6, r4, r6, lsl #1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl #1 @x1i = x0i - (x1i << 1) - SUB r8, r8, r11 @x2r = x2r - x3i@ - ADD r9, r9, r2 @x2i = x2i + x3r@ + SUB r8, r8, r11 @x2r = x2r - x3i@ + ADD r9, r9, r2 @x2i = x2i + x3r@ ADD r10, r8, r11, lsl#1 @x3i = x2r + (x3i << 1)@ SUB r11, r9, r2, lsl#1 @x3r = x2i - (x3r << 1) @@ -241,23 +241,23 @@ RADIX4_BFLY: ADD r4, r8, r4 @x0r = x0r + x2r@ - ADD r5, r9, r5 @x0i = x0i + x2i@ + ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - SUB r8, r8, r11 @x2r = x2r - x3i@ - ADD r9, r9, r10 @x2i = x2i + x3r@ + SUB r8, r8, r11 @x2r = x2r - x3i@ + ADD r9, r9, r10 @x2i = x2i + x3r@ ADD r4, r8, r11, lsl#1 @x3i = x2r + (x3i << 1)@ SUB r5, r9, r10, lsl#1 @x3r = x2i - (x3r << 1) @@ -504,20 +504,20 @@ RADIX4_BFLY_3: ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - SUB r8, r8, r11 @x2r = x2r - x3i@ - ADD r9, r9, r10 @x2i = x2i + x3r@ + SUB r8, r8, r11 @x2r = x2r - x3i@ + ADD r9, r9, r10 @x2i = x2i + x3r@ ADD r4, r8, r11, lsl#1 @x3i = x2r + (x3i << 1)@ SUB r5, r9, r10, lsl#1 @x3r = x2i - (x3r << 1) @@ -635,20 +635,20 @@ RADIX4_BFLY_4: ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - SUB r7, r7, r11 @x1i = x1i - x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + SUB r7, r7, r11 @x1i = x1i - x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ ADD r11, r7, r11, lsl#1 @x3i = x1i + (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - SUB r8, r8, r11 @x2r = x2r - x3i@ - ADD r9, r9, r10 @x2i = x2i + x3r@ + SUB r8, r8, r11 @x2r = x2r - x3i@ + ADD r9, r9, r10 @x2i = x2i + x3r@ ADD r4, r8, r11, lsl#1 @x3i = x2r + (x3i << 1)@ SUB r5, r9, r10, lsl#1 @x3r = x2i - (x3r << 1) diff --git a/decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s b/decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s index 732a265..0c2844b 100644 --- a/decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s +++ b/decoder/armv7/ixheaacd_esbr_cos_sin_mod_loop2.s @@ -94,8 +94,8 @@ ixheaacd_esbr_cos_sin_mod_loop2: LOOP1: VLD1.32 {D2}, [R0] VLD1.32 {D3}, [R10] - LDR R5, [R3] @RE2 - LDR R6, [R11] @RE3 + LDR R5, [R3] @RE2 + LDR R6, [R11] @RE3 VTRN.32 D2, D3 VMULL.S32 q2, d0, d2 @qsub 2nd diff --git a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c index 8b4efcc..e950ea1 100644 --- a/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c +++ b/decoder/armv7/ixheaacd_function_selector_arm_non_neon.c @@ -134,7 +134,8 @@ VOID(*ixheaacd_harm_idx_zerotwolp) VOID(*ixheaacd_tns_ar_filter_fixed) (WORD32 *spectrum, WORD32 size, WORD32 inc, WORD32 *lpc, WORD32 order, - WORD32 shift_value, WORD scale_spec) = &ixheaacd_tns_ar_filter_fixed_non_neon_armv7; + WORD32 shift_value, + WORD scale_spec) = &ixheaacd_tns_ar_filter_fixed_non_neon_armv7; VOID(*ixheaacd_tns_ar_filter) (WORD32 *spectrum, WORD32 size, WORD32 inc, WORD16 *lpc, WORD32 order, diff --git a/decoder/armv7/ixheaacd_function_selector_armv7.c b/decoder/armv7/ixheaacd_function_selector_armv7.c index 0b6594c..cde6269 100644 --- a/decoder/armv7/ixheaacd_function_selector_armv7.c +++ b/decoder/armv7/ixheaacd_function_selector_armv7.c @@ -230,20 +230,20 @@ VOID(*ixheaacd_aac_ld_dec_rearrange) (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, UWORD8 *re_arr_tab) = &ia_aac_ld_dec_rearrange_armv7; -VOID (*ixheaacd_fft32x32_ld) +VOID(*ixheaacd_fft32x32_ld) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_imdct_using_fft_armv7; -VOID (*ixheaacd_fft32x32_ld2) +VOID(*ixheaacd_fft32x32_ld2) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_fft32x32_ld2_armv7; WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo) = &ixheaacd_neg_expo_inc_arm; -VOID (*ixheaacd_inv_dit_fft_8pt) +VOID(*ixheaacd_inv_dit_fft_8pt) (WORD32 *x, WORD32 *real, WORD32 *imag) = &ixheaacd_inv_dit_fft_8pt_armv7; -VOID (*ixheaacd_scale_factor_process) +VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv7; diff --git a/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s b/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s index 38638cf..9e4ba93 100644 --- a/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s +++ b/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s @@ -38,21 +38,21 @@ FIRST_STAGE_R4: ADD r0, r0, #4 CMP r0, lr, ASR #1 - ADD r4, r4, r6 @x0r = x0r + x2r@ - ADD r5, r5, r7 @x0i = x0i + x2i@ + ADD r4, r4, r6 @x0r = x0r + x2r@ + ADD r5, r5, r7 @x0i = x0i + x2i@ SUB r6, r4, r6, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r7, r5, r7, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r8, r8, r10 @x1r = x1r + x3r@ - ADD r9, r9, r11 @x1i = x1i + x3i@ + ADD r8, r8, r10 @x1r = x1r + x3r@ + ADD r9, r9, r11 @x1i = x1i + x3i@ SUB r1, r8, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r9, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r8 @x0r = x0r + x1r@ - ADD r5, r5, r9 @x0i = x0i + x1i@ + ADD r4, r4, r8 @x0r = x0r + x1r@ + ADD r5, r5, r9 @x0i = x0i + x1i@ SUB r8, r4, r8, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r9, r5, r9, lsl#1 @x1i = x0i - (x1i << 1) - ADD r6, r6, r11 @x2r = x2r + x3i@ - SUB r7, r7, r1 @x2i = x2i - x3r@ + ADD r6, r6, r11 @x2r = x2r + x3i@ + SUB r7, r7, r1 @x2i = x2i - x3r@ SUB r10, r6, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r11, r7, r1, lsl#1 @x3r = x2i + (x3r << 1)@ @@ -96,23 +96,23 @@ LOOP_TRIVIAL_TWIDDLE: @MOV r10,r10,ASR #1 @MOV r11,r11,ASR #1 - ADD r4, r4, r8 @x0r = x0r + x2r@ - ADD r5, r5, r9 @x0i = x0i + x2i@ + ADD r4, r4, r8 @x0r = x0r + x2r@ + ADD r5, r5, r9 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl #1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl #1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r2, r6, r10, lsl #1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl #1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ @MOV r4,r4,ASR #1 @MOV r5,r5,ASR #1 SUB r6, r4, r6, lsl #1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl #1 @x1i = x0i - (x1i << 1) - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r2 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r2 @x2i = x2i - x3r@ SUB r10, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r11, r9, r2, lsl#1 @x3r = x2i + (x3r << 1) @@ -229,23 +229,23 @@ RADIX4_BFLY: ADD r4, r8, r4 @x0r = x0r + x2r@ - ADD r5, r9, r5 @x0i = x0i + x2i@ + ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r10 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r10 @x2i = x2i - x3r@ SUB r4, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r5, r9, r10, lsl#1 @x3r = x2i + (x3r << 1) @@ -492,20 +492,20 @@ RADIX4_BFLY_3: ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - ADD r7, r7, r11 @x1i = x1i + x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + ADD r7, r7, r11 @x1i = x1i + x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ SUB r11, r7, r11, lsl#1 @x3i = x1i - (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r10 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r10 @x2i = x2i - x3r@ SUB r4, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r5, r9, r10, lsl#1 @x3r = x2i + (x3r << 1) @@ -622,19 +622,19 @@ RADIX4_BFLY_4: ADD r5, r9, r5 @x0i = x0i + x2i@ SUB r8, r4, r8, lsl#1 @x2r = x0r - (x2r << 1)@ SUB r9, r5, r9, lsl#1 @x2i = x0i - (x2i << 1)@ - ADD r6, r6, r10 @x1r = x1r + x3r@ - SUB r7, r7, r11 @x1i = x1i - x3i@ + ADD r6, r6, r10 @x1r = x1r + x3r@ + SUB r7, r7, r11 @x1i = x1i - x3i@ SUB r10, r6, r10, lsl#1 @x3r = x1r - (x3r << 1)@ ADD r11, r7, r11, lsl#1 @x3i = x1i + (x3i << 1)@ - ADD r4, r4, r6 @x0r = x0r + x1r@ - ADD r5, r5, r7 @x0i = x0i + x1i@ + ADD r4, r4, r6 @x0r = x0r + x1r@ + ADD r5, r5, r7 @x0i = x0i + x1i@ SUB r6, r4, r6, lsl#1 @x1r = x0r - (x1r << 1)@ SUB r7, r5, r7, lsl#1 @x1i = x0i - (x1i << 1) STRD r4, [r12] @r4=x0r, r5=x0i ADD r12, r12, r0 - ADD r8, r8, r11 @x2r = x2r + x3i@ - SUB r9, r9, r10 @x2i = x2i - x3r@ + ADD r8, r8, r11 @x2r = x2r + x3i@ + SUB r9, r9, r10 @x2i = x2i - x3r@ SUB r4, r8, r11, lsl#1 @x3i = x2r - (x3i << 1)@ ADD r5, r9, r10, lsl#1 @x3r = x2i + (x3r << 1) diff --git a/decoder/armv7/ixheaacd_qmf_dec_armv7.c b/decoder/armv7/ixheaacd_qmf_dec_armv7.c index d75de06..13b3f9d 100644 --- a/decoder/armv7/ixheaacd_qmf_dec_armv7.c +++ b/decoder/armv7/ixheaacd_qmf_dec_armv7.c @@ -228,8 +228,8 @@ VOID ixheaacd_cplx_anal_qmffilt(const WORD16 *time_sample_buf, } VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, - ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { WORD32 L = syn_qmf->no_channels; const WORD32 M = (L >> 1); WORD32 *dct_in = qmf_real; @@ -249,9 +249,9 @@ VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, filter_states[3 * M] = 0; } -VOID ixheaacd_inv_emodulation( - WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { +VOID ixheaacd_inv_emodulation(WORD32 *qmf_real, + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { ixheaacd_cos_sin_mod(qmf_real, syn_qmf, (WORD16 *)qmf_dec_tables_ptr->w1024, (WORD32 *)qmf_dec_tables_ptr->dig_rev_table2_128); } @@ -352,4 +352,3 @@ VOID ixheaacd_esbr_cos_sin_mod(WORD32 *subband, p_sin = qmf_bank->esbr_alt_sin_twiddle; ixheaacd_esbr_cos_sin_mod_loop2(subband, p_sin, M); } - diff --git a/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s b/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s index 53392ec..ce5361b 100644 --- a/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s +++ b/decoder/armv7/ixheaacd_sbr_qmfanal32_winadds_eld.s @@ -51,17 +51,17 @@ LOOP: MOV R6, R6, LSL #1 @ VLD1.16 {D1, D2}, [R2]! @ tmpQmf_c1[2*(n + 0)] load and incremented - MOV R7, #244 @ NOT USED further + MOV R7, #244 @ NOT USED further MOV R9, R0 ADD R0, R0, #120 @ incrementing R0 by 120 + 8 = 128 - MOV R11, R4 @ Mov winAdd to R11 + MOV R11, R4 @ Mov winAdd to R11 VLD1.16 D2, [R0], R6 @ tmpQ1[n + 64] load and incremented by R6 ADD R11, R11, #128 @ increment winAdd by 128 - MOV R10, R2 @ + MOV R10, R2 @ ADD R2, R2, #112 @ This should be 240 --> 112 VMULL.S16 Q15, D0, D1 diff --git a/decoder/armv7/ixheaacd_tns_ar_filter_fixed.s b/decoder/armv7/ixheaacd_tns_ar_filter_fixed.s index d0b2dd2..48fb61c 100644 --- a/decoder/armv7/ixheaacd_tns_ar_filter_fixed.s +++ b/decoder/armv7/ixheaacd_tns_ar_filter_fixed.s @@ -28,68 +28,68 @@ .global ixheaacd_tns_ar_filter_fixed_armv7 ixheaacd_tns_ar_filter_fixed_armv7: - STMFD r13! , {r4 - r12, r14} - vpush {d8-d15} - SUB sp, sp, #128 @ state[MaximumOrder] + one more - LDR r4, [sp,#232] @order - LDR r6, [sp,#236] @shift_value - STR r1, [sp] - ADD r12, sp, #4 @ r12 = state - ANDS r5, r4, #3 - BEQ FILTER_LOOP - MOV r8, #0 - ADD r14, r3, r4,LSL #2 - RSBS r7, r5, #3 - BEQ ORDER_LOOPEND + STMFD r13! , {r4 - r12, r14} + vpush {d8-d15} + SUB sp, sp, #128 @ state[MaximumOrder] + one more + LDR r4, [sp, #232] @order + LDR r6, [sp, #236] @shift_value + STR r1, [sp] + ADD r12, sp, #4 @ r12 = state + ANDS r5, r4, #3 + BEQ FILTER_LOOP + MOV r8, #0 + ADD r14, r3, r4, LSL #2 + RSBS r7, r5, #3 + BEQ ORDER_LOOPEND ORDER_LOOP: - STR r8, [r14,#4]! @lpc[i] = 0 - SUBS r7, r7, #1 - BGT ORDER_LOOP + STR r8, [r14, #4]! @lpc[i] = 0 + SUBS r7, r7, #1 + BGT ORDER_LOOP ORDER_LOOPEND: - STR r8, [r14,#4] @lpc[i] = 0 - BIC r4, r4, #3 - ADD r4, r4, #4 @order = ( (order & 0xfffffffc) +4 ) + STR r8, [r14, #4] @lpc[i] = 0 + BIC r4, r4, #3 + ADD r4, r4, #4 @order = ( (order & 0xfffffffc) +4 ) FILTER_LOOP: - LDR r1, [sp,#240] @scaleSpec + LDR r1, [sp, #240] @scaleSpec @filtering loop here - CMP r2, #1 @ inc =1 or -1 - MOV r7, r4 @loop_count - BNE NEG_INC - - LDR r8 , [r0] @r8 =*spectrum - SUBS r7 , r7 , #1 - MOV r8, r8, lsl r1 - MOV r9, r8, asr r1 - MOV r8 , r8 ,lsl r6 - STR r8 , [r12] @state[0] = sp[top] - STR r9, [r0], #4 - BEQ FILTER_LOOP2 -FILTER_LOOP1: @siva 16 times loop run - LDR r8 , [r0] @r8 =*spectrum - SUB r5 , r4 , r7 @ - MOV r5 , r5 ,lsl #2 - MOV r11 , #0 @accu = 0 - ADD r14, r12, r5 @state[j] + CMP r2, #1 @ inc =1 or -1 + MOV r7, r4 @loop_count + BNE NEG_INC + + LDR r8 , [r0] @r8 =*spectrum + SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 + MOV r9, r8, asr r1 + MOV r8 , r8 , lsl r6 + STR r8 , [r12] @state[0] = sp[top] + STR r9, [r0], #4 + BEQ FILTER_LOOP2 +FILTER_LOOP1: @siva 16 times loop run + LDR r8 , [r0] @r8 =*spectrum + SUB r5 , r4 , r7 @ + MOV r5 , r5 , lsl #2 + MOV r11 , #0 @accu = 0 + ADD r14, r12, r5 @state[j] INNER_LOOP1: - LDR r10 , [r14,#-4] @state[j-1] - LDR r9 , [r3 , r5] @lpc[j] - SUBS r5 , r5 , #4 + LDR r10 , [r14, #-4] @state[j-1] + LDR r9 , [r3 , r5] @lpc[j] + SUBS r5 , r5 , #4 - MOV r2, #0 - SMLAL r2 , r11, r10, r9 - STR r10 , [r14], #-4 @state[j] = state[j - 1] - BGT INNER_LOOP1 + MOV r2, #0 + SMLAL r2 , r11, r10, r9 + STR r10 , [r14], #-4 @state[j] = state[j - 1] + BGT INNER_LOOP1 - MOV r8, r8, lsl r1 - SUB r8 , r8 , r11,lsl #1 - MOV r9, r8, asr r1 - STR r9 , [r0], #4 @*spectrum = y@ - SUBS r7 , r7 , #1 @i-- - MOV r8 , r8 ,lsl r6 - STR r8 , [r12] @state[0] - BGT FILTER_LOOP1 + MOV r8, r8, lsl r1 + SUB r8 , r8 , r11, lsl #1 + MOV r9, r8, asr r1 + STR r9 , [r0], #4 @*spectrum = y@ + SUBS r7 , r7 , #1 @i-- + MOV r8 , r8 , lsl r6 + STR r8 , [r12] @state[0] + BGT FILTER_LOOP1 @@ -98,456 +98,456 @@ INNER_LOOP1: FILTER_LOOP2: - LDR R1, [sp] @size - ADD R8, R3, #4 + LDR R1, [sp] @size + ADD R8, R3, #4 - SUBS R7 , R1 , r4 @size-order - BEQ EXIT + SUBS R7 , R1 , r4 @size-order + BEQ EXIT - LDR R1, [sp,#240] @scaleSpec + LDR R1, [sp, #240] @scaleSpec - MOV R5 , R4 ,LSL #2 @count for inner loop = order - VLD1.32 {D10, D11}, [R8]! @lpc[j] - MOV R14,#0 - VLD1.32 {D12, D13}, [R12]! @state[j - 1] + MOV R5 , R4 , LSL #2 @count for inner loop = order + VLD1.32 {D10, D11}, [R8]! @lpc[j] + MOV R14, #0 + VLD1.32 {D12, D13}, [R12]! @state[j - 1] - CMP R4,#4 - VLD1.32 {D18, D19}, [R8]! - BEQ ORDER4 - VLD1.32 {D22, D23}, [R12]! + CMP R4, #4 + VLD1.32 {D18, D19}, [R8]! + BEQ ORDER4 + VLD1.32 {D22, D23}, [R12]! - CMP R4,#8 - VLD1.32 {D20, D21}, [R8]! - BEQ ORDER8 - CMP R4,#12 - VLD1.32 {D24, D25}, [R12]! - BEQ ORDER12 + CMP R4, #8 + VLD1.32 {D20, D21}, [R8]! + BEQ ORDER8 + CMP R4, #12 + VLD1.32 {D24, D25}, [R12]! + BEQ ORDER12 - VLD1.32 {D26, D27},[R8]! - CMP R4,#16 - VLD1.32 {D28, D29},[R12]! - BEQ ORDER16 @order16 added + VLD1.32 {D26, D27}, [R8]! + CMP R4, #16 + VLD1.32 {D28, D29}, [R12]! + BEQ ORDER16 @order16 added - VLD1.32 {D4, D5},[R8]! - CMP R4,#20 - VLD1.32 {D8, D9},[R12]! - BEQ ORDER20 @order20 added + VLD1.32 {D4, D5}, [R8]! + CMP R4, #20 + VLD1.32 {D8, D9}, [R12]! + BEQ ORDER20 @order20 added ORDER4: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum OUTER_LOOP2_4: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D11, D13 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 + VADD.I64 D6, D2, D3 - VSHR.S64 D6,#32 @acc1=acc>>32 @acc = mac32_tns_neon(state[j - 1],lpc[j],acc, temp_lo)@ - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] + VSHR.S64 D6, #32 @acc1=acc>>32 @acc = mac32_tns_neon(state[j - 1],lpc[j],acc, temp_lo)@ + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - MOV r9, r8, asr r1 - VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] - STR r9 , [r0],#4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT OUTER_LOOP2_4 + BGT OUTER_LOOP2_4 - B EXIT + B EXIT ORDER8: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum OUTER_LOOP2_8: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - VMLAL.S32 Q1, D22, D18 - VMLAL.S32 Q1, D23, D19 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D22, D18 + VMLAL.S32 Q1, D23, D19 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - VEXT.32 Q11,Q6,Q11,#3 - SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + VEXT.32 Q11, Q6, Q11, #3 + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 - VSHR.S64 D6,#32 @acc = mac32_tns_neon(state[j - 1],lpc[j],acc, temp_lo)@ + VADD.I64 D6, D2, D3 + VSHR.S64 D6, #32 @acc = mac32_tns_neon(state[j - 1],lpc[j],acc, temp_lo)@ - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - MOV r9, r8, asr r1 - VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] - STR r9 , [r0],#4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT OUTER_LOOP2_8 + BGT OUTER_LOOP2_8 - B EXIT + B EXIT ORDER12: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum OUTER_LOOP2_12: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - VMLAL.S32 Q1, D22, D18 - VMLAL.S32 Q1, D23, D19 - VMLAL.S32 Q1, D24, D20 - VMLAL.S32 Q1, D25, D21 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D22, D18 + VMLAL.S32 Q1, D23, D19 + VMLAL.S32 Q1, D24, D20 + VMLAL.S32 Q1, D25, D21 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - VEXT.32 Q12,Q11,Q12,#3 - SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + VEXT.32 Q12, Q11, Q12, #3 + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 - VEXT.32 Q11,Q6,Q11,#3 - VSHR.S64 D6,#32 + VADD.I64 D6, D2, D3 + VEXT.32 Q11, Q6, Q11, #3 + VSHR.S64 D6, #32 - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - MOV r9, r8, asr r1 - VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] - STR r9 , [r0],#4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT OUTER_LOOP2_12 + BGT OUTER_LOOP2_12 - B EXIT + B EXIT ORDER16: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum OUTER_LOOP2_16: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - VMLAL.S32 Q1, D22, D18 - VMLAL.S32 Q1, D23, D19 - VMLAL.S32 Q1, D24, D20 - VMLAL.S32 Q1, D25, D21 - VMLAL.S32 Q1, D28, D26 @ - VMLAL.S32 Q1, D29, D27 @ @order16 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D22, D18 + VMLAL.S32 Q1, D23, D19 + VMLAL.S32 Q1, D24, D20 + VMLAL.S32 Q1, D25, D21 + VMLAL.S32 Q1, D28, D26 @ + VMLAL.S32 Q1, D29, D27 @ @order16 - VEXT.32 Q14,Q12,Q14,#3 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - VEXT.32 Q12,Q11,Q12,#3 - SUBS r7 , r7 , #1 + VEXT.32 Q14, Q12, Q14, #3 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + VEXT.32 Q12, Q11, Q12, #3 + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 - VEXT.32 Q11,Q6,Q11,#3 - VSHR.S64 D6,#32 + VADD.I64 D6, D2, D3 + VEXT.32 Q11, Q6, Q11, #3 + VSHR.S64 D6, #32 - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - MOV r9, r8, asr r1 - VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] - STR r9 , [r0],#4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT OUTER_LOOP2_16 + BGT OUTER_LOOP2_16 - B EXIT + B EXIT ORDER20: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum OUTER_LOOP2_20: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - VMLAL.S32 Q1, D22, D18 - VMLAL.S32 Q1, D23, D19 - VMLAL.S32 Q1, D24, D20 - VMLAL.S32 Q1, D25, D21 - VMLAL.S32 Q1, D28, D26 @ - VMLAL.S32 Q1, D29, D27 @ @order16 - VMLAL.S32 Q1, D8, D4 @order20 - VMLAL.S32 Q1, D9, D5 @order20 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D22, D18 + VMLAL.S32 Q1, D23, D19 + VMLAL.S32 Q1, D24, D20 + VMLAL.S32 Q1, D25, D21 + VMLAL.S32 Q1, D28, D26 @ + VMLAL.S32 Q1, D29, D27 @ @order16 + VMLAL.S32 Q1, D8, D4 @order20 + VMLAL.S32 Q1, D9, D5 @order20 - VEXT.32 Q4,Q14,Q4,#3 @ @for order20 - VEXT.32 Q14,Q12,Q14,#3 @ @for order16 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - VEXT.32 Q12,Q11,Q12,#3 @order12 - SUBS r7 , r7 , #1 + VEXT.32 Q4, Q14, Q4, #3 @ @for order20 + VEXT.32 Q14, Q12, Q14, #3 @ @for order16 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + VEXT.32 Q12, Q11, Q12, #3 @order12 + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 - VEXT.32 Q11,Q6,Q11,#3 @order8 - VSHR.S64 D6,#32 + VADD.I64 D6, D2, D3 + VEXT.32 Q11, Q6, Q11, #3 @order8 + VSHR.S64 D6, #32 - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - MOV r9, r8, asr r1 - VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] - STR r9 , [r0],#4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT OUTER_LOOP2_20 + BGT OUTER_LOOP2_20 - B EXIT + B EXIT NEG_INC: @ filtering loop for inc = -1 - LDR r8 , [r0] @r8 =*spectrum - SUBS r7 , r7 , #1 - MOV r8, r8, lsl r1 - MOV r9, r8, asr r1 - MOV r8 , r8 ,lsl r6 - STR r8 , [r12] @state[0] = sp[top] - STR r9, [r0], #-4 - BEQ NEGFILTER_LOOP2 + LDR r8 , [r0] @r8 =*spectrum + SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 + MOV r9, r8, asr r1 + MOV r8 , r8 , lsl r6 + STR r8 , [r12] @state[0] = sp[top] + STR r9, [r0], #-4 + BEQ NEGFILTER_LOOP2 NEGFILTER_LOOP1: - LDR r8 , [r0] @r8 =*spectrum - SUB r5 , r4 , r7 @ - MOV r5 , r5 ,lsl #2 - MOV r11 , #0 @accu = 0 - ADD r14, r12, r5 @state[j] + LDR r8 , [r0] @r8 =*spectrum + SUB r5 , r4 , r7 @ + MOV r5 , r5 , lsl #2 + MOV r11 , #0 @accu = 0 + ADD r14, r12, r5 @state[j] NEGINNER_LOOP1: - LDR r10 , [r14,#-4] @state[j-1] - LDR r9 , [r3 , r5] @lpc[j] - SUBS r5 , r5 , #4 - - MOV r2, #0 - SMLAL r2 , r11, r10, r9 - STR r10 , [r14], #-4 @state[j] = state[j - 1] - BGT NEGINNER_LOOP1 - - MOV r8, r8, lsl r1 - SUB r8 , r8 , r11,lsl #1 - MOV r9, r8, asr r1 - STR r9 , [r0], #-4 @*spectrum = y@ - SUBS r7 , r7 , #1 @i-- - MOV r8 , r8 ,lsl r6 - STR r8 , [r12] @state[0] - BGT NEGFILTER_LOOP1 + LDR r10 , [r14, #-4] @state[j-1] + LDR r9 , [r3 , r5] @lpc[j] + SUBS r5 , r5 , #4 + + MOV r2, #0 + SMLAL r2 , r11, r10, r9 + STR r10 , [r14], #-4 @state[j] = state[j - 1] + BGT NEGINNER_LOOP1 + + MOV r8, r8, lsl r1 + SUB r8 , r8 , r11, lsl #1 + MOV r9, r8, asr r1 + STR r9 , [r0], #-4 @*spectrum = y@ + SUBS r7 , r7 , #1 @i-- + MOV r8 , r8 , lsl r6 + STR r8 , [r12] @state[0] + BGT NEGFILTER_LOOP1 NEGFILTER_LOOP2: - LDR R1, [sp] @size - SUBS R7 , R1 , r4 @size-order - BEQ EXIT + LDR R1, [sp] @size + SUBS R7 , R1 , r4 @size-order + BEQ EXIT - ADD R8, R3, #4 + ADD R8, R3, #4 - MOV R14,#0 - VLD1.32 {D10, D11}, [R8]! @lpc[j] - MOV R5 , R4 ,LSL #2 @count for inner loop = order + MOV R14, #0 + VLD1.32 {D10, D11}, [R8]! @lpc[j] + MOV R5 , R4 , LSL #2 @count for inner loop = order - LDR R1, [sp,#240] @scaleSpec + LDR R1, [sp, #240] @scaleSpec - CMP R4,#4 - VLD1.32 {D12, D13}, [R12]! @state[j - 1] - BEQ NEGORDER4 + CMP R4, #4 + VLD1.32 {D12, D13}, [R12]! @state[j - 1] + BEQ NEGORDER4 - VLD1.32 {D18, D19}, [R8]! - CMP R4,#8 + VLD1.32 {D18, D19}, [R8]! + CMP R4, #8 - VLD1.32 {D22, D23}, [R12]! - BEQ NEGORDER8 + VLD1.32 {D22, D23}, [R12]! + BEQ NEGORDER8 - VLD1.32 {D20, D21}, [R8]! - CMP R4,#12 + VLD1.32 {D20, D21}, [R8]! + CMP R4, #12 - VLD1.32 {D24, D25}, [R12]! - BEQ NEGORDER12 + VLD1.32 {D24, D25}, [R12]! + BEQ NEGORDER12 NEGORDER4: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum NEGOUTER_LOOP2_4: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - SUBS r7 , r7 , #1 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 - VSHR.S64 D6,#32 + VADD.I64 D6, D2, D3 + VSHR.S64 D6, #32 - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 + MOV r2 , r8 , lsl r6 - VMOV.32 D15[1], R2 - MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 + MOV r9, r8, asr r1 - STR r9 , [r0],#-4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #-4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT NEGOUTER_LOOP2_4 + BGT NEGOUTER_LOOP2_4 - B EXIT + B EXIT NEGORDER8: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum NEGOUTER_LOOP2_8: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - VMLAL.S32 Q1, D22, D18 - VMLAL.S32 Q1, D23, D19 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D22, D18 + VMLAL.S32 Q1, D23, D19 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - VEXT.32 Q11,Q6,Q11,#3 - SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + VEXT.32 Q11, Q6, Q11, #3 + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 + VADD.I64 D6, D2, D3 - VSHR.S64 D6,#32 + VSHR.S64 D6, #32 - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - VMOV.32 D15[1], R2 @state[0] - MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 - STR r9 , [r0],#-4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #-4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT NEGOUTER_LOOP2_8 + BGT NEGOUTER_LOOP2_8 - B EXIT + B EXIT NEGORDER12: - LDR r8 , [r0] @r8 = y = *spectrum + LDR r8 , [r0] @r8 = y = *spectrum NEGOUTER_LOOP2_12: - VDUP.32 Q1,R14 @Q1= accu = 0 + VDUP.32 Q1, R14 @Q1= accu = 0 - VMLAL.S32 Q1, D10, D12 - VMLAL.S32 Q1, D11, D13 - VMLAL.S32 Q1, D22, D18 - VMLAL.S32 Q1, D23, D19 - VMLAL.S32 Q1, D24, D20 - VMLAL.S32 Q1, D25, D21 + VMLAL.S32 Q1, D10, D12 + VMLAL.S32 Q1, D11, D13 + VMLAL.S32 Q1, D22, D18 + VMLAL.S32 Q1, D23, D19 + VMLAL.S32 Q1, D24, D20 + VMLAL.S32 Q1, D25, D21 - MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec - VEXT.32 Q12,Q11,Q12,#3 - SUBS r7 , r7 , #1 + MOV r8, r8, lsl r1 @y = (*spectrum) << scaleSpec + VEXT.32 Q12, Q11, Q12, #3 + SUBS r7 , r7 , #1 - VADD.I64 D6,D2,D3 - VEXT.32 Q11,Q6,Q11,#3 - VSHR.S64 D6,#32 + VADD.I64 D6, D2, D3 + VEXT.32 Q11, Q6, Q11, #3 + VSHR.S64 D6, #32 - @VMOV R11,D6[0] - VST1.32 D6[0],[SP] - LDR R11,[SP] - SUB r8 , r8 , r11,lsl #1 @y=sub32(y,(acc<<1)) + @VMOV R11,D6[0] + VST1.32 D6[0], [SP] + LDR R11, [SP] + SUB r8 , r8 , r11, lsl #1 @y=sub32(y,(acc<<1)) - MOV r2 , r8 ,lsl r6 @ shl32(y, shift_value) + MOV r2 , r8 , lsl r6 @ shl32(y, shift_value) - VMOV.32 D15[1], R2 @state[0] - MOV r9, r8, asr r1 + VMOV.32 D15[1], R2 @state[0] + MOV r9, r8, asr r1 - STR r9 , [r0],#-4 @*spectrum = y@ - VEXT.32 Q6,Q7,Q6,#3 - LDRGT r8 , [r0] @r8 = y = *spectrum + STR r9 , [r0], #-4 @*spectrum = y@ + VEXT.32 Q6, Q7, Q6, #3 + LDRGT r8 , [r0] @r8 = y = *spectrum - BGT NEGOUTER_LOOP2_12 + BGT NEGOUTER_LOOP2_12 EXIT: - ADD sp, sp ,#128 - vpop {d8-d15} - LDMFD r13!, {r4 - r12, r15} + ADD sp, sp , #128 + vpop {d8-d15} + LDMFD r13!, {r4 - r12, r15} diff --git a/decoder/armv8/ixheaacd_apply_scale_factors.s b/decoder/armv8/ixheaacd_apply_scale_factors.s index 0c87aff..82c0c97 100644 --- a/decoder/armv8/ixheaacd_apply_scale_factors.s +++ b/decoder/armv8/ixheaacd_apply_scale_factors.s @@ -32,7 +32,7 @@ ixheaacd_scale_factor_process_armv8: MOV x21, x6 MOV x22, x7 - CMP x2, #0 // Tbands + CMP x2, #0 // Tbands BGT lbl17 @@ -50,7 +50,7 @@ ADD_34: TBANDS_LOOP: LDRSH x5, [x1], #2 // scale_factor = *Scfactor++; - LDRB w4, [x3], #1 //Offset [1] + LDRB w4, [x3], #1 //Offset [1] sxtw x4, w4 @@ -149,8 +149,8 @@ SHIFT_NEGTIVE: //;loop over sfbWidth a multiple of 4 ASR x6, x6, #16 ASR x7, x7, #16 - LSL x6, x6, #2 // shl for fixmul_32x16b and shl32(buffer,1) - LSL x7, x7, #2 // shl for fixmul_32x16b and shl32(buffer,1) + LSL x6, x6, #2 // shl for fixmul_32x16b and shl32(buffer,1) + LSL x7, x7, #2 // shl for fixmul_32x16b and shl32(buffer,1) STP w6, w7, [x0], #8 // *x_invquant++ = buffex1; diff --git a/decoder/armv8/ixheaacd_cos_sin_mod_loop2.s b/decoder/armv8/ixheaacd_cos_sin_mod_loop2.s index 294dcc2..a48a705 100644 --- a/decoder/armv8/ixheaacd_cos_sin_mod_loop2.s +++ b/decoder/armv8/ixheaacd_cos_sin_mod_loop2.s @@ -131,9 +131,9 @@ ixheaacd_cos_sin_mod_loop2: LOOP1: LD1 {v2.2s}, [x0] LD1 {v3.2s}, [x10] - LDR w5, [x3] //RE2 + LDR w5, [x3] //RE2 sxtw x5, w5 - LDR w6, [x11] //RE3 + LDR w6, [x11] //RE3 sxtw x6, w6 //VTRN.32 D2, D3 TRN1 v4.2s, v2.2s, v3.2s diff --git a/decoder/armv8/ixheaacd_function_selector_armv8.c b/decoder/armv8/ixheaacd_function_selector_armv8.c index 86592d3..bf28a30 100644 --- a/decoder/armv8/ixheaacd_function_selector_armv8.c +++ b/decoder/armv8/ixheaacd_function_selector_armv8.c @@ -229,20 +229,20 @@ VOID(*ixheaacd_aac_ld_dec_rearrange) (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, UWORD8 *re_arr_tab) = &ixheaacd_rearrange_dec; -VOID (*ixheaacd_fft32x32_ld) +VOID(*ixheaacd_fft32x32_ld) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_imdct_using_fft_armv8; -VOID (*ixheaacd_fft32x32_ld2) +VOID(*ixheaacd_fft32x32_ld2) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_fft32x32_ld2_armv8; WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo) = &ixheaacd_neg_expo_inc_arm; -VOID (*ixheaacd_inv_dit_fft_8pt) +VOID(*ixheaacd_inv_dit_fft_8pt) (WORD32 *x, WORD32 *real, WORD32 *imag) = &ixheaacd_inv_dit_fft_8pt_armv8; -VOID (*ixheaacd_scale_factor_process) +VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_armv8;
\ No newline at end of file diff --git a/decoder/armv8/ixheaacd_post_twiddle_overlap.s b/decoder/armv8/ixheaacd_post_twiddle_overlap.s index aa6b70f..8ddce48 100644 --- a/decoder/armv8/ixheaacd_post_twiddle_overlap.s +++ b/decoder/armv8/ixheaacd_post_twiddle_overlap.s @@ -1,43 +1,43 @@ .macro push_v_regs - stp q8, q9, [sp, #-32]! - stp q10, q11, [sp, #-32]! - stp q12, q13, [sp, #-32]! - stp q14, q15, [sp, #-32]! + stp q8, q9, [sp, #-32]! + stp q10, q11, [sp, #-32]! + stp q12, q13, [sp, #-32]! + stp q14, q15, [sp, #-32]! //st1 { v8.2d, v9.2d, v10.2d, v11.2d}, [sp, #-64]! //st1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp, #-64]! - stp X8, X9, [sp, #-16]! - stp X10, X11, [sp, #-16]! - stp X12, X13, [sp, #-16]! - stp X14, X15, [sp, #-16]! - stp X16, X17, [sp, #-16]! - stp X18, X19, [sp, #-16]! - stp X20, X21, [sp, #-16]! - stp X22, X23, [sp, #-16]! - stp X24, X25, [sp, #-16]! - stp X26, X27, [sp, #-16]! - stp X28, X29, [sp, #-16]! - stp X30, X29, [sp, #-16]! + stp X8, X9, [sp, #-16]! + stp X10, X11, [sp, #-16]! + stp X12, X13, [sp, #-16]! + stp X14, X15, [sp, #-16]! + stp X16, X17, [sp, #-16]! + stp X18, X19, [sp, #-16]! + stp X20, X21, [sp, #-16]! + stp X22, X23, [sp, #-16]! + stp X24, X25, [sp, #-16]! + stp X26, X27, [sp, #-16]! + stp X28, X29, [sp, #-16]! + stp X30, X29, [sp, #-16]! .endm .macro pop_v_regs - ldp X30, X29, [sp], #16 - ldp X28, X29, [sp], #16 - ldp X26, X27, [sp], #16 - ldp X24, X25, [sp], #16 - ldp X22, X23, [sp], #16 - ldp X20, X21, [sp], #16 - ldp X18, X19, [sp], #16 - ldp X16, X17, [sp], #16 - ldp X14, X15, [sp], #16 - ldp X12, X13, [sp], #16 - ldp X10, X11, [sp], #16 - ldp X8, X9, [sp], #16 + ldp X30, X29, [sp], #16 + ldp X28, X29, [sp], #16 + ldp X26, X27, [sp], #16 + ldp X24, X25, [sp], #16 + ldp X22, X23, [sp], #16 + ldp X20, X21, [sp], #16 + ldp X18, X19, [sp], #16 + ldp X16, X17, [sp], #16 + ldp X14, X15, [sp], #16 + ldp X12, X13, [sp], #16 + ldp X10, X11, [sp], #16 + ldp X8, X9, [sp], #16 //ld1 {v12.2d, v13.2d, v14.2d, v15.2d}, [sp], #64 //ld1 { v8.2d, v9.2d, v10.2d, v11.2d}, [sp], #64 - ldp q14, q15, [sp], #32 - ldp q12, q13, [sp], #32 - ldp q10, q11, [sp], #32 - ldp q8, q9, [sp], #32 + ldp q14, q15, [sp], #32 + ldp q12, q13, [sp], #32 + ldp q10, q11, [sp], #32 + ldp q8, q9, [sp], #32 .endm @@ -58,32 +58,32 @@ ixheaacd_post_twid_overlap_add_armv8: //sxtw x5,w5 //LDR w6, [sp, #108] //sxtw x6,w6 - MOV x16, x5 - MOV x17, x7 + MOV x16, x5 + MOV x17, x7 LSL x9, x3, #2 ASR x9, x9, #1 ADD x6, x6, x9 SUB x6, x6, #4 - LDR w8, =7500 - sxtw x8,w8 + LDR w8, =7500 + sxtw x8, w8 ADD x2, x2, x8 - movi v18.4h, #50 - sub x20, x5, #15 - neg x9, x20 - movi v20.4s, #0x80, LSL #8 - dup v16.4s,w5 + movi v18.4h, #50 + sub x20, x5, #15 + neg x9, x20 + movi v20.4s, #0x80, LSL #8 + dup v16.4s, w5 SUB x5, x5, #16 //STR w5, [sp, #116] - MOV w25, w5 - sxtw x25,w25 + MOV w25, w5 + sxtw x25, w25 MOV x8, #1 LSL x8, x8, x9 //STR w8, [sp, #120] - MOV w26, w8 + MOV w26, w8 //sxtw x8,w8 @@ -91,32 +91,32 @@ ixheaacd_post_twid_overlap_add_armv8: ARM_PROLOGUE: - LDR w8, [x1], #4 - sxtw x8,w8 - LDR w9, [x1], #4 - sxtw x9,w9 + LDR w8, [x1], #4 + sxtw x8, w8 + LDR w9, [x1], #4 + sxtw x9, w9 - LDR w10, [x2], #4 - sxtw x10,w10 + LDR w10, [x2], #4 + sxtw x10, w10 - AND w19,w10,0xFFFF - sxth x19,w19 - ASR w10,w10,#16 + AND w19, w10, 0xFFFF + sxth x19, w19 + ASR w10, w10, #16 // SMULWT x11, x8, x10 // // SMULWB x12, x9, x10 // SMULWB x5, x8, x10 // SMLAWT x7, x9, x10, x5 - SMULL x11, w8, w10 - ASR x11,x11,#16 - SMULL x12, w9, w19 - ASR x12,x12,#16 - SMULL x5, w8, w19 - ASR x5,x5,#16 - SMULL x7, w9, w10 - ASR x7, x7, #16 - ADD x7, x7, x5 + SMULL x11, w8, w10 + ASR x11, x11, #16 + SMULL x12, w9, w19 + ASR x12, x12, #16 + SMULL x5, w8, w19 + ASR x5, x5, #16 + SMULL x7, w9, w10 + ASR x7, x7, #16 + ADD x7, x7, x5 SUB x8, x12, x11 MVN x5, x7 @@ -125,87 +125,87 @@ ARM_PROLOGUE: MOV x9, #50 MOV x12, #-50 - AND w19,w9,0xFFFF - sxth x19,w19 - SMULL x10, w5, w19 - ASR x10,x10,#16 - AND w19,w12,0xFFFF - sxth x19,w19 - SMULL x11, w8, w19 - ASR x11,x11,#16 + AND w19, w9, 0xFFFF + sxth x19, w19 + SMULL x10, w5, w19 + ASR x10, x10, #16 + AND w19, w12, 0xFFFF + sxth x19, w19 + SMULL x11, w8, w19 + ASR x11, x11, #16 ADD x8, x8, x10 ADD x5, x5, x11 //LDR w11, [sp, #104] - MOV w11, w16 - sxth x11,w11 - LDR w10, [x6], #-32 - sxtw x10,w10 + MOV w11, w16 + sxth x11, w11 + LDR w10, [x6], #-32 + sxtw x10, w10 - AND w19,w10,0xFFFF - sxth x19,w19 - ASR w20,w10,#16 + AND w19, w10, 0xFFFF + sxth x19, w19 + ASR w20, w10, #16 //SMULWB x7, x8, x10 - SMULL x7, w8, w19 - ASR x7, x7, #16 + SMULL x7, w8, w19 + ASR x7, x7, #16 MVN x8, x8 ADD x8, x8, #1 //SMULWT x12, x8, x10 - SMULL x12, w8, w20 - ASR x12, x12, #16 + SMULL x12, w8, w20 + ASR x12, x12, #16 CMP x11, #0 BLT NEXT - SUB x9, x11, #16 - negs x9,x9 + SUB x9, x11, #16 + negs x9, x9 - // LDR w8, [sp, #120] + // LDR w8, [sp, #120] //sxtw x8,w8 - MOV v1.s[0], w26 - MOV v2.s[0], w5 + MOV v1.s[0], w26 + MOV v2.s[0], w5 //sQADD w5, w5, w8 //ASR w5, w5, w9 - SQADD v2.2s, v2.2s, v1.2s - MOV w5, v2.s[0] + SQADD v2.2s, v2.2s, v1.2s + MOV w5, v2.s[0] ASR w5, w5, w9 - SUB x9, x11, #31 - negs x9,x9 - ASR x20, x7, x9 + SUB x9, x11, #31 + negs x9, x9 + ASR x20, x7, x9 //MOV x8, x20 ADDS x8, x20, #0 - BGE NEXT2 - CMN x8, #1 + BGE NEXT2 + CMN x8, #1 NEXT2: - LDR x20,=0x80000000 - csel x7, x20, x7,LT - LDR x20,=0x7fffffff - csel x7, x20, x7,GT - LSL x20, x7, x11 - csel x7,x20,x7,EQ - - SUB x9, x11, #31 - negs x9,x9 - ASR x20, x12, x9 + LDR x20, =0x80000000 + csel x7, x20, x7, LT + LDR x20, =0x7fffffff + csel x7, x20, x7, GT + LSL x20, x7, x11 + csel x7, x20, x7, EQ + + SUB x9, x11, #31 + negs x9, x9 + ASR x20, x12, x9 //MOV x8, x20 ADDS x8, x20, #0 - BGE NEXT3 - CMN x8, #1 + BGE NEXT3 + CMN x8, #1 NEXT3: - LDR x20,=0x80000000 - csel x12, x20, x12,LT - LDR x20,=0x7fffffff - csel x12, x20, x12,GT - LSL x20, x12, x11 - csel x12,x20,x12,EQ + LDR x20, =0x80000000 + csel x12, x20, x12, LT + LDR x20, =0x7fffffff + csel x12, x20, x12, GT + LSL x20, x12, x11 + csel x12, x20, x12, EQ B NEXT1 NEXT: @@ -214,83 +214,83 @@ NEXT: ASR w5, w5, w11 MOV w8, #0x8000 - MOV v1.s[0], w8 - MOV v2.s[0], w5 + MOV v1.s[0], w8 + MOV v2.s[0], w5 //QADD x5, x5, x8 - SQADD v2.2s, v2.2s, v1.2s - MOV w5, v2.s[0] + SQADD v2.2s, v2.2s, v1.2s + MOV w5, v2.s[0] ASR w5, w5, #16 ASR w7, w7, w11 ASR w12, w12, w11 NEXT1: - LDR w9, [x4] - sxtw x9,w9 + LDR w9, [x4] + sxtw x9, w9 MOV w8, #0x8000 //sxtw x8,w8 - STR w5, [x4], #4 - sxtw x5,w5 + STR w5, [x4], #4 + sxtw x5, w5 - ROR w20, w10, #16 + ROR w20, w10, #16 //UXTH x5, x10, ROR #16 UXTH w5, w20 UXTH w10, w10 - dup v0.2s,w9 - dup v2.2s,w10 - dup v3.2s,w5 + dup v0.2s, w9 + dup v2.2s, w10 + dup v3.2s, w5 //VZIP.32 D2, D3 - ZIP1 v28.2s, v2.2s, v3.2s - ZIP2 v3.2s, v2.2s, v3.2s - MOV v2.8b, v28.8b - sMULL v0.2d, v2.2s, v0.2s - Sqxtn v8.2s, v0.2d + ZIP1 v28.2s, v2.2s, v3.2s + ZIP2 v3.2s, v2.2s, v3.2s + MOV v2.8b, v28.8b + sMULL v0.2d, v2.2s, v0.2s + Sqxtn v8.2s, v0.2d - dup v0.2s,w12 - dup v1.2s,w7 + dup v0.2s, w12 + dup v1.2s, w7 //VZIP.32 D0, D1 - ZIP1 v28.2s, v0.2s, v1.2s - ZIP2 v1.2s, v0.2s, v1.2s - MOV v0.8b, v28.8b + ZIP1 v28.2s, v0.2s, v1.2s + ZIP2 v1.2s, v0.2s, v1.2s + MOV v0.8b, v28.8b - SQSUB v8.2s, v0.2s , v8.2s + SQSUB v8.2s, v0.2s , v8.2s - sQshL v8.2s, v8.2s,#2 - dup v0.2s,w8 - SQADD v8.2s, v8.2s , v0.2s - sshR v8.2s, v8.2s,#16 + sQshL v8.2s, v8.2s, #2 + dup v0.2s, w8 + SQADD v8.2s, v8.2s , v0.2s + sshR v8.2s, v8.2s, #16 - MOV x7, x17 + MOV x7, x17 //sxtw x7,w7 LSL x10, x7, #1 ASR x5, x3, #1 //SMULBB x5, x10, x5 - AND w5,w5,0xFFFF - sxth x5,w5 - AND w19,w10,0xFFFF - sxth x19,w19 - SMULL x5, w19, w5 + AND w5, w5, 0xFFFF + sxth x5, w5 + AND w19, w10, 0xFFFF + sxth x19, w19 + SMULL x5, w19, w5 ADD x5, x5, x0 SUB x0, x5, x10 MVN x9, x10 ADD x9, x9, #1 - ST1 {v8.h}[2],[x0], x9 - ST1 {v8.h}[0],[x5], x10 + ST1 {v8.h}[2], [x0], x9 + ST1 {v8.h}[0], [x5], x10 MOV x8, x1 @@ -311,875 +311,875 @@ PROLOGUE_NEON: ASR x3, x3, #2 SUB x3, x3, #2 - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b ADD x1, x1, x12 //VUZP.16 D0, D1 UZP1 v28.8h, v0.8h, v0.8h UZP2 v29.8h, v0.8h, v0.8h - MOV v0.d[0], v28.d[0] - MOV v0.d[1], v29.d[0] + MOV v0.d[0], v28.d[0] + MOV v0.d[1], v29.d[0] //VUZP.16 D2, D3 UZP1 v28.8h, v2.8h, v2.8h UZP2 v29.8h, v2.8h, v2.8h - MOV v2.d[0], v28.d[0] - MOV v2.d[1], v29.d[0] + MOV v2.d[0], v28.d[0] + MOV v2.d[1], v29.d[0] //rev64 v0.8h, v0.8h - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2, #16 - - LD2 { v4.4s, v5.4s}, [x8] - MOV v6.16b, v5.16b - ADD x8, x8,#32 - uMULL v30.4s, v0.4h, v9.4h + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2, #16 + + LD2 { v4.4s, v5.4s}, [x8] + MOV v6.16b, v5.16b + ADD x8, x8, #32 + uMULL v30.4s, v0.4h, v9.4h // VUZP.16 D4, D5 UZP1 v28.8h, v4.8h, v4.8h UZP2 v29.8h, v4.8h, v4.8h - MOV v4.d[0], v28.d[0] - MOV v5.d[0], v29.d[0] + MOV v4.d[0], v28.d[0] + MOV v5.d[0], v29.d[0] - uMULL v28.4s, v2.4h, v8.4h + uMULL v28.4s, v2.4h, v8.4h // VUZP.16 D6, D7 UZP1 v26.8h, v6.8h, v6.8h UZP2 v27.8h, v6.8h, v6.8h - MOV v6.d[0], v26.d[0] - MOV v7.d[0], v27.d[0] + MOV v6.d[0], v26.d[0] + MOV v7.d[0], v27.d[0] - uMULL v26.4s, v0.4h, v8.4h + uMULL v26.4s, v0.4h, v8.4h - uMULL v24.4s, v2.4h, v9.4h + uMULL v24.4s, v2.4h, v9.4h - LD2 { v10.4s, v11.4s}, [x6] - MOV v12.16b, v11.16b - ADD x6, x6, x12 - ushR v30.4s, v30.4s,#16 + LD2 { v10.4s, v11.4s}, [x6] + MOV v12.16b, v11.16b + ADD x6, x6, x12 + ushR v30.4s, v30.4s, #16 //VUZP.16 D10, D11 UZP1 v22.8h, v10.8h, v10.8h UZP2 v23.8h, v10.8h, v10.8h - MOV v10.d[0], v22.d[0] - MOV v10.d[1], v23.d[0] + MOV v10.d[0], v22.d[0] + MOV v10.d[1], v23.d[0] - ushR v28.4s, v28.4s,#16 + ushR v28.4s, v28.4s, #16 //VUZP.16 D12, D13 UZP1 v22.8h, v12.8h, v12.8h UZP2 v23.8h, v12.8h, v12.8h - MOV v12.d[0], v22.d[0] - MOV v12.d[1], v23.d[0] + MOV v12.d[0], v22.d[0] + MOV v12.d[1], v23.d[0] - sMLAL v30.4s, v1.4h, v9.4h + sMLAL v30.4s, v1.4h, v9.4h - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - sMLAL v28.4s, v3.4h, v8.4h + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] + sMLAL v28.4s, v3.4h, v8.4h - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] - ushR v26.4s, v26.4s,#16 + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] + ushR v26.4s, v26.4s, #16 - ushR v24.4s, v24.4s,#16 + ushR v24.4s, v24.4s, #16 - sMLAL v26.4s, v1.4h, v8.4h - sMLAL v24.4s, v3.4h, v9.4h + sMLAL v26.4s, v1.4h, v8.4h + sMLAL v24.4s, v3.4h, v9.4h - ADD v30.4s, v30.4s , v28.4s - NEG v30.4s, v30.4s + ADD v30.4s, v30.4s , v28.4s + NEG v30.4s, v30.4s - uMULL v22.4s, v4.4h, v8.4h + uMULL v22.4s, v4.4h, v8.4h - SUB v28.4s, v24.4s , v26.4s + SUB v28.4s, v24.4s , v26.4s - mov v26.16b, v30.16b - mov v24.16b, v28.16b + mov v26.16b, v30.16b + mov v24.16b, v28.16b // VUZP.16 D24, D25 UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s,#16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s, #16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s,#16 - ushR v0.4s, v0.4s,#16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s, #16 + ushR v0.4s, v0.4s, #16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s,#16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s,#16 - sshR v0.4s, v0.4s,#16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s, #16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s, #16 + sshR v0.4s, v0.4s, #16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + ADD v22.4s, v22.4s , v0.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v14.4s,w11 - SQADD v28.4s, v28.4s , v14.4s + MOV w11, w26 + dup v14.4s, w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] - MOV w11, w25 + MOV w11, w25 //sxtw x11,w11 - dup v0.4s,w11 - sQshL v28.4s, v28.4s, v0.4s + dup v0.4s, w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D24, D25 UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h + uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s,#16 - ushR v26.4s, v26.4s,#16 + ushR v8.4s, v8.4s, #16 + ushR v26.4s, v26.4s, #16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s,#16 - ushR v6.4s, v6.4s,#16 + ushR v4.4s, v4.4s, #16 + ushR v6.4s, v6.4s, #16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v8.4s,w11 - SQADD v0.4s, v0.4s , v8.4s + MOV w11, w26 + dup v8.4s, w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v26.4s,w11 - sQshL v0.4s, v0.4s, v26.4s + MOV w11, w25 + dup v26.4s, w11 + sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b + mov v26.16b, v28.16b - LD2 { v28.4s, v29.4s}, [x4] - MOV v30.16b, v29.16b - MOV v29.d[0], v28.d[1] - // VZIP.32 Q13, Q0 + LD2 { v28.4s, v29.4s}, [x4] + MOV v30.16b, v29.16b + MOV v29.d[0], v28.d[1] +// VZIP.32 Q13, Q0 - ZIP1 v19.4s, v26.4s, v0.4s - ZIP2 v0.4s, v26.4s, v0.4s - MOV v26.16b, v19.16b + ZIP1 v19.4s, v26.4s, v0.4s + ZIP2 v0.4s, v26.4s, v0.4s + MOV v26.16b, v19.16b - ST1 { v26.4s}, [x4],#16 - ST1 { v0.4s}, [x4],#16 + ST1 { v26.4s}, [x4], #16 + ST1 { v0.4s}, [x4], #16 - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 // VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s // VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] // VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[0] - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[0] + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] + movi v1.2s, #0 // VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h - - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b - ADD x1, x1, x12 + SADDL v0.4s, v11.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h + + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b + ADD x1, x1, x12 // VUZP.16 D0, D1 UZP1 v19.8h, v0.8h, v0.8h UZP2 v21.8h, v0.8h, v0.8h - MOV v0.d[0], v19.d[0] - MOV v0.d[1], v21.d[0] + MOV v0.d[0], v19.d[0] + MOV v0.d[1], v21.d[0] // VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v2.d[1], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v2.d[1], v21.d[0] - ushR v8.4s, v8.4s,#16 + ushR v8.4s, v8.4s, #16 - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - ushR v30.4s, v30.4s,#16 + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + ushR v30.4s, v30.4s, #16 - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] - sMLAL v8.4s, v27.4h, v11.4h + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] + sMLAL v8.4s, v27.4h, v11.4h - sMLAL v30.4s, v15.4h, v10.4h + sMLAL v30.4s, v15.4h, v10.4h - LD2 { v10.4s, v11.4s}, [x6] - ADD x6, x6, x12 - MOV v12.16b, v11.16b - sQshL v4.4s, v4.4s,#2 + LD2 { v10.4s, v11.4s}, [x6] + ADD x6, x6, x12 + MOV v12.16b, v11.16b + sQshL v4.4s, v4.4s, #2 - // VUZP.16 D10, D11 +// VUZP.16 D10, D11 UZP1 v19.8h, v10.8h, v10.8h UZP2 v21.8h, v10.8h, v10.8h - MOV v10.d[0], v19.d[0] - MOV v10.d[1], v21.d[0] + MOV v10.d[0], v19.d[0] + MOV v10.d[1], v21.d[0] - sQshL v6.4s, v6.4s,#2 + sQshL v6.4s, v6.4s, #2 // VUZP.16 D12, D13 UZP1 v19.8h, v12.8h, v12.8h UZP2 v21.8h, v12.8h, v12.8h - MOV v12.d[0], v19.d[0] - MOV v12.d[1], v21.d[0] + MOV v12.d[0], v19.d[0] + MOV v12.d[1], v21.d[0] - SQADD v14.4s, v4.4s , v20.4s + SQADD v14.4s, v4.4s , v20.4s - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - SQADD v6.4s, v6.4s , v20.4s + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] + SQADD v6.4s, v6.4s , v20.4s - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] - sshR v14.4s, v14.4s,#16 + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] + sshR v14.4s, v14.4s, #16 // VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - sshR v6.4s, v6.4s,#16 + sshR v6.4s, v6.4s, #16 // VUZP.16 D6, D7 UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s + mov v15.8b, v6.8b + sQshL v8.4s, v8.4s, v16.4s - LD2 { v4.4s, v5.4s}, [x8] - ADD x8, x8,#32 - MOV v6.16b, v5.16b - sQshL v30.4s, v30.4s, v16.4s + LD2 { v4.4s, v5.4s}, [x8] + ADD x8, x8, #32 + MOV v6.16b, v5.16b + sQshL v30.4s, v30.4s, v16.4s // VUZP.16 D4, D5 UZP1 v19.8h, v4.8h, v4.8h UZP2 v21.8h, v4.8h, v4.8h - MOV v4.d[0], v19.d[0] - MOV v5.d[0], v21.d[0] + MOV v4.d[0], v19.d[0] + MOV v5.d[0], v21.d[0] - SQSUB v8.4s, v8.4s , v24.4s + SQSUB v8.4s, v8.4s , v24.4s // VUZP.16 D6, D7 UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - SQSUB v22.4s, v30.4s , v22.4s + SQSUB v22.4s, v30.4s , v22.4s - sQshL v30.4s, v8.4s,#2 + sQshL v30.4s, v8.4s, #2 - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2, #16 - sQshL v22.4s, v22.4s,#2 + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2, #16 + sQshL v22.4s, v22.4s, #2 - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s + SQADD v30.4s, v30.4s , v20.4s + SQADD v22.4s, v22.4s , v20.4s - sshR v30.4s, v30.4s,#16 + sshR v30.4s, v30.4s, #16 // VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] - sshR v22.4s, v22.4s,#16 + sshR v22.4s, v22.4s, #16 // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - mov v23.8b, v30.8b + mov v23.8b, v30.8b CORE_LOOP: - ST1 {v14.h}[0], [x0] - ADD x0, x0, x9 - uMULL v30.4s, v0.4h, v9.4h + ST1 {v14.h}[0], [x0] + ADD x0, x0, x9 + uMULL v30.4s, v0.4h, v9.4h - ST1 {v22.h}[0], [x0] - ADD x0, x0, x9 - uMULL v28.4s, v2.4h, v8.4h + ST1 {v22.h}[0], [x0] + ADD x0, x0, x9 + uMULL v28.4s, v2.4h, v8.4h - ST1 {v14.h}[1], [x0] - ADD x0, x0, x9 - uMULL v26.4s, v0.4h, v8.4h + ST1 {v14.h}[1], [x0] + ADD x0, x0, x9 + uMULL v26.4s, v0.4h, v8.4h - ST1 {v22.h}[1], [x0] - ADD x0, x0, x9 - uMULL v24.4s, v2.4h, v9.4h + ST1 {v22.h}[1], [x0] + ADD x0, x0, x9 + uMULL v24.4s, v2.4h, v9.4h - ST1 {v14.h}[2], [x0] - ADD x0, x0, x9 - ushR v30.4s, v30.4s,#16 + ST1 {v14.h}[2], [x0] + ADD x0, x0, x9 + ushR v30.4s, v30.4s, #16 - ST1 {v22.h}[2], [x0] - ADD x0, x0, x9 - ushR v28.4s, v28.4s,#16 + ST1 {v22.h}[2], [x0] + ADD x0, x0, x9 + ushR v28.4s, v28.4s, #16 - ST1 {v14.h}[3], [x0] - ADD x0, x0, x9 - sMLAL v30.4s, v1.4h, v9.4h + ST1 {v14.h}[3], [x0] + ADD x0, x0, x9 + sMLAL v30.4s, v1.4h, v9.4h - ST1 {v22.h}[3], [x0] - ADD x0, x0, x9 - sMLAL v28.4s, v3.4h, v8.4h + ST1 {v22.h}[3], [x0] + ADD x0, x0, x9 + sMLAL v28.4s, v3.4h, v8.4h - ST1 {v15.h}[0], [x5] - ADD x5, x5, x10 - ushR v26.4s, v26.4s,#16 + ST1 {v15.h}[0], [x5] + ADD x5, x5, x10 + ushR v26.4s, v26.4s, #16 - ST1 {v23.h}[0], [x5] - ADD x5, x5, x10 - ushR v24.4s, v24.4s,#16 + ST1 {v23.h}[0], [x5] + ADD x5, x5, x10 + ushR v24.4s, v24.4s, #16 - ST1 {v15.h}[1], [x5] - ADD x5, x5, x10 - sMLAL v26.4s, v1.4h, v8.4h + ST1 {v15.h}[1], [x5] + ADD x5, x5, x10 + sMLAL v26.4s, v1.4h, v8.4h - ST1 {v23.h}[1], [x5] - ADD x5, x5, x10 - sMLAL v24.4s, v3.4h, v9.4h + ST1 {v23.h}[1], [x5] + ADD x5, x5, x10 + sMLAL v24.4s, v3.4h, v9.4h - ST1 {v15.h}[2], [x5] - ADD x5, x5, x10 - ADD v30.4s, v30.4s , v28.4s + ST1 {v15.h}[2], [x5] + ADD x5, x5, x10 + ADD v30.4s, v30.4s , v28.4s - ST1 {v23.h}[2], [x5] - ADD x5, x5, x10 - NEG v30.4s, v30.4s + ST1 {v23.h}[2], [x5] + ADD x5, x5, x10 + NEG v30.4s, v30.4s - ST1 {v15.h}[3], [x5] - ADD x5, x5, x10 + ST1 {v15.h}[3], [x5] + ADD x5, x5, x10 - ST1 {v23.h}[3], [x5] - ADD x5, x5, x10 - SUB v28.4s, v24.4s , v26.4s + ST1 {v23.h}[3], [x5] + ADD x5, x5, x10 + SUB v28.4s, v24.4s , v26.4s - mov v26.16b, v30.16b - uMULL v22.4s, v4.4h, v8.4h + mov v26.16b, v30.16b + uMULL v22.4s, v4.4h, v8.4h - mov v24.16b, v28.16b + mov v24.16b, v28.16b // VUZP.16 D24, D25 UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s,#16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s, #16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s,#16 - ushR v0.4s, v0.4s,#16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s, #16 + ushR v0.4s, v0.4s, #16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s,#16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s,#16 - sshR v0.4s, v0.4s,#16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s, #16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s, #16 + sshR v0.4s, v0.4s, #16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s + ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v14.4s,w11 - SQADD v28.4s, v28.4s , v14.4s + MOV w11, w26 + dup v14.4s, w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v0.4s,w11 - sQshL v28.4s, v28.4s, v0.4s + MOV w11, w25 + dup v0.4s, w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D24, D25 UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v4.4s, v30.4h, v12.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s,#16 - ushR v26.4s, v26.4s,#16 + ushR v8.4s, v8.4s, #16 + ushR v26.4s, v26.4s, #16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s,#16 - ushR v6.4s, v6.4s,#16 + ushR v4.4s, v4.4s, #16 + ushR v6.4s, v6.4s, #16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v8.4s,w11 - SQADD v0.4s, v0.4s , v8.4s + MOV w11, w26 + dup v8.4s, w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v26.4s,w11 - sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b - - LD2 { v28.4s, v29.4s}, [x4] - MOV v30.16b, v29.16b - MOV v29.d[0], v28.d[1] + MOV w11, w25 + dup v26.4s, w11 + sQshL v0.4s, v0.4s, v26.4s + mov v26.16b, v28.16b + + LD2 { v28.4s, v29.4s}, [x4] + MOV v30.16b, v29.16b + MOV v29.d[0], v28.d[1] // VZIP.32 Q13, Q0 - ZIP1 v19.4s, v26.4s, v0.4s - ZIP2 v0.4s, v26.4s, v0.4s - MOV v26.16b, v19.16b + ZIP1 v19.4s, v26.4s, v0.4s + ZIP2 v0.4s, v26.4s, v0.4s + MOV v26.16b, v19.16b - ST1 { v26.4s}, [x4] - ADD x4, x4,#16 - ST1 { v0.4s}, [x4] - ADD x4, x4,#16 + ST1 { v26.4s}, [x4] + ADD x4, x4, #16 + ST1 { v0.4s}, [x4] + ADD x4, x4, #16 - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s // VUZP.16 D26, D27 - UZP1 v19.8h, v26.8h, v26.8h + UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] - - movi v1.2s, #0 - //VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] + + movi v1.2s, #0 + //VADDL.S16 Q0, D10, D1 + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h + SADDL v0.4s, v11.4h, v1.4h - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] // VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b - ADD X1, X1, x12 + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b + ADD X1, X1, x12 // VUZP.16 D0, D1 UZP1 v19.8h, v0.8h, v0.8h UZP2 v21.8h, v0.8h, v0.8h - MOV v0.d[0], v19.d[0] - MOV v0.d[1], v21.d[0] + MOV v0.d[0], v19.d[0] + MOV v0.d[1], v21.d[0] // VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v2.d[1], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v2.d[1], v21.d[0] - ushR v8.4s, v8.4s,#16 + ushR v8.4s, v8.4s, #16 - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - ushR v30.4s, v30.4s,#16 + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + ushR v30.4s, v30.4s, #16 - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] - sMLAL v8.4s, v27.4h, v11.4h + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] + sMLAL v8.4s, v27.4h, v11.4h - sMLAL v30.4s, v15.4h, v10.4h + sMLAL v30.4s, v15.4h, v10.4h - LD2 { v10.4s, v11.4s}, [x6] - add X6, x6, x12 - MOV v12.16b, v11.16b - sQshL v4.4s, v4.4s,#2 + LD2 { v10.4s, v11.4s}, [x6] + add X6, x6, x12 + MOV v12.16b, v11.16b + sQshL v4.4s, v4.4s, #2 //VUZP.16 D10, D11 - UZP1 v19.8h, v10.8h, v10.8h + UZP1 v19.8h, v10.8h, v10.8h UZP2 v21.8h, v10.8h, v10.8h - MOV v10.d[0], v19.d[0] - MOV v10.d[1], v21.d[0] + MOV v10.d[0], v19.d[0] + MOV v10.d[1], v21.d[0] - sQshL v6.4s, v6.4s,#2 + sQshL v6.4s, v6.4s, #2 // VUZP.16 D12, D13 UZP1 v19.8h, v12.8h, v12.8h UZP2 v21.8h, v12.8h, v12.8h - MOV v12.d[0], v19.d[0] - MOV v12.d[1], v21.d[0] + MOV v12.d[0], v19.d[0] + MOV v12.d[1], v21.d[0] - SQADD v14.4s, v4.4s , v20.4s + SQADD v14.4s, v4.4s , v20.4s - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - SQADD v6.4s, v6.4s , v20.4s + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] + SQADD v6.4s, v6.4s , v20.4s - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] - sshR v14.4s, v14.4s,#16 + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] + sshR v14.4s, v14.4s, #16 // VUZP.16 D14, D15 - UZP1 v19.8h, v14.8h, v14.8h + UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - sshR v6.4s, v6.4s,#16 + sshR v6.4s, v6.4s, #16 // VUZP.16 D6, D7 UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s + mov v15.8b, v6.8b + sQshL v8.4s, v8.4s, v16.4s - LD2 { v4.4s, v5.4s}, [x8] - ADD x8, x8, #32 - MOV v6.16b, v5.16b + LD2 { v4.4s, v5.4s}, [x8] + ADD x8, x8, #32 + MOV v6.16b, v5.16b - sQshL v30.4s, v30.4s, v16.4s + sQshL v30.4s, v30.4s, v16.4s // VUZP.16 D4, D5 - UZP1 v19.8h, v4.8h, v4.8h + UZP1 v19.8h, v4.8h, v4.8h UZP2 v21.8h, v4.8h, v4.8h - MOV v4.d[0], v19.d[0] - MOV v5.d[0], v21.d[0] + MOV v4.d[0], v19.d[0] + MOV v5.d[0], v21.d[0] - SQSUB v8.4s, v8.4s , v24.4s + SQSUB v8.4s, v8.4s , v24.4s // VUZP.16 D6, D7 - UZP1 v19.8h, v6.8h, v6.8h + UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - SQSUB v22.4s, v30.4s , v22.4s + SQSUB v22.4s, v30.4s , v22.4s - sQshL v30.4s, v8.4s,#2 + sQshL v30.4s, v8.4s, #2 - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2,#16 - sQshL v22.4s, v22.4s,#2 + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2, #16 + sQshL v22.4s, v22.4s, #2 - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s + SQADD v30.4s, v30.4s , v20.4s + SQADD v22.4s, v22.4s , v20.4s - sshR v30.4s, v30.4s,#16 + sshR v30.4s, v30.4s, #16 - // VUZP.16 D30, D31 +// VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] - sshR v22.4s, v22.4s,#16 + sshR v22.4s, v22.4s, #16 // VUZP.16 D22, D23 - UZP1 v19.8h, v22.8h, v22.8h + UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - mov v23.8b, v30.8b + mov v23.8b, v30.8b SUBS x3, x3, #1 BNE CORE_LOOP @@ -1190,842 +1190,842 @@ CORE_LOOP: EPILOGUE: - ST1 {v14.h}[0],[x0] - ADD x0, x0, x9 - uMULL v30.4s, v0.4h, v9.4h + ST1 {v14.h}[0], [x0] + ADD x0, x0, x9 + uMULL v30.4s, v0.4h, v9.4h - ST1 {v22.h}[0],[x0] - ADD x0, x0, x9 - uMULL v28.4s, v2.4h, v8.4h + ST1 {v22.h}[0], [x0] + ADD x0, x0, x9 + uMULL v28.4s, v2.4h, v8.4h - ST1 {v14.h}[1],[x0] - ADD x0, x0, x9 - uMULL v26.4s, v0.4h, v8.4h + ST1 {v14.h}[1], [x0] + ADD x0, x0, x9 + uMULL v26.4s, v0.4h, v8.4h - ST1 {v22.h}[1],[x0] - ADD x0, x0, x9 - uMULL v24.4s, v2.4h, v9.4h + ST1 {v22.h}[1], [x0] + ADD x0, x0, x9 + uMULL v24.4s, v2.4h, v9.4h - ST1 {v14.h}[2],[x0] - ADD x0, x0, x9 - ushR v30.4s, v30.4s,#16 + ST1 {v14.h}[2], [x0] + ADD x0, x0, x9 + ushR v30.4s, v30.4s, #16 - ST1 {v22.h}[2],[x0] - ADD x0, x0, x9 - ushR v28.4s, v28.4s,#16 + ST1 {v22.h}[2], [x0] + ADD x0, x0, x9 + ushR v28.4s, v28.4s, #16 - ST1 {v14.h}[3],[x0] - ADD x0, x0, x9 - sMLAL v30.4s, v1.4h, v9.4h + ST1 {v14.h}[3], [x0] + ADD x0, x0, x9 + sMLAL v30.4s, v1.4h, v9.4h - ST1 {v22.h}[3],[x0] - ADD x0, x0, x9 - sMLAL v28.4s, v3.4h, v8.4h + ST1 {v22.h}[3], [x0] + ADD x0, x0, x9 + sMLAL v28.4s, v3.4h, v8.4h - ST1 {v15.h}[0],[x5] - ADD x5, x5, x10 - ushR v26.4s, v26.4s,#16 + ST1 {v15.h}[0], [x5] + ADD x5, x5, x10 + ushR v26.4s, v26.4s, #16 - ST1 {v23.h}[0],[x5] - ADD x5, x5, x10 - ushR v24.4s, v24.4s,#16 + ST1 {v23.h}[0], [x5] + ADD x5, x5, x10 + ushR v24.4s, v24.4s, #16 - ST1 {v15.h}[1],[x5] - ADD x5, x5, x10 - sMLAL v26.4s, v1.4h, v8.4h + ST1 {v15.h}[1], [x5] + ADD x5, x5, x10 + sMLAL v26.4s, v1.4h, v8.4h - ST1 {v23.h}[1],[x5] - ADD x5, x5, x10 - sMLAL v24.4s, v3.4h, v9.4h + ST1 {v23.h}[1], [x5] + ADD x5, x5, x10 + sMLAL v24.4s, v3.4h, v9.4h - ST1 {v15.h}[2],[x5] - ADD x5, x5, x10 - ADD v30.4s, v30.4s , v28.4s + ST1 {v15.h}[2], [x5] + ADD x5, x5, x10 + ADD v30.4s, v30.4s , v28.4s - ST1 {v23.h}[2],[x5] - ADD x5, x5, x10 - NEG v30.4s, v30.4s + ST1 {v23.h}[2], [x5] + ADD x5, x5, x10 + NEG v30.4s, v30.4s - ST1 {v15.h}[3],[x5] - ADD x5, x5, x10 + ST1 {v15.h}[3], [x5] + ADD x5, x5, x10 - ST1 {v23.h}[3],[x5] - ADD x5, x5, x10 - SUB v28.4s, v24.4s , v26.4s + ST1 {v23.h}[3], [x5] + ADD x5, x5, x10 + SUB v28.4s, v24.4s , v26.4s - uMULL v22.4s, v4.4h, v8.4h - mov v26.16b, v30.16b - mov v24.16b, v28.16b + uMULL v22.4s, v4.4h, v8.4h + mov v26.16b, v30.16b + mov v24.16b, v28.16b - mov v26.16b, v30.16b - mov v24.16b, v28.16b + mov v26.16b, v30.16b + mov v24.16b, v28.16b //VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h + UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s,#16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s, #16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s,#16 - ushR v0.4s, v0.4s,#16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s, #16 + ushR v0.4s, v0.4s, #16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s,#16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s,#16 - sshR v0.4s, v0.4s,#16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s, #16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s, #16 + sshR v0.4s, v0.4s, #16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + ADD v22.4s, v22.4s , v0.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v14.4s,w11 - SQADD v28.4s, v28.4s , v14.4s + MOV w11, w26 + dup v14.4s, w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v0.4s,w11 - sQshL v28.4s, v28.4s, v0.4s + MOV w11, w25 + dup v0.4s, w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] // VUZP.16 D24, D25 - UZP1 v19.8h, v24.8h, v24.8h + UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v4.4s, v30.4h, v12.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s,#16 - ushR v26.4s, v26.4s,#16 + ushR v8.4s, v8.4s, #16 + ushR v26.4s, v26.4s, #16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s,#16 - ushR v6.4s, v6.4s,#16 + ushR v4.4s, v4.4s, #16 + ushR v6.4s, v6.4s, #16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v8.4s,w11 - SQADD v0.4s, v0.4s , v8.4s + MOV w11, w26 + dup v8.4s, w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v26.4s,w11 - sQshL v0.4s, v0.4s, v26.4s + MOV w11, w25 + dup v26.4s, w11 + sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b + mov v26.16b, v28.16b - LD2 { v28.4s, v29.4s}, [x4] - MOV v30.16b, v29.16b - MOV v29.d[0], v28.d[1] + LD2 { v28.4s, v29.4s}, [x4] + MOV v30.16b, v29.16b + MOV v29.d[0], v28.d[1] // VZIP.32 Q13, Q0 - ZIP1 v19.4s, v26.4s, v0.4s - ZIP2 v0.4s, v26.4s, v0.4s - MOV v26.16b, v19.16b + ZIP1 v19.4s, v26.4s, v0.4s + ZIP2 v0.4s, v26.4s, v0.4s + MOV v26.16b, v19.16b - ST1 { v26.4s}, [x4],#16 - ST1 { v0.4s}, [x4],#16 + ST1 { v26.4s}, [x4], #16 + ST1 { v0.4s}, [x4], #16 - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 // VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s // VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - // VUZP.16 D26, D27 +// VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v11.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h - ushR v8.4s, v8.4s,#16 + ushR v8.4s, v8.4s, #16 - ushR v30.4s, v30.4s,#16 + ushR v30.4s, v30.4s, #16 - sMLAL v8.4s, v27.4h, v11.4h + sMLAL v8.4s, v27.4h, v11.4h - sMLAL v30.4s, v15.4h, v10.4h + sMLAL v30.4s, v15.4h, v10.4h - sQshL v4.4s, v4.4s,#2 + sQshL v4.4s, v4.4s, #2 - sQshL v6.4s, v6.4s,#2 + sQshL v6.4s, v6.4s, #2 - SQADD v14.4s, v4.4s , v20.4s + SQADD v14.4s, v4.4s , v20.4s - SQADD v6.4s, v6.4s , v20.4s + SQADD v6.4s, v6.4s , v20.4s - sshR v14.4s, v14.4s,#16 + sshR v14.4s, v14.4s, #16 // VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - sshR v6.4s, v6.4s,#16 + sshR v6.4s, v6.4s, #16 // VUZP.16 D6, D7 UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s + mov v15.8b, v6.8b + sQshL v8.4s, v8.4s, v16.4s - sQshL v30.4s, v30.4s, v16.4s + sQshL v30.4s, v30.4s, v16.4s - SQSUB v8.4s, v8.4s , v24.4s + SQSUB v8.4s, v8.4s , v24.4s - SQSUB v22.4s, v30.4s , v22.4s + SQSUB v22.4s, v30.4s , v22.4s - sQshL v30.4s, v8.4s,#2 + sQshL v30.4s, v8.4s, #2 - sQshL v22.4s, v22.4s,#2 + sQshL v22.4s, v22.4s, #2 - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s + SQADD v30.4s, v30.4s , v20.4s + SQADD v22.4s, v22.4s , v20.4s - sshR v30.4s, v30.4s,#16 + sshR v30.4s, v30.4s, #16 //VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] - sshR v22.4s, v22.4s,#16 + sshR v22.4s, v22.4s, #16 // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] - - mov v23.8b, v30.8b - - - - - ST1 {v14.h}[0],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[0],[x0] - ADD x0, x0, x9 - ST1 {v14.h}[1],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[1],[x0] - ADD x0, x0, x9 - ST1 {v14.h}[2],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[2],[x0] - ADD x0, x0, x9 - ST1 {v14.h}[3],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[3],[x0] - ADD x0, x0, x9 - ST1 {v15.h}[0],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[0],[x5] - ADD x5, x5, x10 - ST1 {v15.h}[1],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[1],[x5] - ADD x5, x5, x10 - ST1 {v15.h}[2],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[2],[x5] - ADD x5, x5, x10 - ST1 {v15.h}[3],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[3],[x5] - ADD x5, x5, x10 + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] + + mov v23.8b, v30.8b + + + + + ST1 {v14.h}[0], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[0], [x0] + ADD x0, x0, x9 + ST1 {v14.h}[1], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[1], [x0] + ADD x0, x0, x9 + ST1 {v14.h}[2], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[2], [x0] + ADD x0, x0, x9 + ST1 {v14.h}[3], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[3], [x0] + ADD x0, x0, x9 + ST1 {v15.h}[0], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[0], [x5] + ADD x5, x5, x10 + ST1 {v15.h}[1], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[1], [x5] + ADD x5, x5, x10 + ST1 {v15.h}[2], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[2], [x5] + ADD x5, x5, x10 + ST1 {v15.h}[3], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[3], [x5] + ADD x5, x5, x10 ARM_EPILOGUE: ARM_LOOP: - LD2 { v0.4s, v1.4s}, [x1] - MOV v2.16b, v1.16b + LD2 { v0.4s, v1.4s}, [x1] + MOV v2.16b, v1.16b //VUZP.16 D0, D1 UZP1 v19.8h, v0.8h, v0.8h UZP2 v21.8h, v0.8h, v0.8h - MOV v0.d[0], v19.d[0] - MOV v0.d[1], v21.d[0] + MOV v0.d[0], v19.d[0] + MOV v0.d[1], v21.d[0] //VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v2.d[1], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v2.d[1], v21.d[0] - rev64 v0.8h, v0.8h - MOV v1.d[0], v0.d[1] - rev64 v2.8h, v2.8h - MOV v3.d[0], v2.d[1] + rev64 v0.8h, v0.8h + MOV v1.d[0], v0.d[1] + rev64 v2.8h, v2.8h + MOV v3.d[0], v2.d[1] - LD2 {v8.4h, v9.4h}, [x2] - ADD x2, x2,#16 + LD2 {v8.4h, v9.4h}, [x2] + ADD x2, x2, #16 - LD2 {v4.2s, v5.2s}, [x8] - ADD x8, x8,#16 - MOV v6.16b, v5.16b - movi v5.2s, #0x00000000 - movi v7.2s, #0x00000000 + LD2 {v4.2s, v5.2s}, [x8] + ADD x8, x8, #16 + MOV v6.16b, v5.16b + movi v5.2s, #0x00000000 + movi v7.2s, #0x00000000 - LD1 {v5.s}[0],[x8],#4 - LD1 {v7.s}[0],[x8] + LD1 {v5.s}[0], [x8], #4 + LD1 {v7.s}[0], [x8] MOV x12, #16 - MOV v4.d[1], v5.d[0] - MOV v6.d[1], v7.d[0] + MOV v4.d[1], v5.d[0] + MOV v6.d[1], v7.d[0] // VUZP.16 D4, D5 UZP1 v19.8h, v4.8h, v4.8h UZP2 v21.8h, v4.8h, v4.8h - MOV v4.d[0], v19.d[0] - MOV v5.d[0], v21.d[0] + MOV v4.d[0], v19.d[0] + MOV v5.d[0], v21.d[0] // VUZP.16 D6, D7 UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] ADD x6, x6, #16 MOV x12, #-4 - LD2 {v11.2s, v12.2s}, [x6] - ADD x6, x6, x12 - MOV v13.16b, v12.16b + LD2 {v11.2s, v12.2s}, [x6] + ADD x6, x6, x12 + MOV v13.16b, v12.16b - movi v10.2s, #0x00000000 + movi v10.2s, #0x00000000 - LD1 {v12.s}[1],[x6] - ADD x6, x6, x12 - LD1 {v10.s}[1],[x6] - ADD x6, x6, x12 - LD1 {v12.s}[0],[x6] - ADD x6, x6, x12 + LD1 {v12.s}[1], [x6] + ADD x6, x6, x12 + LD1 {v10.s}[1], [x6] + ADD x6, x6, x12 + LD1 {v12.s}[0], [x6] + ADD x6, x6, x12 - MOV v10.d[1], v11.d[0] - MOV v12.d[1], v13.d[0] + MOV v10.d[1], v11.d[0] + MOV v12.d[1], v13.d[0] //VUZP.16 D10, D11 UZP1 v19.8h, v10.8h, v10.8h UZP2 v21.8h, v10.8h, v10.8h - MOV v10.d[0], v19.d[0] - MOV v10.d[1], v21.d[0] + MOV v10.d[0], v19.d[0] + MOV v10.d[1], v21.d[0] //VUZP.16 D12, D13 UZP1 v19.8h, v12.8h, v12.8h UZP2 v21.8h, v12.8h, v12.8h - MOV v12.d[0], v19.d[0] - MOV v12.d[1], v21.d[0] + MOV v12.d[0], v19.d[0] + MOV v12.d[1], v21.d[0] - rev64 v10.8h, v10.8h - MOV v11.d[0], v10.d[1] - rev64 v12.8h, v12.8h - MOV v13.d[0], v12.d[1] + rev64 v10.8h, v10.8h + MOV v11.d[0], v10.d[1] + rev64 v12.8h, v12.8h + MOV v13.d[0], v12.d[1] - uMULL v30.4s, v0.4h, v9.4h - uMULL v28.4s, v2.4h, v8.4h - uMULL v26.4s, v0.4h, v8.4h - uMULL v24.4s, v2.4h, v9.4h + uMULL v30.4s, v0.4h, v9.4h + uMULL v28.4s, v2.4h, v8.4h + uMULL v26.4s, v0.4h, v8.4h + uMULL v24.4s, v2.4h, v9.4h - ushR v30.4s, v30.4s,#16 - ushR v28.4s, v28.4s,#16 + ushR v30.4s, v30.4s, #16 + ushR v28.4s, v28.4s, #16 - sMLAL v30.4s, v1.4h, v9.4h - sMLAL v28.4s, v3.4h, v8.4h + sMLAL v30.4s, v1.4h, v9.4h + sMLAL v28.4s, v3.4h, v8.4h - ushR v26.4s, v26.4s,#16 - ushR v24.4s, v24.4s,#16 + ushR v26.4s, v26.4s, #16 + ushR v24.4s, v24.4s, #16 - sMLAL v26.4s, v1.4h, v8.4h - sMLAL v24.4s, v3.4h, v9.4h + sMLAL v26.4s, v1.4h, v8.4h + sMLAL v24.4s, v3.4h, v9.4h - ADD v30.4s, v30.4s , v28.4s - NEG v30.4s, v30.4s + ADD v30.4s, v30.4s , v28.4s + NEG v30.4s, v30.4s - uMULL v22.4s, v4.4h, v8.4h + uMULL v22.4s, v4.4h, v8.4h - SUB v28.4s, v24.4s , v26.4s + SUB v28.4s, v24.4s , v26.4s - mov v26.16b, v30.16b - mov v24.16b, v28.16b + mov v26.16b, v30.16b + mov v24.16b, v28.16b // VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] //VUZP.16 D24, D25 UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v2.4s, v24.4h, v18.4h - uMULL v0.4s, v26.4h, v18.4h + uMULL v2.4s, v24.4h, v18.4h + uMULL v0.4s, v26.4h, v18.4h - ushR v22.4s, v22.4s,#16 - sMLAL v22.4s, v5.4h, v8.4h + ushR v22.4s, v22.4s, #16 + sMLAL v22.4s, v5.4h, v8.4h - ushR v2.4s, v2.4s,#16 - ushR v0.4s, v0.4s,#16 - sMLAL v2.4s, v25.4h, v18.4h - sMLAL v0.4s, v27.4h, v18.4h + ushR v2.4s, v2.4s, #16 + ushR v0.4s, v0.4s, #16 + sMLAL v2.4s, v25.4h, v18.4h + sMLAL v0.4s, v27.4h, v18.4h - uMULL v24.4s, v4.4h, v9.4h - uMULL v26.4s, v6.4h, v8.4h + uMULL v24.4s, v4.4h, v9.4h + uMULL v26.4s, v6.4h, v8.4h - NEG v2.4s, v2.4s - ADD v28.4s, v28.4s , v0.4s - ADD v30.4s, v30.4s , v2.4s + NEG v2.4s, v2.4s + ADD v28.4s, v28.4s , v0.4s + ADD v30.4s, v30.4s , v2.4s - uMULL v0.4s, v6.4h, v9.4h - sshR v24.4s, v24.4s,#16 - sMLAL v24.4s, v5.4h, v9.4h - sshR v26.4s, v26.4s,#16 - sshR v0.4s, v0.4s,#16 - sMLAL v26.4s, v7.4h, v8.4h - sMLAL v0.4s, v7.4h, v9.4h + uMULL v0.4s, v6.4h, v9.4h + sshR v24.4s, v24.4s, #16 + sMLAL v24.4s, v5.4h, v9.4h + sshR v26.4s, v26.4s, #16 + sshR v0.4s, v0.4s, #16 + sMLAL v26.4s, v7.4h, v8.4h + sMLAL v0.4s, v7.4h, v9.4h - ADD v22.4s, v22.4s , v0.4s - NEG v22.4s, v22.4s - SUB v24.4s, v26.4s , v24.4s + ADD v22.4s, v22.4s , v0.4s + NEG v22.4s, v22.4s + SUB v24.4s, v26.4s , v24.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v14.4s,w11 - SQADD v28.4s, v28.4s , v14.4s + MOV w11, w26 + dup v14.4s, w11 + SQADD v28.4s, v28.4s , v14.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v0.4s,w11 - sQshL v28.4s, v28.4s, v0.4s + MOV w11, w25 + dup v0.4s, w11 + sQshL v28.4s, v28.4s, v0.4s - mov v0.16b, v22.16b - mov v14.16b, v24.16b + mov v0.16b, v22.16b + mov v14.16b, v24.16b // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] - // VUZP.16 D24, D25 +// VUZP.16 D24, D25 UZP1 v19.8h, v24.8h, v24.8h UZP2 v21.8h, v24.8h, v24.8h - MOV v24.d[0], v19.d[0] - MOV v25.d[0], v21.d[0] + MOV v24.d[0], v19.d[0] + MOV v25.d[0], v21.d[0] - uMULL v8.4s, v24.4h, v18.4h - uMULL v26.4s, v22.4h, v18.4h + uMULL v8.4s, v24.4h, v18.4h + uMULL v26.4s, v22.4h, v18.4h - NEG v2.4s, v30.4s + NEG v2.4s, v30.4s // VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] // VUZP.16 D2, D3 UZP1 v19.8h, v2.8h, v2.8h UZP2 v21.8h, v2.8h, v2.8h - MOV v2.d[0], v19.d[0] - MOV v3.d[0], v21.d[0] + MOV v2.d[0], v19.d[0] + MOV v3.d[0], v21.d[0] - uMULL v4.4s, v30.4h, v12.4h - uMULL v6.4s, v2.4h, v13.4h + uMULL v4.4s, v30.4h, v12.4h + uMULL v6.4s, v2.4h, v13.4h - ushR v8.4s, v8.4s,#16 - ushR v26.4s, v26.4s,#16 + ushR v8.4s, v8.4s, #16 + ushR v26.4s, v26.4s, #16 - sMLAL v8.4s, v25.4h, v18.4h - sMLAL v26.4s, v23.4h, v18.4h + sMLAL v8.4s, v25.4h, v18.4h + sMLAL v26.4s, v23.4h, v18.4h - ushR v4.4s, v4.4s,#16 - ushR v6.4s, v6.4s,#16 + ushR v4.4s, v4.4s, #16 + ushR v6.4s, v6.4s, #16 - MOV v19.d[0], v30.d[1] + MOV v19.d[0], v30.d[1] - sMLAL v4.4s, v19.4h, v12.4h - sMLAL v6.4s, v3.4h, v13.4h + sMLAL v4.4s, v19.4h, v12.4h + sMLAL v6.4s, v3.4h, v13.4h - NEG v8.4s, v8.4s - ADD v14.4s, v14.4s , v26.4s - ADD v0.4s, v0.4s , v8.4s + NEG v8.4s, v8.4s + ADD v14.4s, v14.4s , v26.4s + ADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #120] //sxtw x11,w11 - MOV w11, w26 - dup v8.4s,w11 - SQADD v0.4s, v0.4s , v8.4s + MOV w11, w26 + dup v8.4s, w11 + SQADD v0.4s, v0.4s , v8.4s //LDR w11, [sp, #116] //sxtw x11,w11 - MOV w11, w25 - dup v26.4s,w11 - sQshL v0.4s, v0.4s, v26.4s + MOV w11, w25 + dup v26.4s, w11 + sQshL v0.4s, v0.4s, v26.4s - mov v26.16b, v28.16b + mov v26.16b, v28.16b MOV x6, x4 - LD1 {v28.2s, v29.2s}, [x4],#16 - movi v19.2s, #0x00000000 - LD1 {v30.s}[0],[x4],#4 - LD1 {v30.s}[1],[x4],#4 - LD1 {v19.s}[0],[x4],#4 + LD1 {v28.2s, v29.2s}, [x4], #16 + movi v19.2s, #0x00000000 + LD1 {v30.s}[0], [x4], #4 + LD1 {v30.s}[1], [x4], #4 + LD1 {v19.s}[0], [x4], #4 - MOV v28.d[1], v29.d[0] - MOV v30.d[1], v19.d[0] + MOV v28.d[1], v29.d[0] + MOV v30.d[1], v19.d[0] //VUZP.32 Q14, Q15 UZP1 v19.4s, v28.4s, v30.4s UZP2 v30.4s, v28.4s, v30.4s - MOV v28.16b, v19.16b - MOV v29.d[0], v28.d[1] - - ST1 {v26.s}[0],[x6],#4 - ST1 {v0.s}[0],[x6],#4 - ST1 {v26.s}[1],[x6],#4 - ST1 {v0.s}[1],[x6],#4 - ST1 {v26.s}[2],[x6],#4 - ST1 {v0.s}[2],[x6],#4 - ST1 {v26.s}[3],[x6],#4 - - movi v1.2s, #0 + MOV v28.16b, v19.16b + MOV v29.d[0], v28.d[1] + + ST1 {v26.s}[0], [x6], #4 + ST1 {v0.s}[0], [x6], #4 + ST1 {v26.s}[1], [x6], #4 + ST1 {v0.s}[1], [x6], #4 + ST1 {v26.s}[2], [x6], #4 + ST1 {v0.s}[2], [x6], #4 + ST1 {v26.s}[3], [x6], #4 + + movi v1.2s, #0 //VADDL.S16 Q0, D13, D1 - SADDL v0.4s, v13.4h, v1.4h - MOV v1.d[0], v0.d[1] - - sMULL v26.2d, v28.2s, v0.2s - Sqxtn v8.2s, v26.2d - sMULL v26.2d, v29.2s, v1.2s - Sqxtn v9.2s, v26.2d - MOV v8.d[1], v9.d[0] - movi v1.2s, #0 + SADDL v0.4s, v13.4h, v1.4h + MOV v1.d[0], v0.d[1] + + sMULL v26.2d, v28.2s, v0.2s + Sqxtn v8.2s, v26.2d + sMULL v26.2d, v29.2s, v1.2s + Sqxtn v9.2s, v26.2d + MOV v8.d[1], v9.d[0] + movi v1.2s, #0 //VADDL.S16 Q0, D12, D1 - SADDL v0.4s, v12.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v12.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v24.2d, v28.2s, v0.2s - Sqxtn v26.2s, v24.2d - sMULL v24.2d, v29.2s, v1.2s - Sqxtn v27.2s, v24.2d - MOV v26.d[1], v27.d[0] + sMULL v24.2d, v28.2s, v0.2s + Sqxtn v26.2s, v24.2d + sMULL v24.2d, v29.2s, v1.2s + Sqxtn v27.2s, v24.2d + MOV v26.d[1], v27.d[0] - sQshL v4.4s, v4.4s, v16.4s - sQshL v6.4s, v6.4s, v16.4s + sQshL v4.4s, v4.4s, v16.4s + sQshL v6.4s, v6.4s, v16.4s - SQSUB v4.4s, v4.4s , v8.4s - SQSUB v6.4s, v6.4s , v26.4s + SQSUB v4.4s, v4.4s , v8.4s + SQSUB v6.4s, v6.4s , v26.4s - NEG v26.4s, v14.4s + NEG v26.4s, v14.4s //VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] // VUZP.16 D26, D27 UZP1 v19.8h, v26.8h, v26.8h UZP2 v21.8h, v26.8h, v26.8h - MOV v26.d[0], v19.d[0] - MOV v27.d[0], v21.d[0] + MOV v26.d[0], v19.d[0] + MOV v27.d[0], v21.d[0] - movi v1.2s, #0 + movi v1.2s, #0 //VADDL.S16 Q0, D10, D1 - SADDL v0.4s, v10.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v10.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v22.2d, v30.2s, v0.2s - Sqxtn v24.2s, v22.2d - sMULL2 v22.2d, v30.4s, v0.4s - Sqxtn v25.2s, v22.2d - MOV v24.d[1], v25.d[0] + sMULL v22.2d, v30.2s, v0.2s + Sqxtn v24.2s, v22.2d + sMULL2 v22.2d, v30.4s, v0.4s + Sqxtn v25.2s, v22.2d + MOV v24.d[1], v25.d[0] - movi v1.2s, #0 + movi v1.2s, #0 // VADDL.S16 Q0, D11, D1 - SADDL v0.4s, v11.4h, v1.4h - MOV v1.d[0], v0.d[1] + SADDL v0.4s, v11.4h, v1.4h + MOV v1.d[0], v0.d[1] - sMULL v8.2d, v30.2s, v0.2s - Sqxtn v22.2s, v8.2d - sMULL2 v8.2d, v30.4s, v0.4s - Sqxtn v23.2s, v8.2d - MOV v22.d[1], v23.d[0] + sMULL v8.2d, v30.2s, v0.2s + Sqxtn v22.2s, v8.2d + sMULL2 v8.2d, v30.4s, v0.4s + Sqxtn v23.2s, v8.2d + MOV v22.d[1], v23.d[0] - uMULL v8.4s, v26.4h, v11.4h - uMULL v30.4s, v14.4h, v10.4h + uMULL v8.4s, v26.4h, v11.4h + uMULL v30.4s, v14.4h, v10.4h - ushR v8.4s, v8.4s,#16 + ushR v8.4s, v8.4s, #16 - ushR v30.4s, v30.4s,#16 + ushR v30.4s, v30.4s, #16 - sMLAL v8.4s, v27.4h, v11.4h + sMLAL v8.4s, v27.4h, v11.4h - sMLAL v30.4s, v15.4h, v10.4h + sMLAL v30.4s, v15.4h, v10.4h - sQshL v4.4s, v4.4s,#2 + sQshL v4.4s, v4.4s, #2 - sQshL v6.4s, v6.4s,#2 + sQshL v6.4s, v6.4s, #2 - SQADD v14.4s, v4.4s , v20.4s + SQADD v14.4s, v4.4s , v20.4s - SQADD v6.4s, v6.4s , v20.4s + SQADD v6.4s, v6.4s , v20.4s - sshR v14.4s, v14.4s,#16 + sshR v14.4s, v14.4s, #16 // VUZP.16 D14, D15 UZP1 v19.8h, v14.8h, v14.8h UZP2 v21.8h, v14.8h, v14.8h - MOV v14.d[0], v19.d[0] - MOV v15.d[0], v21.d[0] + MOV v14.d[0], v19.d[0] + MOV v15.d[0], v21.d[0] - sshR v6.4s, v6.4s,#16 + sshR v6.4s, v6.4s, #16 //VUZP.16 D6, D7 UZP1 v19.8h, v6.8h, v6.8h UZP2 v21.8h, v6.8h, v6.8h - MOV v6.d[0], v19.d[0] - MOV v7.d[0], v21.d[0] + MOV v6.d[0], v19.d[0] + MOV v7.d[0], v21.d[0] - mov v15.8b, v6.8b - sQshL v8.4s, v8.4s, v16.4s + mov v15.8b, v6.8b + sQshL v8.4s, v8.4s, v16.4s - sQshL v30.4s, v30.4s, v16.4s + sQshL v30.4s, v30.4s, v16.4s - SQSUB v8.4s, v8.4s , v24.4s + SQSUB v8.4s, v8.4s , v24.4s - SQSUB v22.4s, v30.4s , v22.4s + SQSUB v22.4s, v30.4s , v22.4s - sQshL v30.4s, v8.4s,#2 + sQshL v30.4s, v8.4s, #2 - sQshL v22.4s, v22.4s,#2 + sQshL v22.4s, v22.4s, #2 - SQADD v30.4s, v30.4s , v20.4s - SQADD v22.4s, v22.4s , v20.4s + SQADD v30.4s, v30.4s , v20.4s + SQADD v22.4s, v22.4s , v20.4s - sshR v30.4s, v30.4s,#16 + sshR v30.4s, v30.4s, #16 // VUZP.16 D30, D31 UZP1 v19.8h, v30.8h, v30.8h UZP2 v21.8h, v30.8h, v30.8h - MOV v30.d[0], v19.d[0] - MOV v30.d[1], v21.d[0] + MOV v30.d[0], v19.d[0] + MOV v30.d[1], v21.d[0] - sshR v22.4s, v22.4s,#16 + sshR v22.4s, v22.4s, #16 // VUZP.16 D22, D23 UZP1 v19.8h, v22.8h, v22.8h UZP2 v21.8h, v22.8h, v22.8h - MOV v22.d[0], v19.d[0] - MOV v23.d[0], v21.d[0] - - mov v23.8b, v30.8b - - - - - ST1 {v14.h}[0],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[0],[x0] - ADD x0, x0, x9 - ST1 {v14.h}[1],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[1],[x0] - ADD x0, x0, x9 - ST1 {v14.h}[2],[x0] - ADD x0, x0, x9 - ST1 {v22.h}[2],[x0] - ADD x0, x0, x9 - ST1 {v14.h}[3],[x0] - ADD x0, x0, x9 - - ST1 {v15.h}[0],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[0],[x5] - ADD x5, x5, x10 - ST1 {v15.h}[1],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[1],[x5] - ADD x5, x5, x10 - ST1 {v15.h}[2],[x5] - ADD x5, x5, x10 - ST1 {v23.h}[2],[x5] - ADD x5, x5, x10 - ST1 {v15.h}[3],[x5] - ADD x5, x5, x10 - - // VPOP {d8 - d15} + MOV v22.d[0], v19.d[0] + MOV v23.d[0], v21.d[0] + + mov v23.8b, v30.8b + + + + + ST1 {v14.h}[0], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[0], [x0] + ADD x0, x0, x9 + ST1 {v14.h}[1], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[1], [x0] + ADD x0, x0, x9 + ST1 {v14.h}[2], [x0] + ADD x0, x0, x9 + ST1 {v22.h}[2], [x0] + ADD x0, x0, x9 + ST1 {v14.h}[3], [x0] + ADD x0, x0, x9 + + ST1 {v15.h}[0], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[0], [x5] + ADD x5, x5, x10 + ST1 {v15.h}[1], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[1], [x5] + ADD x5, x5, x10 + ST1 {v15.h}[2], [x5] + ADD x5, x5, x10 + ST1 {v23.h}[2], [x5] + ADD x5, x5, x10 + ST1 {v15.h}[3], [x5] + ADD x5, x5, x10 + + // VPOP {d8 - d15} // LDMFD sp!, {x4-x12} //ldp x19, x20,[sp],#16 pop_v_regs diff --git a/decoder/armv8/ixheaacd_qmf_dec_armv8.c b/decoder/armv8/ixheaacd_qmf_dec_armv8.c index ac1a300..a4b89c5 100644 --- a/decoder/armv8/ixheaacd_qmf_dec_armv8.c +++ b/decoder/armv8/ixheaacd_qmf_dec_armv8.c @@ -472,8 +472,8 @@ VOID ixheaacd_cplx_anal_qmffilt(const WORD16 *time_sample_buf, } VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, - ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { WORD32 L = syn_qmf->no_channels; const WORD32 M = (L >> 1); WORD32 *dct_in = qmf_real; @@ -490,9 +490,9 @@ VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, filter_states[3 * M] = 0; } -VOID ixheaacd_inv_emodulation( - WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { +VOID ixheaacd_inv_emodulation(WORD32 *qmf_real, + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { ixheaacd_cos_sin_mod(qmf_real, syn_qmf, (WORD16 *)qmf_dec_tables_ptr->w1024, (WORD32 *)qmf_dec_tables_ptr->dig_rev_table2_128); } @@ -1103,7 +1103,6 @@ VOID ixheaacd_esbr_cos_sin_mod(WORD32 *subband, } } - VOID ixheaacd_esbr_fwd_modulation( const WORD32 *time_sample_buf, WORD32 *real_subband, WORD32 *imag_subband, ia_sbr_qmf_filter_bank_struct *qmf_bank, @@ -1344,6 +1343,3 @@ VOID ixheaacd_radix4bfly(const WORD16 *w, WORD32 *x, WORD32 index1, w_ptr = w_ptr - fft_jmp; } } - - - diff --git a/decoder/armv8/ixheaacd_shiftrountine_with_round.s b/decoder/armv8/ixheaacd_shiftrountine_with_round.s index 95b480c..e6a160d 100644 --- a/decoder/armv8/ixheaacd_shiftrountine_with_round.s +++ b/decoder/armv8/ixheaacd_shiftrountine_with_round.s @@ -48,10 +48,10 @@ S_WITH_R_L5: ADD w7, w10, w14 //qmfImag[j] = add32(i1, x1) SUB w4, w10, w14 //*qmfReal++ = sub32(i1, x1) - MOV v1.s[0], W4 //QADD x4, x4, x9 - MOV v1.s[1], W5 //QADD x4, x4, x9 - MOV v1.s[2], W6 //QADD x4, x4, x9 - MOV v1.s[3], W7 //QADD x4, x4, x9 + MOV v1.s[0], W4 //QADD x4, x4, x9 + MOV v1.s[1], W5 //QADD x4, x4, x9 + MOV v1.s[2], W6 //QADD x4, x4, x9 + MOV v1.s[3], W7 //QADD x4, x4, x9 lsl w14, w3, #1 SQSHL v1.4s, v1.4s, v3.4s diff --git a/decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s b/decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s index cdbd822..ef5313b 100644 --- a/decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s +++ b/decoder/armv8/ixheaacd_shiftrountine_with_round_eld.s @@ -54,10 +54,10 @@ S_WITH_R_L5: - MOV v1.s[0], W4 //QADD x4, x4, x9 - MOV v1.s[1], W5 //QADD x4, x4, x9 - MOV v1.s[2], W6 //QADD x4, x4, x9 - MOV v1.s[3], W7 //QADD x4, x4, x9 + MOV v1.s[0], W4 //QADD x4, x4, x9 + MOV v1.s[1], W5 //QADD x4, x4, x9 + MOV v1.s[2], W6 //QADD x4, x4, x9 + MOV v1.s[3], W7 //QADD x4, x4, x9 lsl w14, w3, #1 SQSHL v1.4s, v1.4s, v3.4s diff --git a/decoder/drc_src/impd_apicmd_standards.h b/decoder/drc_src/impd_apicmd_standards.h index 7d511f2..3ebe762 100644 --- a/decoder/drc_src/impd_apicmd_standards.h +++ b/decoder/drc_src/impd_apicmd_standards.h @@ -24,86 +24,84 @@ /*****************************************************************************/ /* Ittiam standard API commands */ /*****************************************************************************/ -#define IA_API_CMD_GET_LIB_ID_STRINGS 0x0001 - -#define IA_API_CMD_GET_API_SIZE 0x0002 -#define IA_API_CMD_INIT 0x0003 - -#define IA_API_CMD_SET_CONFIG_PARAM 0x0004 -#define IA_API_CMD_GET_CONFIG_PARAM 0x0005 - -#define IA_API_CMD_GET_MEMTABS_SIZE 0x0006 -#define IA_API_CMD_SET_MEMTABS_PTR 0x0007 -#define IA_API_CMD_GET_N_MEMTABS 0x0008 - -#define IA_API_CMD_EXECUTE 0x0009 - -#define IA_API_CMD_PUT_INPUT_QUERY 0x000A -#define IA_API_CMD_GET_CURIDX_INPUT_BUF 0x000B -#define IA_API_CMD_SET_INPUT_BYTES 0x000C -#define IA_API_CMD_GET_OUTPUT_BYTES 0x000D -#define IA_API_CMD_INPUT_OVER 0x000E - - -#define IA_API_CMD_RESET 0x0010 - -#define IA_API_CMD_GET_MEM_INFO_SIZE 0x0011 -#define IA_API_CMD_GET_MEM_INFO_ALIGNMENT 0x0012 -#define IA_API_CMD_GET_MEM_INFO_TYPE 0x0013 -#define IA_API_CMD_GET_MEM_INFO_PLACEMENT 0x0014 -#define IA_API_CMD_GET_MEM_INFO_PRIORITY 0x0015 -#define IA_API_CMD_SET_MEM_PTR 0x0016 -#define IA_API_CMD_SET_MEM_INFO_SIZE 0x0017 -#define IA_API_CMD_SET_MEM_PLACEMENT 0x0018 - -#define IA_API_CMD_GET_N_TABLES 0x0019 -#define IA_API_CMD_GET_TABLE_INFO_SIZE 0x001A -#define IA_API_CMD_GET_TABLE_INFO_ALIGNMENT 0x001B -#define IA_API_CMD_GET_TABLE_INFO_PRIORITY 0x001C -#define IA_API_CMD_SET_TABLE_PTR 0x001D -#define IA_API_CMD_GET_TABLE_PTR 0x001E - - -#define IA_API_CMD_INPUT_OVER_BS 0x0021 -#define IA_API_CMD_INPUT_OVER_IC_BS 0x0022 -#define IA_API_CMD_INPUT_OVER_IG_BS 0x0023 -#define IA_API_CMD_INPUT_OVER_IL_BS 0x0024 -#define IA_API_CMD_INPUT_OVER_IN_BS 0x0025 - -#define IA_API_CMD_SET_INPUT_BYTES_BS 0x0026 -#define IA_API_CMD_SET_INPUT_BYTES_IC_BS 0x0027 -#define IA_API_CMD_SET_INPUT_BYTES_IG_BS 0x0028 -#define IA_API_CMD_SET_INPUT_BYTES_IL_BS 0x0029 -#define IA_API_CMD_SET_INPUT_BYTES_IN_BS 0x002A +#define IA_API_CMD_GET_LIB_ID_STRINGS 0x0001 + +#define IA_API_CMD_GET_API_SIZE 0x0002 +#define IA_API_CMD_INIT 0x0003 + +#define IA_API_CMD_SET_CONFIG_PARAM 0x0004 +#define IA_API_CMD_GET_CONFIG_PARAM 0x0005 + +#define IA_API_CMD_GET_MEMTABS_SIZE 0x0006 +#define IA_API_CMD_SET_MEMTABS_PTR 0x0007 +#define IA_API_CMD_GET_N_MEMTABS 0x0008 + +#define IA_API_CMD_EXECUTE 0x0009 + +#define IA_API_CMD_PUT_INPUT_QUERY 0x000A +#define IA_API_CMD_GET_CURIDX_INPUT_BUF 0x000B +#define IA_API_CMD_SET_INPUT_BYTES 0x000C +#define IA_API_CMD_GET_OUTPUT_BYTES 0x000D +#define IA_API_CMD_INPUT_OVER 0x000E + +#define IA_API_CMD_RESET 0x0010 + +#define IA_API_CMD_GET_MEM_INFO_SIZE 0x0011 +#define IA_API_CMD_GET_MEM_INFO_ALIGNMENT 0x0012 +#define IA_API_CMD_GET_MEM_INFO_TYPE 0x0013 +#define IA_API_CMD_GET_MEM_INFO_PLACEMENT 0x0014 +#define IA_API_CMD_GET_MEM_INFO_PRIORITY 0x0015 +#define IA_API_CMD_SET_MEM_PTR 0x0016 +#define IA_API_CMD_SET_MEM_INFO_SIZE 0x0017 +#define IA_API_CMD_SET_MEM_PLACEMENT 0x0018 + +#define IA_API_CMD_GET_N_TABLES 0x0019 +#define IA_API_CMD_GET_TABLE_INFO_SIZE 0x001A +#define IA_API_CMD_GET_TABLE_INFO_ALIGNMENT 0x001B +#define IA_API_CMD_GET_TABLE_INFO_PRIORITY 0x001C +#define IA_API_CMD_SET_TABLE_PTR 0x001D +#define IA_API_CMD_GET_TABLE_PTR 0x001E + +#define IA_API_CMD_INPUT_OVER_BS 0x0021 +#define IA_API_CMD_INPUT_OVER_IC_BS 0x0022 +#define IA_API_CMD_INPUT_OVER_IG_BS 0x0023 +#define IA_API_CMD_INPUT_OVER_IL_BS 0x0024 +#define IA_API_CMD_INPUT_OVER_IN_BS 0x0025 + +#define IA_API_CMD_SET_INPUT_BYTES_BS 0x0026 +#define IA_API_CMD_SET_INPUT_BYTES_IC_BS 0x0027 +#define IA_API_CMD_SET_INPUT_BYTES_IG_BS 0x0028 +#define IA_API_CMD_SET_INPUT_BYTES_IL_BS 0x0029 +#define IA_API_CMD_SET_INPUT_BYTES_IN_BS 0x002A /*****************************************************************************/ /* Ittiam standard API command indices */ /*****************************************************************************/ /* IA_API_CMD_GET_LIB_ID_STRINGS indices */ -#define IA_CMD_TYPE_LIB_NAME 0x0100 -#define IA_CMD_TYPE_LIB_VERSION 0x0200 -#define IA_CMD_TYPE_API_VERSION 0x0300 +#define IA_CMD_TYPE_LIB_NAME 0x0100 +#define IA_CMD_TYPE_LIB_VERSION 0x0200 +#define IA_CMD_TYPE_API_VERSION 0x0300 /* IA_API_CMD_INIT indices */ -#define IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS 0x0100 +#define IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS 0x0100 #define IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS 0x0200 -#define IA_CMD_TYPE_INIT_PROCESS 0x0300 -#define IA_CMD_TYPE_INIT_DONE_QUERY 0x0400 - -#define IA_CMD_TYPE_INIT_CPY_BSF_BUFF 0x0201 -#define IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF 0x0202 -#define IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF 0x0203 -#define IA_CMD_TYPE_INIT_CPY_IG_BSF_BUFF 0x0204 -#define IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF 0x0205 - -#define IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY 0x0206 -#define IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY 0x0207 -#define IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY 0x0208 -#define IA_CMD_TYPE_INIT_CPY_IG_BSF_BUFF_OVER_QUERY 0x0209 -#define IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY 0x020A -#define IA_CMD_TYPE_INIT_SET_BUFF_PTR 0x020B +#define IA_CMD_TYPE_INIT_PROCESS 0x0300 +#define IA_CMD_TYPE_INIT_DONE_QUERY 0x0400 + +#define IA_CMD_TYPE_INIT_CPY_BSF_BUFF 0x0201 +#define IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF 0x0202 +#define IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF 0x0203 +#define IA_CMD_TYPE_INIT_CPY_IG_BSF_BUFF 0x0204 +#define IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF 0x0205 + +#define IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY 0x0206 +#define IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY 0x0207 +#define IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY 0x0208 +#define IA_CMD_TYPE_INIT_CPY_IG_BSF_BUFF_OVER_QUERY 0x0209 +#define IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY 0x020A +#define IA_CMD_TYPE_INIT_SET_BUFF_PTR 0x020B /* IA_API_CMD_EXECUTE indices */ -#define IA_CMD_TYPE_DO_EXECUTE 0x0100 -#define IA_CMD_TYPE_DONE_QUERY 0x0200 +#define IA_CMD_TYPE_DO_EXECUTE 0x0100 +#define IA_CMD_TYPE_DONE_QUERY 0x0200 #endif diff --git a/decoder/drc_src/impd_drc_api.c b/decoder/drc_src/impd_drc_api.c index e16cb58..0b40d94 100644 --- a/decoder/drc_src/impd_drc_api.c +++ b/decoder/drc_src/impd_drc_api.c @@ -25,7 +25,6 @@ #include "impd_apicmd_standards.h" #include "impd_memory_standards.h" - #include "impd_drc_bitbuffer.h" #include "impd_drc_extr_delta_coded_info.h" #include "impd_drc_common.h" @@ -52,15 +51,12 @@ WORD32 impd_init_process_audio_main_qmf(ia_drc_api_struct *p_obj_drc); WORD32 impd_init_process_audio_main_stft(ia_drc_api_struct *p_obj_drc); WORD32 impd_init_process_audio_main_td_qmf(ia_drc_api_struct *p_obj_drc); -IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, - WORD32 i_cmd, WORD32 i_idx, pVOID pv_value); +IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, + WORD32 i_idx, pVOID pv_value); 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); - +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); @@ -68,648 +64,535 @@ IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc); IA_ERRORCODE impd_drc_set_struct_pointer(ia_drc_api_struct *p_obj_drc); IA_ERRORCODE impd_process_time_domain(ia_drc_api_struct *p_obj_drc); -#define NUM_DRC_TABLES 4 -#define SCRATCH_MEM_SIZE 1024*256*64 - +#define NUM_DRC_TABLES 4 +#define SCRATCH_MEM_SIZE 1024 * 256 * 64 +IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, WORD32 i_cmd, WORD32 i_idx, + pVOID pv_value) { + ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj; + IA_ERRORCODE error_code = IA_NO_ERROR; + LOOPIDX i; -IA_ERRORCODE ia_drc_dec_api(pVOID p_ia_drc_dec_obj, - WORD32 i_cmd, - WORD32 i_idx, - pVOID pv_value) -{ - ia_drc_api_struct *p_obj_drc = p_ia_drc_dec_obj; - IA_ERRORCODE error_code=IA_NO_ERROR; - LOOPIDX i; + pUWORD32 pui_value = pv_value; + pUWORD32 pus_value = pv_value; + pWORD8 pb_value = pv_value; + SIZE_T *ps_value = pv_value; - pUWORD32 pui_value = pv_value; - pUWORD32 pus_value = pv_value; - pWORD8 pb_value = pv_value; - SIZE_T *ps_value = pv_value; - - switch(i_cmd) - { + switch (i_cmd) { case IA_API_CMD_GET_MEM_INFO_SIZE: case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: case IA_API_CMD_GET_MEM_INFO_TYPE: case IA_API_CMD_GET_MEM_INFO_PLACEMENT: case IA_API_CMD_GET_MEM_INFO_PRIORITY: case IA_API_CMD_SET_MEM_PTR: - case IA_API_CMD_SET_MEM_PLACEMENT: - { - return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value); - } - }; - - switch(i_cmd) - { - case IA_API_CMD_GET_LIB_ID_STRINGS: - { - switch(i_idx) - { - case IA_CMD_TYPE_LIB_NAME: - { - WORD8 lib_name[] = LIBNAME; - for(i = 0; i < IA_API_STR_LEN && lib_name[i -1] != 0; i++) - { - pb_value[i] = lib_name[i]; - } - break; - } - case IA_CMD_TYPE_LIB_VERSION: - { - break; - } - - case IA_CMD_TYPE_API_VERSION: - { - - } - default: - { - return -1; - } - }; - break; - } - case IA_API_CMD_GET_API_SIZE: - { - *pui_value = sizeof(ia_drc_api_struct)+(sizeof(ia_drc_state_struct)+8)+8080*1024; - - break; - } - 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->pp_mem[IA_DRC_PERSIST_IDX]; - impd_drc_set_struct_pointer(p_obj_drc); - - break; - } - case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: - { - impd_drc_set_default_config(p_obj_drc); - break; - } - case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: - { - p_obj_drc->p_state=(ia_drc_state_struct *)((SIZE_T)p_obj_drc+8000*1024); - p_obj_drc->p_mem_info=(ia_mem_info_struct *)((SIZE_T)p_obj_drc+8002*1024); - p_obj_drc->pp_mem=(pVOID)((SIZE_T)p_obj_drc+8006*1024); - impd_drc_fill_mem_tables(p_obj_drc); - break; - } - case IA_CMD_TYPE_INIT_PROCESS: - { - IA_ERRORCODE Error=0; - - if(p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) - { - return(-1); - } - - - Error = impd_drc_init(p_obj_drc); - if(Error) - return Error; - p_obj_drc->p_state->ui_init_done = 1; - return Error; - break; - } - case IA_CMD_TYPE_INIT_DONE_QUERY: - { - - if(p_obj_drc->p_state->ui_init_done == 1) - { - *pui_value = 1; - } - else - { - *pui_value = 0; - } - break; - } - - case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: - { - *pui_value = p_obj_drc->str_bit_handler.cpy_over; - break; - } - case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: - { - *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic; - break; - } - - case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: - { - *pui_value = p_obj_drc->str_bit_handler.cpy_over_il; - break; - } - case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: - { - *pui_value = p_obj_drc->str_bit_handler.cpy_over_in; - break; - } - 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->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; - break; - - } - case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: - { - memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config+p_obj_drc->str_bit_handler.num_bytes_bs_drc_config, p_obj_drc->pp_mem[2],p_obj_drc->str_bit_handler.num_byts_cur_ic); - p_obj_drc->str_bit_handler.num_bytes_bs_drc_config=p_obj_drc->str_bit_handler.num_bytes_bs_drc_config+p_obj_drc->str_bit_handler.num_byts_cur_ic; - break; - - } - case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: - { - memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info+p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info, p_obj_drc->pp_mem[2],p_obj_drc->str_bit_handler.num_byts_cur_il); - p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info=p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info+p_obj_drc->str_bit_handler.num_byts_cur_il; - break; - - } - case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: - { - memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface+p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface, p_obj_drc->pp_mem[2],p_obj_drc->str_bit_handler.num_byts_cur_in); - p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface=p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface+p_obj_drc->str_bit_handler.num_byts_cur_in; - break; - - } - default: - { - return -1; - } - }; - break; - } - case IA_API_CMD_GET_CONFIG_PARAM: - { - switch(i_idx) - { - - case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: - { - - *pus_value=p_obj_drc->str_config.sampling_rate; - break; - } - - case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: - { - - *pus_value=p_obj_drc->str_config.num_ch_out; - break; - } - case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: - { - - *ps_value=(SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output; - break; - } - - } - break; - } - 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; - } - p_obj_drc->str_config.sampling_rate = *pus_value; - break; - } - case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: - { - p_obj_drc->str_config.num_ch_in = *pus_value; - if(*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) - { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS; - } - break; - } - - 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; - } - - p_obj_drc->str_config.pcm_size = *pus_value; - - - break; - } - - 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: - { - if(*pus_value<1 || *pus_value>4096) - { - return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE; - } - - p_obj_drc->str_config.frame_size = *pus_value; - - - break; - } - case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: - { - p_obj_drc->str_bit_handler.gain_stream_flag = *pus_value; - break; - } - - case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: - { - p_obj_drc->str_config.effect_type = *pus_value; - break; - } - case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: - { - p_obj_drc->str_config.target_loudness = *pus_value; - break; - } - case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: - { - p_obj_drc->str_config.loud_norm_flag = *pus_value; - break; - } - - default: - { - return -1; - } - } - break; - } - case IA_API_CMD_GET_MEMTABS_SIZE: - { - - break; - } - case IA_API_CMD_SET_MEMTABS_PTR: - { - - break; - } - case IA_API_CMD_GET_N_MEMTABS: - { - - *pui_value = NUM_DRC_TABLES; - break; - } - case IA_API_CMD_GET_N_TABLES: - { - - break; - } - - case IA_API_CMD_EXECUTE: - { - switch(i_idx) - { - case IA_CMD_TYPE_DO_EXECUTE: - { - 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); - } - else if(p_obj_drc->str_config.dec_type==DEC_TYPE_STFT256){ - error_code=impd_init_process_audio_main_stft(p_obj_drc); - } - 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); - } - break; - } - case IA_CMD_TYPE_DONE_QUERY: - { - - *pui_value = p_obj_drc->p_state->ui_exe_done; - break; - } - default: - { - return -1; - } - }; - break; - } - case IA_API_CMD_PUT_INPUT_QUERY: - { + case IA_API_CMD_SET_MEM_PLACEMENT: { + return impd_drc_mem_api(p_ia_drc_dec_obj, i_cmd, i_idx, pv_value); + } + }; + + switch (i_cmd) { + case IA_API_CMD_GET_LIB_ID_STRINGS: { + switch (i_idx) { + case IA_CMD_TYPE_LIB_NAME: { + WORD8 lib_name[] = LIBNAME; + for (i = 0; i < IA_API_STR_LEN && lib_name[i - 1] != 0; i++) { + pb_value[i] = lib_name[i]; + } + break; + } + case IA_CMD_TYPE_LIB_VERSION: { + break; + } + + case IA_CMD_TYPE_API_VERSION: { + } + default: { return -1; } + }; + break; + } + case IA_API_CMD_GET_API_SIZE: { + *pui_value = sizeof(ia_drc_api_struct) + + (sizeof(ia_drc_state_struct) + 8) + 8080 * 1024; + + break; + } + 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->pp_mem[IA_DRC_PERSIST_IDX]; + impd_drc_set_struct_pointer(p_obj_drc); + + break; + } + case IA_CMD_TYPE_INIT_API_PRE_CONFIG_PARAMS: { + impd_drc_set_default_config(p_obj_drc); + break; + } + case IA_CMD_TYPE_INIT_API_POST_CONFIG_PARAMS: { + p_obj_drc->p_state = + (ia_drc_state_struct *)((SIZE_T)p_obj_drc + 8000 * 1024); + p_obj_drc->p_mem_info = + (ia_mem_info_struct *)((SIZE_T)p_obj_drc + 8002 * 1024); + p_obj_drc->pp_mem = (pVOID)((SIZE_T)p_obj_drc + 8006 * 1024); + impd_drc_fill_mem_tables(p_obj_drc); + break; + } + case IA_CMD_TYPE_INIT_PROCESS: { + IA_ERRORCODE Error = 0; + + if (p_obj_drc->pp_mem[IA_DRC_PERSIST_IDX] == 0) { + return (-1); + } + + Error = impd_drc_init(p_obj_drc); + if (Error) return Error; + p_obj_drc->p_state->ui_init_done = 1; + return Error; + break; + } + case IA_CMD_TYPE_INIT_DONE_QUERY: { + if (p_obj_drc->p_state->ui_init_done == 1) { *pui_value = 1; - break; - } - case IA_API_CMD_GET_CURIDX_INPUT_BUF: - { - UWORD32 ui_in_buf_size = - p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size; - UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes; - *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size; - break; - } - case IA_API_CMD_SET_INPUT_BYTES: - { - p_obj_drc->p_state->ui_in_bytes = *pui_value; - break; - } - - case IA_API_CMD_GET_OUTPUT_BYTES: - { - *pui_value = p_obj_drc->p_state->ui_out_bytes; - break; - } - case IA_API_CMD_INPUT_OVER: - { - 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; - } - case IA_API_CMD_SET_INPUT_BYTES_IC_BS: - { - p_obj_drc->str_bit_handler.num_byts_cur_ic=*pus_value; - break; - } - case IA_API_CMD_SET_INPUT_BYTES_IL_BS: - { - p_obj_drc->str_bit_handler.num_byts_cur_il=*pus_value; - break; - } - case IA_API_CMD_SET_INPUT_BYTES_IN_BS: - { - p_obj_drc->str_bit_handler.num_byts_cur_in=*pus_value; - break; - } - default: - { + } else { + *pui_value = 0; + } + break; + } + + case IA_CMD_TYPE_INIT_CPY_BSF_BUFF_OVER_QUERY: { + *pui_value = p_obj_drc->str_bit_handler.cpy_over; + break; + } + case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF_OVER_QUERY: { + *pui_value = p_obj_drc->str_bit_handler.cpy_over_ic; + break; + } + + case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF_OVER_QUERY: { + *pui_value = p_obj_drc->str_bit_handler.cpy_over_il; + break; + } + case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF_OVER_QUERY: { + *pui_value = p_obj_drc->str_bit_handler.cpy_over_in; + break; + } + 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->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; + break; + } + case IA_CMD_TYPE_INIT_CPY_IC_BSF_BUFF: { + memcpy(p_obj_drc->str_bit_handler.bitstream_drc_config + + p_obj_drc->str_bit_handler.num_bytes_bs_drc_config, + p_obj_drc->pp_mem[2], + p_obj_drc->str_bit_handler.num_byts_cur_ic); + p_obj_drc->str_bit_handler.num_bytes_bs_drc_config = + p_obj_drc->str_bit_handler.num_bytes_bs_drc_config + + p_obj_drc->str_bit_handler.num_byts_cur_ic; + break; + } + case IA_CMD_TYPE_INIT_CPY_IL_BSF_BUFF: { + memcpy(p_obj_drc->str_bit_handler.bitstream_loudness_info + + p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info, + p_obj_drc->pp_mem[2], + p_obj_drc->str_bit_handler.num_byts_cur_il); + p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info = + p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info + + p_obj_drc->str_bit_handler.num_byts_cur_il; + break; + } + case IA_CMD_TYPE_INIT_CPY_IN_BSF_BUFF: { + memcpy(p_obj_drc->str_bit_handler.bitstream_unidrc_interface + + p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface, + p_obj_drc->pp_mem[2], + p_obj_drc->str_bit_handler.num_byts_cur_in); + p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface = + p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface + + p_obj_drc->str_bit_handler.num_byts_cur_in; + break; + } + default: { return -1; } + }; + break; + } + case IA_API_CMD_GET_CONFIG_PARAM: { + switch (i_idx) { + case IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ: { + *pus_value = p_obj_drc->str_config.sampling_rate; + break; + } + + case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { + *pus_value = p_obj_drc->str_config.num_ch_out; + break; + } + case IA_DRC_DEC_CONFIG_PROC_OUT_PTR: { + *ps_value = (SIZE_T)p_obj_drc->str_payload.pstr_drc_sel_proc_output; + break; + } + } + break; + } + 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; + } + p_obj_drc->str_config.sampling_rate = *pus_value; + break; + } + case IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS: { + p_obj_drc->str_config.num_ch_in = *pus_value; + if (*pus_value < 1 || *pus_value > MAX_CHANNEL_COUNT) { + return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS; + } + break; + } + + 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; + } + + p_obj_drc->str_config.pcm_size = *pus_value; + + break; + } + + 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; } - }; - return error_code; -} + 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; -IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, - WORD32 i_cmd, WORD32 i_idx, pVOID pv_value) -{ - pUWORD32 pui_value = pv_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; + } - switch(i_cmd) - { - case IA_API_CMD_GET_MEM_INFO_SIZE: - { - *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size; - break; + p_obj_drc->str_config.gain_delay_samples = *pus_value; + + break; } - case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: - { - *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment; - break; + + /*Sujith: introduce error*/ + case IA_DRC_DEC_CONFIG_PARAM_AUDIO_DELAY: { + break; } - case IA_API_CMD_GET_MEM_INFO_TYPE: - { - *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type; - 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_API_CMD_GET_MEM_INFO_PLACEMENT: - { - *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0]; - *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1]; - break; + case IA_DRC_DEC_CONFIG_PARAM_ABSO_DELAY_OFF: { + p_obj_drc->str_config.absorb_delay_on = *pus_value; + + break; } - case IA_API_CMD_GET_MEM_INFO_PRIORITY: - { - *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority; - break; + case IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE: { + if (*pus_value < 1 || *pus_value > 4096) { + return IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE; + } + + p_obj_drc->str_config.frame_size = *pus_value; + + break; } - case IA_API_CMD_SET_MEM_PTR: - { - - pWORD8 pbtemp; - UWORD32 sz; - if(pv_value == 0) - { - return(-1); - } - if(((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) - { - return(-1); - } - p_obj_drc->pp_mem[i_idx] = pv_value; - pbtemp = p_obj_drc->pp_mem[i_idx]; - sz = p_obj_drc->p_mem_info[i_idx].ui_size; - - memset(pbtemp,0,sz); - } - case IA_API_CMD_SET_MEM_PLACEMENT: - { - - } - }; - return IA_NO_ERROR; + case IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG: { + p_obj_drc->str_bit_handler.gain_stream_flag = *pus_value; + break; + } + + case IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE: { + p_obj_drc->str_config.effect_type = *pus_value; + break; + } + case IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS: { + p_obj_drc->str_config.target_loudness = *pus_value; + break; + } + case IA_DRC_DEC_CONFIG_DRC_LOUD_NORM: { + p_obj_drc->str_config.loud_norm_flag = *pus_value; + break; + } + + default: { return -1; } + } + break; + } + case IA_API_CMD_GET_MEMTABS_SIZE: { + break; + } + case IA_API_CMD_SET_MEMTABS_PTR: { + break; + } + case IA_API_CMD_GET_N_MEMTABS: { + *pui_value = NUM_DRC_TABLES; + break; + } + case IA_API_CMD_GET_N_TABLES: { + break; + } + + case IA_API_CMD_EXECUTE: { + switch (i_idx) { + case IA_CMD_TYPE_DO_EXECUTE: { + 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); + } else if (p_obj_drc->str_config.dec_type == DEC_TYPE_STFT256) { + error_code = impd_init_process_audio_main_stft(p_obj_drc); + } 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); + } + break; + } + case IA_CMD_TYPE_DONE_QUERY: { + *pui_value = p_obj_drc->p_state->ui_exe_done; + break; + } + default: { return -1; } + }; + break; + } + case IA_API_CMD_PUT_INPUT_QUERY: { + *pui_value = 1; + break; + } + case IA_API_CMD_GET_CURIDX_INPUT_BUF: { + UWORD32 ui_in_buf_size = p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX].ui_size; + UWORD32 ui_in_bytes = p_obj_drc->p_state->ui_in_bytes; + *pui_value = ui_in_buf_size > ui_in_bytes ? ui_in_bytes : ui_in_buf_size; + break; + } + case IA_API_CMD_SET_INPUT_BYTES: { + p_obj_drc->p_state->ui_in_bytes = *pui_value; + break; + } + + case IA_API_CMD_GET_OUTPUT_BYTES: { + *pui_value = p_obj_drc->p_state->ui_out_bytes; + break; + } + case IA_API_CMD_INPUT_OVER: { + 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; + } + case IA_API_CMD_SET_INPUT_BYTES_IC_BS: { + p_obj_drc->str_bit_handler.num_byts_cur_ic = *pus_value; + break; + } + case IA_API_CMD_SET_INPUT_BYTES_IL_BS: { + p_obj_drc->str_bit_handler.num_byts_cur_il = *pus_value; + break; + } + case IA_API_CMD_SET_INPUT_BYTES_IN_BS: { + p_obj_drc->str_bit_handler.num_byts_cur_in = *pus_value; + break; + } + default: { return -1; } + }; + return error_code; } -IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) -{ - ia_mem_info_struct *p_mem_info; - { - p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX]; - p_mem_info->ui_size = 64*1024*1024; - p_mem_info->ui_alignment = 8; - p_mem_info->ui_type = IA_MEMTYPE_PERSIST; - p_mem_info->ui_placement[0] = 0; - p_mem_info->ui_placement[1] = 0; - p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; - p_mem_info->ui_placed[0] = 0; - p_mem_info->ui_placed[1] = 0; +IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 i_cmd, + WORD32 i_idx, pVOID pv_value) { + pUWORD32 pui_value = pv_value; + + switch (i_cmd) { + case IA_API_CMD_GET_MEM_INFO_SIZE: { + *pui_value = p_obj_drc->p_mem_info[i_idx].ui_size; + break; + } + case IA_API_CMD_GET_MEM_INFO_ALIGNMENT: { + *pui_value = p_obj_drc->p_mem_info[i_idx].ui_alignment; + break; } - { - p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX]; - p_mem_info->ui_size = p_obj_drc->str_config.frame_size*(p_obj_drc->str_config.pcm_size>>3)*p_obj_drc->str_config.num_ch_in; - p_mem_info->ui_alignment = 4; - p_mem_info->ui_type = IA_MEMTYPE_INPUT; - p_mem_info->ui_placement[0] = 0; - p_mem_info->ui_placement[1] = 0; - p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; - p_mem_info->ui_placed[0] = 0; - p_mem_info->ui_placed[1] = 0; + case IA_API_CMD_GET_MEM_INFO_TYPE: { + *pui_value = p_obj_drc->p_mem_info[i_idx].ui_type; + break; } - { - p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX]; - p_mem_info->ui_size = p_obj_drc->str_config.frame_size*(p_obj_drc->str_config.pcm_size>>3)*p_obj_drc->str_config.num_ch_in; - p_mem_info->ui_alignment = 4; - p_mem_info->ui_type = IA_MEMTYPE_OUTPUT; - p_mem_info->ui_placement[0] = 0; - p_mem_info->ui_placement[1] = 0; - p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; - p_mem_info->ui_placed[0] = 0; - p_mem_info->ui_placed[1] = 0; + case IA_API_CMD_GET_MEM_INFO_PLACEMENT: { + *pui_value = p_obj_drc->p_mem_info[i_idx].ui_placement[0]; + *(pui_value + 1) = p_obj_drc->p_mem_info[i_idx].ui_placement[1]; + break; } - { - p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX]; - p_mem_info->ui_size = SCRATCH_MEM_SIZE; - p_mem_info->ui_alignment = 8; - p_mem_info->ui_type = IA_MEMTYPE_SCRATCH; - p_mem_info->ui_placement[0] = 0; - p_mem_info->ui_placement[1] = 0; - p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; - p_mem_info->ui_placed[0] = 0; - p_mem_info->ui_placed[1] = 0; + case IA_API_CMD_GET_MEM_INFO_PRIORITY: { + *pui_value = p_obj_drc->p_mem_info[i_idx].ui_priority; + break; } - return IA_NO_ERROR; + case IA_API_CMD_SET_MEM_PTR: { + pWORD8 pbtemp; + UWORD32 sz; + if (pv_value == 0) { + return (-1); + } + if (((SIZE_T)pv_value % p_obj_drc->p_mem_info[i_idx].ui_alignment) != 0) { + return (-1); + } + p_obj_drc->pp_mem[i_idx] = pv_value; + pbtemp = p_obj_drc->pp_mem[i_idx]; + sz = p_obj_drc->p_mem_info[i_idx].ui_size; + + memset(pbtemp, 0, sz); + } + case IA_API_CMD_SET_MEM_PLACEMENT: { + } + }; + return IA_NO_ERROR; +} + +IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc) { + ia_mem_info_struct *p_mem_info; + { + p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_PERSIST_IDX]; + p_mem_info->ui_size = 64 * 1024 * 1024; + p_mem_info->ui_alignment = 8; + p_mem_info->ui_type = IA_MEMTYPE_PERSIST; + p_mem_info->ui_placement[0] = 0; + p_mem_info->ui_placement[1] = 0; + p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; + p_mem_info->ui_placed[0] = 0; + p_mem_info->ui_placed[1] = 0; + } + { + p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_INPUT_IDX]; + p_mem_info->ui_size = p_obj_drc->str_config.frame_size * + (p_obj_drc->str_config.pcm_size >> 3) * + p_obj_drc->str_config.num_ch_in; + p_mem_info->ui_alignment = 4; + p_mem_info->ui_type = IA_MEMTYPE_INPUT; + p_mem_info->ui_placement[0] = 0; + p_mem_info->ui_placement[1] = 0; + p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; + p_mem_info->ui_placed[0] = 0; + p_mem_info->ui_placed[1] = 0; + } + { + p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_OUTPUT_IDX]; + p_mem_info->ui_size = p_obj_drc->str_config.frame_size * + (p_obj_drc->str_config.pcm_size >> 3) * + p_obj_drc->str_config.num_ch_in; + p_mem_info->ui_alignment = 4; + p_mem_info->ui_type = IA_MEMTYPE_OUTPUT; + p_mem_info->ui_placement[0] = 0; + p_mem_info->ui_placement[1] = 0; + p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; + p_mem_info->ui_placed[0] = 0; + p_mem_info->ui_placed[1] = 0; + } + { + p_mem_info = &p_obj_drc->p_mem_info[IA_DRC_SCRATCH_IDX]; + p_mem_info->ui_size = SCRATCH_MEM_SIZE; + p_mem_info->ui_alignment = 8; + p_mem_info->ui_type = IA_MEMTYPE_SCRATCH; + p_mem_info->ui_placement[0] = 0; + p_mem_info->ui_placement[1] = 0; + p_mem_info->ui_priority = IA_MEMPRIORITY_ANYWHERE; + p_mem_info->ui_placed[0] = 0; + p_mem_info->ui_placed[1] = 0; + } + return IA_NO_ERROR; } diff --git a/decoder/drc_src/impd_drc_api_defs.h b/decoder/drc_src/impd_drc_api_defs.h index 5885a45..3fba4d0 100644 --- a/decoder/drc_src/impd_drc_api_defs.h +++ b/decoder/drc_src/impd_drc_api_defs.h @@ -18,7 +18,6 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ - #ifndef IMPD_API_DEFS_H #define IMPD_API_DEFS_H @@ -26,26 +25,25 @@ /* Constant hash defines */ /*****************************************************************************/ /* A constant to let API copy small strings to buffers outside */ -#define IA_API_STR_LEN 30 -#define IA_APIVERSION_MAJOR 1 -#define IA_APIVERSION_MINOR 10 +#define IA_API_STR_LEN 30 +#define IA_APIVERSION_MAJOR 1 +#define IA_APIVERSION_MINOR 10 /* last compatible version */ /* sometimes a new API version is just for a bugfix, or a added feature in */ /* this case it is better to use a newer version even though a library was */ /* made for an older version, library API can then be upgraded to newer API */ /* version after checking for compatibility or by adding features */ -#define IA_LASTCOMP_APIVERSION_MAJOR 1 -#define IA_LASTCOMP_APIVERSION_MINOR 10 +#define IA_LASTCOMP_APIVERSION_MAJOR 1 +#define IA_LASTCOMP_APIVERSION_MINOR 10 -#define IA_STR(str) #str -#define IA_MAKE_VERSION_STR(maj, min) IA_STR(maj) "." IA_STR(min) -#define IA_APIVERSION IA_MAKE_VERSION_STR(\ - IA_APIVERSION_MAJOR, \ - IA_APIVERSION_MINOR) +#define IA_STR(str) #str +#define IA_MAKE_VERSION_STR(maj, min) IA_STR(maj) "." IA_STR(min) +#define IA_APIVERSION \ + IA_MAKE_VERSION_STR(IA_APIVERSION_MAJOR, IA_APIVERSION_MINOR) -#define IA_LAST_COMP_APIVERSION IA_MAKE_VERSION_STR(\ - IA_LASTCOMP_APIVERSION_MAJOR, \ - IA_LASTCOMP_APIVERSION_MINOR) +#define IA_LAST_COMP_APIVERSION \ + IA_MAKE_VERSION_STR(IA_LASTCOMP_APIVERSION_MAJOR, \ + IA_LASTCOMP_APIVERSION_MINOR) #endif diff --git a/decoder/drc_src/impd_drc_api_struct_def.h b/decoder/drc_src/impd_drc_api_struct_def.h index abe6cc3..a48cd68 100644 --- a/decoder/drc_src/impd_drc_api_struct_def.h +++ b/decoder/drc_src/impd_drc_api_struct_def.h @@ -24,110 +24,105 @@ /* structure definitions */ /****************************************************************************/ /* DRC Configuration */ -typedef struct ia_drc_config_struct -{ - WORD32 bitstream_file_format; - WORD32 dec_type; - WORD32 sub_band_domain_mode; - WORD32 num_ch_in; - WORD32 num_ch_out; - WORD32 sampling_rate; - WORD32 control_parameter_index; - WORD32 delay_mode; - WORD32 absorb_delay_on; - WORD32 gain_delay_samples; - WORD32 subband_domain_io_flag; - WORD32 frame_size; - WORD32 sub_band_down_sampling_factor; - WORD32 sub_band_count; - WORD32 peak_limiter; - WORD32 interface_bitstream_present; - WORD32 pcm_size; - WORD32 parametric_drc_delay_gain_dec_instance ; - WORD32 parametric_drc_delay; - WORD32 parametric_drc_delay_max; - WORD32 eq_delay_gain_dec_instance; - WORD32 eq_delay; - WORD32 eq_delay_max; - WORD32 delay_line_samples; - WORD32 constant_delay_on; - WORD32 audio_delay_samples; +typedef struct ia_drc_config_struct { + WORD32 bitstream_file_format; + WORD32 dec_type; + WORD32 sub_band_domain_mode; + WORD32 num_ch_in; + WORD32 num_ch_out; + WORD32 sampling_rate; + WORD32 control_parameter_index; + WORD32 delay_mode; + WORD32 absorb_delay_on; + WORD32 gain_delay_samples; + WORD32 subband_domain_io_flag; + WORD32 frame_size; + WORD32 sub_band_down_sampling_factor; + WORD32 sub_band_count; + WORD32 peak_limiter; + WORD32 interface_bitstream_present; + WORD32 pcm_size; + WORD32 parametric_drc_delay_gain_dec_instance; + WORD32 parametric_drc_delay; + WORD32 parametric_drc_delay_max; + WORD32 eq_delay_gain_dec_instance; + WORD32 eq_delay; + WORD32 eq_delay_max; + WORD32 delay_line_samples; + WORD32 constant_delay_on; + WORD32 audio_delay_samples; - WORD32 effect_type; - WORD32 target_loudness; - WORD32 loud_norm_flag; + WORD32 effect_type; + WORD32 target_loudness; + WORD32 loud_norm_flag; -}ia_drc_config_struct; +} ia_drc_config_struct; /* DRC bitsteam handler */ -typedef struct bits_handler -{ - UWORD8* bitstream_drc_config; - UWORD8* bitstream_loudness_info ; - UWORD8* bitstream_unidrc_interface ; - UWORD8* it_bit_buf; - WORD32 num_bytes_bs_drc_config; - WORD32 num_bytes_bs_loudness_info; - WORD32 num_bits_read_bs_unidrc_interface; - WORD32 num_bytes_bs_unidrc_interface; - WORD32 num_bits_read_bs; - WORD32 num_bytes_read_bs; - WORD32 num_bytes_bs; - WORD32 num_bits_offset_bs; - WORD32 byte_index_bs; - WORD32 num_byts_cur; - WORD32 num_byts_cur_ic; - WORD32 num_byts_cur_il; - WORD32 num_byts_cur_in; - WORD32 cpy_over; - WORD32 cpy_over_ic; - WORD32 cpy_over_il; - WORD32 cpy_over_in; - WORD32 gain_stream_flag; -}ia_drc_bits_handler_struct; +typedef struct bits_handler { + UWORD8 *bitstream_drc_config; + UWORD8 *bitstream_loudness_info; + UWORD8 *bitstream_unidrc_interface; + UWORD8 *it_bit_buf; + WORD32 num_bytes_bs_drc_config; + WORD32 num_bytes_bs_loudness_info; + WORD32 num_bits_read_bs_unidrc_interface; + WORD32 num_bytes_bs_unidrc_interface; + WORD32 num_bits_read_bs; + WORD32 num_bytes_read_bs; + WORD32 num_bytes_bs; + WORD32 num_bits_offset_bs; + WORD32 byte_index_bs; + WORD32 num_byts_cur; + WORD32 num_byts_cur_ic; + WORD32 num_byts_cur_il; + WORD32 num_byts_cur_in; + WORD32 cpy_over; + WORD32 cpy_over_ic; + WORD32 cpy_over_il; + WORD32 cpy_over_in; + WORD32 gain_stream_flag; +} ia_drc_bits_handler_struct; -typedef struct -{ - ia_drc_bits_dec_struct *pstr_bitstream_dec; - ia_drc_gain_dec_struct *pstr_gain_dec[2]; - ia_drc_sel_pro_struct *pstr_selection_proc; - ia_drc_config *pstr_drc_config; - ia_drc_loudness_info_set_struct *pstr_loudness_info; - ia_drc_gain_struct *pstr_drc_gain; - ia_drc_interface_struct *pstr_drc_interface; +typedef struct { + ia_drc_bits_dec_struct *pstr_bitstream_dec; + ia_drc_gain_dec_struct *pstr_gain_dec[2]; + ia_drc_sel_pro_struct *pstr_selection_proc; + ia_drc_config *pstr_drc_config; + ia_drc_loudness_info_set_struct *pstr_loudness_info; + ia_drc_gain_struct *pstr_drc_gain; + ia_drc_interface_struct *pstr_drc_interface; - ia_drc_peak_limiter_struct *pstr_peak_limiter; - ia_drc_qmf_filt_struct *pstr_qmf_filter; - ia_drc_sel_proc_params_struct *pstr_drc_sel_proc_params; - ia_drc_sel_proc_output_struct *pstr_drc_sel_proc_output; + ia_drc_peak_limiter_struct *pstr_peak_limiter; + ia_drc_qmf_filt_struct *pstr_qmf_filter; + ia_drc_sel_proc_params_struct *pstr_drc_sel_proc_params; + ia_drc_sel_proc_output_struct *pstr_drc_sel_proc_output; -}ia_drc_payload_struct; +} ia_drc_payload_struct; -typedef struct ia_drc_state_struct -{ - UWORD32 ui_out_bytes; - UWORD32 ui_in_bytes; - UWORD32 ui_ir_bytes; - UWORD32 total_num_out_samples; - UWORD32 frame_no; - UWORD32 out_size; - UWORD32 ui_init_done; - UWORD32 ui_exe_done; - UWORD32 ui_ir_used; - WORD32 delay_in_output; - WORD32 delay_adjust_samples; - pVOID persistant_ptr; -}ia_drc_state_struct; +typedef struct ia_drc_state_struct { + UWORD32 ui_out_bytes; + UWORD32 ui_in_bytes; + UWORD32 ui_ir_bytes; + UWORD32 total_num_out_samples; + UWORD32 frame_no; + UWORD32 out_size; + UWORD32 ui_init_done; + UWORD32 ui_exe_done; + UWORD32 ui_ir_used; + WORD32 delay_in_output; + WORD32 delay_adjust_samples; + pVOID persistant_ptr; +} ia_drc_state_struct; -typedef struct IA_PSM_API_Struct -{ - ia_drc_state_struct *p_state; - ia_drc_config_struct str_config; - ia_drc_payload_struct str_payload; - ia_drc_bits_handler_struct str_bit_handler; - ia_mem_info_struct *p_mem_info; - pVOID *pp_mem; - struct ia_bit_buf_struct str_bit_buf, *pstr_bit_buf; +typedef struct IA_PSM_API_Struct { + ia_drc_state_struct *p_state; + ia_drc_config_struct str_config; + ia_drc_payload_struct str_payload; + ia_drc_bits_handler_struct str_bit_handler; + ia_mem_info_struct *p_mem_info; + pVOID *pp_mem; + struct ia_bit_buf_struct str_bit_buf, *pstr_bit_buf; } ia_drc_api_struct; diff --git a/decoder/drc_src/impd_drc_bitbuffer.c b/decoder/drc_src/impd_drc_bitbuffer.c index 2791192..de1f86d 100644 --- a/decoder/drc_src/impd_drc_bitbuffer.c +++ b/decoder/drc_src/impd_drc_bitbuffer.c @@ -30,262 +30,222 @@ #include "impd_drc_struct.h" #include "impd_drc_parser.h" +WORD32 impd_read_bits_buf(ia_bit_buf_struct* it_bit_buff, WORD no_of_bits) { + UWORD32 ret_val; + UWORD8* ptr_read_next = it_bit_buff->ptr_read_next; + WORD bit_pos = it_bit_buff->bit_pos; + it_bit_buff->error = 0; + + if (it_bit_buff->cnt_bits <= 0) { + it_bit_buff->error = 1; + return -1; + } + + if (no_of_bits == 0) { + return 0; + } -WORD32 impd_read_bits_buf(ia_bit_buf_struct* it_bit_buff, - WORD no_of_bits) -{ - - UWORD32 ret_val; - UWORD8 *ptr_read_next = it_bit_buff->ptr_read_next; - WORD bit_pos = it_bit_buff->bit_pos; - it_bit_buff->error = 0; + it_bit_buff->cnt_bits -= no_of_bits; + ret_val = (UWORD32)*ptr_read_next; - if(it_bit_buff->cnt_bits <= 0) - { - it_bit_buff->error = 1; - return -1; - } + bit_pos -= no_of_bits; + while (bit_pos < 0) { + bit_pos += 8; + ptr_read_next++; - if (no_of_bits==0){ - return 0; + if (ptr_read_next > it_bit_buff->ptr_bit_buf_end) { + ptr_read_next = it_bit_buff->ptr_bit_buf_base; } - it_bit_buff->cnt_bits -= no_of_bits; - ret_val = (UWORD32)*ptr_read_next; - - bit_pos -= no_of_bits; - while (bit_pos < 0) { - bit_pos += 8; - ptr_read_next++; - - if(ptr_read_next > it_bit_buff->ptr_bit_buf_end) { - ptr_read_next = it_bit_buff->ptr_bit_buf_base; - } + ret_val <<= 8; - ret_val <<= 8; + ret_val |= (UWORD32)*ptr_read_next; + } - ret_val |= (UWORD32)*ptr_read_next; - } - - ret_val = ret_val << ((31 - no_of_bits) - bit_pos) >> (32 - no_of_bits); - it_bit_buff->ptr_read_next = ptr_read_next; - it_bit_buff->bit_pos = (WORD16)bit_pos; - return ret_val; + ret_val = ret_val << ((31 - no_of_bits) - bit_pos) >> (32 - no_of_bits); + it_bit_buff->ptr_read_next = ptr_read_next; + it_bit_buff->bit_pos = (WORD16)bit_pos; + return ret_val; } ia_bit_buf_struct* impd_create_bit_buf(ia_bit_buf_struct* it_bit_buff, - UWORD8 *ptr_bit_buf_base, - WORD32 bit_buf_size) -{ + 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; - 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; + it_bit_buff->ptr_read_next = ptr_bit_buf_base; + it_bit_buff->bit_pos = 7; - it_bit_buff->ptr_read_next = ptr_bit_buf_base; - it_bit_buff->bit_pos = 7; + it_bit_buff->cnt_bits = 0; + it_bit_buff->size = bit_buf_size << 3; - it_bit_buff->cnt_bits = 0; - it_bit_buff->size = bit_buf_size << 3; - - return it_bit_buff; + return it_bit_buff; } 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) -{ - 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); + 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); } WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_drc_bs_dec_struct, - WORD32 sample_rate, - WORD32 frame_size, - WORD32 delay_mode, - WORD32 lfe_channel_map_count, - WORD32* lfe_channel_map) -{ - WORD32 i, err_code = 0; - - 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; - 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 / ia_drc_params_struct->delta_tmin_default; - ia_drc_params_struct->delay_mode = delay_mode; - - if ((frame_size < 1)||(frame_size > AUDIO_CODEC_FRAME_SIZE_MAX)||(ia_drc_params_struct->drc_frame_size < 0.001f * sample_rate)) - { - return -1; - } - if (sample_rate < 1000) - { - return -1; + WORD32 sample_rate, WORD32 frame_size, + WORD32 delay_mode, + WORD32 lfe_channel_map_count, + WORD32* lfe_channel_map) { + WORD32 i, err_code = 0; + + 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; + 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 / + ia_drc_params_struct->delta_tmin_default; + ia_drc_params_struct->delay_mode = delay_mode; + + if ((frame_size < 1) || (frame_size > AUDIO_CODEC_FRAME_SIZE_MAX) || + (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) { + return -1; + } + + if (lfe_channel_map_count >= 0) { + if ((lfe_channel_map == NULL) || + (lfe_channel_map_count > MAX_CHANNEL_COUNT)) { + return (-1); } - if (ia_drc_params_struct->delta_tmin_default > ia_drc_params_struct->drc_frame_size) - { - return -1; - } - - if (lfe_channel_map_count >= 0) - { - if ((lfe_channel_map == NULL) || (lfe_channel_map_count > MAX_CHANNEL_COUNT)) - { - return(-1); - } + ia_drc_params_struct->lfe_channel_map_count = lfe_channel_map_count; - ia_drc_params_struct->lfe_channel_map_count = lfe_channel_map_count; - - for (i=0; i<lfe_channel_map_count; i++) - { - ia_drc_params_struct->lfe_channel_map[i] = lfe_channel_map[i]; - } + for (i = 0; i < lfe_channel_map_count; i++) { + ia_drc_params_struct->lfe_channel_map[i] = lfe_channel_map[i]; } - else - { - ia_drc_params_struct->lfe_channel_map_count = -1; - - for (i=0; i<MAX_CHANNEL_COUNT; i++) - { - ia_drc_params_struct->lfe_channel_map[i] = 0; - } + } else { + ia_drc_params_struct->lfe_channel_map_count = -1; + + for (i = 0; i < MAX_CHANNEL_COUNT; i++) { + ia_drc_params_struct->lfe_channel_map[i] = 0; } + } - err_code = impd_init_tbls(ia_drc_params_struct->num_gain_values_max_default, &p_drc_bs_dec_struct->tables_default); + err_code = impd_init_tbls(ia_drc_params_struct->num_gain_values_max_default, + &p_drc_bs_dec_struct->tables_default); - return err_code; + 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 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; + 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); - 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; + dummy = impd_read_bits_buf(it_bit_buff, num_bits_offset); + 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); + loudness_info_set_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - if (err_code) - return (err_code); + 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); - err_code = impd_parse_loudness_info_set(it_bit_buff, pstr_loudness_info); + if (err_code) return (err_code); + } - if (err_code) - return (err_code); - } + err_code = impd_parse_loudness_info_set(it_bit_buff, pstr_loudness_info); - *num_bits_read = it_bit_buff->size - it_bit_buff->cnt_bits; + if (err_code) return (err_code); } - return err_code; -} + *num_bits_read = it_bit_buff->size - it_bit_buff->cnt_bits; + } + return err_code; +} -WORD32 impd_process_drc_bitstream_dec_config(ia_drc_bits_dec_struct* p_drc_bs_dec_struct, - ia_bit_buf_struct* it_bit_buff, - ia_drc_config *pstr_drc_config, - UWORD8* bitstream_config, - WORD32 num_bytes) -{ - WORD32 err_code = 0; +WORD32 impd_process_drc_bitstream_dec_config( + ia_drc_bits_dec_struct* p_drc_bs_dec_struct, ia_bit_buf_struct* it_bit_buff, + ia_drc_config* pstr_drc_config, UWORD8* bitstream_config, + WORD32 num_bytes) { + WORD32 err_code = 0; - it_bit_buff = impd_create_init_bit_buf(it_bit_buff, bitstream_config, num_bytes); + it_bit_buff = + 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); - if (err_code) return (err_code); + 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); - return err_code; + return err_code; } +WORD32 impd_process_drc_bitstream_dec_gain( + 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_gain_struct* pstr_drc_gain, + UWORD8* bitstream_gain, WORD32 num_bytes, WORD32 num_bits_offset, + WORD32* num_bits_read) { + WORD32 err_code = 0; -WORD32 impd_process_drc_bitstream_dec_gain(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_gain_struct *pstr_drc_gain, - UWORD8* bitstream_gain, - WORD32 num_bytes, - WORD32 num_bits_offset, - WORD32* num_bits_read) -{ - WORD32 err_code = 0; + WORD32 dummy; - WORD32 dummy; + it_bit_buff = + impd_create_init_bit_buf(it_bit_buff, bitstream_gain, num_bytes); - it_bit_buff = 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; - dummy = impd_read_bits_buf(it_bit_buff, num_bits_offset); - if(it_bit_buff->error) - return it_bit_buff->error; - - err_code = impd_drc_uni_gain_read( - it_bit_buff, - p_drc_bs_dec_struct, - pstr_drc_config, - pstr_drc_gain); + err_code = impd_drc_uni_gain_read(it_bit_buff, p_drc_bs_dec_struct, + pstr_drc_config, pstr_drc_gain); - if (err_code > PROC_COMPLETE) - return (err_code); + if (err_code > PROC_COMPLETE) return (err_code); - *num_bits_read = (it_bit_buff->size) - it_bit_buff->cnt_bits; + *num_bits_read = (it_bit_buff->size) - it_bit_buff->cnt_bits; - if (err_code == PROC_COMPLETE) - { - return err_code; - } + if (err_code == PROC_COMPLETE) { + return err_code; + } - return 0; + return 0; } +WORD32 impd_process_drc_bitstream_dec_loudness_info_set( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + UWORD8* bit_stream_loudness, WORD32 num_bytes_loudness) { + WORD32 err_code = 0; -WORD32 impd_process_drc_bitstream_dec_loudness_info_set(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct *pstr_loudness_info, - 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); + it_bit_buff = 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); + err_code = impd_parse_loudness_info_set(it_bit_buff, pstr_loudness_info); + if (err_code) return (err_code); - - return 0; + return 0; } diff --git a/decoder/drc_src/impd_drc_bitbuffer.h b/decoder/drc_src/impd_drc_bitbuffer.h index 89e7044..f42e24a 100644 --- a/decoder/drc_src/impd_drc_bitbuffer.h +++ b/decoder/drc_src/impd_drc_bitbuffer.h @@ -20,34 +20,28 @@ #ifndef IMPD_DRC_BITBUFFER_H #define IMPD_DRC_BITBUFFER_H +typedef struct ia_bit_buf_struct { + UWORD8 *ptr_bit_buf_base; + UWORD8 *ptr_bit_buf_end; -typedef struct ia_bit_buf_struct -{ - UWORD8 *ptr_bit_buf_base; - UWORD8 *ptr_bit_buf_end; + UWORD8 *ptr_read_next; - UWORD8 *ptr_read_next; + WORD32 bit_pos; + WORD32 cnt_bits; - WORD32 bit_pos; - WORD32 cnt_bits; + WORD32 size; + WORD32 error; - WORD32 size; - WORD32 error; +} 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); -}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); - -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); - -WORD32 impd_read_bits_buf(ia_bit_buf_struct* it_bit_buff, - WORD no_of_bits); +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); +WORD32 impd_read_bits_buf(ia_bit_buf_struct *it_bit_buff, WORD no_of_bits); #endif diff --git a/decoder/drc_src/impd_drc_bitstream_dec_api.h b/decoder/drc_src/impd_drc_bitstream_dec_api.h index f4e45fb..25773d5 100644 --- a/decoder/drc_src/impd_drc_bitstream_dec_api.h +++ b/decoder/drc_src/impd_drc_bitstream_dec_api.h @@ -20,44 +20,31 @@ #ifndef IMPD_DRC_BITSTREAM_DEC_API_H #define IMPD_DRC_BITSTREAM_DEC_API_H - -WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, - WORD32 sample_rate, - 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, - UWORD8* bitstream_config, - WORD32 num_bytes); - -WORD32 impd_process_drc_bitstream_dec_gain(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_gain_struct* pstr_drc_gain, - UWORD8* bitstream_gain, - WORD32 num_bytes, - WORD32 num_bits_offset, - WORD32* num_bits_read); - -WORD32 impd_process_drc_bitstream_dec_loudness_info_set(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - UWORD8* bitstream_loudness, - WORD32 num_bytes_loudness - ); +WORD32 impd_init_drc_bitstream_dec( + ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, WORD32 sample_rate, + 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, + UWORD8* bitstream_config, WORD32 num_bytes); + +WORD32 impd_process_drc_bitstream_dec_gain( + 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_gain_struct* pstr_drc_gain, UWORD8* bitstream_gain, WORD32 num_bytes, + WORD32 num_bits_offset, WORD32* num_bits_read); + +WORD32 impd_process_drc_bitstream_dec_loudness_info_set( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + UWORD8* bitstream_loudness, WORD32 num_bytes_loudness); #endif - - - diff --git a/decoder/drc_src/impd_drc_common.h b/decoder/drc_src/impd_drc_common.h index 79bdbcf..dd0e621 100644 --- a/decoder/drc_src/impd_drc_common.h +++ b/decoder/drc_src/impd_drc_common.h @@ -21,161 +21,155 @@ #define IMPD_DRC_COMMON_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - -#define EQ_IS_SUPPORTED 1 - -#define MEASURE_AVERAGE_BITRATE 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 DRC_BAND_COUNT_MAX BAND_COUNT_MAX -#define SPLIT_CHARACTERISTIC_COUNT_MAX 8 -#define GAIN_SET_COUNT_MAX SEQUENCE_COUNT_MAX -#define SHAPE_FILTER_COUNT_MAX 8 -#define DRC_SET_ID_COUNT_MAX 16 -#define EQ_SET_ID_COUNT_MAX 8 +#define EQ_IS_SUPPORTED 1 + +#define MEASURE_AVERAGE_BITRATE 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 DRC_BAND_COUNT_MAX BAND_COUNT_MAX +#define SPLIT_CHARACTERISTIC_COUNT_MAX 8 +#define GAIN_SET_COUNT_MAX SEQUENCE_COUNT_MAX +#define SHAPE_FILTER_COUNT_MAX 8 +#define DRC_SET_ID_COUNT_MAX 16 +#define EQ_SET_ID_COUNT_MAX 8 #define LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX 4 -#define FILTER_ELEMENT_COUNT_MAX 16 -#define REAL_ZERO_RADIUS_ONE_COUNT_MAX 14 -#define REAL_ZERO_COUNT_MAX 64 -#define COMPLEX_ZERO_COUNT_MAX 64 -#define REAL_POLE_COUNT_MAX 16 -#define COMPLEX_POLE_COUNT_MAX 16 -#define FIR_ORDER_MAX 128 -#define EQ_NODE_COUNT_MAX 33 -#define EQ_SUBBAND_GAIN_COUNT_MAX 135 -#define UNIQUE_SUBBAND_GAIN_COUNT_MAX 16 -#define FILTER_BLOCK_COUNT_MAX 16 -#define FILTER_ELEMENT_COUNT_MAX 16 -#define UNIQUE_SUBBAND_GAINS_COUNT_MAX 8 -#define EQ_CHANNEL_GROUP_COUNT_MAX 4 -#define EQ_FILTER_BLOCK_COUNT_MAX 4 -#define LOUD_EQ_INSTRUCTIONS_COUNT_MAX 8 -#define EQ_INSTRUCTIONS_COUNT_MAX 8 -#define SELECTED_EQ_SET_COUNT_MAX 2 -#define SUB_EQ_COUNT 2 - -#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 FILTER_ELEMENT_COUNT_MAX 16 +#define REAL_ZERO_RADIUS_ONE_COUNT_MAX 14 +#define REAL_ZERO_COUNT_MAX 64 +#define COMPLEX_ZERO_COUNT_MAX 64 +#define REAL_POLE_COUNT_MAX 16 +#define COMPLEX_POLE_COUNT_MAX 16 +#define FIR_ORDER_MAX 128 +#define EQ_NODE_COUNT_MAX 33 +#define EQ_SUBBAND_GAIN_COUNT_MAX 135 +#define UNIQUE_SUBBAND_GAIN_COUNT_MAX 16 +#define FILTER_BLOCK_COUNT_MAX 16 +#define FILTER_ELEMENT_COUNT_MAX 16 +#define UNIQUE_SUBBAND_GAINS_COUNT_MAX 8 +#define EQ_CHANNEL_GROUP_COUNT_MAX 4 +#define EQ_FILTER_BLOCK_COUNT_MAX 4 +#define LOUD_EQ_INSTRUCTIONS_COUNT_MAX 8 +#define EQ_INSTRUCTIONS_COUNT_MAX 8 +#define SELECTED_EQ_SET_COUNT_MAX 2 +#define SUB_EQ_COUNT 2 + +#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 EXT_COUNT_MAX 2 +#define UNIDRCGAINEXT_TERM 0x0 +#define UNIDRCLOUDEXT_TERM 0x0 +#define UNIDRCCONFEXT_TERM 0x0 +#define UNIDRCINTERFACEEXT_TERM 0x0 -#define UNIDRCCONFEXT_PARAM_DRC 0x1 +#define UNIDRCCONFEXT_PARAM_DRC 0x1 #define PARAM_DRC_INSTRUCTIONS_COUNT_MAX 8 -#define PARAM_DRC_INSTANCE_COUNT_MAX 8 +#define PARAM_DRC_INSTANCE_COUNT_MAX 8 -#define PARAM_DRC_TYPE_FF 0x0 +#define PARAM_DRC_TYPE_FF 0x0 #define PARAM_DRC_TYPE_FF_NODE_COUNT_MAX 9 #define PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX 64 -#define PARAM_DRC_TYPE_LIM 0x1 -#define PARAM_DRC_TYPE_LIM_THRESHOLD_DEFAULT (-1.f) -#define PARAM_DRC_TYPE_LIM_ATTACK_DEFAULT 5 -#define PARAM_DRC_TYPE_LIM_RELEASE_DEFAULT 50 - - -#define UNIDRCCONFEXT_V1 0x2 -#define UNIDRCLOUDEXT_EQ 0x1 -#define UNIDRCINTERFACEEXT_EQ 0x1 - -#define LOUD_EQ_REQUEST_OFF 0x0 -#define LOUD_EQ_REQUEST_LIGHT 0x1 -#define LOUD_EQ_REQUEST_REGULAR 0x2 -#define LOUD_EQ_REQUEST_HEAVY 0x3 +#define PARAM_DRC_TYPE_LIM 0x1 +#define PARAM_DRC_TYPE_LIM_THRESHOLD_DEFAULT (-1.f) +#define PARAM_DRC_TYPE_LIM_ATTACK_DEFAULT 5 +#define PARAM_DRC_TYPE_LIM_RELEASE_DEFAULT 50 -#define EQ_PURPOSE_EQ_OFF 0 -#define EQ_PURPOSE_DEFAULT (1<<0) -#define EQ_PURPOSE_LARGE_ROOM (1<<1) -#define EQ_PURPOSE_SMALL_SPACE (1<<2) -#define EQ_PURPOSE_AVERAGE_ROOM (1<<3) -#define EQ_PURPOSE_CAR_CABIN (1<<4) -#define EQ_PURPOSE_HEADPHONES (1<<5) -#define EQ_PURPOSE_LATE_NIGHT (1<<6) +#define UNIDRCCONFEXT_V1 0x2 +#define UNIDRCLOUDEXT_EQ 0x1 +#define UNIDRCINTERFACEEXT_EQ 0x1 +#define LOUD_EQ_REQUEST_OFF 0x0 +#define LOUD_EQ_REQUEST_LIGHT 0x1 +#define LOUD_EQ_REQUEST_REGULAR 0x2 +#define LOUD_EQ_REQUEST_HEAVY 0x3 +#define EQ_PURPOSE_EQ_OFF 0 +#define EQ_PURPOSE_DEFAULT (1 << 0) +#define EQ_PURPOSE_LARGE_ROOM (1 << 1) +#define EQ_PURPOSE_SMALL_SPACE (1 << 2) +#define EQ_PURPOSE_AVERAGE_ROOM (1 << 3) +#define EQ_PURPOSE_CAR_CABIN (1 << 4) +#define EQ_PURPOSE_HEADPHONES (1 << 5) +#define EQ_PURPOSE_LATE_NIGHT (1 << 6) -#define MAXPACKETLOSSTIME 2.5f +#define MAXPACKETLOSSTIME 2.5f -#define SLOPE_FACTOR_DB_TO_LINEAR 0.1151f +#define SLOPE_FACTOR_DB_TO_LINEAR 0.1151f #ifndef min #define min(a, b) ((a) < (b) ? (a) : (b)) @@ -188,31 +182,29 @@ extern "C" #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; - - - FLOAT32 mixing_level; - WORD32 sel_eq_set_ids[SELECTED_EQ_SET_COUNT_MAX]; - WORD32 sel_loud_eq_id; +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; + + FLOAT32 mixing_level; + WORD32 sel_eq_set_ids[SELECTED_EQ_SET_COUNT_MAX]; + WORD32 sel_loud_eq_id; } ia_drc_sel_proc_output_struct; #ifdef __cplusplus diff --git a/decoder/drc_src/impd_drc_config_params.h b/decoder/drc_src/impd_drc_config_params.h index b23ed36..e83385a 100644 --- a/decoder/drc_src/impd_drc_config_params.h +++ b/decoder/drc_src/impd_drc_config_params.h @@ -21,25 +21,24 @@ #ifndef IMPD_DRC_CONFIG_PARAMS_H #define IMPD_DRC_CONFIG_PARAMS_H - -#define IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ 0x0000 -#define IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ 0x0001 -#define IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS 0x0002 -#define IA_DRC_DEC_CONFIG_PARAM_DEC_TYPE 0x0003 -#define IA_DRC_DEC_CONFIG_PARAM_PEAK_LIMITER 0x0004 -#define IA_DRC_DEC_CONFIG_PARAM_CTRL_PARAM 0x0005 -#define IA_DRC_DEC_CONFIG_PARAM_VER_MODE 0x0006 -#define IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT 0x0007 -#define IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT 0x0008 -#define IA_DRC_DEC_CONFIG_PARAM_DELAY_MODE 0x0009 -#define IA_DRC_DEC_CONFIG_PARAM_GAIN_DELAY 0x000A -#define IA_DRC_DEC_CONFIG_PARAM_AUDIO_DELAY 0x000B -#define IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE 0x000C -#define IA_DRC_DEC_CONFIG_PARAM_ABSO_DELAY_OFF 0x000D -#define IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE 0x000E -#define IA_DRC_DEC_CONFIG_PROC_OUT_PTR 0x000F -#define IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG 0x0010 -#define IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE 0x0011 -#define IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS 0x0012 -#define IA_DRC_DEC_CONFIG_DRC_LOUD_NORM 0x0013 +#define IA_DRC_DEC_CONFIG_PARAM_PCM_WDSZ 0x0000 +#define IA_DRC_DEC_CONFIG_PARAM_SAMP_FREQ 0x0001 +#define IA_DRC_DEC_CONFIG_PARAM_NUM_CHANNELS 0x0002 +#define IA_DRC_DEC_CONFIG_PARAM_DEC_TYPE 0x0003 +#define IA_DRC_DEC_CONFIG_PARAM_PEAK_LIMITER 0x0004 +#define IA_DRC_DEC_CONFIG_PARAM_CTRL_PARAM 0x0005 +#define IA_DRC_DEC_CONFIG_PARAM_VER_MODE 0x0006 +#define IA_DRC_DEC_CONFIG_PARAM_BITS_FORMAT 0x0007 +#define IA_DRC_DEC_CONFIG_PARAM_INT_PRESENT 0x0008 +#define IA_DRC_DEC_CONFIG_PARAM_DELAY_MODE 0x0009 +#define IA_DRC_DEC_CONFIG_PARAM_GAIN_DELAY 0x000A +#define IA_DRC_DEC_CONFIG_PARAM_AUDIO_DELAY 0x000B +#define IA_DRC_DEC_CONFIG_PARAM_CON_DELAY_MODE 0x000C +#define IA_DRC_DEC_CONFIG_PARAM_ABSO_DELAY_OFF 0x000D +#define IA_DRC_DEC_CONFIG_PARAM_FRAME_SIZE 0x000E +#define IA_DRC_DEC_CONFIG_PROC_OUT_PTR 0x000F +#define IA_DRC_DEC_CONFIG_GAIN_STREAM_FLAG 0x0010 +#define IA_DRC_DEC_CONFIG_DRC_EFFECT_TYPE 0x0011 +#define IA_DRC_DEC_CONFIG_DRC_TARGET_LOUDNESS 0x0012 +#define IA_DRC_DEC_CONFIG_DRC_LOUD_NORM 0x0013 #endif diff --git a/decoder/drc_src/impd_drc_dec.c b/decoder/drc_src/impd_drc_dec.c index 0e32e46..32da663 100644 --- a/decoder/drc_src/impd_drc_dec.c +++ b/decoder/drc_src/impd_drc_dec.c @@ -27,352 +27,341 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_multi_band.h" +WORD32 impd_init_drc_params(WORD32 frame_size, WORD32 sample_rate, + WORD32 gain_delay_samples, WORD32 delay_mode, + WORD32 sub_band_domain_mode, + ia_drc_params_struct* ia_drc_params_struct) { + WORD32 k; + if (frame_size < 1 || frame_size > AUDIO_CODEC_FRAME_SIZE_MAX) { + return -1; + } -WORD32 impd_init_drc_params(WORD32 frame_size, - WORD32 sample_rate, - WORD32 gain_delay_samples, - WORD32 delay_mode, - WORD32 sub_band_domain_mode, - ia_drc_params_struct* ia_drc_params_struct) -{ - WORD32 k; - if (frame_size < 1|| frame_size > AUDIO_CODEC_FRAME_SIZE_MAX) - { - return -1; - } + if (sample_rate < 1000) { + return -1; + } - if (sample_rate < 1000) - { - return -1; - } + ia_drc_params_struct->drc_frame_size = frame_size; - ia_drc_params_struct->drc_frame_size = frame_size; + if (ia_drc_params_struct->drc_frame_size < 0.001f * sample_rate) { + return -1; + } - if (ia_drc_params_struct->drc_frame_size < 0.001f * sample_rate) - { - return -1; - } + ia_drc_params_struct->sample_rate = sample_rate; - ia_drc_params_struct->sample_rate = sample_rate; + ia_drc_params_struct->delta_tmin_default = impd_get_delta_tmin(sample_rate); - ia_drc_params_struct->delta_tmin_default = impd_get_delta_tmin(sample_rate); + if (ia_drc_params_struct->delta_tmin_default > + ia_drc_params_struct->drc_frame_size) { + return -1; + } - if (ia_drc_params_struct->delta_tmin_default > ia_drc_params_struct->drc_frame_size) - { - return -1; - } + if ((delay_mode != DELAY_MODE_REGULAR_DELAY) && + (delay_mode != DELAY_MODE_LOW_DELAY)) { + return -1; + } - if ((delay_mode != DELAY_MODE_REGULAR_DELAY) && (delay_mode != DELAY_MODE_LOW_DELAY)) - { - return -1; - } + ia_drc_params_struct->delay_mode = delay_mode; - ia_drc_params_struct->delay_mode = delay_mode; + ia_drc_params_struct->drc_set_counter = 0; + ia_drc_params_struct->multiband_sel_drc_idx = -1; - ia_drc_params_struct->drc_set_counter = 0; - ia_drc_params_struct->multiband_sel_drc_idx = -1; + for (k = 0; k < SEL_DRC_COUNT; k++) { + ia_drc_params_struct->sel_drc_array[k].drc_instructions_index = -1; + ia_drc_params_struct->sel_drc_array[k].dwnmix_instructions_index = -1; + ia_drc_params_struct->sel_drc_array[k].drc_coeff_idx = -1; + } - for (k = 0; k < SEL_DRC_COUNT; k++) - { - ia_drc_params_struct->sel_drc_array[k].drc_instructions_index = -1; - ia_drc_params_struct->sel_drc_array[k].dwnmix_instructions_index = -1; - ia_drc_params_struct->sel_drc_array[k].drc_coeff_idx = -1; - } + if ((gain_delay_samples > MAX_SIGNAL_DELAY) || (gain_delay_samples < 0)) { + return -1; + } else { + ia_drc_params_struct->gain_delay_samples = gain_delay_samples; + } - if ((gain_delay_samples > MAX_SIGNAL_DELAY) || (gain_delay_samples < 0)) - { - return -1; - } - else - { - ia_drc_params_struct->gain_delay_samples = gain_delay_samples; - } - - switch (sub_band_domain_mode) - { + switch (sub_band_domain_mode) { case SUBBAND_DOMAIN_MODE_OFF: case SUBBAND_DOMAIN_MODE_QMF64: case SUBBAND_DOMAIN_MODE_QMF71: case SUBBAND_DOMAIN_MODE_STFT256: - ia_drc_params_struct->sub_band_domain_mode = sub_band_domain_mode; - break; + ia_drc_params_struct->sub_band_domain_mode = sub_band_domain_mode; + break; default: - return -1; - break; - } + return -1; + break; + } - ia_drc_params_struct->parametric_drc_delay = 0; - ia_drc_params_struct->eq_delay = 0; + ia_drc_params_struct->parametric_drc_delay = 0; + ia_drc_params_struct->eq_delay = 0; - return 0; + return 0; } - -WORD32 impd_select_drc_coefficients(ia_drc_config* drc_config, - ia_uni_drc_coeffs_struct** drc_coefficients_drc, - WORD32* drc_coefficients_selected) -{ - WORD32 i; - WORD32 cof1 = -1; - WORD32 cof0 = -1; - for(i=0; i<drc_config->drc_coefficients_drc_count; i++) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].drc_location == 1) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].version == 0) - { - cof0 = i; - *drc_coefficients_selected = cof0; - } - else - { - cof1 = i; - *drc_coefficients_selected = cof1; - } - } - } - - - if (cof1 >= 0) { - *drc_coefficients_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[cof1]); +WORD32 impd_select_drc_coefficients( + ia_drc_config* drc_config, ia_uni_drc_coeffs_struct** drc_coefficients_drc, + WORD32* drc_coefficients_selected) { + WORD32 i; + WORD32 cof1 = -1; + WORD32 cof0 = -1; + for (i = 0; i < drc_config->drc_coefficients_drc_count; i++) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].drc_location == 1) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].version == 0) { + cof0 = i; + *drc_coefficients_selected = cof0; + } else { + cof1 = i; + *drc_coefficients_selected = cof1; + } } - else if (cof0 >= 0) { - *drc_coefficients_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[cof0]); - } - else { - *drc_coefficients_drc = NULL; - } - - - return 0; + } + + if (cof1 >= 0) { + *drc_coefficients_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[cof1]); + } else if (cof0 >= 0) { + *drc_coefficients_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[cof0]); + } else { + *drc_coefficients_drc = NULL; + } + + return 0; } - -WORD32 impd_init_selected_drc_set(ia_drc_config* drc_config, - ia_drc_params_struct* ia_drc_params_struct, - ia_parametric_drc_params_struct* p_parametric_drc_params, - WORD32 audio_num_chan, - WORD32 drc_set_id_selected, - WORD32 downmix_id_selected, - ia_filter_banks_struct* ia_filter_banks_struct, - ia_overlap_params_struct* pstr_overlap_params - - , shape_filter_block* shape_filter_block - ) -{ - WORD32 g, n, c, err = 0; - WORD32 channel_count = 0; - WORD32 i; - - ia_drc_instructions_struct* drc_instructions_uni_drc = NULL; - ia_uni_drc_coeffs_struct* drc_coefficients_uni_drc = NULL; - WORD32 selected_drc_is_multiband = 0; - WORD32 drc_instructions_selected = -1; - WORD32 downmix_instructions_selected = -1; - WORD32 drc_coefficients_selected = -1; - p_parametric_drc_params->parametric_drc_instance_count = 0; - - if (drc_config->drc_coefficients_drc_count && drc_config->str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc->drc_frame_size != ia_drc_params_struct->drc_frame_size) - { - return -1; - } - } - - - for(n=0; n<drc_config->drc_instructions_count_plus; n++) - { - if (drc_config->str_drc_instruction_str[n].drc_set_id == drc_set_id_selected) - break; - } - if (n == drc_config->drc_instructions_count_plus) - { - return -1; +WORD32 impd_init_selected_drc_set( + ia_drc_config* drc_config, ia_drc_params_struct* ia_drc_params_struct, + ia_parametric_drc_params_struct* p_parametric_drc_params, + WORD32 audio_num_chan, WORD32 drc_set_id_selected, + WORD32 downmix_id_selected, ia_filter_banks_struct* ia_filter_banks_struct, + ia_overlap_params_struct* pstr_overlap_params + + , + shape_filter_block* shape_filter_block) { + WORD32 g, n, c, err = 0; + WORD32 channel_count = 0; + WORD32 i; + + ia_drc_instructions_struct* drc_instructions_uni_drc = NULL; + ia_uni_drc_coeffs_struct* drc_coefficients_uni_drc = NULL; + WORD32 selected_drc_is_multiband = 0; + WORD32 drc_instructions_selected = -1; + WORD32 downmix_instructions_selected = -1; + WORD32 drc_coefficients_selected = -1; + p_parametric_drc_params->parametric_drc_instance_count = 0; + + if (drc_config->drc_coefficients_drc_count && + drc_config->str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc->drc_frame_size != + ia_drc_params_struct->drc_frame_size) { + return -1; } - drc_instructions_selected = n; - drc_instructions_uni_drc = &(drc_config->str_drc_instruction_str[drc_instructions_selected]); - - if (downmix_id_selected == ID_FOR_BASE_LAYOUT) - { - channel_count = drc_config->channel_layout.base_channel_count; + } + + for (n = 0; n < drc_config->drc_instructions_count_plus; n++) { + if (drc_config->str_drc_instruction_str[n].drc_set_id == + drc_set_id_selected) + break; + } + if (n == drc_config->drc_instructions_count_plus) { + return -1; + } + drc_instructions_selected = n; + drc_instructions_uni_drc = + &(drc_config->str_drc_instruction_str[drc_instructions_selected]); + + if (downmix_id_selected == ID_FOR_BASE_LAYOUT) { + channel_count = drc_config->channel_layout.base_channel_count; + } else if (downmix_id_selected == ID_FOR_ANY_DOWNMIX) { + channel_count = audio_num_chan; + } else { + for (n = 0; n < drc_config->dwnmix_instructions_count; n++) { + if (drc_config->dwnmix_instructions[n].downmix_id == downmix_id_selected) + break; } - else if (downmix_id_selected == ID_FOR_ANY_DOWNMIX) - { - channel_count = audio_num_chan; + if (n == drc_config->dwnmix_instructions_count) { + return (UNEXPECTED_ERROR); } - else - { - for(n=0; n<drc_config->dwnmix_instructions_count; n++) - { - if (drc_config->dwnmix_instructions[n].downmix_id == downmix_id_selected) - break; - } - if (n == drc_config->dwnmix_instructions_count) - { - return (UNEXPECTED_ERROR); - } - channel_count = drc_config->dwnmix_instructions[n].target_channel_count; - - downmix_instructions_selected = n; + channel_count = drc_config->dwnmix_instructions[n].target_channel_count; + + downmix_instructions_selected = n; + } + drc_instructions_uni_drc->audio_num_chan = channel_count; + + if (drc_instructions_uni_drc->drc_set_id <= 0) { + drc_coefficients_selected = 0; + } else { + err = impd_select_drc_coefficients(drc_config, &drc_coefficients_uni_drc, + &drc_coefficients_selected); + } + + ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter] + .drc_instructions_index = drc_instructions_selected; + ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter] + .dwnmix_instructions_index = downmix_instructions_selected; + ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter] + .drc_coeff_idx = drc_coefficients_selected; + + if ((drc_instructions_uni_drc->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || + (drc_instructions_uni_drc->dwnmix_id_count > 1)) { + WORD32 idx = drc_instructions_uni_drc->gain_set_index[0]; + for (c = 0; c < drc_instructions_uni_drc->audio_num_chan; c++) { + drc_instructions_uni_drc->channel_group_of_ch[c] = (idx >= 0) ? 0 : -1; } - drc_instructions_uni_drc->audio_num_chan = channel_count; - - if (drc_instructions_uni_drc->drc_set_id <= 0) - { - drc_coefficients_selected = 0; + } + + for (g = 0; g < drc_instructions_uni_drc->num_drc_ch_groups; g++) { + drc_instructions_uni_drc->num_chan_per_ch_group[g] = 0; + for (c = 0; c < drc_instructions_uni_drc->audio_num_chan; c++) { + if (drc_instructions_uni_drc->channel_group_of_ch[c] == g) { + drc_instructions_uni_drc->num_chan_per_ch_group[g]++; + } } - else - { - err = impd_select_drc_coefficients(drc_config, &drc_coefficients_uni_drc, &drc_coefficients_selected); + } + + if (drc_instructions_uni_drc->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { + drc_instructions_uni_drc->multiband_audio_sig_count = + drc_instructions_uni_drc->audio_num_chan; + } else { + drc_instructions_uni_drc->multiband_audio_sig_count = 0; + for (c = 0; c < drc_instructions_uni_drc->audio_num_chan; c++) { + g = drc_instructions_uni_drc->channel_group_of_ch[c]; + if (g < 0) { + drc_instructions_uni_drc->multiband_audio_sig_count++; + } else { + drc_instructions_uni_drc->multiband_audio_sig_count += + drc_instructions_uni_drc->band_count_of_ch_group[g]; + } } + } - ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter].drc_instructions_index = drc_instructions_selected; - ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter].dwnmix_instructions_index = downmix_instructions_selected; - ia_drc_params_struct->sel_drc_array[ia_drc_params_struct->drc_set_counter].drc_coeff_idx = drc_coefficients_selected; - - if ((drc_instructions_uni_drc->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || (drc_instructions_uni_drc->dwnmix_id_count > 1)) - { - WORD32 idx = drc_instructions_uni_drc->gain_set_index[0]; - for (c=0; c<drc_instructions_uni_drc->audio_num_chan; c++) - { - drc_instructions_uni_drc->channel_group_of_ch[c] = (idx >= 0) ? 0 : -1; - } + for (g = 0; g < drc_instructions_uni_drc->num_drc_ch_groups; g++) { + if (g == 0) { + drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max = 0; } - - for (g=0; g<drc_instructions_uni_drc->num_drc_ch_groups; g++) { - drc_instructions_uni_drc->num_chan_per_ch_group[g] = 0; - for (c=0; c<drc_instructions_uni_drc->audio_num_chan; c++) { - if (drc_instructions_uni_drc->channel_group_of_ch[c] == g) { - drc_instructions_uni_drc->num_chan_per_ch_group[g]++; - } + if (drc_instructions_uni_drc->ch_group_parametric_drc_flag[g] == 0) { + if (drc_instructions_uni_drc->band_count_of_ch_group[g] > 1) { + if (ia_drc_params_struct->multiband_sel_drc_idx != -1) { + return (UNEXPECTED_ERROR); } - } - - if (drc_instructions_uni_drc->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { - drc_instructions_uni_drc->multiband_audio_sig_count = drc_instructions_uni_drc->audio_num_chan; + selected_drc_is_multiband = 1; + } } else { - drc_instructions_uni_drc->multiband_audio_sig_count = 0; - for (c=0; c<drc_instructions_uni_drc->audio_num_chan; c++) { - g = drc_instructions_uni_drc->channel_group_of_ch[c]; - if (g < 0) { - drc_instructions_uni_drc->multiband_audio_sig_count++; - } else { - drc_instructions_uni_drc->multiband_audio_sig_count += drc_instructions_uni_drc->band_count_of_ch_group[g]; - } + WORD32 gain_set_index = + drc_instructions_uni_drc->gain_set_idx_of_ch_group_parametric_drc[g]; + WORD32 parametric_drc_id = + drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params[gain_set_index] + .parametric_drc_id; + WORD32 parametric_drc_look_ahead_samples = 0; + ia_parametric_drc_instructions_struct* str_parametric_drc_instructions; + + for (i = 0; + i < drc_config->str_drc_config_ext.parametric_drc_instructions_count; + i++) { + if (parametric_drc_id == + drc_config->str_drc_config_ext.str_parametric_drc_instructions[i] + .parametric_drc_id) + break; + } + if (i == + drc_config->str_drc_config_ext.parametric_drc_instructions_count) { + return (UNEXPECTED_ERROR); + } + str_parametric_drc_instructions = + &drc_config->str_drc_config_ext.str_parametric_drc_instructions[i]; + + p_parametric_drc_params->parametric_drc_idx + [p_parametric_drc_params->parametric_drc_instance_count] = i; + p_parametric_drc_params->gain_set_index + [p_parametric_drc_params->parametric_drc_instance_count] = + gain_set_index; + if (drc_instructions_uni_drc->drc_apply_to_dwnmix == 0) { + p_parametric_drc_params->dwnmix_id_from_drc_instructions + [p_parametric_drc_params->parametric_drc_instance_count] = + ID_FOR_BASE_LAYOUT; + } else { + if (drc_instructions_uni_drc->dwnmix_id_count > 1) { + p_parametric_drc_params->dwnmix_id_from_drc_instructions + [p_parametric_drc_params->parametric_drc_instance_count] = + ID_FOR_ANY_DOWNMIX; + } else { + p_parametric_drc_params->dwnmix_id_from_drc_instructions + [p_parametric_drc_params->parametric_drc_instance_count] = + drc_instructions_uni_drc->downmix_id[0]; } - } - - for (g=0; g<drc_instructions_uni_drc->num_drc_ch_groups; g++) - { - if (g==0) { - drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max = 0; + } + p_parametric_drc_params->audio_num_chan = channel_count; + for (i = 0; i < p_parametric_drc_params->audio_num_chan; i++) { + if (drc_instructions_uni_drc->channel_group_of_ch[i] == g) { + p_parametric_drc_params->channel_map + [p_parametric_drc_params->parametric_drc_instance_count][i] = 1; + } else { + p_parametric_drc_params->channel_map + [p_parametric_drc_params->parametric_drc_instance_count][i] = 0; } - if (drc_instructions_uni_drc->ch_group_parametric_drc_flag[g] == 0) { - if (drc_instructions_uni_drc->band_count_of_ch_group[g] > 1) - { - if (ia_drc_params_struct->multiband_sel_drc_idx != -1) - { - return (UNEXPECTED_ERROR); - } - selected_drc_is_multiband = 1; - } + } + drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g] = 0; + if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { + parametric_drc_look_ahead_samples = (WORD32)( + (FLOAT32) + str_parametric_drc_instructions->parametric_drc_look_ahead * + (FLOAT32)p_parametric_drc_params->sampling_rate * 0.001f); + } else { + if (str_parametric_drc_instructions->parametric_drc_type == + PARAM_DRC_TYPE_FF) { + parametric_drc_look_ahead_samples = (WORD32)( + 10.0f * (FLOAT32)p_parametric_drc_params->sampling_rate * 0.001f); + } else if (str_parametric_drc_instructions->parametric_drc_type == + PARAM_DRC_TYPE_LIM) { + parametric_drc_look_ahead_samples = (WORD32)( + 5.0f * (FLOAT32)p_parametric_drc_params->sampling_rate * 0.001f); } else { - WORD32 gain_set_index = drc_instructions_uni_drc->gain_set_idx_of_ch_group_parametric_drc[g]; - WORD32 parametric_drc_id = drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[gain_set_index].parametric_drc_id; - WORD32 parametric_drc_look_ahead_samples = 0; - ia_parametric_drc_instructions_struct* str_parametric_drc_instructions; - - for(i=0; i<drc_config->str_drc_config_ext.parametric_drc_instructions_count; i++) - { - if (parametric_drc_id == drc_config->str_drc_config_ext.str_parametric_drc_instructions[i].parametric_drc_id) break; - } - if (i == drc_config->str_drc_config_ext.parametric_drc_instructions_count) - { - return (UNEXPECTED_ERROR); - } - str_parametric_drc_instructions = &drc_config->str_drc_config_ext.str_parametric_drc_instructions[i]; - - p_parametric_drc_params->parametric_drc_idx[p_parametric_drc_params->parametric_drc_instance_count] = i; - p_parametric_drc_params->gain_set_index[p_parametric_drc_params->parametric_drc_instance_count] = gain_set_index; - if (drc_instructions_uni_drc->drc_apply_to_dwnmix == 0) { - p_parametric_drc_params->dwnmix_id_from_drc_instructions[p_parametric_drc_params->parametric_drc_instance_count] = ID_FOR_BASE_LAYOUT; - } else { - if (drc_instructions_uni_drc->dwnmix_id_count > 1) { - p_parametric_drc_params->dwnmix_id_from_drc_instructions[p_parametric_drc_params->parametric_drc_instance_count] = ID_FOR_ANY_DOWNMIX; - } else { - p_parametric_drc_params->dwnmix_id_from_drc_instructions[p_parametric_drc_params->parametric_drc_instance_count] = drc_instructions_uni_drc->downmix_id[0]; - } - } - p_parametric_drc_params->audio_num_chan = channel_count; - for (i=0; i<p_parametric_drc_params->audio_num_chan;i++) { - if (drc_instructions_uni_drc->channel_group_of_ch[i] == g) { - p_parametric_drc_params->channel_map[p_parametric_drc_params->parametric_drc_instance_count][i] = 1; - } else { - p_parametric_drc_params->channel_map[p_parametric_drc_params->parametric_drc_instance_count][i] = 0; - } - } - drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g] = 0; - if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { - parametric_drc_look_ahead_samples = (WORD32)((FLOAT32)str_parametric_drc_instructions->parametric_drc_look_ahead*(FLOAT32)p_parametric_drc_params->sampling_rate*0.001f); - } else { - if (str_parametric_drc_instructions->parametric_drc_type == PARAM_DRC_TYPE_FF) - { - parametric_drc_look_ahead_samples = (WORD32)(10.0f*(FLOAT32)p_parametric_drc_params->sampling_rate*0.001f); - } - else if (str_parametric_drc_instructions->parametric_drc_type == PARAM_DRC_TYPE_LIM) - { - parametric_drc_look_ahead_samples = (WORD32)(5.0f*(FLOAT32)p_parametric_drc_params->sampling_rate*0.001f); - } else - { - return (UNEXPECTED_ERROR); - } - } - drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g] = parametric_drc_look_ahead_samples; - if (drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max < drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g]) - { - drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max = drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g]; - } - p_parametric_drc_params->parametric_drc_instance_count += 1; - selected_drc_is_multiband = 0; + return (UNEXPECTED_ERROR); } + } + drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g] = + parametric_drc_look_ahead_samples; + if (drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max < + drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g]) { + drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max = + drc_instructions_uni_drc->parametric_drc_look_ahead_samples[g]; + } + p_parametric_drc_params->parametric_drc_instance_count += 1; + selected_drc_is_multiband = 0; } - ia_drc_params_struct->parametric_drc_delay += drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max; - - if (selected_drc_is_multiband == 1) - { - ia_drc_params_struct->multiband_sel_drc_idx = ia_drc_params_struct->drc_set_counter; - err = impd_init_all_filter_banks(drc_coefficients_uni_drc, - &(drc_config->str_drc_instruction_str[drc_instructions_selected]), - ia_filter_banks_struct); - if (err) - return (err); - - err = 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; - for (g=0; g<drc_instructions_uni_drc->num_drc_ch_groups; g++) - { - if (gain_modifiers[g].shape_filter_flag == 1) - { - impd_shape_filt_block_init(&drc_coefficients_uni_drc->str_shape_filter_block_params[gain_modifiers[g].shape_filter_idx], - &shape_filter_block[g]); - } - else - { - shape_filter_block[g].shape_flter_block_flag = 0; - } - } + } + ia_drc_params_struct->parametric_drc_delay += + drc_instructions_uni_drc->parametric_drc_look_ahead_samples_max; + + if (selected_drc_is_multiband == 1) { + ia_drc_params_struct->multiband_sel_drc_idx = + ia_drc_params_struct->drc_set_counter; + err = impd_init_all_filter_banks( + drc_coefficients_uni_drc, + &(drc_config->str_drc_instruction_str[drc_instructions_selected]), + ia_filter_banks_struct); + if (err) return (err); + + err = 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; + for (g = 0; g < drc_instructions_uni_drc->num_drc_ch_groups; g++) { + if (gain_modifiers[g].shape_filter_flag == 1) { + impd_shape_filt_block_init( + &drc_coefficients_uni_drc->str_shape_filter_block_params + [gain_modifiers[g].shape_filter_idx], + &shape_filter_block[g]); + } else { + shape_filter_block[g].shape_flter_block_flag = 0; + } } + } - ia_drc_params_struct->drc_set_counter++; + ia_drc_params_struct->drc_set_counter++; - return (0); + return (0); } diff --git a/decoder/drc_src/impd_drc_dec.h b/decoder/drc_src/impd_drc_dec.h index 5e93e4b..dbe0912 100644 --- a/decoder/drc_src/impd_drc_dec.h +++ b/decoder/drc_src/impd_drc_dec.h @@ -20,35 +20,28 @@ #ifndef IMPD_DRC_DEC_H #define IMPD_DRC_DEC_H -WORD32 impd_init_drc_params(WORD32 frame_size, - WORD32 sample_rate, - WORD32 gain_delay_samples, - WORD32 delay_mode, - WORD32 sub_band_domain_mode, - ia_drc_params_struct* ia_drc_params_struct); - - -WORD32 impd_init_selected_drc_set(ia_drc_config* drc_config, - ia_drc_params_struct* ia_drc_params_struct, - ia_parametric_drc_params_struct* p_parametricdrc_params, - WORD32 audio_num_chan, - WORD32 drc_set_id_selected, - WORD32 downmix_id_selected, - ia_filter_banks_struct* ia_filter_banks_struct, - ia_overlap_params_struct* pstr_overlap_params - - , shape_filter_block* shape_filter_block - ); - -WORD32 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, - ia_gain_buffer_struct* pstr_gain_buf, - shape_filter_block shape_filter_block[], - FLOAT32* deinterleaved_audio[], - - FLOAT32* channel_audio[], - WORD32 impd_apply_gains); - +WORD32 impd_init_drc_params(WORD32 frame_size, WORD32 sample_rate, + WORD32 gain_delay_samples, WORD32 delay_mode, + WORD32 sub_band_domain_mode, + ia_drc_params_struct* ia_drc_params_struct); + +WORD32 impd_init_selected_drc_set( + ia_drc_config* drc_config, ia_drc_params_struct* ia_drc_params_struct, + ia_parametric_drc_params_struct* p_parametricdrc_params, + WORD32 audio_num_chan, WORD32 drc_set_id_selected, + WORD32 downmix_id_selected, ia_filter_banks_struct* ia_filter_banks_struct, + ia_overlap_params_struct* pstr_overlap_params + + , + shape_filter_block* shape_filter_block); + +WORD32 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, + ia_gain_buffer_struct* pstr_gain_buf, + shape_filter_block shape_filter_block[], FLOAT32* deinterleaved_audio[], + + FLOAT32* channel_audio[], WORD32 impd_apply_gains); #endif diff --git a/decoder/drc_src/impd_drc_definitions.h b/decoder/drc_src/impd_drc_definitions.h index f1dd0bc..1f823e3 100644 --- a/decoder/drc_src/impd_drc_definitions.h +++ b/decoder/drc_src/impd_drc_definitions.h @@ -18,21 +18,17 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ - #ifndef IMPD_DRC_DEFINITIONS_H #define IMPD_DRC_DEFINITIONS_H +#define LIBNAME "IA_DRC" +#define LIB_APIVERSION 1 +#define IA_DRC_PERSIST_IDX (0) +#define IA_DRC_SCRATCH_IDX (1) +#define IA_DRC_INPUT_IDX (2) +#define IA_DRC_OUTPUT_IDX (3) -#define LIBNAME "IA_DRC" -#define LIB_APIVERSION 1 - - -#define IA_DRC_PERSIST_IDX (0) -#define IA_DRC_SCRATCH_IDX (1) -#define IA_DRC_INPUT_IDX (2) -#define IA_DRC_OUTPUT_IDX (3) - -#define FRAME_SIZE 512 +#define FRAME_SIZE 512 #endif diff --git a/decoder/drc_src/impd_drc_dynamic_payload.c b/decoder/drc_src/impd_drc_dynamic_payload.c index 0ac55c0..70fa829 100644 --- a/decoder/drc_src/impd_drc_dynamic_payload.c +++ b/decoder/drc_src/impd_drc_dynamic_payload.c @@ -29,1499 +29,1310 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" -WORD32 impd_parse_loud_eq_instructions(ia_bit_buf_struct* it_bit_buff, - ia_loud_eq_instructions_struct* loud_eq_instructions); +WORD32 impd_parse_loud_eq_instructions( + ia_bit_buf_struct* it_bit_buff, + ia_loud_eq_instructions_struct* loud_eq_instructions); WORD32 impd_parse_eq_coefficients(ia_bit_buf_struct* it_bit_buff, ia_eq_coeff_struct* str_eq_coeff); -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 impd_parse_eq_instructions( + ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, + ia_eq_instructions_struct* str_eq_instructions); WORD32 impd_dec_initial_gain(ia_bit_buf_struct* it_bit_buff, const WORD32 gain_coding_profile, - FLOAT32* initial_gain) -{ - WORD32 sign, magn,bit_2_extract; - switch (gain_coding_profile) - { + FLOAT32* initial_gain) { + WORD32 sign, magn, bit_2_extract; + switch (gain_coding_profile) { case GAIN_CODING_PROFILE_REGULAR: - sign = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - magn = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - *initial_gain = magn * 0.125f; - if (sign) *initial_gain = - *initial_gain; - break; + sign = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + magn = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + *initial_gain = magn * 0.125f; + if (sign) *initial_gain = -*initial_gain; + break; case GAIN_CODING_PROFILE_FADING: case GAIN_CODING_PROFILE_CLIPPING: - bit_2_extract= (gain_coding_profile==GAIN_CODING_PROFILE_FADING )?10:8; - sign = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (sign==0) *initial_gain = 0.0f; - else - { - magn = impd_read_bits_buf(it_bit_buff, bit_2_extract); - if(it_bit_buff->error) - return it_bit_buff->error; - *initial_gain = - (magn + 1) * 0.125f; - } - break; + bit_2_extract = + (gain_coding_profile == GAIN_CODING_PROFILE_FADING) ? 10 : 8; + sign = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (sign == 0) + *initial_gain = 0.0f; + else { + magn = impd_read_bits_buf(it_bit_buff, bit_2_extract); + if (it_bit_buff->error) return it_bit_buff->error; + *initial_gain = -(magn + 1) * 0.125f; + } + break; case GAIN_CODING_PROFILE_CONSTANT: - break; + break; default: - return(UNEXPECTED_ERROR); - } - return (0); + return (UNEXPECTED_ERROR); + } + return (0); } -WORD32 impd_dec_gains(ia_bit_buf_struct* it_bit_buff, - WORD32 no_nodes, - WORD32 gain_coding_profile, - ia_node_struct* str_node) -{ - WORD32 err = 0, k, e, m; - WORD32 bit; - WORD32 num_bits_read; - WORD32 code; - WORD32 code_found; - FLOAT32 drc_gain_delta = 0; - const ia_delta_gain_code_table_struct *ptr_delta_gain_code_table; - WORD32 no_delta_gain_entries; - - err = impd_dec_initial_gain(it_bit_buff, gain_coding_profile, &(str_node[0].loc_db_gain)); - if (err) return(err); - - impd_get_delta_gain_code_tbl(gain_coding_profile, &ptr_delta_gain_code_table, &no_delta_gain_entries); - for (k=1; k<no_nodes; k++) - { - num_bits_read = 0; - code = 0; - code_found = 0; - e = 0; - while ((e < no_delta_gain_entries) && (!code_found)) - { - for (m=0; m<ptr_delta_gain_code_table[e].size - num_bits_read; m++) - { - bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - code = (code << 1) + bit; - num_bits_read++; - } - while (num_bits_read == ptr_delta_gain_code_table[e].size) - { - if (code == ptr_delta_gain_code_table[e].code) - { - drc_gain_delta = ptr_delta_gain_code_table[e].value; - code_found = 1; - break; - } - e++; - } - } - if (code_found == 0) - { - return (UNEXPECTED_ERROR); +WORD32 impd_dec_gains(ia_bit_buf_struct* it_bit_buff, WORD32 no_nodes, + WORD32 gain_coding_profile, ia_node_struct* str_node) { + WORD32 err = 0, k, e, m; + WORD32 bit; + WORD32 num_bits_read; + WORD32 code; + WORD32 code_found; + FLOAT32 drc_gain_delta = 0; + const ia_delta_gain_code_table_struct* ptr_delta_gain_code_table; + WORD32 no_delta_gain_entries; + + err = impd_dec_initial_gain(it_bit_buff, gain_coding_profile, + &(str_node[0].loc_db_gain)); + if (err) return (err); + + impd_get_delta_gain_code_tbl(gain_coding_profile, &ptr_delta_gain_code_table, + &no_delta_gain_entries); + for (k = 1; k < no_nodes; k++) { + num_bits_read = 0; + code = 0; + code_found = 0; + e = 0; + while ((e < no_delta_gain_entries) && (!code_found)) { + for (m = 0; m < ptr_delta_gain_code_table[e].size - num_bits_read; m++) { + bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + code = (code << 1) + bit; + num_bits_read++; + } + while (num_bits_read == ptr_delta_gain_code_table[e].size) { + if (code == ptr_delta_gain_code_table[e].code) { + drc_gain_delta = ptr_delta_gain_code_table[e].value; + code_found = 1; + break; } - str_node[k].loc_db_gain = str_node[k-1].loc_db_gain + drc_gain_delta; + e++; + } } - return (0); + if (code_found == 0) { + return (UNEXPECTED_ERROR); + } + str_node[k].loc_db_gain = str_node[k - 1].loc_db_gain + drc_gain_delta; + } + return (0); } -WORD32 impd_dec_slopes(ia_bit_buf_struct* it_bit_buff, - WORD32* no_nodes, +WORD32 impd_dec_slopes(ia_bit_buf_struct* it_bit_buff, WORD32* no_nodes, WORD32 gain_interpolation_type, - ia_node_struct* str_node) -{ - WORD32 k, e, m, bit; - WORD32 code; - WORD32 code_found; - FLOAT32 slope_value = 0; - bool end_marker = 0; - WORD32 num_bits_read; - const ia_slope_code_table_struct* ptr_slope_code_table; - WORD32 no_slope_code_entries; - - ptr_slope_code_table = &(slope_code_tbl_entries_by_size[0]); - no_slope_code_entries = NUM_SLOPE_TBL_ENTRIES; - - - k=0; - while(end_marker != 1) - { - k++; - end_marker = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - *no_nodes = k; - - if (gain_interpolation_type == GAIN_INTERPOLATION_TYPE_SPLINE) - { - for (k=0; k<*no_nodes; k++) - { - num_bits_read = 0; - code = 0; - code_found = 0; - e = 0; - while ((e < no_slope_code_entries) && (!code_found)) - { - for (m=0; m<ptr_slope_code_table[e].size - num_bits_read; m++) - { - bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - code = (code << 1) + bit; - num_bits_read++; - } - while (num_bits_read == ptr_slope_code_table[e].size) - { - if (code == ptr_slope_code_table[e].code) - { - slope_value = ptr_slope_code_table[e].value; - code_found = 1; - break; - } - e++; - } - } - str_node[k].slope = slope_value; + ia_node_struct* str_node) { + WORD32 k, e, m, bit; + WORD32 code; + WORD32 code_found; + FLOAT32 slope_value = 0; + bool end_marker = 0; + WORD32 num_bits_read; + const ia_slope_code_table_struct* ptr_slope_code_table; + WORD32 no_slope_code_entries; + + ptr_slope_code_table = &(slope_code_tbl_entries_by_size[0]); + no_slope_code_entries = NUM_SLOPE_TBL_ENTRIES; + + k = 0; + while (end_marker != 1) { + k++; + end_marker = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + *no_nodes = k; + + if (gain_interpolation_type == GAIN_INTERPOLATION_TYPE_SPLINE) { + for (k = 0; k < *no_nodes; k++) { + num_bits_read = 0; + code = 0; + code_found = 0; + e = 0; + while ((e < no_slope_code_entries) && (!code_found)) { + for (m = 0; m < ptr_slope_code_table[e].size - num_bits_read; m++) { + bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + code = (code << 1) + bit; + num_bits_read++; } - } - else - { - for (k=0; k<*no_nodes; k++) - { - str_node[k].slope = 0.0f; + while (num_bits_read == ptr_slope_code_table[e].size) { + if (code == ptr_slope_code_table[e].code) { + slope_value = ptr_slope_code_table[e].value; + code_found = 1; + break; + } + e++; } + } + str_node[k].slope = slope_value; + } + } else { + for (k = 0; k < *no_nodes; k++) { + str_node[k].slope = 0.0f; } - return(0); + } + return (0); } WORD32 impd_dec_times(ia_bit_buf_struct* it_bit_buff, - ia_tables_struct* str_tables, - WORD32 num_nodes, - WORD32 delta_tmin, - WORD32 drc_frame_size, - WORD32 full_frame, - WORD32 time_offset, - ia_node_struct* str_node) -{ - WORD32 k, e, m; - WORD32 bit; - WORD32 num_bits_read; - WORD32 code; - WORD32 code_found = 0; - WORD32 time_delta = 0; - WORD32 time_offs = time_offset; - ia_delta_time_code_table_entry_struct* delta_time_code_table = str_tables->delta_time_code_table; - bool frame_end_flag; - WORD32 node_time_tmp; - bool node_res_flag; - WORD32 exit_cnt; - if (full_frame == 0) - { - frame_end_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + ia_tables_struct* str_tables, WORD32 num_nodes, + WORD32 delta_tmin, WORD32 drc_frame_size, + WORD32 full_frame, WORD32 time_offset, + ia_node_struct* str_node) { + WORD32 k, e, m; + WORD32 bit; + WORD32 num_bits_read; + WORD32 code; + WORD32 code_found = 0; + WORD32 time_delta = 0; + WORD32 time_offs = time_offset; + ia_delta_time_code_table_entry_struct* delta_time_code_table = + str_tables->delta_time_code_table; + bool frame_end_flag; + WORD32 node_time_tmp; + bool node_res_flag; + WORD32 exit_cnt; + if (full_frame == 0) { + frame_end_flag = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + frame_end_flag = 1; + } + + if (frame_end_flag == 1) { + node_res_flag = 0; + for (k = 0; k < num_nodes - 1; k++) { + num_bits_read = 0; + code = 0; + code_found = 0; + exit_cnt = 0; + e = 1; + while ((e < N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX) && (!code_found)) { + exit_cnt++; + if (exit_cnt > 100000) { + return -1; + } + for (m = 0; m < delta_time_code_table[e].size - num_bits_read; m++) { + bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + code = (code << 1) + bit; + num_bits_read++; + } + while (num_bits_read == delta_time_code_table[e].size) { + if (code == delta_time_code_table[e].code) { + time_delta = delta_time_code_table[e].value; + code_found = 1; + break; + } + e++; + } + } + node_time_tmp = time_offs + time_delta * delta_tmin; + if (node_time_tmp > drc_frame_size + time_offset) { + if (node_res_flag == 0) { + str_node[k].time = drc_frame_size + time_offset; + node_res_flag = 1; + } + str_node[k + 1].time = node_time_tmp; + } else { + str_node[k].time = node_time_tmp; + } + time_offs = node_time_tmp; } - else - { - frame_end_flag = 1; + if (node_res_flag == 0) { + str_node[k].time = drc_frame_size + time_offset; } - - if (frame_end_flag == 1) - { - node_res_flag = 0; - for (k=0; k<num_nodes-1; k++) - { - num_bits_read = 0; - code = 0; - code_found = 0; - exit_cnt = 0; - e = 1; - while ((e < N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX) && (!code_found)) - { - exit_cnt++; - if (exit_cnt > 100000) { - return -1; - } - for (m=0; m<delta_time_code_table[e].size - num_bits_read; m++) - { - bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - code = (code << 1) + bit; - num_bits_read++; - } - while (num_bits_read == delta_time_code_table[e].size) - { - if (code == delta_time_code_table[e].code) - { - time_delta = delta_time_code_table[e].value; - code_found = 1; - break; - } - e++; - } - } - node_time_tmp = time_offs + time_delta * delta_tmin; - if (node_time_tmp > drc_frame_size + time_offset) - { - if (node_res_flag == 0) - { - str_node[k].time = drc_frame_size + time_offset; - node_res_flag = 1; - } - str_node[k+1].time = node_time_tmp; - } - else - { - str_node[k].time = node_time_tmp; - } - time_offs = node_time_tmp; + } else { + for (k = 0; k < num_nodes; k++) { + num_bits_read = 0; + code = 0; + code_found = 0; + e = 1; + exit_cnt = 0; + while ((e < N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX) && (!code_found)) { + exit_cnt++; + if (exit_cnt > 100000) { + return (BITSTREAM_ERROR); } - if (node_res_flag == 0) - { - str_node[k].time = drc_frame_size + time_offset; + for (m = 0; m < delta_time_code_table[e].size - num_bits_read; m++) { + bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + code = (code << 1) + bit; + num_bits_read++; } - } - else - { - for (k=0; k<num_nodes; k++) - { - num_bits_read = 0; - code = 0; - code_found = 0; - e = 1; - exit_cnt = 0; - while ((e < N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX) && (!code_found)) - { - exit_cnt++; - if (exit_cnt > 100000) { - return(BITSTREAM_ERROR); - } - for (m=0; m<delta_time_code_table[e].size - num_bits_read; m++) - { - bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - code = (code << 1) + bit; - num_bits_read++; - } - while (num_bits_read == delta_time_code_table[e].size) - { - if (code == delta_time_code_table[e].code) - { - time_delta = delta_time_code_table[e].value; - code_found = 1; - break; - } - e++; - } - } - str_node[k].time = time_offs + time_delta * delta_tmin; - time_offs = str_node[k].time; + while (num_bits_read == delta_time_code_table[e].size) { + if (code == delta_time_code_table[e].code) { + time_delta = delta_time_code_table[e].value; + code_found = 1; + break; + } + e++; } + } + str_node[k].time = time_offs + time_delta * delta_tmin; + time_offs = str_node[k].time; } - return (0); + } + return (0); } WORD32 impd_drc_uni_gain_read(ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, + ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, ia_drc_config* drc_config, - ia_drc_gain_struct* pstr_uni_drc_gain) -{ - WORD32 err = 0; - WORD32 seq; - static WORD32 pkt_loss_frame_cnt = 0; - ia_spline_nodes_struct* str_spline_nodes = {0}; - - { - WORD32 gain_sequence_count = drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_sequence_count; - - 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]); - if (gain_set_params->gain_coding_profile == GAIN_CODING_PROFILE_CONSTANT) - { - str_spline_nodes = &(pstr_uni_drc_gain->drc_gain_sequence[seq].str_spline_nodes[0]); - str_spline_nodes->num_nodes = 1; - str_spline_nodes->str_node[0].slope = 0.0; - str_spline_nodes->str_node[0].time = (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size - 1; - str_spline_nodes->str_node[0].loc_db_gain = 0.0f; - } - else - { - err = impd_parse_drc_gain_sequence( it_bit_buff, pstr_drc_uni_bs_dec, gain_set_params, &(pstr_uni_drc_gain->drc_gain_sequence[seq])); - if (err) return(err); - } - } + ia_drc_gain_struct* pstr_uni_drc_gain) { + WORD32 err = 0; + WORD32 seq; + static WORD32 pkt_loss_frame_cnt = 0; + ia_spline_nodes_struct* str_spline_nodes = {0}; + + { + WORD32 gain_sequence_count = + drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_sequence_count; + + 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]); + if (gain_set_params->gain_coding_profile == + GAIN_CODING_PROFILE_CONSTANT) { + str_spline_nodes = + &(pstr_uni_drc_gain->drc_gain_sequence[seq].str_spline_nodes[0]); + str_spline_nodes->num_nodes = 1; + str_spline_nodes->str_node[0].slope = 0.0; + str_spline_nodes->str_node[0].time = + (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size - 1; + str_spline_nodes->str_node[0].loc_db_gain = 0.0f; + } else { + err = impd_parse_drc_gain_sequence( + it_bit_buff, pstr_drc_uni_bs_dec, gain_set_params, + &(pstr_uni_drc_gain->drc_gain_sequence[seq])); + if (err) return (err); + } } + } - if (it_bit_buff->ptr_bit_buf_base == NULL) - { - pkt_loss_frame_cnt++; + if (it_bit_buff->ptr_bit_buf_base == NULL) { + pkt_loss_frame_cnt++; - if (pkt_loss_frame_cnt*(FLOAT32)pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size/drc_config->sampling_rate > MAXPACKETLOSSTIME) - { - drc_config->apply_drc = 0; - } + if (pkt_loss_frame_cnt * + (FLOAT32)pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size / + drc_config->sampling_rate > + MAXPACKETLOSSTIME) { + drc_config->apply_drc = 0; } - else - { - pstr_uni_drc_gain->uni_drc_gain_ext_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_uni_drc_gain->uni_drc_gain_ext_flag == 1) - { - err = impd_parse_uni_drc_gain_ext(it_bit_buff, &(pstr_uni_drc_gain->uni_drc_gain_ext)); - if (err) return(err); - } - pkt_loss_frame_cnt = 0; - drc_config->apply_drc = 1; + } else { + pstr_uni_drc_gain->uni_drc_gain_ext_flag = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_uni_drc_gain->uni_drc_gain_ext_flag == 1) { + err = impd_parse_uni_drc_gain_ext(it_bit_buff, + &(pstr_uni_drc_gain->uni_drc_gain_ext)); + if (err) return (err); } + pkt_loss_frame_cnt = 0; + drc_config->apply_drc = 1; + } - return(0); + return (0); } -WORD32 impd_parse_uni_drc_gain_ext(ia_bit_buf_struct* it_bit_buff, - ia_uni_drc_gain_ext_struct* uni_drc_gain_ext) -{ - WORD32 i, k; - WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; - - k = 0; - uni_drc_gain_ext->uni_drc_gain_ext_type[k] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - while(uni_drc_gain_ext->uni_drc_gain_ext_type[k] != UNIDRCGAINEXT_TERM) - { - bit_size_len = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - ext_size_bits = bit_size_len + 4; - - bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); - if(it_bit_buff->error) - return it_bit_buff->error; - uni_drc_gain_ext->ext_bit_size[k] = bit_size + 1; - - switch(uni_drc_gain_ext->uni_drc_gain_ext_type[k]) - { - default: - for(i = 0; i<uni_drc_gain_ext->ext_bit_size[k]; i++) - { - other_bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - break; +WORD32 impd_parse_uni_drc_gain_ext( + ia_bit_buf_struct* it_bit_buff, + ia_uni_drc_gain_ext_struct* uni_drc_gain_ext) { + WORD32 i, k; + WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; + + k = 0; + uni_drc_gain_ext->uni_drc_gain_ext_type[k] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + while (uni_drc_gain_ext->uni_drc_gain_ext_type[k] != UNIDRCGAINEXT_TERM) { + bit_size_len = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + ext_size_bits = bit_size_len + 4; + + bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); + if (it_bit_buff->error) return it_bit_buff->error; + uni_drc_gain_ext->ext_bit_size[k] = bit_size + 1; + + switch (uni_drc_gain_ext->uni_drc_gain_ext_type[k]) { + default: + for (i = 0; i < uni_drc_gain_ext->ext_bit_size[k]; i++) { + other_bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; } - k++; - uni_drc_gain_ext->uni_drc_gain_ext_type[k] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; + break; } + k++; + uni_drc_gain_ext->uni_drc_gain_ext_type[k] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } - return (0); + return (0); } WORD32 impd_parse_spline_nodes(ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, + ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, ia_gain_set_params_struct* gain_set_params, - ia_spline_nodes_struct* str_spline_nodes) -{ - WORD32 err = 0; - WORD32 time_offset; - if (gain_set_params->time_alignment==0) { - time_offset = -1; + ia_spline_nodes_struct* str_spline_nodes) { + WORD32 err = 0; + WORD32 time_offset; + if (gain_set_params->time_alignment == 0) { + time_offset = -1; + } else { + if (gain_set_params->time_delt_min_flag) { + time_offset = -gain_set_params->time_delt_min_val + + (gain_set_params->time_delt_min_val - 1) / 2; + } else { + time_offset = + -pstr_drc_uni_bs_dec->ia_drc_params_struct.delta_tmin_default + + (pstr_drc_uni_bs_dec->ia_drc_params_struct.delta_tmin_default - 1) / + 2; } - else - { - if (gain_set_params->time_delt_min_flag) - { - time_offset = - gain_set_params->time_delt_min_val + (gain_set_params->time_delt_min_val-1)/2; - } - else - { - time_offset = - pstr_drc_uni_bs_dec->ia_drc_params_struct.delta_tmin_default + (pstr_drc_uni_bs_dec->ia_drc_params_struct.delta_tmin_default-1)/2; + } - } - } + if (it_bit_buff->ptr_bit_buf_base == NULL) { + 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; - if(it_bit_buff->ptr_bit_buf_base == NULL) - { - 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; + str_spline_nodes->num_nodes = 1; - str_spline_nodes->num_nodes = 1; - - if (prev_db_gain < 0) - { - str_spline_nodes->str_node[0].loc_db_gain = prev_db_gain; - } - else - { - str_spline_nodes->str_node[0].loc_db_gain = 0.f; - } - - str_spline_nodes->str_node[0].slope = 0.0; - str_spline_nodes->str_node[0].time = (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size + time_offset; + if (prev_db_gain < 0) { + str_spline_nodes->str_node[0].loc_db_gain = prev_db_gain; + } else { + str_spline_nodes->str_node[0].loc_db_gain = 0.f; } - else - { - str_spline_nodes->drc_gain_coding_mode = impd_read_bits_buf(it_bit_buff, 1); - if (it_bit_buff->error == PROC_COMPLETE) - { - str_spline_nodes->drc_gain_coding_mode = 0; - str_spline_nodes->str_node[0].slope = 0.0; - str_spline_nodes->str_node[0].time = (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size + time_offset; - str_spline_nodes->str_node[0].loc_db_gain = str_spline_nodes->str_node[str_spline_nodes->num_nodes-1].loc_db_gain; - str_spline_nodes->num_nodes = 1; - } - else - { - if (it_bit_buff->error) - return(it_bit_buff->error); - } - if (str_spline_nodes->drc_gain_coding_mode == 0) - { - str_spline_nodes->num_nodes = 1; - err = impd_dec_initial_gain(it_bit_buff, gain_set_params->gain_coding_profile, &(str_spline_nodes->str_node[0].loc_db_gain)); - if (err) return(err); - - str_spline_nodes->str_node[0].slope = 0.0; - str_spline_nodes->str_node[0].time = (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size + time_offset; - } - else - { - err = impd_dec_slopes(it_bit_buff, &str_spline_nodes->num_nodes, gain_set_params->gain_interpolation_type, str_spline_nodes->str_node); - if (err) return(err); - if (gain_set_params->time_delt_min_flag) - { - err = impd_dec_times(it_bit_buff, &gain_set_params->str_tables, str_spline_nodes->num_nodes, gain_set_params->time_delt_min_val, (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size, gain_set_params->full_frame, time_offset, str_spline_nodes->str_node); - if (err) return(err); - err = impd_dec_gains(it_bit_buff, - str_spline_nodes->num_nodes, - gain_set_params->gain_coding_profile, - str_spline_nodes->str_node); - if (err) return(err); - } - else - { - err = impd_dec_times(it_bit_buff, &pstr_drc_uni_bs_dec->tables_default, str_spline_nodes->num_nodes, (pstr_drc_uni_bs_dec->ia_drc_params_struct).delta_tmin_default, (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size, gain_set_params->full_frame, time_offset, str_spline_nodes->str_node); - if (err) return(err); - err = impd_dec_gains(it_bit_buff, - str_spline_nodes->num_nodes, - gain_set_params->gain_coding_profile, - str_spline_nodes->str_node); - if (err) return(err); - } - - } + str_spline_nodes->str_node[0].slope = 0.0; + str_spline_nodes->str_node[0].time = + (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size + + time_offset; + } else { + str_spline_nodes->drc_gain_coding_mode = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error == PROC_COMPLETE) { + str_spline_nodes->drc_gain_coding_mode = 0; + str_spline_nodes->str_node[0].slope = 0.0; + str_spline_nodes->str_node[0].time = + (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size + + time_offset; + str_spline_nodes->str_node[0].loc_db_gain = + str_spline_nodes->str_node[str_spline_nodes->num_nodes - 1] + .loc_db_gain; + str_spline_nodes->num_nodes = 1; + } else { + if (it_bit_buff->error) return (it_bit_buff->error); } - return(0); + if (str_spline_nodes->drc_gain_coding_mode == 0) { + str_spline_nodes->num_nodes = 1; + + err = impd_dec_initial_gain(it_bit_buff, + gain_set_params->gain_coding_profile, + &(str_spline_nodes->str_node[0].loc_db_gain)); + if (err) return (err); + + str_spline_nodes->str_node[0].slope = 0.0; + str_spline_nodes->str_node[0].time = + (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size + + time_offset; + } else { + err = impd_dec_slopes(it_bit_buff, &str_spline_nodes->num_nodes, + gain_set_params->gain_interpolation_type, + str_spline_nodes->str_node); + if (err) return (err); + if (gain_set_params->time_delt_min_flag) { + err = impd_dec_times( + it_bit_buff, &gain_set_params->str_tables, + str_spline_nodes->num_nodes, gain_set_params->time_delt_min_val, + (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size, + gain_set_params->full_frame, time_offset, + str_spline_nodes->str_node); + if (err) return (err); + err = impd_dec_gains(it_bit_buff, str_spline_nodes->num_nodes, + gain_set_params->gain_coding_profile, + str_spline_nodes->str_node); + if (err) return (err); + } else { + err = impd_dec_times( + it_bit_buff, &pstr_drc_uni_bs_dec->tables_default, + str_spline_nodes->num_nodes, + (pstr_drc_uni_bs_dec->ia_drc_params_struct).delta_tmin_default, + (pstr_drc_uni_bs_dec->ia_drc_params_struct).drc_frame_size, + gain_set_params->full_frame, time_offset, + str_spline_nodes->str_node); + if (err) return (err); + err = impd_dec_gains(it_bit_buff, str_spline_nodes->num_nodes, + gain_set_params->gain_coding_profile, + str_spline_nodes->str_node); + if (err) return (err); + } + } + } + return (0); } -WORD32 impd_parse_drc_gain_sequence(ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, - ia_gain_set_params_struct* gain_set_params, - ia_drc_gain_sequence_struct* drc_gain_sequence) -{ - WORD32 err = 0, i; - WORD32 prev_frame_time_buf[NODE_COUNT_MAX], cur_frame_time_buf[NODE_COUNT_MAX]; - WORD32 num_nodes_node_reservoir, num_nodes_cur, k, m; - - if (((pstr_drc_uni_bs_dec->ia_drc_params_struct).delay_mode == DELAY_MODE_LOW_DELAY) && (gain_set_params->full_frame == 0)) - { - return (PARAM_ERROR); +WORD32 impd_parse_drc_gain_sequence( + ia_bit_buf_struct* it_bit_buff, ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, + ia_gain_set_params_struct* gain_set_params, + ia_drc_gain_sequence_struct* drc_gain_sequence) { + WORD32 err = 0, i; + WORD32 prev_frame_time_buf[NODE_COUNT_MAX], + cur_frame_time_buf[NODE_COUNT_MAX]; + WORD32 num_nodes_node_reservoir, num_nodes_cur, k, m; + + if (((pstr_drc_uni_bs_dec->ia_drc_params_struct).delay_mode == + DELAY_MODE_LOW_DELAY) && + (gain_set_params->full_frame == 0)) { + return (PARAM_ERROR); + } + i = 0; + { + err = impd_parse_spline_nodes(it_bit_buff, pstr_drc_uni_bs_dec, + gain_set_params, + &(drc_gain_sequence->str_spline_nodes[i])); + if (err) return (err); + + num_nodes_node_reservoir = 0; + num_nodes_cur = 0; + for (k = 0; k < drc_gain_sequence->str_spline_nodes[i].num_nodes; k++) { + if (drc_gain_sequence->str_spline_nodes[i].str_node[k].time >= + pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size) { + prev_frame_time_buf[num_nodes_node_reservoir] = + drc_gain_sequence->str_spline_nodes[i].str_node[k].time; + num_nodes_node_reservoir++; + } else { + cur_frame_time_buf[num_nodes_cur] = + drc_gain_sequence->str_spline_nodes[i].str_node[k].time; + num_nodes_cur++; + } } - i=0; - { - err = impd_parse_spline_nodes( it_bit_buff, pstr_drc_uni_bs_dec, gain_set_params, &(drc_gain_sequence->str_spline_nodes[i])); - if (err) return(err); - - num_nodes_node_reservoir = 0; - num_nodes_cur = 0; - for (k = 0; k < drc_gain_sequence->str_spline_nodes[i].num_nodes; k++){ - if(drc_gain_sequence->str_spline_nodes[i].str_node[k].time >= pstr_drc_uni_bs_dec->ia_drc_params_struct.drc_frame_size){ - prev_frame_time_buf[num_nodes_node_reservoir] = drc_gain_sequence->str_spline_nodes[i].str_node[k].time; - num_nodes_node_reservoir++; - } - else{ - cur_frame_time_buf[num_nodes_cur] = drc_gain_sequence->str_spline_nodes[i].str_node[k].time; - num_nodes_cur++; - } - } - 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; - } - for (m = 0; m < num_nodes_cur; m++, k++){ - drc_gain_sequence->str_spline_nodes[i].str_node[k].time = cur_frame_time_buf[m]; - } + 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; + } + for (m = 0; m < num_nodes_cur; m++, k++) { + drc_gain_sequence->str_spline_nodes[i].str_node[k].time = + cur_frame_time_buf[m]; } - return(0); + } + return (0); } WORD32 impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, ia_drc_params_bs_dec_struct* ia_drc_params_struct, ia_drc_config* drc_config, - ia_drc_config_ext* str_drc_config_ext) -{ - WORD32 dwnmix_instructions_v1_flag; - WORD32 dwnmix_instructions_v1_count; - WORD32 drc_coeffs_and_instructions_uni_drc_v1_flag; - WORD32 drc_coefficients_uni_drc_v1_count; - WORD32 drc_instructions_uni_drc_v1_count; - - WORD32 i = 0, err = 0; - const WORD32 version = 1; - - dwnmix_instructions_v1_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (dwnmix_instructions_v1_flag == 1) - { - dwnmix_instructions_v1_count = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=0; i<dwnmix_instructions_v1_count; i++) - { - err = impd_parse_dwnmix_instructions(it_bit_buff, version, ia_drc_params_struct, &drc_config->channel_layout, &drc_config->dwnmix_instructions[i + drc_config->dwnmix_instructions_count]); - if (err) return(err); - } - drc_config->dwnmix_instructions_count += dwnmix_instructions_v1_count; + ia_drc_config_ext* str_drc_config_ext) { + WORD32 dwnmix_instructions_v1_flag; + WORD32 dwnmix_instructions_v1_count; + WORD32 drc_coeffs_and_instructions_uni_drc_v1_flag; + WORD32 drc_coefficients_uni_drc_v1_count; + WORD32 drc_instructions_uni_drc_v1_count; + + WORD32 i = 0, err = 0; + const WORD32 version = 1; + + dwnmix_instructions_v1_flag = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (dwnmix_instructions_v1_flag == 1) { + dwnmix_instructions_v1_count = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < dwnmix_instructions_v1_count; i++) { + err = impd_parse_dwnmix_instructions( + it_bit_buff, version, ia_drc_params_struct, + &drc_config->channel_layout, + &drc_config + ->dwnmix_instructions[i + + drc_config->dwnmix_instructions_count]); + if (err) return (err); } - - drc_coeffs_and_instructions_uni_drc_v1_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (drc_coeffs_and_instructions_uni_drc_v1_flag == 1) - { - drc_coefficients_uni_drc_v1_count = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=0; i<drc_coefficients_uni_drc_v1_count; i++) - { - err = impd_drc_parse_coeff(it_bit_buff, version, ia_drc_params_struct, &drc_config->str_p_loc_drc_coefficients_uni_drc[i + drc_config->drc_coefficients_drc_count]); - if (err) return(err); - } - drc_config->drc_coefficients_drc_count += drc_coefficients_uni_drc_v1_count; - - drc_instructions_uni_drc_v1_count = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->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, &drc_config->str_drc_instruction_str[i + drc_config->drc_instructions_uni_drc_count]); - if (err) return(err); - } - drc_config->drc_instructions_uni_drc_count += drc_instructions_uni_drc_v1_count; + drc_config->dwnmix_instructions_count += dwnmix_instructions_v1_count; + } + + drc_coeffs_and_instructions_uni_drc_v1_flag = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (drc_coeffs_and_instructions_uni_drc_v1_flag == 1) { + drc_coefficients_uni_drc_v1_count = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < drc_coefficients_uni_drc_v1_count; i++) { + err = impd_drc_parse_coeff( + it_bit_buff, version, ia_drc_params_struct, + &drc_config->str_p_loc_drc_coefficients_uni_drc + [i + drc_config->drc_coefficients_drc_count]); + if (err) return (err); } - - str_drc_config_ext->loud_eq_instructions_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - 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(it_bit_buff->error) - return it_bit_buff->error; - for (i=0; i<str_drc_config_ext->loud_eq_instructions_count; i++) - { - err = impd_parse_loud_eq_instructions(it_bit_buff, &str_drc_config_ext->loud_eq_instructions[i]); - if (err) return(err); - } + drc_config->drc_coefficients_drc_count += drc_coefficients_uni_drc_v1_count; + + drc_instructions_uni_drc_v1_count = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->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, + &drc_config->str_drc_instruction_str + [i + drc_config->drc_instructions_uni_drc_count]); + if (err) return (err); } - else - { - str_drc_config_ext->loud_eq_instructions_count = 0; + drc_config->drc_instructions_uni_drc_count += + drc_instructions_uni_drc_v1_count; + } + + str_drc_config_ext->loud_eq_instructions_flag = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + 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 (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < str_drc_config_ext->loud_eq_instructions_count; i++) { + err = impd_parse_loud_eq_instructions( + it_bit_buff, &str_drc_config_ext->loud_eq_instructions[i]); + if (err) return (err); } - - str_drc_config_ext->eq_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_drc_config_ext->eq_flag == 1) - { - err = impd_parse_eq_coefficients( it_bit_buff, &str_drc_config_ext->str_eq_coeff); - if (err) return(err); - str_drc_config_ext->eq_instructions_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=0; i<str_drc_config_ext->eq_instructions_count; i++) - { - err = impd_parse_eq_instructions(it_bit_buff, drc_config, &str_drc_config_ext->str_eq_instructions[i]); - if (err) return(err); - } + } else { + str_drc_config_ext->loud_eq_instructions_count = 0; + } + + str_drc_config_ext->eq_flag = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_drc_config_ext->eq_flag == 1) { + err = impd_parse_eq_coefficients(it_bit_buff, + &str_drc_config_ext->str_eq_coeff); + if (err) return (err); + str_drc_config_ext->eq_instructions_count = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < str_drc_config_ext->eq_instructions_count; i++) { + err = impd_parse_eq_instructions( + it_bit_buff, drc_config, &str_drc_config_ext->str_eq_instructions[i]); + if (err) return (err); } - return 0; + } + return 0; } - - - WORD32 impd_parse_filt_block(ia_bit_buf_struct* it_bit_buff, ia_filt_block_struct* str_filter_block, - WORD32 block_count) -{ -// WORD32 err = 0; - WORD32 k,j,temp; - ia_filt_ele_struct* str_filter_element; - - for (j=0; j<block_count; j++) - { - - str_filter_block->filter_element_count = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_filter_element=&str_filter_block->str_filter_element[0]; - for (k=0; k<str_filter_block->filter_element_count; k++) - { - temp = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_filter_element->filt_ele_idx= (temp&0x7E)>>1; - str_filter_element->filt_ele_gain_flag = temp&1;; - - if (str_filter_element->filt_ele_gain_flag) - { - WORD32 bs_filter_element_gain; - bs_filter_element_gain = impd_read_bits_buf(it_bit_buff, 10); - if(it_bit_buff->error) - return it_bit_buff->error; - str_filter_element->filt_ele_gain = bs_filter_element_gain * 0.125f - 96.0f; - } - - str_filter_element++; - } - str_filter_block++; + WORD32 block_count) { + // WORD32 err = 0; + WORD32 k, j, temp; + ia_filt_ele_struct* str_filter_element; + + for (j = 0; j < block_count; j++) { + str_filter_block->filter_element_count = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + str_filter_element = &str_filter_block->str_filter_element[0]; + for (k = 0; k < str_filter_block->filter_element_count; k++) { + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + + str_filter_element->filt_ele_idx = (temp & 0x7E) >> 1; + str_filter_element->filt_ele_gain_flag = temp & 1; + ; + + if (str_filter_element->filt_ele_gain_flag) { + WORD32 bs_filter_element_gain; + bs_filter_element_gain = impd_read_bits_buf(it_bit_buff, 10); + if (it_bit_buff->error) return it_bit_buff->error; + str_filter_element->filt_ele_gain = + bs_filter_element_gain * 0.125f - 96.0f; + } + + str_filter_element++; } - return(0); + str_filter_block++; + } + return (0); } -WORD32 impd_parse_unique_td_filt_ele(ia_bit_buf_struct* it_bit_buff, - ia_unique_td_filt_element* unique_td_filt_ele, - WORD32 td_filter_element_count) -{ - WORD32 m, sign, j, temp; - FLOAT32 tmp; - - for (j=0; j<td_filter_element_count; j++) - { - unique_td_filt_ele->eq_filter_format = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; +WORD32 impd_parse_unique_td_filt_ele( + ia_bit_buf_struct* it_bit_buff, + ia_unique_td_filt_element* unique_td_filt_ele, + WORD32 td_filter_element_count) { + WORD32 m, sign, j, temp; + FLOAT32 tmp; - if (unique_td_filt_ele->eq_filter_format == 0) - { - WORD32 bs_real_zero_radius, bs_generic_zero_radius, bs_generic_zero_angle; - WORD32 bs_real_pole_radius, bs_cmplx_pole_radius, bs_cmplx_pole_angle; - WORD32 bs_real_zero_radius_one_count; + for (j = 0; j < td_filter_element_count; j++) { + unique_td_filt_ele->eq_filter_format = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - temp = impd_read_bits_buf(it_bit_buff, 23); - if(it_bit_buff->error) - return it_bit_buff->error; + if (unique_td_filt_ele->eq_filter_format == 0) { + WORD32 bs_real_zero_radius, bs_generic_zero_radius, bs_generic_zero_angle; + WORD32 bs_real_pole_radius, bs_cmplx_pole_radius, bs_cmplx_pole_angle; + WORD32 bs_real_zero_radius_one_count; - bs_real_zero_radius_one_count=(temp>>20)&7; + temp = impd_read_bits_buf(it_bit_buff, 23); + if (it_bit_buff->error) return it_bit_buff->error; - unique_td_filt_ele->bs_real_zero_radius_one_count = 2 * bs_real_zero_radius_one_count; - unique_td_filt_ele->real_zero_count = (temp&0xFC000)>>14; + bs_real_zero_radius_one_count = (temp >> 20) & 7; - unique_td_filt_ele->generic_zero_count = (temp& 0x3F00)>>8; + unique_td_filt_ele->bs_real_zero_radius_one_count = + 2 * bs_real_zero_radius_one_count; + unique_td_filt_ele->real_zero_count = (temp & 0xFC000) >> 14; - unique_td_filt_ele->real_pole_count = (temp&0xF0)>>4; + unique_td_filt_ele->generic_zero_count = (temp & 0x3F00) >> 8; - unique_td_filt_ele->cmplx_pole_count = temp& 0xF; + unique_td_filt_ele->real_pole_count = (temp & 0xF0) >> 4; + unique_td_filt_ele->cmplx_pole_count = temp & 0xF; - temp= impd_read_bits_buf(it_bit_buff, unique_td_filt_ele->bs_real_zero_radius_one_count); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf( + it_bit_buff, unique_td_filt_ele->bs_real_zero_radius_one_count); + if (it_bit_buff->error) return it_bit_buff->error; - for (m=unique_td_filt_ele->bs_real_zero_radius_one_count-1; m>=0; m--) - { - unique_td_filt_ele->zero_sign[m] =(temp &1); - temp=temp>>1; - } + for (m = unique_td_filt_ele->bs_real_zero_radius_one_count - 1; m >= 0; + m--) { + unique_td_filt_ele->zero_sign[m] = (temp & 1); + temp = temp >> 1; + } + for (m = 0; m < unique_td_filt_ele->real_zero_count; m++) { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - for (m=0; m<unique_td_filt_ele->real_zero_count; m++) - { - temp= impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; + bs_real_zero_radius = (temp & 0xFE) >> 1; - bs_real_zero_radius = (temp&0xFE)>>1; + sign = temp & 0x01; - sign = temp&0x01; + tmp = 1.0f - zero_pole_radius_tbl[bs_real_zero_radius]; - tmp = 1.0f - zero_pole_radius_tbl[bs_real_zero_radius]; + sign = sign << 1; - sign=sign<<1; + unique_td_filt_ele->real_zero_radius[m] = (1 - sign) * tmp; + } + for (m = 0; m < unique_td_filt_ele->generic_zero_count; m++) { + temp = impd_read_bits_buf(it_bit_buff, 14); + if (it_bit_buff->error) return it_bit_buff->error; - unique_td_filt_ele->real_zero_radius[m] = (1-sign)*tmp; - } - for (m=0; m<unique_td_filt_ele->generic_zero_count; m++) - { - temp=impd_read_bits_buf(it_bit_buff, 14); - if(it_bit_buff->error) - return it_bit_buff->error; + bs_generic_zero_radius = (temp & 0x3F80) >> 7; - bs_generic_zero_radius = (temp&0x3F80)>>7; + unique_td_filt_ele->generic_zero_radius[m] = + 1.0f - zero_pole_radius_tbl[bs_generic_zero_radius]; - unique_td_filt_ele->generic_zero_radius[m] = 1.0f - zero_pole_radius_tbl[bs_generic_zero_radius]; + bs_generic_zero_angle = (temp & 0x7F); - bs_generic_zero_angle = (temp&0x7F); + unique_td_filt_ele->generic_zero_angle[m] = + zero_pole_angle_tbl[bs_generic_zero_angle]; + } + for (m = 0; m < unique_td_filt_ele->real_pole_count; m++) { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - unique_td_filt_ele->generic_zero_angle[m] = zero_pole_angle_tbl[bs_generic_zero_angle]; - } - for (m=0; m<unique_td_filt_ele->real_pole_count; m++) - { - temp=impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; + bs_real_pole_radius = (temp & 0xFE) >> 1; - bs_real_pole_radius = (temp&0xFE)>>1; + sign = temp & 0x01; - sign = temp&0x01; + tmp = 1.0f - zero_pole_radius_tbl[bs_real_pole_radius]; - tmp = 1.0f - zero_pole_radius_tbl[bs_real_pole_radius]; + sign = sign << 1; - sign=sign<<1; + unique_td_filt_ele->real_pole_radius[m] = (1 - sign) * tmp; + } + for (m = 0; m < unique_td_filt_ele->cmplx_pole_count; m++) { + temp = impd_read_bits_buf(it_bit_buff, 14); - unique_td_filt_ele->real_pole_radius[m] = (1-sign)*tmp; - } - for (m=0; m<unique_td_filt_ele->cmplx_pole_count; m++) - { - temp= impd_read_bits_buf(it_bit_buff, 14); + if (it_bit_buff->error) return it_bit_buff->error; - if(it_bit_buff->error) - return it_bit_buff->error; + bs_cmplx_pole_radius = (temp & 0x3F80) >> 7; - bs_cmplx_pole_radius = (temp&0x3F80)>>7; + unique_td_filt_ele->complex_pole_radius[m] = + 1.0f - zero_pole_radius_tbl[bs_cmplx_pole_radius]; - unique_td_filt_ele->complex_pole_radius[m] = 1.0f - zero_pole_radius_tbl[bs_cmplx_pole_radius]; + bs_cmplx_pole_angle = (temp & 0x7F); - bs_cmplx_pole_angle = (temp&0x7F); + unique_td_filt_ele->complex_pole_angle[m] = + zero_pole_angle_tbl[bs_cmplx_pole_angle]; + } + } else { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - unique_td_filt_ele->complex_pole_angle[m] = zero_pole_angle_tbl[bs_cmplx_pole_angle]; - } - } - else - { - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - unique_td_filt_ele->fir_filt_order = (temp&0xFE)>>1; + unique_td_filt_ele->fir_filt_order = (temp & 0xFE) >> 1; - unique_td_filt_ele->fir_symmetry = temp&0x01; + unique_td_filt_ele->fir_symmetry = temp & 0x01; - for (m=0; m<unique_td_filt_ele->fir_filt_order/2+1; m++) - { - WORD32 sign, bs_fir_coeff; - FLOAT32 tmp; + for (m = 0; m < unique_td_filt_ele->fir_filt_order / 2 + 1; m++) { + WORD32 sign, bs_fir_coeff; + FLOAT32 tmp; - temp= impd_read_bits_buf(it_bit_buff, 11); - if(it_bit_buff->error) - return it_bit_buff->error; - sign = (temp>>10)&0x01; + temp = impd_read_bits_buf(it_bit_buff, 11); + if (it_bit_buff->error) return it_bit_buff->error; + sign = (temp >> 10) & 0x01; - bs_fir_coeff = temp&0x03FF; + bs_fir_coeff = temp & 0x03FF; - tmp = (FLOAT32)pow(10.0f, -0.05f * bs_fir_coeff * 0.0625f); + tmp = (FLOAT32)pow(10.0f, -0.05f * bs_fir_coeff * 0.0625f); - sign=sign<<1; + sign = sign << 1; - unique_td_filt_ele->fir_coeff[m] = (1-sign)*tmp; - } - } - unique_td_filt_ele++; + unique_td_filt_ele->fir_coeff[m] = (1 - sign) * tmp; + } } - return(0); + unique_td_filt_ele++; + } + return (0); } WORD32 impd_decode_eq_slope_code(ia_bit_buf_struct* it_bit_buff, - FLOAT32* eq_slope, - WORD32 num_eq_nodes) -{ - WORD32 bits = 0; - WORD32 k; - - for (k=0; k<num_eq_nodes; k++) - { - bits = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (bits == 0x1) { - *eq_slope = 0.0f; - } - else { - bits = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - *eq_slope = eq_slope_tbl[bits]; - } - eq_slope++; - + FLOAT32* eq_slope, WORD32 num_eq_nodes) { + WORD32 bits = 0; + WORD32 k; + + for (k = 0; k < num_eq_nodes; k++) { + bits = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (bits == 0x1) { + *eq_slope = 0.0f; + } else { + bits = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + *eq_slope = eq_slope_tbl[bits]; } - return(0); + eq_slope++; + } + return (0); } - - WORD32 impd_decode_gain_initial_code(ia_bit_buf_struct* it_bit_buff, - FLOAT32* eq_gain_initial) -{ - WORD32 bits,bits1; + FLOAT32* eq_gain_initial) { + WORD32 bits, bits1; - bits1 = impd_read_bits_buf(it_bit_buff, 2); - if(it_bit_buff->error) - return it_bit_buff->error; + bits1 = impd_read_bits_buf(it_bit_buff, 2); + if (it_bit_buff->error) return it_bit_buff->error; - switch (bits1) { + switch (bits1) { case 0x0: - bits = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - *eq_gain_initial = 0.5f * bits - 8.0f; - break; + bits = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + *eq_gain_initial = 0.5f * bits - 8.0f; + break; case 0x1: case 0x2: - bits = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - if (bits<8) { - *eq_gain_initial = bits1*bits - bits1*16.0f; - } - else { - *eq_gain_initial = (FLOAT32)bits1*bits; - } - break; + bits = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + if (bits < 8) { + *eq_gain_initial = bits1 * bits - bits1 * 16.0f; + } else { + *eq_gain_initial = (FLOAT32)bits1 * bits; + } + break; case 0x3: - bits = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - *eq_gain_initial = 4.0f * bits - 64.0f; - break; + bits = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + *eq_gain_initial = 4.0f * bits - 64.0f; + break; default: - break; - } - return(0); + break; + } + return (0); } +WORD32 impd_parse_eq_subband_gain_spline( + ia_bit_buf_struct* it_bit_buff, + ia_eq_subband_gain_spline_struct* str_eq_subband_gain_spline, + WORD32 eq_subband_gains_count) { + WORD32 err = 0, eq_nodes_cnt, j, k, bits, *eq_freq_delta; + FLOAT32* peq_gain_delta; + + for (j = 0; j < eq_subband_gains_count; j++) { + eq_nodes_cnt = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + str_eq_subband_gain_spline->num_eq_nodes = eq_nodes_cnt + 2; + + err = impd_decode_eq_slope_code(it_bit_buff, + &(str_eq_subband_gain_spline->eq_slope[0]), + str_eq_subband_gain_spline->num_eq_nodes); + if (err) return (err); + + eq_freq_delta = &(str_eq_subband_gain_spline->eq_freq_delta[1]); + for (k = 1; k < str_eq_subband_gain_spline->num_eq_nodes; k++) { + bits = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + *eq_freq_delta = bits + 1; + eq_freq_delta++; + } + err = impd_decode_gain_initial_code( + it_bit_buff, &(str_eq_subband_gain_spline->eq_gain_initial)); + if (err) return (err); -WORD32 impd_parse_eq_subband_gain_spline(ia_bit_buf_struct* it_bit_buff, - ia_eq_subband_gain_spline_struct* str_eq_subband_gain_spline, - WORD32 eq_subband_gains_count) -{ - WORD32 err=0, eq_nodes_cnt, j,k, bits, *eq_freq_delta; - FLOAT32 *peq_gain_delta; - - for (j=0; j<eq_subband_gains_count; j++) - { - eq_nodes_cnt = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_eq_subband_gain_spline->num_eq_nodes = eq_nodes_cnt + 2; - - - err = impd_decode_eq_slope_code(it_bit_buff, &(str_eq_subband_gain_spline->eq_slope[0]),str_eq_subband_gain_spline->num_eq_nodes); - if (err) return (err); - - eq_freq_delta=&(str_eq_subband_gain_spline->eq_freq_delta[1]); - for (k=1; k<str_eq_subband_gain_spline->num_eq_nodes; k++) - { - - bits = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - *eq_freq_delta = bits+1; - eq_freq_delta++; - - } - - err = impd_decode_gain_initial_code( it_bit_buff, &(str_eq_subband_gain_spline->eq_gain_initial)); - if (err) - return (err); + peq_gain_delta = &(str_eq_subband_gain_spline->eq_gain_delta[1]); + for (k = 1; k < str_eq_subband_gain_spline->num_eq_nodes; k++) { + bits = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; - peq_gain_delta=&(str_eq_subband_gain_spline->eq_gain_delta[1]); - for (k=1; k<str_eq_subband_gain_spline->num_eq_nodes; k++) - { + *peq_gain_delta = eq_gain_delta_tbl[bits]; + peq_gain_delta++; + } + str_eq_subband_gain_spline++; + } + return (0); +} - bits = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; +WORD32 impd_parse_eq_subband_gain_vector( + ia_bit_buf_struct* it_bit_buff, const WORD32 eq_subband_gain_count, + ia_eq_subband_gain_vector* str_eq_subband_gain_vector, + WORD32 eq_subband_gains_count) { + WORD32 m, k, temp; - *peq_gain_delta = eq_gain_delta_tbl[bits]; - peq_gain_delta++; + for (k = 0; k < eq_subband_gains_count; k++) { + for (m = 0; m < eq_subband_gain_count; m++) { + WORD32 sign, bs_eq_subband_gain; + temp = impd_read_bits_buf(it_bit_buff, 9); + if (it_bit_buff->error) return it_bit_buff->error; - } - str_eq_subband_gain_spline++; - } - return (0); -} + sign = (temp >> 8) & 1; + bs_eq_subband_gain = temp & 0x7F; -WORD32 impd_parse_eq_subband_gain_vector(ia_bit_buf_struct* it_bit_buff, - const WORD32 eq_subband_gain_count, - ia_eq_subband_gain_vector* str_eq_subband_gain_vector, - WORD32 eq_subband_gains_count) -{ - WORD32 m,k,temp; - - for (k=0; k<eq_subband_gains_count; k++) - { - for (m=0; m<eq_subband_gain_count; m++) - { - WORD32 sign, bs_eq_subband_gain; - temp = impd_read_bits_buf(it_bit_buff, 9); - if(it_bit_buff->error) - return it_bit_buff->error; - - sign= (temp>>8)&1; - bs_eq_subband_gain = temp & 0x7F; - - sign=sign<<1; - str_eq_subband_gain_vector->eq_subband_gain[m] = ((1-sign)*bs_eq_subband_gain) * 0.125f; - } - str_eq_subband_gain_vector++; + sign = sign << 1; + str_eq_subband_gain_vector->eq_subband_gain[m] = + ((1 - sign) * bs_eq_subband_gain) * 0.125f; } - return (0); + str_eq_subband_gain_vector++; + } + return (0); } WORD32 impd_parse_eq_coefficients(ia_bit_buf_struct* it_bit_buff, - ia_eq_coeff_struct* str_eq_coeff) -{ - WORD32 err = 0; - WORD32 eq_gain_cnt, mu, nu,temp; - WORD32 subband_gain_len_tbl[7]={0,32,39,64,71,128,135}; - - str_eq_coeff->eq_delay_max_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_eq_coeff->eq_delay_max_present) - { - mu = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - nu = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - str_eq_coeff->eq_delay_max = 16 * mu * (1<<nu); + ia_eq_coeff_struct* str_eq_coeff) { + WORD32 err = 0; + WORD32 eq_gain_cnt, mu, nu, temp; + WORD32 subband_gain_len_tbl[7] = {0, 32, 39, 64, 71, 128, 135}; + + str_eq_coeff->eq_delay_max_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_eq_coeff->eq_delay_max_present) { + mu = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + nu = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + str_eq_coeff->eq_delay_max = 16 * mu * (1 << nu); + } + + str_eq_coeff->unique_filter_block_count = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + err = impd_parse_filt_block(it_bit_buff, &(str_eq_coeff->str_filter_block[0]), + str_eq_coeff->unique_filter_block_count); + if (err) return (err); + + str_eq_coeff->unique_td_filter_element_count = + impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + err = impd_parse_unique_td_filt_ele( + it_bit_buff, &(str_eq_coeff->unique_td_filt_ele[0]), + str_eq_coeff->unique_td_filter_element_count); + if (err) return (err); + + str_eq_coeff->unique_eq_subband_gains_count = + impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_eq_coeff->unique_eq_subband_gains_count > 0) { + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + str_eq_coeff->eq_subband_gain_representation = (temp >> 4) & 0x01; + + str_eq_coeff->eq_subband_gain_format = temp & 0x0F; + + if (str_eq_coeff->eq_subband_gain_format == GAINFORMAT_UNIFORM) { + eq_gain_cnt = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + str_eq_coeff->eq_subband_gain_count = eq_gain_cnt + 1; + + } else + str_eq_coeff->eq_subband_gain_count = + subband_gain_len_tbl[str_eq_coeff->eq_subband_gain_format]; + + if (str_eq_coeff->eq_subband_gain_representation == 1) { + err = impd_parse_eq_subband_gain_spline( + it_bit_buff, &(str_eq_coeff->str_eq_subband_gain_spline[0]), + str_eq_coeff->unique_eq_subband_gains_count); + if (err) return (err); + } else { + err = impd_parse_eq_subband_gain_vector( + it_bit_buff, str_eq_coeff->eq_subband_gain_count, + &(str_eq_coeff->str_eq_subband_gain_vector[0]), + str_eq_coeff->unique_eq_subband_gains_count); + if (err) return (err); } + } - str_eq_coeff->unique_filter_block_count = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - - err = impd_parse_filt_block (it_bit_buff, &(str_eq_coeff->str_filter_block[0]),str_eq_coeff->unique_filter_block_count); - if (err) - return(err); - - str_eq_coeff->unique_td_filter_element_count = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - - err = impd_parse_unique_td_filt_ele ( it_bit_buff, &(str_eq_coeff->unique_td_filt_ele[0]),str_eq_coeff->unique_td_filter_element_count); - if (err) - return(err); - - str_eq_coeff->unique_eq_subband_gains_count = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_eq_coeff->unique_eq_subband_gains_count>0) - { - temp=impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - str_eq_coeff->eq_subband_gain_representation = (temp>>4)&0x01; - - str_eq_coeff->eq_subband_gain_format = temp&0x0F; - - if (str_eq_coeff->eq_subband_gain_format==GAINFORMAT_UNIFORM) - { - eq_gain_cnt = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - str_eq_coeff->eq_subband_gain_count = eq_gain_cnt + 1; - - } - else - str_eq_coeff->eq_subband_gain_count=subband_gain_len_tbl[str_eq_coeff->eq_subband_gain_format]; - - - - if (str_eq_coeff->eq_subband_gain_representation == 1) - { - - err = impd_parse_eq_subband_gain_spline( it_bit_buff, &(str_eq_coeff->str_eq_subband_gain_spline[0]),str_eq_coeff->unique_eq_subband_gains_count); - if (err) - return(err); - } - else - { - - err = impd_parse_eq_subband_gain_vector( it_bit_buff, str_eq_coeff->eq_subband_gain_count, &(str_eq_coeff->str_eq_subband_gain_vector[0]),str_eq_coeff->unique_eq_subband_gains_count); - if (err) - return(err); - - } - } - - return(0); + return (0); } - - -WORD32 impd_parser_td_filter_cascade (ia_bit_buf_struct* it_bit_buff, - ia_eq_instructions_struct* str_eq_instructions, - ia_td_filter_cascade_struct* str_td_filter_cascade) -{ - //WORD32 err=0, - WORD32 i, ii, k; - WORD32 eq_cascade_gain; - ia_filter_block_refs_struct* str_filter_block_refs=&(str_td_filter_cascade->str_filter_block_refs[0]); - - for (i=0; i<str_eq_instructions->eq_ch_group_count; i++) - { - str_td_filter_cascade->eq_cascade_gain_present[i] = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_td_filter_cascade->eq_cascade_gain_present[i]) { - eq_cascade_gain = impd_read_bits_buf(it_bit_buff, 10); - if(it_bit_buff->error) - return it_bit_buff->error; - str_td_filter_cascade->eq_cascade_gain[i] = 0.125f * eq_cascade_gain - 96.0f; - } - else - { - str_td_filter_cascade->eq_cascade_gain[i] = 0.0f; - } - - - str_filter_block_refs->filter_block_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - for (ii=0; ii<str_filter_block_refs->filter_block_count; ii++) - { - str_filter_block_refs->filter_block_index[ii] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - str_filter_block_refs++; +WORD32 impd_parser_td_filter_cascade( + ia_bit_buf_struct* it_bit_buff, + ia_eq_instructions_struct* str_eq_instructions, + ia_td_filter_cascade_struct* str_td_filter_cascade) { + // WORD32 err=0, + WORD32 i, ii, k; + WORD32 eq_cascade_gain; + ia_filter_block_refs_struct* str_filter_block_refs = + &(str_td_filter_cascade->str_filter_block_refs[0]); + + for (i = 0; i < str_eq_instructions->eq_ch_group_count; i++) { + str_td_filter_cascade->eq_cascade_gain_present[i] = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_td_filter_cascade->eq_cascade_gain_present[i]) { + eq_cascade_gain = impd_read_bits_buf(it_bit_buff, 10); + if (it_bit_buff->error) return it_bit_buff->error; + str_td_filter_cascade->eq_cascade_gain[i] = + 0.125f * eq_cascade_gain - 96.0f; + } else { + str_td_filter_cascade->eq_cascade_gain[i] = 0.0f; } - str_td_filter_cascade->eq_phase_alignment_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_td_filter_cascade->eq_phase_alignment_present) - { - - for (i=0; i<str_eq_instructions->eq_ch_group_count; i++) - { - for (k=i+1; k<str_eq_instructions->eq_ch_group_count; k++) - { - str_td_filter_cascade->eq_phase_alignment[i][k] = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - } - } - + str_filter_block_refs->filter_block_count = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + for (ii = 0; ii < str_filter_block_refs->filter_block_count; ii++) { + str_filter_block_refs->filter_block_index[ii] = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; } - else - { - for (i=0; i<str_eq_instructions->eq_ch_group_count; i++) - { - for (k=i+1; k<str_eq_instructions->eq_ch_group_count; k++) - str_td_filter_cascade->eq_phase_alignment[i][k] = 1; - - } + str_filter_block_refs++; + } + + str_td_filter_cascade->eq_phase_alignment_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_td_filter_cascade->eq_phase_alignment_present) { + for (i = 0; i < str_eq_instructions->eq_ch_group_count; i++) { + for (k = i + 1; k < str_eq_instructions->eq_ch_group_count; k++) { + str_td_filter_cascade->eq_phase_alignment[i][k] = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } } + } else { + for (i = 0; i < str_eq_instructions->eq_ch_group_count; i++) { + for (k = i + 1; k < str_eq_instructions->eq_ch_group_count; k++) + str_td_filter_cascade->eq_phase_alignment[i][k] = 1; + } + } - return(0); + return (0); } +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 dmix_id_present, additional_dmix_id_present, + additional_dmix_id_cnt = 0; + WORD32 additional_drc_set_id_present, additional_drc_set_id_cnt; -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 dmix_id_present, additional_dmix_id_present, additional_dmix_id_cnt=0; - WORD32 additional_drc_set_id_present, additional_drc_set_id_cnt; - - temp=impd_read_bits_buf(it_bit_buff, 11); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf(it_bit_buff, 11); + if (it_bit_buff->error) return it_bit_buff->error; - str_eq_instructions->eq_set_id = (temp>>5)&0x3F; + str_eq_instructions->eq_set_id = (temp >> 5) & 0x3F; - str_eq_instructions->eq_set_complexity_level = (temp>>1)&0x0F; + str_eq_instructions->eq_set_complexity_level = (temp >> 1) & 0x0F; - dmix_id_present = temp&0x01; + dmix_id_present = temp & 0x01; - if (dmix_id_present) - { - temp=impd_read_bits_buf(it_bit_buff, 9); - if(it_bit_buff->error) - return it_bit_buff->error; + if (dmix_id_present) { + temp = impd_read_bits_buf(it_bit_buff, 9); + if (it_bit_buff->error) return it_bit_buff->error; - str_eq_instructions->downmix_id[0] = (temp>>2)&0x7F; + str_eq_instructions->downmix_id[0] = (temp >> 2) & 0x7F; - str_eq_instructions->eq_apply_to_downmix = (temp>>1)&0x01; + str_eq_instructions->eq_apply_to_downmix = (temp >> 1) & 0x01; - additional_dmix_id_present = temp&0x01; + additional_dmix_id_present = temp & 0x01; - if (additional_dmix_id_present) - { - additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + if (additional_dmix_id_present) { + additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - for (i=1; i<additional_dmix_id_cnt+1; i++) - { - str_eq_instructions->downmix_id[i] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - } - else - { - str_eq_instructions->downmix_id[0] = 0; + for (i = 1; i < additional_dmix_id_cnt + 1; i++) { + str_eq_instructions->downmix_id[i] = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } } + } else { + str_eq_instructions->downmix_id[0] = 0; + } - str_eq_instructions->dwnmix_id_count = 1 + additional_dmix_id_cnt; + str_eq_instructions->dwnmix_id_count = 1 + additional_dmix_id_cnt; - temp=impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - str_eq_instructions->drc_set_id[0] = (temp>>1)&0x3F; + str_eq_instructions->drc_set_id[0] = (temp >> 1) & 0x3F; - additional_drc_set_id_present = temp&0x01; + additional_drc_set_id_present = temp & 0x01; - if (additional_drc_set_id_present) - { - additional_drc_set_id_cnt = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; + if (additional_drc_set_id_present) { + additional_drc_set_id_cnt = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; - for (i=1; i<additional_drc_set_id_cnt+1; i++) - { - str_eq_instructions->drc_set_id[i] = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - else - { - additional_drc_set_id_cnt = 0; + for (i = 1; i < additional_drc_set_id_cnt + 1; i++) { + str_eq_instructions->drc_set_id[i] = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; } - str_eq_instructions->drc_set_id_count = 1 + additional_drc_set_id_cnt; - - temp=impd_read_bits_buf(it_bit_buff, 17); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_eq_instructions->eq_set_purpose =(temp>>1)&0xFFFF; - - str_eq_instructions->depends_on_eq_set_present = temp&0x01; - - if (str_eq_instructions->depends_on_eq_set_present) - { - str_eq_instructions->depends_on_eq_set = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; + } else { + additional_drc_set_id_cnt = 0; + } + str_eq_instructions->drc_set_id_count = 1 + additional_drc_set_id_cnt; + + temp = impd_read_bits_buf(it_bit_buff, 17); + if (it_bit_buff->error) return it_bit_buff->error; + + str_eq_instructions->eq_set_purpose = (temp >> 1) & 0xFFFF; + + str_eq_instructions->depends_on_eq_set_present = temp & 0x01; + + if (str_eq_instructions->depends_on_eq_set_present) { + str_eq_instructions->depends_on_eq_set = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + str_eq_instructions->no_independent_eq_use = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + + str_eq_instructions->eq_channel_count = channel_count = + drc_config->channel_layout.base_channel_count; + + if ((dmix_id_present == 1) && + (str_eq_instructions->eq_apply_to_downmix == 1) && + (str_eq_instructions->downmix_id[0] != 0) && + (str_eq_instructions->downmix_id[0] != ID_FOR_ANY_DOWNMIX) && + (str_eq_instructions->dwnmix_id_count == 1)) { + for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { + if (str_eq_instructions->downmix_id[0] == + drc_config->dwnmix_instructions[i].downmix_id) + break; } - else - { - str_eq_instructions->no_independent_eq_use = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + if (i == drc_config->dwnmix_instructions_count) { + return UNEXPECTED_ERROR; } - str_eq_instructions->eq_channel_count = channel_count = drc_config->channel_layout.base_channel_count; - - if ((dmix_id_present == 1) && (str_eq_instructions->eq_apply_to_downmix == 1) && - (str_eq_instructions->downmix_id[0] != 0) && (str_eq_instructions->downmix_id[0] != ID_FOR_ANY_DOWNMIX) && (str_eq_instructions->dwnmix_id_count==1)) - { - for(i=0; i<drc_config->dwnmix_instructions_count; i++) - { - if (str_eq_instructions->downmix_id[0] == drc_config->dwnmix_instructions[i].downmix_id) - break; - } - if (i == drc_config->dwnmix_instructions_count) - { - return UNEXPECTED_ERROR; - } + str_eq_instructions->eq_channel_count = channel_count = + drc_config->dwnmix_instructions[i].target_channel_count; + } else if ((str_eq_instructions->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || + (str_eq_instructions->dwnmix_id_count > 1)) { + channel_count = 1; + } + + 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); + 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; + } + } - str_eq_instructions->eq_channel_count = channel_count = drc_config->dwnmix_instructions[i].target_channel_count; + if (new_group == 1) { + str_eq_instructions->eq_ch_group_count += 1; } - else if ((str_eq_instructions->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || (str_eq_instructions->dwnmix_id_count > 1)) - { - channel_count = 1; + } + + str_eq_instructions->td_filter_cascade_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_eq_instructions->td_filter_cascade_present) { + impd_parser_td_filter_cascade( + it_bit_buff, str_eq_instructions, + &(str_eq_instructions->str_td_filter_cascade)); + } + + str_eq_instructions->subband_gains_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + 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); + if (it_bit_buff->error) return it_bit_buff->error; } + } + + str_eq_instructions->eq_transition_duration_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_eq_instructions->eq_transition_duration_present) { + WORD32 bs_eq_transition_duration; + bs_eq_transition_duration = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + str_eq_instructions->eq_transition_duration = (WORD32)( + 0.001f * + (FLOAT32)pow(2.0f, 2.0f + bs_eq_transition_duration * 0.0625f)); + } + return (0); +} - 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); - 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; - } - } +WORD32 impd_parse_loud_eq_instructions( + ia_bit_buf_struct* it_bit_buff, + ia_loud_eq_instructions_struct* loud_eq_instructions) { + WORD32 i, bs_loud_eq_scaling, bs_loud_eq_offset, temp; + WORD32 dmix_id_present, additional_dmix_id_present, + additional_dmix_id_cnt = 0; + WORD32 drc_set_id_present, additional_drc_set_id_present, + additional_drc_set_id_cnt = 0; + WORD32 eq_set_id_present, additional_eq_set_id_present, + additional_eq_set_id_cnt = 0; - if (new_group == 1) - { - str_eq_instructions->eq_ch_group_count += 1; - } - } + temp = impd_read_bits_buf(it_bit_buff, 9); + if (it_bit_buff->error) return it_bit_buff->error; + loud_eq_instructions->loud_eq_set_id = (temp >> 5) & 0x0F; - str_eq_instructions->td_filter_cascade_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + loud_eq_instructions->drc_location = (temp >> 1) & 0x0F; - if (str_eq_instructions->td_filter_cascade_present) - { - impd_parser_td_filter_cascade (it_bit_buff, str_eq_instructions, &(str_eq_instructions->str_td_filter_cascade)); - } + dmix_id_present = temp & 0x01; - str_eq_instructions->subband_gains_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - 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); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } + if (dmix_id_present) { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - str_eq_instructions->eq_transition_duration_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + loud_eq_instructions->downmix_id[0] = (temp >> 1) & 0x7F; - if (str_eq_instructions->eq_transition_duration_present) - { - WORD32 bs_eq_transition_duration; - bs_eq_transition_duration = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; + additional_dmix_id_present = temp & 0x01; - str_eq_instructions->eq_transition_duration = (WORD32)(0.001f * (FLOAT32)pow(2.0f, 2.0f + bs_eq_transition_duration * 0.0625f)); - } - return(0); -} + if (additional_dmix_id_present) { + additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; -WORD32 impd_parse_loud_eq_instructions(ia_bit_buf_struct* it_bit_buff, - ia_loud_eq_instructions_struct* loud_eq_instructions) -{ - WORD32 i, bs_loud_eq_scaling, bs_loud_eq_offset, temp; - WORD32 dmix_id_present, additional_dmix_id_present, additional_dmix_id_cnt = 0; - WORD32 drc_set_id_present, additional_drc_set_id_present, additional_drc_set_id_cnt = 0; - WORD32 eq_set_id_present, additional_eq_set_id_present, additional_eq_set_id_cnt = 0; - - temp=impd_read_bits_buf(it_bit_buff, 9); - if(it_bit_buff->error) - return it_bit_buff->error; - loud_eq_instructions->loud_eq_set_id = (temp>>5)&0x0F; - - loud_eq_instructions->drc_location = (temp>>1)&0x0F; - - dmix_id_present = temp&0x01; - - if (dmix_id_present) - { - temp=impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - loud_eq_instructions->downmix_id[0] = (temp>>1)&0x7F; - - additional_dmix_id_present = temp&0x01; - - if (additional_dmix_id_present) - { - additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - - for (i=1; i<additional_dmix_id_cnt+1; i++) - { - loud_eq_instructions->downmix_id[i] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - } - else - { - loud_eq_instructions->downmix_id[0] = 0; + for (i = 1; i < additional_dmix_id_cnt + 1; i++) { + loud_eq_instructions->downmix_id[i] = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } } + } else { + loud_eq_instructions->downmix_id[0] = 0; + } - loud_eq_instructions->dwnmix_id_count = 1 + additional_dmix_id_cnt; + loud_eq_instructions->dwnmix_id_count = 1 + additional_dmix_id_cnt; - drc_set_id_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + drc_set_id_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - if (drc_set_id_present) - { - temp=impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + if (drc_set_id_present) { + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - loud_eq_instructions->drc_set_id[0] = (temp>>1)&0x3F; + loud_eq_instructions->drc_set_id[0] = (temp >> 1) & 0x3F; - additional_drc_set_id_present = temp&0x01; + additional_drc_set_id_present = temp & 0x01; - if (additional_drc_set_id_present) - { - additional_drc_set_id_cnt = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; + if (additional_drc_set_id_present) { + additional_drc_set_id_cnt = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; - for (i=1; i<additional_drc_set_id_cnt+1; i++) - { - loud_eq_instructions->drc_set_id[i] = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - } - else - { - loud_eq_instructions->drc_set_id[0] = 0; + for (i = 1; i < additional_drc_set_id_cnt + 1; i++) { + loud_eq_instructions->drc_set_id[i] = + impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + } } + } else { + loud_eq_instructions->drc_set_id[0] = 0; + } - loud_eq_instructions->drc_set_id_count = 1 + additional_drc_set_id_cnt; + loud_eq_instructions->drc_set_id_count = 1 + additional_drc_set_id_cnt; - eq_set_id_present = impd_read_bits_buf(it_bit_buff, 1); + eq_set_id_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + if (it_bit_buff->error) return it_bit_buff->error; - if (eq_set_id_present) - { - temp=impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + if (eq_set_id_present) { + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - loud_eq_instructions->eq_set_id[0] = (temp>>1)&0x3F; + loud_eq_instructions->eq_set_id[0] = (temp >> 1) & 0x3F; - additional_eq_set_id_present = temp&0x01; + additional_eq_set_id_present = temp & 0x01; - if (additional_eq_set_id_present) - { - additional_eq_set_id_cnt = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; + if (additional_eq_set_id_present) { + additional_eq_set_id_cnt = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; - for (i=0; i<additional_eq_set_id_cnt; i++) - { - loud_eq_instructions->eq_set_id[i+1] = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - } - else - { - loud_eq_instructions->eq_set_id[0] = 0; + for (i = 0; i < additional_eq_set_id_cnt; i++) { + loud_eq_instructions->eq_set_id[i + 1] = + impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + } } - loud_eq_instructions->eq_set_id_count = 1 + additional_eq_set_id_cnt; - - temp=impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; + } else { + loud_eq_instructions->eq_set_id[0] = 0; + } + loud_eq_instructions->eq_set_id_count = 1 + additional_eq_set_id_cnt; - loud_eq_instructions->loudness_after_drc = (temp>>7)&0x01; + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - loud_eq_instructions->loudness_after_eq = (temp>>6)&0x01; + loud_eq_instructions->loudness_after_drc = (temp >> 7) & 0x01; - loud_eq_instructions->loud_eq_gain_sequence_count = temp&0x3F; + loud_eq_instructions->loudness_after_eq = (temp >> 6) & 0x01; - for (i=0; i<loud_eq_instructions->loud_eq_gain_sequence_count; i++) - { - temp=impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + loud_eq_instructions->loud_eq_gain_sequence_count = temp & 0x3F; - loud_eq_instructions->gain_seq_idx[i] = (temp>>1)&0x3F; + for (i = 0; i < loud_eq_instructions->loud_eq_gain_sequence_count; i++) { + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - loud_eq_instructions->drc_characteristic_format_is_cicp[i] = temp&0x01; - - if (loud_eq_instructions->drc_characteristic_format_is_cicp[i]) - { - loud_eq_instructions->drc_characteristic[i] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - else - { - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; + loud_eq_instructions->gain_seq_idx[i] = (temp >> 1) & 0x3F; - loud_eq_instructions->drc_characteristic_left_index[i] = (temp>>4)&0x0F; + loud_eq_instructions->drc_characteristic_format_is_cicp[i] = temp & 0x01; - loud_eq_instructions->drc_characteristic_right_index[i] = temp&0x0F; + if (loud_eq_instructions->drc_characteristic_format_is_cicp[i]) { + loud_eq_instructions->drc_characteristic[i] = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - } + loud_eq_instructions->drc_characteristic_left_index[i] = + (temp >> 4) & 0x0F; - temp=impd_read_bits_buf(it_bit_buff, 9); - if(it_bit_buff->error) - return it_bit_buff->error; + loud_eq_instructions->drc_characteristic_right_index[i] = temp & 0x0F; + } - loud_eq_instructions->frequency_range_index[i] = (temp>>3)&0x3F; + temp = impd_read_bits_buf(it_bit_buff, 9); + if (it_bit_buff->error) return it_bit_buff->error; - bs_loud_eq_scaling = temp&0x07; + loud_eq_instructions->frequency_range_index[i] = (temp >> 3) & 0x3F; - loud_eq_instructions->loud_eq_scaling[i] = (FLOAT32)pow (2.0f, -0.5f * bs_loud_eq_scaling); + bs_loud_eq_scaling = temp & 0x07; - bs_loud_eq_offset = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; + loud_eq_instructions->loud_eq_scaling[i] = + (FLOAT32)pow(2.0f, -0.5f * bs_loud_eq_scaling); - loud_eq_instructions->loud_eq_offset[i] = 1.5f * bs_loud_eq_offset - 16.0f; + bs_loud_eq_offset = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; - } - return(0); + loud_eq_instructions->loud_eq_offset[i] = 1.5f * bs_loud_eq_offset - 16.0f; + } + return (0); } - - diff --git a/decoder/drc_src/impd_drc_eq.c b/decoder/drc_src/impd_drc_eq.c index 7519526..4acc37b 100644 --- a/decoder/drc_src/impd_drc_eq.c +++ b/decoder/drc_src/impd_drc_eq.c @@ -29,1526 +29,1364 @@ #include "impd_drc_gain_dec.h" #include "impd_drc_eq.h" +#define CONFIG_REAL_POLE 0 +#define CONFIG_COMPLEX_POLE 1 +#define CONFIG_REAL_ZERO_RADIUS_ONE 2 +#define CONFIG_REAL_ZERO 3 +#define CONFIG_GENERIC_ZERO 4 -#define CONFIG_REAL_POLE 0 -#define CONFIG_COMPLEX_POLE 1 -#define CONFIG_REAL_ZERO_RADIUS_ONE 2 -#define CONFIG_REAL_ZERO 3 -#define CONFIG_GENERIC_ZERO 4 +#define STEP_RATIO_F_LO 20.0f +#define STEP_RATIO_F_HI 24000.0f +#define STEP_RATIO_EQ_NODE_COUNT_MAX 33 -#define STEP_RATIO_F_LO 20.0f -#define STEP_RATIO_F_HI 24000.0f -#define STEP_RATIO_EQ_NODE_COUNT_MAX 33 - -#define FILTER_ELEMENT_FORMAT_POLE_ZERO 0 -#define FILTER_ELEMENT_FORMAT_FIR 1 +#define FILTER_ELEMENT_FORMAT_POLE_ZERO 0 +#define FILTER_ELEMENT_FORMAT_FIR 1 #ifndef M_PI #define M_PI (3.14159265358979323846) #endif -WORD32 impd_derive_subband_center_freq(WORD32 eq_subband_gain_count, - WORD32 eq_subband_gain_format, - FLOAT32 sample_rate, - FLOAT32* subband_center_freq) -{ - WORD32 i; - FLOAT32 width, offset; - switch (eq_subband_gain_format) - { - case GAINFORMAT_QMF32: - case GAINFORMAT_QMF64: - case GAINFORMAT_QMF128: - case GAINFORMAT_UNIFORM: - width = 0.5f * sample_rate / (FLOAT32) eq_subband_gain_count; - offset = 0.5f * width; - for (i=0; i<eq_subband_gain_count; i++) - { - subband_center_freq[i] = offset; - offset = offset + width; - } - break; - case GAINFORMAT_QMFHYBRID39: - case GAINFORMAT_QMFHYBRID71: - case GAINFORMAT_QMFHYBRID135: - return(UNEXPECTED_ERROR); - break; - default: - break; - } - return (0); +WORD32 impd_derive_subband_center_freq(WORD32 eq_subband_gain_count, + WORD32 eq_subband_gain_format, + FLOAT32 sample_rate, + FLOAT32* subband_center_freq) { + WORD32 i; + FLOAT32 width, offset; + switch (eq_subband_gain_format) { + case GAINFORMAT_QMF32: + case GAINFORMAT_QMF64: + case GAINFORMAT_QMF128: + case GAINFORMAT_UNIFORM: + width = 0.5f * sample_rate / (FLOAT32)eq_subband_gain_count; + offset = 0.5f * width; + for (i = 0; i < eq_subband_gain_count; i++) { + subband_center_freq[i] = offset; + offset = offset + width; + } + break; + case GAINFORMAT_QMFHYBRID39: + case GAINFORMAT_QMFHYBRID71: + case GAINFORMAT_QMFHYBRID135: + return (UNEXPECTED_ERROR); + break; + default: + break; + } + return (0); } -VOID impd_calc_fir_filt_response(WORD32 fir_order, - WORD32 fir_symmetry, - FLOAT32 *coeff, - FLOAT32 frequency_radian, - FLOAT32 *response) -{ - WORD32 m; - FLOAT32 sum = 0.0f; - WORD32 o2; - - if ((fir_order & 0x1) == 0) - { - o2 = fir_order/2; - if (fir_symmetry == 0) - { - /*ITTIAM: sum is been over written after the loop - None of the conformance streams with us entering this function*/ - for (m=1; m<=o2; m++) - { - sum += coeff[o2-m] *(FLOAT32)cos (m * frequency_radian); - } - sum += sum; - sum = coeff[o2]; - } - else - { - for (m=1; m<=o2; m++) - { - sum += coeff[o2-m] * (FLOAT32)sin (m * frequency_radian); - } - sum += sum; - } +VOID impd_calc_fir_filt_response(WORD32 fir_order, WORD32 fir_symmetry, + FLOAT32* coeff, FLOAT32 frequency_radian, + FLOAT32* response) { + WORD32 m; + FLOAT32 sum = 0.0f; + WORD32 o2; + + if ((fir_order & 0x1) == 0) { + o2 = fir_order / 2; + if (fir_symmetry == 0) { + /*ITTIAM: sum is been over written after the loop + None of the conformance streams with us entering this function*/ + for (m = 1; m <= o2; m++) { + sum += coeff[o2 - m] * (FLOAT32)cos(m * frequency_radian); + } + sum += sum; + sum = coeff[o2]; + } else { + for (m = 1; m <= o2; m++) { + sum += coeff[o2 - m] * (FLOAT32)sin(m * frequency_radian); + } + sum += sum; } - else - { - o2 = (fir_order+1)/2; - if (fir_symmetry == 0) - { - for (m=1; m<=o2; m++) - { - sum += coeff[o2-m] * (FLOAT32)cos ((m - 0.5f) * frequency_radian); - } - } - else - { - for (m=1; m<=o2; m++) - { - sum += coeff[o2-m] * (FLOAT32)sin ((m - 0.5f) * frequency_radian); - } - } - sum += sum; + } else { + o2 = (fir_order + 1) / 2; + if (fir_symmetry == 0) { + for (m = 1; m <= o2; m++) { + sum += coeff[o2 - m] * (FLOAT32)cos((m - 0.5f) * frequency_radian); + } + } else { + for (m = 1; m <= o2; m++) { + sum += coeff[o2 - m] * (FLOAT32)sin((m - 0.5f) * frequency_radian); + } } - *response = sum; - return; + sum += sum; + } + *response = sum; + return; } VOID impd_calc_filt_ele_response(ia_unique_td_filt_element* element, - FLOAT32 frequency_radian, - FLOAT32 *response) -{ - WORD32 i; - FLOAT32 part_response, radius, angle_radian; - FLOAT64 total_response = 1.0; - - if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) - { - for (i=0; i<element->bs_real_zero_radius_one_count; i++) - { - part_response = 1.0f + 1.0f - 2.0f * 1.0f * (FLOAT32)cos(frequency_radian - (FLOAT32) element->zero_sign[i]); - total_response *= part_response; - } - for (i=0; i<element->real_zero_count; i++) - { - if (element->real_zero_radius[i] < 0.0f) - { - radius = - element->real_zero_radius[i]; - angle_radian =(FLOAT32) M_PI; - } - else - { - radius = element->real_zero_radius[i]; - angle_radian = 0.0f; - } - part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian); - total_response *= part_response; - part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian); - total_response *= part_response; - } - - total_response = sqrt(total_response); + FLOAT32 frequency_radian, FLOAT32* response) { + WORD32 i; + FLOAT32 part_response, radius, angle_radian; + FLOAT64 total_response = 1.0; + + if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) { + for (i = 0; i < element->bs_real_zero_radius_one_count; i++) { + part_response = + 1.0f + 1.0f - + 2.0f * 1.0f * + (FLOAT32)cos(frequency_radian - (FLOAT32)element->zero_sign[i]); + total_response *= part_response; + } + for (i = 0; i < element->real_zero_count; i++) { + if (element->real_zero_radius[i] < 0.0f) { + radius = -element->real_zero_radius[i]; + angle_radian = (FLOAT32)M_PI; + } else { + radius = element->real_zero_radius[i]; + angle_radian = 0.0f; + } + part_response = + 1.0f + radius * radius - + 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian); + total_response *= part_response; + part_response = + 1.0f + radius * radius - + 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian); + total_response *= part_response; + } - for (i=0; i<element->generic_zero_count; i++) - { - radius = element->generic_zero_radius[i]; - part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]); - total_response *= part_response; - part_response = 1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]); - total_response *= part_response; - } - for (i=0; i<element->real_pole_count; i++) - { - if (element->real_pole_radius[i] < 0.0f) - { - radius = - element->real_pole_radius[i]; - angle_radian =(FLOAT32)( - M_PI); - } - else - { - radius = element->real_pole_radius[i]; - angle_radian = 0.0f; - } - part_response = 1/(1.0f + radius * radius - 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian)); - total_response *= part_response; - } - for (i=0; i<element->cmplx_pole_count; i++) - { - part_response = 1/(1.0f + element->real_pole_radius[i] * element->real_pole_radius[i] - 2.0f * element->real_pole_radius[i] * (FLOAT32)cos(frequency_radian - element->complex_pole_angle[i])); - total_response *= part_response * part_response; - } + total_response = sqrt(total_response); + + for (i = 0; i < element->generic_zero_count; i++) { + radius = element->generic_zero_radius[i]; + part_response = + 1.0f + radius * radius - + 2.0f * radius * + (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]); + total_response *= part_response; + part_response = + 1.0f + radius * radius - + 2.0f * radius * + (FLOAT32)cos(frequency_radian - element->generic_zero_angle[i]); + total_response *= part_response; + } + for (i = 0; i < element->real_pole_count; i++) { + if (element->real_pole_radius[i] < 0.0f) { + radius = -element->real_pole_radius[i]; + angle_radian = (FLOAT32)(-M_PI); + } else { + radius = element->real_pole_radius[i]; + angle_radian = 0.0f; + } + part_response = + 1 / (1.0f + radius * radius - + 2.0f * radius * (FLOAT32)cos(frequency_radian - angle_radian)); + total_response *= part_response; } - else - { - impd_calc_fir_filt_response(element->fir_filt_order, - element->fir_symmetry, - element->fir_coeff, - frequency_radian, - &part_response); - - total_response *= part_response; + for (i = 0; i < element->cmplx_pole_count; i++) { + part_response = + 1 / + (1.0f + element->real_pole_radius[i] * element->real_pole_radius[i] - + 2.0f * element->real_pole_radius[i] * + (FLOAT32)cos(frequency_radian - element->complex_pole_angle[i])); + total_response *= part_response * part_response; } - *response = (FLOAT32)total_response; - return; + } else { + impd_calc_fir_filt_response(element->fir_filt_order, element->fir_symmetry, + element->fir_coeff, frequency_radian, + &part_response); + + total_response *= part_response; + } + *response = (FLOAT32)total_response; + return; } -VOID impd_calc_filt_block_response(ia_unique_td_filt_element* unique_td_filt_ele, - ia_filt_block_struct* str_filter_block, - FLOAT32 frequency_radian, - FLOAT32 *response) -{ - WORD32 i; - FLOAT32 part_response; - FLOAT64 total_response = 1.0; - for (i=0; i<str_filter_block->filter_element_count; i++) - { - ia_filt_ele_struct* str_filter_element = &str_filter_block->str_filter_element[i]; - - impd_calc_filt_ele_response(&(unique_td_filt_ele[str_filter_element->filt_ele_idx]), - frequency_radian, - &part_response); - total_response *= part_response; - - if (str_filter_element->filt_ele_gain_flag == 1) - { - total_response *= pow(10.0f, 0.05f * str_filter_element->filt_ele_gain); - } +VOID impd_calc_filt_block_response( + ia_unique_td_filt_element* unique_td_filt_ele, + ia_filt_block_struct* str_filter_block, FLOAT32 frequency_radian, + FLOAT32* response) { + WORD32 i; + FLOAT32 part_response; + FLOAT64 total_response = 1.0; + for (i = 0; i < str_filter_block->filter_element_count; i++) { + ia_filt_ele_struct* str_filter_element = + &str_filter_block->str_filter_element[i]; + + impd_calc_filt_ele_response( + &(unique_td_filt_ele[str_filter_element->filt_ele_idx]), + frequency_radian, &part_response); + total_response *= part_response; + + if (str_filter_element->filt_ele_gain_flag == 1) { + total_response *= pow(10.0f, 0.05f * str_filter_element->filt_ele_gain); } - *response = (FLOAT32) total_response; - return; + } + *response = (FLOAT32)total_response; + return; } -WORD32 impd_calc_subband_gains_td_cascade(ia_unique_td_filt_element* unique_td_filt_ele, - ia_filt_block_struct* str_filter_block, - ia_td_filter_cascade_struct* str_td_filter_cascade, - WORD32 eq_subband_gain_format, - WORD32 eq_ch_group_count, - FLOAT32 sample_rate, - WORD32 eq_frame_size_subband, - ia_subband_filt_struct* subband_filt) -{ - WORD32 i, err = 0, g, b; - FLOAT32 response, frequency_radian; - FLOAT32 subband_center_freq[256]; - FLOAT64 total_response; - - WORD32 eq_subband_gain_count = subband_filt->coeff_count; - - err = impd_derive_subband_center_freq(eq_subband_gain_count, eq_subband_gain_format, sample_rate, subband_center_freq); - if (err) - return(err); - - for (g=0; g<eq_ch_group_count; g++) - { - for (b=0; b<eq_subband_gain_count; b++) - { - total_response = pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g]); - frequency_radian = (FLOAT32)(2.0f * M_PI * subband_center_freq[b] / sample_rate); - for (i=0; i<str_td_filter_cascade->str_filter_block_refs[g].filter_block_count; i++) - { - impd_calc_filt_block_response(unique_td_filt_ele, - &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g].filter_block_index[i]]), - frequency_radian, - &response); - total_response *= response; - } - subband_filt[g].subband_coeff[b] = (FLOAT32) total_response; - } - subband_filt[g].eq_frame_size_subband = eq_frame_size_subband; +WORD32 impd_calc_subband_gains_td_cascade( + ia_unique_td_filt_element* unique_td_filt_ele, + ia_filt_block_struct* str_filter_block, + ia_td_filter_cascade_struct* str_td_filter_cascade, + WORD32 eq_subband_gain_format, WORD32 eq_ch_group_count, + FLOAT32 sample_rate, WORD32 eq_frame_size_subband, + ia_subband_filt_struct* subband_filt) { + WORD32 i, err = 0, g, b; + FLOAT32 response, frequency_radian; + FLOAT32 subband_center_freq[256]; + FLOAT64 total_response; + + WORD32 eq_subband_gain_count = subband_filt->coeff_count; + + err = impd_derive_subband_center_freq(eq_subband_gain_count, + eq_subband_gain_format, sample_rate, + subband_center_freq); + if (err) return (err); + + for (g = 0; g < eq_ch_group_count; g++) { + for (b = 0; b < eq_subband_gain_count; b++) { + total_response = + pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g]); + frequency_radian = + (FLOAT32)(2.0f * M_PI * subband_center_freq[b] / sample_rate); + for (i = 0; + i < + str_td_filter_cascade->str_filter_block_refs[g].filter_block_count; + i++) { + impd_calc_filt_block_response( + unique_td_filt_ele, + &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g] + .filter_block_index[i]]), + frequency_radian, &response); + total_response *= response; + } + subband_filt[g].subband_coeff[b] = (FLOAT32)total_response; } - return(0); + subband_filt[g].eq_frame_size_subband = eq_frame_size_subband; + } + return (0); } VOID impd_add_cascade(ia_cascade_align_group_struct* pstr_cascade_align_grp, - WORD32 c1, - WORD32 c2, - WORD32* done) -{ - WORD32 m, n; - - *done = 0; - for (m=0; m<pstr_cascade_align_grp->member_count; m++) - { - if (pstr_cascade_align_grp->member_idx[m] == c1) - { - for (n=0; n<pstr_cascade_align_grp->member_count; n++) - { - if (pstr_cascade_align_grp->member_idx[n] == c2) - { - *done = 1; - } - } - if (*done == 0) - { - pstr_cascade_align_grp->member_idx[pstr_cascade_align_grp->member_count] = c2; - pstr_cascade_align_grp->member_count++; - *done = 1; - } + WORD32 c1, WORD32 c2, WORD32* done) { + WORD32 m, n; + + *done = 0; + for (m = 0; m < pstr_cascade_align_grp->member_count; m++) { + if (pstr_cascade_align_grp->member_idx[m] == c1) { + for (n = 0; n < pstr_cascade_align_grp->member_count; n++) { + if (pstr_cascade_align_grp->member_idx[n] == c2) { + *done = 1; } + } + if (*done == 0) { + pstr_cascade_align_grp + ->member_idx[pstr_cascade_align_grp->member_count] = c2; + pstr_cascade_align_grp->member_count++; + *done = 1; + } } - return; + } + return; } -VOID impd_calc_cascade_align_groups(WORD32 eq_ch_group_count, - WORD32 eq_phase_alignment_present, - WORD32 eq_phase_alignment[][EQ_CHANNEL_GROUP_COUNT_MAX], - WORD32* cascade_align_grp_cnt, - ia_cascade_align_group_struct* pstr_cascade_align_grp) -{ - WORD32 i, k, g, group_count, done; - - group_count = 0; - - if (eq_phase_alignment_present == 0) - { - if (eq_ch_group_count > 1) - { - for (i=0; i<eq_ch_group_count; i++) - { - pstr_cascade_align_grp[group_count].member_idx[i] = i; - } - pstr_cascade_align_grp[group_count].member_count = eq_ch_group_count; - group_count = 1; - } +VOID impd_calc_cascade_align_groups( + WORD32 eq_ch_group_count, WORD32 eq_phase_alignment_present, + WORD32 eq_phase_alignment[][EQ_CHANNEL_GROUP_COUNT_MAX], + WORD32* cascade_align_grp_cnt, + ia_cascade_align_group_struct* pstr_cascade_align_grp) { + WORD32 i, k, g, group_count, done; + + group_count = 0; + + if (eq_phase_alignment_present == 0) { + if (eq_ch_group_count > 1) { + for (i = 0; i < eq_ch_group_count; i++) { + pstr_cascade_align_grp[group_count].member_idx[i] = i; + } + pstr_cascade_align_grp[group_count].member_count = eq_ch_group_count; + group_count = 1; } - else - { - for (i=0; i<eq_ch_group_count; i++) - { - for (k=i+1; k<eq_ch_group_count; k++) - { - if (eq_phase_alignment[i][k] == 1) - { - done = 0; - for (g=0; g<group_count; g++) - { - impd_add_cascade(&pstr_cascade_align_grp[g], i, k, &done); - - if (done == 0) - { - impd_add_cascade(&pstr_cascade_align_grp[g], k, i, &done); - } - } - if (done == 0) - { - pstr_cascade_align_grp[group_count].member_idx[0] = i; - pstr_cascade_align_grp[group_count].member_idx[1] = k; - pstr_cascade_align_grp[group_count].member_count = 2; - group_count++; - } - } + } else { + for (i = 0; i < eq_ch_group_count; i++) { + for (k = i + 1; k < eq_ch_group_count; k++) { + if (eq_phase_alignment[i][k] == 1) { + done = 0; + for (g = 0; g < group_count; g++) { + impd_add_cascade(&pstr_cascade_align_grp[g], i, k, &done); + + if (done == 0) { + impd_add_cascade(&pstr_cascade_align_grp[g], k, i, &done); } + } + if (done == 0) { + pstr_cascade_align_grp[group_count].member_idx[0] = i; + pstr_cascade_align_grp[group_count].member_idx[1] = k; + pstr_cascade_align_grp[group_count].member_count = 2; + group_count++; + } } + } } - *cascade_align_grp_cnt = group_count; - return; + } + *cascade_align_grp_cnt = group_count; + return; } - -VOID impd_calc_phase_filt_params(WORD32 config, - FLOAT32 radius, - FLOAT32 angle, - ia_ph_alignment_filt_struct* ph_alignment_filt) -{ - WORD32 channel; - FLOAT32 zReal, zImag; - FLOAT32 prod; - WORD32 section = ph_alignment_filt->section_count; - ia_filt_sect_struct* filt_section = &ph_alignment_filt->filt_section[section]; - switch (config) - { - case CONFIG_REAL_POLE: - ph_alignment_filt->gain *= (-radius); - filt_section->a1 = - radius; - filt_section->a2 = 0.0f; - filt_section->b1 = - 1.0f / radius; - filt_section->b2 = 0.0f; - ph_alignment_filt->section_count++; - break; - case CONFIG_COMPLEX_POLE: - zReal = radius * (FLOAT32)cos(M_PI * angle); - zImag = radius * (FLOAT32)sin(M_PI * angle); - prod = zReal * zReal + zImag * zImag; - ph_alignment_filt->gain *= prod; - filt_section->a1 = - 2.0f * zReal; - filt_section->a2 = prod; - filt_section->b1 = - 2.0f * zReal / prod; - filt_section->b2 = 1.0f / prod; - ph_alignment_filt->section_count++; - break; - default: - break; - } - for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++) - { - filt_section->filt_sect_state[channel].in_state_1 = 0.0f; - filt_section->filt_sect_state[channel].in_state_2 = 0.0f; - filt_section->filt_sect_state[channel].out_state_1 = 0.0f; - filt_section->filt_sect_state[channel].out_state_2 = 0.0f; - } - - return; +VOID impd_calc_phase_filt_params( + WORD32 config, FLOAT32 radius, FLOAT32 angle, + ia_ph_alignment_filt_struct* ph_alignment_filt) { + WORD32 channel; + FLOAT32 zReal, zImag; + FLOAT32 prod; + WORD32 section = ph_alignment_filt->section_count; + ia_filt_sect_struct* filt_section = &ph_alignment_filt->filt_section[section]; + switch (config) { + case CONFIG_REAL_POLE: + ph_alignment_filt->gain *= (-radius); + filt_section->a1 = -radius; + filt_section->a2 = 0.0f; + filt_section->b1 = -1.0f / radius; + filt_section->b2 = 0.0f; + ph_alignment_filt->section_count++; + break; + case CONFIG_COMPLEX_POLE: + zReal = radius * (FLOAT32)cos(M_PI * angle); + zImag = radius * (FLOAT32)sin(M_PI * angle); + prod = zReal * zReal + zImag * zImag; + ph_alignment_filt->gain *= prod; + filt_section->a1 = -2.0f * zReal; + filt_section->a2 = prod; + filt_section->b1 = -2.0f * zReal / prod; + filt_section->b2 = 1.0f / prod; + ph_alignment_filt->section_count++; + break; + default: + break; + } + for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) { + filt_section->filt_sect_state[channel].in_state_1 = 0.0f; + filt_section->filt_sect_state[channel].in_state_2 = 0.0f; + filt_section->filt_sect_state[channel].out_state_1 = 0.0f; + filt_section->filt_sect_state[channel].out_state_2 = 0.0f; + } + + return; } - -VOID impd_calc_phase_filt_delay(ia_unique_td_filt_element* element, - ia_ph_alignment_filt_struct* ph_alignment_filt) -{ - WORD32 i, delay=0, channel; - if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) - { - if (element->bs_real_zero_radius_one_count == 0) - { - delay = element->real_zero_count + 2 * element->generic_zero_count - element->real_pole_count - 2 * element->cmplx_pole_count; - delay = max(0, delay); - ph_alignment_filt->validity_flag = 1; - } +VOID impd_calc_phase_filt_delay( + ia_unique_td_filt_element* element, + ia_ph_alignment_filt_struct* ph_alignment_filt) { + WORD32 i, delay = 0, channel; + if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) { + if (element->bs_real_zero_radius_one_count == 0) { + delay = element->real_zero_count + 2 * element->generic_zero_count - + element->real_pole_count - 2 * element->cmplx_pole_count; + delay = max(0, delay); + ph_alignment_filt->validity_flag = 1; } - ph_alignment_filt->audio_delay.delay = delay; - for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++) - { - for (i=0; i<delay; i++) - { - ph_alignment_filt->audio_delay.state[channel][i] = 0.0f; - } + } + ph_alignment_filt->audio_delay.delay = delay; + for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) { + for (i = 0; i < delay; i++) { + ph_alignment_filt->audio_delay.state[channel][i] = 0.0f; } + } - return; + return; } VOID impd_calc_phase_filt(ia_unique_td_filt_element* element, WORD32 filt_ele_idx, - ia_matching_ph_filt_struct* matching_ph_filt) -{ - WORD32 i; - - memset(matching_ph_filt, 0, sizeof(ia_matching_ph_filt_struct)); - matching_ph_filt->gain = 1.0f; - - if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) - { - for (i=0; i<element->real_pole_count; i++) - { - impd_calc_phase_filt_params(CONFIG_REAL_POLE, - element->real_pole_radius[i], - 0.0f, - matching_ph_filt); - } - for (i=0; i<element->cmplx_pole_count; i++) - { - impd_calc_phase_filt_params(CONFIG_COMPLEX_POLE, - element->complex_pole_radius[i], - element->complex_pole_angle[i], - matching_ph_filt); - } - } - impd_calc_phase_filt_delay(element, matching_ph_filt); - - matching_ph_filt->num_matches_filter = 1; - matching_ph_filt->matches_filter[0] = filt_ele_idx; + ia_matching_ph_filt_struct* matching_ph_filt) { + WORD32 i; - return; -} + memset(matching_ph_filt, 0, sizeof(ia_matching_ph_filt_struct)); + matching_ph_filt->gain = 1.0f; -WORD32 impd_calc_filt_params(ia_unique_td_filt_element* element, - ia_interm_filt_params_struct* interm_filt_params) -{ - FLOAT32 zReal; - FLOAT32* coeff; - //WORD32 offset_idx = 0; - WORD32 i; - WORD32 param_idx = 0; - - ia_2nd_order_filt_params_struct *pstr_2nd_oder_filt_params = &interm_filt_params->ord_2_filt_params_of_zeros[0]; - - for (i=0; i<element->bs_real_zero_radius_one_count; i+=2) - { - FLOAT32 radius = (FLOAT32)element->zero_sign[i + 0]; - FLOAT32 angle = (FLOAT32)element->zero_sign[i + 1]; - FLOAT32 angle1 = radius; - FLOAT32 angle2 = angle; - pstr_2nd_oder_filt_params->radius = 1.0f; - coeff = pstr_2nd_oder_filt_params->coeff; - - if (angle1 != angle2) - { - coeff[0] = 0.0f; - coeff[1] = -1.0f; - } - else if (angle1 == 1.0f) - { - coeff[0] = -2.0f; - coeff[1] = 1.0f; - } - else - { - coeff[0] = 2.0f; - coeff[1] = 1.0f; - } - pstr_2nd_oder_filt_params += 1; - param_idx += 1; + if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) { + for (i = 0; i < element->real_pole_count; i++) { + impd_calc_phase_filt_params(CONFIG_REAL_POLE, + element->real_pole_radius[i], 0.0f, + matching_ph_filt); } - for (i=0; i<element->real_zero_count; i++) - { - FLOAT32 radius = element->real_zero_radius[i]; - //FLOAT32 angle = 0.0f; - - pstr_2nd_oder_filt_params->radius = radius; - if (fabs(radius) == 1.0f) - { - return (-1); - } - else - { - coeff = pstr_2nd_oder_filt_params->coeff; - coeff[0] = - (radius + 1.0f / radius); - coeff[1] = 1.0f; - } - pstr_2nd_oder_filt_params += 1; - param_idx += 1; - } - - for (i=0; i<element->generic_zero_count; i++) - { - FLOAT32 radius = element->generic_zero_radius[i]; - FLOAT32 angle = element->generic_zero_angle[i]; - zReal = radius * (FLOAT32)cos(M_PI * angle); - pstr_2nd_oder_filt_params->radius = radius; - coeff = pstr_2nd_oder_filt_params->coeff; - coeff[0] = -2.0f * zReal; - coeff[1] = radius * radius; - - pstr_2nd_oder_filt_params += 1; - - zReal = (FLOAT32)cos(M_PI * angle) / radius; - pstr_2nd_oder_filt_params->radius = radius; - coeff = pstr_2nd_oder_filt_params->coeff; - coeff[0] = -2.0f * zReal; - coeff[1] = 1.0f / (radius * radius); - - pstr_2nd_oder_filt_params += 1; - - param_idx += 2; + for (i = 0; i < element->cmplx_pole_count; i++) { + impd_calc_phase_filt_params( + CONFIG_COMPLEX_POLE, element->complex_pole_radius[i], + element->complex_pole_angle[i], matching_ph_filt); } + } + impd_calc_phase_filt_delay(element, matching_ph_filt); - interm_filt_params->filter_param_count_of_zeros = param_idx; - param_idx = 0; + matching_ph_filt->num_matches_filter = 1; + matching_ph_filt->matches_filter[0] = filt_ele_idx; - pstr_2nd_oder_filt_params = &interm_filt_params->ord_2_filt_params_of_poles[0]; + return; +} - for (i=0; i<element->real_pole_count; i++) - { - FLOAT32 radius = element->real_pole_radius[i]; - pstr_2nd_oder_filt_params->radius = radius; - coeff = pstr_2nd_oder_filt_params->coeff; - coeff[0] = -2.0f * radius; - coeff[1] = radius * radius; - param_idx += 1; - pstr_2nd_oder_filt_params += 1; +WORD32 impd_calc_filt_params(ia_unique_td_filt_element* element, + ia_interm_filt_params_struct* interm_filt_params) { + FLOAT32 zReal; + FLOAT32* coeff; + // WORD32 offset_idx = 0; + WORD32 i; + WORD32 param_idx = 0; + + ia_2nd_order_filt_params_struct* pstr_2nd_oder_filt_params = + &interm_filt_params->ord_2_filt_params_of_zeros[0]; + + for (i = 0; i < element->bs_real_zero_radius_one_count; i += 2) { + FLOAT32 radius = (FLOAT32)element->zero_sign[i + 0]; + FLOAT32 angle = (FLOAT32)element->zero_sign[i + 1]; + FLOAT32 angle1 = radius; + FLOAT32 angle2 = angle; + pstr_2nd_oder_filt_params->radius = 1.0f; + coeff = pstr_2nd_oder_filt_params->coeff; + + if (angle1 != angle2) { + coeff[0] = 0.0f; + coeff[1] = -1.0f; + } else if (angle1 == 1.0f) { + coeff[0] = -2.0f; + coeff[1] = 1.0f; + } else { + coeff[0] = 2.0f; + coeff[1] = 1.0f; } - - for (i=0; i<element->cmplx_pole_count; i++) - { - FLOAT32 radius = element->complex_pole_radius[i]; - FLOAT32 angle = element->complex_pole_angle[i]; - - zReal = radius * (FLOAT32)cos(M_PI * angle); - pstr_2nd_oder_filt_params->radius = radius; - coeff = pstr_2nd_oder_filt_params->coeff; - coeff[0] = -2.0f * zReal; - coeff[1] = radius * radius; - - pstr_2nd_oder_filt_params += 1; - - pstr_2nd_oder_filt_params->radius = radius; - pstr_2nd_oder_filt_params->coeff[0] = coeff[0]; - pstr_2nd_oder_filt_params->coeff[1] = coeff[1]; - - pstr_2nd_oder_filt_params += 1; - param_idx += 2; + pstr_2nd_oder_filt_params += 1; + param_idx += 1; + } + for (i = 0; i < element->real_zero_count; i++) { + FLOAT32 radius = element->real_zero_radius[i]; + // FLOAT32 angle = 0.0f; + + pstr_2nd_oder_filt_params->radius = radius; + if (fabs(radius) == 1.0f) { + return (-1); + } else { + coeff = pstr_2nd_oder_filt_params->coeff; + coeff[0] = -(radius + 1.0f / radius); + coeff[1] = 1.0f; } - interm_filt_params->filter_param_count_of_poles = param_idx; - return 0; + pstr_2nd_oder_filt_params += 1; + param_idx += 1; + } + + for (i = 0; i < element->generic_zero_count; i++) { + FLOAT32 radius = element->generic_zero_radius[i]; + FLOAT32 angle = element->generic_zero_angle[i]; + zReal = radius * (FLOAT32)cos(M_PI * angle); + pstr_2nd_oder_filt_params->radius = radius; + coeff = pstr_2nd_oder_filt_params->coeff; + coeff[0] = -2.0f * zReal; + coeff[1] = radius * radius; + + pstr_2nd_oder_filt_params += 1; + + zReal = (FLOAT32)cos(M_PI * angle) / radius; + pstr_2nd_oder_filt_params->radius = radius; + coeff = pstr_2nd_oder_filt_params->coeff; + coeff[0] = -2.0f * zReal; + coeff[1] = 1.0f / (radius * radius); + + pstr_2nd_oder_filt_params += 1; + + param_idx += 2; + } + + interm_filt_params->filter_param_count_of_zeros = param_idx; + param_idx = 0; + + pstr_2nd_oder_filt_params = + &interm_filt_params->ord_2_filt_params_of_poles[0]; + + for (i = 0; i < element->real_pole_count; i++) { + FLOAT32 radius = element->real_pole_radius[i]; + pstr_2nd_oder_filt_params->radius = radius; + coeff = pstr_2nd_oder_filt_params->coeff; + coeff[0] = -2.0f * radius; + coeff[1] = radius * radius; + param_idx += 1; + pstr_2nd_oder_filt_params += 1; + } + + for (i = 0; i < element->cmplx_pole_count; i++) { + FLOAT32 radius = element->complex_pole_radius[i]; + FLOAT32 angle = element->complex_pole_angle[i]; + + zReal = radius * (FLOAT32)cos(M_PI * angle); + pstr_2nd_oder_filt_params->radius = radius; + coeff = pstr_2nd_oder_filt_params->coeff; + coeff[0] = -2.0f * zReal; + coeff[1] = radius * radius; + + pstr_2nd_oder_filt_params += 1; + + pstr_2nd_oder_filt_params->radius = radius; + pstr_2nd_oder_filt_params->coeff[0] = coeff[0]; + pstr_2nd_oder_filt_params->coeff[1] = coeff[1]; + + pstr_2nd_oder_filt_params += 1; + param_idx += 2; + } + interm_filt_params->filter_param_count_of_poles = param_idx; + return 0; } -VOID impd_convert_fir_filt_params(WORD32 fir_filt_order, - WORD32 fir_symmetry, +VOID impd_convert_fir_filt_params(WORD32 fir_filt_order, WORD32 fir_symmetry, FLOAT32* fir_coeff, - ia_fir_filter_struct* fir_filter) -{ - WORD32 i, channel; - FLOAT32* coeff = fir_filter->coeff; - - fir_filter->coeff_count = fir_filt_order + 1; - for (i=0; i<fir_filt_order/2+1; i++) { - coeff[i] = fir_coeff[i]; + ia_fir_filter_struct* fir_filter) { + WORD32 i, channel; + FLOAT32* coeff = fir_filter->coeff; + + fir_filter->coeff_count = fir_filt_order + 1; + for (i = 0; i < fir_filt_order / 2 + 1; i++) { + coeff[i] = fir_coeff[i]; + } + + if (fir_symmetry == 1) { + for (i = 0; i < (fir_filt_order + 1) / 2; i++) { + coeff[fir_filt_order - i] = -coeff[i]; } - if (fir_symmetry==1) - { - for (i=0; i<(fir_filt_order+1)/2; i++) - { - coeff[fir_filt_order-i] = - coeff[i]; - } - - if((fir_filt_order & 1) == 0) - { - coeff[fir_filt_order/2] = 0.0f; - } + if ((fir_filt_order & 1) == 0) { + coeff[fir_filt_order / 2] = 0.0f; } - else - { - for (i=0; i<(fir_filt_order+1)/2; i++) - { - coeff[fir_filt_order-i] = coeff[i]; - } + } else { + for (i = 0; i < (fir_filt_order + 1) / 2; i++) { + coeff[fir_filt_order - i] = coeff[i]; } + } - for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++) - { - for (i=0; i<fir_filt_order+1; i++) { - fir_filter->state[channel][i] = 0.0f; - } + for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) { + for (i = 0; i < fir_filt_order + 1; i++) { + fir_filter->state[channel][i] = 0.0f; } - return; + } + return; } -WORD32 impd_calc_filt_params_all(ia_unique_td_filt_element* element, - ia_interm_filt_params_struct* interm_filt_params) -{ - WORD32 err = 0; - - interm_filt_params->filter_format = element->eq_filter_format; - if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) - { - err = impd_calc_filt_params(element, - interm_filt_params); - if(err) - return err; - } - else - { - interm_filt_params->filter_param_count_of_zeros = 0; - interm_filt_params->filter_param_count_of_poles = 0; - - impd_convert_fir_filt_params (element->fir_filt_order, - element->fir_symmetry, - element->fir_coeff, - &interm_filt_params->fir_filter); - } - return (0); +WORD32 impd_calc_filt_params_all( + ia_unique_td_filt_element* element, + ia_interm_filt_params_struct* interm_filt_params) { + WORD32 err = 0; + + interm_filt_params->filter_format = element->eq_filter_format; + if (element->eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) { + err = impd_calc_filt_params(element, interm_filt_params); + if (err) return err; + } else { + interm_filt_params->filter_param_count_of_zeros = 0; + interm_filt_params->filter_param_count_of_poles = 0; + + impd_convert_fir_filt_params(element->fir_filt_order, element->fir_symmetry, + element->fir_coeff, + &interm_filt_params->fir_filter); + } + return (0); } -VOID impd_calc_eq_filt_elements(ia_interm_filt_params_struct* interm_filt_params, - ia_eq_filt_ele_struct* eq_filt_element) -{ - WORD32 i, poles_idx, zeros_idx, pole_order = 0, section, channel; - WORD32 poles_over[REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX]; - WORD32 zeros_over[REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX]; - FLOAT32 max_radius, diff_radius; - WORD32 coeff_count; - FLOAT32* coeff; - - for (i=0; i<REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX; i++) - { - poles_over[i] = 0; - } - for (i=0; i<REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX; i++) - { - zeros_over[i] = 0; - } - section = 0; - do - { - max_radius = -1.0; - poles_idx = -1; - for (i=0; i<interm_filt_params->filter_param_count_of_poles; i++) - { - if (poles_over[i] == 0) - { - if (interm_filt_params->filter_format == 0) - { - if (max_radius < fabs(interm_filt_params->ord_2_filt_params_of_poles[i].radius)) - { - max_radius = (FLOAT32)fabs(interm_filt_params->ord_2_filt_params_of_poles[i].radius); - poles_idx = i; - if (interm_filt_params->ord_2_filt_params_of_poles[i].coeff[1] != 0.0f) - { - pole_order = 2; - } - else - { - pole_order = 1; - } - } - } +VOID impd_calc_eq_filt_elements( + ia_interm_filt_params_struct* interm_filt_params, + ia_eq_filt_ele_struct* eq_filt_element) { + WORD32 i, poles_idx, zeros_idx, pole_order = 0, section, channel; + WORD32 poles_over[REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX]; + WORD32 zeros_over[REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX]; + FLOAT32 max_radius, diff_radius; + WORD32 coeff_count; + FLOAT32* coeff; + + for (i = 0; i < REAL_POLE_COUNT_MAX + COMPLEX_POLE_COUNT_MAX; i++) { + poles_over[i] = 0; + } + for (i = 0; i < REAL_ZERO_COUNT_MAX + COMPLEX_ZERO_COUNT_MAX; i++) { + zeros_over[i] = 0; + } + section = 0; + do { + max_radius = -1.0; + poles_idx = -1; + for (i = 0; i < interm_filt_params->filter_param_count_of_poles; i++) { + if (poles_over[i] == 0) { + if (interm_filt_params->filter_format == 0) { + if (max_radius < + fabs(interm_filt_params->ord_2_filt_params_of_poles[i].radius)) { + max_radius = (FLOAT32)fabs( + interm_filt_params->ord_2_filt_params_of_poles[i].radius); + poles_idx = i; + if (interm_filt_params->ord_2_filt_params_of_poles[i].coeff[1] != + 0.0f) { + pole_order = 2; + } else { + pole_order = 1; } + } } - if (poles_idx >= 0) - { - diff_radius = 10.0f; - zeros_idx = -1; - for (i=0; i<interm_filt_params->filter_param_count_of_zeros; i++) - { - if (zeros_over[i] == 0) - { - if (interm_filt_params->filter_format == 0) - { - if (pole_order == 2) { - if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] != 0.0f) - { - if (diff_radius > fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)) - { - diff_radius = (FLOAT32)fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius); - zeros_idx = i; - } - } - } - else - { - if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] == 0.0f) - { - if (diff_radius > (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius))) - { - diff_radius = (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)); - zeros_idx = i; - } - } - } - } + } + } + if (poles_idx >= 0) { + diff_radius = 10.0f; + zeros_idx = -1; + for (i = 0; i < interm_filt_params->filter_param_count_of_zeros; i++) { + if (zeros_over[i] == 0) { + if (interm_filt_params->filter_format == 0) { + if (pole_order == 2) { + if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] != + 0.0f) { + if (diff_radius > + fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius)) { + diff_radius = (FLOAT32)fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius); + zeros_idx = i; } - } - if (zeros_idx == -1) - { - for (i=0; i<interm_filt_params->filter_param_count_of_zeros; i++) - { - if (zeros_over[i] == 0) - { - if (interm_filt_params->filter_format == 0) - { - if (pole_order == 2) { - if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] == 0.0f) - { - if (diff_radius > (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius))) - { - diff_radius = (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)); - zeros_idx = i; - } - } - } - else - { - if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] != 0.0f) - { - if (diff_radius > (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius))) - { - diff_radius = (FLOAT32)(fabs(fabs(interm_filt_params->ord_2_filt_params_of_zeros[i].radius) - max_radius)); - zeros_idx = i; - } - } - } - } - } + } + } else { + if (interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1] == + 0.0f) { + if (diff_radius > + (FLOAT32)(fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius))) { + diff_radius = (FLOAT32)(fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius)); + zeros_idx = i; } + } } - eq_filt_element->pstr_pole_zero_filt.filt_section[section].a1 = interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[0]; - eq_filt_element->pstr_pole_zero_filt.filt_section[section].a2 = interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[1]; - if (zeros_idx >= 0) - { - eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[0]; - eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[1]; - } - else - { - eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = 0.0f; - eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = 0.0f; - eq_filt_element->pstr_pole_zero_filt.audio_delay.delay++; - } - for (channel=0; channel<EQ_CHANNEL_COUNT_MAX; channel++) - { - eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].in_state_1 = 0.0f; - eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].in_state_2 = 0.0f; - eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].out_state_1 = 0.0f; - eq_filt_element->pstr_pole_zero_filt.filt_section[section].filt_sect_state[channel].out_state_2 = 0.0f; - } - if (zeros_idx >= 0) zeros_over[zeros_idx] = 1; - if (poles_idx >= 0) poles_over[poles_idx] = 1; - section++; + } } - } while (poles_idx >= 0); - - eq_filt_element->pstr_pole_zero_filt.section_count = section; - - coeff_count = 1; - coeff = eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff; - coeff[0] = 1.0f; - for (i=0; i<interm_filt_params->filter_param_count_of_zeros; i++) - { - if (zeros_over[i] == 0) - { - if (interm_filt_params->filter_format == 0) - { - WORD32 k; - FLOAT32 b1, b2; - b1 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[0]; - b2 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1]; - - coeff_count += 2; - k = coeff_count - 1; - coeff[k] = b2 * coeff[k-2]; - k--; - if (k>1) - { - coeff[k] = b1 * coeff[k-1] + b2 * coeff[k-2]; - k--; - for ( ; k>1; k--) - { - coeff[k] += b1 * coeff[k-1] + b2 * coeff[k-2]; - } - coeff[1] += b1 * coeff[0]; + } + if (zeros_idx == -1) { + for (i = 0; i < interm_filt_params->filter_param_count_of_zeros; i++) { + if (zeros_over[i] == 0) { + if (interm_filt_params->filter_format == 0) { + if (pole_order == 2) { + if (interm_filt_params->ord_2_filt_params_of_zeros[i] + .coeff[1] == 0.0f) { + if (diff_radius > + (FLOAT32)(fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius))) { + diff_radius = (FLOAT32)(fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius)); + zeros_idx = i; + } } - else - { - coeff[1] = b1 * coeff[0]; + } else { + if (interm_filt_params->ord_2_filt_params_of_zeros[i] + .coeff[1] != 0.0f) { + if (diff_radius > + (FLOAT32)(fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius))) { + diff_radius = (FLOAT32)(fabs( + fabs(interm_filt_params->ord_2_filt_params_of_zeros[i] + .radius) - + max_radius)); + zeros_idx = i; + } } + } } + } } - zeros_over[i] = 1; + } + eq_filt_element->pstr_pole_zero_filt.filt_section[section].a1 = + interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[0]; + eq_filt_element->pstr_pole_zero_filt.filt_section[section].a2 = + interm_filt_params->ord_2_filt_params_of_poles[poles_idx].coeff[1]; + if (zeros_idx >= 0) { + eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = + interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[0]; + eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = + interm_filt_params->ord_2_filt_params_of_zeros[zeros_idx].coeff[1]; + } else { + eq_filt_element->pstr_pole_zero_filt.filt_section[section].b1 = 0.0f; + eq_filt_element->pstr_pole_zero_filt.filt_section[section].b2 = 0.0f; + eq_filt_element->pstr_pole_zero_filt.audio_delay.delay++; + } + for (channel = 0; channel < EQ_CHANNEL_COUNT_MAX; channel++) { + eq_filt_element->pstr_pole_zero_filt.filt_section[section] + .filt_sect_state[channel] + .in_state_1 = 0.0f; + eq_filt_element->pstr_pole_zero_filt.filt_section[section] + .filt_sect_state[channel] + .in_state_2 = 0.0f; + eq_filt_element->pstr_pole_zero_filt.filt_section[section] + .filt_sect_state[channel] + .out_state_1 = 0.0f; + eq_filt_element->pstr_pole_zero_filt.filt_section[section] + .filt_sect_state[channel] + .out_state_2 = 0.0f; + } + if (zeros_idx >= 0) zeros_over[zeros_idx] = 1; + if (poles_idx >= 0) poles_over[poles_idx] = 1; + section++; } - if (coeff_count > 1) - { - eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 1; - eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = coeff_count; - } - else - { - eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 0; - eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = 0; + } while (poles_idx >= 0); + + eq_filt_element->pstr_pole_zero_filt.section_count = section; + + coeff_count = 1; + coeff = eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff; + coeff[0] = 1.0f; + for (i = 0; i < interm_filt_params->filter_param_count_of_zeros; i++) { + if (zeros_over[i] == 0) { + if (interm_filt_params->filter_format == 0) { + WORD32 k; + FLOAT32 b1, b2; + b1 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[0]; + b2 = interm_filt_params->ord_2_filt_params_of_zeros[i].coeff[1]; + + coeff_count += 2; + k = coeff_count - 1; + coeff[k] = b2 * coeff[k - 2]; + k--; + if (k > 1) { + coeff[k] = b1 * coeff[k - 1] + b2 * coeff[k - 2]; + k--; + for (; k > 1; k--) { + coeff[k] += b1 * coeff[k - 1] + b2 * coeff[k - 2]; + } + coeff[1] += b1 * coeff[0]; + } else { + coeff[1] = b1 * coeff[0]; + } + } } - - return; + zeros_over[i] = 1; + } + if (coeff_count > 1) { + eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 1; + eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = coeff_count; + } else { + eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag = 0; + eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count = 0; + } + + return; } WORD32 impd_calc_filt_block(ia_unique_td_filt_element* unique_td_filt_ele, ia_filt_block_struct* str_filter_block, - ia_eq_filt_block_struct* pstr_eq_filt_block) -{ - WORD32 i, k, err; - ia_interm_filt_params_struct interm_filt_params; - ia_matching_ph_filt_struct matching_ph_filt[FILTER_ELEMENT_COUNT_MAX]; - - for (i=0; i<str_filter_block->filter_element_count; i++) - { - if ((unique_td_filt_ele[str_filter_block->str_filter_element[i].filt_ele_idx].eq_filter_format == FILTER_ELEMENT_FORMAT_FIR) && (str_filter_block->filter_element_count > 1)) - { - return (-1); - } + ia_eq_filt_block_struct* pstr_eq_filt_block) { + WORD32 i, k, err; + ia_interm_filt_params_struct interm_filt_params; + ia_matching_ph_filt_struct matching_ph_filt[FILTER_ELEMENT_COUNT_MAX]; + + for (i = 0; i < str_filter_block->filter_element_count; i++) { + if ((unique_td_filt_ele[str_filter_block->str_filter_element[i] + .filt_ele_idx] + .eq_filter_format == FILTER_ELEMENT_FORMAT_FIR) && + (str_filter_block->filter_element_count > 1)) { + return (-1); } - for (i=0; i<str_filter_block->filter_element_count; i++) - { - ia_eq_filt_ele_struct* eq_filt_element = &pstr_eq_filt_block->eq_filt_element[i]; - ia_filt_ele_struct* str_filter_element = &str_filter_block->str_filter_element[i]; - WORD32 filterIndex = str_filter_element->filt_ele_idx; - - if (unique_td_filt_ele[filterIndex].eq_filter_format == FILTER_ELEMENT_FORMAT_POLE_ZERO) - { - err = impd_calc_filt_params_all(&(unique_td_filt_ele[filterIndex]), - &interm_filt_params); - if (err) - return (err); - - impd_calc_eq_filt_elements(&interm_filt_params, eq_filt_element); - - eq_filt_element->format = FILTER_ELEMENT_FORMAT_POLE_ZERO; - } - else - { - impd_convert_fir_filt_params (unique_td_filt_ele[filterIndex].fir_filt_order, - unique_td_filt_ele[filterIndex].fir_symmetry, - unique_td_filt_ele[filterIndex].fir_coeff, - &eq_filt_element->fir_filter); - - eq_filt_element->format = FILTER_ELEMENT_FORMAT_FIR; - } - if (str_filter_element->filt_ele_gain_flag == 1) - { - eq_filt_element->elementGainLinear = (FLOAT32)(pow(10.0f, 0.05f * str_filter_element->filt_ele_gain)); - } - else - { - eq_filt_element->elementGainLinear = 1.0f; - } - for (k=0; k<unique_td_filt_ele[filterIndex].real_zero_count; k++) - { - if (unique_td_filt_ele[filterIndex].real_zero_radius[k] > 0.0f) - { - eq_filt_element->elementGainLinear = - eq_filt_element->elementGainLinear; - } - } - impd_calc_phase_filt(&(unique_td_filt_ele[filterIndex]), - i, - &matching_ph_filt[i]); + } + for (i = 0; i < str_filter_block->filter_element_count; i++) { + ia_eq_filt_ele_struct* eq_filt_element = + &pstr_eq_filt_block->eq_filt_element[i]; + ia_filt_ele_struct* str_filter_element = + &str_filter_block->str_filter_element[i]; + WORD32 filterIndex = str_filter_element->filt_ele_idx; + + if (unique_td_filt_ele[filterIndex].eq_filter_format == + FILTER_ELEMENT_FORMAT_POLE_ZERO) { + err = impd_calc_filt_params_all(&(unique_td_filt_ele[filterIndex]), + &interm_filt_params); + if (err) return (err); + + impd_calc_eq_filt_elements(&interm_filt_params, eq_filt_element); + + eq_filt_element->format = FILTER_ELEMENT_FORMAT_POLE_ZERO; + } else { + impd_convert_fir_filt_params( + unique_td_filt_ele[filterIndex].fir_filt_order, + unique_td_filt_ele[filterIndex].fir_symmetry, + unique_td_filt_ele[filterIndex].fir_coeff, + &eq_filt_element->fir_filter); + + eq_filt_element->format = FILTER_ELEMENT_FORMAT_FIR; + } + if (str_filter_element->filt_ele_gain_flag == 1) { + eq_filt_element->elementGainLinear = + (FLOAT32)(pow(10.0f, 0.05f * str_filter_element->filt_ele_gain)); + } else { + eq_filt_element->elementGainLinear = 1.0f; } - pstr_eq_filt_block->element_count = str_filter_block->filter_element_count; + for (k = 0; k < unique_td_filt_ele[filterIndex].real_zero_count; k++) { + if (unique_td_filt_ele[filterIndex].real_zero_radius[k] > 0.0f) { + eq_filt_element->elementGainLinear = + -eq_filt_element->elementGainLinear; + } + } + impd_calc_phase_filt(&(unique_td_filt_ele[filterIndex]), i, + &matching_ph_filt[i]); + } + pstr_eq_filt_block->element_count = str_filter_block->filter_element_count; - pstr_eq_filt_block->matching_ph_filt_ele_0 = matching_ph_filt[0]; + pstr_eq_filt_block->matching_ph_filt_ele_0 = matching_ph_filt[0]; - return(0); + return (0); } -VOID impd_calc_cascade_phase_align_filt(ia_td_filter_cascade_struct* str_td_filter_cascade, - WORD32 ch_group_cnt) -{ - //WORD32 err = 0; - WORD32 cascade_align_grp_cnt = 0; - ia_cascade_align_group_struct pstr_cascade_align_grp[EQ_CHANNEL_GROUP_COUNT_MAX/2]; - - impd_calc_cascade_align_groups(ch_group_cnt, - str_td_filter_cascade->eq_phase_alignment_present, - str_td_filter_cascade->eq_phase_alignment, - &cascade_align_grp_cnt, - pstr_cascade_align_grp); - return; +VOID impd_calc_cascade_phase_align_filt( + ia_td_filter_cascade_struct* str_td_filter_cascade, WORD32 ch_group_cnt) { + // WORD32 err = 0; + WORD32 cascade_align_grp_cnt = 0; + ia_cascade_align_group_struct + pstr_cascade_align_grp[EQ_CHANNEL_GROUP_COUNT_MAX / 2]; + + impd_calc_cascade_align_groups( + ch_group_cnt, str_td_filter_cascade->eq_phase_alignment_present, + str_td_filter_cascade->eq_phase_alignment, &cascade_align_grp_cnt, + pstr_cascade_align_grp); + return; } - -WORD32 impd_calc_filt_cascade(ia_unique_td_filt_element* unique_td_filt_ele, - ia_filt_block_struct* str_filter_block, - ia_td_filter_cascade_struct* str_td_filter_cascade, - WORD32 ch_group_cnt, - ia_filt_cascade_td_struct filt_cascade_td[]) -{ - WORD32 i, err, g; - - for (g=0; g<ch_group_cnt; g++) - { - for (i=0; i<str_td_filter_cascade->str_filter_block_refs[g].filter_block_count; i++) - { - err = impd_calc_filt_block(unique_td_filt_ele, - &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g].filter_block_index[i]]), - &(filt_cascade_td[g].pstr_eq_filt_block[i])); - if (err) - return(err); - } - filt_cascade_td[g].block_count = i; - filt_cascade_td[g].cascade_gain_linear = (FLOAT32)(pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g])); +WORD32 impd_calc_filt_cascade( + ia_unique_td_filt_element* unique_td_filt_ele, + ia_filt_block_struct* str_filter_block, + ia_td_filter_cascade_struct* str_td_filter_cascade, WORD32 ch_group_cnt, + ia_filt_cascade_td_struct filt_cascade_td[]) { + WORD32 i, err, g; + + for (g = 0; g < ch_group_cnt; g++) { + for (i = 0; + i < str_td_filter_cascade->str_filter_block_refs[g].filter_block_count; + i++) { + err = impd_calc_filt_block( + unique_td_filt_ele, + &(str_filter_block[str_td_filter_cascade->str_filter_block_refs[g] + .filter_block_index[i]]), + &(filt_cascade_td[g].pstr_eq_filt_block[i])); + if (err) return (err); } + filt_cascade_td[g].block_count = i; + filt_cascade_td[g].cascade_gain_linear = (FLOAT32)( + pow(10.0f, 0.05f * str_td_filter_cascade->eq_cascade_gain[g])); + } - impd_calc_cascade_phase_align_filt(str_td_filter_cascade, - ch_group_cnt); - return(0); + impd_calc_cascade_phase_align_filt(str_td_filter_cascade, ch_group_cnt); + return (0); } - VOID impd_calc_subband_eq(ia_eq_subband_gain_vector* str_eq_subband_gain_vector, WORD32 eq_subband_gain_count, - ia_subband_filt_struct* subband_filt) -{ - WORD32 i; - - for (i=0; i<eq_subband_gain_count; i++) - { - subband_filt->subband_coeff[i] = str_eq_subband_gain_vector->eq_subband_gain[i]; - } - subband_filt->coeff_count = eq_subband_gain_count; - return ; + ia_subband_filt_struct* subband_filt) { + WORD32 i; + + for (i = 0; i < eq_subband_gain_count; i++) { + subband_filt->subband_coeff[i] = + str_eq_subband_gain_vector->eq_subband_gain[i]; + } + subband_filt->coeff_count = eq_subband_gain_count; + return; } -FLOAT32 impd_decode_eq_node_freq(WORD32 eq_node_freq_idx) -{ - /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) / (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/ - FLOAT32 step_ratio = 0.0739601809794f; - return((FLOAT32)(pow(STEP_RATIO_F_LO, 1.0f + eq_node_freq_idx * step_ratio))); +FLOAT32 impd_decode_eq_node_freq(WORD32 eq_node_freq_idx) { + /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) / + * (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/ + FLOAT32 step_ratio = 0.0739601809794f; + return ( + (FLOAT32)(pow(STEP_RATIO_F_LO, 1.0f + eq_node_freq_idx * step_ratio))); } -FLOAT32 impd_calc_warp_freq_delta(FLOAT32 fsubband, - FLOAT32 node_freq, - WORD32 eq_node_freq_idx) -{ - /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) / (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/ - FLOAT32 step_ratio = 0.0739601809794f; - return((FLOAT32)((log10(fsubband)/log10(node_freq) - 1.0f) / step_ratio - (FLOAT32) eq_node_freq_idx)); +FLOAT32 impd_calc_warp_freq_delta(FLOAT32 fsubband, FLOAT32 node_freq, + WORD32 eq_node_freq_idx) { + /*((FLOAT32)((log10(STEP_RATIO_F_HI) / log10(STEP_RATIO_F_LO) - 1.0f) / + * (STEP_RATIO_EQ_NODE_COUNT_MAX - 1.0f)))*/ + FLOAT32 step_ratio = 0.0739601809794f; + return ((FLOAT32)((log10(fsubband) / log10(node_freq) - 1.0f) / step_ratio - + (FLOAT32)eq_node_freq_idx)); } -VOID impd_interpolate_eq_gain(WORD32 band_step, - FLOAT32 left_gain, - FLOAT32 right_gain, - FLOAT32 left_slope, - FLOAT32 right_slope, - FLOAT32 f, - FLOAT32* interpolated_gain) -{ - FLOAT32 k1, k2, a, b, c, d; - FLOAT32 inv_band_step =(FLOAT32)( 1.0 / (FLOAT32)band_step); - FLOAT32 inv_band_step_sqr = inv_band_step * inv_band_step; k1 = (right_gain - left_gain) * inv_band_step_sqr; - left_slope = (FLOAT32) (left_slope / 3.128f); - right_slope = (FLOAT32) (right_slope / 3.128f); - - k2 = right_slope + left_slope; - a = inv_band_step * (inv_band_step * k2 - 2.0f * k1); b = 3.0f * k1 - inv_band_step * (k2 + left_slope); - c = left_slope; - d = left_gain; - *interpolated_gain = (((a * f + b ) * f + c ) * f ) + d; - return; +VOID impd_interpolate_eq_gain(WORD32 band_step, FLOAT32 left_gain, + FLOAT32 right_gain, FLOAT32 left_slope, + FLOAT32 right_slope, FLOAT32 f, + FLOAT32* interpolated_gain) { + FLOAT32 k1, k2, a, b, c, d; + FLOAT32 inv_band_step = (FLOAT32)(1.0 / (FLOAT32)band_step); + FLOAT32 inv_band_step_sqr = inv_band_step * inv_band_step; + k1 = (right_gain - left_gain) * inv_band_step_sqr; + left_slope = (FLOAT32)(left_slope / 3.128f); + right_slope = (FLOAT32)(right_slope / 3.128f); + + k2 = right_slope + left_slope; + a = inv_band_step * (inv_band_step * k2 - 2.0f * k1); + b = 3.0f * k1 - inv_band_step * (k2 + left_slope); + c = left_slope; + d = left_gain; + *interpolated_gain = (((a * f + b) * f + c) * f) + d; + return; } -WORD32 impd_interpolate_subband_spline(ia_eq_subband_gain_spline_struct* str_eq_subband_gain_spline, - WORD32 eq_subband_gain_count, - WORD32 eq_subband_gain_format, - FLOAT32 sample_rate, - ia_subband_filt_struct* subband_filt) -{ - WORD32 b, n, err; - - FLOAT32 eq_gain[32]; - WORD32 eq_node_freq_idx[32]; - FLOAT32 eq_node_freq[32]; - FLOAT32 subband_center_freq[256]; - WORD32 num_eq_nodes = str_eq_subband_gain_spline->num_eq_nodes; - - FLOAT32* eq_slope = str_eq_subband_gain_spline->eq_slope; - WORD32* eq_freq_delta = str_eq_subband_gain_spline->eq_freq_delta; - FLOAT32 eq_gain_initial = str_eq_subband_gain_spline->eq_gain_initial; - FLOAT32* eq_gain_delta = str_eq_subband_gain_spline->eq_gain_delta; - - FLOAT32* subband_coeff = subband_filt->subband_coeff; - WORD32 max_eq_node_idx = 32; - - eq_gain[0] = eq_gain_initial; - eq_node_freq_idx[0] = 0; - eq_node_freq[0] = impd_decode_eq_node_freq(eq_node_freq_idx[0]); - for (n=1; n<num_eq_nodes; n++) { - eq_gain[n] = eq_gain[n-1] + eq_gain_delta[n]; - eq_node_freq_idx[n] = eq_node_freq_idx[n-1] + eq_freq_delta[n]; - eq_node_freq[n] = impd_decode_eq_node_freq(eq_node_freq_idx[n]); - } - if ((eq_node_freq[num_eq_nodes-1] < sample_rate * 0.5f) && (eq_node_freq_idx[num_eq_nodes-1] < max_eq_node_idx)) { - eq_slope[num_eq_nodes] = 0; - eq_gain[num_eq_nodes] = eq_gain[num_eq_nodes-1]; - eq_freq_delta[num_eq_nodes] = max_eq_node_idx - eq_node_freq_idx[num_eq_nodes-1]; - eq_node_freq_idx[num_eq_nodes] = max_eq_node_idx; - eq_node_freq [num_eq_nodes] = impd_decode_eq_node_freq(eq_node_freq_idx[num_eq_nodes]); num_eq_nodes += 1; - } - - err = impd_derive_subband_center_freq(eq_subband_gain_count, eq_subband_gain_format, sample_rate, subband_center_freq); - if (err) - return (err); - - for (n=0; n<num_eq_nodes-1; n++) - { - for (b=0; b<eq_subband_gain_count; b++) - { - FLOAT32 fSub; - fSub = max(subband_center_freq[b], eq_node_freq[0]); - fSub = min(fSub, eq_node_freq[num_eq_nodes-1]); - if ((fSub >= eq_node_freq[n]) && (fSub <= eq_node_freq[n+1])) - { - FLOAT32 warpedDeltaFreq = impd_calc_warp_freq_delta (fSub, eq_node_freq[0], eq_node_freq_idx[n]); - FLOAT32 gEqSubbandDb; - impd_interpolate_eq_gain(eq_freq_delta[n+1], eq_gain[n], eq_gain[n+1], - eq_slope[n], eq_slope[n+1], warpedDeltaFreq, &gEqSubbandDb); - - subband_coeff[b] = (FLOAT32)pow(2.0, gEqSubbandDb / 6.0f); - } - } +WORD32 impd_interpolate_subband_spline( + ia_eq_subband_gain_spline_struct* str_eq_subband_gain_spline, + WORD32 eq_subband_gain_count, WORD32 eq_subband_gain_format, + FLOAT32 sample_rate, ia_subband_filt_struct* subband_filt) { + WORD32 b, n, err; + + FLOAT32 eq_gain[32]; + WORD32 eq_node_freq_idx[32]; + FLOAT32 eq_node_freq[32]; + FLOAT32 subband_center_freq[256]; + WORD32 num_eq_nodes = str_eq_subband_gain_spline->num_eq_nodes; + + FLOAT32* eq_slope = str_eq_subband_gain_spline->eq_slope; + WORD32* eq_freq_delta = str_eq_subband_gain_spline->eq_freq_delta; + FLOAT32 eq_gain_initial = str_eq_subband_gain_spline->eq_gain_initial; + FLOAT32* eq_gain_delta = str_eq_subband_gain_spline->eq_gain_delta; + + FLOAT32* subband_coeff = subband_filt->subband_coeff; + WORD32 max_eq_node_idx = 32; + + eq_gain[0] = eq_gain_initial; + eq_node_freq_idx[0] = 0; + eq_node_freq[0] = impd_decode_eq_node_freq(eq_node_freq_idx[0]); + for (n = 1; n < num_eq_nodes; n++) { + eq_gain[n] = eq_gain[n - 1] + eq_gain_delta[n]; + eq_node_freq_idx[n] = eq_node_freq_idx[n - 1] + eq_freq_delta[n]; + eq_node_freq[n] = impd_decode_eq_node_freq(eq_node_freq_idx[n]); + } + if ((eq_node_freq[num_eq_nodes - 1] < sample_rate * 0.5f) && + (eq_node_freq_idx[num_eq_nodes - 1] < max_eq_node_idx)) { + eq_slope[num_eq_nodes] = 0; + eq_gain[num_eq_nodes] = eq_gain[num_eq_nodes - 1]; + eq_freq_delta[num_eq_nodes] = + max_eq_node_idx - eq_node_freq_idx[num_eq_nodes - 1]; + eq_node_freq_idx[num_eq_nodes] = max_eq_node_idx; + eq_node_freq[num_eq_nodes] = + impd_decode_eq_node_freq(eq_node_freq_idx[num_eq_nodes]); + num_eq_nodes += 1; + } + + err = impd_derive_subband_center_freq(eq_subband_gain_count, + eq_subband_gain_format, sample_rate, + subband_center_freq); + if (err) return (err); + + for (n = 0; n < num_eq_nodes - 1; n++) { + for (b = 0; b < eq_subband_gain_count; b++) { + FLOAT32 fSub; + fSub = max(subband_center_freq[b], eq_node_freq[0]); + fSub = min(fSub, eq_node_freq[num_eq_nodes - 1]); + if ((fSub >= eq_node_freq[n]) && (fSub <= eq_node_freq[n + 1])) { + FLOAT32 warpedDeltaFreq = impd_calc_warp_freq_delta( + fSub, eq_node_freq[0], eq_node_freq_idx[n]); + FLOAT32 gEqSubbandDb; + impd_interpolate_eq_gain(eq_freq_delta[n + 1], eq_gain[n], + eq_gain[n + 1], eq_slope[n], eq_slope[n + 1], + warpedDeltaFreq, &gEqSubbandDb); + + subband_coeff[b] = (FLOAT32)pow(2.0, gEqSubbandDb / 6.0f); + } } - subband_filt->coeff_count = eq_subband_gain_count; - return (0); + } + subband_filt->coeff_count = eq_subband_gain_count; + return (0); } WORD32 impd_calc_subband_gains(ia_eq_coeff_struct* str_eq_coeff, WORD32 eq_ch_group_count, - WORD32* subband_gains_index, - FLOAT32 sample_rate, + WORD32* subband_gains_index, FLOAT32 sample_rate, WORD32 eq_frame_size_subband, - ia_subband_filt_struct* subband_filt) -{ - WORD32 g, err; - WORD32 eq_subband_gain_representation = str_eq_coeff->eq_subband_gain_representation; - WORD32 eq_subband_gain_count = str_eq_coeff->eq_subband_gain_count; - WORD32 eq_subband_gain_format = str_eq_coeff->eq_subband_gain_format; - - for (g=0; g<eq_ch_group_count; g++) - { - if (eq_subband_gain_representation == 1) - { - err = impd_interpolate_subband_spline(&(str_eq_coeff->str_eq_subband_gain_spline[subband_gains_index[g]]), - eq_subband_gain_count, - eq_subband_gain_format, - sample_rate, - &(subband_filt[g])); - if (err) - return(err); - } - else - { - impd_calc_subband_eq(&(str_eq_coeff->str_eq_subband_gain_vector[subband_gains_index[g]]), - eq_subband_gain_count, - &(subband_filt[g])); - } - subband_filt[g].eq_frame_size_subband = eq_frame_size_subband; + ia_subband_filt_struct* subband_filt) { + WORD32 g, err; + WORD32 eq_subband_gain_representation = + str_eq_coeff->eq_subband_gain_representation; + WORD32 eq_subband_gain_count = str_eq_coeff->eq_subband_gain_count; + WORD32 eq_subband_gain_format = str_eq_coeff->eq_subband_gain_format; + + for (g = 0; g < eq_ch_group_count; g++) { + if (eq_subband_gain_representation == 1) { + err = impd_interpolate_subband_spline( + &(str_eq_coeff->str_eq_subband_gain_spline[subband_gains_index[g]]), + eq_subband_gain_count, eq_subband_gain_format, sample_rate, + &(subband_filt[g])); + if (err) return (err); + } else { + impd_calc_subband_eq( + &(str_eq_coeff->str_eq_subband_gain_vector[subband_gains_index[g]]), + eq_subband_gain_count, &(subband_filt[g])); } - return (0); + subband_filt[g].eq_frame_size_subband = eq_frame_size_subband; + } + return (0); } VOID impd_calc_filt_sect_delay(WORD32 section_count, ia_filt_sect_struct* filt_section, - FLOAT32* delay) -{ - WORD32 i; - FLOAT32 d = 0.0f; - for (i=0; i<section_count; i++) - { - if (filt_section[i].b2 != 0.0f) - { - d += 1.0f; - } - else if (filt_section[i].b1 != 0.0f) - { - d += 0.5f; - } + FLOAT32* delay) { + WORD32 i; + FLOAT32 d = 0.0f; + for (i = 0; i < section_count; i++) { + if (filt_section[i].b2 != 0.0f) { + d += 1.0f; + } else if (filt_section[i].b1 != 0.0f) { + d += 0.5f; } - *delay = d; - return; + } + *delay = d; + return; } -VOID impd_get_eq_set_delay(ia_eq_set_struct* eq_set, - WORD32* cascade_delay) -{ - FLOAT32 delay, sect_delay; - WORD32 k, g, c, b; - - delay = 0; - for (c=0; c<eq_set->audio_num_chan; c++) - { - g = eq_set->eq_ch_group_of_channel[c]; - if (g>=0) - { - switch (eq_set->domain) - { - case EQ_FILTER_DOMAIN_TIME: - { - ia_filt_cascade_td_struct* filt_cascade_td = &eq_set->filt_cascade_td[g]; - for (b=0; b<filt_cascade_td->block_count; b++) - { - ia_eq_filt_ele_struct* eq_filt_element = &filt_cascade_td->pstr_eq_filt_block[b].eq_filt_element[0]; - switch (eq_filt_element->format) - { - case FILTER_ELEMENT_FORMAT_POLE_ZERO: - impd_calc_filt_sect_delay(eq_filt_element->pstr_pole_zero_filt.section_count, - eq_filt_element->pstr_pole_zero_filt.filt_section, - §_delay); - delay += sect_delay; - if (eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag) - { - delay += 0.5f * (eq_filt_element->pstr_pole_zero_filt.fir_filter.coeff_count - 1); - } - break; - case FILTER_ELEMENT_FORMAT_FIR: - delay += 0.5f * (eq_filt_element->fir_filter.coeff_count - 1); - break; - default: - break; - } - for (k=0; k < eq_filt_element->num_ph_align_filt; k++) - { - ia_ph_alignment_filt_struct* ph_alignment_filt = &eq_filt_element->ph_alignment_filt[k]; - impd_calc_filt_sect_delay(ph_alignment_filt->section_count, - ph_alignment_filt->filt_section, - §_delay); - delay += sect_delay; - } - } - for (b=0; b<filt_cascade_td->num_ph_align_filt; b++) - { - ia_ph_alignment_filt_struct* ph_alignment_filt = &filt_cascade_td->ph_alignment_filt[b]; - impd_calc_filt_sect_delay(ph_alignment_filt->section_count, - ph_alignment_filt->filt_section, - §_delay); - delay += sect_delay; - } +VOID impd_get_eq_set_delay(ia_eq_set_struct* eq_set, WORD32* cascade_delay) { + FLOAT32 delay, sect_delay; + WORD32 k, g, c, b; + + delay = 0; + for (c = 0; c < eq_set->audio_num_chan; c++) { + g = eq_set->eq_ch_group_of_channel[c]; + if (g >= 0) { + switch (eq_set->domain) { + case EQ_FILTER_DOMAIN_TIME: { + ia_filt_cascade_td_struct* filt_cascade_td = + &eq_set->filt_cascade_td[g]; + for (b = 0; b < filt_cascade_td->block_count; b++) { + ia_eq_filt_ele_struct* eq_filt_element = + &filt_cascade_td->pstr_eq_filt_block[b].eq_filt_element[0]; + switch (eq_filt_element->format) { + case FILTER_ELEMENT_FORMAT_POLE_ZERO: + impd_calc_filt_sect_delay( + eq_filt_element->pstr_pole_zero_filt.section_count, + eq_filt_element->pstr_pole_zero_filt.filt_section, + §_delay); + delay += sect_delay; + if (eq_filt_element->pstr_pole_zero_filt.filt_coeffs_flag) { + delay += 0.5f * (eq_filt_element->pstr_pole_zero_filt + .fir_filter.coeff_count - + 1); } - break; - case EQ_FILTER_DOMAIN_SUBBAND: - case EQ_FILTER_DOMAIN_NONE: - default: - break; + break; + case FILTER_ELEMENT_FORMAT_FIR: + delay += 0.5f * (eq_filt_element->fir_filter.coeff_count - 1); + break; + default: + break; } - } - break; + for (k = 0; k < eq_filt_element->num_ph_align_filt; k++) { + ia_ph_alignment_filt_struct* ph_alignment_filt = + &eq_filt_element->ph_alignment_filt[k]; + impd_calc_filt_sect_delay(ph_alignment_filt->section_count, + ph_alignment_filt->filt_section, + §_delay); + delay += sect_delay; + } + } + for (b = 0; b < filt_cascade_td->num_ph_align_filt; b++) { + ia_ph_alignment_filt_struct* ph_alignment_filt = + &filt_cascade_td->ph_alignment_filt[b]; + impd_calc_filt_sect_delay(ph_alignment_filt->section_count, + ph_alignment_filt->filt_section, + §_delay); + delay += sect_delay; + } + } break; + case EQ_FILTER_DOMAIN_SUBBAND: + case EQ_FILTER_DOMAIN_NONE: + default: + break; + } } - *cascade_delay = (WORD32)delay; - return; + break; + } + *cascade_delay = (WORD32)delay; + return; } WORD32 impd_derive_eq_set(ia_eq_coeff_struct* str_eq_coeff, ia_eq_instructions_struct* str_eq_instructions, - FLOAT32 sample_rate, - WORD32 drc_frame_size, + FLOAT32 sample_rate, WORD32 drc_frame_size, WORD32 sub_band_domain_mode, - ia_eq_set_struct* eq_set) -{ - WORD32 err, i, eq_frame_size_subband; - - eq_set->domain = EQ_FILTER_DOMAIN_NONE; - - if (sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - if (str_eq_instructions->td_filter_cascade_present== 1) - { - err = impd_calc_filt_cascade(str_eq_coeff->unique_td_filt_ele, - str_eq_coeff->str_filter_block, - &str_eq_instructions->str_td_filter_cascade, - str_eq_instructions->eq_ch_group_count, - eq_set->filt_cascade_td); - if (err) - return (err); - } - - eq_set->domain |= EQ_FILTER_DOMAIN_TIME; + ia_eq_set_struct* eq_set) { + WORD32 err, i, eq_frame_size_subband; + + eq_set->domain = EQ_FILTER_DOMAIN_NONE; + + if (sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF) { + if (str_eq_instructions->td_filter_cascade_present == 1) { + err = impd_calc_filt_cascade( + str_eq_coeff->unique_td_filt_ele, str_eq_coeff->str_filter_block, + &str_eq_instructions->str_td_filter_cascade, + str_eq_instructions->eq_ch_group_count, eq_set->filt_cascade_td); + if (err) return (err); } - if (sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF) - { - switch (sub_band_domain_mode) - { - case SUBBAND_DOMAIN_MODE_QMF64: - if (str_eq_coeff->eq_subband_gain_count != AUDIO_CODEC_SUBBAND_COUNT_QMF64) - { - return (-1); - } - eq_frame_size_subband = drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - break; - case SUBBAND_DOMAIN_MODE_QMF71: - if (str_eq_coeff->eq_subband_gain_count != AUDIO_CODEC_SUBBAND_COUNT_QMF71) - { - return (-1); - } - eq_frame_size_subband = drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; - break; - case SUBBAND_DOMAIN_MODE_STFT256: - if (str_eq_coeff->eq_subband_gain_count != AUDIO_CODEC_SUBBAND_COUNT_STFT256) - { - return (-1); - } - eq_frame_size_subband = drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - break; - default: - return (-1); - break; + + eq_set->domain |= EQ_FILTER_DOMAIN_TIME; + } + if (sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF) { + switch (sub_band_domain_mode) { + case SUBBAND_DOMAIN_MODE_QMF64: + if (str_eq_coeff->eq_subband_gain_count != + AUDIO_CODEC_SUBBAND_COUNT_QMF64) { + return (-1); } - if (str_eq_instructions->subband_gains_present== 1) - { - err = impd_calc_subband_gains(str_eq_coeff, - str_eq_instructions->eq_ch_group_count, - str_eq_instructions->subband_gains_index, - sample_rate, - eq_frame_size_subband, - eq_set->subband_filt); - if (err) - return (err); + eq_frame_size_subband = + drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; + break; + case SUBBAND_DOMAIN_MODE_QMF71: + if (str_eq_coeff->eq_subband_gain_count != + AUDIO_CODEC_SUBBAND_COUNT_QMF71) { + return (-1); } - else - { - if (str_eq_instructions->td_filter_cascade_present== 1) - { - err = impd_calc_subband_gains_td_cascade(str_eq_coeff->unique_td_filt_ele, - str_eq_coeff->str_filter_block, - &str_eq_instructions->str_td_filter_cascade, - str_eq_coeff->eq_subband_gain_format, - str_eq_instructions->eq_ch_group_count, - sample_rate, - eq_frame_size_subband, - eq_set->subband_filt); - if (err) - return (err); - } - + eq_frame_size_subband = + drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; + break; + case SUBBAND_DOMAIN_MODE_STFT256: + if (str_eq_coeff->eq_subband_gain_count != + AUDIO_CODEC_SUBBAND_COUNT_STFT256) { + return (-1); } - eq_set->domain |= EQ_FILTER_DOMAIN_SUBBAND; + eq_frame_size_subband = + drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; + break; + default: + return (-1); + break; } - eq_set->audio_num_chan = str_eq_instructions->eq_channel_count; - eq_set->eq_ch_group_count = str_eq_instructions->eq_ch_group_count; - - for (i=0; i<str_eq_instructions->eq_channel_count; i++) - { - eq_set->eq_ch_group_of_channel[i] = str_eq_instructions->eq_ch_group_of_channel[i]; + if (str_eq_instructions->subband_gains_present == 1) { + err = impd_calc_subband_gains( + str_eq_coeff, str_eq_instructions->eq_ch_group_count, + str_eq_instructions->subband_gains_index, sample_rate, + eq_frame_size_subband, eq_set->subband_filt); + if (err) return (err); + } else { + if (str_eq_instructions->td_filter_cascade_present == 1) { + err = impd_calc_subband_gains_td_cascade( + str_eq_coeff->unique_td_filt_ele, str_eq_coeff->str_filter_block, + &str_eq_instructions->str_td_filter_cascade, + str_eq_coeff->eq_subband_gain_format, + str_eq_instructions->eq_ch_group_count, sample_rate, + eq_frame_size_subband, eq_set->subband_filt); + if (err) return (err); + } } + eq_set->domain |= EQ_FILTER_DOMAIN_SUBBAND; + } + eq_set->audio_num_chan = str_eq_instructions->eq_channel_count; + eq_set->eq_ch_group_count = str_eq_instructions->eq_ch_group_count; + + for (i = 0; i < str_eq_instructions->eq_channel_count; i++) { + eq_set->eq_ch_group_of_channel[i] = + str_eq_instructions->eq_ch_group_of_channel[i]; + } - return (0); + return (0); } -VOID impd_process_filt_sect(ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX], - WORD32 channel, - FLOAT32* audio_out, - WORD32 section_count) -{ - WORD32 i; - - for(i = 0; i < section_count; i++) - { - ia_filt_sect_state_struct* filt_sect_state = &filt_section[i].filt_sect_state[channel]; - FLOAT32 audio_in = *audio_out; - *audio_out = audio_in + filt_section[i].b1 * filt_sect_state->in_state_1 - + filt_section[i].b2 * filt_sect_state->in_state_2 - - filt_section[i].a1 * filt_sect_state->out_state_1 - - filt_section[i].a2 * filt_sect_state->out_state_2; - - filt_sect_state->in_state_2 = filt_sect_state->in_state_1; - filt_sect_state->in_state_1 = audio_in; - filt_sect_state->out_state_2 = filt_sect_state->out_state_1; - filt_sect_state->out_state_1 = *audio_out; - } - return; +VOID impd_process_filt_sect( + ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX], + WORD32 channel, FLOAT32* audio_out, WORD32 section_count) { + WORD32 i; + + for (i = 0; i < section_count; i++) { + ia_filt_sect_state_struct* filt_sect_state = + &filt_section[i].filt_sect_state[channel]; + FLOAT32 audio_in = *audio_out; + *audio_out = audio_in + filt_section[i].b1 * filt_sect_state->in_state_1 + + filt_section[i].b2 * filt_sect_state->in_state_2 - + filt_section[i].a1 * filt_sect_state->out_state_1 - + filt_section[i].a2 * filt_sect_state->out_state_2; + + filt_sect_state->in_state_2 = filt_sect_state->in_state_1; + filt_sect_state->in_state_1 = audio_in; + filt_sect_state->out_state_2 = filt_sect_state->out_state_1; + filt_sect_state->out_state_1 = *audio_out; + } + return; } -VOID impd_fir_filt_process(ia_fir_filter_struct* fir_filter, - WORD32 channel, - FLOAT32 audio_in, - FLOAT32* audio_out) -{ - WORD32 i; - FLOAT32* coeff = fir_filter->coeff; - FLOAT32* state = fir_filter->state[channel]; - FLOAT32 sum; - sum = coeff[0] * audio_in; - for (i=1; i<fir_filter->coeff_count; i++) - { - sum += coeff[i] * state[i-1]; - } - *audio_out = sum; - for (i=fir_filter->coeff_count-2; i>0; i--) - { - state[i] = state[i-1]; - } - state[0] = audio_in; - return; +VOID impd_fir_filt_process(ia_fir_filter_struct* fir_filter, WORD32 channel, + FLOAT32 audio_in, FLOAT32* audio_out) { + WORD32 i; + FLOAT32* coeff = fir_filter->coeff; + FLOAT32* state = fir_filter->state[channel]; + FLOAT32 sum; + sum = coeff[0] * audio_in; + for (i = 1; i < fir_filter->coeff_count; i++) { + sum += coeff[i] * state[i - 1]; + } + *audio_out = sum; + for (i = fir_filter->coeff_count - 2; i > 0; i--) { + state[i] = state[i - 1]; + } + state[0] = audio_in; + return; } VOID impd_audio_delay_process(ia_audio_delay_struct* audio_delay, - WORD32 channel, - FLOAT32 audio_in, - FLOAT32* ptr_audio_out) -{ - WORD32 i; - FLOAT32* state = audio_delay->state[channel]; - if (audio_delay->delay > 0) - { - *ptr_audio_out = state[audio_delay->delay-1]; - for (i=audio_delay->delay-1; i>0; i--) - { - state[i] = state[i-1]; - } - state[0] = audio_in; - } - else - { - *ptr_audio_out = audio_in; + WORD32 channel, FLOAT32 audio_in, + FLOAT32* ptr_audio_out) { + WORD32 i; + FLOAT32* state = audio_delay->state[channel]; + if (audio_delay->delay > 0) { + *ptr_audio_out = state[audio_delay->delay - 1]; + for (i = audio_delay->delay - 1; i > 0; i--) { + state[i] = state[i - 1]; } - return; + state[0] = audio_in; + } else { + *ptr_audio_out = audio_in; + } + return; } - VOID impd_pole_zero_filt_process(ia_pole_zero_filt_struct* pstr_pole_zero_filt, - WORD32 channel, - FLOAT32 audio_in, - FLOAT32* ptr_audio_out) -{ - FLOAT32 inp = audio_in; - FLOAT32 out = inp; - - impd_process_filt_sect(pstr_pole_zero_filt->filt_section, channel, &out, pstr_pole_zero_filt->section_count); - inp = out; + WORD32 channel, FLOAT32 audio_in, + FLOAT32* ptr_audio_out) { + FLOAT32 inp = audio_in; + FLOAT32 out = inp; - if (pstr_pole_zero_filt->filt_coeffs_flag == 1) - { - impd_fir_filt_process(&pstr_pole_zero_filt->fir_filter, channel, inp, &out); - inp = out; - } - impd_audio_delay_process(&pstr_pole_zero_filt->audio_delay, channel, inp, &out); - - *ptr_audio_out = out; - return ; -} + impd_process_filt_sect(pstr_pole_zero_filt->filt_section, channel, &out, + pstr_pole_zero_filt->section_count); + inp = out; + if (pstr_pole_zero_filt->filt_coeffs_flag == 1) { + impd_fir_filt_process(&pstr_pole_zero_filt->fir_filter, channel, inp, &out); + inp = out; + } + impd_audio_delay_process(&pstr_pole_zero_filt->audio_delay, channel, inp, + &out); + *ptr_audio_out = out; + 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; -} + 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) -{ - FLOAT32 audio_in = *ptr_audio_out; - FLOAT32 inp = audio_in; - FLOAT32 out = inp; +VOID impd_phase_align_filt_process( + ia_ph_alignment_filt_struct* ph_alignment_filt, WORD32 channel, + FLOAT32* ptr_audio_out) { + FLOAT32 audio_in = *ptr_audio_out; + FLOAT32 inp = audio_in; + FLOAT32 out = inp; - impd_process_filt_sect(ph_alignment_filt->filt_section, channel, &out, ph_alignment_filt->section_count); - inp = out; + impd_process_filt_sect(ph_alignment_filt->filt_section, channel, &out, + ph_alignment_filt->section_count); + inp = out; - impd_audio_delay_process(&ph_alignment_filt->audio_delay, channel, inp, &out); + impd_audio_delay_process(&ph_alignment_filt->audio_delay, channel, inp, &out); - *ptr_audio_out = out * ph_alignment_filt->gain; - return; + *ptr_audio_out = out * ph_alignment_filt->gain; + return; } +VOID impd_eq_filt_element_process( + ia_eq_filt_block_struct str_eq_filt_block[EQ_FILTER_BLOCK_COUNT_MAX], + WORD32 channel, FLOAT32 audio_in, FLOAT32* ptr_audio_out, + WORD32 block_count) { + WORD32 i; + FLOAT32 inp = audio_in; + FLOAT32 out = inp; + WORD32 k, j; + WORD32 element_count; + for (j = 0; j < block_count; j++) { + FLOAT32 sum = 0.0f; + element_count = str_eq_filt_block[j].element_count; + for (k = 0; k < element_count; k++) { + switch (str_eq_filt_block[j].eq_filt_element[k].format) { + case FILTER_ELEMENT_FORMAT_POLE_ZERO: + impd_pole_zero_filt_process( + &str_eq_filt_block[j].eq_filt_element[k].pstr_pole_zero_filt, + channel, inp, &out); + break; + case FILTER_ELEMENT_FORMAT_FIR: + impd_fir_filt_process( + &str_eq_filt_block[j].eq_filt_element[k].fir_filter, channel, inp, + &out); + break; + default: + break; + } + out *= str_eq_filt_block[j].eq_filt_element[k].elementGainLinear; -VOID impd_eq_filt_element_process(ia_eq_filt_block_struct str_eq_filt_block[EQ_FILTER_BLOCK_COUNT_MAX], - WORD32 channel, - FLOAT32 audio_in, - FLOAT32* ptr_audio_out, - WORD32 block_count) -{ - WORD32 i; - FLOAT32 inp = audio_in; - FLOAT32 out = inp; - WORD32 k,j; - WORD32 element_count; - for(j = 0; j < block_count; j++) - { - FLOAT32 sum = 0.0f; - element_count = str_eq_filt_block[j].element_count; - for (k=0; k < element_count; k++) - { - switch (str_eq_filt_block[j].eq_filt_element[k].format) - { - case FILTER_ELEMENT_FORMAT_POLE_ZERO: - impd_pole_zero_filt_process(&str_eq_filt_block[j].eq_filt_element[k].pstr_pole_zero_filt, channel, inp, &out); - break; - case FILTER_ELEMENT_FORMAT_FIR: - impd_fir_filt_process(&str_eq_filt_block[j].eq_filt_element[k].fir_filter, channel, inp, &out); - break; - default: - break; - } - out *= str_eq_filt_block[j].eq_filt_element[k].elementGainLinear; - - for (i=0; i < str_eq_filt_block[j].eq_filt_element[k].num_ph_align_filt; i++) - { - inp = out; - impd_phase_align_filt_process(&str_eq_filt_block[j].eq_filt_element[k].ph_alignment_filt[i], - channel, - &out); - } - sum += out; - } - inp = sum; + for (i = 0; i < str_eq_filt_block[j].eq_filt_element[k].num_ph_align_filt; + i++) { + inp = out; + impd_phase_align_filt_process( + &str_eq_filt_block[j].eq_filt_element[k].ph_alignment_filt[i], + channel, &out); + } + sum += out; } - *ptr_audio_out = inp; - return; + inp = sum; + } + *ptr_audio_out = inp; + return; } - WORD32 impd_process_eq_set_time_domain(ia_eq_set_struct* pstr_eq_set, - WORD32 channel, - FLOAT32 *ptr_audio_in, - FLOAT32 *ptr_audio_out, - WORD32 frame_size) -{ - WORD32 g=pstr_eq_set->eq_ch_group_of_channel[channel],i,j; - //FLOAT32 sum = 0.0f; - //FLOAT32 temp1 = 0.0f; - - if(pstr_eq_set==NULL || g<0) - return 0; - - if (pstr_eq_set->domain | EQ_FILTER_DOMAIN_TIME) - { - for(i=0;i<frame_size;i++) - { - impd_eq_filt_element_process((pstr_eq_set->filt_cascade_td[g].pstr_eq_filt_block), - channel, - ptr_audio_in[i], - &ptr_audio_out[i], - pstr_eq_set->filt_cascade_td[g].block_count); - - for (j=0; j<pstr_eq_set->filt_cascade_td[g].num_ph_align_filt; j++) - { - impd_phase_align_filt_process(&pstr_eq_set->filt_cascade_td[g].ph_alignment_filt[j], - channel, - &ptr_audio_out[i]); - } - - ptr_audio_out[i] = ptr_audio_out[i] * pstr_eq_set->filt_cascade_td[g].cascade_gain_linear; - } - } - else - { - return -1; + WORD32 channel, FLOAT32* ptr_audio_in, + FLOAT32* ptr_audio_out, + WORD32 frame_size) { + WORD32 g = pstr_eq_set->eq_ch_group_of_channel[channel], i, j; + // FLOAT32 sum = 0.0f; + // FLOAT32 temp1 = 0.0f; + + if (pstr_eq_set == NULL || g < 0) return 0; + + if (pstr_eq_set->domain | EQ_FILTER_DOMAIN_TIME) { + for (i = 0; i < frame_size; i++) { + impd_eq_filt_element_process( + (pstr_eq_set->filt_cascade_td[g].pstr_eq_filt_block), channel, + ptr_audio_in[i], &ptr_audio_out[i], + pstr_eq_set->filt_cascade_td[g].block_count); + + for (j = 0; j < pstr_eq_set->filt_cascade_td[g].num_ph_align_filt; j++) { + impd_phase_align_filt_process( + &pstr_eq_set->filt_cascade_td[g].ph_alignment_filt[j], channel, + &ptr_audio_out[i]); + } + + ptr_audio_out[i] = ptr_audio_out[i] * + pstr_eq_set->filt_cascade_td[g].cascade_gain_linear; } - return 0; + } else { + return -1; + } + 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]); - } - } + 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); + } + return (0); } - - - - diff --git a/decoder/drc_src/impd_drc_eq.h b/decoder/drc_src/impd_drc_eq.h index 74f40cc..dfcf0aa 100644 --- a/decoder/drc_src/impd_drc_eq.h +++ b/decoder/drc_src/impd_drc_eq.h @@ -23,173 +23,163 @@ #ifndef COMPILE_FOR_DRC_ENCODER #endif -#define EQ_CHANNEL_COUNT_MAX 8 -#define EQ_AUDIO_DELAY_MAX 1024 -#define EQ_FIR_FILTER_SIZE_MAX 128 -#define EQ_SUBBAND_COUNT_MAX 256 -#define EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX 32 -#define EQ_INTERMEDIATE_PARAMETER_COUNT_MAX 32 -#define EQ_FILTER_SECTION_COUNT_MAX 8 -#define EQ_FILTER_ELEMENT_COUNT_MAX 4 -#define EQ_FILTER_COUNT_MAX 4 -#define MATCHING_PHASE_FILTER_COUNT_MAX 32 - -#define EQ_FILTER_DOMAIN_NONE 0 -#define EQ_FILTER_DOMAIN_TIME (1<<0) -#define EQ_FILTER_DOMAIN_SUBBAND (1<<1) +#define EQ_CHANNEL_COUNT_MAX 8 +#define EQ_AUDIO_DELAY_MAX 1024 +#define EQ_FIR_FILTER_SIZE_MAX 128 +#define EQ_SUBBAND_COUNT_MAX 256 +#define EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX 32 +#define EQ_INTERMEDIATE_PARAMETER_COUNT_MAX 32 +#define EQ_FILTER_SECTION_COUNT_MAX 8 +#define EQ_FILTER_ELEMENT_COUNT_MAX 4 +#define EQ_FILTER_COUNT_MAX 4 +#define MATCHING_PHASE_FILTER_COUNT_MAX 32 + +#define EQ_FILTER_DOMAIN_NONE 0 +#define EQ_FILTER_DOMAIN_TIME (1 << 0) +#define EQ_FILTER_DOMAIN_SUBBAND (1 << 1) #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif - - typedef struct { - WORD32 delay; - FLOAT32 state[EQ_CHANNEL_COUNT_MAX][EQ_AUDIO_DELAY_MAX]; + WORD32 delay; + FLOAT32 state[EQ_CHANNEL_COUNT_MAX][EQ_AUDIO_DELAY_MAX]; } ia_audio_delay_struct; typedef struct { - FLOAT32 radius; - FLOAT32 coeff[2]; + FLOAT32 radius; + FLOAT32 coeff[2]; } ia_2nd_order_filt_params_struct; typedef struct { - WORD32 coeff_count; - FLOAT32 coeff[EQ_FIR_FILTER_SIZE_MAX]; - FLOAT32 state[EQ_CHANNEL_COUNT_MAX][EQ_FIR_FILTER_SIZE_MAX]; + WORD32 coeff_count; + FLOAT32 coeff[EQ_FIR_FILTER_SIZE_MAX]; + FLOAT32 state[EQ_CHANNEL_COUNT_MAX][EQ_FIR_FILTER_SIZE_MAX]; } ia_fir_filter_struct; typedef struct { - WORD32 eq_frame_size_subband; - WORD32 coeff_count; - FLOAT32 subband_coeff[EQ_SUBBAND_COUNT_MAX]; + WORD32 eq_frame_size_subband; + WORD32 coeff_count; + FLOAT32 subband_coeff[EQ_SUBBAND_COUNT_MAX]; } ia_subband_filt_struct; typedef struct { - WORD32 filter_format; - WORD32 filter_param_count_of_zeros; - ia_2nd_order_filt_params_struct ord_2_filt_params_of_zeros[EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX]; - WORD32 filter_param_count_of_poles; - ia_2nd_order_filt_params_struct ord_2_filt_params_of_poles[EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX]; - WORD32 filter_param_count_of_fir; - ia_fir_filter_struct fir_filter; + WORD32 filter_format; + WORD32 filter_param_count_of_zeros; + ia_2nd_order_filt_params_struct + ord_2_filt_params_of_zeros[EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX]; + WORD32 filter_param_count_of_poles; + ia_2nd_order_filt_params_struct + ord_2_filt_params_of_poles[EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX]; + WORD32 filter_param_count_of_fir; + ia_fir_filter_struct fir_filter; } ia_interm_filt_params_struct; typedef struct { - WORD32 interm_filt_param_count; - ia_interm_filt_params_struct interm_filt_params[EQ_INTERMEDIATE_PARAMETER_COUNT_MAX]; + WORD32 interm_filt_param_count; + ia_interm_filt_params_struct + interm_filt_params[EQ_INTERMEDIATE_PARAMETER_COUNT_MAX]; } IntermediateParams; typedef struct { - FLOAT32 in_state_1; - FLOAT32 in_state_2; - FLOAT32 out_state_1; - FLOAT32 out_state_2; + FLOAT32 in_state_1; + FLOAT32 in_state_2; + FLOAT32 out_state_1; + FLOAT32 out_state_2; } ia_filt_sect_state_struct; typedef struct { - FLOAT32 a1; - FLOAT32 a2; - FLOAT32 b1; - FLOAT32 b2; - ia_filt_sect_state_struct filt_sect_state[EQ_CHANNEL_COUNT_MAX]; + FLOAT32 a1; + FLOAT32 a2; + FLOAT32 b1; + FLOAT32 b2; + ia_filt_sect_state_struct filt_sect_state[EQ_CHANNEL_COUNT_MAX]; } ia_filt_sect_struct; typedef struct { - WORD32 member_count; - WORD32 member_idx[EQ_CHANNEL_GROUP_COUNT_MAX]; + WORD32 member_count; + WORD32 member_idx[EQ_CHANNEL_GROUP_COUNT_MAX]; } ia_cascade_align_group_struct; typedef struct { - WORD32 validity_flag; - WORD32 num_matches_filter; - WORD32 matches_filter[EQ_FILTER_SECTION_COUNT_MAX]; - FLOAT32 gain; - WORD32 section_count; - ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX]; - ia_audio_delay_struct audio_delay; + WORD32 validity_flag; + WORD32 num_matches_filter; + WORD32 matches_filter[EQ_FILTER_SECTION_COUNT_MAX]; + FLOAT32 gain; + WORD32 section_count; + ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX]; + ia_audio_delay_struct audio_delay; } ia_ph_alignment_filt_struct; typedef ia_ph_alignment_filt_struct ia_matching_ph_filt_struct; typedef struct { - WORD32 matches_cascade_idx; - WORD32 all_pass_count; - ia_matching_ph_filt_struct matching_ph_filt[MATCHING_PHASE_FILTER_COUNT_MAX]; + WORD32 matches_cascade_idx; + WORD32 all_pass_count; + ia_matching_ph_filt_struct matching_ph_filt[MATCHING_PHASE_FILTER_COUNT_MAX]; } ia_all_pass_chain_struct; typedef struct { - WORD32 section_count; - ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX]; - WORD32 filt_coeffs_flag; - ia_fir_filter_struct fir_filter; - ia_audio_delay_struct audio_delay; + WORD32 section_count; + ia_filt_sect_struct filt_section[EQ_FILTER_SECTION_COUNT_MAX]; + WORD32 filt_coeffs_flag; + ia_fir_filter_struct fir_filter; + ia_audio_delay_struct audio_delay; } ia_pole_zero_filt_struct; typedef struct { - FLOAT32 elementGainLinear; - WORD32 format; - ia_pole_zero_filt_struct pstr_pole_zero_filt; - ia_fir_filter_struct fir_filter; - WORD32 num_ph_align_filt; - ia_ph_alignment_filt_struct ph_alignment_filt[EQ_FILTER_ELEMENT_COUNT_MAX]; + FLOAT32 elementGainLinear; + WORD32 format; + ia_pole_zero_filt_struct pstr_pole_zero_filt; + ia_fir_filter_struct fir_filter; + WORD32 num_ph_align_filt; + ia_ph_alignment_filt_struct ph_alignment_filt[EQ_FILTER_ELEMENT_COUNT_MAX]; } ia_eq_filt_ele_struct; typedef struct { - WORD32 element_count; - ia_eq_filt_ele_struct eq_filt_element[EQ_FILTER_ELEMENT_COUNT_MAX]; - ia_matching_ph_filt_struct matching_ph_filt_ele_0; + WORD32 element_count; + ia_eq_filt_ele_struct eq_filt_element[EQ_FILTER_ELEMENT_COUNT_MAX]; + ia_matching_ph_filt_struct matching_ph_filt_ele_0; } ia_eq_filt_block_struct; typedef struct { - FLOAT32 cascade_gain_linear; - WORD32 block_count; - ia_eq_filt_block_struct pstr_eq_filt_block[EQ_FILTER_BLOCK_COUNT_MAX]; - WORD32 num_ph_align_filt; - ia_ph_alignment_filt_struct ph_alignment_filt[EQ_FILTER_BLOCK_COUNT_MAX * EQ_FILTER_BLOCK_COUNT_MAX]; + FLOAT32 cascade_gain_linear; + WORD32 block_count; + ia_eq_filt_block_struct pstr_eq_filt_block[EQ_FILTER_BLOCK_COUNT_MAX]; + WORD32 num_ph_align_filt; + ia_ph_alignment_filt_struct + ph_alignment_filt[EQ_FILTER_BLOCK_COUNT_MAX * EQ_FILTER_BLOCK_COUNT_MAX]; } ia_filt_cascade_td_struct; typedef struct { - WORD32 domain; - WORD32 audio_num_chan; - WORD32 eq_ch_group_count; - WORD32 eq_ch_group_of_channel[EQ_CHANNEL_COUNT_MAX]; - ia_filt_cascade_td_struct filt_cascade_td[EQ_CHANNEL_GROUP_COUNT_MAX]; - ia_subband_filt_struct subband_filt[EQ_CHANNEL_GROUP_COUNT_MAX]; + WORD32 domain; + WORD32 audio_num_chan; + WORD32 eq_ch_group_count; + WORD32 eq_ch_group_of_channel[EQ_CHANNEL_COUNT_MAX]; + ia_filt_cascade_td_struct filt_cascade_td[EQ_CHANNEL_GROUP_COUNT_MAX]; + ia_subband_filt_struct subband_filt[EQ_CHANNEL_GROUP_COUNT_MAX]; } ia_eq_set_struct; - - WORD32 -impd_derive_eq_set (ia_eq_coeff_struct* str_eq_coeff, - ia_eq_instructions_struct* str_eq_instructions, - FLOAT32 sample_rate, - WORD32 drc_frame_size, - WORD32 sub_band_domain_mode, - ia_eq_set_struct* eq_set); - -VOID impd_get_eq_set_delay (ia_eq_set_struct* eq_set, - WORD32* cascade_delay); +impd_derive_eq_set(ia_eq_coeff_struct* str_eq_coeff, + ia_eq_instructions_struct* str_eq_instructions, + FLOAT32 sample_rate, WORD32 drc_frame_size, + WORD32 sub_band_domain_mode, ia_eq_set_struct* eq_set); + +VOID impd_get_eq_set_delay(ia_eq_set_struct* eq_set, WORD32* cascade_delay); WORD32 -impd_process_eq_set_td(ia_eq_set_struct* eq_set, - WORD32 channel, - FLOAT32 audio_in, - FLOAT32* audio_out); - -WORD32 impd_process_eq_set_time_domain(ia_eq_set_struct* eq_set, - WORD32 channel, - FLOAT32 *audio_in, - FLOAT32 *audio_out, +impd_process_eq_set_td(ia_eq_set_struct* eq_set, WORD32 channel, + FLOAT32 audio_in, FLOAT32* audio_out); + +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, +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_error_codes.h b/decoder/drc_src/impd_drc_error_codes.h index 07e6edc..23462c2 100644 --- a/decoder/drc_src/impd_drc_error_codes.h +++ b/decoder/drc_src/impd_drc_error_codes.h @@ -18,42 +18,39 @@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore */ - #ifndef IMPD_DRC_ERROR_CODES_H #define IMPD_DRC_ERROR_CODES_H -#define IA_ERROR_CODE WORD32 -#define IA_NO_ERROR 0x00000000 +#define IA_ERROR_CODE WORD32 +#define IA_NO_ERROR 0x00000000 /*API Non-Fatal Errors */ -#define IA_DRC_DEC_API_NONFATAL_NO_ERROR 0x00000000 -#define IA_DRC_DEC_API_NONFATAL_CMD_NOT_SUPPORTED 0x00000001 -#define IA_DRC_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED 0x00000002 - +#define IA_DRC_DEC_API_NONFATAL_NO_ERROR 0x00000000 +#define IA_DRC_DEC_API_NONFATAL_CMD_NOT_SUPPORTED 0x00000001 +#define IA_DRC_DEC_API_NONFATAL_CMD_TYPE_NOT_SUPPORTED 0x00000002 /*API Fatal Errors */ -#define IA_DRC_DEC_API_FATAL_INVALID_MEMTAB_INDEX 0xFFFF8000 -#define IA_DRC_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX 0xFFFF8001 -#define IA_DRC_DEC_API_FATAL_MEM_ALLOC 0xFFFF8002 -#define IA_DRC_DEC_API_FATAL_INVALID_CONFIG_PARAM 0xFFFF8003 -#define IA_DRC_DEC_API_FATAL_INVALID_EXECUTE_TYPE 0xFFFF8004 -#define IA_DRC_DEC_API_FATAL_INVALID_CMD 0xFFFF8005 -#define IA_DRC_DEC_API_FATAL_MEM_ALIGN 0xFFFF8006 +#define IA_DRC_DEC_API_FATAL_INVALID_MEMTAB_INDEX 0xFFFF8000 +#define IA_DRC_DEC_API_FATAL_INVALID_LIB_ID_STRINGS_IDX 0xFFFF8001 +#define IA_DRC_DEC_API_FATAL_MEM_ALLOC 0xFFFF8002 +#define IA_DRC_DEC_API_FATAL_INVALID_CONFIG_PARAM 0xFFFF8003 +#define IA_DRC_DEC_API_FATAL_INVALID_EXECUTE_TYPE 0xFFFF8004 +#define IA_DRC_DEC_API_FATAL_INVALID_CMD 0xFFFF8005 +#define IA_DRC_DEC_API_FATAL_MEM_ALIGN 0xFFFF8006 /*****************************************************************************/ /* Class 1: Configuration Errors */ /*****************************************************************************/ - /* Non Fatal Errors */ -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS 0x00000800 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ 0x00000801 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE 0x00000802 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE 0x00000803 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DELAY_MODE 0x00000804 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DECODE_TYPE 0x00000805 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PEAK_LIM_FLAG 0x00000806 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CTRL_PARAM_IDX 0x00000807 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_GAIN_DELAY 0x00000808 -#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CONST_DELAY_MODE 0x00000809 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_NUM_OF_CHANNELS 0x00000800 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_SAMP_FREQ 0x00000801 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PCM_SIZE 0x00000802 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_FRAME_SIZE 0x00000803 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DELAY_MODE 0x00000804 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_DECODE_TYPE 0x00000805 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_PEAK_LIM_FLAG 0x00000806 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CTRL_PARAM_IDX 0x00000807 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_GAIN_DELAY 0x00000808 +#define IA_DRC_DEC_CONFIG_NON_FATAL_INVALID_CONST_DELAY_MODE 0x00000809 #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 94f0600..a1ca0b7 100644 --- a/decoder/drc_src/impd_drc_extr_delta_coded_info.c +++ b/decoder/drc_src/impd_drc_extr_delta_coded_info.c @@ -28,86 +28,68 @@ #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); + 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_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 = ia_drc_gain_tbls_prof_2; - *num_entries = NUM_GAIN_TBL_PROF_2_ENTRIES; - } - else - { - *delta_time_code_tbl = ia_drc_gain_tbls_prof_0_1; - *num_entries = NUM_GAIN_TBL_PROF_0_1_ENTRIES; - } +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 = ia_drc_gain_tbls_prof_2; + *num_entries = NUM_GAIN_TBL_PROF_2_ENTRIES; + } else { + *delta_time_code_tbl = ia_drc_gain_tbls_prof_0_1; + *num_entries = NUM_GAIN_TBL_PROF_0_1_ENTRIES; + } } -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++; - } +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; - delta_time_code_tbl_item[0].size = -1; - delta_time_code_tbl_item[0].code = -1; - delta_time_code_tbl_item[0].value = -1; + WORD32 Z = 1; + while ((1 << Z) < 2 * num_gain_max_values) { + Z++; + } - 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; - } + delta_time_code_tbl_item[0].size = -1; + delta_time_code_tbl_item[0].code = -1; + delta_time_code_tbl_item[0].value = -1; - 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; - } + 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; +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 e2b1ad6..b9954c0 100644 --- a/decoder/drc_src/impd_drc_extr_delta_coded_info.h +++ b/decoder/drc_src/impd_drc_extr_delta_coded_info.h @@ -21,66 +21,65 @@ #define IMPD_DRC_TABLES_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -#define N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX (512+14) +#define N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX (512 + 14) typedef struct { - WORD32 size; - WORD32 code; - WORD32 value; + WORD32 size; + WORD32 code; + WORD32 value; } ia_delta_time_code_table_entry_struct; typedef struct { - WORD32 size; - WORD32 code; - FLOAT32 value; - WORD32 index; + WORD32 size; + WORD32 code; + FLOAT32 value; + WORD32 index; } ia_slope_code_table_struct; typedef struct { - WORD32 size; - WORD32 code; - FLOAT32 value; + WORD32 size; + WORD32 code; + FLOAT32 value; } ia_delta_gain_code_table_struct; typedef struct { - ia_delta_time_code_table_entry_struct delta_time_code_table[N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX]; + ia_delta_time_code_table_entry_struct + delta_time_code_table[N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX]; } ia_tables_struct; typedef struct { - FLOAT32 in_out_ratio; - FLOAT32 exp_lo; - FLOAT32 exp_hi; + FLOAT32 in_out_ratio; + FLOAT32 exp_lo; + FLOAT32 exp_hi; } ia_cicp_sigmoid_characteristic_param_struct; typedef struct { - FLOAT32 inLevel; - FLOAT32 gain; + FLOAT32 inLevel; + FLOAT32 gain; } ia_characteristic_node_coordinate_struct; typedef struct { - WORD32 coordinateCount; - ia_characteristic_node_coordinate_struct characteristicNodeCoordinate[5]; + WORD32 coordinateCount; + 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); +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, - ia_delta_time_code_table_entry_struct* delta_time_code_tbl_item); +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); -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); +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); WORD32 -impd_get_delta_tmin (const WORD32 sampling_rate); +impd_get_delta_tmin(const WORD32 sampling_rate); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_fiilter_bank.c b/decoder/drc_src/impd_drc_fiilter_bank.c index 0bd94d7..f6637b6 100644 --- a/decoder/drc_src/impd_drc_fiilter_bank.c +++ b/decoder/drc_src/impd_drc_fiilter_bank.c @@ -29,477 +29,403 @@ #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; + 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; - } - + 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; +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); } - 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; + } } + } } - - 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; } - - 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 == 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]; } - if (match_found == 0) + count[g]--; 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++; - } + } + 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); + } + + 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; } - return 0; -} + 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; + 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; + 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; + 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]; -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; + 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]); -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; + 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); - } +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; + return; }
\ No newline at end of file diff --git a/decoder/drc_src/impd_drc_filter_bank.c b/decoder/drc_src/impd_drc_filter_bank.c index 7c7886f..e63bea5 100644 --- a/decoder/drc_src/impd_drc_filter_bank.c +++ b/decoder/drc_src/impd_drc_filter_bank.c @@ -29,477 +29,403 @@ #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; + 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; - } - + 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; +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); } - 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; + } } + } } - - 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; } - - 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 == 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]; } - if (match_found == 0) + count[g]--; 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++; - } + } + 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); + } + + 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; } - return 0; -} + 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; + 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; + 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; + 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]; -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; + 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]); -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; + 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); - } +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; + 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 d0bf66b..331f0b8 100644 --- a/decoder/drc_src/impd_drc_filter_bank.h +++ b/decoder/drc_src/impd_drc_filter_bank.h @@ -21,145 +21,130 @@ #define IMPD_DRC_FILTER_BANK_H #define FILTER_BANK_PARAMETER_COUNT 16 -#define CASCADE_ALLPASS_COUNT_MAX 9 -#define QMF_NUM_FILT_BANDS 64 -#define QMF_FILT_RESOLUTION 64 +#define CASCADE_ALLPASS_COUNT_MAX 9 +#define QMF_NUM_FILT_BANDS 64 +#define QMF_FILT_RESOLUTION 64 +typedef struct ia_drc_qmf_filt_struct { + FLOAT64* ana_buff; + FLOAT64* syn_buff; + FLOAT64 ana_tab_real[QMF_NUM_FILT_BANDS][2 * QMF_NUM_FILT_BANDS]; + FLOAT64 ana_tab_imag[QMF_NUM_FILT_BANDS][2 * QMF_NUM_FILT_BANDS]; + FLOAT64 syn_tab_real[2 * QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; + FLOAT64 syn_tab_imag[2 * QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; -typedef struct ia_drc_qmf_filt_struct -{ - -FLOAT64* ana_buff; -FLOAT64* syn_buff; -FLOAT64 ana_tab_real[QMF_NUM_FILT_BANDS][2*QMF_NUM_FILT_BANDS]; -FLOAT64 ana_tab_imag[QMF_NUM_FILT_BANDS][2*QMF_NUM_FILT_BANDS]; -FLOAT64 syn_tab_real[2*QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; -FLOAT64 syn_tab_imag[2*QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; - -}ia_drc_qmf_filt_struct; +} ia_drc_qmf_filt_struct; typedef struct { - FLOAT32 f_cross_norm; - FLOAT32 gamma; - FLOAT32 delta; + FLOAT32 f_cross_norm; + FLOAT32 gamma; + FLOAT32 delta; } ia_filter_bank_params_struct; - typedef struct { - FLOAT32 s00; - FLOAT32 s01; - FLOAT32 s10; - FLOAT32 s11; + FLOAT32 s00; + FLOAT32 s01; + FLOAT32 s10; + FLOAT32 s11; } ia_lr_filter_state_struct; - typedef struct { - FLOAT32 s0; - FLOAT32 s1; + FLOAT32 s0; + FLOAT32 s1; } ia_all_pass_filter_state_struct; typedef struct { - FLOAT32 a0; - FLOAT32 a1; - FLOAT32 a2; - FLOAT32 b0; - FLOAT32 b1; - FLOAT32 b2; - FLOAT32 x_p[MAX_CHANNEL_COUNT*2]; - FLOAT32 y_p[MAX_CHANNEL_COUNT*2]; + FLOAT32 a0; + FLOAT32 a1; + FLOAT32 a2; + FLOAT32 b0; + FLOAT32 b1; + FLOAT32 b2; + FLOAT32 x_p[MAX_CHANNEL_COUNT * 2]; + FLOAT32 y_p[MAX_CHANNEL_COUNT * 2]; } ia_iir_filter_struct; typedef struct { - ia_iir_filter_struct low_pass; - ia_iir_filter_struct high_pass; + ia_iir_filter_struct low_pass; + ia_iir_filter_struct high_pass; } ia_two_band_filt_struct; typedef struct { - ia_iir_filter_struct str_low_pass_stage_1; - ia_iir_filter_struct str_high_pass_stage_1; - ia_iir_filter_struct str_low_pass_stage_2; - ia_iir_filter_struct str_high_pass_stage_2; - ia_iir_filter_struct str_all_pass_stage_2; + ia_iir_filter_struct str_low_pass_stage_1; + ia_iir_filter_struct str_high_pass_stage_1; + ia_iir_filter_struct str_low_pass_stage_2; + ia_iir_filter_struct str_high_pass_stage_2; + ia_iir_filter_struct str_all_pass_stage_2; } ia_three_band_filt_struct; typedef struct { - ia_iir_filter_struct str_low_pass_stage_1; - ia_iir_filter_struct str_high_pass_stage_1; - ia_iir_filter_struct str_all_pass_stage_2_high; - ia_iir_filter_struct str_all_pass_stage_2_low; - ia_iir_filter_struct str_low_pass_stage_3_high; - ia_iir_filter_struct str_high_pass_stage_3_high; - ia_iir_filter_struct str_low_pass_stage_3_low; - ia_iir_filter_struct str_high_pass_stage_3_low; + ia_iir_filter_struct str_low_pass_stage_1; + ia_iir_filter_struct str_high_pass_stage_1; + ia_iir_filter_struct str_all_pass_stage_2_high; + ia_iir_filter_struct str_all_pass_stage_2_low; + ia_iir_filter_struct str_low_pass_stage_3_high; + ia_iir_filter_struct str_high_pass_stage_3_high; + ia_iir_filter_struct str_low_pass_stage_3_low; + ia_iir_filter_struct str_high_pass_stage_3_low; } ia_four_band_filt_struct; typedef struct { - ia_iir_filter_struct str_all_pass_stage; -} ia_all_pass_filter_sturct; + ia_iir_filter_struct str_all_pass_stage; +} ia_all_pass_filter_sturct; typedef struct { - ia_all_pass_filter_sturct str_all_pass_cascade_filter[CASCADE_ALLPASS_COUNT_MAX]; - WORD32 num_filter; -} ia_all_pass_cascade_struct; + ia_all_pass_filter_sturct + str_all_pass_cascade_filter[CASCADE_ALLPASS_COUNT_MAX]; + WORD32 num_filter; +} ia_all_pass_cascade_struct; typedef struct { - WORD32 num_bands; - WORD32 complexity; - 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; - ia_all_pass_cascade_struct str_all_pass_cascade; + WORD32 num_bands; + WORD32 complexity; + 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; + ia_all_pass_cascade_struct str_all_pass_cascade; } ia_drc_filter_bank_struct; typedef struct { - WORD32 nfilter_banks; - WORD32 num_ph_align_ch_groups; - WORD32 complexity; - ia_drc_filter_bank_struct str_drc_filter_bank[8]; + WORD32 nfilter_banks; + WORD32 num_ph_align_ch_groups; + WORD32 complexity; + ia_drc_filter_bank_struct str_drc_filter_bank[8]; } ia_filter_banks_struct; - 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); +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); VOID impd_two_band_filter_process(ia_two_band_filt_struct* str_two_band_bank, - WORD32 c, - WORD32 size, - FLOAT32* audio_in, - FLOAT32* audio_out[]); + WORD32 c, WORD32 size, FLOAT32* audio_in, + FLOAT32* audio_out[]); -VOID impd_three_band_filter_process(ia_three_band_filt_struct* str_three_band_bank, - WORD32 c, - WORD32 size, - FLOAT32* audio_in, - FLOAT32* audio_out[]); +VOID impd_three_band_filter_process( + ia_three_band_filt_struct* str_three_band_bank, WORD32 c, WORD32 size, + FLOAT32* audio_in, FLOAT32* audio_out[]); VOID impd_four_band_filter_process(ia_four_band_filt_struct* str_four_band_bank, - WORD32 c, - WORD32 size, - FLOAT32* audio_in, - FLOAT32* audio_out[]); + WORD32 c, WORD32 size, FLOAT32* audio_in, + FLOAT32* audio_out[]); -VOID impd_all_pass_cascade_process(ia_all_pass_cascade_struct *str_all_pass_cascade, - WORD32 c, - WORD32 size, - FLOAT32* audio_in); +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(ia_shape_filter_block_params_struct* pstr_shape_filter_block_params, - shape_filter_block* shape_filter_block); +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); - - + 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); +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); #endif diff --git a/decoder/drc_src/impd_drc_gain_dec.c b/decoder/drc_src/impd_drc_gain_dec.c index c8c5545..accce93 100644 --- a/decoder/drc_src/impd_drc_gain_dec.c +++ b/decoder/drc_src/impd_drc_gain_dec.c @@ -34,724 +34,747 @@ #include "impd_drc_eq.h" #include "impd_drc_gain_decoder.h" -extern 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) -{ - - FLOAT32 loc_db_gain = in_param_db_gain; - FLOAT32 gain_ratio = 1.0; - - ia_gain_modifiers_struct* pstr_gain_modifiers = interp_params_str->pstr_gain_modifiers; - if (interp_params_str->gain_modification_flag) { - - if ((interp_params_str->characteristic_index > 0) && (loc_db_gain != 0.0f)){ - - gain_ratio = 1.0f; - } - +extern 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) { + FLOAT32 loc_db_gain = in_param_db_gain; + FLOAT32 gain_ratio = 1.0; + + ia_gain_modifiers_struct* pstr_gain_modifiers = + interp_params_str->pstr_gain_modifiers; + if (interp_params_str->gain_modification_flag) { + if ((interp_params_str->characteristic_index > 0) && + (loc_db_gain != 0.0f)) { + gain_ratio = 1.0f; + } - if (loc_db_gain < 0.0f) { - gain_ratio *= interp_params_str->compress; - } - else { - gain_ratio *= interp_params_str->boost; - } + if (loc_db_gain < 0.0f) { + gain_ratio *= interp_params_str->compress; + } else { + gain_ratio *= interp_params_str->boost; } - if (pstr_gain_modifiers->gain_scaling_flag[drc_band] == 1) { - if (loc_db_gain < 0.0) { - gain_ratio *= pstr_gain_modifiers->attn_scaling[drc_band]; - } - else { - gain_ratio *= pstr_gain_modifiers->ampl_scaling[drc_band]; - } + } + if (pstr_gain_modifiers->gain_scaling_flag[drc_band] == 1) { + if (loc_db_gain < 0.0) { + gain_ratio *= pstr_gain_modifiers->attn_scaling[drc_band]; + } else { + gain_ratio *= pstr_gain_modifiers->ampl_scaling[drc_band]; } - if ((interp_params_str->pstr_ducking_modifiers->ducking_scaling_flag == 1) && (interp_params_str->ducking_flag == 1)) { - gain_ratio *= interp_params_str->pstr_ducking_modifiers->ducking_scaling; + } + if ((interp_params_str->pstr_ducking_modifiers->ducking_scaling_flag == 1) && + (interp_params_str->ducking_flag == 1)) { + gain_ratio *= interp_params_str->pstr_ducking_modifiers->ducking_scaling; + } + + { + *out_param_lin_gain = + (FLOAT32)pow(2.0, (FLOAT64)(gain_ratio * loc_db_gain / 6.0f)); + *out_param_lin_slope = SLOPE_FACTOR_DB_TO_LINEAR * gain_ratio * + *out_param_lin_gain * in_param_db_slope; + + if (pstr_gain_modifiers->gain_offset_flag[drc_band] == 1) { + *out_param_lin_gain *= (FLOAT32)pow( + 2.0, (FLOAT64)(pstr_gain_modifiers->gain_offset[drc_band] / 6.0f)); } - - { - *out_param_lin_gain = (FLOAT32)pow(2.0, (FLOAT64)(gain_ratio * loc_db_gain / 6.0f)); - *out_param_lin_slope = SLOPE_FACTOR_DB_TO_LINEAR * gain_ratio * *out_param_lin_gain * in_param_db_slope; - - if (pstr_gain_modifiers->gain_offset_flag[drc_band] == 1) { - *out_param_lin_gain *= (FLOAT32)pow(2.0, (FLOAT64)(pstr_gain_modifiers->gain_offset[drc_band]/6.0f)); - } - if ((interp_params_str->limiter_peak_target_present == 1) && (interp_params_str->clipping_flag == 1)) { - *out_param_lin_gain *= (FLOAT32)pow(2.0, max(0.0, -interp_params_str->limiter_peak_target - interp_params_str->loudness_normalization_gain_db)/6.0); - if (*out_param_lin_gain >= 1.0) { - *out_param_lin_gain = 1.0; - *out_param_lin_slope = 0.0; - } - } + if ((interp_params_str->limiter_peak_target_present == 1) && + (interp_params_str->clipping_flag == 1)) { + *out_param_lin_gain *= (FLOAT32)pow( + 2.0, max(0.0, -interp_params_str->limiter_peak_target - + interp_params_str->loudness_normalization_gain_db) / + 6.0); + if (*out_param_lin_gain >= 1.0) { + *out_param_lin_gain = 1.0; + *out_param_lin_slope = 0.0; + } } - return (0); + } + return (0); } - - - - - - WORD32 -impd_compressor_io_sigmoid(ia_split_drc_characteristic_struct* split_drc_characteristic, - FLOAT32 in_db_level, - FLOAT32* out_db_gain) -{ - FLOAT32 tmp; - FLOAT32 in_out_ratio = split_drc_characteristic->in_out_ratio; - FLOAT32 gainDbLimit = split_drc_characteristic->gain; - FLOAT32 exp = split_drc_characteristic->exp; - - tmp = (DRC_INPUT_LOUDNESS_TARGET - in_db_level) * in_out_ratio; - if (exp < 1000.0f) { - FLOAT32 x = tmp/gainDbLimit; - if (x < 0.0f) - { - return(UNEXPECTED_ERROR); - } - *out_db_gain = (FLOAT32)(tmp / pow(1.0f + pow(x, exp), 1.0f/exp)); - } else { - *out_db_gain = tmp; - } - if (split_drc_characteristic->flip_sign == 1) { - *out_db_gain = - *out_db_gain; +impd_compressor_io_sigmoid( + ia_split_drc_characteristic_struct* split_drc_characteristic, + FLOAT32 in_db_level, FLOAT32* out_db_gain) { + FLOAT32 tmp; + FLOAT32 in_out_ratio = split_drc_characteristic->in_out_ratio; + FLOAT32 gainDbLimit = split_drc_characteristic->gain; + FLOAT32 exp = split_drc_characteristic->exp; + + tmp = (DRC_INPUT_LOUDNESS_TARGET - in_db_level) * in_out_ratio; + if (exp < 1000.0f) { + FLOAT32 x = tmp / gainDbLimit; + if (x < 0.0f) { + return (UNEXPECTED_ERROR); } - return (0); + *out_db_gain = (FLOAT32)(tmp / pow(1.0f + pow(x, exp), 1.0f / exp)); + } else { + *out_db_gain = tmp; + } + if (split_drc_characteristic->flip_sign == 1) { + *out_db_gain = -*out_db_gain; + } + return (0); } WORD32 -impd_compressor_io_sigmoid_inv(ia_split_drc_characteristic_struct* split_drc_characteristic, - FLOAT32 loc_db_gain, - FLOAT32* in_level) -{ - FLOAT32 in_out_ratio = split_drc_characteristic->in_out_ratio; - FLOAT32 gainDbLimit = split_drc_characteristic->gain; - FLOAT32 exp = split_drc_characteristic->exp; - FLOAT32 tmp = loc_db_gain; - - if (split_drc_characteristic->flip_sign == 1) { - tmp = - loc_db_gain; +impd_compressor_io_sigmoid_inv( + ia_split_drc_characteristic_struct* split_drc_characteristic, + FLOAT32 loc_db_gain, FLOAT32* in_level) { + FLOAT32 in_out_ratio = split_drc_characteristic->in_out_ratio; + FLOAT32 gainDbLimit = split_drc_characteristic->gain; + FLOAT32 exp = split_drc_characteristic->exp; + FLOAT32 tmp = loc_db_gain; + + if (split_drc_characteristic->flip_sign == 1) { + tmp = -loc_db_gain; + } + if (exp < 1000.0f) { + FLOAT32 x = tmp / gainDbLimit; + if (x < 0.0f) { + return (UNEXPECTED_ERROR); } - if (exp < 1000.0f) { - FLOAT32 x = tmp/gainDbLimit; - if (x < 0.0f) - { - return(UNEXPECTED_ERROR); - } - tmp = (FLOAT32)(tmp / pow(1.0f - pow(x, exp), 1.0f / exp)); - } - *in_level = DRC_INPUT_LOUDNESS_TARGET - tmp / in_out_ratio; + tmp = (FLOAT32)(tmp / pow(1.0f - pow(x, exp), 1.0f / exp)); + } + *in_level = DRC_INPUT_LOUDNESS_TARGET - tmp / in_out_ratio; - return(0); + return (0); } WORD32 -impd_compressor_io_nodes_lt(ia_split_drc_characteristic_struct* split_drc_characteristic, - FLOAT32 in_db_level, - FLOAT32 *out_db_gain) -{ - WORD32 n; - FLOAT32 w; - FLOAT32* node_level = split_drc_characteristic->node_level; - FLOAT32* node_gain = split_drc_characteristic->node_gain; - - if (in_db_level > DRC_INPUT_LOUDNESS_TARGET) - { - return (UNEXPECTED_ERROR); - } - for (n=1; n<=split_drc_characteristic->characteristic_node_count; n++) { - if ((in_db_level <= node_level[n-1]) && (in_db_level > node_level[n])) { - w = (node_level[n]- in_db_level)/(node_level[n]-node_level[n-1]); - *out_db_gain =(FLOAT32) (w * node_gain[n-1] + (1.0-w) * node_gain[n]); - } +impd_compressor_io_nodes_lt( + ia_split_drc_characteristic_struct* split_drc_characteristic, + FLOAT32 in_db_level, FLOAT32* out_db_gain) { + WORD32 n; + FLOAT32 w; + FLOAT32* node_level = split_drc_characteristic->node_level; + FLOAT32* node_gain = split_drc_characteristic->node_gain; + + if (in_db_level > DRC_INPUT_LOUDNESS_TARGET) { + return (UNEXPECTED_ERROR); + } + for (n = 1; n <= split_drc_characteristic->characteristic_node_count; n++) { + if ((in_db_level <= node_level[n - 1]) && (in_db_level > node_level[n])) { + w = (node_level[n] - in_db_level) / (node_level[n] - node_level[n - 1]); + *out_db_gain = (FLOAT32)(w * node_gain[n - 1] + (1.0 - w) * node_gain[n]); } - *out_db_gain = node_gain[split_drc_characteristic->characteristic_node_count]; - return (0); + } + *out_db_gain = node_gain[split_drc_characteristic->characteristic_node_count]; + return (0); } WORD32 -impd_compressor_io_nodes_rt(ia_split_drc_characteristic_struct* split_drc_characteristic, - FLOAT32 in_db_level, - FLOAT32 *out_db_gain) -{ - WORD32 n; - FLOAT32 w; - FLOAT32* node_level = split_drc_characteristic->node_level; - FLOAT32* node_gain = split_drc_characteristic->node_gain; - - if (in_db_level < DRC_INPUT_LOUDNESS_TARGET) - { - return (UNEXPECTED_ERROR); +impd_compressor_io_nodes_rt( + ia_split_drc_characteristic_struct* split_drc_characteristic, + FLOAT32 in_db_level, FLOAT32* out_db_gain) { + WORD32 n; + FLOAT32 w; + FLOAT32* node_level = split_drc_characteristic->node_level; + FLOAT32* node_gain = split_drc_characteristic->node_gain; + + if (in_db_level < DRC_INPUT_LOUDNESS_TARGET) { + return (UNEXPECTED_ERROR); + } + for (n = 1; n <= split_drc_characteristic->characteristic_node_count; n++) { + if ((in_db_level >= node_level[n - 1]) && (in_db_level < node_level[n])) { + w = (FLOAT32)(node_level[n] - in_db_level) / + (node_level[n] - node_level[n - 1]); + *out_db_gain = (FLOAT32)(w * node_gain[n - 1] + (1.0 - w) * node_gain[n]); } - for (n=1; n<=split_drc_characteristic->characteristic_node_count; n++) { - if ((in_db_level >= node_level[n-1]) && (in_db_level < node_level[n])) { - w =(FLOAT32) (node_level[n]- in_db_level)/(node_level[n]-node_level[n-1]); - *out_db_gain = (FLOAT32)(w * node_gain[n-1] + (1.0-w) * node_gain[n]); - } - } - *out_db_gain = (node_gain[split_drc_characteristic->characteristic_node_count]); - return (0); + } + *out_db_gain = + (node_gain[split_drc_characteristic->characteristic_node_count]); + return (0); } - WORD32 -impd_compressor_io_nodes_inverse(ia_split_drc_characteristic_struct* split_drc_characteristic, - FLOAT32 loc_db_gain, - FLOAT32 *in_level) -{ - WORD32 n; - FLOAT32 w; - FLOAT32* node_level = split_drc_characteristic->node_level; - FLOAT32* node_gain = split_drc_characteristic->node_gain; - WORD32 node_count = split_drc_characteristic->characteristic_node_count; - - if (node_gain[1] < 0.0f) { - if (loc_db_gain <= node_gain[node_count]) { - *in_level = node_level[node_count]; - } - else { - if (loc_db_gain >= 0.0f) { - *in_level = DRC_INPUT_LOUDNESS_TARGET; - } - else { - for (n=1; n<=node_count; n++) { - if ((loc_db_gain <= node_gain[n-1]) && (loc_db_gain > node_gain[n])) { - w = (node_gain[n]-loc_db_gain)/(node_gain[n]-node_gain[n-1]); - *in_level =(FLOAT32) (w * node_level[n-1] + (1.0-w) * node_level[n]); - } - } - } - } +impd_compressor_io_nodes_inverse( + ia_split_drc_characteristic_struct* split_drc_characteristic, + FLOAT32 loc_db_gain, FLOAT32* in_level) { + WORD32 n; + FLOAT32 w; + FLOAT32* node_level = split_drc_characteristic->node_level; + FLOAT32* node_gain = split_drc_characteristic->node_gain; + WORD32 node_count = split_drc_characteristic->characteristic_node_count; + + if (node_gain[1] < 0.0f) { + if (loc_db_gain <= node_gain[node_count]) { + *in_level = node_level[node_count]; + } else { + if (loc_db_gain >= 0.0f) { + *in_level = DRC_INPUT_LOUDNESS_TARGET; + } else { + for (n = 1; n <= node_count; n++) { + if ((loc_db_gain <= node_gain[n - 1]) && + (loc_db_gain > node_gain[n])) { + w = (node_gain[n] - loc_db_gain) / + (node_gain[n] - node_gain[n - 1]); + *in_level = + (FLOAT32)(w * node_level[n - 1] + (1.0 - w) * node_level[n]); + } + } + } } - else { - if (loc_db_gain >= node_gain[node_count]) { - *in_level = node_level[node_count]; - } - else { - if (loc_db_gain <= 0.0f) { - *in_level = DRC_INPUT_LOUDNESS_TARGET; - } - else { - for (n=1; n<=node_count; n++) { - if ((loc_db_gain >= node_gain[n-1]) && (loc_db_gain < node_gain[n])) { - w = (FLOAT32)(node_gain[n]-loc_db_gain)/(node_gain[n]-node_gain[n-1]); - *in_level =(FLOAT32) (w * node_level[n-1] + (1.0-w) * node_level[n]); - } - } - } - } + } else { + if (loc_db_gain >= node_gain[node_count]) { + *in_level = node_level[node_count]; + } else { + if (loc_db_gain <= 0.0f) { + *in_level = DRC_INPUT_LOUDNESS_TARGET; + } else { + for (n = 1; n <= node_count; n++) { + if ((loc_db_gain >= node_gain[n - 1]) && + (loc_db_gain < node_gain[n])) { + w = (FLOAT32)(node_gain[n] - loc_db_gain) / + (node_gain[n] - node_gain[n - 1]); + *in_level = + (FLOAT32)(w * node_level[n - 1] + (1.0 - w) * node_level[n]); + } + } + } } - return (0); + } + return (0); } - WORD32 -impd_map_gain ( - ia_split_drc_characteristic_struct* split_drc_characteristic_source, - ia_split_drc_characteristic_struct* split_drc_characteristic_target, - FLOAT32 gain_in_db, - FLOAT32* gain_out_db) -{ - FLOAT32 inLevel; - WORD32 err = 0; - - switch (split_drc_characteristic_source->characteristic_format) { - case CHARACTERISTIC_SIGMOID: - err = impd_compressor_io_sigmoid_inv(split_drc_characteristic_source, gain_in_db, &inLevel); - 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); - break; - case CHARACTERISTIC_PASS_THRU: - inLevel = gain_in_db; - break; - default: - return(UNEXPECTED_ERROR); - break; - } - switch (split_drc_characteristic_target->characteristic_format) { - case CHARACTERISTIC_SIGMOID: - err = impd_compressor_io_sigmoid(split_drc_characteristic_target, inLevel, gain_out_db); - if (err) return (err); - break; - case CHARACTERISTIC_NODES: - if (inLevel < DRC_INPUT_LOUDNESS_TARGET) { - err = impd_compressor_io_nodes_lt(split_drc_characteristic_target, inLevel, gain_out_db); - if (err) return (err); - } - else { - err = impd_compressor_io_nodes_rt(split_drc_characteristic_target, inLevel, gain_out_db); - if (err) return (err); - } - break; - case CHARACTERISTIC_PASS_THRU: - *gain_out_db = inLevel; - break; - default: - break; - } - return (0); +impd_map_gain( + ia_split_drc_characteristic_struct* split_drc_characteristic_source, + ia_split_drc_characteristic_struct* split_drc_characteristic_target, + FLOAT32 gain_in_db, FLOAT32* gain_out_db) { + FLOAT32 inLevel; + WORD32 err = 0; + + switch (split_drc_characteristic_source->characteristic_format) { + case CHARACTERISTIC_SIGMOID: + err = impd_compressor_io_sigmoid_inv(split_drc_characteristic_source, + gain_in_db, &inLevel); + 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); + break; + case CHARACTERISTIC_PASS_THRU: + inLevel = gain_in_db; + break; + default: + return (UNEXPECTED_ERROR); + break; + } + switch (split_drc_characteristic_target->characteristic_format) { + case CHARACTERISTIC_SIGMOID: + err = impd_compressor_io_sigmoid(split_drc_characteristic_target, inLevel, + gain_out_db); + if (err) return (err); + break; + case CHARACTERISTIC_NODES: + if (inLevel < DRC_INPUT_LOUDNESS_TARGET) { + err = impd_compressor_io_nodes_lt(split_drc_characteristic_target, + inLevel, gain_out_db); + if (err) return (err); + } else { + err = impd_compressor_io_nodes_rt(split_drc_characteristic_target, + inLevel, gain_out_db); + if (err) return (err); + } + break; + case CHARACTERISTIC_PASS_THRU: + *gain_out_db = inLevel; + break; + default: + break; + } + return (0); } WORD32 -impd_conv_to_linear_domain (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) -{ - WORD32 err = 0; - FLOAT32 loc_db_gain = in_param_db_gain; - FLOAT32 gain_ratio = 1.0; - FLOAT32 mapped_db_gain; - ia_gain_modifiers_struct* pstr_gain_modifiers = interp_params_str->pstr_gain_modifiers; - if (interp_params_str->gain_modification_flag) { - ia_split_drc_characteristic_struct* split_drc_characteristic_source; - - WORD32 slopeIsNegative; - - if (interp_params_str->drc_characteristic_present) { - if (interp_params_str->drc_source_characteristic_cicp_format) - { - - } - else { - slopeIsNegative = 0; - split_drc_characteristic_source = interp_params_str->split_source_characteristic_left; - if (split_drc_characteristic_source->characteristic_format == 0) - { - slopeIsNegative = 1; - } - else - { - if (split_drc_characteristic_source->node_gain[1] > 0.0f) { - slopeIsNegative = 1; - } - } - if (loc_db_gain == 0.0f) { - if (((pstr_gain_modifiers->target_characteristic_left_present[drc_band] == 1) && - (interp_params_str->split_target_characteristic_left->characteristic_format == CHARACTERISTIC_PASS_THRU)) || - ((pstr_gain_modifiers->target_characteristic_right_present[drc_band] == 1) && - (interp_params_str->split_target_characteristic_right->characteristic_format == CHARACTERISTIC_PASS_THRU))) - { - mapped_db_gain = DRC_INPUT_LOUDNESS_TARGET; - loc_db_gain = DRC_INPUT_LOUDNESS_TARGET; - } - } - else - { - if (((loc_db_gain > 0.0f) && (slopeIsNegative == 1)) || ((loc_db_gain < 0.0f) && (slopeIsNegative == 0))) - { - if (pstr_gain_modifiers->target_characteristic_left_present[drc_band] == 1) - { - err = impd_map_gain(split_drc_characteristic_source, interp_params_str->split_target_characteristic_left, loc_db_gain, &mapped_db_gain); - if (err) return (err); - gain_ratio = mapped_db_gain / loc_db_gain; - } - - } - else if (((loc_db_gain < 0.0f) && (slopeIsNegative == 1)) || ((loc_db_gain > 0.0f) && (slopeIsNegative == 0))) - { - if (pstr_gain_modifiers->target_characteristic_right_present[drc_band] == 1) - { - split_drc_characteristic_source = interp_params_str->split_source_characteristic_right; - err = impd_map_gain(split_drc_characteristic_source, interp_params_str->split_target_characteristic_right, loc_db_gain, &mapped_db_gain); - if (err) return (err); - gain_ratio = mapped_db_gain / loc_db_gain; - } - } - } +impd_conv_to_linear_domain(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) { + WORD32 err = 0; + FLOAT32 loc_db_gain = in_param_db_gain; + FLOAT32 gain_ratio = 1.0; + FLOAT32 mapped_db_gain; + ia_gain_modifiers_struct* pstr_gain_modifiers = + interp_params_str->pstr_gain_modifiers; + if (interp_params_str->gain_modification_flag) { + ia_split_drc_characteristic_struct* split_drc_characteristic_source; + + WORD32 slopeIsNegative; + + if (interp_params_str->drc_characteristic_present) { + if (interp_params_str->drc_source_characteristic_cicp_format) { + } else { + slopeIsNegative = 0; + split_drc_characteristic_source = + interp_params_str->split_source_characteristic_left; + if (split_drc_characteristic_source->characteristic_format == 0) { + slopeIsNegative = 1; + } else { + if (split_drc_characteristic_source->node_gain[1] > 0.0f) { + slopeIsNegative = 1; + } + } + if (loc_db_gain == 0.0f) { + if (((pstr_gain_modifiers + ->target_characteristic_left_present[drc_band] == 1) && + (interp_params_str->split_target_characteristic_left + ->characteristic_format == CHARACTERISTIC_PASS_THRU)) || + ((pstr_gain_modifiers + ->target_characteristic_right_present[drc_band] == 1) && + (interp_params_str->split_target_characteristic_right + ->characteristic_format == CHARACTERISTIC_PASS_THRU))) { + mapped_db_gain = DRC_INPUT_LOUDNESS_TARGET; + loc_db_gain = DRC_INPUT_LOUDNESS_TARGET; + } + } else { + if (((loc_db_gain > 0.0f) && (slopeIsNegative == 1)) || + ((loc_db_gain < 0.0f) && (slopeIsNegative == 0))) { + if (pstr_gain_modifiers + ->target_characteristic_left_present[drc_band] == 1) { + err = impd_map_gain( + split_drc_characteristic_source, + interp_params_str->split_target_characteristic_left, + loc_db_gain, &mapped_db_gain); + if (err) return (err); + gain_ratio = mapped_db_gain / loc_db_gain; } - } - if (loc_db_gain < 0.0f) { - gain_ratio *= interp_params_str->compress; - } - else { - gain_ratio *= interp_params_str->boost; + } else if (((loc_db_gain < 0.0f) && (slopeIsNegative == 1)) || + ((loc_db_gain > 0.0f) && (slopeIsNegative == 0))) { + if (pstr_gain_modifiers + ->target_characteristic_right_present[drc_band] == 1) { + split_drc_characteristic_source = + interp_params_str->split_source_characteristic_right; + err = impd_map_gain( + split_drc_characteristic_source, + interp_params_str->split_target_characteristic_right, + loc_db_gain, &mapped_db_gain); + if (err) return (err); + gain_ratio = mapped_db_gain / loc_db_gain; + } + } } + } } - if (pstr_gain_modifiers->gain_scaling_flag[drc_band] == 1) { - if (loc_db_gain < 0.0) { - gain_ratio *= pstr_gain_modifiers->attn_scaling[drc_band]; - } - else { - gain_ratio *= pstr_gain_modifiers->ampl_scaling[drc_band]; - } + + if (loc_db_gain < 0.0f) { + gain_ratio *= interp_params_str->compress; + } else { + gain_ratio *= interp_params_str->boost; } - if ((interp_params_str->pstr_ducking_modifiers->ducking_scaling_flag == 1) && (interp_params_str->ducking_flag == 1)) { - gain_ratio *= interp_params_str->pstr_ducking_modifiers->ducking_scaling; + } + if (pstr_gain_modifiers->gain_scaling_flag[drc_band] == 1) { + if (loc_db_gain < 0.0) { + gain_ratio *= pstr_gain_modifiers->attn_scaling[drc_band]; + } else { + gain_ratio *= pstr_gain_modifiers->ampl_scaling[drc_band]; } - - if (interp_params_str->interpolation_loud_eq == 1) - { - *out_param_lin_gain = gain_ratio * loc_db_gain + pstr_gain_modifiers->gain_offset[drc_band]; - *out_param_lin_slope = 0.0f; + } + if ((interp_params_str->pstr_ducking_modifiers->ducking_scaling_flag == 1) && + (interp_params_str->ducking_flag == 1)) { + gain_ratio *= interp_params_str->pstr_ducking_modifiers->ducking_scaling; + } + + if (interp_params_str->interpolation_loud_eq == 1) { + *out_param_lin_gain = + gain_ratio * loc_db_gain + pstr_gain_modifiers->gain_offset[drc_band]; + *out_param_lin_slope = 0.0f; + } else { + *out_param_lin_gain = + (FLOAT32)pow(2.0, (FLOAT64)(gain_ratio * loc_db_gain / 6.0f)); + *out_param_lin_slope = SLOPE_FACTOR_DB_TO_LINEAR * gain_ratio * + *out_param_lin_gain * in_param_db_slope; + + if (pstr_gain_modifiers->gain_offset_flag[drc_band] == 1) { + *out_param_lin_gain *= (FLOAT32)pow( + 2.0, (FLOAT64)(pstr_gain_modifiers->gain_offset[drc_band] / 6.0f)); } - else - { - *out_param_lin_gain = (FLOAT32)pow(2.0, (FLOAT64)(gain_ratio * loc_db_gain / 6.0f)); - *out_param_lin_slope = SLOPE_FACTOR_DB_TO_LINEAR * gain_ratio * *out_param_lin_gain * in_param_db_slope; - - if (pstr_gain_modifiers->gain_offset_flag[drc_band] == 1) { - *out_param_lin_gain *= (FLOAT32)pow(2.0, (FLOAT64)(pstr_gain_modifiers->gain_offset[drc_band]/6.0f)); - } - if ((interp_params_str->limiter_peak_target_present == 1) && (interp_params_str->clipping_flag == 1)) { - *out_param_lin_gain *= (FLOAT32)pow(2.0, max(0.0, -interp_params_str->limiter_peak_target - interp_params_str->loudness_normalization_gain_db)/6.0); - if (*out_param_lin_gain >= 1.0) { - *out_param_lin_gain = 1.0; - *out_param_lin_slope = 0.0; - } - } + if ((interp_params_str->limiter_peak_target_present == 1) && + (interp_params_str->clipping_flag == 1)) { + *out_param_lin_gain *= (FLOAT32)pow( + 2.0, max(0.0, -interp_params_str->limiter_peak_target - + interp_params_str->loudness_normalization_gain_db) / + 6.0); + if (*out_param_lin_gain >= 1.0) { + *out_param_lin_gain = 1.0; + *out_param_lin_slope = 0.0; + } } - return (0); + } + return (0); } WORD32 impd_interpolate_drc_gain(ia_interp_params_struct* interp_params_str, - WORD32 drc_band, - WORD32 gain_step_tdomain, - FLOAT32 gain0, - FLOAT32 gain1, - FLOAT32 slope0, - FLOAT32 slope1, - FLOAT32* result) -{ - WORD32 err = 0; - WORD32 n; - FLOAT32 k1, k2, a, b, c, d; - FLOAT32 slope_t1; - FLOAT32 slope_t2; - FLOAT32 gain_t1; - FLOAT32 gain_t2; - - WORD32 cubic_interpolation = 1; - WORD32 node_inser; - FLOAT32 node_inser_float; - - if (gain_step_tdomain <= 0) - { - return (UNEXPECTED_ERROR); - } + WORD32 drc_band, WORD32 gain_step_tdomain, + FLOAT32 gain0, FLOAT32 gain1, FLOAT32 slope0, + FLOAT32 slope1, FLOAT32* result) { + WORD32 err = 0; + WORD32 n; + FLOAT32 k1, k2, a, b, c, d; + FLOAT32 slope_t1; + FLOAT32 slope_t2; + FLOAT32 gain_t1; + FLOAT32 gain_t2; + + WORD32 cubic_interpolation = 1; + WORD32 node_inser; + FLOAT32 node_inser_float; + + if (gain_step_tdomain <= 0) { + return (UNEXPECTED_ERROR); + } + + 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)) { + node_inser_float = 2.0f * + (gain_t2 - gain_t1 - slope_t2 * gain_step_tdomain) / + (slope_t1 - slope_t2); + node_inser = (WORD32)(0.5f + node_inser_float); + if ((node_inser >= 0) && (node_inser < gain_step_tdomain)) { + cubic_interpolation = 0; + + result[0] = gain_t1; + result[gain_step_tdomain] = gain_t2; - 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)) { - node_inser_float = 2.0f * (gain_t2 - gain_t1 - slope_t2 * gain_step_tdomain) / - (slope_t1 - slope_t2); - node_inser = (WORD32) (0.5f + node_inser_float); - if ((node_inser >= 0) && (node_inser < gain_step_tdomain)) { - cubic_interpolation = 0; - - result[0] = gain_t1; - result[gain_step_tdomain] = gain_t2; - - a = 0.5f*(slope_t2 - slope_t1) / node_inser_float; - b = slope_t1; - c = gain_t1; - for (n=1; n<node_inser; n++) { - FLOAT32 t = (FLOAT32) n; - result[n] = (a * t + b ) * t + c; - result[n] = max(0.0f, result[n]); - } - a = slope_t2; - b = gain_t2; - for ( ; n<gain_step_tdomain; n++) { - FLOAT32 t = (FLOAT32) (n - gain_step_tdomain); - result[n] = a * t + b; - } - } - } - else if ((FLOAT32)fabs((FLOAT64)slope_t1) < (FLOAT32)fabs((FLOAT64)slope_t2)) - { - node_inser_float = 2.0f * (gain_t1 - gain_t2 + slope_t1 * gain_step_tdomain) / - (slope_t1 - slope_t2); - node_inser_float = gain_step_tdomain - node_inser_float; - node_inser = (WORD32) (0.5f + node_inser_float); - if ((node_inser >= 0) && (node_inser < gain_step_tdomain)) { - cubic_interpolation = 0; - - result[0] = gain_t1; - result[gain_step_tdomain] = gain_t2; - - a = slope_t1; - b = gain_t1; - for (n=1; n<node_inser; n++) { - FLOAT32 t = (FLOAT32) n; - result[n] = a * t + b; - } - a = (slope_t2 - slope_t1) / (2.0f * (gain_step_tdomain - node_inser_float)); - b = - slope_t2; - c = gain_t2; - for ( ; n<gain_step_tdomain; n++) { - FLOAT32 t = (FLOAT32) (gain_step_tdomain-n); - result[n] = (a * t + b ) * t + c; - result[n] = max(0.0f, result[n]); - } - } + a = 0.5f * (slope_t2 - slope_t1) / node_inser_float; + b = slope_t1; + c = gain_t1; + for (n = 1; n < node_inser; n++) { + FLOAT32 t = (FLOAT32)n; + result[n] = (a * t + b) * t + c; + result[n] = max(0.0f, result[n]); } + a = slope_t2; + b = gain_t2; + for (; n < gain_step_tdomain; n++) { + FLOAT32 t = (FLOAT32)(n - gain_step_tdomain); + result[n] = a * t + b; + } + } + } else if ((FLOAT32)fabs((FLOAT64)slope_t1) < + (FLOAT32)fabs((FLOAT64)slope_t2)) { + node_inser_float = 2.0f * + (gain_t1 - gain_t2 + slope_t1 * gain_step_tdomain) / + (slope_t1 - slope_t2); + node_inser_float = gain_step_tdomain - node_inser_float; + node_inser = (WORD32)(0.5f + node_inser_float); + if ((node_inser >= 0) && (node_inser < gain_step_tdomain)) { + cubic_interpolation = 0; + + result[0] = gain_t1; + result[gain_step_tdomain] = gain_t2; - if (cubic_interpolation == 1) - { - FLOAT32 gain_step_inv = 1.0f / (FLOAT32)gain_step_tdomain; - FLOAT32 gain_step_inv2 = gain_step_inv * gain_step_inv; - - k1 = (gain_t2 - gain_t1) * gain_step_inv2; - k2 = slope_t2 + slope_t1; - - a = gain_step_inv * (gain_step_inv * k2 - 2.0f * k1); - b = 3.0f * k1 - gain_step_inv * (k2 + slope_t1); - c = slope_t1; - d = gain_t1; - - result[0] = gain_t1; - result[gain_step_tdomain] = gain_t2; - for (n=1; n<gain_step_tdomain; n++) { - FLOAT32 t = (FLOAT32) n; - result[n] = (((a * t + b ) * t + c ) * t ) + d; - result[n] = max(0.0f, result[n]); - } - } + a = slope_t1; + b = gain_t1; + for (n = 1; n < node_inser; n++) { + FLOAT32 t = (FLOAT32)n; + result[n] = a * t + b; + } + a = (slope_t2 - slope_t1) / + (2.0f * (gain_step_tdomain - node_inser_float)); + b = -slope_t2; + c = gain_t2; + for (; n < gain_step_tdomain; n++) { + FLOAT32 t = (FLOAT32)(gain_step_tdomain - n); + result[n] = (a * t + b) * t + c; + result[n] = max(0.0f, result[n]); + } + } } - 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; - result[gain_step_tdomain] = gain_t2; - for (n=1; n<gain_step_tdomain; n++) { - FLOAT32 t = (FLOAT32) n; - result[n] = a * t + b; - } + if (cubic_interpolation == 1) { + FLOAT32 gain_step_inv = 1.0f / (FLOAT32)gain_step_tdomain; + FLOAT32 gain_step_inv2 = gain_step_inv * gain_step_inv; + + k1 = (gain_t2 - gain_t1) * gain_step_inv2; + k2 = slope_t2 + slope_t1; + + a = gain_step_inv * (gain_step_inv * k2 - 2.0f * k1); + b = 3.0f * k1 - gain_step_inv * (k2 + slope_t1); + c = slope_t1; + d = gain_t1; + + result[0] = gain_t1; + result[gain_step_tdomain] = gain_t2; + for (n = 1; n < gain_step_tdomain; n++) { + FLOAT32 t = (FLOAT32)n; + result[n] = (((a * t + b) * t + c) * t) + d; + result[n] = max(0.0f, result[n]); + } + } + } 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; + result[gain_step_tdomain] = gain_t2; + for (n = 1; n < gain_step_tdomain; n++) { + FLOAT32 t = (FLOAT32)n; + result[n] = a * t + b; } - return 0; + } + return 0; } WORD32 -impd_advance_buf(WORD32 drc_frame_size, - ia_gain_buffer_struct* pstr_gain_buf) -{ - WORD32 n; - ia_interp_buf_struct* buf_interpolation; - - for (n=0; n<pstr_gain_buf->buf_interpolation_count; n++) - { - buf_interpolation = &(pstr_gain_buf->buf_interpolation[n]); - buf_interpolation->prev_node = buf_interpolation->str_node; - buf_interpolation->prev_node.time -= drc_frame_size; - memmove(buf_interpolation->lpcm_gains, buf_interpolation->lpcm_gains + drc_frame_size, sizeof(FLOAT32) * (drc_frame_size + MAX_SIGNAL_DELAY)); - } - return(0); +impd_advance_buf(WORD32 drc_frame_size, ia_gain_buffer_struct* pstr_gain_buf) { + WORD32 n; + ia_interp_buf_struct* buf_interpolation; + + for (n = 0; n < pstr_gain_buf->buf_interpolation_count; n++) { + buf_interpolation = &(pstr_gain_buf->buf_interpolation[n]); + buf_interpolation->prev_node = buf_interpolation->str_node; + buf_interpolation->prev_node.time -= drc_frame_size; + memmove(buf_interpolation->lpcm_gains, + buf_interpolation->lpcm_gains + drc_frame_size, + sizeof(FLOAT32) * (drc_frame_size + MAX_SIGNAL_DELAY)); + } + return (0); } WORD32 -impd_concatenate_segments(WORD32 drc_frame_size, - WORD32 drc_band, - ia_interp_params_struct* interp_params_str, - ia_spline_nodes_struct* str_spline_nodes, - ia_interp_buf_struct* buf_interpolation) -{ - WORD32 timePrev, duration, n, err = 0; - FLOAT32 loc_db_gain = 0.0f, prev_db_gain, slope = 0.0f, slopePrev; - - timePrev = buf_interpolation->prev_node.time; - prev_db_gain = buf_interpolation->prev_node.loc_db_gain; - slopePrev = buf_interpolation->prev_node.slope; - for (n=0; n<str_spline_nodes->num_nodes; n++) - { - duration = str_spline_nodes->str_node[n].time - timePrev; - loc_db_gain = str_spline_nodes->str_node[n].loc_db_gain; - slope = str_spline_nodes->str_node[n].slope; - - err = impd_interpolate_drc_gain(interp_params_str, - drc_band, - duration, - prev_db_gain, - loc_db_gain, - slopePrev, - slope, - buf_interpolation->lpcm_gains + MAX_SIGNAL_DELAY + drc_frame_size + timePrev); - if (err) return (err); - - timePrev = str_spline_nodes->str_node[n].time; - prev_db_gain = loc_db_gain; - slopePrev = slope; - } - - buf_interpolation->str_node.loc_db_gain = loc_db_gain; - buf_interpolation->str_node.slope = slope; - buf_interpolation->str_node.time = timePrev; - - - return(0); +impd_concatenate_segments(WORD32 drc_frame_size, WORD32 drc_band, + ia_interp_params_struct* interp_params_str, + ia_spline_nodes_struct* str_spline_nodes, + ia_interp_buf_struct* buf_interpolation) { + WORD32 timePrev, duration, n, err = 0; + FLOAT32 loc_db_gain = 0.0f, prev_db_gain, slope = 0.0f, slopePrev; + + timePrev = buf_interpolation->prev_node.time; + prev_db_gain = buf_interpolation->prev_node.loc_db_gain; + slopePrev = buf_interpolation->prev_node.slope; + for (n = 0; n < str_spline_nodes->num_nodes; n++) { + duration = str_spline_nodes->str_node[n].time - timePrev; + loc_db_gain = str_spline_nodes->str_node[n].loc_db_gain; + slope = str_spline_nodes->str_node[n].slope; + + err = impd_interpolate_drc_gain( + interp_params_str, drc_band, duration, prev_db_gain, loc_db_gain, + slopePrev, slope, buf_interpolation->lpcm_gains + MAX_SIGNAL_DELAY + + drc_frame_size + timePrev); + if (err) return (err); + + timePrev = str_spline_nodes->str_node[n].time; + prev_db_gain = loc_db_gain; + slopePrev = slope; + } + + buf_interpolation->str_node.loc_db_gain = loc_db_gain; + buf_interpolation->str_node.slope = slope; + buf_interpolation->str_node.time = timePrev; + + return (0); } WORD32 -impd_get_drc_gain (ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, - ia_drc_gain_struct* pstr_drc_gain, - FLOAT32 compress, - FLOAT32 boost, - WORD32 characteristic_index, - FLOAT32 loudness_normalization_gain_db, - WORD32 sel_drc_index, - ia_drc_gain_buffers_struct* drc_gain_buffers) -{ - ia_drc_params_struct* ia_drc_params_struct = &(p_drc_gain_dec_structs->ia_drc_params_struct); - WORD32 drc_instructions_index = ia_drc_params_struct->sel_drc_array[sel_drc_index].drc_instructions_index; - if (drc_instructions_index >= 0) - { - WORD32 b, g, gainElementIndex, err = 0; - WORD32 parametricDrcInstanceIndex = 0; - ia_interp_params_struct interp_params_str = {0}; - - ia_drc_instructions_struct* str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[drc_instructions_index]); - WORD32 drc_set_effect = str_drc_instruction_str->drc_set_effect; - WORD32 num_drc_ch_groups = str_drc_instruction_str->num_drc_ch_groups; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; - WORD32 drc_coeff_idx = ia_drc_params_struct->sel_drc_array[sel_drc_index].drc_coeff_idx; - if (drc_coeff_idx >= 0) - { - str_p_loc_drc_coefficients_uni_drc = &(pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[drc_coeff_idx]); - interp_params_str.interpolation_loud_eq = 0; - } - else - { - return (UNEXPECTED_ERROR); - } - - interp_params_str.loudness_normalization_gain_db = loudness_normalization_gain_db; - interp_params_str.characteristic_index = characteristic_index; - interp_params_str.compress = compress; - interp_params_str.boost = boost; - interp_params_str.limiter_peak_target_present = str_drc_instruction_str->limiter_peak_target_present; - interp_params_str.limiter_peak_target = str_drc_instruction_str->limiter_peak_target; - - if ( ((drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) && (drc_set_effect != EFFECT_BIT_FADE) && (drc_set_effect != EFFECT_BIT_CLIPPING)) - { - interp_params_str.gain_modification_flag = 1; - } - else - { - interp_params_str.gain_modification_flag = 0; - } - if (drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) - { - interp_params_str.ducking_flag = 1; - } - else - { - interp_params_str.ducking_flag = 0; - } - if (drc_set_effect == EFFECT_BIT_CLIPPING) - { - interp_params_str.clipping_flag = 1; - } - else - { - 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); - - gainElementIndex = 0; - for(g=0; g<num_drc_ch_groups; g++) - { - WORD32 gainSet = 0; - WORD32 num_drc_bands = 0; - interp_params_str.gain_interpolation_type = str_drc_instruction_str->gain_interpolation_type_for_channel_group[g]; - interp_params_str.delta_tmin = str_drc_instruction_str->time_delta_min_for_channel_group[g]; - interp_params_str.pstr_ducking_modifiers = &(str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g]); - interp_params_str.pstr_gain_modifiers = &(str_drc_instruction_str->str_gain_modifiers_of_ch_group[g]); - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { - gainSet = str_drc_instruction_str->gain_set_index_for_channel_group[g]; - num_drc_bands = str_drc_instruction_str->band_count_of_ch_group[g]; - for(b=0; b<num_drc_bands; b++) - { - ia_gain_params_struct* gain_params = &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[gainSet].gain_params[b]); - WORD32 seq = gain_params->gain_seq_idx; - interp_params_str.drc_characteristic_present = gain_params->drc_characteristic_present; - interp_params_str.drc_source_characteristic_cicp_format = gain_params->drc_characteristic_format_is_cicp; - interp_params_str.source_drc_characteristic = gain_params->drc_characteristic; - interp_params_str.split_source_characteristic_left = &(str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_left [gain_params->drc_characteristic_left_index]); - interp_params_str.split_source_characteristic_right = &(str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_right[gain_params->drc_characteristic_right_index]); - interp_params_str.split_target_characteristic_left = &(str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_left [interp_params_str.pstr_gain_modifiers->target_characteristic_left_index[b]]); - interp_params_str.split_target_characteristic_right = &(str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_right[interp_params_str.pstr_gain_modifiers->target_characteristic_right_index[b]]); - err = impd_concatenate_segments (ia_drc_params_struct->drc_frame_size, - b, - &interp_params_str, - &(pstr_drc_gain->drc_gain_sequence[seq].str_spline_nodes[0]), - &(drc_gain_buffers->pstr_gain_buf[sel_drc_index].buf_interpolation[gainElementIndex])); - if (err) return (err); - gainElementIndex++; - } - } else { - if (ia_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF && !(p_drc_gain_dec_structs->parametricdrc_params.str_parametric_drc_instance_params[parametricDrcInstanceIndex].parametric_drc_type == PARAM_DRC_TYPE_LIM)) { - err = impd_parametric_drc_instance_process (p_drc_gain_dec_structs->audio_in_out_buf.audio_in_out_buf, - NULL, - NULL, - &p_drc_gain_dec_structs->parametricdrc_params, - &p_drc_gain_dec_structs->parametricdrc_params.str_parametric_drc_instance_params[parametricDrcInstanceIndex]); - if (err) return (err); - - err = impd_concatenate_segments(ia_drc_params_struct->drc_frame_size, - 0, - &interp_params_str, - &p_drc_gain_dec_structs->parametricdrc_params.str_parametric_drc_instance_params[parametricDrcInstanceIndex].str_spline_nodes, - &(drc_gain_buffers->pstr_gain_buf[sel_drc_index].buf_interpolation[gainElementIndex])); - if (err) return (err); - } else if (ia_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF && p_drc_gain_dec_structs->parametricdrc_params.str_parametric_drc_instance_params[parametricDrcInstanceIndex].parametric_drc_type == PARAM_DRC_TYPE_LIM) { - FLOAT32* lpcm_gains = (drc_gain_buffers->pstr_gain_buf[sel_drc_index].buf_interpolation[gainElementIndex]).lpcm_gains + MAX_SIGNAL_DELAY; - err = 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.str_parametric_drc_instance_params[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.str_parametric_drc_instance_params[parametricDrcInstanceIndex].parametric_drc_type == PARAM_DRC_TYPE_LIM)) { - err = impd_parametric_drc_instance_process (NULL, - p_drc_gain_dec_structs->audio_in_out_buf.audio_real_buff, - p_drc_gain_dec_structs->audio_in_out_buf.audio_imag_buff, - &p_drc_gain_dec_structs->parametricdrc_params, - &p_drc_gain_dec_structs->parametricdrc_params.str_parametric_drc_instance_params[parametricDrcInstanceIndex]); - if (err) return (err); - - err = impd_concatenate_segments(ia_drc_params_struct->drc_frame_size, - 0, - &interp_params_str, - &p_drc_gain_dec_structs->parametricdrc_params.str_parametric_drc_instance_params[parametricDrcInstanceIndex].str_spline_nodes, - &(drc_gain_buffers->pstr_gain_buf[sel_drc_index].buf_interpolation[gainElementIndex])); - if (err) return (err); +impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, + ia_drc_gain_struct* pstr_drc_gain, FLOAT32 compress, + FLOAT32 boost, WORD32 characteristic_index, + FLOAT32 loudness_normalization_gain_db, WORD32 sel_drc_index, + ia_drc_gain_buffers_struct* drc_gain_buffers) { + ia_drc_params_struct* ia_drc_params_struct = + &(p_drc_gain_dec_structs->ia_drc_params_struct); + WORD32 drc_instructions_index = + ia_drc_params_struct->sel_drc_array[sel_drc_index].drc_instructions_index; + if (drc_instructions_index >= 0) { + WORD32 b, g, gainElementIndex, err = 0; + WORD32 parametricDrcInstanceIndex = 0; + ia_interp_params_struct interp_params_str = {0}; + + ia_drc_instructions_struct* str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str[drc_instructions_index]); + WORD32 drc_set_effect = str_drc_instruction_str->drc_set_effect; + WORD32 num_drc_ch_groups = str_drc_instruction_str->num_drc_ch_groups; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; + WORD32 drc_coeff_idx = + ia_drc_params_struct->sel_drc_array[sel_drc_index].drc_coeff_idx; + if (drc_coeff_idx >= 0) { + str_p_loc_drc_coefficients_uni_drc = + &(pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[drc_coeff_idx]); + interp_params_str.interpolation_loud_eq = 0; + } else { + return (UNEXPECTED_ERROR); + } + interp_params_str.loudness_normalization_gain_db = + loudness_normalization_gain_db; + interp_params_str.characteristic_index = characteristic_index; + interp_params_str.compress = compress; + interp_params_str.boost = boost; + interp_params_str.limiter_peak_target_present = + str_drc_instruction_str->limiter_peak_target_present; + interp_params_str.limiter_peak_target = + str_drc_instruction_str->limiter_peak_target; + + if (((drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == + 0) && + (drc_set_effect != EFFECT_BIT_FADE) && + (drc_set_effect != EFFECT_BIT_CLIPPING)) { + interp_params_str.gain_modification_flag = 1; } else { - return (UNEXPECTED_ERROR); + interp_params_str.gain_modification_flag = 0; } - gainElementIndex++; - parametricDrcInstanceIndex++; + if (drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { + interp_params_str.ducking_flag = 1; + } else { + interp_params_str.ducking_flag = 0; } - } + if (drc_set_effect == EFFECT_BIT_CLIPPING) { + interp_params_str.clipping_flag = 1; + } else { + interp_params_str.clipping_flag = 0; } - return (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); + + gainElementIndex = 0; + for (g = 0; g < num_drc_ch_groups; g++) { + WORD32 gainSet = 0; + WORD32 num_drc_bands = 0; + interp_params_str.gain_interpolation_type = + str_drc_instruction_str->gain_interpolation_type_for_channel_group[g]; + interp_params_str.delta_tmin = + str_drc_instruction_str->time_delta_min_for_channel_group[g]; + interp_params_str.pstr_ducking_modifiers = &( + str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g]); + interp_params_str.pstr_gain_modifiers = + &(str_drc_instruction_str->str_gain_modifiers_of_ch_group[g]); + if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { + gainSet = str_drc_instruction_str->gain_set_index_for_channel_group[g]; + num_drc_bands = str_drc_instruction_str->band_count_of_ch_group[g]; + for (b = 0; b < num_drc_bands; b++) { + ia_gain_params_struct* gain_params = + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[gainSet] + .gain_params[b]); + WORD32 seq = gain_params->gain_seq_idx; + interp_params_str.drc_characteristic_present = + gain_params->drc_characteristic_present; + interp_params_str.drc_source_characteristic_cicp_format = + gain_params->drc_characteristic_format_is_cicp; + interp_params_str.source_drc_characteristic = + gain_params->drc_characteristic; + interp_params_str.split_source_characteristic_left = &( + str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_left + [gain_params->drc_characteristic_left_index]); + interp_params_str.split_source_characteristic_right = &( + str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_right + [gain_params->drc_characteristic_right_index]); + interp_params_str.split_target_characteristic_left = &( + str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_left + [interp_params_str.pstr_gain_modifiers + ->target_characteristic_left_index[b]]); + interp_params_str.split_target_characteristic_right = &( + str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_right + [interp_params_str.pstr_gain_modifiers + ->target_characteristic_right_index[b]]); + err = impd_concatenate_segments( + ia_drc_params_struct->drc_frame_size, b, &interp_params_str, + &(pstr_drc_gain->drc_gain_sequence[seq].str_spline_nodes[0]), + &(drc_gain_buffers->pstr_gain_buf[sel_drc_index] + .buf_interpolation[gainElementIndex])); + if (err) return (err); + gainElementIndex++; + } + } else { + if (ia_drc_params_struct->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_OFF && + !(p_drc_gain_dec_structs->parametricdrc_params + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex] + .parametric_drc_type == PARAM_DRC_TYPE_LIM)) { + err = impd_parametric_drc_instance_process( + p_drc_gain_dec_structs->audio_in_out_buf.audio_in_out_buf, NULL, + NULL, &p_drc_gain_dec_structs->parametricdrc_params, + &p_drc_gain_dec_structs->parametricdrc_params + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex]); + if (err) return (err); + + err = impd_concatenate_segments( + ia_drc_params_struct->drc_frame_size, 0, &interp_params_str, + &p_drc_gain_dec_structs->parametricdrc_params + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex] + .str_spline_nodes, + &(drc_gain_buffers->pstr_gain_buf[sel_drc_index] + .buf_interpolation[gainElementIndex])); + if (err) return (err); + } else if (ia_drc_params_struct->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_OFF && + p_drc_gain_dec_structs->parametricdrc_params + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex] + .parametric_drc_type == PARAM_DRC_TYPE_LIM) { + FLOAT32* lpcm_gains = (drc_gain_buffers->pstr_gain_buf[sel_drc_index] + .buf_interpolation[gainElementIndex]) + .lpcm_gains + + MAX_SIGNAL_DELAY; + err = 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 + .str_parametric_drc_instance_params + [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 + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex] + .parametric_drc_type == PARAM_DRC_TYPE_LIM)) { + err = impd_parametric_drc_instance_process( + NULL, p_drc_gain_dec_structs->audio_in_out_buf.audio_real_buff, + p_drc_gain_dec_structs->audio_in_out_buf.audio_imag_buff, + &p_drc_gain_dec_structs->parametricdrc_params, + &p_drc_gain_dec_structs->parametricdrc_params + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex]); + if (err) return (err); + + err = impd_concatenate_segments( + ia_drc_params_struct->drc_frame_size, 0, &interp_params_str, + &p_drc_gain_dec_structs->parametricdrc_params + .str_parametric_drc_instance_params + [parametricDrcInstanceIndex] + .str_spline_nodes, + &(drc_gain_buffers->pstr_gain_buf[sel_drc_index] + .buf_interpolation[gainElementIndex])); + if (err) return (err); + + } else { + return (UNEXPECTED_ERROR); + } + gainElementIndex++; + parametricDrcInstanceIndex++; + } + } + } + return (0); +} diff --git a/decoder/drc_src/impd_drc_gain_dec.h b/decoder/drc_src/impd_drc_gain_dec.h index 8f2254b..c240af5 100644 --- a/decoder/drc_src/impd_drc_gain_dec.h +++ b/decoder/drc_src/impd_drc_gain_dec.h @@ -21,76 +21,73 @@ #define IMPD_DRC_GAIN_DEC_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct { - ia_node_struct str_node; - ia_node_struct prev_node; - FLOAT32 lpcm_gains[2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY]; + ia_node_struct str_node; + ia_node_struct prev_node; + FLOAT32 lpcm_gains[2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY]; } ia_interp_buf_struct; typedef struct { - WORD32 buf_interpolation_count; - ia_interp_buf_struct* buf_interpolation; + WORD32 buf_interpolation_count; + ia_interp_buf_struct* buf_interpolation; } ia_gain_buffer_struct; typedef struct { - ia_gain_buffer_struct pstr_gain_buf[SEL_DRC_COUNT]; + ia_gain_buffer_struct pstr_gain_buf[SEL_DRC_COUNT]; } ia_drc_gain_buffers_struct; typedef struct { - WORD32 gain_interpolation_type; - WORD32 gain_modification_flag; - WORD32 ducking_flag; - WORD32 clipping_flag; - ia_ducking_modifiers_struct* pstr_ducking_modifiers; - ia_gain_modifiers_struct* pstr_gain_modifiers; - WORD32 drc_characteristic_present; - WORD32 drc_source_characteristic_cicp_format; - WORD32 source_drc_characteristic; - ia_split_drc_characteristic_struct* split_source_characteristic_left; - ia_split_drc_characteristic_struct* split_source_characteristic_right; - WORD32 drc_target_characteristic_cicp_format; - WORD32 target_drc_characteristic; - ia_split_drc_characteristic_struct* split_target_characteristic_left; - ia_split_drc_characteristic_struct* split_target_characteristic_right; - WORD32 interpolation_loud_eq; - WORD32 limiter_peak_target_present; - FLOAT32 limiter_peak_target; - FLOAT32 loudness_normalization_gain_db; - WORD32 delta_tmin; - WORD32 characteristic_index; - FLOAT32 compress; - FLOAT32 boost; + WORD32 gain_interpolation_type; + WORD32 gain_modification_flag; + WORD32 ducking_flag; + WORD32 clipping_flag; + ia_ducking_modifiers_struct* pstr_ducking_modifiers; + ia_gain_modifiers_struct* pstr_gain_modifiers; + WORD32 drc_characteristic_present; + WORD32 drc_source_characteristic_cicp_format; + WORD32 source_drc_characteristic; + ia_split_drc_characteristic_struct* split_source_characteristic_left; + ia_split_drc_characteristic_struct* split_source_characteristic_right; + WORD32 drc_target_characteristic_cicp_format; + WORD32 target_drc_characteristic; + ia_split_drc_characteristic_struct* split_target_characteristic_left; + ia_split_drc_characteristic_struct* split_target_characteristic_right; + WORD32 interpolation_loud_eq; + WORD32 limiter_peak_target_present; + FLOAT32 limiter_peak_target; + FLOAT32 loudness_normalization_gain_db; + WORD32 delta_tmin; + WORD32 characteristic_index; + FLOAT32 compress; + FLOAT32 boost; } ia_interp_params_struct; - typedef struct { - WORD32 drc_instructions_index; - WORD32 drc_coeff_idx; - WORD32 dwnmix_instructions_index; + WORD32 drc_instructions_index; + WORD32 drc_coeff_idx; + WORD32 dwnmix_instructions_index; } ia_sel_drc_struct; typedef struct { - WORD32 sample_rate; - WORD32 delta_tmin_default; - WORD32 drc_frame_size; - WORD32 delay_mode; - WORD32 sub_band_domain_mode; - WORD32 gain_delay_samples; - WORD32 parametric_drc_delay; - WORD32 eq_delay; - WORD32 audio_delay_samples; - WORD32 drc_set_counter; - WORD32 multiband_sel_drc_idx; + WORD32 sample_rate; + WORD32 delta_tmin_default; + WORD32 drc_frame_size; + WORD32 delay_mode; + WORD32 sub_band_domain_mode; + WORD32 gain_delay_samples; + WORD32 parametric_drc_delay; + WORD32 eq_delay; + WORD32 audio_delay_samples; + WORD32 drc_set_counter; + WORD32 multiband_sel_drc_idx; - ia_sel_drc_struct sel_drc_array[SEL_DRC_COUNT]; + ia_sel_drc_struct sel_drc_array[SEL_DRC_COUNT]; } ia_drc_params_struct; - #ifdef __cplusplus } #endif diff --git a/decoder/drc_src/impd_drc_gain_decoder.c b/decoder/drc_src/impd_drc_gain_decoder.c index 3583051..43ae7b2 100644 --- a/decoder/drc_src/impd_drc_gain_decoder.c +++ b/decoder/drc_src/impd_drc_gain_decoder.c @@ -38,461 +38,465 @@ #include "impd_drc_gain_decoder.h" #include "impd_drc_dec.h" -IA_ERRORCODE impd_init_drc_decode( WORD32 frame_size, - WORD32 sample_rate, - WORD32 gain_delay_samples, - WORD32 delay_mode, - WORD32 sub_band_domain_mode, - ia_drc_gain_dec_struct* p_drc_gain_dec_structs) -{ - IA_ERRORCODE err_code = IA_NO_ERROR; - - - err_code = impd_init_drc_params(frame_size, - sample_rate, - gain_delay_samples, - delay_mode, - sub_band_domain_mode, - &p_drc_gain_dec_structs->ia_drc_params_struct); - - if (err_code!=IA_NO_ERROR) - return (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); - - if (err_code!=IA_NO_ERROR) - return (err_code); - - return err_code; -} - +IA_ERRORCODE impd_init_drc_decode( + WORD32 frame_size, WORD32 sample_rate, WORD32 gain_delay_samples, + WORD32 delay_mode, WORD32 sub_band_domain_mode, + ia_drc_gain_dec_struct* p_drc_gain_dec_structs) { + IA_ERRORCODE err_code = IA_NO_ERROR; -IA_ERRORCODE impd_init_drc_decode_post_config(WORD32 audio_num_chan, - WORD32* drc_set_id_processed, - WORD32* downmix_id_processed, - WORD32 num_sets_processed, - WORD32 eq_set_id_processed, - - ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - pVOID *mem_ptr - ) -{ - - IA_ERRORCODE err_code = 0; - WORD32 i,j,k, maxMultibandAudioSignalCount=0; - ia_drc_params_struct* p_drc_params_struct = &p_drc_gain_dec_structs->ia_drc_params_struct; - ia_audio_in_out_buf* p_audio_in_out_buf = &p_drc_gain_dec_structs->audio_in_out_buf; - - for (i = 0; i < num_sets_processed; i++) - { - err_code = impd_init_selected_drc_set(pstr_drc_config, - p_drc_params_struct, - &p_drc_gain_dec_structs->parametricdrc_params, - audio_num_chan, - drc_set_id_processed[i], - downmix_id_processed[i], - &p_drc_gain_dec_structs->ia_filter_banks_struct, - &p_drc_gain_dec_structs->str_overlap_params - ,p_drc_gain_dec_structs->shape_filter_block - ); - if (err_code) - return (err_code); - } - - p_drc_gain_dec_structs->audio_num_chan = audio_num_chan; - p_drc_gain_dec_structs->ia_drc_params_struct.audio_delay_samples = p_drc_gain_dec_structs->ia_drc_params_struct.parametric_drc_delay; - if (pstr_drc_config->str_drc_config_ext.parametric_drc_present) { - err_code = impd_init_parametric_drc_after_config(pstr_drc_config, - pstr_loudness_info, - &p_drc_gain_dec_structs->parametricdrc_params, - mem_ptr); - if (err_code) - return (err_code); - } + err_code = impd_init_drc_params( + frame_size, sample_rate, gain_delay_samples, delay_mode, + sub_band_domain_mode, &p_drc_gain_dec_structs->ia_drc_params_struct); - p_audio_in_out_buf->audio_num_chan = audio_num_chan; - p_audio_in_out_buf->audio_delay_samples = p_drc_params_struct->audio_delay_samples; - p_audio_in_out_buf->frame_size = p_drc_params_struct->drc_frame_size; - - - if(p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_QMF64){ - p_audio_in_out_buf->audio_delay_sub_band_samples = p_drc_params_struct->audio_delay_samples / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - p_audio_in_out_buf->audio_sub_band_frame_size = p_drc_params_struct->drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_QMF64; - } - else if(p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_QMF71){ - p_audio_in_out_buf->audio_delay_sub_band_samples = p_drc_params_struct->audio_delay_samples / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; - p_audio_in_out_buf->audio_sub_band_frame_size = p_drc_params_struct->drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; - p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_QMF71; - } - else if(p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_STFT256){ - p_audio_in_out_buf->audio_delay_sub_band_samples = p_drc_params_struct->audio_delay_samples / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - p_audio_in_out_buf->audio_sub_band_frame_size = p_drc_params_struct->drc_frame_size / AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_STFT256; - } - else{ - p_audio_in_out_buf->audio_delay_sub_band_samples = 0; - p_audio_in_out_buf->audio_sub_band_frame_size = 0; - p_audio_in_out_buf->audio_sub_band_count = 0; - } + if (err_code != IA_NO_ERROR) return (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); + if (err_code != IA_NO_ERROR) return (err_code); + return err_code; +} - for (k=0; k<SEL_DRC_COUNT; k++) - { - if (p_drc_params_struct->sel_drc_array[k].drc_instructions_index >= 0) - { - ia_drc_instructions_struct* drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[p_drc_params_struct->sel_drc_array[k].drc_instructions_index]); - if (drc_instruction_str->gain_element_count > 0) - { - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k].buf_interpolation = (ia_interp_buf_struct*)*mem_ptr; - *mem_ptr=(pVOID)((SIZE_T)*mem_ptr+drc_instruction_str->gain_element_count*sizeof(ia_interp_buf_struct)+32); - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k].buf_interpolation_count = drc_instruction_str->gain_element_count; - for (i=0; i<p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i].buf_interpolation_count; i++) - { - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i].buf_interpolation[i].str_node.time = 0; - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i].buf_interpolation[i].prev_node.time = -1; - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i].buf_interpolation[i].str_node.loc_db_gain = 0.0f; - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i].buf_interpolation[i].str_node.slope = 0.0f; - - for (j=0; j<2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY; j++) - { - p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i].buf_interpolation[i].lpcm_gains[j] = 1.f; - } - } - } +IA_ERRORCODE impd_init_drc_decode_post_config( + WORD32 audio_num_chan, WORD32* drc_set_id_processed, + WORD32* downmix_id_processed, WORD32 num_sets_processed, + WORD32 eq_set_id_processed, + + ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, pVOID* mem_ptr) { + IA_ERRORCODE err_code = 0; + WORD32 i, j, k, maxMultibandAudioSignalCount = 0; + ia_drc_params_struct* p_drc_params_struct = + &p_drc_gain_dec_structs->ia_drc_params_struct; + ia_audio_in_out_buf* p_audio_in_out_buf = + &p_drc_gain_dec_structs->audio_in_out_buf; + + for (i = 0; i < num_sets_processed; i++) { + err_code = impd_init_selected_drc_set( + pstr_drc_config, p_drc_params_struct, + &p_drc_gain_dec_structs->parametricdrc_params, audio_num_chan, + drc_set_id_processed[i], downmix_id_processed[i], + &p_drc_gain_dec_structs->ia_filter_banks_struct, + &p_drc_gain_dec_structs->str_overlap_params, + p_drc_gain_dec_structs->shape_filter_block); + if (err_code) return (err_code); + } + + p_drc_gain_dec_structs->audio_num_chan = audio_num_chan; + p_drc_gain_dec_structs->ia_drc_params_struct.audio_delay_samples = + p_drc_gain_dec_structs->ia_drc_params_struct.parametric_drc_delay; + if (pstr_drc_config->str_drc_config_ext.parametric_drc_present) { + err_code = impd_init_parametric_drc_after_config( + pstr_drc_config, pstr_loudness_info, + &p_drc_gain_dec_structs->parametricdrc_params, mem_ptr); + if (err_code) return (err_code); + } + + p_audio_in_out_buf->audio_num_chan = audio_num_chan; + p_audio_in_out_buf->audio_delay_samples = + p_drc_params_struct->audio_delay_samples; + p_audio_in_out_buf->frame_size = p_drc_params_struct->drc_frame_size; + + if (p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_QMF64) { + p_audio_in_out_buf->audio_delay_sub_band_samples = + p_drc_params_struct->audio_delay_samples / + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; + p_audio_in_out_buf->audio_sub_band_frame_size = + p_drc_params_struct->drc_frame_size / + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; + p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_QMF64; + } else if (p_drc_params_struct->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_QMF71) { + p_audio_in_out_buf->audio_delay_sub_band_samples = + p_drc_params_struct->audio_delay_samples / + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; + p_audio_in_out_buf->audio_sub_band_frame_size = + p_drc_params_struct->drc_frame_size / + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; + p_audio_in_out_buf->audio_sub_band_count = AUDIO_CODEC_SUBBAND_COUNT_QMF71; + } else if (p_drc_params_struct->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_STFT256) { + p_audio_in_out_buf->audio_delay_sub_band_samples = + p_drc_params_struct->audio_delay_samples / + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; + p_audio_in_out_buf->audio_sub_band_frame_size = + p_drc_params_struct->drc_frame_size / + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; + p_audio_in_out_buf->audio_sub_band_count = + AUDIO_CODEC_SUBBAND_COUNT_STFT256; + } else { + p_audio_in_out_buf->audio_delay_sub_band_samples = 0; + p_audio_in_out_buf->audio_sub_band_frame_size = 0; + p_audio_in_out_buf->audio_sub_band_count = 0; + } + + for (k = 0; k < SEL_DRC_COUNT; k++) { + if (p_drc_params_struct->sel_drc_array[k].drc_instructions_index >= 0) { + ia_drc_instructions_struct* drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [p_drc_params_struct->sel_drc_array[k].drc_instructions_index]); + if (drc_instruction_str->gain_element_count > 0) { + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k] + .buf_interpolation = (ia_interp_buf_struct*)*mem_ptr; + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + drc_instruction_str->gain_element_count * + sizeof(ia_interp_buf_struct) + + 32); + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[k] + .buf_interpolation_count = drc_instruction_str->gain_element_count; + for (i = 0; + i < p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i] + .buf_interpolation_count; + i++) { + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i] + .buf_interpolation[i] + .str_node.time = 0; + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i] + .buf_interpolation[i] + .prev_node.time = -1; + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i] + .buf_interpolation[i] + .str_node.loc_db_gain = 0.0f; + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i] + .buf_interpolation[i] + .str_node.slope = 0.0f; + + for (j = 0; j < 2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY; + j++) { + p_drc_gain_dec_structs->drc_gain_buffers.pstr_gain_buf[i] + .buf_interpolation[i] + .lpcm_gains[j] = 1.f; + } } + } } - - - - - if (eq_set_id_processed > 0) - { - for(i=0; i<pstr_drc_config->str_drc_config_ext.eq_instructions_count; i++) - { - if (pstr_drc_config->str_drc_config_ext.str_eq_instructions[i].eq_set_id == eq_set_id_processed) - break; - } - if (i==pstr_drc_config->str_drc_config_ext.eq_instructions_count) - { - return -1; - } - - - p_drc_gain_dec_structs->eq_set=(ia_eq_set_struct*)*mem_ptr ; - *mem_ptr=(pVOID)((SIZE_T)*mem_ptr+sizeof(ia_eq_set_struct)+32); - - if (err_code) - return (err_code); - - err_code = impd_derive_eq_set (&pstr_drc_config->str_drc_config_ext.str_eq_coeff, - &(pstr_drc_config->str_drc_config_ext.str_eq_instructions[i]), - (FLOAT32)p_drc_gain_dec_structs->ia_drc_params_struct.sample_rate, - p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size, - p_drc_gain_dec_structs->ia_drc_params_struct.sub_band_domain_mode, - p_drc_gain_dec_structs->eq_set); - if (err_code) - return (err_code); - - impd_get_eq_set_delay (p_drc_gain_dec_structs->eq_set, - &p_drc_gain_dec_structs->ia_drc_params_struct.eq_delay); - + } + + if (eq_set_id_processed > 0) { + for (i = 0; i < pstr_drc_config->str_drc_config_ext.eq_instructions_count; + i++) { + if (pstr_drc_config->str_drc_config_ext.str_eq_instructions[i] + .eq_set_id == eq_set_id_processed) + break; } - - - - for (i=0; i<p_drc_params_struct->drc_set_counter; i++) - { - ia_drc_instructions_struct* drc_instruction_str; - drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[p_drc_params_struct->sel_drc_array[i].drc_instructions_index]); - maxMultibandAudioSignalCount = max(maxMultibandAudioSignalCount, drc_instruction_str->multiband_audio_sig_count); + if (i == pstr_drc_config->str_drc_config_ext.eq_instructions_count) { + return -1; } - - - - p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio = *mem_ptr; - *mem_ptr = (pVOID) ((SIZE_T)*mem_ptr+(maxMultibandAudioSignalCount*sizeof(FLOAT32*))+32); - - - - for (i=0;i<maxMultibandAudioSignalCount; i++) - { - p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio[i] = *mem_ptr; - *mem_ptr = (pVOID) ( (SIZE_T)*mem_ptr+(p_drc_params_struct->drc_frame_size*sizeof(FLOAT32))+32); - + p_drc_gain_dec_structs->eq_set = (ia_eq_set_struct*)*mem_ptr; + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + sizeof(ia_eq_set_struct) + 32); + + if (err_code) return (err_code); + + err_code = impd_derive_eq_set( + &pstr_drc_config->str_drc_config_ext.str_eq_coeff, + &(pstr_drc_config->str_drc_config_ext.str_eq_instructions[i]), + (FLOAT32)p_drc_gain_dec_structs->ia_drc_params_struct.sample_rate, + p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size, + p_drc_gain_dec_structs->ia_drc_params_struct.sub_band_domain_mode, + p_drc_gain_dec_structs->eq_set); + if (err_code) return (err_code); + + impd_get_eq_set_delay( + p_drc_gain_dec_structs->eq_set, + &p_drc_gain_dec_structs->ia_drc_params_struct.eq_delay); + } + + for (i = 0; i < p_drc_params_struct->drc_set_counter; i++) { + ia_drc_instructions_struct* drc_instruction_str; + drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [p_drc_params_struct->sel_drc_array[i].drc_instructions_index]); + maxMultibandAudioSignalCount = + max(maxMultibandAudioSignalCount, + drc_instruction_str->multiband_audio_sig_count); + } + + p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio = *mem_ptr; + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + (maxMultibandAudioSignalCount * sizeof(FLOAT32*)) + 32); + + for (i = 0; i < maxMultibandAudioSignalCount; i++) { + p_drc_gain_dec_structs->audio_band_buffer.non_interleaved_audio[i] = + *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_drc_params_struct->drc_frame_size * sizeof(FLOAT32)) + 32); + } + p_drc_gain_dec_structs->audio_band_buffer.multiband_audio_sig_count = + maxMultibandAudioSignalCount; + p_drc_gain_dec_structs->audio_band_buffer.frame_size = + p_drc_params_struct->drc_frame_size; + ; + + if (p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF && + p_audio_in_out_buf->audio_delay_samples) { + p_audio_in_out_buf->audio_io_buffer_delayed = *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + p_audio_in_out_buf->audio_in_out_buf = *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + + for (i = 0; i < p_audio_in_out_buf->audio_num_chan; i++) { + p_audio_in_out_buf->audio_io_buffer_delayed[i] = *mem_ptr; + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + ((p_audio_in_out_buf->frame_size + + p_audio_in_out_buf->audio_delay_samples) * + sizeof(FLOAT32*)) + + 32); + p_audio_in_out_buf->audio_in_out_buf[i] = + &p_audio_in_out_buf->audio_io_buffer_delayed + [i][p_audio_in_out_buf->audio_delay_samples]; } - p_drc_gain_dec_structs->audio_band_buffer.multiband_audio_sig_count = maxMultibandAudioSignalCount; - p_drc_gain_dec_structs->audio_band_buffer.frame_size = p_drc_params_struct->drc_frame_size;; - - - if (p_drc_params_struct->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_OFF && p_audio_in_out_buf->audio_delay_samples) { - p_audio_in_out_buf->audio_io_buffer_delayed = *mem_ptr; - *mem_ptr = (pVOID) ( (SIZE_T)*mem_ptr+(p_audio_in_out_buf->audio_num_chan*sizeof(FLOAT32*))+32); - p_audio_in_out_buf->audio_in_out_buf = *mem_ptr; - *mem_ptr =(pVOID) ( (SIZE_T)*mem_ptr+(p_audio_in_out_buf->audio_num_chan*sizeof(FLOAT32*))+32); - - for (i=0; i<p_audio_in_out_buf->audio_num_chan; i++) { - p_audio_in_out_buf->audio_io_buffer_delayed[i]=*mem_ptr; - *mem_ptr = (pVOID) ((SIZE_T)*mem_ptr+((p_audio_in_out_buf->frame_size + p_audio_in_out_buf->audio_delay_samples)*sizeof(FLOAT32*))+32); - p_audio_in_out_buf->audio_in_out_buf[i] = &p_audio_in_out_buf->audio_io_buffer_delayed[i][p_audio_in_out_buf->audio_delay_samples]; - - } - } - if (p_drc_params_struct->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF && p_audio_in_out_buf->audio_delay_sub_band_samples) { - - p_audio_in_out_buf->audio_buffer_delayed_real = *mem_ptr; - *mem_ptr = (pVOID) ((SIZE_T)*mem_ptr+(p_audio_in_out_buf->audio_num_chan*sizeof(FLOAT32*))+32); - p_audio_in_out_buf->audio_buffer_delayed_imag = *mem_ptr; - *mem_ptr = (pVOID) ( (SIZE_T)*mem_ptr+(p_audio_in_out_buf->audio_num_chan*sizeof(FLOAT32*))+32); - p_audio_in_out_buf->audio_real_buff = *mem_ptr; - *mem_ptr = (pVOID) ((SIZE_T)*mem_ptr+(p_audio_in_out_buf->audio_num_chan*sizeof(FLOAT32*))+32); - p_audio_in_out_buf->audio_imag_buff = *mem_ptr; - *mem_ptr = (pVOID) ( (SIZE_T)*mem_ptr+(p_audio_in_out_buf->audio_num_chan*sizeof(FLOAT32*))+32); - - - for (i=0; i<p_audio_in_out_buf->audio_num_chan; i++) { - p_audio_in_out_buf->audio_buffer_delayed_real[i] = *mem_ptr; - *mem_ptr =(pVOID) ((SIZE_T)*mem_ptr+(( p_audio_in_out_buf->audio_sub_band_frame_size + p_audio_in_out_buf->audio_delay_sub_band_samples)*sizeof(FLOAT32*))+32); - p_audio_in_out_buf->audio_buffer_delayed_imag[i] = *mem_ptr; - *mem_ptr =(pVOID) ((SIZE_T)*mem_ptr+(( p_audio_in_out_buf->audio_sub_band_frame_size + p_audio_in_out_buf->audio_delay_sub_band_samples)*sizeof(FLOAT32*))+32); - - p_audio_in_out_buf->audio_real_buff[i] = &p_audio_in_out_buf->audio_buffer_delayed_real[i][ p_audio_in_out_buf->audio_delay_sub_band_samples * p_audio_in_out_buf->audio_sub_band_count]; - p_audio_in_out_buf->audio_imag_buff[i] = &p_audio_in_out_buf->audio_buffer_delayed_imag[i][ p_audio_in_out_buf->audio_delay_sub_band_samples * p_audio_in_out_buf->audio_sub_band_count]; - } + } + if (p_drc_params_struct->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF && + p_audio_in_out_buf->audio_delay_sub_band_samples) { + p_audio_in_out_buf->audio_buffer_delayed_real = *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + p_audio_in_out_buf->audio_buffer_delayed_imag = *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + p_audio_in_out_buf->audio_real_buff = *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + p_audio_in_out_buf->audio_imag_buff = *mem_ptr; + *mem_ptr = + (pVOID)((SIZE_T)*mem_ptr + + (p_audio_in_out_buf->audio_num_chan * sizeof(FLOAT32*)) + 32); + + for (i = 0; i < p_audio_in_out_buf->audio_num_chan; i++) { + p_audio_in_out_buf->audio_buffer_delayed_real[i] = *mem_ptr; + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + ((p_audio_in_out_buf->audio_sub_band_frame_size + + p_audio_in_out_buf->audio_delay_sub_band_samples) * + sizeof(FLOAT32*)) + + 32); + p_audio_in_out_buf->audio_buffer_delayed_imag[i] = *mem_ptr; + *mem_ptr = (pVOID)((SIZE_T)*mem_ptr + + ((p_audio_in_out_buf->audio_sub_band_frame_size + + p_audio_in_out_buf->audio_delay_sub_band_samples) * + sizeof(FLOAT32*)) + + 32); + + p_audio_in_out_buf->audio_real_buff[i] = + &p_audio_in_out_buf->audio_buffer_delayed_real + [i][p_audio_in_out_buf->audio_delay_sub_band_samples * + p_audio_in_out_buf->audio_sub_band_count]; + p_audio_in_out_buf->audio_imag_buff[i] = + &p_audio_in_out_buf->audio_buffer_delayed_imag + [i][p_audio_in_out_buf->audio_delay_sub_band_samples * + p_audio_in_out_buf->audio_sub_band_count]; } + } - return err_code; + return err_code; } - - - - -IA_ERRORCODE impd_drc_process_time_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_in_out_buf[], - FLOAT32 loudness_normalization_gain_db, - FLOAT32 boost, - FLOAT32 compress, - WORD32 drc_characteristic_target) -{ - WORD32 sel_drc_index; - IA_ERRORCODE err_code = 0; - WORD32 passThru; - 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; - FLOAT32* audio_channel; - 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(p_drc_gain_dec_structs->eq_set, ch, audio_channel, audio_channel, p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size); - - } +IA_ERRORCODE impd_drc_process_time_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_in_out_buf[], FLOAT32 loudness_normalization_gain_db, + FLOAT32 boost, FLOAT32 compress, WORD32 drc_characteristic_target) { + WORD32 sel_drc_index; + IA_ERRORCODE err_code = 0; + WORD32 passThru; + 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; + FLOAT32* audio_channel; + 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( + p_drc_gain_dec_structs->eq_set, ch, audio_channel, audio_channel, + p_drc_gain_dec_structs->ia_drc_params_struct.drc_frame_size); + } + } + + 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); + + 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); } - 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); - - 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_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<p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter; sel_drc_index++) - { - if (p_drc_gain_dec_structs->ia_drc_params_struct.multiband_sel_drc_idx == sel_drc_index) - { - passThru = 0; - } - else - { - passThru = 1; - } - err_code = impd_filter_banks_process(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->audio_in_out_buf.audio_io_buffer_delayed, - &p_drc_gain_dec_structs->audio_band_buffer, - &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(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->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); - - } + if (p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter == 0) { + err_code = 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 < + p_drc_gain_dec_structs->ia_drc_params_struct.drc_set_counter; + sel_drc_index++) { + if (p_drc_gain_dec_structs->ia_drc_params_struct + .multiband_sel_drc_idx == sel_drc_index) { + passThru = 0; + } else { + passThru = 1; } + err_code = impd_filter_banks_process( + 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->audio_in_out_buf.audio_io_buffer_delayed, + &p_drc_gain_dec_structs->audio_band_buffer, + &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( + 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->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); + 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); - return err_code; + 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); - } +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_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); } - 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, - ia_drc_config* pstr_drc_config, - WORD32* parametric_drc_delay, - WORD32* parametric_drc_delay_max) -{ - *parametric_drc_delay = p_drc_gain_dec_structs->ia_drc_params_struct.parametric_drc_delay; - - if (pstr_drc_config->str_drc_config_ext.parametric_drc_present && pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.parametric_drc_delay_max_present) { - *parametric_drc_delay_max = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.parametric_drc_delay_max; - } else if (pstr_drc_config->str_drc_config_ext.parametric_drc_present == 0) { - *parametric_drc_delay_max = 0; + 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 { - *parametric_drc_delay_max = -1; + 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); + } } + } - return; -} - -VOID impd_get_eq_delay(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, - WORD32* eq_delay, - WORD32* eq_delay_max) -{ - *eq_delay = p_drc_gain_dec_structs->ia_drc_params_struct.eq_delay; - - if (pstr_drc_config->str_drc_config_ext.eq_flag && pstr_drc_config->str_drc_config_ext.str_eq_coeff.eq_delay_max_present) { - *eq_delay_max = pstr_drc_config->str_drc_config_ext.str_eq_coeff.eq_delay_max; - } else if (pstr_drc_config->str_drc_config_ext.eq_flag == 0) { - *eq_delay_max = 0; - } else { - *eq_delay_max = -1; - } + err_code = + impd_advance_audio_buff_freq(&p_drc_gain_dec_structs->audio_in_out_buf); - return; + return err_code; } +VOID impd_get_parametric_drc_delay( + ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, WORD32* parametric_drc_delay, + WORD32* parametric_drc_delay_max) { + *parametric_drc_delay = + p_drc_gain_dec_structs->ia_drc_params_struct.parametric_drc_delay; + + if (pstr_drc_config->str_drc_config_ext.parametric_drc_present && + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .parametric_drc_delay_max_present) { + *parametric_drc_delay_max = + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .parametric_drc_delay_max; + } else if (pstr_drc_config->str_drc_config_ext.parametric_drc_present == 0) { + *parametric_drc_delay_max = 0; + } else { + *parametric_drc_delay_max = -1; + } + + return; +} +VOID impd_get_eq_delay(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, WORD32* eq_delay, + WORD32* eq_delay_max) { + *eq_delay = p_drc_gain_dec_structs->ia_drc_params_struct.eq_delay; + + if (pstr_drc_config->str_drc_config_ext.eq_flag && + pstr_drc_config->str_drc_config_ext.str_eq_coeff.eq_delay_max_present) { + *eq_delay_max = + pstr_drc_config->str_drc_config_ext.str_eq_coeff.eq_delay_max; + } else if (pstr_drc_config->str_drc_config_ext.eq_flag == 0) { + *eq_delay_max = 0; + } else { + *eq_delay_max = -1; + } + + return; +} diff --git a/decoder/drc_src/impd_drc_gain_decoder.h b/decoder/drc_src/impd_drc_gain_decoder.h index e38641d..0c5ae43 100644 --- a/decoder/drc_src/impd_drc_gain_decoder.h +++ b/decoder/drc_src/impd_drc_gain_decoder.h @@ -20,88 +20,67 @@ #ifndef IMPD_DRC_GAIN_DECODER2_H #define IMPD_DRC_GAIN_DECODER2_H - #ifndef M_PI #define M_PI (3.14159265358979323846) #endif -typedef struct ia_drc_gain_dec_struct -{ - WORD32 audio_num_chan; - ia_drc_params_struct ia_drc_params_struct; - ia_drc_gain_buffers_struct drc_gain_buffers; - ia_audio_band_buffer_struct audio_band_buffer; - ia_overlap_params_struct str_overlap_params; - ia_filter_banks_struct ia_filter_banks_struct; - ia_audio_in_out_buf audio_in_out_buf; - ia_parametric_drc_params_struct parametricdrc_params; - shape_filter_block shape_filter_block[CHANNEL_GROUP_COUNT_MAX]; - ia_eq_set_struct* eq_set; -}ia_drc_gain_dec_struct; - - -WORD32 impd_init_drc_decode( WORD32 frame_size, - WORD32 sample_rate, - WORD32 gain_delay_samples, - WORD32 delay_mode, - WORD32 sub_band_domain_mode, - ia_drc_gain_dec_struct* p_drc_gain_dec_structs); - -WORD32 impd_init_drc_decode_post_config( WORD32 audio_num_chan, - WORD32* drc_set_id_processed, - WORD32* downmix_id_processed, - WORD32 num_sets_processed, - WORD32 eq_set_id_processed, - - ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config * pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - pVOID *mem_ptr - - ); - -WORD32 impd_drc_process_time_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_in_out_buf[], - FLOAT32 loudness_normalization_gain_db, - FLOAT32 boost, - FLOAT32 compress, - WORD32 drc_characteristic); - -WORD32 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); - -VOID impd_get_parametric_drc_delay(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, - WORD32* parametric_drc_delay, - WORD32* parametric_drc_delay_max); - -VOID impd_get_eq_delay(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, - WORD32* eq_delay, - WORD32* eq_delay_max); +typedef struct ia_drc_gain_dec_struct { + WORD32 audio_num_chan; + ia_drc_params_struct ia_drc_params_struct; + ia_drc_gain_buffers_struct drc_gain_buffers; + ia_audio_band_buffer_struct audio_band_buffer; + ia_overlap_params_struct str_overlap_params; + ia_filter_banks_struct ia_filter_banks_struct; + ia_audio_in_out_buf audio_in_out_buf; + ia_parametric_drc_params_struct parametricdrc_params; + shape_filter_block shape_filter_block[CHANNEL_GROUP_COUNT_MAX]; + ia_eq_set_struct* eq_set; +} ia_drc_gain_dec_struct; + +WORD32 impd_init_drc_decode(WORD32 frame_size, WORD32 sample_rate, + WORD32 gain_delay_samples, WORD32 delay_mode, + WORD32 sub_band_domain_mode, + ia_drc_gain_dec_struct* p_drc_gain_dec_structs); + +WORD32 impd_init_drc_decode_post_config( + WORD32 audio_num_chan, WORD32* drc_set_id_processed, + WORD32* downmix_id_processed, WORD32 num_sets_processed, + WORD32 eq_set_id_processed, + + ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, pVOID* mem_ptr + + ); + +WORD32 impd_drc_process_time_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_in_out_buf[], FLOAT32 loudness_normalization_gain_db, + FLOAT32 boost, FLOAT32 compress, WORD32 drc_characteristic); + +WORD32 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); + +VOID impd_get_parametric_drc_delay( + ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, WORD32* parametric_drc_delay, + WORD32* parametric_drc_delay_max); + +VOID impd_get_eq_delay(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, WORD32* eq_delay, + WORD32* eq_delay_max); WORD32 -impd_get_drc_gain (ia_drc_gain_dec_struct* p_drc_gain_dec_structs, - ia_drc_config* pstr_drc_config, - ia_drc_gain_struct* pstr_drc_gain, - FLOAT32 compress, - FLOAT32 boost, - WORD32 characteristic_index, - FLOAT32 loudness_normalization_gain_db, - WORD32 sub_drc_index, - ia_drc_gain_buffers_struct* drc_gain_buffers); - - - - +impd_get_drc_gain(ia_drc_gain_dec_struct* p_drc_gain_dec_structs, + ia_drc_config* pstr_drc_config, + ia_drc_gain_struct* pstr_drc_gain, FLOAT32 compress, + FLOAT32 boost, WORD32 characteristic_index, + FLOAT32 loudness_normalization_gain_db, WORD32 sub_drc_index, + ia_drc_gain_buffers_struct* drc_gain_buffers); #endif diff --git a/decoder/drc_src/impd_drc_hashdefines.h b/decoder/drc_src/impd_drc_hashdefines.h index 09a8c2f..1edf67d 100644 --- a/decoder/drc_src/impd_drc_hashdefines.h +++ b/decoder/drc_src/impd_drc_hashdefines.h @@ -20,11 +20,10 @@ #ifndef IMPD_DRC_HASHDEFINES_H #define IMPD_DRC_HASHDEFINES_H - -#define DEC_TYPE_TD 0 -#define DEC_TYPE_TD_QMF64 1 -#define DEC_TYPE_QMF64 2 -#define DEC_TYPE_STFT256 3 -#define BITSTREAM_FILE_FORMAT_SPLIT 1 +#define DEC_TYPE_TD 0 +#define DEC_TYPE_TD_QMF64 1 +#define DEC_TYPE_QMF64 2 +#define DEC_TYPE_STFT256 3 +#define BITSTREAM_FILE_FORMAT_SPLIT 1 #endif diff --git a/decoder/drc_src/impd_drc_host_params.c b/decoder/drc_src/impd_drc_host_params.c index 1997eca..0cfe0df 100644 --- a/decoder/drc_src/impd_drc_host_params.c +++ b/decoder/drc_src/impd_drc_host_params.c @@ -27,134 +27,171 @@ #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_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); +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; + 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); + 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); +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 index 111bd72..9c71245 100644 --- a/decoder/drc_src/impd_drc_host_params.h +++ b/decoder/drc_src/impd_drc_host_params.h @@ -24,12 +24,15 @@ 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_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_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); +WORD32 impd_eval_custom_params_selection_process( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c index 4542827..5f51a3f 100644 --- a/decoder/drc_src/impd_drc_init.c +++ b/decoder/drc_src/impd_drc_init.c @@ -42,541 +42,582 @@ #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 +#define EQ_DELAY_MAX_DEFAULT 256 -IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, - WORD32 iCmd, WORD32 iIdx, pVOID pvValue); +IA_ERRORCODE impd_drc_mem_api(ia_drc_api_struct *p_obj_drc, WORD32 iCmd, + WORD32 iIdx, pVOID pvValue); IA_ERRORCODE impd_drc_fill_mem_tables(ia_drc_api_struct *p_obj_drc); 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); +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 -impd_drc_dec_interface_add_effect_type(ia_drc_interface_struct* pstr_drc_interface, - WORD32 drc_effect_type,WORD32 target_loudness, WORD32 loud_norm); - +impd_drc_dec_interface_add_effect_type( + ia_drc_interface_struct *pstr_drc_interface, WORD32 drc_effect_type, + WORD32 target_loudness, WORD32 loud_norm); #define NUM_GAIN_DEC_INSTANCES 2 -#define BITSTREAM_FILE_FORMAT_SPLIT 1 -#define LIM_DEFAULT_THRESHOLD (0.89125094f) - -static WORD32 impd_match_downmix(WORD32 downmix_id, WORD32 dec_downmix_id) -{ - WORD32 id_match = 0; - - switch (dec_downmix_id ) - { - case 0: - id_match = (downmix_id == 0); - break; - case 1: - id_match = ( (downmix_id == 0) || (downmix_id == 0x7F) ); - break; - case 2: - id_match = (downmix_id == 0x7F); - break; - case 3: - id_match = ( (downmix_id != 0) && (downmix_id != 0x7F) ); - break; - case 4: - id_match = (downmix_id != 0); - break; - } - return id_match; +#define BITSTREAM_FILE_FORMAT_SPLIT 1 +#define LIM_DEFAULT_THRESHOLD (0.89125094f) + +static WORD32 impd_match_downmix(WORD32 downmix_id, WORD32 dec_downmix_id) { + WORD32 id_match = 0; + + switch (dec_downmix_id) { + case 0: + id_match = (downmix_id == 0); + break; + case 1: + id_match = ((downmix_id == 0) || (downmix_id == 0x7F)); + break; + case 2: + id_match = (downmix_id == 0x7F); + break; + case 3: + id_match = ((downmix_id != 0) && (downmix_id != 0x7F)); + break; + case 4: + id_match = (downmix_id != 0); + break; + } + return id_match; } -IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) -{ - p_obj_drc->str_config.bitstream_file_format = 0; - 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; - p_obj_drc->str_config.sub_band_down_sampling_factor = 0; - p_obj_drc->str_config.sampling_rate = 0; - p_obj_drc->str_config.frame_size = 1024; - p_obj_drc->str_config.num_ch_in = -1; - p_obj_drc->str_config.num_ch_out = -1; - 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.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_config.constant_delay_on = 0; - p_obj_drc->str_config.audio_delay_samples = 0; - p_obj_drc->str_config.effect_type = 0; - p_obj_drc->str_config.target_loudness = -24; - p_obj_drc->str_config.loud_norm_flag = 0; - p_obj_drc->str_bit_handler.byte_index_bs = 0; - p_obj_drc->str_bit_handler.num_bytes_bs = 0; - p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; - p_obj_drc->str_bit_handler.num_bits_read_bs = 0; - p_obj_drc->str_bit_handler.cpy_over = 0; - p_obj_drc->str_bit_handler.num_bytes_bs_drc_config = 0; - p_obj_drc->str_bit_handler.cpy_over_ic = 0; - p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info = 0; - p_obj_drc->str_bit_handler.cpy_over_il = 0; - p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface = 0; - p_obj_drc->str_bit_handler.num_bits_read_bs_unidrc_interface = 0; - p_obj_drc->str_bit_handler.cpy_over_in = 0; - p_obj_drc->str_bit_handler.gain_stream_flag = 0; - - return IA_NO_ERROR; +IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) { + p_obj_drc->str_config.bitstream_file_format = 0; + 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; + p_obj_drc->str_config.sub_band_down_sampling_factor = 0; + p_obj_drc->str_config.sampling_rate = 0; + p_obj_drc->str_config.frame_size = 1024; + p_obj_drc->str_config.num_ch_in = -1; + p_obj_drc->str_config.num_ch_out = -1; + 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.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_config.constant_delay_on = 0; + p_obj_drc->str_config.audio_delay_samples = 0; + p_obj_drc->str_config.effect_type = 0; + p_obj_drc->str_config.target_loudness = -24; + p_obj_drc->str_config.loud_norm_flag = 0; + p_obj_drc->str_bit_handler.byte_index_bs = 0; + p_obj_drc->str_bit_handler.num_bytes_bs = 0; + p_obj_drc->str_bit_handler.num_bits_offset_bs = 0; + p_obj_drc->str_bit_handler.num_bits_read_bs = 0; + p_obj_drc->str_bit_handler.cpy_over = 0; + p_obj_drc->str_bit_handler.num_bytes_bs_drc_config = 0; + p_obj_drc->str_bit_handler.cpy_over_ic = 0; + p_obj_drc->str_bit_handler.num_bytes_bs_loudness_info = 0; + p_obj_drc->str_bit_handler.cpy_over_il = 0; + p_obj_drc->str_bit_handler.num_bytes_bs_unidrc_interface = 0; + p_obj_drc->str_bit_handler.num_bits_read_bs_unidrc_interface = 0; + p_obj_drc->str_bit_handler.cpy_over_in = 0; + p_obj_drc->str_bit_handler.gain_stream_flag = 0; + + return IA_NO_ERROR; } - -IA_ERRORCODE impd_drc_set_default_bitstream_config(ia_drc_config *pstr_drc_config) -{ - WORD32 i; - - pstr_drc_config->sample_rate_present=0; - pstr_drc_config->sampling_rate=0; - pstr_drc_config->dwnmix_instructions_count=0; - pstr_drc_config->drc_coefficients_drc_count=1; - pstr_drc_config->drc_instructions_uni_drc_count=4; - pstr_drc_config->drc_instructions_count_plus=5; - pstr_drc_config->drc_description_basic_present=0; - pstr_drc_config->drc_coefficients_basic_count=0; - pstr_drc_config->drc_instructions_basic_count=0; - pstr_drc_config->drc_config_ext_present=1; - pstr_drc_config->apply_drc=0; - pstr_drc_config->str_drc_config_ext.drc_config_ext_type[0]=2; - pstr_drc_config->str_drc_config_ext.ext_bit_size[0]=345; - pstr_drc_config->str_drc_config_ext.parametric_drc_present=0; - pstr_drc_config->str_drc_config_ext.drc_extension_v1_present=1; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].version=1; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].drc_location=1; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_count=4; - for(i=0;i<pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_count;i++) - { - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_params[i].gain_interpolation_type=1; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_params[i].band_count=1; - } - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_sequence_count=4; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_params_index_for_gain_sequence[0]=0; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_params_index_for_gain_sequence[1]=1; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_params_index_for_gain_sequence[2]=2; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_params_index_for_gain_sequence[3]=3; - pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_count_plus=4; - pstr_drc_config->str_drc_instruction_str[0].drc_set_id=1; - pstr_drc_config->str_drc_instruction_str[0].drc_set_complexity_level=2; - pstr_drc_config->str_drc_instruction_str[0].drc_location=1; - pstr_drc_config->str_drc_instruction_str[0].dwnmix_id_count=1; - pstr_drc_config->str_drc_instruction_str[0].drc_set_effect=1; - pstr_drc_config->str_drc_instruction_str[0].gain_set_index[1]=1; - pstr_drc_config->str_drc_instruction_str[0].drc_set_target_loudness_value_lower=-63; - pstr_drc_config->str_drc_instruction_str[0].num_drc_ch_groups=2; - pstr_drc_config->str_drc_instruction_str[0].gain_set_index_for_channel_group[1]=1; - pstr_drc_config->str_drc_instruction_str[0].band_count_of_ch_group[0]=1; - pstr_drc_config->str_drc_instruction_str[0].band_count_of_ch_group[1]=1; - pstr_drc_config->str_drc_instruction_str[0].gain_interpolation_type_for_channel_group[0]=1; - pstr_drc_config->str_drc_instruction_str[0].gain_interpolation_type_for_channel_group[1]=1; - pstr_drc_config->str_drc_instruction_str[0].time_delta_min_for_channel_group[0]=32; - pstr_drc_config->str_drc_instruction_str[0].time_delta_min_for_channel_group[1]=32; - pstr_drc_config->str_drc_instruction_str[0].channel_group_of_ch[1]=1; - pstr_drc_config->str_drc_instruction_str[0].gain_element_count=2; - - pstr_drc_config->str_drc_instruction_str[1].drc_set_id=2; - pstr_drc_config->str_drc_instruction_str[1].drc_set_complexity_level=2; - pstr_drc_config->str_drc_instruction_str[1].drc_location=1; - pstr_drc_config->str_drc_instruction_str[1].dwnmix_id_count=1; - pstr_drc_config->str_drc_instruction_str[1].drc_set_effect=2; - pstr_drc_config->str_drc_instruction_str[1].gain_set_index[0]=1; - pstr_drc_config->str_drc_instruction_str[1].gain_set_index[1]=2; - pstr_drc_config->str_drc_instruction_str[1].drc_set_target_loudness_value_lower=-63; - pstr_drc_config->str_drc_instruction_str[1].num_drc_ch_groups=2; - pstr_drc_config->str_drc_instruction_str[1].gain_set_index_for_channel_group[0]=1; - pstr_drc_config->str_drc_instruction_str[1].gain_set_index_for_channel_group[1]=2; - pstr_drc_config->str_drc_instruction_str[1].band_count_of_ch_group[0]=1; - pstr_drc_config->str_drc_instruction_str[1].band_count_of_ch_group[1]=1; - pstr_drc_config->str_drc_instruction_str[1].gain_interpolation_type_for_channel_group[0]=1; - pstr_drc_config->str_drc_instruction_str[1].gain_interpolation_type_for_channel_group[1]=1; - pstr_drc_config->str_drc_instruction_str[1].time_delta_min_for_channel_group[0]=32; - pstr_drc_config->str_drc_instruction_str[1].time_delta_min_for_channel_group[1]=32; - pstr_drc_config->str_drc_instruction_str[1].channel_group_of_ch[1]=1; - pstr_drc_config->str_drc_instruction_str[1].gain_element_count=2; - - pstr_drc_config->str_drc_instruction_str[2].drc_set_id=3; - pstr_drc_config->str_drc_instruction_str[2].drc_set_complexity_level=2; - pstr_drc_config->str_drc_instruction_str[2].drc_location=1; - pstr_drc_config->str_drc_instruction_str[2].dwnmix_id_count=1; - pstr_drc_config->str_drc_instruction_str[2].drc_set_effect=4; - pstr_drc_config->str_drc_instruction_str[2].gain_set_index[0]=2; - pstr_drc_config->str_drc_instruction_str[2].gain_set_index[1]=3; - pstr_drc_config->str_drc_instruction_str[2].drc_set_target_loudness_value_lower=-63; - pstr_drc_config->str_drc_instruction_str[2].num_drc_ch_groups=2; - pstr_drc_config->str_drc_instruction_str[2].gain_set_index_for_channel_group[0]=2; - pstr_drc_config->str_drc_instruction_str[2].gain_set_index_for_channel_group[1]=3; - pstr_drc_config->str_drc_instruction_str[2].band_count_of_ch_group[0]=1; - pstr_drc_config->str_drc_instruction_str[2].band_count_of_ch_group[1]=1; - pstr_drc_config->str_drc_instruction_str[2].gain_interpolation_type_for_channel_group[0]=1; - pstr_drc_config->str_drc_instruction_str[2].gain_interpolation_type_for_channel_group[1]=1; - pstr_drc_config->str_drc_instruction_str[2].time_delta_min_for_channel_group[0]=32; - pstr_drc_config->str_drc_instruction_str[2].time_delta_min_for_channel_group[1]=32; - pstr_drc_config->str_drc_instruction_str[2].channel_group_of_ch[1]=1; - pstr_drc_config->str_drc_instruction_str[2].gain_element_count=2; - - pstr_drc_config->str_drc_instruction_str[3].drc_set_id=4; - pstr_drc_config->str_drc_instruction_str[3].drc_set_complexity_level=2; - pstr_drc_config->str_drc_instruction_str[3].drc_location=1; - pstr_drc_config->str_drc_instruction_str[3].dwnmix_id_count=1; - pstr_drc_config->str_drc_instruction_str[3].drc_set_effect=32; - pstr_drc_config->str_drc_instruction_str[3].gain_set_index[0]=3; - pstr_drc_config->str_drc_instruction_str[3].gain_set_index[1]=0; - pstr_drc_config->str_drc_instruction_str[3].drc_set_target_loudness_value_lower=-63; - pstr_drc_config->str_drc_instruction_str[3].num_drc_ch_groups=2; - pstr_drc_config->str_drc_instruction_str[3].gain_set_index_for_channel_group[0]=3; - pstr_drc_config->str_drc_instruction_str[3].gain_set_index_for_channel_group[1]=0; - pstr_drc_config->str_drc_instruction_str[3].band_count_of_ch_group[0]=1; - pstr_drc_config->str_drc_instruction_str[3].band_count_of_ch_group[1]=1; - pstr_drc_config->str_drc_instruction_str[3].gain_interpolation_type_for_channel_group[0]=1; - pstr_drc_config->str_drc_instruction_str[3].gain_interpolation_type_for_channel_group[1]=1; - pstr_drc_config->str_drc_instruction_str[3].time_delta_min_for_channel_group[0]=32; - pstr_drc_config->str_drc_instruction_str[3].time_delta_min_for_channel_group[1]=32; - pstr_drc_config->str_drc_instruction_str[3].channel_group_of_ch[1]=1; - pstr_drc_config->str_drc_instruction_str[3].gain_element_count=2; - - pstr_drc_config->str_drc_instruction_str[4].drc_set_id=-1; - pstr_drc_config->str_drc_instruction_str[4].dwnmix_id_count=1; - pstr_drc_config->channel_layout.base_channel_count=2; - - return IA_NO_ERROR; +IA_ERRORCODE impd_drc_set_default_bitstream_config( + ia_drc_config *pstr_drc_config) { + WORD32 i; + + pstr_drc_config->sample_rate_present = 0; + pstr_drc_config->sampling_rate = 0; + pstr_drc_config->dwnmix_instructions_count = 0; + pstr_drc_config->drc_coefficients_drc_count = 1; + pstr_drc_config->drc_instructions_uni_drc_count = 4; + pstr_drc_config->drc_instructions_count_plus = 5; + pstr_drc_config->drc_description_basic_present = 0; + pstr_drc_config->drc_coefficients_basic_count = 0; + pstr_drc_config->drc_instructions_basic_count = 0; + pstr_drc_config->drc_config_ext_present = 1; + pstr_drc_config->apply_drc = 0; + pstr_drc_config->str_drc_config_ext.drc_config_ext_type[0] = 2; + pstr_drc_config->str_drc_config_ext.ext_bit_size[0] = 345; + pstr_drc_config->str_drc_config_ext.parametric_drc_present = 0; + pstr_drc_config->str_drc_config_ext.drc_extension_v1_present = 1; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].version = 1; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].drc_location = 1; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_count = 4; + for (i = 0; + i < + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_count; + i++) { + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] + .gain_set_params[i] + .gain_interpolation_type = 1; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] + .gain_set_params[i] + .band_count = 1; + } + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_sequence_count = + 4; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] + .gain_set_params_index_for_gain_sequence[0] = 0; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] + .gain_set_params_index_for_gain_sequence[1] = 1; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] + .gain_set_params_index_for_gain_sequence[2] = 2; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0] + .gain_set_params_index_for_gain_sequence[3] = 3; + pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[0].gain_set_count_plus = + 4; + pstr_drc_config->str_drc_instruction_str[0].drc_set_id = 1; + pstr_drc_config->str_drc_instruction_str[0].drc_set_complexity_level = 2; + pstr_drc_config->str_drc_instruction_str[0].drc_location = 1; + pstr_drc_config->str_drc_instruction_str[0].dwnmix_id_count = 1; + pstr_drc_config->str_drc_instruction_str[0].drc_set_effect = 1; + pstr_drc_config->str_drc_instruction_str[0].gain_set_index[1] = 1; + pstr_drc_config->str_drc_instruction_str[0] + .drc_set_target_loudness_value_lower = -63; + pstr_drc_config->str_drc_instruction_str[0].num_drc_ch_groups = 2; + pstr_drc_config->str_drc_instruction_str[0] + .gain_set_index_for_channel_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[0].band_count_of_ch_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[0].band_count_of_ch_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[0] + .gain_interpolation_type_for_channel_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[0] + .gain_interpolation_type_for_channel_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[0] + .time_delta_min_for_channel_group[0] = 32; + pstr_drc_config->str_drc_instruction_str[0] + .time_delta_min_for_channel_group[1] = 32; + pstr_drc_config->str_drc_instruction_str[0].channel_group_of_ch[1] = 1; + pstr_drc_config->str_drc_instruction_str[0].gain_element_count = 2; + + pstr_drc_config->str_drc_instruction_str[1].drc_set_id = 2; + pstr_drc_config->str_drc_instruction_str[1].drc_set_complexity_level = 2; + pstr_drc_config->str_drc_instruction_str[1].drc_location = 1; + pstr_drc_config->str_drc_instruction_str[1].dwnmix_id_count = 1; + pstr_drc_config->str_drc_instruction_str[1].drc_set_effect = 2; + pstr_drc_config->str_drc_instruction_str[1].gain_set_index[0] = 1; + pstr_drc_config->str_drc_instruction_str[1].gain_set_index[1] = 2; + pstr_drc_config->str_drc_instruction_str[1] + .drc_set_target_loudness_value_lower = -63; + pstr_drc_config->str_drc_instruction_str[1].num_drc_ch_groups = 2; + pstr_drc_config->str_drc_instruction_str[1] + .gain_set_index_for_channel_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[1] + .gain_set_index_for_channel_group[1] = 2; + pstr_drc_config->str_drc_instruction_str[1].band_count_of_ch_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[1].band_count_of_ch_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[1] + .gain_interpolation_type_for_channel_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[1] + .gain_interpolation_type_for_channel_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[1] + .time_delta_min_for_channel_group[0] = 32; + pstr_drc_config->str_drc_instruction_str[1] + .time_delta_min_for_channel_group[1] = 32; + pstr_drc_config->str_drc_instruction_str[1].channel_group_of_ch[1] = 1; + pstr_drc_config->str_drc_instruction_str[1].gain_element_count = 2; + + pstr_drc_config->str_drc_instruction_str[2].drc_set_id = 3; + pstr_drc_config->str_drc_instruction_str[2].drc_set_complexity_level = 2; + pstr_drc_config->str_drc_instruction_str[2].drc_location = 1; + pstr_drc_config->str_drc_instruction_str[2].dwnmix_id_count = 1; + pstr_drc_config->str_drc_instruction_str[2].drc_set_effect = 4; + pstr_drc_config->str_drc_instruction_str[2].gain_set_index[0] = 2; + pstr_drc_config->str_drc_instruction_str[2].gain_set_index[1] = 3; + pstr_drc_config->str_drc_instruction_str[2] + .drc_set_target_loudness_value_lower = -63; + pstr_drc_config->str_drc_instruction_str[2].num_drc_ch_groups = 2; + pstr_drc_config->str_drc_instruction_str[2] + .gain_set_index_for_channel_group[0] = 2; + pstr_drc_config->str_drc_instruction_str[2] + .gain_set_index_for_channel_group[1] = 3; + pstr_drc_config->str_drc_instruction_str[2].band_count_of_ch_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[2].band_count_of_ch_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[2] + .gain_interpolation_type_for_channel_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[2] + .gain_interpolation_type_for_channel_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[2] + .time_delta_min_for_channel_group[0] = 32; + pstr_drc_config->str_drc_instruction_str[2] + .time_delta_min_for_channel_group[1] = 32; + pstr_drc_config->str_drc_instruction_str[2].channel_group_of_ch[1] = 1; + pstr_drc_config->str_drc_instruction_str[2].gain_element_count = 2; + + pstr_drc_config->str_drc_instruction_str[3].drc_set_id = 4; + pstr_drc_config->str_drc_instruction_str[3].drc_set_complexity_level = 2; + pstr_drc_config->str_drc_instruction_str[3].drc_location = 1; + pstr_drc_config->str_drc_instruction_str[3].dwnmix_id_count = 1; + pstr_drc_config->str_drc_instruction_str[3].drc_set_effect = 32; + pstr_drc_config->str_drc_instruction_str[3].gain_set_index[0] = 3; + pstr_drc_config->str_drc_instruction_str[3].gain_set_index[1] = 0; + pstr_drc_config->str_drc_instruction_str[3] + .drc_set_target_loudness_value_lower = -63; + pstr_drc_config->str_drc_instruction_str[3].num_drc_ch_groups = 2; + pstr_drc_config->str_drc_instruction_str[3] + .gain_set_index_for_channel_group[0] = 3; + pstr_drc_config->str_drc_instruction_str[3] + .gain_set_index_for_channel_group[1] = 0; + pstr_drc_config->str_drc_instruction_str[3].band_count_of_ch_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[3].band_count_of_ch_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[3] + .gain_interpolation_type_for_channel_group[0] = 1; + pstr_drc_config->str_drc_instruction_str[3] + .gain_interpolation_type_for_channel_group[1] = 1; + pstr_drc_config->str_drc_instruction_str[3] + .time_delta_min_for_channel_group[0] = 32; + pstr_drc_config->str_drc_instruction_str[3] + .time_delta_min_for_channel_group[1] = 32; + pstr_drc_config->str_drc_instruction_str[3].channel_group_of_ch[1] = 1; + pstr_drc_config->str_drc_instruction_str[3].gain_element_count = 2; + + pstr_drc_config->str_drc_instruction_str[4].drc_set_id = -1; + pstr_drc_config->str_drc_instruction_str[4].dwnmix_id_count = 1; + pstr_drc_config->channel_layout.base_channel_count = 2; + + return IA_NO_ERROR; } +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; -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; - - p_obj_drc->str_payload.pstr_bitstream_dec = (ia_drc_bits_dec_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_bits_dec_struct)+32; + p_obj_drc->str_payload.pstr_bitstream_dec = + (ia_drc_bits_dec_struct *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_bits_dec_struct) + 32; - p_obj_drc->str_payload.pstr_gain_dec[0] = (ia_drc_gain_dec_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_dec_struct)+32; + p_obj_drc->str_payload.pstr_gain_dec[0] = + (ia_drc_gain_dec_struct *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_dec_struct) + 32; - p_obj_drc->str_payload.pstr_gain_dec[1] = (ia_drc_gain_dec_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_dec_struct)+32; + p_obj_drc->str_payload.pstr_gain_dec[1] = + (ia_drc_gain_dec_struct *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_dec_struct) + 32; - p_obj_drc->str_payload.pstr_loudness_info = (ia_drc_loudness_info_set_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_loudness_info_set_struct)+32; + p_obj_drc->str_payload.pstr_loudness_info = + (ia_drc_loudness_info_set_struct *)persistant_ptr; + persistant_ptr = + (SIZE_T)persistant_ptr + sizeof(ia_drc_loudness_info_set_struct) + 32; - p_obj_drc->str_payload.pstr_drc_gain = (ia_drc_gain_struct*)persistant_ptr;; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_struct)+32; + p_obj_drc->str_payload.pstr_drc_gain = (ia_drc_gain_struct *)persistant_ptr; + ; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_gain_struct) + 32; - p_obj_drc->str_payload.pstr_drc_interface = (ia_drc_interface_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_interface_struct)+32; + p_obj_drc->str_payload.pstr_drc_interface = + (ia_drc_interface_struct *)persistant_ptr; + persistant_ptr = + (SIZE_T)persistant_ptr + sizeof(ia_drc_interface_struct) + 32; - p_obj_drc->str_payload.pstr_drc_config = (ia_drc_config*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_config)+32; + p_obj_drc->str_payload.pstr_drc_config = (ia_drc_config *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_config) + 32; - p_obj_drc->str_payload.pstr_selection_proc = (ia_drc_sel_pro_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_sel_pro_struct)+32; + p_obj_drc->str_payload.pstr_selection_proc = + (ia_drc_sel_pro_struct *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_sel_pro_struct) + 32; - p_obj_drc->str_bit_handler.it_bit_buf = (UWORD8*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 32*1024; /*varify the sizelater*/ + p_obj_drc->str_bit_handler.it_bit_buf = (UWORD8 *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + 32 * 1024; /*varify the sizelater*/ - p_obj_drc->str_payload.pstr_drc_sel_proc_params = (ia_drc_sel_proc_params_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_sel_proc_params_struct); + p_obj_drc->str_payload.pstr_drc_sel_proc_params = + (ia_drc_sel_proc_params_struct *)persistant_ptr; + persistant_ptr = + (SIZE_T)persistant_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 = (SIZE_T)persistant_ptr + sizeof(ia_drc_sel_proc_output_struct)+16*1024; + p_obj_drc->str_payload.pstr_drc_sel_proc_output = + (ia_drc_sel_proc_output_struct *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + + sizeof(ia_drc_sel_proc_output_struct) + 16 * 1024; - p_obj_drc->str_bit_handler.bitstream_drc_config = (UWORD8*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 8*1024; + p_obj_drc->str_bit_handler.bitstream_drc_config = (UWORD8 *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + 8 * 1024; - p_obj_drc->str_bit_handler.bitstream_loudness_info = (UWORD8*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 8*1024; + p_obj_drc->str_bit_handler.bitstream_loudness_info = (UWORD8 *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + 8 * 1024; - p_obj_drc->str_bit_handler.bitstream_unidrc_interface = (UWORD8*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 8*1024; + p_obj_drc->str_bit_handler.bitstream_unidrc_interface = + (UWORD8 *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + 8 * 1024; - p_obj_drc->str_payload.pstr_peak_limiter = (ia_drc_peak_limiter_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_peak_limiter_struct)+32; + p_obj_drc->str_payload.pstr_peak_limiter = + (ia_drc_peak_limiter_struct *)persistant_ptr; + persistant_ptr = + (SIZE_T)persistant_ptr + sizeof(ia_drc_peak_limiter_struct) + 32; - 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)+32); - persistant_ptr = (SIZE_T)persistant_ptr + 16*1024; + 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) + 32); + persistant_ptr = (SIZE_T)persistant_ptr + 16 * 1024; - p_obj_drc->str_payload.pstr_qmf_filter = (ia_drc_qmf_filt_struct*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_qmf_filt_struct)+32; + p_obj_drc->str_payload.pstr_qmf_filter = + (ia_drc_qmf_filt_struct *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + sizeof(ia_drc_qmf_filt_struct) + 32; - p_obj_drc->str_payload.pstr_qmf_filter->ana_buff = (FLOAT64*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 16*1024; + p_obj_drc->str_payload.pstr_qmf_filter->ana_buff = (FLOAT64 *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + 16 * 1024; - p_obj_drc->str_payload.pstr_qmf_filter->syn_buff = (FLOAT64*)persistant_ptr; - persistant_ptr = (SIZE_T)persistant_ptr + 16*1024; + p_obj_drc->str_payload.pstr_qmf_filter->syn_buff = (FLOAT64 *)persistant_ptr; + persistant_ptr = (SIZE_T)persistant_ptr + 16 * 1024; - p_obj_drc->p_state->persistant_ptr=(pVOID)persistant_ptr; - return IA_NO_ERROR; + p_obj_drc->p_state->persistant_ptr = (pVOID)persistant_ptr; + return IA_NO_ERROR; } -VOID init_qmf_filt_bank(ia_drc_qmf_filt_struct *qmf_filt) -{ - - WORD32 l,k; - - FLOAT64 gain_ana =64.0 / QMF_FILT_RESOLUTION; - FLOAT64 gain_syn =1.0 / 64.0; - for ( l=0; l<2*QMF_FILT_RESOLUTION; l++ ) - { - for ( k=0; k<QMF_FILT_RESOLUTION; k++ ) - { - qmf_filt->syn_tab_real[l][k] = gain_syn * cos((0.0245436926) * (k+0.5) * (2*l-255.0)); - qmf_filt->syn_tab_imag[l][k] = gain_syn * sin((0.0245436926) * (k+0.5) * (2*l-255.0)); - qmf_filt->ana_tab_real[k][l] = gain_ana * cos((0.0245436926) * (k+0.5) * (2*l-1.0)); - qmf_filt->ana_tab_imag[k][l] = gain_ana * sin((0.0245436926) * (k+0.5) * (2*l-1.0)); - } +VOID init_qmf_filt_bank(ia_drc_qmf_filt_struct *qmf_filt) { + WORD32 l, k; + + FLOAT64 gain_ana = 64.0 / QMF_FILT_RESOLUTION; + FLOAT64 gain_syn = 1.0 / 64.0; + for (l = 0; l < 2 * QMF_FILT_RESOLUTION; l++) { + for (k = 0; k < QMF_FILT_RESOLUTION; k++) { + qmf_filt->syn_tab_real[l][k] = + gain_syn * cos((0.0245436926) * (k + 0.5) * (2 * l - 255.0)); + qmf_filt->syn_tab_imag[l][k] = + gain_syn * sin((0.0245436926) * (k + 0.5) * (2 * l - 255.0)); + qmf_filt->ana_tab_real[k][l] = + gain_ana * cos((0.0245436926) * (k + 0.5) * (2 * l - 1.0)); + qmf_filt->ana_tab_imag[k][l] = + gain_ana * sin((0.0245436926) * (k + 0.5) * (2 * l - 1.0)); } - + } } - - - - -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; - - 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; - - - 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); - - - - for (i=0; i<NUM_GAIN_DEC_INSTANCES; i++) { - err_code = impd_init_drc_decode(p_obj_drc->str_config.frame_size, - p_obj_drc->str_config.sampling_rate, - p_obj_drc->str_config.gain_delay_samples, - 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]); - +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; + + 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; + + 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); + + for (i = 0; i < NUM_GAIN_DEC_INSTANCES; i++) { + err_code = impd_init_drc_decode(p_obj_drc->str_config.frame_size, + p_obj_drc->str_config.sampling_rate, + p_obj_drc->str_config.gain_delay_samples, + 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 (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); + + 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_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; } - - 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); - - - - 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_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; + + if (p_obj_drc->str_payload.pstr_drc_sel_proc_params->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; - - if (p_obj_drc->str_payload.pstr_drc_sel_proc_params->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) { + 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; } - 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) - { - 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; + 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_drc_uni_sel_proc_process( + p_obj_drc->str_payload.pstr_selection_proc, + p_obj_drc->str_payload.pstr_drc_config, + p_obj_drc->str_payload.pstr_loudness_info, + p_obj_drc->str_payload.pstr_drc_sel_proc_output); + if (err_code != IA_NO_ERROR) return err_code; + + for (i = 0; i < NUM_GAIN_DEC_INSTANCES; i++) { + WORD32 audio_num_chan = 0; + WORD32 numMatchingDrcSets = 0; + WORD32 matchingDrcSetIds[3], matchingDownmixIds[3]; + for (j = 0; + j < p_obj_drc->str_payload.pstr_drc_sel_proc_output->num_sel_drc_sets; + j++) { + if (impd_match_downmix(p_obj_drc->str_payload.pstr_drc_sel_proc_output + ->sel_downmix_ids[j], + decDownmixIdList[i])) { + matchingDrcSetIds[numMatchingDrcSets] = + p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_drc_set_ids[j]; + matchingDownmixIds[numMatchingDrcSets] = + p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_downmix_ids[j]; + numMatchingDrcSets++; + } } - 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; + if (i == 0) { + if (p_obj_drc->str_config.num_ch_in != + p_obj_drc->str_payload.pstr_drc_sel_proc_output->base_channel_count) + + return -1; + audio_num_chan = p_obj_drc->str_config.num_ch_in; + } else if (i == 1) { + p_obj_drc->str_config.num_ch_out = + p_obj_drc->str_payload.pstr_drc_sel_proc_output->target_channel_count; + audio_num_chan = p_obj_drc->str_config.num_ch_out; } - - err_code = impd_drc_uni_sel_proc_process(p_obj_drc->str_payload.pstr_selection_proc, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_loudness_info, - p_obj_drc->str_payload.pstr_drc_sel_proc_output); - if (err_code!=IA_NO_ERROR) - return err_code; - - for (i=0; i<NUM_GAIN_DEC_INSTANCES; i++){ - - WORD32 audio_num_chan=0; - WORD32 numMatchingDrcSets = 0; - WORD32 matchingDrcSetIds[3], matchingDownmixIds[3]; - for (j=0; j<p_obj_drc->str_payload.pstr_drc_sel_proc_output->num_sel_drc_sets; j++) { - - if (impd_match_downmix(p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_downmix_ids[j], decDownmixIdList[i])) { - matchingDrcSetIds[numMatchingDrcSets] = p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_drc_set_ids[j]; - matchingDownmixIds[numMatchingDrcSets] = p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_downmix_ids[j]; - numMatchingDrcSets++; - } - } - if (i==0) - { - if (p_obj_drc->str_config.num_ch_in != p_obj_drc->str_payload.pstr_drc_sel_proc_output->base_channel_count) - - return -1; - audio_num_chan = p_obj_drc->str_config.num_ch_in; - } else if (i==1) - { - p_obj_drc->str_config.num_ch_out = p_obj_drc->str_payload.pstr_drc_sel_proc_output->target_channel_count; - audio_num_chan = p_obj_drc->str_config.num_ch_out; - } - - err_code = impd_init_drc_decode_post_config(audio_num_chan, - matchingDrcSetIds, - matchingDownmixIds, - numMatchingDrcSets - , p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_eq_set_ids[i] - - , 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 - ); - - impd_get_parametric_drc_delay(p_obj_drc->str_payload.pstr_gain_dec[i], p_obj_drc->str_payload.pstr_drc_config, & p_obj_drc->str_config.parametric_drc_delay_gain_dec_instance, &p_obj_drc->str_config.parametric_drc_delay_max); - impd_get_eq_delay(p_obj_drc->str_payload.pstr_gain_dec[i], p_obj_drc->str_payload.pstr_drc_config, & p_obj_drc->str_config.eq_delay_gain_dec_instance, & p_obj_drc->str_config.eq_delay_max); - p_obj_drc->str_config.parametric_drc_delay += p_obj_drc->str_config.parametric_drc_delay_gain_dec_instance; - p_obj_drc->str_config.eq_delay += p_obj_drc->str_config.eq_delay_gain_dec_instance; - + err_code = impd_init_drc_decode_post_config( + audio_num_chan, matchingDrcSetIds, matchingDownmixIds, + numMatchingDrcSets, + p_obj_drc->str_payload.pstr_drc_sel_proc_output->sel_eq_set_ids[i] + + , + 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); + + impd_get_parametric_drc_delay( + p_obj_drc->str_payload.pstr_gain_dec[i], + p_obj_drc->str_payload.pstr_drc_config, + &p_obj_drc->str_config.parametric_drc_delay_gain_dec_instance, + &p_obj_drc->str_config.parametric_drc_delay_max); + impd_get_eq_delay(p_obj_drc->str_payload.pstr_gain_dec[i], + p_obj_drc->str_payload.pstr_drc_config, + &p_obj_drc->str_config.eq_delay_gain_dec_instance, + &p_obj_drc->str_config.eq_delay_max); + p_obj_drc->str_config.parametric_drc_delay += + p_obj_drc->str_config.parametric_drc_delay_gain_dec_instance; + p_obj_drc->str_config.eq_delay += + p_obj_drc->str_config.eq_delay_gain_dec_instance; + } + + { + if (p_obj_drc->str_config.parametric_drc_delay_max == -1) { + p_obj_drc->str_config.parametric_drc_delay_max = + PARAMETRIC_DRC_DELAY_MAX_DEFAULT; } - - { - if (p_obj_drc->str_config.parametric_drc_delay_max == -1) { - p_obj_drc->str_config.parametric_drc_delay_max = PARAMETRIC_DRC_DELAY_MAX_DEFAULT; - } - if (p_obj_drc->str_config.eq_delay_max == -1) { - p_obj_drc->str_config.eq_delay_max = EQ_DELAY_MAX_DEFAULT; - } - - if (!p_obj_drc->str_config.constant_delay_on) { - - p_obj_drc->p_state->delay_in_output += p_obj_drc->str_config.parametric_drc_delay + p_obj_drc->str_config.eq_delay + p_obj_drc->str_config.audio_delay_samples; - p_obj_drc->str_config.delay_line_samples = p_obj_drc->str_config.audio_delay_samples; - - if (!p_obj_drc->str_config.absorb_delay_on) { - p_obj_drc->p_state->delay_in_output = 0; - } - } else { - p_obj_drc->p_state->delay_in_output += p_obj_drc->str_config.parametric_drc_delay_max + p_obj_drc->str_config.eq_delay_max + p_obj_drc->str_config.audio_delay_samples; - p_obj_drc->str_config.delay_line_samples = p_obj_drc->p_state->delay_in_output - p_obj_drc->str_config.parametric_drc_delay + p_obj_drc->str_config.eq_delay; - - if (!p_obj_drc->str_config.absorb_delay_on ) { - p_obj_drc->p_state->delay_in_output = 0; - } - } - - } - if(p_obj_drc->str_config.dec_type==1) - { - init_qmf_filt_bank(p_obj_drc->str_payload.pstr_qmf_filter); + if (p_obj_drc->str_config.eq_delay_max == -1) { + p_obj_drc->str_config.eq_delay_max = EQ_DELAY_MAX_DEFAULT; } - if (p_obj_drc->str_config.peak_limiter) - { - 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 (!p_obj_drc->str_config.constant_delay_on) { + p_obj_drc->p_state->delay_in_output += + p_obj_drc->str_config.parametric_drc_delay + + p_obj_drc->str_config.eq_delay + + p_obj_drc->str_config.audio_delay_samples; + p_obj_drc->str_config.delay_line_samples = + p_obj_drc->str_config.audio_delay_samples; + + if (!p_obj_drc->str_config.absorb_delay_on) { + p_obj_drc->p_state->delay_in_output = 0; + } + } else { + p_obj_drc->p_state->delay_in_output += + p_obj_drc->str_config.parametric_drc_delay_max + + p_obj_drc->str_config.eq_delay_max + + p_obj_drc->str_config.audio_delay_samples; + p_obj_drc->str_config.delay_line_samples = + p_obj_drc->p_state->delay_in_output - + p_obj_drc->str_config.parametric_drc_delay + + p_obj_drc->str_config.eq_delay; + + if (!p_obj_drc->str_config.absorb_delay_on) { + p_obj_drc->p_state->delay_in_output = 0; + } } - - return IA_NO_ERROR; + } + if (p_obj_drc->str_config.dec_type == 1) { + init_qmf_filt_bank(p_obj_drc->str_payload.pstr_qmf_filter); + } + + if (p_obj_drc->str_config.peak_limiter) { + 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); + } + + return IA_NO_ERROR; } - - - - - - - diff --git a/decoder/drc_src/impd_drc_interface.h b/decoder/drc_src/impd_drc_interface.h index 9062eb3..a0e7039 100644 --- a/decoder/drc_src/impd_drc_interface.h +++ b/decoder/drc_src/impd_drc_interface.h @@ -21,112 +21,113 @@ #define IMPD_DRC_INTERFACE_H typedef struct { - WORD32 loudness_eq_request_flag; - WORD32 loudness_eq_request; - WORD32 sensitivity_flag; - FLOAT32 sensitivity; - WORD32 playback_gain_flag; - FLOAT32 playback_gain; + WORD32 loudness_eq_request_flag; + WORD32 loudness_eq_request; + WORD32 sensitivity_flag; + FLOAT32 sensitivity; + WORD32 playback_gain_flag; + FLOAT32 playback_gain; } ia_loudness_eq_parameter_interface_struct; typedef struct { - WORD32 eq_set_purpose_request; + WORD32 eq_set_purpose_request; } ia_equalization_ctrl_interface_struct; typedef struct { - WORD32 ext_size_bits; - WORD32 ext_bit_size; - WORD32 uni_drc_interface_ext_type; + WORD32 ext_size_bits; + WORD32 ext_bit_size; + WORD32 uni_drc_interface_ext_type; } ia_specific_interface_extension_struct; typedef struct { - WORD32 interface_ext_count; - ia_specific_interface_extension_struct specific_interface_ext[EXT_COUNT_MAX]; - WORD32 loudness_eq_parameter_interface_flag; - WORD32 eq_ctrl_interface_flag; - ia_loudness_eq_parameter_interface_struct loudness_eq_parameter_interface; - ia_equalization_ctrl_interface_struct eq_ctrl_interface; + WORD32 interface_ext_count; + ia_specific_interface_extension_struct specific_interface_ext[EXT_COUNT_MAX]; + WORD32 loudness_eq_parameter_interface_flag; + WORD32 eq_ctrl_interface_flag; + ia_loudness_eq_parameter_interface_struct loudness_eq_parameter_interface; + ia_equalization_ctrl_interface_struct eq_ctrl_interface; } ia_drc_uni_interface_ext_struct; typedef struct { - WORD32 change_compress; - WORD32 change_boost; - FLOAT32 compress; - FLOAT32 boost; - WORD32 change_drc_characteristic_target; - WORD32 drc_characteristic_target; + WORD32 change_compress; + WORD32 change_boost; + FLOAT32 compress; + FLOAT32 boost; + WORD32 change_drc_characteristic_target; + WORD32 drc_characteristic_target; } ia_drc_parameter_interface_struct; typedef struct { - WORD32 dynamic_range_control_on; - WORD32 num_drc_feature_requests; - WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_num_drc_effects[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 desired_num_drc_effects_of_requested[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_drc_effect_type[MAX_NUM_DRC_FEATURE_REQUESTS][MAX_NUM_DRC_EFFECT_TYPE_REQUESTS]; - WORD32 requested_dyn_rng_measurement_type[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_dyn_range_is_single_val_flag[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_value[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_min_val[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_max_val[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_drc_characteristic[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 dynamic_range_control_on; + WORD32 num_drc_feature_requests; + WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_num_drc_effects[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 desired_num_drc_effects_of_requested[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_drc_effect_type[MAX_NUM_DRC_FEATURE_REQUESTS] + [MAX_NUM_DRC_EFFECT_TYPE_REQUESTS]; + WORD32 requested_dyn_rng_measurement_type[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_dyn_range_is_single_val_flag[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_value[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_min_val[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_max_val[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_drc_characteristic[MAX_NUM_DRC_FEATURE_REQUESTS]; } ia_dyn_rng_ctrl_interface_struct; typedef struct { - WORD32 album_mode; - WORD32 peak_limiter; - WORD32 change_loudness_deviation_max; - WORD32 loudness_deviation_max; - WORD32 change_loudness_measur_method; - WORD32 loudness_measurement_method; - WORD32 change_loudness_measur_system; - WORD32 loudness_measurement_system; - WORD32 change_loudness_measur_pre_proc; - WORD32 loudness_measurement_pre_proc; - WORD32 change_device_cut_off_freq; - WORD32 device_cut_off_frequency; - WORD32 change_loudness_norm_gain_db_max; - FLOAT32 loudness_norm_gain_db_max; - WORD32 change_loudness_norm_gain_modification_db; - FLOAT32 loudness_norm_gain_modification_db; - WORD32 change_output_peak_level_max; - FLOAT32 output_peak_level_max; + WORD32 album_mode; + WORD32 peak_limiter; + WORD32 change_loudness_deviation_max; + WORD32 loudness_deviation_max; + WORD32 change_loudness_measur_method; + WORD32 loudness_measurement_method; + WORD32 change_loudness_measur_system; + WORD32 loudness_measurement_system; + WORD32 change_loudness_measur_pre_proc; + WORD32 loudness_measurement_pre_proc; + WORD32 change_device_cut_off_freq; + WORD32 device_cut_off_frequency; + WORD32 change_loudness_norm_gain_db_max; + FLOAT32 loudness_norm_gain_db_max; + WORD32 change_loudness_norm_gain_modification_db; + FLOAT32 loudness_norm_gain_modification_db; + WORD32 change_output_peak_level_max; + FLOAT32 output_peak_level_max; } ia_loudness_norm_parameter_interface_struct; typedef struct { - WORD32 loudness_normalization_on; - FLOAT32 target_loudness; + WORD32 loudness_normalization_on; + FLOAT32 target_loudness; } ia_loudness_norm_ctrl_interface_struct; typedef struct { - WORD32 target_config_request_type; - WORD32 num_downmix_id_requests; - WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS]; - WORD32 requested_target_layout; - WORD32 requested_target_ch_count; + WORD32 target_config_request_type; + WORD32 num_downmix_id_requests; + WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS]; + WORD32 requested_target_layout; + WORD32 requested_target_ch_count; } ia_system_interface_struct; typedef struct { - WORD32 interface_signat_type; - WORD32 interface_signat_data_len; - UWORD32 interface_signat_data[MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE*8]; + WORD32 interface_signat_type; + WORD32 interface_signat_data_len; + UWORD32 interface_signat_data[MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE * 8]; } ia_drc_uni_interface_signat_struct; -typedef struct ia_drc_interface_struct{ - WORD32 interface_signat_flag; - WORD32 system_interface_flag; - WORD32 loudness_norm_ctrl_interface_flag; - WORD32 loudness_norm_parameter_interface_flag; - WORD32 drc_interface_flag; - WORD32 drc_parameter_interface_flag; - WORD32 drc_uni_interface_ext_flag; - ia_drc_uni_interface_signat_struct drc_uni_interface_signature; - ia_system_interface_struct system_interface; - ia_loudness_norm_ctrl_interface_struct loudness_norm_ctrl_interface; - ia_loudness_norm_parameter_interface_struct loudness_norm_param_interface; - ia_dyn_rng_ctrl_interface_struct drc_ctrl_interface; - ia_drc_parameter_interface_struct drc_parameter_interface; - ia_drc_uni_interface_ext_struct drc_uni_interface_ext; +typedef struct ia_drc_interface_struct { + WORD32 interface_signat_flag; + WORD32 system_interface_flag; + WORD32 loudness_norm_ctrl_interface_flag; + WORD32 loudness_norm_parameter_interface_flag; + WORD32 drc_interface_flag; + WORD32 drc_parameter_interface_flag; + WORD32 drc_uni_interface_ext_flag; + ia_drc_uni_interface_signat_struct drc_uni_interface_signature; + ia_system_interface_struct system_interface; + ia_loudness_norm_ctrl_interface_struct loudness_norm_ctrl_interface; + ia_loudness_norm_parameter_interface_struct loudness_norm_param_interface; + ia_dyn_rng_ctrl_interface_struct drc_ctrl_interface; + ia_drc_parameter_interface_struct drc_parameter_interface; + ia_drc_uni_interface_ext_struct drc_uni_interface_ext; } ia_drc_interface_struct; #endif diff --git a/decoder/drc_src/impd_drc_interface_decoder.c b/decoder/drc_src/impd_drc_interface_decoder.c index dd0d5e6..35b1f3c 100644 --- a/decoder/drc_src/impd_drc_interface_decoder.c +++ b/decoder/drc_src/impd_drc_interface_decoder.c @@ -30,139 +30,148 @@ #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); +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; - } else { - return -1; - } + 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); - err = impd_unidrc_interface_read(it_bit_buff, pstr_drc_interface); - if (err) return(err); + } else { + return -1; + } - *num_bits_read = (it_bit_buff->size ) - it_bit_buff->cnt_bits; + err = impd_unidrc_interface_read(it_bit_buff, pstr_drc_interface); + if (err) return (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) -{ - WORD32 err = 0; - WORD32 i = 0; - - if (pstr_drc_interface != NULL) - { - pstr_drc_interface->interface_signat_flag = 0; - for(i=0;i<MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE * 8;i++) - pstr_drc_interface->drc_uni_interface_signature.interface_signat_data[i] = 0; - - pstr_drc_interface->drc_uni_interface_signature.interface_signat_data_len = 0; - - pstr_drc_interface->system_interface_flag = 1; - - pstr_drc_interface->system_interface.target_config_request_type = 0; - pstr_drc_interface->system_interface.num_downmix_id_requests = 0; - for (i = 0; i < MAX_NUM_DOWNMIX_ID_REQUESTS; i++) - { - pstr_drc_interface->system_interface.requested_dwnmix_id[i] = 0; - } - pstr_drc_interface->system_interface.requested_target_layout = 0; - pstr_drc_interface->system_interface.requested_target_ch_count = 0; - - pstr_drc_interface->loudness_norm_ctrl_interface_flag= 1; - if(loud_norm==1) - { - pstr_drc_interface->loudness_norm_ctrl_interface.loudness_normalization_on = 1; - } - else - { - pstr_drc_interface->loudness_norm_ctrl_interface.loudness_normalization_on = 0; - } - pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness = (FLOAT32)target_loudness; - - pstr_drc_interface->loudness_norm_parameter_interface_flag = 1; - pstr_drc_interface->loudness_norm_param_interface.album_mode = 0; - pstr_drc_interface->loudness_norm_param_interface.peak_limiter = 0; - pstr_drc_interface->loudness_norm_param_interface.change_loudness_deviation_max = 1; - pstr_drc_interface->loudness_norm_param_interface.loudness_deviation_max = 63; - pstr_drc_interface->loudness_norm_param_interface.change_loudness_measur_method = 1; - pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_method = 1; - pstr_drc_interface->loudness_norm_param_interface.change_loudness_measur_system = 1; - pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_system = 1; - pstr_drc_interface->loudness_norm_param_interface.change_loudness_measur_pre_proc = 0; - pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_pre_proc = 0; - pstr_drc_interface->loudness_norm_param_interface.change_device_cut_off_freq = 1; - pstr_drc_interface->loudness_norm_param_interface.device_cut_off_frequency = 20; - pstr_drc_interface->loudness_norm_param_interface.change_loudness_norm_gain_db_max = 1; - pstr_drc_interface->loudness_norm_param_interface.loudness_norm_gain_db_max = 1000.0; - pstr_drc_interface->loudness_norm_param_interface.change_loudness_norm_gain_modification_db = 1; - pstr_drc_interface->loudness_norm_param_interface.loudness_norm_gain_modification_db = 0.0; - pstr_drc_interface->loudness_norm_param_interface.change_output_peak_level_max = 1; - pstr_drc_interface->loudness_norm_param_interface.output_peak_level_max = 0.0; - - pstr_drc_interface->drc_interface_flag = 1; - if(drc_effect_type==-1) - { - pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on=0; - pstr_drc_interface->drc_ctrl_interface.requested_drc_effect_type[0][0] = 0; - } - else if(drc_effect_type==0) - { - pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on=1; - pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests = 0; - } - else - { - pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on = 1; - pstr_drc_interface->drc_ctrl_interface.requested_drc_effect_type[0][0] = drc_effect_type; - pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests = 3; - pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[0] = 0; - pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[1] = 1; - pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[2] = 2; - pstr_drc_interface->drc_ctrl_interface.requested_num_drc_effects[0] = 1; - pstr_drc_interface->drc_ctrl_interface.desired_num_drc_effects_of_requested[0] = 1; - } - - pstr_drc_interface->drc_ctrl_interface.requested_dyn_rng_measurement_type[0] = 0; - pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_is_single_val_flag[0] = 0; - pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_is_single_val_flag[1] = 0; - pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_min_val[1] = 3.0f; - pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_max_val[1] = 10.0f; - pstr_drc_interface->drc_ctrl_interface.requested_drc_characteristic[2] = 3; - - pstr_drc_interface->drc_parameter_interface_flag = 1; - pstr_drc_interface->drc_parameter_interface.change_compress = 1; - pstr_drc_interface->drc_parameter_interface.change_boost = 1; - pstr_drc_interface->drc_parameter_interface.compress = 1.0f; - pstr_drc_interface->drc_parameter_interface.boost = 1.0f; - pstr_drc_interface->drc_parameter_interface.change_drc_characteristic_target = 1; - pstr_drc_interface->drc_parameter_interface.drc_characteristic_target = 0; - - - pstr_drc_interface->drc_uni_interface_ext_flag = 0; - +impd_drc_dec_interface_add_effect_type( + ia_drc_interface_struct* pstr_drc_interface, WORD32 drc_effect_type, + WORD32 target_loudness, WORD32 loud_norm) { + WORD32 err = 0; + WORD32 i = 0; + + if (pstr_drc_interface != NULL) { + pstr_drc_interface->interface_signat_flag = 0; + for (i = 0; i < MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE * 8; i++) + pstr_drc_interface->drc_uni_interface_signature.interface_signat_data[i] = + 0; + + pstr_drc_interface->drc_uni_interface_signature.interface_signat_data_len = + 0; + + pstr_drc_interface->system_interface_flag = 1; + + pstr_drc_interface->system_interface.target_config_request_type = 0; + pstr_drc_interface->system_interface.num_downmix_id_requests = 0; + for (i = 0; i < MAX_NUM_DOWNMIX_ID_REQUESTS; i++) { + pstr_drc_interface->system_interface.requested_dwnmix_id[i] = 0; + } + pstr_drc_interface->system_interface.requested_target_layout = 0; + pstr_drc_interface->system_interface.requested_target_ch_count = 0; + pstr_drc_interface->loudness_norm_ctrl_interface_flag = 1; + if (loud_norm == 1) { + pstr_drc_interface->loudness_norm_ctrl_interface + .loudness_normalization_on = 1; + } else { + pstr_drc_interface->loudness_norm_ctrl_interface + .loudness_normalization_on = 0; } - else - { - return UNEXPECTED_ERROR; + pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness = + (FLOAT32)target_loudness; + + pstr_drc_interface->loudness_norm_parameter_interface_flag = 1; + pstr_drc_interface->loudness_norm_param_interface.album_mode = 0; + pstr_drc_interface->loudness_norm_param_interface.peak_limiter = 0; + pstr_drc_interface->loudness_norm_param_interface + .change_loudness_deviation_max = 1; + pstr_drc_interface->loudness_norm_param_interface.loudness_deviation_max = + 63; + pstr_drc_interface->loudness_norm_param_interface + .change_loudness_measur_method = 1; + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_method = 1; + pstr_drc_interface->loudness_norm_param_interface + .change_loudness_measur_system = 1; + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_system = 1; + pstr_drc_interface->loudness_norm_param_interface + .change_loudness_measur_pre_proc = 0; + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_pre_proc = 0; + pstr_drc_interface->loudness_norm_param_interface + .change_device_cut_off_freq = 1; + pstr_drc_interface->loudness_norm_param_interface.device_cut_off_frequency = + 20; + pstr_drc_interface->loudness_norm_param_interface + .change_loudness_norm_gain_db_max = 1; + pstr_drc_interface->loudness_norm_param_interface + .loudness_norm_gain_db_max = 1000.0; + pstr_drc_interface->loudness_norm_param_interface + .change_loudness_norm_gain_modification_db = 1; + pstr_drc_interface->loudness_norm_param_interface + .loudness_norm_gain_modification_db = 0.0; + pstr_drc_interface->loudness_norm_param_interface + .change_output_peak_level_max = 1; + pstr_drc_interface->loudness_norm_param_interface.output_peak_level_max = + 0.0; + + pstr_drc_interface->drc_interface_flag = 1; + if (drc_effect_type == -1) { + pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on = 0; + pstr_drc_interface->drc_ctrl_interface.requested_drc_effect_type[0][0] = + 0; + } else if (drc_effect_type == 0) { + pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on = 1; + pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests = 0; + } else { + pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on = 1; + pstr_drc_interface->drc_ctrl_interface.requested_drc_effect_type[0][0] = + drc_effect_type; + pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests = 3; + pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[0] = 0; + pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[1] = 1; + pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[2] = 2; + pstr_drc_interface->drc_ctrl_interface.requested_num_drc_effects[0] = 1; + pstr_drc_interface->drc_ctrl_interface + .desired_num_drc_effects_of_requested[0] = 1; } - - return err; + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_rng_measurement_type[0] = 0; + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_is_single_val_flag[0] = 0; + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_is_single_val_flag[1] = 0; + pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_min_val[1] = + 3.0f; + pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_max_val[1] = + 10.0f; + pstr_drc_interface->drc_ctrl_interface.requested_drc_characteristic[2] = 3; + + pstr_drc_interface->drc_parameter_interface_flag = 1; + pstr_drc_interface->drc_parameter_interface.change_compress = 1; + pstr_drc_interface->drc_parameter_interface.change_boost = 1; + pstr_drc_interface->drc_parameter_interface.compress = 1.0f; + pstr_drc_interface->drc_parameter_interface.boost = 1.0f; + pstr_drc_interface->drc_parameter_interface + .change_drc_characteristic_target = 1; + pstr_drc_interface->drc_parameter_interface.drc_characteristic_target = 0; + + pstr_drc_interface->drc_uni_interface_ext_flag = 0; + + } else { + return UNEXPECTED_ERROR; + } + + return err; } diff --git a/decoder/drc_src/impd_drc_interface_parser.c b/decoder/drc_src/impd_drc_interface_parser.c index 87dccdd..1ae69a2 100644 --- a/decoder/drc_src/impd_drc_interface_parser.c +++ b/decoder/drc_src/impd_drc_interface_parser.c @@ -28,488 +28,487 @@ #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_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); + 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_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; +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); +} - 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; - } +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; - 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; - } + 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; - 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; - } + 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; - 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); - } + 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; - 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; - } + 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); +} - 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; +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; } - - 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; + } + + 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; } - - return(0); + } + + 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); } -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); +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_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; +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); } - } - - 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; + 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; } - 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; + i++; + if (i == EXT_COUNT_MAX) { + return (1); } - 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); + 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); + 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 index 4f02d00..ef04db2 100644 --- a/decoder/drc_src/impd_drc_loud_eq.c +++ b/decoder/drc_src/impd_drc_loud_eq.c @@ -34,158 +34,136 @@ #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_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; - } +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++) - 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++; - } + 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++) + } 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]; - } - } + { + for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { + channel_audio[c][i] = drcBandAudio[c][i]; + } } - return (0); + } + return (0); } -WORD32 removeTables(void) -{ - - return(0); -} +WORD32 removeTables(void) { return (0); } -const ia_slope_code_table_struct* -impd_get_slope_code_tbl_by_value(void) -{ - return(&(slopeCodeTableEntryByValue[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(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); +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; - } - } + 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; + } + return err; } - - diff --git a/decoder/drc_src/impd_drc_loudness_control.c b/decoder/drc_src/impd_drc_loudness_control.c index 470c5fe..ec8fcf1 100644 --- a/decoder/drc_src/impd_drc_loudness_control.c +++ b/decoder/drc_src/impd_drc_loudness_control.c @@ -29,959 +29,889 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" -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[]) -{ - WORD32 c, d, i, k, n, base_channel_count, mode; - WORD32 pre_lim_count; - WORD32 peak_count = 0; - WORD32 loudness_info_count = 0; - ia_loudness_info_struct* loudness_info; - FLOAT32 sum, max_sum; - WORD32 drc_set_id_requested = str_drc_instruction_str->drc_set_id; - WORD32 loudness_drc_set_id_requested; - WORD32 match_found_flag = 0; - - FLOAT32 signal_peak_level_tmp; - eq_set_id[0] = 0; - signal_peak_level[0] = 0.0f; - explicit_peak_information_present[0] = 0; - - k=0; - if (drc_set_id_requested < 0) - { - for (k=0; k<num_compression_eq_count; k++) - { - eq_set_id[k] = num_compression_eq_id[k]; - signal_peak_level[k] = 0.0f; - explicit_peak_information_present[k] = 0; +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[]) { + WORD32 c, d, i, k, n, base_channel_count, mode; + WORD32 pre_lim_count; + WORD32 peak_count = 0; + WORD32 loudness_info_count = 0; + ia_loudness_info_struct* loudness_info; + FLOAT32 sum, max_sum; + WORD32 drc_set_id_requested = str_drc_instruction_str->drc_set_id; + WORD32 loudness_drc_set_id_requested; + WORD32 match_found_flag = 0; + + FLOAT32 signal_peak_level_tmp; + eq_set_id[0] = 0; + signal_peak_level[0] = 0.0f; + explicit_peak_information_present[0] = 0; + + k = 0; + if (drc_set_id_requested < 0) { + for (k = 0; k < num_compression_eq_count; k++) { + eq_set_id[k] = num_compression_eq_id[k]; + signal_peak_level[k] = 0.0f; + explicit_peak_information_present[k] = 0; + } + } + eq_set_id[k] = 0; + signal_peak_level[k] = 0.0f; + explicit_peak_information_present[k] = 0; + k++; + + pre_lim_count = k; + + if (drc_set_id_requested < 0) { + loudness_drc_set_id_requested = 0; + } else { + loudness_drc_set_id_requested = drc_set_id_requested; + } + + if (album_mode == 1) { + mode = 1; + loudness_info_count = pstr_loudness_info->loudness_info_album_count; + } else { + mode = 0; + loudness_info_count = pstr_loudness_info->loudness_info_count; + } + + for (n = 0; n < loudness_info_count; n++) { + if (mode == 1) { + loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); + } else { + loudness_info = &(pstr_loudness_info->loudness_info[n]); + } + if (loudness_drc_set_id_requested == loudness_info->drc_set_id && + requested_dwnmix_id == loudness_info->downmix_id) { + if (loudness_info->true_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; + + signal_peak_level[peak_count] = loudness_info->true_peak_level; + explicit_peak_information_present[peak_count] = 1; + + match_found_flag = 1; + peak_count++; + } + if (match_found_flag == 0) { + if (loudness_info->sample_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; + + signal_peak_level[peak_count] = loudness_info->sample_peak_level; + explicit_peak_information_present[peak_count] = 1; + + match_found_flag = 1; + peak_count++; } - } - eq_set_id[k] = 0; - signal_peak_level[k] = 0.0f; - explicit_peak_information_present[k] = 0; - k++; - - pre_lim_count = k; - - if (drc_set_id_requested < 0) - { - loudness_drc_set_id_requested = 0; - } - else - { - loudness_drc_set_id_requested = drc_set_id_requested; - } - - if (album_mode == 1) - { - mode = 1; - loudness_info_count = pstr_loudness_info->loudness_info_album_count; - } - else - { - mode = 0; - loudness_info_count = pstr_loudness_info->loudness_info_count; - } - - for (n=0; n<loudness_info_count; n++) - { - if (mode == 1) - { - loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); - } - else - { - loudness_info = &(pstr_loudness_info->loudness_info[n]); + } + } + } + if (match_found_flag == 0) { + for (n = 0; n < loudness_info_count; n++) { + if (mode == 1) { + loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); + } else { + loudness_info = &(pstr_loudness_info->loudness_info[n]); + } + if (ID_FOR_ANY_DRC == loudness_info->drc_set_id && + requested_dwnmix_id == loudness_info->downmix_id) { + if (loudness_info->true_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; + + signal_peak_level[peak_count] = loudness_info->true_peak_level; + explicit_peak_information_present[peak_count] = 1; + + match_found_flag = 1; + peak_count++; } - if (loudness_drc_set_id_requested == loudness_info->drc_set_id && requested_dwnmix_id == loudness_info->downmix_id) - { - if (loudness_info->true_peak_level_present) - { - - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->true_peak_level; - explicit_peak_information_present[peak_count] = 1; - - match_found_flag = 1; - peak_count++; - - } - if (match_found_flag == 0) { - if (loudness_info->sample_peak_level_present) - { - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->sample_peak_level; - explicit_peak_information_present[peak_count] = 1; + if (match_found_flag == 0) { + if (loudness_info->sample_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; - match_found_flag = 1; - peak_count++; + signal_peak_level[peak_count] = loudness_info->sample_peak_level; + explicit_peak_information_present[peak_count] = 1; - } - } + match_found_flag = 1; + peak_count++; + } } - } - if (match_found_flag == 0) { - for (n=0; n<loudness_info_count; n++) - { - if (mode == 1) - { - loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); - } - else - { - loudness_info = &(pstr_loudness_info->loudness_info[n]); - } - if (ID_FOR_ANY_DRC == loudness_info->drc_set_id && requested_dwnmix_id == loudness_info->downmix_id) - { - if (loudness_info->true_peak_level_present) - { - - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->true_peak_level; - explicit_peak_information_present[peak_count] = 1; - - match_found_flag = 1; - peak_count++; - - } - if (match_found_flag == 0) { - if (loudness_info->sample_peak_level_present) - { - - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->sample_peak_level; - explicit_peak_information_present[peak_count] = 1; - - match_found_flag = 1; - peak_count++; - + } + } + } + if (match_found_flag == 0) { + for (i = 0; i < str_drc_instruction_str->dwnmix_id_count; i++) { + if (requested_dwnmix_id == str_drc_instruction_str->downmix_id[0] || + ID_FOR_ANY_DOWNMIX == str_drc_instruction_str->downmix_id[0]) { + if (str_drc_instruction_str->limiter_peak_target_present) { + if (str_drc_instruction_str->requires_eq == 1) { + for (d = 0; + d < pstr_drc_config->str_drc_config_ext.eq_instructions_count; + d++) { + ia_eq_instructions_struct* eq_instructions = + &pstr_drc_config->str_drc_config_ext.str_eq_instructions[d]; + for (c = 0; c < eq_instructions->drc_set_id_count; c++) { + if ((eq_instructions->drc_set_id[c] == + loudness_drc_set_id_requested) || + (eq_instructions->drc_set_id[c] == ID_FOR_ANY_DRC)) { + for (i = 0; i < eq_instructions->dwnmix_id_count; i++) { + if ((eq_instructions->downmix_id[i] == + requested_dwnmix_id) || + (eq_instructions->downmix_id[i] == + ID_FOR_ANY_DOWNMIX)) { + eq_set_id[peak_count] = eq_instructions->eq_set_id; + signal_peak_level[peak_count] = + str_drc_instruction_str->limiter_peak_target; + explicit_peak_information_present[peak_count] = 1; + match_found_flag = 1; + peak_count++; } + } } + } } + } else + + { + eq_set_id[peak_count] = 0; + signal_peak_level[peak_count] = + str_drc_instruction_str->limiter_peak_target; + explicit_peak_information_present[peak_count] = 1; + match_found_flag = 1; + peak_count++; + } } + } } - if (match_found_flag == 0) { - for (i=0; i<str_drc_instruction_str->dwnmix_id_count; i++) + } + if (match_found_flag == 0) { + for (i = 1; i < str_drc_instruction_str->dwnmix_id_count; i++) { + if (requested_dwnmix_id == str_drc_instruction_str->downmix_id[i]) { + if (str_drc_instruction_str->limiter_peak_target_present) { { - if (requested_dwnmix_id == str_drc_instruction_str->downmix_id[0] || ID_FOR_ANY_DOWNMIX == str_drc_instruction_str->downmix_id[0]) - { - if (str_drc_instruction_str->limiter_peak_target_present) - { - if (str_drc_instruction_str->requires_eq == 1) - { - for (d=0; d<pstr_drc_config->str_drc_config_ext.eq_instructions_count; d++) { - ia_eq_instructions_struct* eq_instructions = &pstr_drc_config->str_drc_config_ext.str_eq_instructions[d]; - for (c=0; c<eq_instructions->drc_set_id_count; c++) { - if ((eq_instructions->drc_set_id[c] == loudness_drc_set_id_requested) || (eq_instructions->drc_set_id[c] == ID_FOR_ANY_DRC)) { - for (i=0; i<eq_instructions->dwnmix_id_count; i++) { - if ((eq_instructions->downmix_id[i] == requested_dwnmix_id) || (eq_instructions->downmix_id[i] == ID_FOR_ANY_DOWNMIX)) { - eq_set_id[peak_count] = eq_instructions->eq_set_id; - signal_peak_level[peak_count] = str_drc_instruction_str->limiter_peak_target; - explicit_peak_information_present[peak_count] = 1; - match_found_flag = 1; - peak_count++; - } - } - } - } - } - } - else - - { - eq_set_id[peak_count] = 0; - signal_peak_level[peak_count] = str_drc_instruction_str->limiter_peak_target; - explicit_peak_information_present[peak_count] = 1; - match_found_flag = 1; - peak_count++; - } - } + eq_set_id[peak_count] = 0; + signal_peak_level[peak_count] = + str_drc_instruction_str->limiter_peak_target; + explicit_peak_information_present[peak_count] = 1; + match_found_flag = 1; + peak_count++; + } } - } -} - if (match_found_flag == 0) { - for (i=1; i<str_drc_instruction_str->dwnmix_id_count; i++) - { - if (requested_dwnmix_id == str_drc_instruction_str->downmix_id[i]) - { - if (str_drc_instruction_str->limiter_peak_target_present) - { - - { - eq_set_id[peak_count] = 0; - signal_peak_level[peak_count] = str_drc_instruction_str->limiter_peak_target; - explicit_peak_information_present[peak_count] = 1; - match_found_flag = 1; - peak_count++; - } - } - } + } + } + } + if (match_found_flag == 0) { + if (requested_dwnmix_id != ID_FOR_BASE_LAYOUT) { + signal_peak_level_tmp = 0.f; + for (i = 0; i < pstr_drc_config->dwnmix_instructions_count; i++) { + if (pstr_drc_config->dwnmix_instructions[i].downmix_id == + requested_dwnmix_id) { + if (pstr_drc_config->dwnmix_instructions[i] + .downmix_coefficients_present) { + base_channel_count = + pstr_drc_config->channel_layout.base_channel_count; + max_sum = 0.0f; + for (c = 0; + c < + pstr_drc_config->dwnmix_instructions[i].target_channel_count; + c++) { + sum = 0.0f; + for (d = 0; d < base_channel_count; d++) { + sum += pstr_drc_config->dwnmix_instructions[i] + .downmix_coefficient[c * base_channel_count + d]; + } + if (max_sum < sum) max_sum = sum; } + signal_peak_level_tmp = 20.0f * (FLOAT32)log10(max_sum); + } else { + } + break; } - if (match_found_flag == 0) { - if (requested_dwnmix_id != ID_FOR_BASE_LAYOUT) { - signal_peak_level_tmp = 0.f; - for (i=0; i<pstr_drc_config->dwnmix_instructions_count; i++) - { - if (pstr_drc_config->dwnmix_instructions[i].downmix_id == requested_dwnmix_id) - { - if (pstr_drc_config->dwnmix_instructions[i].downmix_coefficients_present) - { - base_channel_count = pstr_drc_config->channel_layout.base_channel_count; - max_sum = 0.0f; - for (c=0; c<pstr_drc_config->dwnmix_instructions[i].target_channel_count; c++) - { - sum = 0.0f; - for (d=0; d<base_channel_count; d++) - { - sum += pstr_drc_config->dwnmix_instructions[i].downmix_coefficient[c * base_channel_count + d]; - } - if (max_sum < sum) max_sum = sum; - } - signal_peak_level_tmp = 20.0f * (FLOAT32)log10(max_sum); - } else { - - } - break; - } + } + for (n = 0; n < loudness_info_count; n++) { + if (mode == 1) { + loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); + } else { + loudness_info = &(pstr_loudness_info->loudness_info[n]); + } + if (loudness_drc_set_id_requested == loudness_info->drc_set_id && + ID_FOR_BASE_LAYOUT == loudness_info->downmix_id) { + if (loudness_info->true_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; + + signal_peak_level[peak_count] = + loudness_info->true_peak_level + signal_peak_level_tmp; + explicit_peak_information_present[peak_count] = 0; + + match_found_flag = 1; + peak_count++; + } + if (match_found_flag == 0) { + if (loudness_info->sample_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; + + signal_peak_level[peak_count] = + loudness_info->sample_peak_level + signal_peak_level_tmp; + explicit_peak_information_present[peak_count] = 0; + + match_found_flag = 1; + peak_count++; } - for (n=0; n<loudness_info_count; n++) - { - if (mode == 1) - { - loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); - } - else - { - loudness_info = &(pstr_loudness_info->loudness_info[n]); - } - if (loudness_drc_set_id_requested == loudness_info->drc_set_id && ID_FOR_BASE_LAYOUT == loudness_info->downmix_id) { - if (loudness_info->true_peak_level_present) - { - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->true_peak_level + signal_peak_level_tmp; - explicit_peak_information_present[peak_count] = 0; - - match_found_flag = 1; - peak_count++; - - } - if (match_found_flag == 0) { - if (loudness_info->sample_peak_level_present) - { - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->sample_peak_level + signal_peak_level_tmp; - explicit_peak_information_present[peak_count] = 0; - - match_found_flag = 1; - peak_count++; - - } - } - } + } + } + } + if (match_found_flag == 0) { + for (n = 0; n < loudness_info_count; n++) { + if (mode == 1) { + loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); + } else { + loudness_info = &(pstr_loudness_info->loudness_info[n]); + } + if (ID_FOR_ANY_DRC == loudness_info->drc_set_id && + ID_FOR_BASE_LAYOUT == loudness_info->downmix_id) { + if (loudness_info->true_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; + + signal_peak_level[peak_count] = + loudness_info->true_peak_level + signal_peak_level_tmp; + explicit_peak_information_present[peak_count] = 0; + + match_found_flag = 1; + peak_count++; } if (match_found_flag == 0) { - for (n=0; n<loudness_info_count; n++) - { - if (mode == 1) - { - loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); - } - else - { - loudness_info = &(pstr_loudness_info->loudness_info[n]); - } - if (ID_FOR_ANY_DRC == loudness_info->drc_set_id && ID_FOR_BASE_LAYOUT == loudness_info->downmix_id) { - if (loudness_info->true_peak_level_present) - { - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->true_peak_level + signal_peak_level_tmp; - explicit_peak_information_present[peak_count] = 0; - - match_found_flag = 1; - peak_count++; - - } - if (match_found_flag == 0) { - if (loudness_info->sample_peak_level_present) - { - eq_set_id[peak_count] = loudness_info->eq_set_id; - - signal_peak_level[peak_count] = loudness_info->sample_peak_level + signal_peak_level_tmp; - explicit_peak_information_present[peak_count] = 0; + if (loudness_info->sample_peak_level_present) { + eq_set_id[peak_count] = loudness_info->eq_set_id; - match_found_flag = 1; - peak_count++; + signal_peak_level[peak_count] = + loudness_info->sample_peak_level + signal_peak_level_tmp; + explicit_peak_information_present[peak_count] = 0; - } - } - } - } + match_found_flag = 1; + peak_count++; + } } - if (match_found_flag == 0) { - ia_drc_instructions_struct* drc_instructions_drc_tmp; - for (n=0; n<pstr_drc_config->drc_instructions_count_plus; n++) { - drc_instructions_drc_tmp = &pstr_drc_config->str_drc_instruction_str[n]; - if (loudness_drc_set_id_requested == drc_instructions_drc_tmp->drc_set_id) { - for (k=0; k<drc_instructions_drc_tmp->dwnmix_id_count; k++) { - if (ID_FOR_BASE_LAYOUT == drc_instructions_drc_tmp->downmix_id[k]) { - if (drc_instructions_drc_tmp->limiter_peak_target_present) { - eq_set_id[peak_count] = -1; - signal_peak_level[peak_count] = drc_instructions_drc_tmp->limiter_peak_target + signal_peak_level_tmp; - explicit_peak_information_present[peak_count] = 0; - match_found_flag = 1; - peak_count++; - } - } - break; - } - } + } + } + } + if (match_found_flag == 0) { + ia_drc_instructions_struct* drc_instructions_drc_tmp; + for (n = 0; n < pstr_drc_config->drc_instructions_count_plus; n++) { + drc_instructions_drc_tmp = + &pstr_drc_config->str_drc_instruction_str[n]; + if (loudness_drc_set_id_requested == + drc_instructions_drc_tmp->drc_set_id) { + for (k = 0; k < drc_instructions_drc_tmp->dwnmix_id_count; k++) { + if (ID_FOR_BASE_LAYOUT == + drc_instructions_drc_tmp->downmix_id[k]) { + if (drc_instructions_drc_tmp->limiter_peak_target_present) { + eq_set_id[peak_count] = -1; + signal_peak_level[peak_count] = + drc_instructions_drc_tmp->limiter_peak_target + + signal_peak_level_tmp; + explicit_peak_information_present[peak_count] = 0; + match_found_flag = 1; + peak_count++; } + } + break; } + } } - } - if (peak_count > 0) - { - *peak_info_count = peak_count; - } - else - { - *peak_info_count = pre_lim_count; - } - return (0); + } + } + } + if (peak_count > 0) { + *peak_info_count = peak_count; + } else { + *peak_info_count = pre_lim_count; + } + return (0); } - - WORD32 -impd_extract_loudness_peak_to_average_info(ia_loudness_info_struct* loudness_info, - WORD32 dyn_range_measurement_type, - WORD32 * loudness_peak_2_avg_value_present, - FLOAT32* loudness_peak_2_avg_value) -{ - WORD32 k; - WORD32 program_loudness_present = 0; - WORD32 peak_loudness_present = 0; - WORD32 match_measure_program_loudness = 0; - WORD32 match_measure_peak_loudness = 0; - FLOAT32 program_loudness = 0.0f; - FLOAT32 peak_loudness = 0.0f; - ia_loudness_measure_struct* loudness_measure = NULL; - - for (k=0; k<loudness_info->measurement_count; k++) - { - loudness_measure = &(loudness_info->loudness_measure[k]); - if (loudness_measure->method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) - { - if (match_measure_program_loudness < measurement_method_prog_loudness_tbl[loudness_measure->measurement_system]) - { - program_loudness = loudness_measure->method_val; - program_loudness_present = 1; - match_measure_program_loudness = measurement_method_prog_loudness_tbl[loudness_measure->measurement_system]; - } +impd_extract_loudness_peak_to_average_info( + ia_loudness_info_struct* loudness_info, WORD32 dyn_range_measurement_type, + WORD32* loudness_peak_2_avg_value_present, + FLOAT32* loudness_peak_2_avg_value) { + WORD32 k; + WORD32 program_loudness_present = 0; + WORD32 peak_loudness_present = 0; + WORD32 match_measure_program_loudness = 0; + WORD32 match_measure_peak_loudness = 0; + FLOAT32 program_loudness = 0.0f; + FLOAT32 peak_loudness = 0.0f; + ia_loudness_measure_struct* loudness_measure = NULL; + + for (k = 0; k < loudness_info->measurement_count; k++) { + loudness_measure = &(loudness_info->loudness_measure[k]); + if (loudness_measure->method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) { + if (match_measure_program_loudness < + measurement_method_prog_loudness_tbl[loudness_measure + ->measurement_system]) { + program_loudness = loudness_measure->method_val; + program_loudness_present = 1; + match_measure_program_loudness = + measurement_method_prog_loudness_tbl[loudness_measure + ->measurement_system]; + } + } + switch (dyn_range_measurement_type) { + case SHORT_TERM_LOUDNESS_TO_AVG: + if (loudness_measure->method_def == + METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX) { + if (match_measure_peak_loudness < + measurement_method_peak_loudness_tbl[loudness_measure + ->measurement_system]) { + peak_loudness = loudness_measure->method_val; + peak_loudness_present = 1; + match_measure_peak_loudness = + measurement_method_peak_loudness_tbl[loudness_measure + ->measurement_system]; + } } - switch (dyn_range_measurement_type) { - case SHORT_TERM_LOUDNESS_TO_AVG: - if (loudness_measure->method_def == METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX) - { - if (match_measure_peak_loudness < measurement_method_peak_loudness_tbl[loudness_measure->measurement_system]) - { - peak_loudness = loudness_measure->method_val; - peak_loudness_present = 1; - match_measure_peak_loudness = measurement_method_peak_loudness_tbl[loudness_measure->measurement_system]; - } - } - break; - - case MOMENTARY_LOUDNESS_TO_AVG: - if (loudness_measure->method_def == METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX) - { - if (match_measure_peak_loudness < measurement_method_peak_loudness_tbl[loudness_measure->measurement_system]) - { - peak_loudness = loudness_measure->method_val; - peak_loudness_present = 1; - match_measure_peak_loudness = measurement_method_peak_loudness_tbl[loudness_measure->measurement_system]; - } - } - break; - - case TOP_OF_LOUDNESS_RANGE_TO_AVG: - if (loudness_measure->method_def == METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE) - { - if (match_measure_peak_loudness < measurement_method_peak_loudness_tbl[loudness_measure->measurement_system]) - { - peak_loudness = loudness_measure->method_val; - peak_loudness_present = 1; - match_measure_peak_loudness = measurement_method_peak_loudness_tbl[loudness_measure->measurement_system]; - } - } - break; + break; + + case MOMENTARY_LOUDNESS_TO_AVG: + if (loudness_measure->method_def == + METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX) { + if (match_measure_peak_loudness < + measurement_method_peak_loudness_tbl[loudness_measure + ->measurement_system]) { + peak_loudness = loudness_measure->method_val; + peak_loudness_present = 1; + match_measure_peak_loudness = + measurement_method_peak_loudness_tbl[loudness_measure + ->measurement_system]; + } + } + break; + + case TOP_OF_LOUDNESS_RANGE_TO_AVG: + if (loudness_measure->method_def == + METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE) { + if (match_measure_peak_loudness < + measurement_method_peak_loudness_tbl[loudness_measure + ->measurement_system]) { + peak_loudness = loudness_measure->method_val; + peak_loudness_present = 1; + match_measure_peak_loudness = + measurement_method_peak_loudness_tbl[loudness_measure + ->measurement_system]; + } + } + break; - default: - return (UNEXPECTED_ERROR); + default: + return (UNEXPECTED_ERROR); - break; - } + break; } - if ((program_loudness_present == 1) && (peak_loudness_present == 1)) - { - *loudness_peak_2_avg_value = peak_loudness - program_loudness; - *loudness_peak_2_avg_value_present = 1; - } - return (0); + } + if ((program_loudness_present == 1) && (peak_loudness_present == 1)) { + *loudness_peak_2_avg_value = peak_loudness - program_loudness; + *loudness_peak_2_avg_value_present = 1; + } + return (0); } WORD32 impd_loudness_peak_to_average_info( - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_instructions_struct* str_drc_instruction_str, - WORD32 requested_dwnmix_id, - WORD32 dyn_range_measurement_type, - WORD32 album_mode, - WORD32* loudness_peak_2_avg_value_present, - FLOAT32* loudness_peak_2_avg_value) -{ - WORD32 n, err; - WORD32 drc_set_id = max(0,str_drc_instruction_str->drc_set_id); - - *loudness_peak_2_avg_value_present = 0; - - if (album_mode == 1) - { - for (n=0; n<pstr_loudness_info->loudness_info_album_count; n++) - { - ia_loudness_info_struct* loudness_info = &(pstr_loudness_info->str_loudness_info_album[n]); - if (drc_set_id == loudness_info->drc_set_id) - { - if (requested_dwnmix_id == loudness_info->downmix_id) - { - - err = impd_extract_loudness_peak_to_average_info(loudness_info, - dyn_range_measurement_type, - loudness_peak_2_avg_value_present, - loudness_peak_2_avg_value); - if (err) return (err); - - } - } + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_instructions_struct* str_drc_instruction_str, + WORD32 requested_dwnmix_id, WORD32 dyn_range_measurement_type, + WORD32 album_mode, WORD32* loudness_peak_2_avg_value_present, + FLOAT32* loudness_peak_2_avg_value) { + WORD32 n, err; + WORD32 drc_set_id = max(0, str_drc_instruction_str->drc_set_id); + + *loudness_peak_2_avg_value_present = 0; + + if (album_mode == 1) { + for (n = 0; n < pstr_loudness_info->loudness_info_album_count; n++) { + ia_loudness_info_struct* loudness_info = + &(pstr_loudness_info->str_loudness_info_album[n]); + if (drc_set_id == loudness_info->drc_set_id) { + if (requested_dwnmix_id == loudness_info->downmix_id) { + err = impd_extract_loudness_peak_to_average_info( + loudness_info, dyn_range_measurement_type, + loudness_peak_2_avg_value_present, loudness_peak_2_avg_value); + if (err) return (err); } - } - if (*loudness_peak_2_avg_value_present == 0) - { - for (n=0; n<pstr_loudness_info->loudness_info_count; n++) - { - ia_loudness_info_struct* loudness_info = &(pstr_loudness_info->loudness_info[n]); - if (drc_set_id == loudness_info->drc_set_id) - { - if (requested_dwnmix_id == loudness_info->downmix_id) - { - - err = impd_extract_loudness_peak_to_average_info(loudness_info, - dyn_range_measurement_type, - loudness_peak_2_avg_value_present, - loudness_peak_2_avg_value); - if (err) return (err); - - } - } + } + } + } + if (*loudness_peak_2_avg_value_present == 0) { + for (n = 0; n < pstr_loudness_info->loudness_info_count; n++) { + ia_loudness_info_struct* loudness_info = + &(pstr_loudness_info->loudness_info[n]); + if (drc_set_id == loudness_info->drc_set_id) { + if (requested_dwnmix_id == loudness_info->downmix_id) { + err = impd_extract_loudness_peak_to_average_info( + loudness_info, dyn_range_measurement_type, + loudness_peak_2_avg_value_present, loudness_peak_2_avg_value); + if (err) return (err); } + } } - return (0); + } + return (0); } +WORD32 impd_overall_loudness_present(ia_loudness_info_struct* loudness_info, + WORD32* loudness_info_present) { + WORD32 m; -WORD32 impd_overall_loudness_present( ia_loudness_info_struct* loudness_info, - WORD32* loudness_info_present) -{ - WORD32 m; - - *loudness_info_present = 0; - for (m=0; m<loudness_info->measurement_count; m++) - { - if ((loudness_info->loudness_measure[m].method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) || - (loudness_info->loudness_measure[m].method_def == METHOD_DEFINITION_ANCHOR_LOUDNESS)) - { - *loudness_info_present = 1; - } + *loudness_info_present = 0; + for (m = 0; m < loudness_info->measurement_count; m++) { + if ((loudness_info->loudness_measure[m].method_def == + METHOD_DEFINITION_PROGRAM_LOUDNESS) || + (loudness_info->loudness_measure[m].method_def == + METHOD_DEFINITION_ANCHOR_LOUDNESS)) { + *loudness_info_present = 1; } - return (0); + } + return (0); } WORD32 impd_check_loud_info(WORD32 loudness_info_count, - ia_loudness_info_struct* loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32* info_count, - ia_loudness_info_struct* loudness_info_matching[]) -{ - WORD32 n, err; - 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); - if (loudness_info_present) - { - loudness_info_matching[*info_count] = &(loudness_info[n]); - (*info_count)++; - } - } + ia_loudness_info_struct* loudness_info, + WORD32 requested_dwnmix_id, + WORD32 drc_set_id_requested, WORD32* info_count, + ia_loudness_info_struct* loudness_info_matching[]) { + WORD32 n, err; + 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); + if (loudness_info_present) { + loudness_info_matching[*info_count] = &(loudness_info[n]); + (*info_count)++; } + } } + } - return (0); + return (0); } -WORD32 impd_check_loud_payload(WORD32 loudness_info_count, - ia_loudness_info_struct* loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32* info_count, - ia_loudness_info_struct* loudness_info_matching[]) -{ - WORD32 err = 0; - - err = impd_check_loud_info(loudness_info_count, loudness_info, requested_dwnmix_id, drc_set_id_requested, info_count, loudness_info_matching); - if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, ID_FOR_ANY_DOWNMIX, drc_set_id_requested, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, requested_dwnmix_id, ID_FOR_ANY_DRC, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, requested_dwnmix_id, ID_FOR_NO_DRC, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, ID_FOR_ANY_DOWNMIX, ID_FOR_ANY_DRC, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, ID_FOR_ANY_DOWNMIX, ID_FOR_NO_DRC, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, ID_FOR_BASE_LAYOUT, drc_set_id_requested, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, ID_FOR_BASE_LAYOUT, ID_FOR_ANY_DRC, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; - err = impd_check_loud_info(loudness_info_count, loudness_info, ID_FOR_BASE_LAYOUT, ID_FOR_NO_DRC, info_count, loudness_info_matching); if (err || *info_count) goto matchEnd; +WORD32 impd_check_loud_payload( + WORD32 loudness_info_count, ia_loudness_info_struct* loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, WORD32* info_count, + ia_loudness_info_struct* loudness_info_matching[]) { + WORD32 err = 0; + + err = impd_check_loud_info(loudness_info_count, loudness_info, + requested_dwnmix_id, drc_set_id_requested, + info_count, loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + ID_FOR_ANY_DOWNMIX, drc_set_id_requested, + info_count, loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + requested_dwnmix_id, ID_FOR_ANY_DRC, info_count, + loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + requested_dwnmix_id, ID_FOR_NO_DRC, info_count, + loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + ID_FOR_ANY_DOWNMIX, ID_FOR_ANY_DRC, info_count, + loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + ID_FOR_ANY_DOWNMIX, ID_FOR_NO_DRC, info_count, + loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + ID_FOR_BASE_LAYOUT, drc_set_id_requested, + info_count, loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + ID_FOR_BASE_LAYOUT, ID_FOR_ANY_DRC, info_count, + loudness_info_matching); + if (err || *info_count) goto matchEnd; + err = impd_check_loud_info(loudness_info_count, loudness_info, + ID_FOR_BASE_LAYOUT, ID_FOR_NO_DRC, info_count, + loudness_info_matching); + if (err || *info_count) goto matchEnd; matchEnd: - return (err); + return (err); } - -WORD32 impd_find_overall_loudness_info(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32* overall_loudness_info_present, - WORD32* info_count, - ia_loudness_info_struct* loudness_info_matching[]) -{ - WORD32 err; - WORD32 loudness_drc_set_id_requested; - - *info_count = 0; - if (drc_set_id_requested < 0) - { - loudness_drc_set_id_requested = ID_FOR_NO_DRC; - } - else - { - loudness_drc_set_id_requested = drc_set_id_requested; - } - if (pstr_drc_sel_proc_params_struct->album_mode == 1) - { - err = impd_check_loud_payload(pstr_loudness_info->loudness_info_album_count, - pstr_loudness_info->str_loudness_info_album, - requested_dwnmix_id, - loudness_drc_set_id_requested, - info_count, - loudness_info_matching); - if (err) return (err); - - } - if (*info_count == 0) - { - err = impd_check_loud_payload(pstr_loudness_info->loudness_info_count, - pstr_loudness_info->loudness_info, - requested_dwnmix_id, - loudness_drc_set_id_requested, - - info_count, - loudness_info_matching); - if (err) return (err); - } - *overall_loudness_info_present = (*info_count > 0); - return(0); +WORD32 impd_find_overall_loudness_info( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, + WORD32* overall_loudness_info_present, WORD32* info_count, + ia_loudness_info_struct* loudness_info_matching[]) { + WORD32 err; + WORD32 loudness_drc_set_id_requested; + + *info_count = 0; + if (drc_set_id_requested < 0) { + loudness_drc_set_id_requested = ID_FOR_NO_DRC; + } else { + loudness_drc_set_id_requested = drc_set_id_requested; + } + if (pstr_drc_sel_proc_params_struct->album_mode == 1) { + err = impd_check_loud_payload( + pstr_loudness_info->loudness_info_album_count, + pstr_loudness_info->str_loudness_info_album, requested_dwnmix_id, + loudness_drc_set_id_requested, info_count, loudness_info_matching); + if (err) return (err); + } + if (*info_count == 0) { + err = impd_check_loud_payload(pstr_loudness_info->loudness_info_count, + pstr_loudness_info->loudness_info, + requested_dwnmix_id, + loudness_drc_set_id_requested, + + info_count, loudness_info_matching); + if (err) return (err); + } + *overall_loudness_info_present = (*info_count > 0); + return (0); } - WORD32 -impd_high_pass_loudness_adjust_info( ia_loudness_info_struct* loudness_info, - WORD32* loudness_hp_adjust_present, - FLOAT32* loudness_hp_adjust) -{ - WORD32 m, k; - - *loudness_hp_adjust_present = 0; - *loudness_hp_adjust = 0.0f; - for (m=0; m<loudness_info->measurement_count; m++) - { - if (loudness_info->loudness_measure[m].measurement_system == MEASUREMENT_SYSTEM_BS_1770_4_PRE_PROCESSING) - { - for (k=0; k<loudness_info->measurement_count; k++) - { - if (loudness_info->loudness_measure[k].measurement_system == MEASUREMENT_SYSTEM_BS_1770_4) - { - if (loudness_info->loudness_measure[m].method_def == loudness_info->loudness_measure[k].method_def) - { - *loudness_hp_adjust_present = 1; - *loudness_hp_adjust = loudness_info->loudness_measure[m].method_val - loudness_info->loudness_measure[k].method_val; - } - } - } +impd_high_pass_loudness_adjust_info(ia_loudness_info_struct* loudness_info, + WORD32* loudness_hp_adjust_present, + FLOAT32* loudness_hp_adjust) { + WORD32 m, k; + + *loudness_hp_adjust_present = 0; + *loudness_hp_adjust = 0.0f; + for (m = 0; m < loudness_info->measurement_count; m++) { + if (loudness_info->loudness_measure[m].measurement_system == + MEASUREMENT_SYSTEM_BS_1770_4_PRE_PROCESSING) { + for (k = 0; k < loudness_info->measurement_count; k++) { + if (loudness_info->loudness_measure[k].measurement_system == + MEASUREMENT_SYSTEM_BS_1770_4) { + if (loudness_info->loudness_measure[m].method_def == + loudness_info->loudness_measure[k].method_def) { + *loudness_hp_adjust_present = 1; + *loudness_hp_adjust = + loudness_info->loudness_measure[m].method_val - + loudness_info->loudness_measure[k].method_val; + } } + } } - return (0); + } + return (0); } WORD32 impd_find_high_pass_loudness_adjust( - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32 album_mode, - FLOAT32 device_cutoff_freq, - WORD32* loudness_hp_adjust_present, - FLOAT32* loudness_hp_adjust) -{ - WORD32 n, err; - WORD32 loudness_drc_set_id_requested; - - if (drc_set_id_requested < 0) - { - loudness_drc_set_id_requested = 0; - } - else - { - loudness_drc_set_id_requested = drc_set_id_requested; - } - - *loudness_hp_adjust_present = 0; - - if (album_mode == 1) - { - for (n=0; n<pstr_loudness_info->loudness_info_album_count; n++) - { - if ((requested_dwnmix_id == pstr_loudness_info->str_loudness_info_album[n].downmix_id) || (ID_FOR_ANY_DOWNMIX == pstr_loudness_info->str_loudness_info_album[n].downmix_id)) - { - if (loudness_drc_set_id_requested == pstr_loudness_info->str_loudness_info_album[n].drc_set_id) - { - err = impd_high_pass_loudness_adjust_info(&(pstr_loudness_info->loudness_info[n]), loudness_hp_adjust_present, loudness_hp_adjust); - if (err) return (err); - } - } + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, WORD32 album_mode, + FLOAT32 device_cutoff_freq, WORD32* loudness_hp_adjust_present, + FLOAT32* loudness_hp_adjust) { + WORD32 n, err; + WORD32 loudness_drc_set_id_requested; + + if (drc_set_id_requested < 0) { + loudness_drc_set_id_requested = 0; + } else { + loudness_drc_set_id_requested = drc_set_id_requested; + } + + *loudness_hp_adjust_present = 0; + + if (album_mode == 1) { + for (n = 0; n < pstr_loudness_info->loudness_info_album_count; n++) { + if ((requested_dwnmix_id == + pstr_loudness_info->str_loudness_info_album[n].downmix_id) || + (ID_FOR_ANY_DOWNMIX == + pstr_loudness_info->str_loudness_info_album[n].downmix_id)) { + if (loudness_drc_set_id_requested == + pstr_loudness_info->str_loudness_info_album[n].drc_set_id) { + err = impd_high_pass_loudness_adjust_info( + &(pstr_loudness_info->loudness_info[n]), + loudness_hp_adjust_present, loudness_hp_adjust); + if (err) return (err); } - } - if (*loudness_hp_adjust_present == 0) - { - for (n=0; n<pstr_loudness_info->loudness_info_count; n++) - { - if ((requested_dwnmix_id == pstr_loudness_info->loudness_info[n].downmix_id) || (ID_FOR_ANY_DOWNMIX == pstr_loudness_info->loudness_info[n].downmix_id)) - { - if (loudness_drc_set_id_requested == pstr_loudness_info->loudness_info[n].drc_set_id) - { - err = impd_high_pass_loudness_adjust_info(&(pstr_loudness_info->loudness_info[n]), loudness_hp_adjust_present, loudness_hp_adjust); - if (err) return (err); - } - } + } + } + } + if (*loudness_hp_adjust_present == 0) { + for (n = 0; n < pstr_loudness_info->loudness_info_count; n++) { + if ((requested_dwnmix_id == + pstr_loudness_info->loudness_info[n].downmix_id) || + (ID_FOR_ANY_DOWNMIX == + pstr_loudness_info->loudness_info[n].downmix_id)) { + if (loudness_drc_set_id_requested == + pstr_loudness_info->loudness_info[n].drc_set_id) { + err = impd_high_pass_loudness_adjust_info( + &(pstr_loudness_info->loudness_info[n]), + loudness_hp_adjust_present, loudness_hp_adjust); + if (err) return (err); } - } - if (*loudness_hp_adjust_present == 0) - { - for (n=0; n<pstr_loudness_info->loudness_info_count; n++) - { - if (ID_FOR_BASE_LAYOUT == pstr_loudness_info->loudness_info[n].downmix_id) /* base layout */ - { - if (loudness_drc_set_id_requested == pstr_loudness_info->loudness_info[n].drc_set_id) - { - err = impd_high_pass_loudness_adjust_info(&(pstr_loudness_info->loudness_info[n]), loudness_hp_adjust_present, loudness_hp_adjust); - if (err) return (err); - } - } + } + } + } + if (*loudness_hp_adjust_present == 0) { + for (n = 0; n < pstr_loudness_info->loudness_info_count; n++) { + if (ID_FOR_BASE_LAYOUT == + pstr_loudness_info->loudness_info[n].downmix_id) /* base layout */ + { + if (loudness_drc_set_id_requested == + pstr_loudness_info->loudness_info[n].drc_set_id) { + err = impd_high_pass_loudness_adjust_info( + &(pstr_loudness_info->loudness_info[n]), + loudness_hp_adjust_present, loudness_hp_adjust); + if (err) return (err); } - } - if (*loudness_hp_adjust_present == 0) - { - for (n=0; n<pstr_loudness_info->loudness_info_count; n++) - { - if (ID_FOR_BASE_LAYOUT == pstr_loudness_info->loudness_info[n].downmix_id) /* base layout */ - { - if (0 == pstr_loudness_info->loudness_info[n].drc_set_id) - { - err = impd_high_pass_loudness_adjust_info(&(pstr_loudness_info->loudness_info[n]), loudness_hp_adjust_present, loudness_hp_adjust); - if (err) return (err); - } - } + } + } + } + if (*loudness_hp_adjust_present == 0) { + for (n = 0; n < pstr_loudness_info->loudness_info_count; n++) { + if (ID_FOR_BASE_LAYOUT == + pstr_loudness_info->loudness_info[n].downmix_id) /* base layout */ + { + if (0 == pstr_loudness_info->loudness_info[n].drc_set_id) { + err = impd_high_pass_loudness_adjust_info( + &(pstr_loudness_info->loudness_info[n]), + loudness_hp_adjust_present, loudness_hp_adjust); + if (err) return (err); } + } } - if (*loudness_hp_adjust_present == 0) - { - *loudness_hp_adjust = 0.0f; - } - else - { - *loudness_hp_adjust *= (max(20.0f, min(500.0f, device_cutoff_freq)) - 20.0f) / (500.0f - 20.0f); - } - return(0); + } + if (*loudness_hp_adjust_present == 0) { + *loudness_hp_adjust = 0.0f; + } else { + *loudness_hp_adjust *= + (max(20.0f, min(500.0f, device_cutoff_freq)) - 20.0f) / + (500.0f - 20.0f); + } + return (0); } - -WORD32 impd_init_loudness_control (ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32 num_compression_eq_count, - WORD32* num_compression_eq_id, - WORD32* loudness_info_count, - WORD32 eq_set_id[], - FLOAT32 loudness_normalization_gain_db[], - FLOAT32 loudness[]) -{ - WORD32 err, k, info_count = 0, pre_lim_count; - WORD32 loudness_hp_adjust_present; - WORD32 overall_loudness_info_present; - FLOAT32 pre_proc_adjust; - - k=0; - if (drc_set_id_requested < 0) - { - for (k=0; k<num_compression_eq_count; k++) - { - eq_set_id[k] = num_compression_eq_id[k]; - loudness[k] = UNDEFINED_LOUDNESS_VALUE; - loudness_normalization_gain_db[k] = 0.0f; +WORD32 impd_init_loudness_control( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, + WORD32 num_compression_eq_count, WORD32* num_compression_eq_id, + WORD32* loudness_info_count, WORD32 eq_set_id[], + FLOAT32 loudness_normalization_gain_db[], FLOAT32 loudness[]) { + WORD32 err, k, info_count = 0, pre_lim_count; + WORD32 loudness_hp_adjust_present; + WORD32 overall_loudness_info_present; + FLOAT32 pre_proc_adjust; + + k = 0; + if (drc_set_id_requested < 0) { + for (k = 0; k < num_compression_eq_count; k++) { + eq_set_id[k] = num_compression_eq_id[k]; + loudness[k] = UNDEFINED_LOUDNESS_VALUE; + loudness_normalization_gain_db[k] = 0.0f; + } + } + eq_set_id[k] = 0; + loudness[k] = UNDEFINED_LOUDNESS_VALUE; + loudness_normalization_gain_db[k] = 0.0f; + k++; + + pre_lim_count = k; + + if (pstr_drc_sel_proc_params_struct->loudness_normalization_on == 1) { + WORD32 n; + ia_loudness_info_struct* loudness_info[16]; + err = impd_find_overall_loudness_info( + pstr_drc_sel_proc_params_struct, pstr_loudness_info, + requested_dwnmix_id, drc_set_id_requested, + &overall_loudness_info_present, &info_count, loudness_info); + if (err) return (err); + + if (overall_loudness_info_present == 1) { + WORD32 requested_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; + WORD32 other_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; + WORD32 requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4; + WORD32 requested_preprocessing = 0; + + WORD32* system_bonus = measurement_system_default_tbl; + + WORD32 match_measure; + FLOAT32 method_val = 0; + + switch (pstr_drc_sel_proc_params_struct->loudness_measurement_method) { + case USER_METHOD_DEFINITION_DEFAULT: + case USER_METHOD_DEFINITION_PROGRAM_LOUDNESS: + requested_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; + other_method_definition = METHOD_DEFINITION_ANCHOR_LOUDNESS; + break; + case USER_METHOD_DEFINITION_ANCHOR_LOUDNESS: + requested_method_definition = METHOD_DEFINITION_ANCHOR_LOUDNESS; + other_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; + break; + + default: + return (UNEXPECTED_ERROR); + break; + } + + switch (pstr_drc_sel_proc_params_struct->loudness_measurement_system) { + case USER_MEASUREMENT_SYSTEM_DEFAULT: + case USER_MEASUREMENT_SYSTEM_BS_1770_4: + requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4; + system_bonus = measurement_system_bs1770_3_tbl; + break; + case USER_MEASUREMENT_SYSTEM_USER: + requested_measurement_system = MEASUREMENT_SYSTEM_USER; + system_bonus = measurement_system_user_tbl; + break; + case USER_MEASUREMENT_SYSTEM_EXPERT_PANEL: + requested_measurement_system = MEASUREMENT_SYSTEM_EXPERT_PANEL; + system_bonus = measurement_system_expert_tbl; + break; + case USER_MEASUREMENT_SYSTEM_RESERVED_A: + requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_A; + system_bonus = measurement_system_rms_a_tbl; + break; + case USER_MEASUREMENT_SYSTEM_RESERVED_B: + requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_B; + system_bonus = measurement_system_rms_b_tbl; + break; + case USER_MEASUREMENT_SYSTEM_RESERVED_C: + requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_C; + system_bonus = measurement_system_rms_c_tbl; + break; + case USER_MEASUREMENT_SYSTEM_RESERVED_D: + requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_D; + system_bonus = measurement_system_rms_d_tbl; + break; + case USER_MEASUREMENT_SYSTEM_RESERVED_E: + requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_E; + system_bonus = measurement_system_rms_e_tbl; + break; + + default: + return (UNEXPECTED_ERROR); + break; + } + + switch (pstr_drc_sel_proc_params_struct->loudness_measurement_pre_proc) { + case USER_LOUDNESS_PREPROCESSING_DEFAULT: + case USER_LOUDNESS_PREPROCESSING_OFF: + requested_preprocessing = 0; + break; + case USER_LOUDNESS_PREPROCESSING_HIGHPASS: + requested_preprocessing = 1; + break; + + default: + return (UNEXPECTED_ERROR); + break; + } + + for (k = 0; k < info_count; k++) { + match_measure = -1; + for (n = 0; n < loudness_info[k]->measurement_count; n++) { + ia_loudness_measure_struct* loudness_measure = + &(loudness_info[k]->loudness_measure[n]); + if (match_measure < + system_bonus[loudness_measure->measurement_system] && + requested_method_definition == loudness_measure->method_def) { + method_val = loudness_measure->method_val; + match_measure = system_bonus[loudness_measure->measurement_system]; + } } - } - eq_set_id[k] = 0; - loudness[k] = UNDEFINED_LOUDNESS_VALUE; - loudness_normalization_gain_db[k] = 0.0f; - k++; - - pre_lim_count = k; - - if (pstr_drc_sel_proc_params_struct->loudness_normalization_on == 1) - { - WORD32 n; - ia_loudness_info_struct* loudness_info[16]; - err = impd_find_overall_loudness_info(pstr_drc_sel_proc_params_struct, - pstr_loudness_info, - requested_dwnmix_id, - drc_set_id_requested, - &overall_loudness_info_present, - &info_count, - loudness_info); - if (err) return (err); - - if (overall_loudness_info_present == 1) - { - WORD32 requested_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; - WORD32 other_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; - WORD32 requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4; - WORD32 requested_preprocessing = 0; - - WORD32* system_bonus = measurement_system_default_tbl; - - WORD32 match_measure; - FLOAT32 method_val = 0; - - switch (pstr_drc_sel_proc_params_struct->loudness_measurement_method) { - case USER_METHOD_DEFINITION_DEFAULT: - case USER_METHOD_DEFINITION_PROGRAM_LOUDNESS: - requested_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; - other_method_definition = METHOD_DEFINITION_ANCHOR_LOUDNESS; - break; - case USER_METHOD_DEFINITION_ANCHOR_LOUDNESS: - requested_method_definition = METHOD_DEFINITION_ANCHOR_LOUDNESS; - other_method_definition = METHOD_DEFINITION_PROGRAM_LOUDNESS; - break; - - default: - return (UNEXPECTED_ERROR); - break; - } - - switch (pstr_drc_sel_proc_params_struct->loudness_measurement_system) { - case USER_MEASUREMENT_SYSTEM_DEFAULT: - case USER_MEASUREMENT_SYSTEM_BS_1770_4: - requested_measurement_system = MEASUREMENT_SYSTEM_BS_1770_4; - system_bonus = measurement_system_bs1770_3_tbl; - break; - case USER_MEASUREMENT_SYSTEM_USER: - requested_measurement_system = MEASUREMENT_SYSTEM_USER; - system_bonus = measurement_system_user_tbl; - break; - case USER_MEASUREMENT_SYSTEM_EXPERT_PANEL: - requested_measurement_system = MEASUREMENT_SYSTEM_EXPERT_PANEL; - system_bonus = measurement_system_expert_tbl; - break; - case USER_MEASUREMENT_SYSTEM_RESERVED_A: - requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_A; - system_bonus = measurement_system_rms_a_tbl; - break; - case USER_MEASUREMENT_SYSTEM_RESERVED_B: - requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_B; - system_bonus = measurement_system_rms_b_tbl; - break; - case USER_MEASUREMENT_SYSTEM_RESERVED_C: - requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_C; - system_bonus = measurement_system_rms_c_tbl; - break; - case USER_MEASUREMENT_SYSTEM_RESERVED_D: - requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_D; - system_bonus = measurement_system_rms_d_tbl; - break; - case USER_MEASUREMENT_SYSTEM_RESERVED_E: - requested_measurement_system = USER_MEASUREMENT_SYSTEM_RESERVED_E; - system_bonus = measurement_system_rms_e_tbl; - break; - - default: - return (UNEXPECTED_ERROR); - break; - } - - switch (pstr_drc_sel_proc_params_struct->loudness_measurement_pre_proc) { - case USER_LOUDNESS_PREPROCESSING_DEFAULT: - case USER_LOUDNESS_PREPROCESSING_OFF: - requested_preprocessing = 0; - break; - case USER_LOUDNESS_PREPROCESSING_HIGHPASS: - requested_preprocessing = 1; - break; - - default: - return (UNEXPECTED_ERROR); - break; + if (match_measure == -1) { + for (n = 0; n < loudness_info[k]->measurement_count; n++) { + ia_loudness_measure_struct* loudness_measure = + &(loudness_info[k]->loudness_measure[n]); + if (match_measure < + system_bonus[loudness_measure->measurement_system] && + other_method_definition == loudness_measure->method_def) { + method_val = loudness_measure->method_val; + match_measure = + system_bonus[loudness_measure->measurement_system]; } + } + } - for (k=0; k<info_count; k++) - { - match_measure = -1; - for (n=0; n<loudness_info[k]->measurement_count; n++) - { - ia_loudness_measure_struct* loudness_measure = &(loudness_info[k]->loudness_measure[n]); - if (match_measure < system_bonus[loudness_measure->measurement_system] && requested_method_definition == loudness_measure->method_def) - { - method_val = loudness_measure->method_val; - match_measure = system_bonus[loudness_measure->measurement_system]; - } - } - if (match_measure == -1) - { - for (n=0; n<loudness_info[k]->measurement_count; n++) - { - ia_loudness_measure_struct* loudness_measure = &(loudness_info[k]->loudness_measure[n]); - if (match_measure < system_bonus[loudness_measure->measurement_system] && other_method_definition == loudness_measure->method_def) - { - method_val = loudness_measure->method_val; - match_measure = system_bonus[loudness_measure->measurement_system]; - } - } - } - - if (requested_preprocessing == 1) - { - err = impd_find_high_pass_loudness_adjust(pstr_loudness_info, requested_dwnmix_id, drc_set_id_requested, pstr_drc_sel_proc_params_struct->album_mode, (FLOAT32)pstr_drc_sel_proc_params_struct->device_cut_off_frequency, - &loudness_hp_adjust_present, &pre_proc_adjust); - if (err) return (err); - - if (loudness_hp_adjust_present == 0) - { - pre_proc_adjust = -2.0f; - } - method_val += pre_proc_adjust; - } + if (requested_preprocessing == 1) { + err = impd_find_high_pass_loudness_adjust( + pstr_loudness_info, requested_dwnmix_id, drc_set_id_requested, + pstr_drc_sel_proc_params_struct->album_mode, + (FLOAT32) + pstr_drc_sel_proc_params_struct->device_cut_off_frequency, + &loudness_hp_adjust_present, &pre_proc_adjust); + if (err) return (err); + + if (loudness_hp_adjust_present == 0) { + pre_proc_adjust = -2.0f; + } + method_val += pre_proc_adjust; + } - eq_set_id[k] = 0; + eq_set_id[k] = 0; - loudness_normalization_gain_db[k] = pstr_drc_sel_proc_params_struct->target_loudness - method_val; - loudness[k] = method_val; - } - } - } - if (info_count > 0) - { - *loudness_info_count = info_count; - } - else - { - *loudness_info_count = pre_lim_count; + loudness_normalization_gain_db[k] = + pstr_drc_sel_proc_params_struct->target_loudness - method_val; + loudness[k] = method_val; + } } + } + if (info_count > 0) { + *loudness_info_count = info_count; + } else { + *loudness_info_count = pre_lim_count; + } - return (0); + return (0); } - #define MIXING_LEVEL_DEFAULT 85.0f WORD32 -impd_mixing_level_info(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - 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 n, k, info_count; - WORD32 album_mode = pstr_drc_sel_proc_params_struct->album_mode; - WORD32 loudness_drc_set_id_requested; - ia_loudness_info_struct* loudness_info; - - *mixing_level = MIXING_LEVEL_DEFAULT; - if (drc_set_id_requested < 0) - { - loudness_drc_set_id_requested = 0; - } - else - { - loudness_drc_set_id_requested = drc_set_id_requested; - } - if (album_mode == 1) - { - info_count = pstr_loudness_info->loudness_info_album_count; - loudness_info = pstr_loudness_info->str_loudness_info_album; - } - else - { - info_count = pstr_loudness_info->loudness_info_count; - loudness_info = pstr_loudness_info->loudness_info; - } - for (n=0; n<info_count; n++) - { - if ((requested_dwnmix_id == loudness_info[n].downmix_id) || (ID_FOR_ANY_DOWNMIX == loudness_info[n].downmix_id)) - { - if (loudness_drc_set_id_requested == loudness_info[n].drc_set_id) - { - if (eq_set_id_requested == loudness_info[n].eq_set_id) - { - for (k=0; k<loudness_info[n].measurement_count; k++) - { - if (loudness_info[n].loudness_measure[k].method_def == METHOD_DEFINITION_MIXING_LEVEL) - { - *mixing_level = loudness_info[n].loudness_measure[k].method_val; - break; - } - } - } +impd_mixing_level_info( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + 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 n, k, info_count; + WORD32 album_mode = pstr_drc_sel_proc_params_struct->album_mode; + WORD32 loudness_drc_set_id_requested; + ia_loudness_info_struct* loudness_info; + + *mixing_level = MIXING_LEVEL_DEFAULT; + if (drc_set_id_requested < 0) { + loudness_drc_set_id_requested = 0; + } else { + loudness_drc_set_id_requested = drc_set_id_requested; + } + if (album_mode == 1) { + info_count = pstr_loudness_info->loudness_info_album_count; + loudness_info = pstr_loudness_info->str_loudness_info_album; + } else { + info_count = pstr_loudness_info->loudness_info_count; + loudness_info = pstr_loudness_info->loudness_info; + } + for (n = 0; n < info_count; n++) { + if ((requested_dwnmix_id == loudness_info[n].downmix_id) || + (ID_FOR_ANY_DOWNMIX == loudness_info[n].downmix_id)) { + if (loudness_drc_set_id_requested == loudness_info[n].drc_set_id) { + if (eq_set_id_requested == loudness_info[n].eq_set_id) { + for (k = 0; k < loudness_info[n].measurement_count; k++) { + if (loudness_info[n].loudness_measure[k].method_def == + METHOD_DEFINITION_MIXING_LEVEL) { + *mixing_level = loudness_info[n].loudness_measure[k].method_val; + break; } + } } + } } - return(0); + } + return (0); } diff --git a/decoder/drc_src/impd_drc_loudness_control.h b/decoder/drc_src/impd_drc_loudness_control.h index 0cdfcb3..76acc26 100644 --- a/decoder/drc_src/impd_drc_loudness_control.h +++ b/decoder/drc_src/impd_drc_loudness_control.h @@ -25,80 +25,68 @@ extern "C" { #endif /* __cplusplus */ WORD32 -impd_mixing_level_info(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - 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); +impd_mixing_level_info( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + 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[]); + 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(ia_loudness_info_struct* loudness_info, - WORD32 dyn_range_measurement_type, - WORD32 * loudness_peak_2_avg_value_present, - FLOAT32* loudness_peak_2_avg_value); +impd_extract_loudness_peak_to_average_info( + ia_loudness_info_struct* loudness_info, WORD32 dyn_range_measurement_type, + WORD32* loudness_peak_2_avg_value_present, + FLOAT32* loudness_peak_2_avg_value); WORD32 impd_loudness_peak_to_average_info( - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_instructions_struct* str_drc_instruction_str, - WORD32 requested_dwnmix_id, - WORD32 dyn_range_measurement_type, - WORD32 album_mode, - WORD32* loudness_peak_2_avg_value_present, - FLOAT32* loudness_peak_2_avg_value); + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_instructions_struct* str_drc_instruction_str, + WORD32 requested_dwnmix_id, WORD32 dyn_range_measurement_type, + WORD32 album_mode, WORD32* loudness_peak_2_avg_value_present, + FLOAT32* loudness_peak_2_avg_value); WORD32 -impd_overall_loudness_present( ia_loudness_info_struct* loudness_info, +impd_overall_loudness_present(ia_loudness_info_struct* loudness_info, WORD32* loudness_info_present); WORD32 -impd_find_overall_loudness_info(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32* overall_loudness_info_present, - WORD32* loudness_info_count, - ia_loudness_info_struct* loudness_info[]); +impd_find_overall_loudness_info( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, + WORD32* overall_loudness_info_present, WORD32* loudness_info_count, + ia_loudness_info_struct* loudness_info[]); WORD32 -impd_high_pass_loudness_adjust_info( ia_loudness_info_struct* loudness_info, - WORD32* loudness_hp_adjust_present, - FLOAT32* loudness_hp_adjust); +impd_high_pass_loudness_adjust_info(ia_loudness_info_struct* loudness_info, + WORD32* loudness_hp_adjust_present, + FLOAT32* loudness_hp_adjust); WORD32 impd_find_high_pass_loudness_adjust( - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32 album_mode, - FLOAT32 device_cutoff_freq, - WORD32* loudness_hp_adjust_present, - FLOAT32* loudness_hp_adjust); + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, WORD32 album_mode, + FLOAT32 device_cutoff_freq, WORD32* loudness_hp_adjust_present, + FLOAT32* loudness_hp_adjust); WORD32 -impd_init_loudness_control (ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32 num_compression_eq_count, - WORD32* num_compression_eq_id, - WORD32* loudness_info_count, - WORD32 eq_set_id[], - FLOAT32 loudness_normalization_gain_db[], - FLOAT32 loudness[]); +impd_init_loudness_control( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 requested_dwnmix_id, WORD32 drc_set_id_requested, + WORD32 num_compression_eq_count, WORD32* num_compression_eq_id, + WORD32* loudness_info_count, WORD32 eq_set_id[], + FLOAT32 loudness_normalization_gain_db[], FLOAT32 loudness[]); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_main_qmf_process.c b/decoder/drc_src/impd_drc_main_qmf_process.c index 9426eb6..3c4e711 100644 --- a/decoder/drc_src/impd_drc_main_qmf_process.c +++ b/decoder/drc_src/impd_drc_main_qmf_process.c @@ -41,197 +41,214 @@ #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; - } - } +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; - return 0; -} + if (input_audio == 0) return 0; -WORD32 impd_init_process_audio_main_qmf (ia_drc_api_struct *p_obj_drc) + if (num_target_ch > MAX_CHANNEL_COUNT) return -1; -{ - 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 (num_target_ch > num_base_ch) return -1; - 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]; + 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]; } } - - 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; + 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) - - - - - 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; - } - } +{ + 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_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; - - } - + } + + 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; + } } - return error; - + } + + 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 index c2fcc73..c1e89e1 100644 --- a/decoder/drc_src/impd_drc_main_stft_process.c +++ b/decoder/drc_src/impd_drc_main_stft_process.c @@ -39,194 +39,216 @@ #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; - } - } +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; - 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 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; + 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]; } - - 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_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; + } + + 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; + } } - - - 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; - } - } + } + + 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]; } - - 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; - - } - + } + 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; + 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 49dcba2..6449531 100644 --- a/decoder/drc_src/impd_drc_main_td_process.c +++ b/decoder/drc_src/impd_drc_main_td_process.c @@ -41,274 +41,285 @@ #include "impd_drc_hashdefines.h" #include "impd_drc_peak_limiter.h" -static IA_ERRORCODE 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; - } +static IA_ERRORCODE 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]; + } } - - - return IA_NO_ERROR; -} - -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; - return IA_NO_ERROR; + for (o_ch = 0; o_ch < num_target_ch; o_ch++) { + input_audio[o_ch][i] = tmp_out[o_ch]; } - - err_code = impd_process_drc_bitstream_dec_gain(p_obj_drc->str_payload.pstr_bitstream_dec, - p_obj_drc->pstr_bit_buf, - p_obj_drc->str_payload.pstr_drc_config, - p_obj_drc->str_payload.pstr_drc_gain, - &p_obj_drc->str_bit_handler.it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], - p_obj_drc->str_bit_handler.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; - 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; + for (; o_ch < num_base_ch; o_ch++) { + input_audio[o_ch][i] = 0.0f; } + } - 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; - } - } - } + return IA_NO_ERROR; +} - num_sample_to_process=(p_obj_drc->p_state->ui_in_bytes/p_obj_drc->str_config.num_ch_in/(p_obj_drc->str_config.pcm_size>>3)); +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; + return IA_NO_ERROR; + } + + err_code = impd_process_drc_bitstream_dec_gain( + p_obj_drc->str_payload.pstr_bitstream_dec, p_obj_drc->pstr_bit_buf, + p_obj_drc->str_payload.pstr_drc_config, + p_obj_drc->str_payload.pstr_drc_gain, + &p_obj_drc->str_bit_handler + .it_bit_buf[p_obj_drc->str_bit_handler.byte_index_bs], + p_obj_drc->str_bit_handler.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; + 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; + } + } + } - p_obj_drc->str_config.frame_size = num_sample_to_process; + num_sample_to_process = + (p_obj_drc->p_state->ui_in_bytes / p_obj_drc->str_config.num_ch_in / + (p_obj_drc->str_config.pcm_size >> 3)); - if(num_sample_to_process<p_obj_drc->str_config.frame_size) - last_frame=1; + p_obj_drc->str_config.frame_size = num_sample_to_process; - if(p_obj_drc->str_config.pcm_size==16) - { - 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); + if (num_sample_to_process < p_obj_drc->str_config.frame_size) last_frame = 1; - for(j=0;j<num_sample_to_process;j++) - { + if (p_obj_drc->str_config.pcm_size == 16) { + 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); - audio_buff[i][j]=((FLOAT32)input_buffer16[j*p_obj_drc->str_config.num_ch_in + i])/32767.0f; - } - } + for (j = 0; j < num_sample_to_process; j++) { + audio_buff[i][j] = + ((FLOAT32)input_buffer16[j * p_obj_drc->str_config.num_ch_in + i]) / + 32767.0f; + } } - else - { - 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++) - { - audio_buff[i][j]=input_buffer[j*p_obj_drc->str_config.num_ch_in + i]; - } - } + } else { + 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++) { + audio_buff[i][j] = + input_buffer[j * p_obj_drc->str_config.num_ch_in + i]; + } } - - err_code = impd_drc_process_time_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_buff, - 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 (err_code!=IA_NO_ERROR) - return err_code; - - if(p_obj_drc->str_payload.pstr_drc_sel_proc_output->downmix_matrix_present!=0) - err_code = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, - audio_buff, - p_obj_drc->str_config.frame_size); - - if (err_code!=IA_NO_ERROR) - return err_code; - - err_code = impd_drc_process_time_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_buff, - 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 (err_code!=IA_NO_ERROR) - return err_code; - - if (p_obj_drc->str_payload.pstr_drc_sel_proc_output->loudness_normalization_gain_db != 0.0f) - { - FLOAT32 gain_value = (FLOAT32)pow(10.0,p_obj_drc->str_payload.pstr_drc_sel_proc_output->loudness_normalization_gain_db/20.0); - for (i=0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j=0; j < p_obj_drc->str_config.frame_size; j++) { - audio_buff[i][j] *= gain_value; - } - } + } + + err_code = impd_drc_process_time_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_buff, + 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 (err_code != IA_NO_ERROR) return err_code; + + if (p_obj_drc->str_payload.pstr_drc_sel_proc_output->downmix_matrix_present != + 0) + err_code = impd_down_mix(p_obj_drc->str_payload.pstr_drc_sel_proc_output, + audio_buff, p_obj_drc->str_config.frame_size); + + if (err_code != IA_NO_ERROR) return err_code; + + err_code = impd_drc_process_time_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_buff, + 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 (err_code != IA_NO_ERROR) return err_code; + + if (p_obj_drc->str_payload.pstr_drc_sel_proc_output + ->loudness_normalization_gain_db != 0.0f) { + FLOAT32 gain_value = + (FLOAT32)pow(10.0, p_obj_drc->str_payload.pstr_drc_sel_proc_output + ->loudness_normalization_gain_db / + 20.0); + for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { + for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { + audio_buff[i][j] *= gain_value; + } + } + } + + if (p_obj_drc->str_config.peak_limiter) { + 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_buff[i][j]; + } } - if (p_obj_drc->str_config.peak_limiter) - { - 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_buff[i][j]; - } - } - - err_code=impd_limiter_process(p_obj_drc->str_payload.pstr_peak_limiter, - output_buffer, - p_obj_drc->str_config.frame_size); - + 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; + if (err_code != IA_NO_ERROR) return err_code; - for (i=0; i < p_obj_drc->str_config.num_ch_out; i++) { - for (j=0; j < p_obj_drc->str_config.frame_size; j++) { - audio_buff[i][j] = output_buffer[j*p_obj_drc->str_config.num_ch_out + i]; - } - } + for (i = 0; i < p_obj_drc->str_config.num_ch_out; i++) { + for (j = 0; j < p_obj_drc->str_config.frame_size; j++) { + audio_buff[i][j] = + output_buffer[j * p_obj_drc->str_config.num_ch_out + i]; + } } + } - if(p_obj_drc->str_config.pcm_size==16) - { - 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) - output_buffer16[j*p_obj_drc->str_config.num_ch_out + i] = -32767; - - else if (audio_buff[i][j]>1.0f) - output_buffer16[j*p_obj_drc->str_config.num_ch_out + i] = 32767; - - else - output_buffer16[j*p_obj_drc->str_config.num_ch_out + i] = (WORD16)(audio_buff[i][j]*32767.0f); - } - } - } - else - { - 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_buff[i][j]; - } - } - } + if (p_obj_drc->str_config.pcm_size == 16) { + 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) + output_buffer16[j * p_obj_drc->str_config.num_ch_out + i] = -32767; - 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); + else if (audio_buff[i][j] > 1.0f) + output_buffer16[j * p_obj_drc->str_config.num_ch_out + i] = 32767; - if(p_obj_drc->p_state->delay_in_output!=0){ - 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)*(p_obj_drc->str_config.pcm_size>>3); - if(p_obj_drc->str_config.pcm_size==16) - memcpy(output_buffer16,(output_buffer16+(p_obj_drc->p_state->delay_in_output*p_obj_drc->str_config.num_ch_out)),p_obj_drc->p_state->ui_out_bytes); else - memcpy(output_buffer,(output_buffer+(p_obj_drc->p_state->delay_in_output*p_obj_drc->str_config.num_ch_out)),p_obj_drc->p_state->ui_out_bytes); - - p_obj_drc->p_state->delay_adjust_samples = p_obj_drc->p_state->delay_in_output; - p_obj_drc->p_state->delay_in_output=0; - + output_buffer16[j * p_obj_drc->str_config.num_ch_out + i] = + (WORD16)(audio_buff[i][j] * 32767.0f); + } } - if(last_frame==1) - { - if((num_sample_to_process+p_obj_drc->p_state->delay_adjust_samples)<=p_obj_drc->str_config.frame_size) - p_obj_drc->p_state->ui_out_bytes = (num_sample_to_process+p_obj_drc->p_state->delay_adjust_samples)*p_obj_drc->str_config.num_ch_out*(p_obj_drc->str_config.pcm_size>>3); - else - p_obj_drc->p_state->ui_out_bytes = (p_obj_drc->str_config.frame_size)*p_obj_drc->str_config.num_ch_out*(p_obj_drc->str_config.pcm_size>>3); - + } else { + 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_buff[i][j]; + } } - - 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; - - } + } + + 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->p_state->delay_in_output != 0) { + 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) * + (p_obj_drc->str_config.pcm_size >> 3); + if (p_obj_drc->str_config.pcm_size == 16) + memcpy(output_buffer16, + (output_buffer16 + (p_obj_drc->p_state->delay_in_output * + p_obj_drc->str_config.num_ch_out)), + p_obj_drc->p_state->ui_out_bytes); + else + memcpy(output_buffer, + (output_buffer + (p_obj_drc->p_state->delay_in_output * + p_obj_drc->str_config.num_ch_out)), + p_obj_drc->p_state->ui_out_bytes); + + p_obj_drc->p_state->delay_adjust_samples = + p_obj_drc->p_state->delay_in_output; + p_obj_drc->p_state->delay_in_output = 0; + } + if (last_frame == 1) { + if ((num_sample_to_process + p_obj_drc->p_state->delay_adjust_samples) <= + p_obj_drc->str_config.frame_size) + p_obj_drc->p_state->ui_out_bytes = + (num_sample_to_process + p_obj_drc->p_state->delay_adjust_samples) * + p_obj_drc->str_config.num_ch_out * + (p_obj_drc->str_config.pcm_size >> 3); + else + p_obj_drc->p_state->ui_out_bytes = (p_obj_drc->str_config.frame_size) * + 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; + 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 index 91a3690..2697c54 100644 --- a/decoder/drc_src/impd_drc_main_td_qmf_process.c +++ b/decoder/drc_src/impd_drc_main_td_qmf_process.c @@ -39,333 +39,326 @@ #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]; -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; + 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 = 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++ ) { + 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]; - + 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 < 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 < 10 * QMF_FILT_RESOLUTION; i++) { + W[i] = U[i] * qmf_filter_coeff[i]; } - - for ( i=0; i<QMF_FILT_RESOLUTION; 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]; + for (j = 0; j < 10; j++) { + tmp = tmp + W[QMF_FILT_RESOLUTION * j + i]; } - output[i] = (FLOAT32) tmp; + 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]; -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 = 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 = 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 < 10 * QMF_FILT_RESOLUTION; i++) { + Z[i] = (FLOAT32)(buff[i] * qmf_filter_coeff[i]); } - for ( i=0; i<2*QMF_FILT_RESOLUTION; i++ ) { + for (i = 0; i < 2 * QMF_FILT_RESOLUTION; i++) { Y[i] = 0.0f; - for ( j=0; j<5; j++ ) { + for (j = 0; j < 5; j++) { Y[i] += Z[i + j * 2 * QMF_FILT_RESOLUTION]; } } - for ( i=0; i<QMF_FILT_RESOLUTION; i++ ) { + 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]); + 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]; -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; -} - + 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 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; - + 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; + } - 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; + 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]; } - 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; + } + } + } - 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); + 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; + } + } + } - if (error > PROC_COMPLETE) return -1; + num_samples_per_channel = p_obj_drc->str_config.frame_size; - 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_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); - 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; - -} + 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; + return error; } - diff --git a/decoder/drc_src/impd_drc_multi_band.h b/decoder/drc_src/impd_drc_multi_band.h index 0352ca9..4d51d80 100644 --- a/decoder/drc_src/impd_drc_multi_band.h +++ b/decoder/drc_src/impd_drc_multi_band.h @@ -20,51 +20,45 @@ #ifndef IMPD_DRC_MULTI_BAND_H #define IMPD_DRC_MULTI_BAND_H -#define DRC_SUBBAND_COUNT_WITH_AUDIO_CODEC_FILTERBANK_MAX FILTER_BANK_PARAMETER_COUNT +#define DRC_SUBBAND_COUNT_WITH_AUDIO_CODEC_FILTERBANK_MAX \ + FILTER_BANK_PARAMETER_COUNT #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct { - FLOAT32 overlap_weight[AUDIO_CODEC_SUBBAND_COUNT_MAX]; + FLOAT32 overlap_weight[AUDIO_CODEC_SUBBAND_COUNT_MAX]; } ia_band_overlap_params_struct; typedef struct { - ia_band_overlap_params_struct str_band_overlap_params[BAND_COUNT_MAX]; + ia_band_overlap_params_struct str_band_overlap_params[BAND_COUNT_MAX]; } ia_group_overlap_params_struct; typedef struct { - ia_group_overlap_params_struct str_group_overlap_params[CHANNEL_GROUP_COUNT_MAX]; + ia_group_overlap_params_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); +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); +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 (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); +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 ( 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); - +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); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_multiband.c b/decoder/drc_src/impd_drc_multiband.c index 9acb747..fc60745 100644 --- a/decoder/drc_src/impd_drc_multiband.c +++ b/decoder/drc_src/impd_drc_multiband.c @@ -30,157 +30,139 @@ #include "impd_drc_rom.h" IA_ERRORCODE 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); + 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); } -IA_ERRORCODE 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; - FLOAT32 norm = 0.05f * filter_slope * inv_log10_2; +IA_ERRORCODE 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; + FLOAT32 norm = 0.05f * filter_slope * inv_log10_2; - for (i=0; i<num_sub_bands; i++) - { - if (fcenter_norm_subband[i] < fcross_norm_lo) - { - response[i] = (FLOAT32)pow (10.0, norm * log10(fcross_norm_lo / fcenter_norm_subband[i])); - } - else if (fcenter_norm_subband[i] < fcross_norm_hi) - { - response[i] = 1.0f; - } - else - { - response[i] = (FLOAT32)pow (10.0, norm * log10(fcenter_norm_subband[i] / fcross_norm_hi)); - } + for (i = 0; i < num_sub_bands; i++) { + if (fcenter_norm_subband[i] < fcross_norm_lo) { + response[i] = (FLOAT32)pow( + 10.0, norm * log10(fcross_norm_lo / fcenter_norm_subband[i])); + } else if (fcenter_norm_subband[i] < fcross_norm_hi) { + response[i] = 1.0f; + } else { + response[i] = (FLOAT32)pow( + 10.0, norm * log10(fcenter_norm_subband[i] / fcross_norm_hi)); } - return (0); + } + return (0); } +IA_ERRORCODE 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); -IA_ERRORCODE 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); - - if (drc_band_type == 1) { - fcross_norm_lo = 0.0f; - for (b=0; b<num_drc_bands; b++) - { - if (b<num_drc_bands - 1) - { - fcross_norm_hi = normal_cross_freq[gain_params[b+1].crossover_freq_idx].f_cross_norm; - } - else - { - fcross_norm_hi = 0.5f; - } - impd_generate_slope (dec_subband_count, - fcenter_norm_subband, - fcross_norm_lo, - fcross_norm_hi, - pstr_group_overlap_params->str_band_overlap_params[b].overlap_weight); - - fcross_norm_lo = fcross_norm_hi; - } - for (s=0; s<dec_subband_count; s++) - { - w_norm[s] = pstr_group_overlap_params->str_band_overlap_params[0].overlap_weight[s]; - for (b=1; b<num_drc_bands; b++) - { - w_norm[s] += pstr_group_overlap_params->str_band_overlap_params[b].overlap_weight[s]; - } - } + if (drc_band_type == 1) { + fcross_norm_lo = 0.0f; + for (b = 0; b < num_drc_bands; b++) { + if (b < num_drc_bands - 1) { + fcross_norm_hi = + normal_cross_freq[gain_params[b + 1].crossover_freq_idx] + .f_cross_norm; + } else { + fcross_norm_hi = 0.5f; + } + impd_generate_slope( + dec_subband_count, fcenter_norm_subband, fcross_norm_lo, + fcross_norm_hi, + pstr_group_overlap_params->str_band_overlap_params[b].overlap_weight); - for (s=0; s<dec_subband_count; s++) - { - for (b=0; b<num_drc_bands; b++) - { - pstr_group_overlap_params->str_band_overlap_params[b].overlap_weight[s] /= w_norm[s]; - } - } - } else { - start_subband_index = 0; - for (b=0; b<num_drc_bands; b++) - { - if (b < num_drc_bands-1) - { - stop_sub_band_index = gain_params[b+1].start_subband_index-1; - } - else - { - stop_sub_band_index = dec_subband_count-1; - } - for (s=0; s<dec_subband_count; s++) - { - if (s >= start_subband_index && s <= stop_sub_band_index) - { - pstr_group_overlap_params->str_band_overlap_params[b].overlap_weight[s] = 1.0; - } - else - { - pstr_group_overlap_params->str_band_overlap_params[b].overlap_weight[s] = 0.0; - } - } - start_subband_index = stop_sub_band_index+1; - } + fcross_norm_lo = fcross_norm_hi; } - - return (0); -} - -IA_ERRORCODE 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 dec_subband_count = 0; - switch (sub_band_domain_mode) { - case SUBBAND_DOMAIN_MODE_QMF64: - dec_subband_count = AUDIO_CODEC_SUBBAND_COUNT_QMF64; - break; - case SUBBAND_DOMAIN_MODE_QMF71: - dec_subband_count = AUDIO_CODEC_SUBBAND_COUNT_QMF71; - break; - case SUBBAND_DOMAIN_MODE_STFT256: - dec_subband_count = AUDIO_CODEC_SUBBAND_COUNT_STFT256; - break; + for (s = 0; s < dec_subband_count; s++) { + w_norm[s] = pstr_group_overlap_params->str_band_overlap_params[0] + .overlap_weight[s]; + for (b = 1; b < num_drc_bands; b++) { + w_norm[s] += pstr_group_overlap_params->str_band_overlap_params[b] + .overlap_weight[s]; + } } - 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(str_drc_instruction_str->band_count_of_ch_group[g], - str_p_loc_drc_coefficients_uni_drc->gain_set_params[str_drc_instruction_str->gain_set_index_for_channel_group[g]].drc_band_type, - str_p_loc_drc_coefficients_uni_drc->gain_set_params[str_drc_instruction_str->gain_set_index_for_channel_group[g]].gain_params, - dec_subband_count, - &(pstr_overlap_params->str_group_overlap_params[g])); - if (err) return (err); + for (s = 0; s < dec_subband_count; s++) { + for (b = 0; b < num_drc_bands; b++) { + pstr_group_overlap_params->str_band_overlap_params[b] + .overlap_weight[s] /= w_norm[s]; + } + } + } else { + start_subband_index = 0; + for (b = 0; b < num_drc_bands; b++) { + if (b < num_drc_bands - 1) { + stop_sub_band_index = gain_params[b + 1].start_subband_index - 1; + } else { + stop_sub_band_index = dec_subband_count - 1; + } + for (s = 0; s < dec_subband_count; s++) { + if (s >= start_subband_index && s <= stop_sub_band_index) { + pstr_group_overlap_params->str_band_overlap_params[b] + .overlap_weight[s] = 1.0; + } else { + pstr_group_overlap_params->str_band_overlap_params[b] + .overlap_weight[s] = 0.0; } + } + start_subband_index = stop_sub_band_index + 1; } + } - return (0); + return (0); } +IA_ERRORCODE 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 dec_subband_count = 0; + switch (sub_band_domain_mode) { + case SUBBAND_DOMAIN_MODE_QMF64: + dec_subband_count = AUDIO_CODEC_SUBBAND_COUNT_QMF64; + break; + case SUBBAND_DOMAIN_MODE_QMF71: + dec_subband_count = AUDIO_CODEC_SUBBAND_COUNT_QMF71; + break; + case SUBBAND_DOMAIN_MODE_STFT256: + dec_subband_count = AUDIO_CODEC_SUBBAND_COUNT_STFT256; + break; + } + 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( + str_drc_instruction_str->band_count_of_ch_group[g], + str_p_loc_drc_coefficients_uni_drc + ->gain_set_params[str_drc_instruction_str + ->gain_set_index_for_channel_group[g]] + .drc_band_type, + str_p_loc_drc_coefficients_uni_drc + ->gain_set_params[str_drc_instruction_str + ->gain_set_index_for_channel_group[g]] + .gain_params, + dec_subband_count, + &(pstr_overlap_params->str_group_overlap_params[g])); + if (err) return (err); + } + } + return (0); +} diff --git a/decoder/drc_src/impd_drc_parametric_dec.c b/decoder/drc_src/impd_drc_parametric_dec.c index 4e37d94..5b3cb4e 100644 --- a/decoder/drc_src/impd_drc_parametric_dec.c +++ b/decoder/drc_src/impd_drc_parametric_dec.c @@ -29,1003 +29,1084 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" - #define PI 3.14159265f #ifndef max -#define max(a, b) (((a) > (b)) ? (a) : (b)) +#define max(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min -#define min(a, b) (((a) < (b)) ? (a) : (b)) +#define min(a, b) (((a) < (b)) ? (a) : (b)) #endif +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}; + 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; -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}; - 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; + p_parametricdrc_params->sub_band_count = + sub_band_count_tbl[sub_band_domain_mode]; - p_parametricdrc_params->sub_band_count=sub_band_count_tbl[sub_band_domain_mode]; - - return 0; + return 0; } -WORD32 impd_init_parametric_drc_feed_fwd(ia_drc_config* pstr_drc_config, - WORD32 instance_idx, - WORD32 ch_count_from_dwnmix_id, - ia_parametric_drc_params_struct* p_parametricdrc_params) -{ - WORD32 err = 0, i = 0; - - WORD32 parametric_drc_idx = p_parametricdrc_params->parametric_drc_idx[instance_idx]; - WORD32 gain_set_index = p_parametricdrc_params->gain_set_index[instance_idx]; - WORD32* channel_map = p_parametricdrc_params->channel_map[instance_idx]; - - ia_drc_coeff_parametric_drc_struct* hDrcCoefficientsParametricDrcBs = &(pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc); - ia_parametric_drc_type_feed_forward_struct* hParametricDrcTypeFeedForwardBs = &(pstr_drc_config->str_drc_config_ext.str_parametric_drc_instructions[parametric_drc_idx].str_parametric_drc_type_feed_forward); - ia_parametric_drc_type_ff_params_struct* pstr_parametric_ffwd_type_drc_params = &(p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].str_parametric_drc_type_ff_params); - - /* level estimation */ - pstr_parametric_ffwd_type_drc_params->frame_size = p_parametricdrc_params->parametric_drc_frame_size; - pstr_parametric_ffwd_type_drc_params->sub_band_domain_mode = p_parametricdrc_params->sub_band_domain_mode; - pstr_parametric_ffwd_type_drc_params->sub_band_count = p_parametricdrc_params->sub_band_count; - pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type = 0; - - if (pstr_parametric_ffwd_type_drc_params->sub_band_domain_mode == SUBBAND_DOMAIN_MODE_QMF64) - { - if (p_parametricdrc_params->sampling_rate == 48000) - { - pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type = 1; - } - else - { - /* support of other sampling rates than 48000 might be missing */ - return UNEXPECTED_ERROR; - } - } - - pstr_parametric_ffwd_type_drc_params->audio_num_chan = p_parametricdrc_params->audio_num_chan; - pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type = hParametricDrcTypeFeedForwardBs->level_estim_k_weighting_type; - pstr_parametric_ffwd_type_drc_params->level_estim_integration_time = hParametricDrcTypeFeedForwardBs->level_estim_integration_time; - pstr_parametric_ffwd_type_drc_params->level_estim_frame_index = 0; - pstr_parametric_ffwd_type_drc_params->level_estim_frame_count = hParametricDrcTypeFeedForwardBs->level_estim_integration_time/pstr_parametric_ffwd_type_drc_params->frame_size; - - - memset(pstr_parametric_ffwd_type_drc_params->level,0,PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX*sizeof(FLOAT32)); - - if (ch_count_from_dwnmix_id != 0) - { - - memcpy(pstr_parametric_ffwd_type_drc_params->level_estim_ch_weight, - hDrcCoefficientsParametricDrcBs->str_parametric_drc_gain_set_params[gain_set_index].level_estim_ch_weight,ch_count_from_dwnmix_id*sizeof(FLOAT32)); - } - else - { - - for (i=0; i<pstr_parametric_ffwd_type_drc_params->audio_num_chan; i++) - { - pstr_parametric_ffwd_type_drc_params->level_estim_ch_weight[i] = (FLOAT32)channel_map[i]; - } - - } - - if (pstr_parametric_ffwd_type_drc_params->sub_band_domain_mode==SUBBAND_DOMAIN_MODE_OFF) - { - err = impd_init_lvl_est_filt_time(pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type, - p_parametricdrc_params->sampling_rate, - &pstr_parametric_ffwd_type_drc_params->pre_filt_coeff, - &pstr_parametric_ffwd_type_drc_params->rlb_filt_coeff); - - if (err) - return (err); +WORD32 impd_init_parametric_drc_feed_fwd( + ia_drc_config* pstr_drc_config, WORD32 instance_idx, + WORD32 ch_count_from_dwnmix_id, + ia_parametric_drc_params_struct* p_parametricdrc_params) { + WORD32 err = 0, i = 0; + + WORD32 parametric_drc_idx = + p_parametricdrc_params->parametric_drc_idx[instance_idx]; + WORD32 gain_set_index = p_parametricdrc_params->gain_set_index[instance_idx]; + WORD32* channel_map = p_parametricdrc_params->channel_map[instance_idx]; + + ia_drc_coeff_parametric_drc_struct* hDrcCoefficientsParametricDrcBs = + &(pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc); + ia_parametric_drc_type_feed_forward_struct* hParametricDrcTypeFeedForwardBs = + &(pstr_drc_config->str_drc_config_ext + .str_parametric_drc_instructions[parametric_drc_idx] + .str_parametric_drc_type_feed_forward); + ia_parametric_drc_type_ff_params_struct* + pstr_parametric_ffwd_type_drc_params = + &(p_parametricdrc_params + ->str_parametric_drc_instance_params[instance_idx] + .str_parametric_drc_type_ff_params); + + /* level estimation */ + pstr_parametric_ffwd_type_drc_params->frame_size = + p_parametricdrc_params->parametric_drc_frame_size; + pstr_parametric_ffwd_type_drc_params->sub_band_domain_mode = + p_parametricdrc_params->sub_band_domain_mode; + pstr_parametric_ffwd_type_drc_params->sub_band_count = + p_parametricdrc_params->sub_band_count; + pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type = 0; + + if (pstr_parametric_ffwd_type_drc_params->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_QMF64) { + if (p_parametricdrc_params->sampling_rate == 48000) { + pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type = 1; + } else { + /* support of other sampling rates than 48000 might be missing */ + return UNEXPECTED_ERROR; } - else - { - err = impd_init_lvl_est_filt_subband(pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type, - p_parametricdrc_params->sampling_rate, - p_parametricdrc_params->sub_band_domain_mode, - p_parametricdrc_params->sub_band_count, - pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type, - pstr_parametric_ffwd_type_drc_params->weighting_filt, - &pstr_parametric_ffwd_type_drc_params->filt_coeff_subband); - - if (err) - return (err); + } + + pstr_parametric_ffwd_type_drc_params->audio_num_chan = + p_parametricdrc_params->audio_num_chan; + pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type = + hParametricDrcTypeFeedForwardBs->level_estim_k_weighting_type; + pstr_parametric_ffwd_type_drc_params->level_estim_integration_time = + hParametricDrcTypeFeedForwardBs->level_estim_integration_time; + pstr_parametric_ffwd_type_drc_params->level_estim_frame_index = 0; + pstr_parametric_ffwd_type_drc_params->level_estim_frame_count = + hParametricDrcTypeFeedForwardBs->level_estim_integration_time / + pstr_parametric_ffwd_type_drc_params->frame_size; + + memset(pstr_parametric_ffwd_type_drc_params->level, 0, + PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX * sizeof(FLOAT32)); + + if (ch_count_from_dwnmix_id != 0) { + memcpy(pstr_parametric_ffwd_type_drc_params->level_estim_ch_weight, + hDrcCoefficientsParametricDrcBs + ->str_parametric_drc_gain_set_params[gain_set_index] + .level_estim_ch_weight, + ch_count_from_dwnmix_id * sizeof(FLOAT32)); + } else { + for (i = 0; i < pstr_parametric_ffwd_type_drc_params->audio_num_chan; i++) { + pstr_parametric_ffwd_type_drc_params->level_estim_ch_weight[i] = + (FLOAT32)channel_map[i]; } + } - pstr_parametric_ffwd_type_drc_params->node_count = hParametricDrcTypeFeedForwardBs->node_count; - - - memcpy(pstr_parametric_ffwd_type_drc_params->node_level,hParametricDrcTypeFeedForwardBs->node_level,pstr_parametric_ffwd_type_drc_params->node_count*sizeof(WORD32)); - memcpy(pstr_parametric_ffwd_type_drc_params->node_gain,hParametricDrcTypeFeedForwardBs->node_gain,pstr_parametric_ffwd_type_drc_params->node_count*sizeof(WORD32)); - - pstr_parametric_ffwd_type_drc_params->ref_level_parametric_drc = hDrcCoefficientsParametricDrcBs->str_parametric_drc_gain_set_params[gain_set_index].drc_input_loudness; - - { - WORD32 gain_smooth_attack_time_fast = hParametricDrcTypeFeedForwardBs->gain_smooth_attack_time_fast; - WORD32 gain_smooth_release_time_fast = hParametricDrcTypeFeedForwardBs->gain_smooth_release_time_fast; - WORD32 gain_smooth_attack_time_slow = hParametricDrcTypeFeedForwardBs->gain_smooth_attack_time_slow; - WORD32 gain_smooth_release_time_slow = hParametricDrcTypeFeedForwardBs->gain_smooth_release_time_slow; - WORD32 gain_smooth_hold_off = hParametricDrcTypeFeedForwardBs->gain_smooth_hold_off; - WORD32 sampling_rate = p_parametricdrc_params->sampling_rate; - WORD32 parametric_drc_frame_size = p_parametricdrc_params->parametric_drc_frame_size; + if (pstr_parametric_ffwd_type_drc_params->sub_band_domain_mode == + SUBBAND_DOMAIN_MODE_OFF) { + err = impd_init_lvl_est_filt_time( + pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type, + p_parametricdrc_params->sampling_rate, + &pstr_parametric_ffwd_type_drc_params->pre_filt_coeff, + &pstr_parametric_ffwd_type_drc_params->rlb_filt_coeff); - pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_fast = 1 - (FLOAT32)exp(-1.0 * parametric_drc_frame_size / (gain_smooth_attack_time_fast * sampling_rate * 0.001)); - pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_fast = 1 - (FLOAT32)exp(-1.0 * parametric_drc_frame_size / (gain_smooth_release_time_fast * sampling_rate * 0.001)); - pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_slow = 1 - (FLOAT32)exp(-1.0 * parametric_drc_frame_size / (gain_smooth_attack_time_slow * sampling_rate * 0.001)); - pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_slow = 1 - (FLOAT32)exp(-1.0 * parametric_drc_frame_size / (gain_smooth_release_time_slow * sampling_rate * 0.001)); - pstr_parametric_ffwd_type_drc_params->gain_smooth_hold_off_count = gain_smooth_hold_off * 256 * sampling_rate / (parametric_drc_frame_size * 48000); - pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_threshold = hParametricDrcTypeFeedForwardBs->gain_smooth_attack_threshold; - pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_threshold = hParametricDrcTypeFeedForwardBs->gain_smooth_rel_threshold; - } - - err = impd_parametric_ffwd_type_drc_reset(pstr_parametric_ffwd_type_drc_params); + if (err) return (err); + } else { + err = impd_init_lvl_est_filt_subband( + pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type, + p_parametricdrc_params->sampling_rate, + p_parametricdrc_params->sub_band_domain_mode, + p_parametricdrc_params->sub_band_count, + pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type, + pstr_parametric_ffwd_type_drc_params->weighting_filt, + &pstr_parametric_ffwd_type_drc_params->filt_coeff_subband); - if (err) - return (err); + if (err) return (err); + } + + pstr_parametric_ffwd_type_drc_params->node_count = + hParametricDrcTypeFeedForwardBs->node_count; + + memcpy(pstr_parametric_ffwd_type_drc_params->node_level, + hParametricDrcTypeFeedForwardBs->node_level, + pstr_parametric_ffwd_type_drc_params->node_count * sizeof(WORD32)); + memcpy(pstr_parametric_ffwd_type_drc_params->node_gain, + hParametricDrcTypeFeedForwardBs->node_gain, + pstr_parametric_ffwd_type_drc_params->node_count * sizeof(WORD32)); + + pstr_parametric_ffwd_type_drc_params->ref_level_parametric_drc = + hDrcCoefficientsParametricDrcBs + ->str_parametric_drc_gain_set_params[gain_set_index] + .drc_input_loudness; + + { + WORD32 gain_smooth_attack_time_fast = + hParametricDrcTypeFeedForwardBs->gain_smooth_attack_time_fast; + WORD32 gain_smooth_release_time_fast = + hParametricDrcTypeFeedForwardBs->gain_smooth_release_time_fast; + WORD32 gain_smooth_attack_time_slow = + hParametricDrcTypeFeedForwardBs->gain_smooth_attack_time_slow; + WORD32 gain_smooth_release_time_slow = + hParametricDrcTypeFeedForwardBs->gain_smooth_release_time_slow; + WORD32 gain_smooth_hold_off = + hParametricDrcTypeFeedForwardBs->gain_smooth_hold_off; + WORD32 sampling_rate = p_parametricdrc_params->sampling_rate; + WORD32 parametric_drc_frame_size = + p_parametricdrc_params->parametric_drc_frame_size; + + pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_fast = + 1 - + (FLOAT32)exp(-1.0 * parametric_drc_frame_size / + (gain_smooth_attack_time_fast * sampling_rate * 0.001)); + pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_fast = + 1 - + (FLOAT32)exp(-1.0 * parametric_drc_frame_size / + (gain_smooth_release_time_fast * sampling_rate * 0.001)); + pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_slow = + 1 - + (FLOAT32)exp(-1.0 * parametric_drc_frame_size / + (gain_smooth_attack_time_slow * sampling_rate * 0.001)); + pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_slow = + 1 - + (FLOAT32)exp(-1.0 * parametric_drc_frame_size / + (gain_smooth_release_time_slow * sampling_rate * 0.001)); + pstr_parametric_ffwd_type_drc_params->gain_smooth_hold_off_count = + gain_smooth_hold_off * 256 * sampling_rate / + (parametric_drc_frame_size * 48000); + pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_threshold = + hParametricDrcTypeFeedForwardBs->gain_smooth_attack_threshold; + pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_threshold = + hParametricDrcTypeFeedForwardBs->gain_smooth_rel_threshold; + } + + err = + impd_parametric_ffwd_type_drc_reset(pstr_parametric_ffwd_type_drc_params); + + if (err) return (err); - return 0; + return 0; } -WORD32 impd_init_parametric_drc_lim(ia_drc_config* pstr_drc_config, - WORD32 instance_idx, - WORD32 ch_count_from_dwnmix_id, - ia_parametric_drc_params_struct* p_parametricdrc_params, - pVOID *mem_ptr) -{ - WORD32 err = 0, i = 0; - UWORD32 j; - UWORD32 attack, sec_len; - - WORD32 parametric_drc_idx = p_parametricdrc_params->parametric_drc_idx[instance_idx]; - WORD32 gain_set_index = p_parametricdrc_params->gain_set_index[instance_idx]; - WORD32* channel_map = p_parametricdrc_params->channel_map[instance_idx]; - - ia_drc_coeff_parametric_drc_struct* hDrcCoefficientsParametricDrcBs = &(pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc); - ia_parametric_drc_lim_struct* hParametricDrcTypeLimBs = &(pstr_drc_config->str_drc_config_ext.str_parametric_drc_instructions[parametric_drc_idx].parametric_drc_lim); - ia_parametric_drc_type_lim_params_struct* pstr_parametric_lim_type_drc_params = &(p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].str_parametric_drc_type_lim_params); - - pstr_parametric_lim_type_drc_params->frame_size = p_parametricdrc_params->drc_frame_size; - pstr_parametric_lim_type_drc_params->audio_num_chan = p_parametricdrc_params->audio_num_chan; - - if (ch_count_from_dwnmix_id != 0) - { - memcpy(pstr_parametric_lim_type_drc_params->level_estim_ch_weight, - hDrcCoefficientsParametricDrcBs->str_parametric_drc_gain_set_params[gain_set_index].level_estim_ch_weight,ch_count_from_dwnmix_id*sizeof(FLOAT32)); +WORD32 impd_init_parametric_drc_lim( + ia_drc_config* pstr_drc_config, WORD32 instance_idx, + WORD32 ch_count_from_dwnmix_id, + ia_parametric_drc_params_struct* p_parametricdrc_params, pVOID* mem_ptr) { + WORD32 err = 0, i = 0; + UWORD32 j; + UWORD32 attack, sec_len; + + WORD32 parametric_drc_idx = + p_parametricdrc_params->parametric_drc_idx[instance_idx]; + WORD32 gain_set_index = p_parametricdrc_params->gain_set_index[instance_idx]; + WORD32* channel_map = p_parametricdrc_params->channel_map[instance_idx]; + + ia_drc_coeff_parametric_drc_struct* hDrcCoefficientsParametricDrcBs = + &(pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc); + ia_parametric_drc_lim_struct* hParametricDrcTypeLimBs = + &(pstr_drc_config->str_drc_config_ext + .str_parametric_drc_instructions[parametric_drc_idx] + .parametric_drc_lim); + ia_parametric_drc_type_lim_params_struct* + pstr_parametric_lim_type_drc_params = + &(p_parametricdrc_params + ->str_parametric_drc_instance_params[instance_idx] + .str_parametric_drc_type_lim_params); + + pstr_parametric_lim_type_drc_params->frame_size = + p_parametricdrc_params->drc_frame_size; + pstr_parametric_lim_type_drc_params->audio_num_chan = + p_parametricdrc_params->audio_num_chan; + + if (ch_count_from_dwnmix_id != 0) { + memcpy(pstr_parametric_lim_type_drc_params->level_estim_ch_weight, + hDrcCoefficientsParametricDrcBs + ->str_parametric_drc_gain_set_params[gain_set_index] + .level_estim_ch_weight, + ch_count_from_dwnmix_id * sizeof(FLOAT32)); + } else { + for (i = 0; i < pstr_parametric_lim_type_drc_params->audio_num_chan; i++) { + pstr_parametric_lim_type_drc_params->level_estim_ch_weight[i] = + (FLOAT32)channel_map[i]; } - else - { - for (i=0; i<pstr_parametric_lim_type_drc_params->audio_num_chan; i++) - { - pstr_parametric_lim_type_drc_params->level_estim_ch_weight[i] = (FLOAT32)channel_map[i]; - } + } + + attack = (UWORD32)(hParametricDrcTypeLimBs->parametric_lim_attack * + p_parametricdrc_params->sampling_rate / 1000); + + sec_len = (UWORD32)sqrt(attack + 1); + + pstr_parametric_lim_type_drc_params->sec_len = sec_len; + pstr_parametric_lim_type_drc_params->num_max_buf_sec = (attack + 1) / sec_len; + if (pstr_parametric_lim_type_drc_params->num_max_buf_sec * sec_len < + (attack + 1)) + pstr_parametric_lim_type_drc_params->num_max_buf_sec++; + + pstr_parametric_lim_type_drc_params->max_buf = (FLOAT32*)(*mem_ptr); + *mem_ptr = (pVOID)((SIZE_T)(*mem_ptr) + + pstr_parametric_lim_type_drc_params->num_max_buf_sec * + sec_len * sizeof(FLOAT32)); + + pstr_parametric_lim_type_drc_params->attack_ms = + (FLOAT32)hParametricDrcTypeLimBs->parametric_lim_attack; + pstr_parametric_lim_type_drc_params->release_ms = + (FLOAT32)hParametricDrcTypeLimBs->parametric_lim_release; + pstr_parametric_lim_type_drc_params->attack = attack; + pstr_parametric_lim_type_drc_params->attack_constant = + (FLOAT32)pow(0.1, 1.0 / (attack + 1)); + pstr_parametric_lim_type_drc_params->release_constant = (FLOAT32)pow( + 0.1, 1.0 / (hParametricDrcTypeLimBs->parametric_lim_release * + p_parametricdrc_params->sampling_rate / 1000 + + 1)); + pstr_parametric_lim_type_drc_params->threshold = (FLOAT32)pow( + 10.0f, 0.05f * hParametricDrcTypeLimBs->parametric_lim_threshold); + pstr_parametric_lim_type_drc_params->channels = + pstr_parametric_lim_type_drc_params->audio_num_chan; + pstr_parametric_lim_type_drc_params->sampling_rate = + p_parametricdrc_params->sampling_rate; + pstr_parametric_lim_type_drc_params->cor = 1.0f; + pstr_parametric_lim_type_drc_params->smooth_state_0 = 1.0; + + for (j = 0; j < pstr_parametric_lim_type_drc_params->num_max_buf_sec * + pstr_parametric_lim_type_drc_params->sec_len; + j++) { + pstr_parametric_lim_type_drc_params->max_buf[j] = 0.f; + } + + if (err) return (err); - } - - attack = (UWORD32)(hParametricDrcTypeLimBs->parametric_lim_attack * p_parametricdrc_params->sampling_rate / 1000); - - sec_len = (UWORD32)sqrt(attack+1); - - pstr_parametric_lim_type_drc_params->sec_len = sec_len; - pstr_parametric_lim_type_drc_params->num_max_buf_sec = (attack+1)/sec_len; - if (pstr_parametric_lim_type_drc_params->num_max_buf_sec*sec_len < (attack+1)) - pstr_parametric_lim_type_drc_params->num_max_buf_sec++; - - pstr_parametric_lim_type_drc_params->max_buf =(FLOAT32*)(*mem_ptr); - *mem_ptr =(pVOID)((SIZE_T)(*mem_ptr)+pstr_parametric_lim_type_drc_params->num_max_buf_sec * sec_len*sizeof(FLOAT32)); - - pstr_parametric_lim_type_drc_params->attack_ms = (FLOAT32)hParametricDrcTypeLimBs->parametric_lim_attack; - pstr_parametric_lim_type_drc_params->release_ms = (FLOAT32)hParametricDrcTypeLimBs->parametric_lim_release; - pstr_parametric_lim_type_drc_params->attack = attack; - pstr_parametric_lim_type_drc_params->attack_constant = (FLOAT32)pow(0.1, 1.0 / (attack + 1)); - pstr_parametric_lim_type_drc_params->release_constant = (FLOAT32)pow(0.1, 1.0 / (hParametricDrcTypeLimBs->parametric_lim_release * p_parametricdrc_params->sampling_rate / 1000 + 1)); - pstr_parametric_lim_type_drc_params->threshold = (FLOAT32)pow(10.0f, 0.05f * hParametricDrcTypeLimBs->parametric_lim_threshold); - pstr_parametric_lim_type_drc_params->channels = pstr_parametric_lim_type_drc_params->audio_num_chan; - pstr_parametric_lim_type_drc_params->sampling_rate = p_parametricdrc_params->sampling_rate; - pstr_parametric_lim_type_drc_params->cor = 1.0f; - pstr_parametric_lim_type_drc_params->smooth_state_0 = 1.0; - - - - for (j=0; j<pstr_parametric_lim_type_drc_params->num_max_buf_sec * pstr_parametric_lim_type_drc_params->sec_len; j++) { - pstr_parametric_lim_type_drc_params->max_buf[j] = 0.f; - } - - - - if (err) return (err); - - return 0; + return 0; } -WORD32 impd_init_parametric_drcInstance(ia_drc_config* pstr_drc_config, - WORD32 instance_idx, - WORD32 ch_count_from_dwnmix_id, - ia_parametric_drc_params_struct* p_parametricdrc_params, - pVOID *mem_ptr) -{ - WORD32 err = 0; +WORD32 impd_init_parametric_drcInstance( + ia_drc_config* pstr_drc_config, WORD32 instance_idx, + WORD32 ch_count_from_dwnmix_id, + ia_parametric_drc_params_struct* p_parametricdrc_params, pVOID* mem_ptr) { + WORD32 err = 0; + + WORD32 parametric_drc_idx = + p_parametricdrc_params->parametric_drc_idx[instance_idx]; + ia_parametric_drc_instructions_struct* hParametricDrcInstructions = + &(pstr_drc_config->str_drc_config_ext + .str_parametric_drc_instructions[parametric_drc_idx]); + + p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx] + .disable_paramteric_drc = + hParametricDrcInstructions->disable_paramteric_drc; + p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx] + .parametric_drc_type = hParametricDrcInstructions->parametric_drc_type; + p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx] + .str_spline_nodes.num_nodes = p_parametricdrc_params->num_nodes; + + if (p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx] + .disable_paramteric_drc == 0) { + if (p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx] + .parametric_drc_type == PARAM_DRC_TYPE_FF) { + err = impd_init_parametric_drc_feed_fwd(pstr_drc_config, instance_idx, + ch_count_from_dwnmix_id, + p_parametricdrc_params); + + if (err) return (err); + + } else if (p_parametricdrc_params + ->str_parametric_drc_instance_params[instance_idx] + .parametric_drc_type == PARAM_DRC_TYPE_LIM) { + p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx] + .str_spline_nodes.num_nodes = p_parametricdrc_params->drc_frame_size; + + err = impd_init_parametric_drc_lim(pstr_drc_config, instance_idx, + ch_count_from_dwnmix_id, + p_parametricdrc_params, mem_ptr); + + if (err) return (err); - WORD32 parametric_drc_idx = p_parametricdrc_params->parametric_drc_idx[instance_idx]; - ia_parametric_drc_instructions_struct *hParametricDrcInstructions = &(pstr_drc_config->str_drc_config_ext.str_parametric_drc_instructions[parametric_drc_idx]); - - p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].disable_paramteric_drc = hParametricDrcInstructions->disable_paramteric_drc; - p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].parametric_drc_type = hParametricDrcInstructions->parametric_drc_type; - p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].str_spline_nodes.num_nodes = p_parametricdrc_params->num_nodes; - - if (p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].disable_paramteric_drc == 0) - { - - if (p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].parametric_drc_type == PARAM_DRC_TYPE_FF) - { - - err = impd_init_parametric_drc_feed_fwd(pstr_drc_config, - instance_idx, - ch_count_from_dwnmix_id, - p_parametricdrc_params); - - if (err) - return (err); - - } - else if (p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].parametric_drc_type == PARAM_DRC_TYPE_LIM) - { - - p_parametricdrc_params->str_parametric_drc_instance_params[instance_idx].str_spline_nodes.num_nodes = p_parametricdrc_params->drc_frame_size; - - err = impd_init_parametric_drc_lim(pstr_drc_config, - instance_idx, - ch_count_from_dwnmix_id, - p_parametricdrc_params, - mem_ptr); - - if (err) - return (err); - - } else { - - return (UNEXPECTED_ERROR); - - } + } else { + return (UNEXPECTED_ERROR); } + } - return 0; + return 0; } - - -WORD32 impd_init_parametric_drc_after_config(ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_parametric_drc_params_struct *p_parametricdrc_params, - pVOID *mem_ptr) -{ - - WORD32 err = 0, instance_idx = 0, gain_set_index = 0, side_chain_config_type = 0, downmix_id = 0, ch_count_from_dwnmix_id = 0, L = 0; - - p_parametricdrc_params->parametric_drc_frame_size = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.parametric_drc_frame_size; - p_parametricdrc_params->reset_parametric_drc = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.reset_parametric_drc; - p_parametricdrc_params->num_nodes = p_parametricdrc_params->drc_frame_size/p_parametricdrc_params->parametric_drc_frame_size; - - switch (p_parametricdrc_params->sub_band_domain_mode) { +WORD32 impd_init_parametric_drc_after_config( + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_parametric_drc_params_struct* p_parametricdrc_params, pVOID* mem_ptr) { + WORD32 err = 0, instance_idx = 0, gain_set_index = 0, + side_chain_config_type = 0, downmix_id = 0, + ch_count_from_dwnmix_id = 0, L = 0; + + p_parametricdrc_params->parametric_drc_frame_size = + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .parametric_drc_frame_size; + p_parametricdrc_params->reset_parametric_drc = + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .reset_parametric_drc; + p_parametricdrc_params->num_nodes = + p_parametricdrc_params->drc_frame_size / + p_parametricdrc_params->parametric_drc_frame_size; + + switch (p_parametricdrc_params->sub_band_domain_mode) { case SUBBAND_DOMAIN_MODE_QMF64: - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - break; + L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; + break; case SUBBAND_DOMAIN_MODE_QMF71: - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; - break; + L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF71; + break; case SUBBAND_DOMAIN_MODE_STFT256: - L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; - break; + L = AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_STFT256; + break; case SUBBAND_DOMAIN_MODE_OFF: default: - L = 0; - break; - } - - if (p_parametricdrc_params->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF && p_parametricdrc_params->parametric_drc_frame_size != L) - { - return (EXTERNAL_ERROR); + L = 0; + break; + } + + if (p_parametricdrc_params->sub_band_domain_mode != SUBBAND_DOMAIN_MODE_OFF && + p_parametricdrc_params->parametric_drc_frame_size != L) { + return (EXTERNAL_ERROR); + } + + for (instance_idx = 0; + instance_idx < p_parametricdrc_params->parametric_drc_instance_count; + instance_idx++) { + gain_set_index = p_parametricdrc_params->gain_set_index[instance_idx]; + side_chain_config_type = + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params[gain_set_index] + .side_chain_config_type; + downmix_id = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params[gain_set_index] + .downmix_id; + + if (side_chain_config_type == 1 && + downmix_id == + p_parametricdrc_params + ->dwnmix_id_from_drc_instructions[instance_idx]) { + ch_count_from_dwnmix_id = + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params[gain_set_index] + .ch_count_from_dwnmix_id; + } else { + ch_count_from_dwnmix_id = 0; } - for (instance_idx=0; instance_idx<p_parametricdrc_params->parametric_drc_instance_count; instance_idx++) { - - gain_set_index = p_parametricdrc_params->gain_set_index[instance_idx]; - side_chain_config_type = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[gain_set_index].side_chain_config_type; - downmix_id = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[gain_set_index].downmix_id; - - if (side_chain_config_type==1 && downmix_id == p_parametricdrc_params->dwnmix_id_from_drc_instructions[instance_idx]) { - ch_count_from_dwnmix_id = pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[gain_set_index].ch_count_from_dwnmix_id; - } else { - ch_count_from_dwnmix_id = 0; - } - - if (pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[gain_set_index].drc_input_loudness_present == 0) { - WORD32 n = 0, m = 0, drcInputLoudnessFound = 0; - FLOAT32 drc_input_loudness = 0.f; - - - for (n=0; n<pstr_loudness_info->loudness_info_count; n++) - { - ia_loudness_info_struct* loudness_info = &pstr_loudness_info->loudness_info[n]; - if (p_parametricdrc_params->dwnmix_id_from_drc_instructions[instance_idx] == loudness_info->downmix_id) - { - if (0 == loudness_info->drc_set_id) - { - for (m=0; m<loudness_info->measurement_count; m++) - { - if (loudness_info->loudness_measure[m].method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) - { - drc_input_loudness = loudness_info->loudness_measure[m].method_val; - drcInputLoudnessFound = 1; - break; - } - } - if (drcInputLoudnessFound == 0) - { - for (m=0; m<loudness_info->measurement_count; m++) - { - if (loudness_info->loudness_measure[m].method_def == METHOD_DEFINITION_ANCHOR_LOUDNESS) - { - drc_input_loudness = loudness_info->loudness_measure[m].method_val; - drcInputLoudnessFound = 1; - break; - } - } - } - } - } + if (pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params[gain_set_index] + .drc_input_loudness_present == 0) { + WORD32 n = 0, m = 0, drcInputLoudnessFound = 0; + FLOAT32 drc_input_loudness = 0.f; + + for (n = 0; n < pstr_loudness_info->loudness_info_count; n++) { + ia_loudness_info_struct* loudness_info = + &pstr_loudness_info->loudness_info[n]; + if (p_parametricdrc_params + ->dwnmix_id_from_drc_instructions[instance_idx] == + loudness_info->downmix_id) { + if (0 == loudness_info->drc_set_id) { + for (m = 0; m < loudness_info->measurement_count; m++) { + if (loudness_info->loudness_measure[m].method_def == + METHOD_DEFINITION_PROGRAM_LOUDNESS) { + drc_input_loudness = + loudness_info->loudness_measure[m].method_val; + drcInputLoudnessFound = 1; + break; + } } - if (drcInputLoudnessFound == 0) - { - for (n=0; n<pstr_loudness_info->loudness_info_count; n++) - { - ia_loudness_info_struct* loudness_info = &pstr_loudness_info->loudness_info[n]; - if (0 == loudness_info->downmix_id) - { - if (0 == loudness_info->drc_set_id) - { - for (m=0; m<loudness_info->measurement_count; m++) - { - if (loudness_info->loudness_measure[m].method_def == METHOD_DEFINITION_PROGRAM_LOUDNESS) - { - drc_input_loudness = loudness_info->loudness_measure[m].method_val; - drcInputLoudnessFound = 1; - break; - } - } - if (drcInputLoudnessFound == 0) { - for (m=0; m<loudness_info->measurement_count; m++) - { - if (loudness_info->loudness_measure[m].method_def == METHOD_DEFINITION_ANCHOR_LOUDNESS) - { - drc_input_loudness = loudness_info->loudness_measure[m].method_val; - drcInputLoudnessFound = 1; - break; - } - } - } - } - } + if (drcInputLoudnessFound == 0) { + for (m = 0; m < loudness_info->measurement_count; m++) { + if (loudness_info->loudness_measure[m].method_def == + METHOD_DEFINITION_ANCHOR_LOUDNESS) { + drc_input_loudness = + loudness_info->loudness_measure[m].method_val; + drcInputLoudnessFound = 1; + break; } + } } - if (drcInputLoudnessFound == 0) { - return (UNEXPECTED_ERROR); - } else { - pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[gain_set_index].drc_input_loudness = drc_input_loudness; + } + } + } + if (drcInputLoudnessFound == 0) { + for (n = 0; n < pstr_loudness_info->loudness_info_count; n++) { + ia_loudness_info_struct* loudness_info = + &pstr_loudness_info->loudness_info[n]; + if (0 == loudness_info->downmix_id) { + if (0 == loudness_info->drc_set_id) { + for (m = 0; m < loudness_info->measurement_count; m++) { + if (loudness_info->loudness_measure[m].method_def == + METHOD_DEFINITION_PROGRAM_LOUDNESS) { + drc_input_loudness = + loudness_info->loudness_measure[m].method_val; + drcInputLoudnessFound = 1; + break; + } + } + if (drcInputLoudnessFound == 0) { + for (m = 0; m < loudness_info->measurement_count; m++) { + if (loudness_info->loudness_measure[m].method_def == + METHOD_DEFINITION_ANCHOR_LOUDNESS) { + drc_input_loudness = + loudness_info->loudness_measure[m].method_val; + drcInputLoudnessFound = 1; + break; + } + } + } } + } } - - impd_init_parametric_drcInstance(pstr_drc_config, - instance_idx, - ch_count_from_dwnmix_id, - p_parametricdrc_params, - mem_ptr); - if (err) return (err); - } - - return 0; -} - - - -WORD32 impd_init_lvl_est_filt_time( WORD32 level_estim_k_weighting_type, - WORD32 sampling_rate, - ia_2nd_order_filt_coeff_struct* pre_filt_coeff, - ia_2nd_order_filt_coeff_struct* rlb_filt_coeff) -{ - - WORD32 i; - const FLOAT32* ptr_samp_tbl; - - switch(sampling_rate) - { - case 96000:i=0; - break; - case 88200:i=1; - break; - case 64000:i=2; - break; - case 48000:i=3; - break; - case 44100:i=4; - break; - case 32000:i=5; - break; - case 24000:i=6; - break; - case 22050:i=7; - break; - case 16000:i=8; - break; - case 12000:i=9; - break; - case 11025:i=10; - break; - case 8000:i=11; - break; - case 7350:i=12; - break; - default:i=3; - break; - } - - ptr_samp_tbl = samp_rate_tbl[i]; - - if (level_estim_k_weighting_type==2) { - - pre_filt_coeff->b0 = ptr_samp_tbl[0]; - pre_filt_coeff->b1 = ptr_samp_tbl[1]; - pre_filt_coeff->b2 = ptr_samp_tbl[2]; - pre_filt_coeff->a1 = ptr_samp_tbl[3]; - pre_filt_coeff->a2 = ptr_samp_tbl[4]; - - + } + if (drcInputLoudnessFound == 0) { + return (UNEXPECTED_ERROR); + } else { + pstr_drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params[gain_set_index] + .drc_input_loudness = drc_input_loudness; + } } - if (level_estim_k_weighting_type == 1 || level_estim_k_weighting_type == 2) { + impd_init_parametric_drcInstance(pstr_drc_config, instance_idx, + ch_count_from_dwnmix_id, + p_parametricdrc_params, mem_ptr); + if (err) return (err); + } - rlb_filt_coeff->b0 = ptr_samp_tbl[5]; - rlb_filt_coeff->b1 = ptr_samp_tbl[6]; - rlb_filt_coeff->b2 = ptr_samp_tbl[7]; - rlb_filt_coeff->a1 = ptr_samp_tbl[8]; - rlb_filt_coeff->a2 = ptr_samp_tbl[9]; + return 0; +} - } +WORD32 impd_init_lvl_est_filt_time( + WORD32 level_estim_k_weighting_type, WORD32 sampling_rate, + ia_2nd_order_filt_coeff_struct* pre_filt_coeff, + ia_2nd_order_filt_coeff_struct* rlb_filt_coeff) { + WORD32 i; + const FLOAT32* ptr_samp_tbl; + + switch (sampling_rate) { + case 96000: + i = 0; + break; + case 88200: + i = 1; + break; + case 64000: + i = 2; + break; + case 48000: + i = 3; + break; + case 44100: + i = 4; + break; + case 32000: + i = 5; + break; + case 24000: + i = 6; + break; + case 22050: + i = 7; + break; + case 16000: + i = 8; + break; + case 12000: + i = 9; + break; + case 11025: + i = 10; + break; + case 8000: + i = 11; + break; + case 7350: + i = 12; + break; + default: + i = 3; + break; + } + + ptr_samp_tbl = samp_rate_tbl[i]; + + if (level_estim_k_weighting_type == 2) { + pre_filt_coeff->b0 = ptr_samp_tbl[0]; + pre_filt_coeff->b1 = ptr_samp_tbl[1]; + pre_filt_coeff->b2 = ptr_samp_tbl[2]; + pre_filt_coeff->a1 = ptr_samp_tbl[3]; + pre_filt_coeff->a2 = ptr_samp_tbl[4]; + } + + if (level_estim_k_weighting_type == 1 || level_estim_k_weighting_type == 2) { + rlb_filt_coeff->b0 = ptr_samp_tbl[5]; + rlb_filt_coeff->b1 = ptr_samp_tbl[6]; + rlb_filt_coeff->b2 = ptr_samp_tbl[7]; + rlb_filt_coeff->a1 = ptr_samp_tbl[8]; + rlb_filt_coeff->a2 = ptr_samp_tbl[9]; + } - return 0; + return 0; } -WORD32 impd_init_lvl_est_filt_subband( WORD32 level_estim_k_weighting_type, - WORD32 sampling_rate, - WORD32 sub_band_domain_mode, - WORD32 sub_band_count, - WORD32 sub_band_compensation_type, - FLOAT32 *weighting_filt, - ia_2nd_order_filt_coeff_struct* filt_coeff_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; - WORD32 b; - WORD32 i; - const FLOAT32* ptr_samp_tbl; - - switch(sampling_rate) - { - case 96000:i=0; - break; - case 88200:i=1; - break; - case 64000:i=2; - break; - case 48000:i=3; - break; - case 44100:i=4; - break; - case 32000:i=5; - break; - case 24000:i=6; - break; - case 22050:i=7; - break; - case 16000:i=8; - break; - case 12000:i=9; - break; - case 11025:i=10; - break; - case 8000:i=11; - break; - case 7350:i=12; - break; - default:i=3; - break; - } +WORD32 impd_init_lvl_est_filt_subband( + WORD32 level_estim_k_weighting_type, WORD32 sampling_rate, + WORD32 sub_band_domain_mode, WORD32 sub_band_count, + WORD32 sub_band_compensation_type, FLOAT32* weighting_filt, + ia_2nd_order_filt_coeff_struct* filt_coeff_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; + WORD32 b; + WORD32 i; + const FLOAT32* ptr_samp_tbl; + + switch (sampling_rate) { + case 96000: + i = 0; + break; + case 88200: + i = 1; + break; + case 64000: + i = 2; + break; + case 48000: + i = 3; + break; + case 44100: + i = 4; + break; + case 32000: + i = 5; + break; + case 24000: + i = 6; + break; + case 22050: + i = 7; + break; + case 16000: + i = 8; + break; + case 12000: + i = 9; + break; + case 11025: + i = 10; + break; + case 8000: + i = 11; + break; + case 7350: + i = 12; + break; + default: + i = 3; + break; + } - ptr_samp_tbl = samp_rate_tbl[i]; + ptr_samp_tbl = samp_rate_tbl[i]; - switch (sub_band_domain_mode) - { + switch (sub_band_domain_mode) { case SUBBAND_DOMAIN_MODE_QMF64: - f_bands_nrm = f_bands_nrm_QMF64; - break; + f_bands_nrm = f_bands_nrm_QMF64; + break; case SUBBAND_DOMAIN_MODE_QMF71: - f_bands_nrm = f_bands_nrm_QMF71; - break; + f_bands_nrm = f_bands_nrm_QMF71; + break; case SUBBAND_DOMAIN_MODE_STFT256: - f_bands_nrm = f_bands_nrm_STFT256; - break; + f_bands_nrm = f_bands_nrm_STFT256; + break; default: - return UNEXPECTED_ERROR; - break; - } - - for (b=0; b<sub_band_count; b++) - { - weighting_filt[b] = 1.f; + return UNEXPECTED_ERROR; + break; + } + + for (b = 0; b < sub_band_count; b++) { + weighting_filt[b] = 1.f; + } + + if (level_estim_k_weighting_type == 2) { + b0 = ptr_samp_tbl[0]; + b1 = ptr_samp_tbl[1]; + b2 = ptr_samp_tbl[2]; + a1 = ptr_samp_tbl[3]; + a2 = ptr_samp_tbl[4]; + a0 = 1.f; + + for (b = 0; b < sub_band_count; b++) { + num_real = b0 + b1 * (FLOAT32)cos(PI * f_bands_nrm[b]) + + b2 * (FLOAT32)cos(PI * 2 * f_bands_nrm[b]); + num_imag = -b1 * (FLOAT32)sin(PI * f_bands_nrm[b]) - + b2 * (FLOAT32)sin(PI * 2 * f_bands_nrm[b]); + den_real = a0 + a1 * (FLOAT32)cos(PI * f_bands_nrm[b]) + + a2 * (FLOAT32)cos(PI * 2 * f_bands_nrm[b]); + den_imag = -a1 * (FLOAT32)sin(PI * f_bands_nrm[b]) - + a2 * (FLOAT32)sin(PI * 2 * f_bands_nrm[b]); + + weighting_filt[b] *= + (FLOAT32)(sqrt((num_real * num_real + num_imag * num_imag) / + (den_real * den_real + den_imag * den_imag))); } - - if (level_estim_k_weighting_type == 2) - { - - b0 = ptr_samp_tbl[0]; - b1 = ptr_samp_tbl[1]; - b2 = ptr_samp_tbl[2]; - a1 = ptr_samp_tbl[3]; - a2 = ptr_samp_tbl[4]; - a0 = 1.f; - - for (b=0; b<sub_band_count; b++) - { - - num_real = b0 + b1 * (FLOAT32)cos(PI*f_bands_nrm[b]) + b2 * (FLOAT32)cos(PI*2*f_bands_nrm[b]); - num_imag = - b1 * (FLOAT32)sin(PI*f_bands_nrm[b]) - b2 * (FLOAT32)sin(PI*2*f_bands_nrm[b]); - den_real = a0 + a1 *(FLOAT32) cos(PI*f_bands_nrm[b]) + a2 * (FLOAT32)cos(PI*2*f_bands_nrm[b]); - den_imag = - a1 * (FLOAT32)sin(PI*f_bands_nrm[b]) - a2 * (FLOAT32)sin(PI*2*f_bands_nrm[b]); - - weighting_filt[b] *= (FLOAT32)(sqrt((num_real*num_real+num_imag*num_imag)/(den_real*den_real+den_imag*den_imag))); - } + } + + if (level_estim_k_weighting_type == 1 || level_estim_k_weighting_type == 2) { + b0 = ptr_samp_tbl[5]; + b1 = ptr_samp_tbl[6]; + b2 = ptr_samp_tbl[7]; + a1 = ptr_samp_tbl[8]; + a2 = ptr_samp_tbl[9]; + a0 = 1.f; + + for (b = 0; b < sub_band_count; b++) { + if (!(sub_band_compensation_type == 1 && b == 0)) { + num_real = (FLOAT32)(b0 + b1 * cos(PI * f_bands_nrm[b]) + + b2 * cos(PI * 2 * f_bands_nrm[b])); + num_imag = (FLOAT32)(-b1 * sin(PI * f_bands_nrm[b]) - + b2 * sin(PI * 2 * f_bands_nrm[b])); + den_real = (FLOAT32)(a0 + a1 * cos(PI * f_bands_nrm[b]) + + a2 * cos(PI * 2 * f_bands_nrm[b])); + den_imag = (FLOAT32)(-a1 * sin(PI * f_bands_nrm[b]) - + a2 * sin(PI * 2 * f_bands_nrm[b])); + + weighting_filt[b] *= + (FLOAT32)(sqrt((num_real * num_real + num_imag * num_imag) / + (den_real * den_real + den_imag * den_imag))); + } } - if (level_estim_k_weighting_type == 1 || level_estim_k_weighting_type == 2) - { - b0 = ptr_samp_tbl[5]; - b1 = ptr_samp_tbl[6]; - b2 = ptr_samp_tbl[7]; - a1 = ptr_samp_tbl[8]; - a2 = ptr_samp_tbl[9]; - a0 = 1.f; - - - for (b=0; b<sub_band_count; b++) - { - - if (!(sub_band_compensation_type==1 && b==0)) - { - num_real =(FLOAT32)( b0 + b1 * cos(PI*f_bands_nrm[b]) + b2 * cos(PI*2*f_bands_nrm[b])); - num_imag =(FLOAT32)( - b1 * sin(PI*f_bands_nrm[b]) - b2 * sin(PI*2*f_bands_nrm[b])); - den_real = (FLOAT32)(a0 + a1 * cos(PI*f_bands_nrm[b]) + a2 * cos(PI*2*f_bands_nrm[b])); - den_imag = (FLOAT32)(- a1 * sin(PI*f_bands_nrm[b]) - a2 * sin(PI*2*f_bands_nrm[b])); - - weighting_filt[b] *= (FLOAT32)(sqrt((num_real*num_real+num_imag*num_imag)/(den_real*den_real+den_imag*den_imag))); - } - } - - if (sub_band_compensation_type==1) - { - - w0 = 2.0f*PI * 38.0f / (FLOAT32)sampling_rate * AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; - sinw0 = (FLOAT32)sin(w0); - cosw0 = (FLOAT32)cos(w0); - alpha = sinw0; - - b0 = (1 + cosw0)/2; - b1 = -(1 + cosw0); - b2 = (1 + cosw0)/2; - a0 = 1 + alpha; - a1 = -2*cosw0; - a2 = 1 - alpha; - - filt_coeff_subband->b0 = b0/a0; - filt_coeff_subband->b1 = b1/a0; - filt_coeff_subband->b2 = b2/a0; - filt_coeff_subband->a1 = a1/a0; - filt_coeff_subband->a2 = a2/a0; - } + if (sub_band_compensation_type == 1) { + w0 = 2.0f * PI * 38.0f / (FLOAT32)sampling_rate * + AUDIO_CODEC_SUBBAND_DOWNSAMPLING_FACTOR_QMF64; + sinw0 = (FLOAT32)sin(w0); + cosw0 = (FLOAT32)cos(w0); + alpha = sinw0; + + b0 = (1 + cosw0) / 2; + b1 = -(1 + cosw0); + b2 = (1 + cosw0) / 2; + a0 = 1 + alpha; + a1 = -2 * cosw0; + a2 = 1 - alpha; + + filt_coeff_subband->b0 = b0 / a0; + filt_coeff_subband->b1 = b1 / a0; + filt_coeff_subband->b2 = b2 / a0; + filt_coeff_subband->a1 = a1 / a0; + filt_coeff_subband->a2 = a2 / a0; } + } - return 0; + return 0; } -WORD32 impd_parametric_ffwd_type_drc_reset(ia_parametric_drc_type_ff_params_struct* pstr_parametric_ffwd_type_drc_params) -{ - WORD32 i = 0; - - pstr_parametric_ffwd_type_drc_params->level_estim_frame_index = 0; - pstr_parametric_ffwd_type_drc_params->start_up_phase = 1; - for (i=0; i<PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX; i++) { - pstr_parametric_ffwd_type_drc_params->level[i] = 0.f; - } - - for (i=0; i<MAX_CHANNEL_COUNT; i++) { - pstr_parametric_ffwd_type_drc_params->pre_filt_state[i].z1 = 0.f; - pstr_parametric_ffwd_type_drc_params->pre_filt_state[i].z2 = 0.f; - pstr_parametric_ffwd_type_drc_params->rlb_filt_state[i].z1 = 0.f; - pstr_parametric_ffwd_type_drc_params->rlb_filt_state[i].z2 = 0.f; - pstr_parametric_ffwd_type_drc_params->filt_state_subband_real[i].z1 = 0.f; - pstr_parametric_ffwd_type_drc_params->filt_state_subband_real[i].z2 = 0.f; - pstr_parametric_ffwd_type_drc_params->filt_state_subband_imag[i].z1 = 0.f; - pstr_parametric_ffwd_type_drc_params->filt_state_subband_imag[i].z2 = 0.f; - } - - pstr_parametric_ffwd_type_drc_params->db_level_smooth = -135.f; - pstr_parametric_ffwd_type_drc_params->db_gain_smooth = 0.f; - pstr_parametric_ffwd_type_drc_params->hold_counter = 0; +WORD32 impd_parametric_ffwd_type_drc_reset( + ia_parametric_drc_type_ff_params_struct* + pstr_parametric_ffwd_type_drc_params) { + WORD32 i = 0; + + pstr_parametric_ffwd_type_drc_params->level_estim_frame_index = 0; + pstr_parametric_ffwd_type_drc_params->start_up_phase = 1; + for (i = 0; i < PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX; i++) { + pstr_parametric_ffwd_type_drc_params->level[i] = 0.f; + } + + for (i = 0; i < MAX_CHANNEL_COUNT; i++) { + pstr_parametric_ffwd_type_drc_params->pre_filt_state[i].z1 = 0.f; + pstr_parametric_ffwd_type_drc_params->pre_filt_state[i].z2 = 0.f; + pstr_parametric_ffwd_type_drc_params->rlb_filt_state[i].z1 = 0.f; + pstr_parametric_ffwd_type_drc_params->rlb_filt_state[i].z2 = 0.f; + pstr_parametric_ffwd_type_drc_params->filt_state_subband_real[i].z1 = 0.f; + pstr_parametric_ffwd_type_drc_params->filt_state_subband_real[i].z2 = 0.f; + pstr_parametric_ffwd_type_drc_params->filt_state_subband_imag[i].z1 = 0.f; + pstr_parametric_ffwd_type_drc_params->filt_state_subband_imag[i].z2 = 0.f; + } + + pstr_parametric_ffwd_type_drc_params->db_level_smooth = -135.f; + pstr_parametric_ffwd_type_drc_params->db_gain_smooth = 0.f; + pstr_parametric_ffwd_type_drc_params->hold_counter = 0; - return 0; + return 0; } -WORD32 impd_parametric_drc_instance_process (FLOAT32* audio_in_out_buf[], - FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_parametric_drc_params_struct* p_parametricdrc_params, - ia_parametric_drc_instance_params_struct* pstr_parametric_drc_instance_params) -{ - WORD32 err = 0, i = 0; - - if (pstr_parametric_drc_instance_params->disable_paramteric_drc) { - - for (i=0; i<p_parametricdrc_params->num_nodes; i++) { +WORD32 impd_parametric_drc_instance_process( + FLOAT32* audio_in_out_buf[], FLOAT32* audio_real_buff[], + FLOAT32* audio_imag_buff[], + ia_parametric_drc_params_struct* p_parametricdrc_params, + ia_parametric_drc_instance_params_struct* + pstr_parametric_drc_instance_params) { + WORD32 err = 0, i = 0; + + if (pstr_parametric_drc_instance_params->disable_paramteric_drc) { + for (i = 0; i < p_parametricdrc_params->num_nodes; i++) { + pstr_parametric_drc_instance_params->str_spline_nodes.str_node[i] + .loc_db_gain = 0.f; + pstr_parametric_drc_instance_params->str_spline_nodes.str_node[i].slope = + 0.f; + pstr_parametric_drc_instance_params->str_spline_nodes.str_node[i].time = + (i + 1) * p_parametricdrc_params->parametric_drc_frame_size - 1; + } - pstr_parametric_drc_instance_params->str_spline_nodes.str_node[i].loc_db_gain = 0.f; - pstr_parametric_drc_instance_params->str_spline_nodes.str_node[i].slope = 0.f; - pstr_parametric_drc_instance_params->str_spline_nodes.str_node[i].time = (i+1) * p_parametricdrc_params->parametric_drc_frame_size - 1; + } else { + 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); + for (i = 0; i < p_parametricdrc_params->num_nodes; i++) { + err = impd_parametric_ffwd_type_drc_process( + audio_in_out_buf, audio_real_buff, audio_imag_buff, i, + pstr_parametric_ffwd_type_drc_params, + &pstr_parametric_drc_instance_params->str_spline_nodes); + if (err) return (err); + } - } + } else if (pstr_parametric_drc_instance_params->parametric_drc_type == + PARAM_DRC_TYPE_LIM) { + return (UNEXPECTED_ERROR); } else { - - 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); - for (i=0; i<p_parametricdrc_params->num_nodes; i++) { - err = impd_parametric_ffwd_type_drc_process(audio_in_out_buf, - audio_real_buff, - audio_imag_buff, - i, - pstr_parametric_ffwd_type_drc_params, - &pstr_parametric_drc_instance_params->str_spline_nodes); - if (err) return (err); - } - - } else if (pstr_parametric_drc_instance_params->parametric_drc_type == PARAM_DRC_TYPE_LIM) { - - return (UNEXPECTED_ERROR); - - } else { - return (UNEXPECTED_ERROR); - - } - + return (UNEXPECTED_ERROR); } + } - return 0; + return 0; } -VOID iir_second_order_filter (ia_2nd_order_filt_coeff_struct* coeff, - ia_2nd_order_filt_state_struct* state, - WORD32 frame_len, - FLOAT32* input, - FLOAT32* output) -{ - FLOAT32 z2=state->z2; - FLOAT32 z1=state->z1; - FLOAT32 z0; - WORD32 i; - - for (i=0; i<frame_len; i++) - { - z0 = input[i] - coeff->a1 * z1 - coeff->a2 * z2; - output[i] = coeff->b0 * z0 + coeff->b1 * z1 + coeff->b2 * z2; - z2 = z1; - z1 = z0; - - } - state->z1=z1; - state->z2=z2; +VOID iir_second_order_filter(ia_2nd_order_filt_coeff_struct* coeff, + ia_2nd_order_filt_state_struct* state, + WORD32 frame_len, FLOAT32* input, + FLOAT32* output) { + FLOAT32 z2 = state->z2; + FLOAT32 z1 = state->z1; + FLOAT32 z0; + WORD32 i; + + for (i = 0; i < frame_len; i++) { + z0 = input[i] - coeff->a1 * z1 - coeff->a2 * z2; + output[i] = coeff->b0 * z0 + coeff->b1 * z1 + coeff->b2 * z2; + z2 = z1; + z1 = z0; + } + state->z1 = z1; + state->z2 = z2; } -WORD32 impd_parametric_ffwd_type_drc_process(FLOAT32* audio_in_out_buf[], - FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - WORD32 nodeIdx, - ia_parametric_drc_type_ff_params_struct* pstr_parametric_ffwd_type_drc_params, - ia_spline_nodes_struct* str_spline_nodes) -{ - WORD32 c, t, b, n, i, offset; - FLOAT32 x, y, channelLevel, level, levelDb, loc_db_gain, levelDelta, alpha; - - WORD32 frame_size = pstr_parametric_ffwd_type_drc_params->frame_size; - WORD32 sub_band_count = pstr_parametric_ffwd_type_drc_params->sub_band_count; - FLOAT32 *level_estim_ch_weight = pstr_parametric_ffwd_type_drc_params->level_estim_ch_weight; - WORD32 level_estim_k_weighting_type = pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type; - - ia_2nd_order_filt_coeff_struct preC = pstr_parametric_ffwd_type_drc_params->pre_filt_coeff; - ia_2nd_order_filt_coeff_struct rlbC = pstr_parametric_ffwd_type_drc_params->rlb_filt_coeff; - ia_2nd_order_filt_state_struct* preS = pstr_parametric_ffwd_type_drc_params->pre_filt_state; - ia_2nd_order_filt_state_struct* rlbS = pstr_parametric_ffwd_type_drc_params->rlb_filt_state; - - ia_2nd_order_filt_coeff_struct rlbC_sb = pstr_parametric_ffwd_type_drc_params->filt_coeff_subband; - ia_2nd_order_filt_state_struct* rlbS_sbReal = pstr_parametric_ffwd_type_drc_params->filt_state_subband_real; - ia_2nd_order_filt_state_struct* rlbS_sbImag = pstr_parametric_ffwd_type_drc_params->filt_state_subband_imag; - FLOAT32 *weighting_filt = pstr_parametric_ffwd_type_drc_params->weighting_filt; - WORD32 sub_band_compensation_type = pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type; - - if (audio_in_out_buf != NULL) { - - level = 0; - offset = nodeIdx * pstr_parametric_ffwd_type_drc_params->frame_size; - for(c=0; c<pstr_parametric_ffwd_type_drc_params->audio_num_chan; c++) { - channelLevel = 0.f; - - if (!level_estim_ch_weight[c]) continue; - - if (level_estim_k_weighting_type == 0) { - - for(t=0; t<frame_size; t++) { - - x = audio_in_out_buf[c][offset+t]; - - channelLevel += x * x; - - } - - } else if (level_estim_k_weighting_type == 1) { - - for(t=0; t<frame_size; t++) { - - x = audio_in_out_buf[c][offset+t]; - - iir_second_order_filter(&rlbC,&rlbS[c],1,&x,&x); - - channelLevel += x * x; - - } - - } else if (level_estim_k_weighting_type == 2) { - - for(t=0; t<frame_size; t++) { - - x = audio_in_out_buf[c][offset+t]; - - iir_second_order_filter(&preC,&preS[c],1,&x,&x); - - iir_second_order_filter(&rlbC,&rlbS[c],1,&x,&x); - - channelLevel += x * x; - - } - - } else { - - return (UNEXPECTED_ERROR); - - } - - level += level_estim_ch_weight[c] * channelLevel; - +WORD32 impd_parametric_ffwd_type_drc_process( + FLOAT32* audio_in_out_buf[], FLOAT32* audio_real_buff[], + FLOAT32* audio_imag_buff[], WORD32 nodeIdx, + ia_parametric_drc_type_ff_params_struct* + pstr_parametric_ffwd_type_drc_params, + ia_spline_nodes_struct* str_spline_nodes) { + WORD32 c, t, b, n, i, offset; + FLOAT32 x, y, channelLevel, level, levelDb, loc_db_gain, levelDelta, alpha; + + WORD32 frame_size = pstr_parametric_ffwd_type_drc_params->frame_size; + WORD32 sub_band_count = pstr_parametric_ffwd_type_drc_params->sub_band_count; + FLOAT32* level_estim_ch_weight = + pstr_parametric_ffwd_type_drc_params->level_estim_ch_weight; + WORD32 level_estim_k_weighting_type = + pstr_parametric_ffwd_type_drc_params->level_estim_k_weighting_type; + + ia_2nd_order_filt_coeff_struct preC = + pstr_parametric_ffwd_type_drc_params->pre_filt_coeff; + ia_2nd_order_filt_coeff_struct rlbC = + pstr_parametric_ffwd_type_drc_params->rlb_filt_coeff; + ia_2nd_order_filt_state_struct* preS = + pstr_parametric_ffwd_type_drc_params->pre_filt_state; + ia_2nd_order_filt_state_struct* rlbS = + pstr_parametric_ffwd_type_drc_params->rlb_filt_state; + + ia_2nd_order_filt_coeff_struct rlbC_sb = + pstr_parametric_ffwd_type_drc_params->filt_coeff_subband; + ia_2nd_order_filt_state_struct* rlbS_sbReal = + pstr_parametric_ffwd_type_drc_params->filt_state_subband_real; + ia_2nd_order_filt_state_struct* rlbS_sbImag = + pstr_parametric_ffwd_type_drc_params->filt_state_subband_imag; + FLOAT32* weighting_filt = + pstr_parametric_ffwd_type_drc_params->weighting_filt; + WORD32 sub_band_compensation_type = + pstr_parametric_ffwd_type_drc_params->sub_band_compensation_type; + + if (audio_in_out_buf != NULL) { + level = 0; + offset = nodeIdx * pstr_parametric_ffwd_type_drc_params->frame_size; + for (c = 0; c < pstr_parametric_ffwd_type_drc_params->audio_num_chan; c++) { + channelLevel = 0.f; + + if (!level_estim_ch_weight[c]) continue; + + if (level_estim_k_weighting_type == 0) { + for (t = 0; t < frame_size; t++) { + x = audio_in_out_buf[c][offset + t]; + + channelLevel += x * x; } - } else { - - level = 0; - offset = nodeIdx * pstr_parametric_ffwd_type_drc_params->sub_band_count; - for(c=0; c<pstr_parametric_ffwd_type_drc_params->audio_num_chan; c++) { - channelLevel = 0.f; - - if (!level_estim_ch_weight[c]) continue; - - if (level_estim_k_weighting_type == 0) { + } else if (level_estim_k_weighting_type == 1) { + for (t = 0; t < frame_size; t++) { + x = audio_in_out_buf[c][offset + t]; - for(b=0; b<sub_band_count; b++) { + iir_second_order_filter(&rlbC, &rlbS[c], 1, &x, &x); - x = audio_real_buff[c][offset+b]; - y = audio_imag_buff[c][offset+b]; - - channelLevel += x * x + y * y; - - } + channelLevel += x * x; + } - } else if (level_estim_k_weighting_type == 1||level_estim_k_weighting_type == 2) { + } else if (level_estim_k_weighting_type == 2) { + for (t = 0; t < frame_size; t++) { + x = audio_in_out_buf[c][offset + t]; - for(b=0; b<sub_band_count; b++) { + iir_second_order_filter(&preC, &preS[c], 1, &x, &x); - x = audio_real_buff[c][offset+b] * weighting_filt[b]; - y = audio_imag_buff[c][offset+b] * weighting_filt[b]; + iir_second_order_filter(&rlbC, &rlbS[c], 1, &x, &x); - if (b==0 && sub_band_compensation_type==1) { + channelLevel += x * x; + } - iir_second_order_filter(&rlbC_sb,&rlbS_sbReal[c],1,&x,&x); + } else { + return (UNEXPECTED_ERROR); + } - iir_second_order_filter(&rlbC_sb,&rlbS_sbImag[c],1,&y,&y); + level += level_estim_ch_weight[c] * channelLevel; + } - } + } else { + level = 0; + offset = nodeIdx * pstr_parametric_ffwd_type_drc_params->sub_band_count; + for (c = 0; c < pstr_parametric_ffwd_type_drc_params->audio_num_chan; c++) { + channelLevel = 0.f; - channelLevel += x * x + y * y; + if (!level_estim_ch_weight[c]) continue; - } + if (level_estim_k_weighting_type == 0) { + for (b = 0; b < sub_band_count; b++) { + x = audio_real_buff[c][offset + b]; + y = audio_imag_buff[c][offset + b]; - } else { + channelLevel += x * x + y * y; + } - return (UNEXPECTED_ERROR); + } else if (level_estim_k_weighting_type == 1 || + level_estim_k_weighting_type == 2) { + for (b = 0; b < sub_band_count; b++) { + x = audio_real_buff[c][offset + b] * weighting_filt[b]; + y = audio_imag_buff[c][offset + b] * weighting_filt[b]; - } + if (b == 0 && sub_band_compensation_type == 1) { + iir_second_order_filter(&rlbC_sb, &rlbS_sbReal[c], 1, &x, &x); - level += level_estim_ch_weight[c] * channelLevel; + iir_second_order_filter(&rlbC_sb, &rlbS_sbImag[c], 1, &y, &y); + } + channelLevel += x * x + y * y; } - level /= sub_band_count; - } - pstr_parametric_ffwd_type_drc_params->level[pstr_parametric_ffwd_type_drc_params->level_estim_frame_index] = level; - pstr_parametric_ffwd_type_drc_params->level_estim_frame_index++; + } else { + return (UNEXPECTED_ERROR); + } - level = 0.f; - if (pstr_parametric_ffwd_type_drc_params->start_up_phase) { - for (i=0; i<pstr_parametric_ffwd_type_drc_params->level_estim_frame_index; i++) { - level += pstr_parametric_ffwd_type_drc_params->level[i]; - } - level /= pstr_parametric_ffwd_type_drc_params->level_estim_frame_index * pstr_parametric_ffwd_type_drc_params->frame_size; - } else { - for (i=0; i<pstr_parametric_ffwd_type_drc_params->level_estim_frame_count; i++) { - level += pstr_parametric_ffwd_type_drc_params->level[i]; - } - level /= pstr_parametric_ffwd_type_drc_params->level_estim_integration_time; - } - if (pstr_parametric_ffwd_type_drc_params->level_estim_frame_index == pstr_parametric_ffwd_type_drc_params->level_estim_frame_count) { - pstr_parametric_ffwd_type_drc_params->level_estim_frame_index = 0; - pstr_parametric_ffwd_type_drc_params->start_up_phase = 0; + level += level_estim_ch_weight[c] * channelLevel; } - if (level < 1e-10f) level = 1e-10f; - if (level_estim_k_weighting_type == 2) { - levelDb = -0.691f + 10 * (FLOAT32)log10(level) + 3; - } else { - levelDb = 10 * (FLOAT32)log10(level) + 3; + level /= sub_band_count; + } + pstr_parametric_ffwd_type_drc_params + ->level[pstr_parametric_ffwd_type_drc_params->level_estim_frame_index] = + level; + pstr_parametric_ffwd_type_drc_params->level_estim_frame_index++; + + level = 0.f; + if (pstr_parametric_ffwd_type_drc_params->start_up_phase) { + for (i = 0; + i < pstr_parametric_ffwd_type_drc_params->level_estim_frame_index; + i++) { + level += pstr_parametric_ffwd_type_drc_params->level[i]; } - levelDb -= pstr_parametric_ffwd_type_drc_params->ref_level_parametric_drc; - - for(n=0; n<pstr_parametric_ffwd_type_drc_params->node_count; n++) { - if (levelDb <= (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_level[n]) { - break; - } + level /= pstr_parametric_ffwd_type_drc_params->level_estim_frame_index * + pstr_parametric_ffwd_type_drc_params->frame_size; + } else { + for (i = 0; + i < pstr_parametric_ffwd_type_drc_params->level_estim_frame_count; + i++) { + level += pstr_parametric_ffwd_type_drc_params->level[i]; } - if (n == 0) { - loc_db_gain = (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_gain[n]; - } else if (n == pstr_parametric_ffwd_type_drc_params->node_count) { - loc_db_gain = (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_gain[n-1] - levelDb + (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_level[n-1]; - } else { - loc_db_gain = (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_gain[n] + (levelDb - (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_level[n]) / (FLOAT32)(pstr_parametric_ffwd_type_drc_params->node_level[n-1] - pstr_parametric_ffwd_type_drc_params->node_level[n]) * (FLOAT32)(pstr_parametric_ffwd_type_drc_params->node_gain[n-1] - pstr_parametric_ffwd_type_drc_params->node_gain[n]); + level /= pstr_parametric_ffwd_type_drc_params->level_estim_integration_time; + } + if (pstr_parametric_ffwd_type_drc_params->level_estim_frame_index == + pstr_parametric_ffwd_type_drc_params->level_estim_frame_count) { + pstr_parametric_ffwd_type_drc_params->level_estim_frame_index = 0; + pstr_parametric_ffwd_type_drc_params->start_up_phase = 0; + } + + if (level < 1e-10f) level = 1e-10f; + if (level_estim_k_weighting_type == 2) { + levelDb = -0.691f + 10 * (FLOAT32)log10(level) + 3; + } else { + levelDb = 10 * (FLOAT32)log10(level) + 3; + } + levelDb -= pstr_parametric_ffwd_type_drc_params->ref_level_parametric_drc; + + for (n = 0; n < pstr_parametric_ffwd_type_drc_params->node_count; n++) { + if (levelDb <= + (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_level[n]) { + break; } - - levelDelta = levelDb - pstr_parametric_ffwd_type_drc_params->db_level_smooth; - if (loc_db_gain < pstr_parametric_ffwd_type_drc_params->db_gain_smooth) { - if (levelDelta > pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_threshold) { - alpha = pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_fast; - } else { - alpha = pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_slow; - } + } + if (n == 0) { + loc_db_gain = (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_gain[n]; + } else if (n == pstr_parametric_ffwd_type_drc_params->node_count) { + loc_db_gain = + (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_gain[n - 1] - + levelDb + + (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_level[n - 1]; + } else { + loc_db_gain = + (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_gain[n] + + (levelDb - + (FLOAT32)pstr_parametric_ffwd_type_drc_params->node_level[n]) / + (FLOAT32)(pstr_parametric_ffwd_type_drc_params->node_level[n - 1] - + pstr_parametric_ffwd_type_drc_params->node_level[n]) * + (FLOAT32)(pstr_parametric_ffwd_type_drc_params->node_gain[n - 1] - + pstr_parametric_ffwd_type_drc_params->node_gain[n]); + } + + levelDelta = levelDb - pstr_parametric_ffwd_type_drc_params->db_level_smooth; + if (loc_db_gain < pstr_parametric_ffwd_type_drc_params->db_gain_smooth) { + if (levelDelta > + pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_threshold) { + alpha = + pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_fast; } else { - if (levelDelta < -pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_threshold) { - alpha = pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_fast; - } else { - alpha = pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_slow; - } - } - if (loc_db_gain < pstr_parametric_ffwd_type_drc_params->db_gain_smooth || pstr_parametric_ffwd_type_drc_params->hold_counter == 0) { - pstr_parametric_ffwd_type_drc_params->db_level_smooth = (1-alpha) * pstr_parametric_ffwd_type_drc_params->db_level_smooth + alpha * levelDb; - pstr_parametric_ffwd_type_drc_params->db_gain_smooth = (1-alpha) * pstr_parametric_ffwd_type_drc_params->db_gain_smooth + alpha * loc_db_gain; + alpha = + pstr_parametric_ffwd_type_drc_params->gain_smooth_attack_alpha_slow; } - if (pstr_parametric_ffwd_type_drc_params->hold_counter) { - pstr_parametric_ffwd_type_drc_params->hold_counter -= 1; - } - if (loc_db_gain < pstr_parametric_ffwd_type_drc_params->db_gain_smooth) { - pstr_parametric_ffwd_type_drc_params->hold_counter = pstr_parametric_ffwd_type_drc_params->gain_smooth_hold_off_count; + } else { + if (levelDelta < + -pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_threshold) { + alpha = pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_fast; + } else { + alpha = pstr_parametric_ffwd_type_drc_params->gain_smooth_rel_alpha_slow; } + } + if (loc_db_gain < pstr_parametric_ffwd_type_drc_params->db_gain_smooth || + pstr_parametric_ffwd_type_drc_params->hold_counter == 0) { + pstr_parametric_ffwd_type_drc_params->db_level_smooth = + (1 - alpha) * pstr_parametric_ffwd_type_drc_params->db_level_smooth + + alpha * levelDb; + pstr_parametric_ffwd_type_drc_params->db_gain_smooth = + (1 - alpha) * pstr_parametric_ffwd_type_drc_params->db_gain_smooth + + alpha * loc_db_gain; + } + if (pstr_parametric_ffwd_type_drc_params->hold_counter) { + pstr_parametric_ffwd_type_drc_params->hold_counter -= 1; + } + if (loc_db_gain < pstr_parametric_ffwd_type_drc_params->db_gain_smooth) { + pstr_parametric_ffwd_type_drc_params->hold_counter = + pstr_parametric_ffwd_type_drc_params->gain_smooth_hold_off_count; + } + + str_spline_nodes->str_node[nodeIdx].loc_db_gain = + pstr_parametric_ffwd_type_drc_params->db_gain_smooth; + str_spline_nodes->str_node[nodeIdx].slope = 0.f; + str_spline_nodes->str_node[nodeIdx].time = + pstr_parametric_ffwd_type_drc_params->frame_size + offset - 1; - - str_spline_nodes->str_node[nodeIdx].loc_db_gain = pstr_parametric_ffwd_type_drc_params->db_gain_smooth; - str_spline_nodes->str_node[nodeIdx].slope = 0.f; - str_spline_nodes->str_node[nodeIdx].time = pstr_parametric_ffwd_type_drc_params->frame_size + offset - 1; - - - return 0; + return 0; } - -WORD32 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, - FLOAT32* lpcm_gains) -{ +WORD32 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, + FLOAT32* lpcm_gains) { WORD32 i, j; FLOAT32 tmp, gain; -// FLOAT32 min_gain = 1; + // FLOAT32 min_gain = 1; FLOAT32 maximum, sectionMaximum; - FLOAT32 loudness_normalization_gain = (FLOAT32)pow(10.0f, 0.05f * loudness_normalization_gain_db); - FLOAT32* level_estim_ch_weight = pstr_parametric_lim_type_drc_params->level_estim_ch_weight; - WORD32 num_channels = pstr_parametric_lim_type_drc_params->channels; - WORD32 attack_time_samples = pstr_parametric_lim_type_drc_params->attack; - FLOAT32 attack_constant = pstr_parametric_lim_type_drc_params->attack_constant; - FLOAT32 release_constant = pstr_parametric_lim_type_drc_params->release_constant; - FLOAT32 limit_threshold = pstr_parametric_lim_type_drc_params->threshold; - FLOAT32* max_buf = pstr_parametric_lim_type_drc_params->max_buf; - FLOAT32 gain_modified = pstr_parametric_lim_type_drc_params->cor; - FLOAT64 pre_smoothed_gain = pstr_parametric_lim_type_drc_params->smooth_state_0; - - - - - - for (i = 0; i < pstr_parametric_lim_type_drc_params->frame_size; i++) { - tmp =0.0f; - for (j = 0; j < num_channels; j++){ - if (!level_estim_ch_weight[j]) - continue; - tmp = max(tmp, (FLOAT32)fabs(loudness_normalization_gain*(level_estim_ch_weight[j])*(samples[j][i]))); - } - - for (j = attack_time_samples; j >0; j--) { - max_buf[j]=max_buf[j-1]; - } - max_buf[0] = tmp; - sectionMaximum=tmp; - for (j = 1; j < (attack_time_samples+1); j++) { - if (max_buf[j] > sectionMaximum) - sectionMaximum = max_buf[j]; - } - maximum=sectionMaximum; - - if (maximum > limit_threshold) { - gain = limit_threshold / maximum; - } - else { - gain = 1; - } + FLOAT32 loudness_normalization_gain = + (FLOAT32)pow(10.0f, 0.05f * loudness_normalization_gain_db); + FLOAT32* level_estim_ch_weight = + pstr_parametric_lim_type_drc_params->level_estim_ch_weight; + WORD32 num_channels = pstr_parametric_lim_type_drc_params->channels; + WORD32 attack_time_samples = pstr_parametric_lim_type_drc_params->attack; + FLOAT32 attack_constant = + pstr_parametric_lim_type_drc_params->attack_constant; + FLOAT32 release_constant = + pstr_parametric_lim_type_drc_params->release_constant; + FLOAT32 limit_threshold = pstr_parametric_lim_type_drc_params->threshold; + FLOAT32* max_buf = pstr_parametric_lim_type_drc_params->max_buf; + FLOAT32 gain_modified = pstr_parametric_lim_type_drc_params->cor; + FLOAT64 pre_smoothed_gain = + pstr_parametric_lim_type_drc_params->smooth_state_0; + + for (i = 0; i < pstr_parametric_lim_type_drc_params->frame_size; i++) { + tmp = 0.0f; + for (j = 0; j < num_channels; j++) { + if (!level_estim_ch_weight[j]) continue; + tmp = + max(tmp, (FLOAT32)fabs(loudness_normalization_gain * + (level_estim_ch_weight[j]) * (samples[j][i]))); + } - if (gain < pre_smoothed_gain) { - gain_modified = min(gain_modified, (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f); - } - else { - gain_modified = gain; - } + for (j = attack_time_samples; j > 0; j--) { + max_buf[j] = max_buf[j - 1]; + } + max_buf[0] = tmp; + sectionMaximum = tmp; + for (j = 1; j < (attack_time_samples + 1); j++) { + if (max_buf[j] > sectionMaximum) sectionMaximum = max_buf[j]; + } + maximum = sectionMaximum; - if (gain_modified < pre_smoothed_gain) { - pre_smoothed_gain = attack_constant * (pre_smoothed_gain - gain_modified) + gain_modified; - pre_smoothed_gain = max(pre_smoothed_gain, gain); - } - else { - pre_smoothed_gain = release_constant * (pre_smoothed_gain - gain_modified) + gain_modified; - } + if (maximum > limit_threshold) { + gain = limit_threshold / maximum; + } else { + gain = 1; + } - gain = (FLOAT32)pre_smoothed_gain; + if (gain < pre_smoothed_gain) { + gain_modified = + min(gain_modified, + (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f); + } else { + gain_modified = gain; + } - lpcm_gains[i] = gain; + if (gain_modified < pre_smoothed_gain) { + pre_smoothed_gain = + attack_constant * (pre_smoothed_gain - gain_modified) + gain_modified; + pre_smoothed_gain = max(pre_smoothed_gain, gain); + } else { + pre_smoothed_gain = + release_constant * (pre_smoothed_gain - gain_modified) + + gain_modified; } + gain = (FLOAT32)pre_smoothed_gain; + + lpcm_gains[i] = gain; + } - pstr_parametric_lim_type_drc_params->cor = gain_modified; - pstr_parametric_lim_type_drc_params->smooth_state_0 = pre_smoothed_gain; + pstr_parametric_lim_type_drc_params->cor = gain_modified; + pstr_parametric_lim_type_drc_params->smooth_state_0 = pre_smoothed_gain; return 0; } - - - - - diff --git a/decoder/drc_src/impd_drc_parser.h b/decoder/drc_src/impd_drc_parser.h index 57948ae..75c548b 100644 --- a/decoder/drc_src/impd_drc_parser.h +++ b/decoder/drc_src/impd_drc_parser.h @@ -22,88 +22,80 @@ WORD32 impd_dec_ducking_scaling(ia_bit_buf_struct* it_bit_buff, - WORD32* ducking_scaling_flag, - FLOAT32* ducking_scaling); + WORD32* ducking_scaling_flag, + FLOAT32* ducking_scaling); WORD32 -impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_loudness_info_struct* loudness_info); - +impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_loudness_info_struct* loudness_info); WORD32 -impd_parse_loudness_info_set_ext(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* loudness_info_set); +impd_parse_loudness_info_set_ext( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* loudness_info_set); WORD32 -impd_sel_drc_coeff(ia_drc_config* drc_config, - WORD32 location, - ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); +impd_sel_drc_coeff( + ia_drc_config* drc_config, WORD32 location, + ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); WORD32 -impd_drc_parse_instructions_basic(ia_bit_buf_struct* it_bit_buff, - ia_drc_instructions_basic_struct* str_drc_instructions_basic); +impd_drc_parse_instructions_basic( + ia_bit_buf_struct* it_bit_buff, + ia_drc_instructions_basic_struct* str_drc_instructions_basic); WORD32 -impd_parse_drc_instructions_uni_drc(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_config* drc_config, - ia_drc_instructions_struct* str_drc_instruction_str); - +impd_parse_drc_instructions_uni_drc( + ia_bit_buf_struct* it_bit_buff, WORD32 version, ia_drc_config* drc_config, + ia_drc_instructions_struct* str_drc_instruction_str); WORD32 -impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - WORD32* gain_seq_idx, - ia_gain_set_params_struct* gain_set_params); +impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, WORD32 version, + WORD32* gain_seq_idx, + ia_gain_set_params_struct* gain_set_params); WORD32 -impd_drc_parse_coeff(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc); +impd_drc_parse_coeff( + ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc); WORD32 -impd_parse_dwnmix_instructions(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_channel_layout_struct* channel_layout, - ia_downmix_instructions_struct* dwnmix_instructions); +impd_parse_dwnmix_instructions( + ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_channel_layout_struct* channel_layout, + ia_downmix_instructions_struct* dwnmix_instructions); WORD32 -impd_parse_drc_ext_v1( - ia_bit_buf_struct* it_bit_buff, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_config* drc_config, - ia_drc_config_ext* str_drc_config_ext); +impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_drc_config* drc_config, + ia_drc_config_ext* str_drc_config_ext); WORD32 -impd_parse_drc_config( - ia_bit_buf_struct* it_bit_buff, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_config* drc_config - ); +impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_drc_config* drc_config); WORD32 -impd_parse_loudness_info_set(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* loudness_info_set); +impd_parse_loudness_info_set( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* loudness_info_set); WORD32 -impd_parse_drc_gain_sequence( - ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, - ia_gain_set_params_struct* gain_set_params, - ia_drc_gain_sequence_struct* drc_gain_sequence); +impd_parse_drc_gain_sequence(ia_bit_buf_struct* it_bit_buff, + ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, + ia_gain_set_params_struct* gain_set_params, + ia_drc_gain_sequence_struct* drc_gain_sequence); WORD32 impd_parse_uni_drc_gain_ext(ia_bit_buf_struct* it_bit_buff, - ia_uni_drc_gain_ext_struct* uni_drc_gain_ext); - -WORD32 impd_drc_uni_gain_read( - ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, - ia_drc_config* drc_config, - ia_drc_gain_struct* pstr_uni_drc_gain); + ia_uni_drc_gain_ext_struct* uni_drc_gain_ext); +WORD32 impd_drc_uni_gain_read(ia_bit_buf_struct* it_bit_buff, + ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, + ia_drc_config* drc_config, + ia_drc_gain_struct* pstr_uni_drc_gain); #endif diff --git a/decoder/drc_src/impd_drc_parser_interface.h b/decoder/drc_src/impd_drc_parser_interface.h index d1be9c2..07ef9f9 100644 --- a/decoder/drc_src/impd_drc_parser_interface.h +++ b/decoder/drc_src/impd_drc_parser_interface.h @@ -21,36 +21,41 @@ #define IMPD_DRC_PARSER_INTERFACE_H WORD32 -impd_unidrc_interface_signature_read(ia_bit_buf_struct* it_bit_buff, - ia_drc_uni_interface_signat_struct* drc_uni_interface_signature); +impd_unidrc_interface_signature_read( + ia_bit_buf_struct* it_bit_buff, + ia_drc_uni_interface_signat_struct* drc_uni_interface_signature); WORD32 impd_sys_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_system_interface_struct* system_interface); + ia_system_interface_struct* system_interface); WORD32 -impd_loudness_norm_control_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_loudness_norm_ctrl_interface_struct* loudness_norm_ctrl_interface); +impd_loudness_norm_control_interface_read( + ia_bit_buf_struct* it_bit_buff, + ia_loudness_norm_ctrl_interface_struct* loudness_norm_ctrl_interface); WORD32 -impd_loudness_norm_param_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_loudness_norm_parameter_interface_struct* loudness_norm_param_interface); +impd_loudness_norm_param_interface_read( + ia_bit_buf_struct* it_bit_buff, + ia_loudness_norm_parameter_interface_struct* loudness_norm_param_interface); WORD32 impd_drc_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_dyn_rng_ctrl_interface_struct* drc_ctrl_interface); + ia_dyn_rng_ctrl_interface_struct* drc_ctrl_interface); WORD32 -impd_drc_param_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_drc_parameter_interface_struct* drc_parameter_interface); +impd_drc_param_interface_read( + ia_bit_buf_struct* it_bit_buff, + ia_drc_parameter_interface_struct* drc_parameter_interface); 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); +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 impd_unidrc_interface_read(ia_bit_buf_struct* it_bit_buff, - ia_drc_interface_struct* impd_drc_uni_interface); + ia_drc_interface_struct* impd_drc_uni_interface); #endif diff --git a/decoder/drc_src/impd_drc_peak_limiter.c b/decoder/drc_src/impd_drc_peak_limiter.c index aa813cc..2b013f7 100644 --- a/decoder/drc_src/impd_drc_peak_limiter.c +++ b/decoder/drc_src/impd_drc_peak_limiter.c @@ -26,168 +26,156 @@ #include "impd_drc_peak_limiter.h" #ifndef max -#define max(a, b) (((a) > (b)) ? (a) : (b)) +#define max(a, b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min -#define min(a, b) (((a) < (b)) ? (a) : (b)) +#define min(a, b) (((a) < (b)) ? (a) : (b)) #endif +WORD32 impd_peak_limiter_init(ia_drc_peak_limiter_struct *peak_limiter, + FLOAT32 attack_time, FLOAT32 release_time, + FLOAT32 limit_threshold, UWORD32 num_channels, + UWORD32 sample_rate, FLOAT32 *buffer) { + UWORD32 attack; + attack = (UWORD32)(attack_time * sample_rate / 1000); + + if (attack < 1) return 0; + + peak_limiter->max_buf = buffer; + peak_limiter->delayed_input = buffer + attack * 4 + 32; + + peak_limiter->delayed_input_index = 0; + peak_limiter->attack_time = attack_time; + peak_limiter->release_time = release_time; + peak_limiter->attack_time_samples = attack; + peak_limiter->attack_constant = (FLOAT32)pow(0.1, 1.0 / (attack + 1)); + peak_limiter->release_constant = + (FLOAT32)pow(0.1, 1.0 / (release_time * sample_rate / 1000 + 1)); + peak_limiter->limit_threshold = limit_threshold; + peak_limiter->num_channels = num_channels; + peak_limiter->sample_rate = sample_rate; + peak_limiter->min_gain = 1.0f; + peak_limiter->limiter_on = 1; + peak_limiter->pre_smoothed_gain = 1.0f; + peak_limiter->gain_modified = 1.0f; - -WORD32 impd_peak_limiter_init( ia_drc_peak_limiter_struct *peak_limiter, - FLOAT32 attack_time, - FLOAT32 release_time, - FLOAT32 limit_threshold, - UWORD32 num_channels, - UWORD32 sample_rate, - FLOAT32 *buffer - ) -{ - - UWORD32 attack; - attack = (UWORD32)(attack_time * sample_rate / 1000); - - if (attack < 1) - return 0; - - peak_limiter->max_buf=buffer; - peak_limiter->delayed_input=buffer+attack*4+32; - - peak_limiter->delayed_input_index = 0; - peak_limiter->attack_time = attack_time; - peak_limiter->release_time = release_time; - peak_limiter->attack_time_samples = attack; - peak_limiter->attack_constant = (FLOAT32)pow(0.1, 1.0 / (attack + 1)); - peak_limiter->release_constant = (FLOAT32)pow(0.1, 1.0 / (release_time * sample_rate / 1000 + 1)); - peak_limiter->limit_threshold = limit_threshold; - peak_limiter->num_channels = num_channels; - peak_limiter->sample_rate = sample_rate; - peak_limiter->min_gain = 1.0f; - peak_limiter->limiter_on=1; - peak_limiter->pre_smoothed_gain=1.0f; - peak_limiter->gain_modified=1.0f; - - return 0; + return 0; } -WORD32 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; - peak_limiter->gain_modified=1.0f; - peak_limiter->min_gain = 1.0f; - memset(peak_limiter->max_buf, 0, (peak_limiter->attack_time_samples + 1) * sizeof(FLOAT32) ); - memset(peak_limiter->delayed_input, 0, peak_limiter->attack_time_samples * peak_limiter->num_channels * sizeof(FLOAT32) ); - } +WORD32 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; + peak_limiter->gain_modified = 1.0f; + peak_limiter->min_gain = 1.0f; + memset(peak_limiter->max_buf, 0, + (peak_limiter->attack_time_samples + 1) * sizeof(FLOAT32)); + memset(peak_limiter->delayed_input, 0, peak_limiter->attack_time_samples * + peak_limiter->num_channels * + sizeof(FLOAT32)); + } - return 0; + return 0; } -WORD32 impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, FLOAT32 *samples, UWORD32 frame_len) -{ +WORD32 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; FLOAT32 maximum, sectionMaximum; - UWORD32 num_channels = peak_limiter->num_channels; - UWORD32 attack_time_samples = peak_limiter->attack_time_samples; - FLOAT32 attack_constant = peak_limiter->attack_constant; - FLOAT32 release_constant = peak_limiter->release_constant; - FLOAT32 limit_threshold = peak_limiter->limit_threshold; - FLOAT32* max_buf = peak_limiter->max_buf; - FLOAT32 gain_modified = peak_limiter->gain_modified; - FLOAT32* delayed_input = peak_limiter->delayed_input; - UWORD32 delayed_input_index = peak_limiter->delayed_input_index; - FLOAT64 pre_smoothed_gain = peak_limiter->pre_smoothed_gain; - - - + UWORD32 num_channels = peak_limiter->num_channels; + UWORD32 attack_time_samples = peak_limiter->attack_time_samples; + FLOAT32 attack_constant = peak_limiter->attack_constant; + FLOAT32 release_constant = peak_limiter->release_constant; + FLOAT32 limit_threshold = peak_limiter->limit_threshold; + FLOAT32 *max_buf = peak_limiter->max_buf; + FLOAT32 gain_modified = peak_limiter->gain_modified; + FLOAT32 *delayed_input = peak_limiter->delayed_input; + UWORD32 delayed_input_index = peak_limiter->delayed_input_index; + FLOAT64 pre_smoothed_gain = peak_limiter->pre_smoothed_gain; if (peak_limiter->limiter_on || (FLOAT32)pre_smoothed_gain < 1.0f) { for (i = 0; i < frame_len; i++) { - tmp =0.0f; + tmp = 0.0f; for (j = 0; j < num_channels; j++) { tmp = max(tmp, (FLOAT32)fabs(samples[i * num_channels + j])); } - for (j = attack_time_samples; j >0; j--) { - max_buf[j]=max_buf[j-1]; + for (j = attack_time_samples; j > 0; j--) { + max_buf[j] = max_buf[j - 1]; } max_buf[0] = tmp; - sectionMaximum=tmp; - for (j = 1; j < (attack_time_samples+1); j++) { - if (max_buf[j] > sectionMaximum) - sectionMaximum = max_buf[j]; + sectionMaximum = tmp; + for (j = 1; j < (attack_time_samples + 1); j++) { + if (max_buf[j] > sectionMaximum) sectionMaximum = max_buf[j]; } - maximum=sectionMaximum; + maximum = sectionMaximum; if (maximum > limit_threshold) { gain = limit_threshold / maximum; - } - else { + } else { gain = 1; } if (gain < pre_smoothed_gain) { - gain_modified = min(gain_modified, (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f); - } - else { + gain_modified = + min(gain_modified, + (gain - 0.1f * (FLOAT32)pre_smoothed_gain) * 1.11111111f); + } else { gain_modified = gain; } if (gain_modified < pre_smoothed_gain) { - pre_smoothed_gain = attack_constant * (pre_smoothed_gain - gain_modified) + gain_modified; + pre_smoothed_gain = + attack_constant * (pre_smoothed_gain - gain_modified) + + gain_modified; pre_smoothed_gain = max(pre_smoothed_gain, gain); - } - else { - pre_smoothed_gain = release_constant * (pre_smoothed_gain - gain_modified) + gain_modified; + } else { + pre_smoothed_gain = + release_constant * (pre_smoothed_gain - gain_modified) + + gain_modified; } gain = (FLOAT32)pre_smoothed_gain; for (j = 0; j < num_channels; j++) { tmp = delayed_input[delayed_input_index * num_channels + j]; - delayed_input[delayed_input_index * num_channels + j] = samples[i * num_channels + j]; + delayed_input[delayed_input_index * num_channels + j] = + samples[i * num_channels + j]; tmp *= gain; if (tmp > limit_threshold) - tmp = limit_threshold; + tmp = limit_threshold; else if (tmp < -limit_threshold) - tmp = -limit_threshold; + tmp = -limit_threshold; samples[i * num_channels + j] = tmp; } delayed_input_index++; - if (delayed_input_index >= attack_time_samples) - delayed_input_index = 0; + if (delayed_input_index >= attack_time_samples) delayed_input_index = 0; - if (gain < min_gain) - min_gain = gain; + if (gain < min_gain) min_gain = gain; } - } - else { + } else { for (i = 0; i < frame_len; i++) { for (j = 0; j < num_channels; j++) { tmp = delayed_input[delayed_input_index * num_channels + j]; - delayed_input[delayed_input_index * num_channels + j] = samples[i * num_channels + j]; + delayed_input[delayed_input_index * num_channels + j] = + samples[i * num_channels + j]; samples[i * num_channels + j] = tmp; } delayed_input_index++; - if (delayed_input_index >= attack_time_samples) - delayed_input_index = 0; + if (delayed_input_index >= attack_time_samples) delayed_input_index = 0; } } - peak_limiter->gain_modified = gain_modified; + peak_limiter->gain_modified = gain_modified; peak_limiter->delayed_input_index = delayed_input_index; - peak_limiter->pre_smoothed_gain = pre_smoothed_gain; - peak_limiter->min_gain = min_gain; + peak_limiter->pre_smoothed_gain = pre_smoothed_gain; + peak_limiter->min_gain = min_gain; return 0; } - - diff --git a/decoder/drc_src/impd_drc_peak_limiter.h b/decoder/drc_src/impd_drc_peak_limiter.h index 90f5478..d4ba07f 100644 --- a/decoder/drc_src/impd_drc_peak_limiter.h +++ b/decoder/drc_src/impd_drc_peak_limiter.h @@ -20,38 +20,34 @@ #ifndef IMPD_DRC_PEAK_LIMITER_H #define IMPD_DRC_PEAK_LIMITER_H - -#define DEFAULT_ATTACK_TIME_MS (5.0f) /* default attack time in ms */ -#define DEFAULT_RELEASE_TIME_MS (50.0f) /* default release time in ms */ - +#define DEFAULT_ATTACK_TIME_MS (5.0f) /* default attack time in ms */ +#define DEFAULT_RELEASE_TIME_MS (50.0f) /* default release time in ms */ typedef struct ia_drc_peak_limiter_struct { - FLOAT32 attack_time; - FLOAT32 release_time; - FLOAT32 attack_constant; - FLOAT32 release_constant; - FLOAT32 limit_threshold; - UWORD32 num_channels; - UWORD32 sample_rate; - UWORD32 attack_time_samples; - UWORD32 limiter_on; - FLOAT32 gain_modified; - FLOAT64 pre_smoothed_gain; - FLOAT32* delayed_input; - UWORD32 delayed_input_index; - FLOAT32* max_buf; - FLOAT32 min_gain; - FLOAT32* buffer; -}ia_drc_peak_limiter_struct; + FLOAT32 attack_time; + FLOAT32 release_time; + FLOAT32 attack_constant; + FLOAT32 release_constant; + FLOAT32 limit_threshold; + UWORD32 num_channels; + UWORD32 sample_rate; + UWORD32 attack_time_samples; + UWORD32 limiter_on; + FLOAT32 gain_modified; + FLOAT64 pre_smoothed_gain; + FLOAT32 *delayed_input; + UWORD32 delayed_input_index; + FLOAT32 *max_buf; + FLOAT32 min_gain; + FLOAT32 *buffer; +} ia_drc_peak_limiter_struct; WORD32 impd_peak_limiter_init(ia_drc_peak_limiter_struct *peak_limiter, - FLOAT32 attack_time, - FLOAT32 release_time, - FLOAT32 limit_threshold, - UWORD32 num_channels, - UWORD32 sample_rate, - FLOAT32 *buffer); + FLOAT32 attack_time, FLOAT32 release_time, + 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); +WORD32 impd_limiter_process(ia_drc_peak_limiter_struct *peak_limiter, + FLOAT32 *samples, UWORD32 frame_len); #endif diff --git a/decoder/drc_src/impd_drc_peak_limiter_struct.h b/decoder/drc_src/impd_drc_peak_limiter_struct.h index d025ce5..9ac6189 100644 --- a/decoder/drc_src/impd_drc_peak_limiter_struct.h +++ b/decoder/drc_src/impd_drc_peak_limiter_struct.h @@ -20,31 +20,26 @@ #ifndef IMPD_DRC_PEAK_LIMITER_STRUCT_H #define IMPD_DRC_PEAK_LIMITER_STRUCT_H - - -#define DEFAULT_ATTACK_TIME_MS (5.0f) /* default attack time in ms */ -#define DEFAULT_RELEASE_TIME_MS (50.0f) /* default release time in ms */ - +#define DEFAULT_ATTACK_TIME_MS (5.0f) /* default attack time in ms */ +#define DEFAULT_RELEASE_TIME_MS (50.0f) /* default release time in ms */ typedef struct ia_drc_peak_limiter_struct { - FLOAT32 attack_time; - FLOAT32 release_time; - FLOAT32 attack_constant; - FLOAT32 release_constant; - FLOAT32 limit_threshold; - UWORD32 num_channels; - UWORD32 sample_rate; - UWORD32 attack_time_samples; - UWORD32 limiter_on; - FLOAT32 gain_modified; - FLOAT64 pre_smoothed_gain; - FLOAT32* delayed_input; - UWORD32 delayed_input_index; - FLOAT32* max_buf; - FLOAT32 min_gain; - FLOAT32* buffer; -}ia_drc_peak_limiter_struct; + FLOAT32 attack_time; + FLOAT32 release_time; + FLOAT32 attack_constant; + FLOAT32 release_constant; + FLOAT32 limit_threshold; + UWORD32 num_channels; + UWORD32 sample_rate; + UWORD32 attack_time_samples; + UWORD32 limiter_on; + FLOAT32 gain_modified; + FLOAT64 pre_smoothed_gain; + FLOAT32* delayed_input; + UWORD32 delayed_input_index; + FLOAT32* max_buf; + FLOAT32 min_gain; + FLOAT32* buffer; +} ia_drc_peak_limiter_struct; #endif - - diff --git a/decoder/drc_src/impd_drc_process.c b/decoder/drc_src/impd_drc_process.c index 8370907..15115a2 100644 --- a/decoder/drc_src/impd_drc_process.c +++ b/decoder/drc_src/impd_drc_process.c @@ -31,527 +31,556 @@ #include "impd_drc_gain_dec.h" #include "impd_drc_process_audio.h" - -WORD32 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, - ia_gain_buffer_struct* pstr_gain_buf, - shape_filter_block shape_filter_block[], - FLOAT32* deinterleaved_audio[], - - FLOAT32* channel_audio[], - WORD32 impd_apply_gains) -{ - WORD32 c, b, g, i; - WORD32 offset = 0, signalIndex = 0; - WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; - WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT]; - FLOAT32* lpcm_gains; - FLOAT32 sum; - FLOAT32 drc_gain_last, gainThr; - WORD32 iEnd, iStart; - ia_drc_instructions_struct* str_drc_instruction_str = &(pstr_drc_instruction_arr[drc_instructions_index]); - - if (drc_instructions_index >= 0) +WORD32 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, + ia_gain_buffer_struct* pstr_gain_buf, + shape_filter_block shape_filter_block[], FLOAT32* deinterleaved_audio[], + + FLOAT32* channel_audio[], WORD32 impd_apply_gains) { + WORD32 c, b, g, i; + WORD32 offset = 0, signalIndex = 0; + WORD32 gainIndexForGroup[CHANNEL_GROUP_COUNT_MAX]; + WORD32 signalIndexForChannel[MAX_CHANNEL_COUNT]; + FLOAT32* lpcm_gains; + FLOAT32 sum; + FLOAT32 drc_gain_last, gainThr; + WORD32 iEnd, iStart; + ia_drc_instructions_struct* str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); + + if (drc_instructions_index >= 0) { + str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); { - 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]; - } - signalIndexForChannel[0] = 0; - for (c=0; c<str_drc_instruction_str->audio_num_chan-1; c++) - { - if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) - { - signalIndexForChannel[c+1] = signalIndexForChannel[c] + str_drc_instruction_str->band_count_of_ch_group[str_drc_instruction_str->channel_group_of_ch[c]]; - } - else - { - signalIndexForChannel[c+1] = signalIndexForChannel[c] + 1; - } - } - - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups; g++) - { - 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; - } - iEnd = 0; - iStart = 0; - while (iEnd < ia_drc_params_struct->drc_frame_size) - { - if (shape_filter_block[g].shape_flter_block_flag) { - drc_gain_last = shape_filter_block[g].drc_gain_last; - gainThr = 0.0001f * drc_gain_last; - while ((iEnd<ia_drc_params_struct->drc_frame_size) && (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr)) iEnd++; - } - else - { - iEnd = ia_drc_params_struct->drc_frame_size; - } - - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) - - { - if (g == str_drc_instruction_str->channel_group_of_ch[c]) - { - signalIndex = signalIndexForChannel[c] + b; - - if(impd_apply_gains == 1) { - - impd_shape_filt_block_time_process(&shape_filter_block[g], - &lpcm_gains[0], - signalIndex, - &deinterleaved_audio[signalIndex][0], - iStart, - iEnd); - - } - else { - for (i=iStart; i<iEnd; i++){ - deinterleaved_audio[signalIndex][i] = lpcm_gains[i]; - } - } - - - - - } - - + 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]; + } + signalIndexForChannel[0] = 0; + for (c = 0; c < str_drc_instruction_str->audio_num_chan - 1; c++) { + if (str_drc_instruction_str->channel_group_of_ch[c] >= 0) { + signalIndexForChannel[c + 1] = + signalIndexForChannel[c] + + str_drc_instruction_str->band_count_of_ch_group + [str_drc_instruction_str->channel_group_of_ch[c]]; + } else { + signalIndexForChannel[c + 1] = signalIndexForChannel[c] + 1; + } + } + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { + 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; + } + iEnd = 0; + iStart = 0; + while (iEnd < ia_drc_params_struct->drc_frame_size) { + if (shape_filter_block[g].shape_flter_block_flag) { + drc_gain_last = shape_filter_block[g].drc_gain_last; + gainThr = 0.0001f * drc_gain_last; + while ((iEnd < ia_drc_params_struct->drc_frame_size) && + (fabs(lpcm_gains[iEnd] - drc_gain_last) <= gainThr)) + iEnd++; + } else { + iEnd = ia_drc_params_struct->drc_frame_size; + } + + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) + + { + if (g == str_drc_instruction_str->channel_group_of_ch[c]) { + signalIndex = signalIndexForChannel[c] + b; + + if (impd_apply_gains == 1) { + impd_shape_filt_block_time_process( + &shape_filter_block[g], &lpcm_gains[0], signalIndex, + &deinterleaved_audio[signalIndex][0], iStart, iEnd); + + } else { + for (i = iStart; i < iEnd; i++) { + deinterleaved_audio[signalIndex][i] = lpcm_gains[i]; } - if ((iEnd < ia_drc_params_struct->drc_frame_size) && (shape_filter_block[g].shape_flter_block_flag)) - { - impd_shape_filt_block_adapt(lpcm_gains[iEnd], &shape_filter_block[g]); - } - iStart = iEnd; - } - } + } } + } + if ((iEnd < ia_drc_params_struct->drc_frame_size) && + (shape_filter_block[g].shape_flter_block_flag)) { + impd_shape_filt_block_adapt(lpcm_gains[iEnd], + &shape_filter_block[g]); + } + iStart = iEnd; } + } } + } } + } -signalIndex=0; - -if (str_drc_instruction_str->drc_set_id > 0) - { - - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) + signalIndex = 0; - { - 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 += deinterleaved_audio[signalIndex+b][i]; - } + if (str_drc_instruction_str->drc_set_id > 0) { + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) - channel_audio[c][i] = sum; - - } - signalIndex += str_drc_instruction_str->band_count_of_ch_group[g]; - } - else - { - for (i=0; i<ia_drc_params_struct->drc_frame_size; i++) - { - channel_audio[c][i] = deinterleaved_audio[signalIndex][i]; - } - 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] = deinterleaved_audio[c][i]; - } + 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 += deinterleaved_audio[signalIndex + b][i]; + } + + channel_audio[c][i] = sum; + } + signalIndex += str_drc_instruction_str->band_count_of_ch_group[g]; + } else { + for (i = 0; i < ia_drc_params_struct->drc_frame_size; i++) { + channel_audio[c][i] = deinterleaved_audio[signalIndex][i]; } + 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] = deinterleaved_audio[c][i]; + } + } + } - - - - - - - - - - - - - - return (0); + 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) +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]); { - 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 */ - } + 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++) - 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]; - } - } - } + { + 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; } - signalIndex++; + /* 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 (0); } 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, - FLOAT32* audio_io_buf[], - ia_audio_band_buffer_struct* audio_band_buffer, - ia_filter_banks_struct* ia_filter_banks_struct, - const WORD32 passThru) -{ - WORD32 c, g, e, i, num_bands; - //WORD32 err = 0; - FLOAT32* audio_in; - FLOAT32** audio_out; - ia_drc_filter_bank_struct* str_drc_filter_bank; - ia_drc_instructions_struct* str_drc_instruction_str; - WORD32 drc_frame_size = ia_drc_params_struct->drc_frame_size; - - if (drc_instructions_index >= 0) { - str_drc_instruction_str = &(pstr_drc_instruction_arr[drc_instructions_index]); - } else { - return -1; - } - - e=0; - - for (c=0; c<str_drc_instruction_str->audio_num_chan; c++) - - { - str_drc_filter_bank = NULL; - - audio_in = audio_io_buf[c]; - - audio_out = &(audio_band_buffer->non_interleaved_audio[e]); - if ((passThru == 0) && (drc_instructions_index >= 0)) - { - if (str_drc_instruction_str->drc_set_id < 0) - { - num_bands = 1; - } - else - { - g = str_drc_instruction_str->channel_group_of_ch[c]; - if (g== -1) - { - num_bands = 1; - //if (ia_filter_banks_struct->str_drc_filter_bank != NULL) - //{ - str_drc_filter_bank = &(ia_filter_banks_struct->str_drc_filter_bank[str_drc_instruction_str->num_drc_ch_groups]); - //} - } - else - { - num_bands = str_drc_instruction_str->band_count_of_ch_group[g]; - //if (ia_filter_banks_struct->str_drc_filter_bank != NULL) - //{ - str_drc_filter_bank = &(ia_filter_banks_struct->str_drc_filter_bank[g]); - //} - } - //if (ia_filter_banks_struct->str_drc_filter_bank != NULL) - //{ - //if (&str_drc_filter_bank->str_all_pass_cascade != NULL) - //{ - impd_all_pass_cascade_process(&str_drc_filter_bank->str_all_pass_cascade, c, drc_frame_size, audio_in); - //} - //} - } - } - else - { - num_bands = 1; + const WORD32 drc_instructions_index, + ia_drc_params_struct* ia_drc_params_struct, + FLOAT32* audio_io_buf[], + ia_audio_band_buffer_struct* audio_band_buffer, + ia_filter_banks_struct* ia_filter_banks_struct, + const WORD32 passThru) { + WORD32 c, g, e, i, num_bands; + // WORD32 err = 0; + FLOAT32* audio_in; + FLOAT32** audio_out; + ia_drc_filter_bank_struct* str_drc_filter_bank; + ia_drc_instructions_struct* str_drc_instruction_str; + WORD32 drc_frame_size = ia_drc_params_struct->drc_frame_size; + + if (drc_instructions_index >= 0) { + str_drc_instruction_str = + &(pstr_drc_instruction_arr[drc_instructions_index]); + } else { + return -1; + } + + e = 0; + + for (c = 0; c < str_drc_instruction_str->audio_num_chan; c++) + + { + str_drc_filter_bank = NULL; + + audio_in = audio_io_buf[c]; + + audio_out = &(audio_band_buffer->non_interleaved_audio[e]); + if ((passThru == 0) && (drc_instructions_index >= 0)) { + if (str_drc_instruction_str->drc_set_id < 0) { + num_bands = 1; + } else { + g = str_drc_instruction_str->channel_group_of_ch[c]; + if (g == -1) { + num_bands = 1; + // if (ia_filter_banks_struct->str_drc_filter_bank != NULL) + //{ + str_drc_filter_bank = + &(ia_filter_banks_struct->str_drc_filter_bank + [str_drc_instruction_str->num_drc_ch_groups]); + //} + } else { + num_bands = str_drc_instruction_str->band_count_of_ch_group[g]; + // if (ia_filter_banks_struct->str_drc_filter_bank != NULL) + //{ + str_drc_filter_bank = + &(ia_filter_banks_struct->str_drc_filter_bank[g]); + //} } - switch (num_bands) { - case 1: - for (i=0; i<drc_frame_size; i++) - { - audio_out[0][i] = audio_in[i]; - } - e++; - break; - case 2: - impd_two_band_filter_process(&str_drc_filter_bank->str_two_band_bank, - c, - drc_frame_size, - audio_in, - audio_out); - e+=2; - break; - case 3: - impd_three_band_filter_process(&str_drc_filter_bank->str_three_band_bank, - c, - drc_frame_size, - audio_in, - audio_out); - e+=3; - break; - case 4: - impd_four_band_filter_process(&str_drc_filter_bank->str_four_band_bank, - c, - drc_frame_size, - audio_in, - audio_out); - e+=4; - break; - default: - return (PARAM_ERROR); - break; + // if (ia_filter_banks_struct->str_drc_filter_bank != NULL) + //{ + // if (&str_drc_filter_bank->str_all_pass_cascade != NULL) + //{ + impd_all_pass_cascade_process( + &str_drc_filter_bank->str_all_pass_cascade, c, drc_frame_size, + audio_in); + //} + //} + } + } else { + num_bands = 1; + } + switch (num_bands) { + case 1: + for (i = 0; i < drc_frame_size; i++) { + audio_out[0][i] = audio_in[i]; } + e++; + break; + case 2: + impd_two_band_filter_process(&str_drc_filter_bank->str_two_band_bank, c, + drc_frame_size, audio_in, audio_out); + e += 2; + break; + case 3: + impd_three_band_filter_process( + &str_drc_filter_bank->str_three_band_bank, c, drc_frame_size, + audio_in, audio_out); + e += 3; + break; + case 4: + impd_four_band_filter_process(&str_drc_filter_bank->str_four_band_bank, + c, drc_frame_size, audio_in, audio_out); + e += 4; + break; + default: + return (PARAM_ERROR); + break; } + } - return (0); + return (0); } - - WORD32 -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) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - for (j=0; j<audio_io_buf_internal->frame_size; j++) { - audio_io_buf_internal->audio_io_buffer_delayed[i][audio_io_buf_internal->audio_delay_samples+j] = audio_in_out_buf[i][j]; - } - } - } else { - audio_io_buf_internal->audio_io_buffer_delayed = audio_in_out_buf; - audio_io_buf_internal->audio_in_out_buf = audio_in_out_buf; +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) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + for (j = 0; j < audio_io_buf_internal->frame_size; j++) { + audio_io_buf_internal->audio_io_buffer_delayed + [i][audio_io_buf_internal->audio_delay_samples + j] = + audio_in_out_buf[i][j]; + } } + } else { + audio_io_buf_internal->audio_io_buffer_delayed = audio_in_out_buf; + audio_io_buf_internal->audio_in_out_buf = audio_in_out_buf; + } - return 0; + 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; +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]; + } } - - return 0; + } 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; } WORD32 -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) { - for (i=0; i<audio_io_buf_internal->audio_num_chan; i++) { - for (j=0; j<audio_io_buf_internal->frame_size; j++) { - audio_in_out_buf[i][j] = audio_io_buf_internal->audio_io_buffer_delayed[i][j]; - } - } +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) { + for (i = 0; i < audio_io_buf_internal->audio_num_chan; i++) { + for (j = 0; j < audio_io_buf_internal->frame_size; j++) { + audio_in_out_buf[i][j] = + audio_io_buf_internal->audio_io_buffer_delayed[i][j]; + } } + } - return 0; + return 0; } 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]; - } - } +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; + return 0; } WORD32 -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++) { - memmove(audio_io_buf_internal->audio_io_buffer_delayed[i], &audio_io_buf_internal->audio_io_buffer_delayed[i][audio_io_buf_internal->frame_size],sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_samples); - } +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++) { + memmove( + audio_io_buf_internal->audio_io_buffer_delayed[i], + &audio_io_buf_internal + ->audio_io_buffer_delayed[i][audio_io_buf_internal->frame_size], + sizeof(FLOAT32) * audio_io_buf_internal->audio_delay_samples); } + } - return 0; + 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); - } +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 0; } - diff --git a/decoder/drc_src/impd_drc_process_audio.h b/decoder/drc_src/impd_drc_process_audio.h index d7f8f5f..9a60280 100644 --- a/decoder/drc_src/impd_drc_process_audio.h +++ b/decoder/drc_src/impd_drc_process_audio.h @@ -21,70 +21,67 @@ #define IMPD_DRC_PROCESS_AUDIO_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct { - WORD32 multiband_audio_sig_count; - WORD32 frame_size; - FLOAT32** non_interleaved_audio; + WORD32 multiband_audio_sig_count; + WORD32 frame_size; + FLOAT32** non_interleaved_audio; } ia_audio_band_buffer_struct; typedef struct { - WORD32 audio_num_chan; - WORD32 frame_size; - WORD32 audio_sub_band_count; - WORD32 audio_sub_band_frame_size; - WORD32 audio_delay_samples; - WORD32 audio_delay_sub_band_samples; - FLOAT32** audio_io_buffer_delayed; - FLOAT32** audio_buffer_delayed_real; - FLOAT32** audio_buffer_delayed_imag; - FLOAT32** audio_in_out_buf; - FLOAT32** audio_real_buff; - FLOAT32** audio_imag_buff; + WORD32 audio_num_chan; + WORD32 frame_size; + WORD32 audio_sub_band_count; + WORD32 audio_sub_band_frame_size; + WORD32 audio_delay_samples; + WORD32 audio_delay_sub_band_samples; + FLOAT32** audio_io_buffer_delayed; + FLOAT32** audio_buffer_delayed_real; + FLOAT32** audio_buffer_delayed_imag; + FLOAT32** audio_in_out_buf; + FLOAT32** audio_real_buff; + FLOAT32** audio_imag_buff; } 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[]); - + 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, - FLOAT32* audio_io_buf[], - ia_audio_band_buffer_struct* audio_band_buffer, - ia_filter_banks_struct* ia_filter_banks_struct, - const WORD32 passThru); + const WORD32 drc_instructions_index, + ia_drc_params_struct* ia_drc_params_struct, + FLOAT32* audio_io_buf[], + ia_audio_band_buffer_struct* audio_band_buffer, + 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); +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); +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); +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); +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); diff --git a/decoder/drc_src/impd_drc_qmf_filter.h b/decoder/drc_src/impd_drc_qmf_filter.h index 051f44c..ab68ec1 100644 --- a/decoder/drc_src/impd_drc_qmf_filter.h +++ b/decoder/drc_src/impd_drc_qmf_filter.h @@ -20,21 +20,17 @@ #ifndef IMPD_DRC_QMF_FILTER_H #define IMPD_DRC_QMF_FILTER_H +#define QMF_NUM_FILT_BANDS 64 +#define QMF_FILT_RESOLUTION 64 -#define QMF_NUM_FILT_BANDS 64 -#define QMF_FILT_RESOLUTION 64 +typedef struct ia_drc_qmf_filt_struct { + FLOAT64* ana_buff; + FLOAT64* syn_buff; + FLOAT64 ana_tab_real[QMF_NUM_FILT_BANDS][2 * QMF_NUM_FILT_BANDS]; + FLOAT64 ana_tab_imag[QMF_NUM_FILT_BANDS][2 * QMF_NUM_FILT_BANDS]; + FLOAT64 syn_tab_real[2 * QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; + FLOAT64 syn_tab_imag[2 * QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; - -typedef struct ia_drc_qmf_filt_struct -{ - -FLOAT64* ana_buff; -FLOAT64* syn_buff; -FLOAT64 ana_tab_real[QMF_NUM_FILT_BANDS][2*QMF_NUM_FILT_BANDS]; -FLOAT64 ana_tab_imag[QMF_NUM_FILT_BANDS][2*QMF_NUM_FILT_BANDS]; -FLOAT64 syn_tab_real[2*QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; -FLOAT64 syn_tab_imag[2*QMF_NUM_FILT_BANDS][QMF_NUM_FILT_BANDS]; - -}ia_drc_qmf_filt_struct; +} ia_drc_qmf_filt_struct; #endif diff --git a/decoder/drc_src/impd_drc_rom.c b/decoder/drc_src/impd_drc_rom.c index e741dc0..ad264bb 100644 --- a/decoder/drc_src/impd_drc_rom.c +++ b/decoder/drc_src/impd_drc_rom.c @@ -28,501 +28,180 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" -const FLOAT32 samp_rate_tbl[13][12]= -{ - {1.559742927551f,-2.926673889160f,1.378173947334f,-1.844531774521f,0.855774641037f,0.997517585754f,-1.995035171509f,0.997517585754f,-1.995032072067f,0.995038211346f}, - {1.557545065880f,-2.905559301376f,1.361245870590f,-1.830842256546f,0.844074070454f,0.997298538685f,-1.994597077370f,0.997298538685f,-1.994593381882f,0.994600534439f}, - {1.547380685806f,-2.808161973953f,1.285161137581f,-1.767331838608f,0.791711509228f,0.996279776096f,-1.992559552193f,0.996279776096f,-1.992552518845f,0.992566406727f}, - {1.535182833672f,-2.691803932190f,1.198426246643f,-1.690699458122f,0.732504665852f,0.995044350624f,-1.990088701248f,0.995044350624f,-1.990076303482f,0.990100920200f}, - {1.530909657478f,-2.651169300079f,1.169166922569f,-1.663750052452f,0.712657511234f,0.994607865810f,-1.989215731621f,0.994607865810f,-1.989201068878f,0.989230215549f}, - {1.511321425438f,-2.465713739395f,1.042117238045f,-1.539572954178f,0.627297878265f,0.992580235004f,-1.985160470009f,0.992580235004f,-1.985132932663f,0.985188126564f}, - {1.488207340240f,-2.248480796814f,0.906192243099f,-1.391770243645f,0.537688970566f,0.990125238895f,-1.980250477791f,0.990125238895f,-1.980201482773f,0.980299532413f}, - {1.480212569237f,-2.173723459244f,0.862487196922f,-1.340346932411f,0.509323298931f,0.989259064198f,-1.978518128395f,0.989259064198f,-1.978460073471f,0.978576123714f}, - {1.444234013557f,-1.839543223381f,0.685432314873f,-1.107139229774f,0.397262454033f,0.985242545605f,-1.970485091209f,0.985242545605f,-1.970375299454f,0.970594763756f}, - {1.403080821037f,-1.461511373520f,0.519652962685f,-0.837045848370f,0.298268288374f,0.980395674706f,-1.960791349411f,0.980395674706f,-1.960597157478f,0.960985362530f}, - {1.389132857323f,-1.334347724915f,0.471855700016f,-0.744739949703f,0.271380871534f,0.978689610958f,-1.957379221916f,0.978689610958f,-1.957149744034f,0.957608699799f}, - {1.327733159065f,-0.780098080635f,0.309720277786f,-0.334008187056f,0.191363617778f,0.970807731152f,-1.941615462303f,0.970807731152f,-1.941183090210f,0.942047894001f}, - {1.308971643448f,-0.612507879734f,0.275601744652f,-0.207099482417f,0.179165065289f,0.968287348747f,-1.936574697495f,0.968287348747f,-1.936063885689f,0.937085747719f} -}; - - - -const ia_delta_gain_code_table_struct ia_drc_gain_tbls_prof_0_1[NUM_GAIN_TBL_PROF_0_1_ENTRIES] = -{ - { 2, 0x003 , -0.125f }, - { 2, 0x002 , 0.125f }, - { 3, 0x001 , -0.250f }, - { 3, 0x002 , 0.000f }, - { 4, 0x000 , -2.000f }, - { 5, 0x002 , -0.500f }, - { 5, 0x00F , -0.375f }, - { 5, 0x00E , 1.000f }, - { 6, 0x019 , -0.625f }, - { 6, 0x018 , 0.250f }, - { 6, 0x006 , 0.375f }, - { 7, 0x00F , -1.000f }, - { 7, 0x034 , -0.875f }, - { 7, 0x036 , -0.750f }, - { 7, 0x037 , 0.500f }, - { 8, 0x01D , 0.625f }, - { 9, 0x039 , -1.875f }, - { 9, 0x0D5 , -1.125f }, - { 9, 0x0D7 , 0.750f }, - { 9, 0x0D4 , 0.875f }, - { 10, 0x070 , -1.500f }, - { 10, 0x1AC , -1.375f }, - { 10, 0x1AD , -1.250f }, - { 11, 0x0E2 , -1.750f }, - { 11, 0x0E3 , -1.625f } +const FLOAT32 samp_rate_tbl[13][12] = { + {1.559742927551f, -2.926673889160f, 1.378173947334f, -1.844531774521f, + 0.855774641037f, 0.997517585754f, -1.995035171509f, 0.997517585754f, + -1.995032072067f, 0.995038211346f}, + {1.557545065880f, -2.905559301376f, 1.361245870590f, -1.830842256546f, + 0.844074070454f, 0.997298538685f, -1.994597077370f, 0.997298538685f, + -1.994593381882f, 0.994600534439f}, + {1.547380685806f, -2.808161973953f, 1.285161137581f, -1.767331838608f, + 0.791711509228f, 0.996279776096f, -1.992559552193f, 0.996279776096f, + -1.992552518845f, 0.992566406727f}, + {1.535182833672f, -2.691803932190f, 1.198426246643f, -1.690699458122f, + 0.732504665852f, 0.995044350624f, -1.990088701248f, 0.995044350624f, + -1.990076303482f, 0.990100920200f}, + {1.530909657478f, -2.651169300079f, 1.169166922569f, -1.663750052452f, + 0.712657511234f, 0.994607865810f, -1.989215731621f, 0.994607865810f, + -1.989201068878f, 0.989230215549f}, + {1.511321425438f, -2.465713739395f, 1.042117238045f, -1.539572954178f, + 0.627297878265f, 0.992580235004f, -1.985160470009f, 0.992580235004f, + -1.985132932663f, 0.985188126564f}, + {1.488207340240f, -2.248480796814f, 0.906192243099f, -1.391770243645f, + 0.537688970566f, 0.990125238895f, -1.980250477791f, 0.990125238895f, + -1.980201482773f, 0.980299532413f}, + {1.480212569237f, -2.173723459244f, 0.862487196922f, -1.340346932411f, + 0.509323298931f, 0.989259064198f, -1.978518128395f, 0.989259064198f, + -1.978460073471f, 0.978576123714f}, + {1.444234013557f, -1.839543223381f, 0.685432314873f, -1.107139229774f, + 0.397262454033f, 0.985242545605f, -1.970485091209f, 0.985242545605f, + -1.970375299454f, 0.970594763756f}, + {1.403080821037f, -1.461511373520f, 0.519652962685f, -0.837045848370f, + 0.298268288374f, 0.980395674706f, -1.960791349411f, 0.980395674706f, + -1.960597157478f, 0.960985362530f}, + {1.389132857323f, -1.334347724915f, 0.471855700016f, -0.744739949703f, + 0.271380871534f, 0.978689610958f, -1.957379221916f, 0.978689610958f, + -1.957149744034f, 0.957608699799f}, + {1.327733159065f, -0.780098080635f, 0.309720277786f, -0.334008187056f, + 0.191363617778f, 0.970807731152f, -1.941615462303f, 0.970807731152f, + -1.941183090210f, 0.942047894001f}, + {1.308971643448f, -0.612507879734f, 0.275601744652f, -0.207099482417f, + 0.179165065289f, 0.968287348747f, -1.936574697495f, 0.968287348747f, + -1.936063885689f, 0.937085747719f}}; -}; +const ia_delta_gain_code_table_struct + ia_drc_gain_tbls_prof_0_1[NUM_GAIN_TBL_PROF_0_1_ENTRIES] = { + {2, 0x003, -0.125f}, {2, 0x002, 0.125f}, {3, 0x001, -0.250f}, + {3, 0x002, 0.000f}, {4, 0x000, -2.000f}, {5, 0x002, -0.500f}, + {5, 0x00F, -0.375f}, {5, 0x00E, 1.000f}, {6, 0x019, -0.625f}, + {6, 0x018, 0.250f}, {6, 0x006, 0.375f}, {7, 0x00F, -1.000f}, + {7, 0x034, -0.875f}, {7, 0x036, -0.750f}, {7, 0x037, 0.500f}, + {8, 0x01D, 0.625f}, {9, 0x039, -1.875f}, {9, 0x0D5, -1.125f}, + {9, 0x0D7, 0.750f}, {9, 0x0D4, 0.875f}, {10, 0x070, -1.500f}, + {10, 0x1AC, -1.375f}, {10, 0x1AD, -1.250f}, {11, 0x0E2, -1.750f}, + {11, 0x0E3, -1.625f} -const ia_delta_gain_code_table_struct ia_drc_gain_tbls_prof_2[NUM_GAIN_TBL_PROF_2_ENTRIES] = -{ - { 3, 0x007, -0.125f }, - { 4, 0x00C, -0.625f }, - { 4, 0x009, -0.500f }, - { 4, 0x005, -0.375f }, - { 4, 0x003, -0.250f }, - { 4, 0x001, 0.000f }, - { 4, 0x00B, 0.125f }, - { 5, 0x011, -0.875f }, - { 5, 0x00E, -0.750f }, - { 5, 0x005, 0.250f }, - { 5, 0x004, 0.375f }, - { 5, 0x008, 0.500f }, - { 5, 0x000, 0.625f }, - { 5, 0x00D, 0.750f }, - { 5, 0x00F, 0.875f }, - { 5, 0x010, 1.000f }, - { 5, 0x01B, 1.125f }, - { 6, 0x02B, -1.250f }, - { 6, 0x028, -1.125f }, - { 6, 0x002, -1.000f }, - { 6, 0x012, 1.250f }, - { 6, 0x018, 1.375f }, - { 6, 0x029, 1.500f }, - { 7, 0x06A, -4.000f }, - { 7, 0x054, -1.750f }, - { 7, 0x068, -1.625f }, - { 7, 0x026, -1.500f }, - { 7, 0x006, -1.375f }, - { 7, 0x032, 1.625f }, - { 8, 0x0D2, -2.250f }, - { 8, 0x0AB, -2.125f }, - { 8, 0x0AA, -2.000f }, - { 8, 0x04F, -1.875f }, - { 8, 0x04E, 1.750f }, - { 8, 0x0D7, 1.875f }, - { 8, 0x00E, 2.000f }, - { 9, 0x1AD, -3.625f }, - { 9, 0x1AC, -3.375f }, - { 9, 0x1A6, -3.250f }, - { 9, 0x0CD, -3.125f }, - { 9, 0x0CE, -2.750f }, - { 9, 0x1A7, -2.625f }, - { 9, 0x01F, -2.500f }, - { 9, 0x0CC, -2.375f }, - { 10, 0x03C, -3.500f }, - { 10, 0x19E, -3.000f }, - { 10, 0x19F, -2.875f }, - { 11, 0x07A, -3.875f }, - { 11, 0x07B, -3.750f } }; -const FLOAT32 channel_weight[] = -{ - 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 -}; +const ia_delta_gain_code_table_struct + ia_drc_gain_tbls_prof_2[NUM_GAIN_TBL_PROF_2_ENTRIES] = { + {3, 0x007, -0.125f}, {4, 0x00C, -0.625f}, {4, 0x009, -0.500f}, + {4, 0x005, -0.375f}, {4, 0x003, -0.250f}, {4, 0x001, 0.000f}, + {4, 0x00B, 0.125f}, {5, 0x011, -0.875f}, {5, 0x00E, -0.750f}, + {5, 0x005, 0.250f}, {5, 0x004, 0.375f}, {5, 0x008, 0.500f}, + {5, 0x000, 0.625f}, {5, 0x00D, 0.750f}, {5, 0x00F, 0.875f}, + {5, 0x010, 1.000f}, {5, 0x01B, 1.125f}, {6, 0x02B, -1.250f}, + {6, 0x028, -1.125f}, {6, 0x002, -1.000f}, {6, 0x012, 1.250f}, + {6, 0x018, 1.375f}, {6, 0x029, 1.500f}, {7, 0x06A, -4.000f}, + {7, 0x054, -1.750f}, {7, 0x068, -1.625f}, {7, 0x026, -1.500f}, + {7, 0x006, -1.375f}, {7, 0x032, 1.625f}, {8, 0x0D2, -2.250f}, + {8, 0x0AB, -2.125f}, {8, 0x0AA, -2.000f}, {8, 0x04F, -1.875f}, + {8, 0x04E, 1.750f}, {8, 0x0D7, 1.875f}, {8, 0x00E, 2.000f}, + {9, 0x1AD, -3.625f}, {9, 0x1AC, -3.375f}, {9, 0x1A6, -3.250f}, + {9, 0x0CD, -3.125f}, {9, 0x0CE, -2.750f}, {9, 0x1A7, -2.625f}, + {9, 0x01F, -2.500f}, {9, 0x0CC, -2.375f}, {10, 0x03C, -3.500f}, + {10, 0x19E, -3.000f}, {10, 0x19F, -2.875f}, {11, 0x07A, -3.875f}, + {11, 0x07B, -3.750f}}; -const FLOAT32 dwnmix_coeff_v1[] = -{ - 10.00f, - 6.00f, - 4.50f, - 3.00f, - 1.50f, - 0.00f, - -0.50f, - -1.00f, - -1.50f, - -2.00f, - -2.50f, - -3.00f, - -3.50f, - -4.00f, - -4.50f, - -5.00f, - -5.50f, - -6.00f, - -6.50f, - -7.00f, - -7.50f, - -8.00f, - -9.00f, - -10.00f, - -11.00f, - -12.00f, - -15.00f, - -20.00f, - -25.00f, - -30.00f, - -40.00f, - -100000.0f -}; +const FLOAT32 channel_weight[] = { + 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}; -const FLOAT32 eq_slope_tbl [] = -{ - -32.0f, - -24.0f, - -18.0f, - -12.0f, - -7.0f, - -4.0f, - -2.0f, - -1.0f, - 1.0f, - 2.0f, - 4.0f, - 7.0f, - 12.0f, - 18.0f, - 24.0f, - 32.0f -}; +const FLOAT32 dwnmix_coeff_v1[] = { + 10.00f, 6.00f, 4.50f, 3.00f, 1.50f, 0.00f, -0.50f, -1.00f, + -1.50f, -2.00f, -2.50f, -3.00f, -3.50f, -4.00f, -4.50f, -5.00f, + -5.50f, -6.00f, -6.50f, -7.00f, -7.50f, -8.00f, -9.00f, -10.00f, + -11.00f, -12.00f, -15.00f, -20.00f, -25.00f, -30.00f, -40.00f, -100000.0f}; +const FLOAT32 eq_slope_tbl[] = {-32.0f, -24.0f, -18.0f, -12.0f, -7.0f, -4.0f, + -2.0f, -1.0f, 1.0f, 2.0f, 4.0f, 7.0f, + 12.0f, 18.0f, 24.0f, 32.0f}; -const FLOAT32 eq_gain_delta_tbl[] = -{ - -22.0f, - -16.0f, - -13.0f, - -11.0f, - -9.0f, - -7.0f, - -6.0f, - -5.0f, - -4.0f, - -3.0f, - -2.5f, - -2.0f, - -1.5f, - -1.0f, - -0.5f, - 0.0f, - 0.5f, - 1.0f, - 1.5f, - 2.0f, - 2.5f, - 3.0f, - 4.0f, - 5.0f, - 6.0f, - 7.0f, - 9.0f, - 11.0f, - 13.0f, - 16.0f, - 22.0f, - 32.0f, +const FLOAT32 eq_gain_delta_tbl[] = { + -22.0f, -16.0f, -13.0f, -11.0f, -9.0f, -7.0f, -6.0f, -5.0f, + -4.0f, -3.0f, -2.5f, -2.0f, -1.5f, -1.0f, -0.5f, 0.0f, + 0.5f, 1.0f, 1.5f, 2.0f, 2.5f, 3.0f, 4.0f, 5.0f, + 6.0f, 7.0f, 9.0f, 11.0f, 13.0f, 16.0f, 22.0f, 32.0f, }; +const FLOAT32 zero_pole_radius_tbl[] = { + 0.00000000E+00f, 7.57409621E-11f, 7.47451079E-09f, 7.37623509E-08f, + 3.37872933E-07f, 1.05439995E-06f, 2.61370951E-06f, 5.55702854E-06f, + 1.05878771E-05f, 1.85806475E-05f, 3.05868707E-05f, 4.78395414E-05f, + 7.17558214E-05f, 1.03938342E-04f, 1.46175269E-04f, 2.00439375E-04f, + 2.68886099E-04f, 3.53850890E-04f, 4.57845890E-04f, 5.83555840E-04f, + 7.33833469E-04f, 9.11694835E-04f, 1.12031354E-03f, 1.36301492E-03f, + 1.64327072E-03f, 1.96469179E-03f, 2.33102194E-03f, 2.74613220E-03f, + 3.21401190E-03f, 3.73876374E-03f, 4.32459544E-03f, 4.97581391E-03f, + 5.69681637E-03f, 6.49208482E-03f, 7.36617809E-03f, 8.32372531E-03f, + 9.36941616E-03f, 1.05079999E-02f, 1.17442720E-02f, 1.30830696E-02f, + 1.45292655E-02f, 1.60877611E-02f, 1.77634824E-02f, 1.95613634E-02f, + 2.14863531E-02f, 2.35434026E-02f, 2.57374570E-02f, 2.80734543E-02f, + 3.05563174E-02f, 3.31909470E-02f, 3.59822176E-02f, 3.89349759E-02f, + 4.20540236E-02f, 4.53441292E-02f, 4.88100089E-02f, 5.24563305E-02f, + 5.62877022E-02f, 6.03086725E-02f, 6.45237267E-02f, 6.89372867E-02f, + 7.35536888E-02f, 7.83772022E-02f, 8.34120139E-02f, 8.86622295E-02f, + 9.41318572E-02f, 9.98248383E-02f, 1.05744988E-01f, 1.11896060E-01f, + 1.18281692E-01f, 1.24905407E-01f, 1.31770656E-01f, 1.38880774E-01f, + 1.46238968E-01f, 1.53848350E-01f, 1.61711931E-01f, 1.69832602E-01f, + 1.78213134E-01f, 1.86856180E-01f, 1.95764288E-01f, 2.04939872E-01f, + 2.14385241E-01f, 2.24102572E-01f, 2.34093949E-01f, 2.44361281E-01f, + 2.54906416E-01f, 2.65731007E-01f, 2.76836663E-01f, 2.88224846E-01f, + 2.99896836E-01f, 3.11853856E-01f, 3.24096978E-01f, 3.36627185E-01f, + 3.49445283E-01f, 3.62551987E-01f, 3.75947863E-01f, 3.89633417E-01f, + 4.03608948E-01f, 4.17874694E-01f, 4.32430804E-01f, 4.47277188E-01f, + 4.62413728E-01f, 4.77840215E-01f, 4.93556231E-01f, 5.09561300E-01f, + 5.25854886E-01f, 5.42436182E-01f, 5.59304416E-01f, 5.76458573E-01f, + 5.93897760E-01f, 6.11620665E-01f, 6.29626155E-01f, 6.47912800E-01f, + 6.66479111E-01f, 6.85323536E-01f, 7.04444408E-01f, 7.23839939E-01f, + 7.43508339E-01f, 7.63447523E-01f, 7.83655465E-01f, 8.04130018E-01f, + 8.24868977E-01f, 8.45869958E-01f, 8.67130578E-01f, 8.88648331E-01f, + 9.10420537E-01f, 9.32444632E-01f, 9.54717815E-01f, 9.77237225E-01f}; -const FLOAT32 zero_pole_radius_tbl[] = -{ - 0.00000000E+00f, - 7.57409621E-11f, - 7.47451079E-09f, - 7.37623509E-08f, - 3.37872933E-07f, - 1.05439995E-06f, - 2.61370951E-06f, - 5.55702854E-06f, - 1.05878771E-05f, - 1.85806475E-05f, - 3.05868707E-05f, - 4.78395414E-05f, - 7.17558214E-05f, - 1.03938342E-04f, - 1.46175269E-04f, - 2.00439375E-04f, - 2.68886099E-04f, - 3.53850890E-04f, - 4.57845890E-04f, - 5.83555840E-04f, - 7.33833469E-04f, - 9.11694835E-04f, - 1.12031354E-03f, - 1.36301492E-03f, - 1.64327072E-03f, - 1.96469179E-03f, - 2.33102194E-03f, - 2.74613220E-03f, - 3.21401190E-03f, - 3.73876374E-03f, - 4.32459544E-03f, - 4.97581391E-03f, - 5.69681637E-03f, - 6.49208482E-03f, - 7.36617809E-03f, - 8.32372531E-03f, - 9.36941616E-03f, - 1.05079999E-02f, - 1.17442720E-02f, - 1.30830696E-02f, - 1.45292655E-02f, - 1.60877611E-02f, - 1.77634824E-02f, - 1.95613634E-02f, - 2.14863531E-02f, - 2.35434026E-02f, - 2.57374570E-02f, - 2.80734543E-02f, - 3.05563174E-02f, - 3.31909470E-02f, - 3.59822176E-02f, - 3.89349759E-02f, - 4.20540236E-02f, - 4.53441292E-02f, - 4.88100089E-02f, - 5.24563305E-02f, - 5.62877022E-02f, - 6.03086725E-02f, - 6.45237267E-02f, - 6.89372867E-02f, - 7.35536888E-02f, - 7.83772022E-02f, - 8.34120139E-02f, - 8.86622295E-02f, - 9.41318572E-02f, - 9.98248383E-02f, - 1.05744988E-01f, - 1.11896060E-01f, - 1.18281692E-01f, - 1.24905407E-01f, - 1.31770656E-01f, - 1.38880774E-01f, - 1.46238968E-01f, - 1.53848350E-01f, - 1.61711931E-01f, - 1.69832602E-01f, - 1.78213134E-01f, - 1.86856180E-01f, - 1.95764288E-01f, - 2.04939872E-01f, - 2.14385241E-01f, - 2.24102572E-01f, - 2.34093949E-01f, - 2.44361281E-01f, - 2.54906416E-01f, - 2.65731007E-01f, - 2.76836663E-01f, - 2.88224846E-01f, - 2.99896836E-01f, - 3.11853856E-01f, - 3.24096978E-01f, - 3.36627185E-01f, - 3.49445283E-01f, - 3.62551987E-01f, - 3.75947863E-01f, - 3.89633417E-01f, - 4.03608948E-01f, - 4.17874694E-01f, - 4.32430804E-01f, - 4.47277188E-01f, - 4.62413728E-01f, - 4.77840215E-01f, - 4.93556231E-01f, - 5.09561300E-01f, - 5.25854886E-01f, - 5.42436182E-01f, - 5.59304416E-01f, - 5.76458573E-01f, - 5.93897760E-01f, - 6.11620665E-01f, - 6.29626155E-01f, - 6.47912800E-01f, - 6.66479111E-01f, - 6.85323536E-01f, - 7.04444408E-01f, - 7.23839939E-01f, - 7.43508339E-01f, - 7.63447523E-01f, - 7.83655465E-01f, - 8.04130018E-01f, - 8.24868977E-01f, - 8.45869958E-01f, - 8.67130578E-01f, - 8.88648331E-01f, - 9.10420537E-01f, - 9.32444632E-01f, - 9.54717815E-01f, - 9.77237225E-01f -}; - -const FLOAT32 zero_pole_angle_tbl[] = -{ - 0.00000000E+00f, - 6.90533966E-04f, - 7.31595252E-04f, - 7.75098170E-04f, - 8.21187906E-04f, - 8.70018279E-04f, - 9.21752258E-04f, - 9.76562500E-04f, - 1.03463193E-03f, - 1.09615434E-03f, - 1.16133507E-03f, - 1.23039165E-03f, - 1.30355455E-03f, - 1.38106793E-03f, - 1.46319050E-03f, - 1.55019634E-03f, - 1.64237581E-03f, - 1.74003656E-03f, - 1.84350452E-03f, - 1.95312500E-03f, - 2.06926386E-03f, - 2.19230869E-03f, - 2.32267015E-03f, - 2.46078330E-03f, - 2.60710909E-03f, - 2.76213586E-03f, - 2.92638101E-03f, - 3.10039268E-03f, - 3.28475162E-03f, - 3.48007312E-03f, - 3.68700903E-03f, - 3.90625000E-03f, - 4.13852771E-03f, - 4.38461738E-03f, - 4.64534029E-03f, - 4.92156660E-03f, - 5.21421818E-03f, - 5.52427173E-03f, - 5.85276202E-03f, - 6.20078536E-03f, - 6.56950324E-03f, - 6.96014624E-03f, - 7.37401807E-03f, - 7.81250000E-03f, - 8.27705542E-03f, - 8.76923475E-03f, - 9.29068059E-03f, - 9.84313320E-03f, - 1.04284364E-02f, - 1.10485435E-02f, - 1.17055240E-02f, - 1.24015707E-02f, - 1.31390065E-02f, - 1.39202925E-02f, - 1.47480361E-02f, - 1.56250000E-02f, - 1.65541108E-02f, - 1.75384695E-02f, - 1.85813612E-02f, - 1.96862664E-02f, - 2.08568727E-02f, - 2.20970869E-02f, - 2.34110481E-02f, - 2.48031414E-02f, - 2.62780130E-02f, - 2.78405849E-02f, - 2.94960723E-02f, - 3.12500000E-02f, - 3.31082217E-02f, - 3.50769390E-02f, - 3.71627223E-02f, - 3.93725328E-02f, - 4.17137454E-02f, - 4.41941738E-02f, - 4.68220962E-02f, - 4.96062829E-02f, - 5.25560260E-02f, - 5.56811699E-02f, - 5.89921445E-02f, - 6.25000000E-02f, - 6.62164434E-02f, - 7.01538780E-02f, - 7.43254447E-02f, - 7.87450656E-02f, - 8.34274909E-02f, - 8.83883476E-02f, - 9.36441923E-02f, - 9.92125657E-02f, - 1.05112052E-01f, - 1.11362340E-01f, - 1.17984289E-01f, - 1.25000000E-01f, - 1.32432887E-01f, - 1.40307756E-01f, - 1.48650889E-01f, - 1.57490131E-01f, - 1.66854982E-01f, - 1.76776695E-01f, - 1.87288385E-01f, - 1.98425131E-01f, - 2.10224104E-01f, - 2.22724680E-01f, - 2.35968578E-01f, - 2.50000000E-01f, - 2.64865774E-01f, - 2.80615512E-01f, - 2.97301779E-01f, - 3.14980262E-01f, - 3.33709964E-01f, - 3.53553391E-01f, - 3.74576769E-01f, - 3.96850263E-01f, - 4.20448208E-01f, - 4.45449359E-01f, - 4.71937156E-01f, - 5.00000000E-01f, - 5.29731547E-01f, - 5.61231024E-01f, - 5.94603558E-01f, - 6.29960525E-01f, - 6.67419927E-01f, - 7.07106781E-01f, - 7.49153538E-01f, - 7.93700526E-01f, - 8.40896415E-01f, - 8.90898718E-01f, - 9.43874313E-01f, - 1.00000000E+00f -}; +const FLOAT32 zero_pole_angle_tbl[] = { + 0.00000000E+00f, 6.90533966E-04f, 7.31595252E-04f, 7.75098170E-04f, + 8.21187906E-04f, 8.70018279E-04f, 9.21752258E-04f, 9.76562500E-04f, + 1.03463193E-03f, 1.09615434E-03f, 1.16133507E-03f, 1.23039165E-03f, + 1.30355455E-03f, 1.38106793E-03f, 1.46319050E-03f, 1.55019634E-03f, + 1.64237581E-03f, 1.74003656E-03f, 1.84350452E-03f, 1.95312500E-03f, + 2.06926386E-03f, 2.19230869E-03f, 2.32267015E-03f, 2.46078330E-03f, + 2.60710909E-03f, 2.76213586E-03f, 2.92638101E-03f, 3.10039268E-03f, + 3.28475162E-03f, 3.48007312E-03f, 3.68700903E-03f, 3.90625000E-03f, + 4.13852771E-03f, 4.38461738E-03f, 4.64534029E-03f, 4.92156660E-03f, + 5.21421818E-03f, 5.52427173E-03f, 5.85276202E-03f, 6.20078536E-03f, + 6.56950324E-03f, 6.96014624E-03f, 7.37401807E-03f, 7.81250000E-03f, + 8.27705542E-03f, 8.76923475E-03f, 9.29068059E-03f, 9.84313320E-03f, + 1.04284364E-02f, 1.10485435E-02f, 1.17055240E-02f, 1.24015707E-02f, + 1.31390065E-02f, 1.39202925E-02f, 1.47480361E-02f, 1.56250000E-02f, + 1.65541108E-02f, 1.75384695E-02f, 1.85813612E-02f, 1.96862664E-02f, + 2.08568727E-02f, 2.20970869E-02f, 2.34110481E-02f, 2.48031414E-02f, + 2.62780130E-02f, 2.78405849E-02f, 2.94960723E-02f, 3.12500000E-02f, + 3.31082217E-02f, 3.50769390E-02f, 3.71627223E-02f, 3.93725328E-02f, + 4.17137454E-02f, 4.41941738E-02f, 4.68220962E-02f, 4.96062829E-02f, + 5.25560260E-02f, 5.56811699E-02f, 5.89921445E-02f, 6.25000000E-02f, + 6.62164434E-02f, 7.01538780E-02f, 7.43254447E-02f, 7.87450656E-02f, + 8.34274909E-02f, 8.83883476E-02f, 9.36441923E-02f, 9.92125657E-02f, + 1.05112052E-01f, 1.11362340E-01f, 1.17984289E-01f, 1.25000000E-01f, + 1.32432887E-01f, 1.40307756E-01f, 1.48650889E-01f, 1.57490131E-01f, + 1.66854982E-01f, 1.76776695E-01f, 1.87288385E-01f, 1.98425131E-01f, + 2.10224104E-01f, 2.22724680E-01f, 2.35968578E-01f, 2.50000000E-01f, + 2.64865774E-01f, 2.80615512E-01f, 2.97301779E-01f, 3.14980262E-01f, + 3.33709964E-01f, 3.53553391E-01f, 3.74576769E-01f, 3.96850263E-01f, + 4.20448208E-01f, 4.45449359E-01f, 4.71937156E-01f, 5.00000000E-01f, + 5.29731547E-01f, 5.61231024E-01f, 5.94603558E-01f, 6.29960525E-01f, + 6.67419927E-01f, 7.07106781E-01f, 7.49153538E-01f, 7.93700526E-01f, + 8.40896415E-01f, 8.90898718E-01f, 9.43874313E-01f, 1.00000000E+00f}; -const FLOAT32 shape_filt_lf_y1_bound_tbl[][3] = -{ - {-0.994f,-0.996f, -1.0f}, +const FLOAT32 shape_filt_lf_y1_bound_tbl[][3] = { + {-0.994f, -0.996f, -1.0f}, {-0.99f, -0.995f, -0.999f}, {-0.98f, -0.989f, -0.996f}, {-0.97f, -0.983f, -0.994f}, }; -const FLOAT32 shape_filt_hf_y1_bound_tbl[][3] = -{ - {0.15f, 0.75f, 1.05f }, - {0.43f, 0.87f, 1.07f}, - {0.60f, 0.92f, 1.07f}, - {0.80f, 1.00f, 1.06f}, - {0.90f, 1.04f, 1.073f}, +const FLOAT32 shape_filt_hf_y1_bound_tbl[][3] = { + {0.15f, 0.75f, 1.05f}, {0.43f, 0.87f, 1.07f}, {0.60f, 0.92f, 1.07f}, + {0.80f, 1.00f, 1.06f}, {0.90f, 1.04f, 1.073f}, }; const FLOAT32 shape_filt_lf_gain_offset_tbl[][3] = { @@ -533,759 +212,924 @@ const FLOAT32 shape_filt_lf_gain_offset_tbl[][3] = { }; const FLOAT32 shape_filt_hf_gain_offset_tbl[][3] = { - {4.5f, 6.0f, 3.5f}, - {3.7f, 4.0f, 2.7f}, - {3.0f, 3.5f, 2.0f}, - {2.0f, 2.5f, 1.5f}, - {1.5f, 2.0f, 1.31f}, + {4.5f, 6.0f, 3.5f}, {3.7f, 4.0f, 2.7f}, {3.0f, 3.5f, 2.0f}, + {2.0f, 2.5f, 1.5f}, {1.5f, 2.0f, 1.31f}, }; const FLOAT32 shape_filt_lf_radius_tbl[] = { - 0.988f, - 0.98f, - 0.96f, - 0.94f, + 0.988f, 0.98f, 0.96f, 0.94f, }; -const FLOAT32 shape_filt_hf_radius_tbl[] = { - 0.45f, - 0.40f, - 0.35f, - 0.30f, - 0.30f -}; +const FLOAT32 shape_filt_hf_radius_tbl[] = {0.45f, 0.40f, 0.35f, 0.30f, 0.30f}; -const FLOAT32 shape_filt_cutoff_freq_norm_hf_tbl[] = { - 0.15f, - 0.20f, - 0.25f, - 0.35f, - 0.45f -}; - -const ia_cicp_sigmoid_characteristic_param_struct pstr_cicp_sigmoid_characteristic_param[] = { - {0.0f, 9.0f, 12.0f}, - {0.2f, 9.0f, 12.0f}, - {0.4f, 9.0f, 12.0f}, - {0.6f, 9.0f, 12.0f}, - {0.8f, 6.0f, 8.0f}, - {1.0f, 5.0f, 6.0f} -}; +const FLOAT32 shape_filt_cutoff_freq_norm_hf_tbl[] = {0.15f, 0.20f, 0.25f, + 0.35f, 0.45f}; +const ia_cicp_sigmoid_characteristic_param_struct + pstr_cicp_sigmoid_characteristic_param[] = { + {0.0f, 9.0f, 12.0f}, {0.2f, 9.0f, 12.0f}, {0.4f, 9.0f, 12.0f}, + {0.6f, 9.0f, 12.0f}, {0.8f, 6.0f, 8.0f}, {1.0f, 5.0f, 6.0f}}; -const ia_slope_code_table_struct slope_code_tbl_entries_by_size[NUM_SLOPE_TBL_ENTRIES] = -{ - { 1, 0x001, 0.0f, 7 }, - { 2, 0x000, -0.005f, 6 }, - { 4, 0x007, 0.005f, 8 }, - { 5, 0x00A, -0.1953f, 3 }, - { 5, 0x009, -0.0781f, 4 }, - { 5, 0x00D, -0.0312f, 5 }, - { 5, 0x00B, 0.0312f, 9 }, - { 6, 0x018, -3.0518f, 0 }, - { 6, 0x011, 0.0781f, 10 }, - { 7, 0x032, -0.4883f, 2 }, - { 7, 0x020, 1.2207f, 13 }, - { 7, 0x033, 3.0518f, 14 }, - { 8, 0x042, -1.2207f, 1 }, - { 9, 0x087, 0.1953f, 11 }, - { 9, 0x086, 0.4883f, 12 }, +const ia_slope_code_table_struct + slope_code_tbl_entries_by_size[NUM_SLOPE_TBL_ENTRIES] = { + {1, 0x001, 0.0f, 7}, {2, 0x000, -0.005f, 6}, + {4, 0x007, 0.005f, 8}, {5, 0x00A, -0.1953f, 3}, + {5, 0x009, -0.0781f, 4}, {5, 0x00D, -0.0312f, 5}, + {5, 0x00B, 0.0312f, 9}, {6, 0x018, -3.0518f, 0}, + {6, 0x011, 0.0781f, 10}, {7, 0x032, -0.4883f, 2}, + {7, 0x020, 1.2207f, 13}, {7, 0x033, 3.0518f, 14}, + {8, 0x042, -1.2207f, 1}, {9, 0x087, 0.1953f, 11}, + {9, 0x086, 0.4883f, 12}, }; -const FLOAT32 dwnmix_coeff[] = -{ - 0.0f, - -0.5f, - -1.0f, - -1.5f, - -2.0f, - -2.5f, - -3.0f, - -3.5f, - -4.0f, - -4.5f, - -5.0f, - -5.5f, - -6.0f, - -7.5f, - -9.0f, - -1000.0f -}; +const FLOAT32 dwnmix_coeff[] = {0.0f, -0.5f, -1.0f, -1.5f, -2.0f, -2.5f, + -3.0f, -3.5f, -4.0f, -4.5f, -5.0f, -5.5f, + -6.0f, -7.5f, -9.0f, -1000.0f}; -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 -}; +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] = -{ - {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 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}; +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}; -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}; +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 ia_loc_sys_interface_struct loc_sys_interface[]= -{ - {0, 1, {0,0,0}, 0, 0}, - {0, 1, {2,0,0}, 0, 0}, +const ia_loc_sys_interface_struct loc_sys_interface[] = { + {0, 1, {0, 0, 0}, 0, 0}, {0, 1, {2, 0, 0}, 0, 0}, }; -const ia_loc_loudness_norm_ctrl_interface_struct loc_loudness_norm_ctrl_interface[] = -{ - {0,0.0f}, - {0,0.0f}, +const ia_loc_loudness_norm_ctrl_interface_struct + loc_loudness_norm_ctrl_interface[] = { + {0, 0.0f}, {0, 0.0f}, }; -const ia_loc_loudness_norm_param_interface_struct loc_loudness_norm_param_interface[] = { - +const ia_loc_loudness_norm_param_interface_struct + loc_loudness_norm_param_interface[] = { - {0, 0, LOUDNESS_DEVIATION_MAX_DEFAULT, USER_METHOD_DEFINITION_PROGRAM_LOUDNESS, USER_MEASUREMENT_SYSTEM_BS_1770_3, USER_LOUDNESS_PREPROCESSING_OFF, 20, LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT, 0.0f, 0.0f}, - {0, 0, LOUDNESS_DEVIATION_MAX_DEFAULT, USER_METHOD_DEFINITION_PROGRAM_LOUDNESS, USER_MEASUREMENT_SYSTEM_BS_1770_3, USER_LOUDNESS_PREPROCESSING_OFF, 20, LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT, 0.0f, 0.0f}, + {0, 0, LOUDNESS_DEVIATION_MAX_DEFAULT, + USER_METHOD_DEFINITION_PROGRAM_LOUDNESS, + USER_MEASUREMENT_SYSTEM_BS_1770_3, USER_LOUDNESS_PREPROCESSING_OFF, 20, + LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT, 0.0f, 0.0f}, + {0, 0, LOUDNESS_DEVIATION_MAX_DEFAULT, + USER_METHOD_DEFINITION_PROGRAM_LOUDNESS, + USER_MEASUREMENT_SYSTEM_BS_1770_3, USER_LOUDNESS_PREPROCESSING_OFF, 20, + LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT, 0.0f, 0.0f}, }; const ia_loc_drc_interface_struct loc_dyn_range_ctrl_interface[] = { - - {1, 3, {MATCH_EFFECT_TYPE, MATCH_DYNAMIC_RANGE, MATCH_DRC_CHARACTERISTIC}, SHORT_TERM_LOUDNESS_TO_AVG, 1, 5.0f, 3.0f, 10.0f, 3}, - {1, 3, {MATCH_EFFECT_TYPE, MATCH_DYNAMIC_RANGE, MATCH_DRC_CHARACTERISTIC}, TOP_OF_LOUDNESS_RANGE_TO_AVG, 0, 5.0f, 3.0f, 10.0f, 3}, - - + {1, + 3, + {MATCH_EFFECT_TYPE, MATCH_DYNAMIC_RANGE, MATCH_DRC_CHARACTERISTIC}, + SHORT_TERM_LOUDNESS_TO_AVG, + 1, + 5.0f, + 3.0f, + 10.0f, + 3}, + {1, + 3, + {MATCH_EFFECT_TYPE, MATCH_DYNAMIC_RANGE, MATCH_DRC_CHARACTERISTIC}, + TOP_OF_LOUDNESS_RANGE_TO_AVG, + 0, + 5.0f, + 3.0f, + 10.0f, + 3}, }; const ia_loc_requested_drc_effect_struct loc_requested_drc_effect_type_str[] = { - {1, 1, {EFFECT_TYPE_REQUESTED_NIGHT, EFFECT_TYPE_REQUESTED_GENERAL_COMPR, EFFECT_TYPE_REQUESTED_ARTISTIC, EFFECT_TYPE_REQUESTED_LIMITED, EFFECT_TYPE_REQUESTED_DIALOG}}, - {4, 1, {EFFECT_TYPE_REQUESTED_LOWLEVEL, EFFECT_TYPE_REQUESTED_NIGHT, EFFECT_TYPE_REQUESTED_LIMITED, EFFECT_TYPE_REQUESTED_ARTISTIC, EFFECT_TYPE_REQUESTED_DIALOG}}, - + {1, + 1, + {EFFECT_TYPE_REQUESTED_NIGHT, EFFECT_TYPE_REQUESTED_GENERAL_COMPR, + EFFECT_TYPE_REQUESTED_ARTISTIC, EFFECT_TYPE_REQUESTED_LIMITED, + EFFECT_TYPE_REQUESTED_DIALOG}}, + {4, + 1, + {EFFECT_TYPE_REQUESTED_LOWLEVEL, EFFECT_TYPE_REQUESTED_NIGHT, + EFFECT_TYPE_REQUESTED_LIMITED, EFFECT_TYPE_REQUESTED_ARTISTIC, + EFFECT_TYPE_REQUESTED_DIALOG}}, }; const ia_loc_drc_parameter_interface_struct loc_drc_parameter_interface[] = { - - {1.0f,1.0f,0}, - {1.0f,1.0f,0}, + {1.0f, 1.0f, 0}, {1.0f, 1.0f, 0}, }; - FLOAT32 f_bands_nrm_QMF71[71] = { - 0.004583300000000f, - 0.000833330000000f, - 0.002083300000000f, - 0.005875000000000f, - 0.009791700000000f, - 0.014292000000000f, - 0.019792000000000f, - 0.027000000000000f, - 0.035417000000000f, - 0.042625000000000f, - 0.056750000000000f, - 0.072375000000000f, - 0.088000000000000f, - 0.103620000000000f, - 0.119250000000000f, - 0.134870000000000f, - 0.150500000000000f, - 0.166120000000000f, - 0.181750000000000f, - 0.197370000000000f, - 0.213000000000000f, - 0.228620000000000f, - 0.244250000000000f, - 0.259880000000000f, - 0.275500000000000f, - 0.291130000000000f, - 0.306750000000000f, - 0.322380000000000f, - 0.338000000000000f, - 0.353630000000000f, - 0.369250000000000f, - 0.384880000000000f, - 0.400500000000000f, - 0.416130000000000f, - 0.431750000000000f, - 0.447380000000000f, - 0.463000000000000f, - 0.478630000000000f, - 0.494250000000000f, - 0.509870000000000f, - 0.525500000000000f, - 0.541120000000000f, - 0.556750000000000f, - 0.572370000000000f, - 0.588000000000000f, - 0.603620000000000f, - 0.619250000000000f, - 0.634870000000000f, - 0.650500000000000f, - 0.666120000000000f, - 0.681750000000000f, - 0.697370000000000f, - 0.713000000000000f, - 0.728620000000000f, - 0.744250000000000f, - 0.759870000000000f, - 0.775500000000000f, - 0.791120000000000f, - 0.806750000000000f, - 0.822370000000000f, - 0.838000000000000f, - 0.853620000000000f, - 0.869250000000000f, - 0.884870000000000f, - 0.900500000000000f, - 0.916120000000000f, - 0.931750000000000f, - 0.947370000000000f, - 0.963000000000000f, - 0.974540000000000f, - 0.999040000000000f -}; +FLOAT32 f_bands_nrm_QMF71[71] = { + 0.004583300000000f, 0.000833330000000f, 0.002083300000000f, + 0.005875000000000f, 0.009791700000000f, 0.014292000000000f, + 0.019792000000000f, 0.027000000000000f, 0.035417000000000f, + 0.042625000000000f, 0.056750000000000f, 0.072375000000000f, + 0.088000000000000f, 0.103620000000000f, 0.119250000000000f, + 0.134870000000000f, 0.150500000000000f, 0.166120000000000f, + 0.181750000000000f, 0.197370000000000f, 0.213000000000000f, + 0.228620000000000f, 0.244250000000000f, 0.259880000000000f, + 0.275500000000000f, 0.291130000000000f, 0.306750000000000f, + 0.322380000000000f, 0.338000000000000f, 0.353630000000000f, + 0.369250000000000f, 0.384880000000000f, 0.400500000000000f, + 0.416130000000000f, 0.431750000000000f, 0.447380000000000f, + 0.463000000000000f, 0.478630000000000f, 0.494250000000000f, + 0.509870000000000f, 0.525500000000000f, 0.541120000000000f, + 0.556750000000000f, 0.572370000000000f, 0.588000000000000f, + 0.603620000000000f, 0.619250000000000f, 0.634870000000000f, + 0.650500000000000f, 0.666120000000000f, 0.681750000000000f, + 0.697370000000000f, 0.713000000000000f, 0.728620000000000f, + 0.744250000000000f, 0.759870000000000f, 0.775500000000000f, + 0.791120000000000f, 0.806750000000000f, 0.822370000000000f, + 0.838000000000000f, 0.853620000000000f, 0.869250000000000f, + 0.884870000000000f, 0.900500000000000f, 0.916120000000000f, + 0.931750000000000f, 0.947370000000000f, 0.963000000000000f, + 0.974540000000000f, 0.999040000000000f}; - FLOAT32 f_bands_nrm_QMF64[64] = { - 0.0078125000000000f, - 0.0234380000000000f, - 0.0390620000000000f, - 0.0546880000000000f, - 0.0703120000000000f, - 0.0859380000000000f, - 0.1015600000000000f, - 0.1171900000000000f, - 0.1328100000000000f, - 0.1484400000000000f, - 0.1640600000000000f, - 0.1796900000000000f, - 0.1953100000000000f, - 0.2109400000000000f, - 0.2265600000000000f, - 0.2421900000000000f, - 0.2578100000000000f, - 0.2734400000000000f, - 0.2890600000000000f, - 0.3046900000000000f, - 0.3203100000000000f, - 0.3359400000000000f, - 0.3515600000000000f, - 0.3671900000000000f, - 0.3828100000000000f, - 0.3984400000000000f, - 0.4140600000000000f, - 0.4296900000000000f, - 0.4453100000000000f, - 0.4609400000000000f, - 0.4765600000000000f, - 0.4921900000000000f, - 0.5078100000000000f, - 0.5234400000000000f, - 0.5390600000000000f, - 0.5546900000000000f, - 0.5703100000000000f, - 0.5859400000000000f, - 0.6015600000000000f, - 0.6171900000000000f, - 0.6328100000000000f, - 0.6484400000000000f, - 0.6640600000000000f, - 0.6796900000000000f, - 0.6953100000000000f, - 0.7109400000000000f, - 0.7265600000000000f, - 0.7421900000000000f, - 0.7578100000000000f, - 0.7734400000000000f, - 0.7890600000000000f, - 0.8046900000000000f, - 0.8203100000000000f, - 0.8359400000000000f, - 0.8515600000000000f, - 0.8671900000000000f, - 0.8828100000000000f, - 0.8984400000000000f, - 0.9140600000000000f, - 0.9296900000000000f, - 0.9453100000000000f, - 0.9609400000000000f, - 0.9765600000000000f, - 0.9921900000000000f -}; +FLOAT32 f_bands_nrm_QMF64[64] = { + 0.0078125000000000f, 0.0234380000000000f, 0.0390620000000000f, + 0.0546880000000000f, 0.0703120000000000f, 0.0859380000000000f, + 0.1015600000000000f, 0.1171900000000000f, 0.1328100000000000f, + 0.1484400000000000f, 0.1640600000000000f, 0.1796900000000000f, + 0.1953100000000000f, 0.2109400000000000f, 0.2265600000000000f, + 0.2421900000000000f, 0.2578100000000000f, 0.2734400000000000f, + 0.2890600000000000f, 0.3046900000000000f, 0.3203100000000000f, + 0.3359400000000000f, 0.3515600000000000f, 0.3671900000000000f, + 0.3828100000000000f, 0.3984400000000000f, 0.4140600000000000f, + 0.4296900000000000f, 0.4453100000000000f, 0.4609400000000000f, + 0.4765600000000000f, 0.4921900000000000f, 0.5078100000000000f, + 0.5234400000000000f, 0.5390600000000000f, 0.5546900000000000f, + 0.5703100000000000f, 0.5859400000000000f, 0.6015600000000000f, + 0.6171900000000000f, 0.6328100000000000f, 0.6484400000000000f, + 0.6640600000000000f, 0.6796900000000000f, 0.6953100000000000f, + 0.7109400000000000f, 0.7265600000000000f, 0.7421900000000000f, + 0.7578100000000000f, 0.7734400000000000f, 0.7890600000000000f, + 0.8046900000000000f, 0.8203100000000000f, 0.8359400000000000f, + 0.8515600000000000f, 0.8671900000000000f, 0.8828100000000000f, + 0.8984400000000000f, 0.9140600000000000f, 0.9296900000000000f, + 0.9453100000000000f, 0.9609400000000000f, 0.9765600000000000f, + 0.9921900000000000f}; - FLOAT32 f_bands_nrm_STFT256[257]={ - 0.000000000000000f, - 0.003906250000000f, - 0.007812500000000f, - 0.011718750000000f, - 0.015625000000000f, - 0.019531250000000f, - 0.023437500000000f, - 0.027343750000000f, - 0.031250000000000f, - 0.035156250000000f, - 0.039062500000000f, - 0.042968750000000f, - 0.046875000000000f, - 0.050781250000000f, - 0.054687500000000f, - 0.058593750000000f, - 0.062500000000000f, - 0.066406250000000f, - 0.070312500000000f, - 0.074218750000000f, - 0.078125000000000f, - 0.082031250000000f, - 0.085937500000000f, - 0.089843750000000f, - 0.093750000000000f, - 0.097656250000000f, - 0.101562500000000f, - 0.105468750000000f, - 0.109375000000000f, - 0.113281250000000f, - 0.117187500000000f, - 0.121093750000000f, - 0.125000000000000f, - 0.128906250000000f, - 0.132812500000000f, - 0.136718750000000f, - 0.140625000000000f, - 0.144531250000000f, - 0.148437500000000f, - 0.152343750000000f, - 0.156250000000000f, - 0.160156250000000f, - 0.164062500000000f, - 0.167968750000000f, - 0.171875000000000f, - 0.175781250000000f, - 0.179687500000000f, - 0.183593750000000f, - 0.187500000000000f, - 0.191406250000000f, - 0.195312500000000f, - 0.199218750000000f, - 0.203125000000000f, - 0.207031250000000f, - 0.210937500000000f, - 0.214843750000000f, - 0.218750000000000f, - 0.222656250000000f, - 0.226562500000000f, - 0.230468750000000f, - 0.234375000000000f, - 0.238281250000000f, - 0.242187500000000f, - 0.246093750000000f, - 0.250000000000000f, - 0.253906250000000f, - 0.257812500000000f, - 0.261718750000000f, - 0.265625000000000f, - 0.269531250000000f, - 0.273437500000000f, - 0.277343750000000f, - 0.281250000000000f, - 0.285156250000000f, - 0.289062500000000f, - 0.292968750000000f, - 0.296875000000000f, - 0.300781250000000f, - 0.304687500000000f, - 0.308593750000000f, - 0.312500000000000f, - 0.316406250000000f, - 0.320312500000000f, - 0.324218750000000f, - 0.328125000000000f, - 0.332031250000000f, - 0.335937500000000f, - 0.339843750000000f, - 0.343750000000000f, - 0.347656250000000f, - 0.351562500000000f, - 0.355468750000000f, - 0.359375000000000f, - 0.363281250000000f, - 0.367187500000000f, - 0.371093750000000f, - 0.375000000000000f, - 0.378906250000000f, - 0.382812500000000f, - 0.386718750000000f, - 0.390625000000000f, - 0.394531250000000f, - 0.398437500000000f, - 0.402343750000000f, - 0.406250000000000f, - 0.410156250000000f, - 0.414062500000000f, - 0.417968750000000f, - 0.421875000000000f, - 0.425781250000000f, - 0.429687500000000f, - 0.433593750000000f, - 0.437500000000000f, - 0.441406250000000f, - 0.445312500000000f, - 0.449218750000000f, - 0.453125000000000f, - 0.457031250000000f, - 0.460937500000000f, - 0.464843750000000f, - 0.468750000000000f, - 0.472656250000000f, - 0.476562500000000f, - 0.480468750000000f, - 0.484375000000000f, - 0.488281250000000f, - 0.492187500000000f, - 0.496093750000000f, - 0.500000000000000f, - 0.503906250000000f, - 0.507812500000000f, - 0.511718750000000f, - 0.515625000000000f, - 0.519531250000000f, - 0.523437500000000f, - 0.527343750000000f, - 0.531250000000000f, - 0.535156250000000f, - 0.539062500000000f, - 0.542968750000000f, - 0.546875000000000f, - 0.550781250000000f, - 0.554687500000000f, - 0.558593750000000f, - 0.562500000000000f, - 0.566406250000000f, - 0.570312500000000f, - 0.574218750000000f, - 0.578125000000000f, - 0.582031250000000f, - 0.585937500000000f, - 0.589843750000000f, - 0.593750000000000f, - 0.597656250000000f, - 0.601562500000000f, - 0.605468750000000f, - 0.609375000000000f, - 0.613281250000000f, - 0.617187500000000f, - 0.621093750000000f, - 0.625000000000000f, - 0.628906250000000f, - 0.632812500000000f, - 0.636718750000000f, - 0.640625000000000f, - 0.644531250000000f, - 0.648437500000000f, - 0.652343750000000f, - 0.656250000000000f, - 0.660156250000000f, - 0.664062500000000f, - 0.667968750000000f, - 0.671875000000000f, - 0.675781250000000f, - 0.679687500000000f, - 0.683593750000000f, - 0.687500000000000f, - 0.691406250000000f, - 0.695312500000000f, - 0.699218750000000f, - 0.703125000000000f, - 0.707031250000000f, - 0.710937500000000f, - 0.714843750000000f, - 0.718750000000000f, - 0.722656250000000f, - 0.726562500000000f, - 0.730468750000000f, - 0.734375000000000f, - 0.738281250000000f, - 0.742187500000000f, - 0.746093750000000f, - 0.750000000000000f, - 0.753906250000000f, - 0.757812500000000f, - 0.761718750000000f, - 0.765625000000000f, - 0.769531250000000f, - 0.773437500000000f, - 0.777343750000000f, - 0.781250000000000f, - 0.785156250000000f, - 0.789062500000000f, - 0.792968750000000f, - 0.796875000000000f, - 0.800781250000000f, - 0.804687500000000f, - 0.808593750000000f, - 0.812500000000000f, - 0.816406250000000f, - 0.820312500000000f, - 0.824218750000000f, - 0.828125000000000f, - 0.832031250000000f, - 0.835937500000000f, - 0.839843750000000f, - 0.843750000000000f, - 0.847656250000000f, - 0.851562500000000f, - 0.855468750000000f, - 0.859375000000000f, - 0.863281250000000f, - 0.867187500000000f, - 0.871093750000000f, - 0.875000000000000f, - 0.878906250000000f, - 0.882812500000000f, - 0.886718750000000f, - 0.890625000000000f, - 0.894531250000000f, - 0.898437500000000f, - 0.902343750000000f, - 0.906250000000000f, - 0.910156250000000f, - 0.914062500000000f, - 0.917968750000000f, - 0.921875000000000f, - 0.925781250000000f, - 0.929687500000000f, - 0.933593750000000f, - 0.937500000000000f, - 0.941406250000000f, - 0.945312500000000f, - 0.949218750000000f, - 0.953125000000000f, - 0.957031250000000f, - 0.960937500000000f, - 0.964843750000000f, - 0.968750000000000f, - 0.972656250000000f, - 0.976562500000000f, - 0.980468750000000f, - 0.984375000000000f, - 0.988281250000000f, - 0.992187500000000f, - 0.996093750000000f, - 1.000000000000000f -}; +FLOAT32 f_bands_nrm_STFT256[257] = { + 0.000000000000000f, 0.003906250000000f, 0.007812500000000f, + 0.011718750000000f, 0.015625000000000f, 0.019531250000000f, + 0.023437500000000f, 0.027343750000000f, 0.031250000000000f, + 0.035156250000000f, 0.039062500000000f, 0.042968750000000f, + 0.046875000000000f, 0.050781250000000f, 0.054687500000000f, + 0.058593750000000f, 0.062500000000000f, 0.066406250000000f, + 0.070312500000000f, 0.074218750000000f, 0.078125000000000f, + 0.082031250000000f, 0.085937500000000f, 0.089843750000000f, + 0.093750000000000f, 0.097656250000000f, 0.101562500000000f, + 0.105468750000000f, 0.109375000000000f, 0.113281250000000f, + 0.117187500000000f, 0.121093750000000f, 0.125000000000000f, + 0.128906250000000f, 0.132812500000000f, 0.136718750000000f, + 0.140625000000000f, 0.144531250000000f, 0.148437500000000f, + 0.152343750000000f, 0.156250000000000f, 0.160156250000000f, + 0.164062500000000f, 0.167968750000000f, 0.171875000000000f, + 0.175781250000000f, 0.179687500000000f, 0.183593750000000f, + 0.187500000000000f, 0.191406250000000f, 0.195312500000000f, + 0.199218750000000f, 0.203125000000000f, 0.207031250000000f, + 0.210937500000000f, 0.214843750000000f, 0.218750000000000f, + 0.222656250000000f, 0.226562500000000f, 0.230468750000000f, + 0.234375000000000f, 0.238281250000000f, 0.242187500000000f, + 0.246093750000000f, 0.250000000000000f, 0.253906250000000f, + 0.257812500000000f, 0.261718750000000f, 0.265625000000000f, + 0.269531250000000f, 0.273437500000000f, 0.277343750000000f, + 0.281250000000000f, 0.285156250000000f, 0.289062500000000f, + 0.292968750000000f, 0.296875000000000f, 0.300781250000000f, + 0.304687500000000f, 0.308593750000000f, 0.312500000000000f, + 0.316406250000000f, 0.320312500000000f, 0.324218750000000f, + 0.328125000000000f, 0.332031250000000f, 0.335937500000000f, + 0.339843750000000f, 0.343750000000000f, 0.347656250000000f, + 0.351562500000000f, 0.355468750000000f, 0.359375000000000f, + 0.363281250000000f, 0.367187500000000f, 0.371093750000000f, + 0.375000000000000f, 0.378906250000000f, 0.382812500000000f, + 0.386718750000000f, 0.390625000000000f, 0.394531250000000f, + 0.398437500000000f, 0.402343750000000f, 0.406250000000000f, + 0.410156250000000f, 0.414062500000000f, 0.417968750000000f, + 0.421875000000000f, 0.425781250000000f, 0.429687500000000f, + 0.433593750000000f, 0.437500000000000f, 0.441406250000000f, + 0.445312500000000f, 0.449218750000000f, 0.453125000000000f, + 0.457031250000000f, 0.460937500000000f, 0.464843750000000f, + 0.468750000000000f, 0.472656250000000f, 0.476562500000000f, + 0.480468750000000f, 0.484375000000000f, 0.488281250000000f, + 0.492187500000000f, 0.496093750000000f, 0.500000000000000f, + 0.503906250000000f, 0.507812500000000f, 0.511718750000000f, + 0.515625000000000f, 0.519531250000000f, 0.523437500000000f, + 0.527343750000000f, 0.531250000000000f, 0.535156250000000f, + 0.539062500000000f, 0.542968750000000f, 0.546875000000000f, + 0.550781250000000f, 0.554687500000000f, 0.558593750000000f, + 0.562500000000000f, 0.566406250000000f, 0.570312500000000f, + 0.574218750000000f, 0.578125000000000f, 0.582031250000000f, + 0.585937500000000f, 0.589843750000000f, 0.593750000000000f, + 0.597656250000000f, 0.601562500000000f, 0.605468750000000f, + 0.609375000000000f, 0.613281250000000f, 0.617187500000000f, + 0.621093750000000f, 0.625000000000000f, 0.628906250000000f, + 0.632812500000000f, 0.636718750000000f, 0.640625000000000f, + 0.644531250000000f, 0.648437500000000f, 0.652343750000000f, + 0.656250000000000f, 0.660156250000000f, 0.664062500000000f, + 0.667968750000000f, 0.671875000000000f, 0.675781250000000f, + 0.679687500000000f, 0.683593750000000f, 0.687500000000000f, + 0.691406250000000f, 0.695312500000000f, 0.699218750000000f, + 0.703125000000000f, 0.707031250000000f, 0.710937500000000f, + 0.714843750000000f, 0.718750000000000f, 0.722656250000000f, + 0.726562500000000f, 0.730468750000000f, 0.734375000000000f, + 0.738281250000000f, 0.742187500000000f, 0.746093750000000f, + 0.750000000000000f, 0.753906250000000f, 0.757812500000000f, + 0.761718750000000f, 0.765625000000000f, 0.769531250000000f, + 0.773437500000000f, 0.777343750000000f, 0.781250000000000f, + 0.785156250000000f, 0.789062500000000f, 0.792968750000000f, + 0.796875000000000f, 0.800781250000000f, 0.804687500000000f, + 0.808593750000000f, 0.812500000000000f, 0.816406250000000f, + 0.820312500000000f, 0.824218750000000f, 0.828125000000000f, + 0.832031250000000f, 0.835937500000000f, 0.839843750000000f, + 0.843750000000000f, 0.847656250000000f, 0.851562500000000f, + 0.855468750000000f, 0.859375000000000f, 0.863281250000000f, + 0.867187500000000f, 0.871093750000000f, 0.875000000000000f, + 0.878906250000000f, 0.882812500000000f, 0.886718750000000f, + 0.890625000000000f, 0.894531250000000f, 0.898437500000000f, + 0.902343750000000f, 0.906250000000000f, 0.910156250000000f, + 0.914062500000000f, 0.917968750000000f, 0.921875000000000f, + 0.925781250000000f, 0.929687500000000f, 0.933593750000000f, + 0.937500000000000f, 0.941406250000000f, 0.945312500000000f, + 0.949218750000000f, 0.953125000000000f, 0.957031250000000f, + 0.960937500000000f, 0.964843750000000f, 0.968750000000000f, + 0.972656250000000f, 0.976562500000000f, 0.980468750000000f, + 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}; -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] = { + {2.0f / 1024.0f, 0.0000373252f, 0.9913600345f}, + {3.0f / 1024.0f, 0.0000836207f, 0.9870680830f}, + {4.0f / 1024.0f, 0.0001480220f, 0.9827947083f}, + {5.0f / 1024.0f, 0.0002302960f, 0.9785398263f}, + {6.0f / 1024.0f, 0.0003302134f, 0.9743033527f}, + {2.0f / 256.0f, 0.0005820761f, 0.9658852897f}, + {3.0f / 256.0f, 0.0012877837f, 0.9492662926f}, + {2.0f / 128.0f, 0.0022515827f, 0.9329321561f}, + {3.0f / 128.0f, 0.0049030350f, 0.9010958535f}, + {2.0f / 64.0f, 0.0084426929f, 0.8703307793f}, + {3.0f / 64.0f, 0.0178631928f, 0.8118317459f}, + {2.0f / 32.0f, 0.0299545822f, 0.7570763753f}, + {3.0f / 32.0f, 0.0604985076f, 0.6574551915f}, + {2.0f / 16.0f, 0.0976310729f, 0.5690355937f}, + {3.0f / 16.0f, 0.1866943331f, 0.4181633458f}, + {2.0f / 8.0f, 0.2928932188f, 0.2928932188f}, }; - -const ia_filter_bank_params_struct normal_cross_freq[FILTER_BANK_PARAMETER_COUNT] = { - {2.0f/1024.0f, 0.0000373252f, 0.9913600345f}, - {3.0f/1024.0f, 0.0000836207f, 0.9870680830f}, - {4.0f/1024.0f, 0.0001480220f, 0.9827947083f}, - {5.0f/1024.0f, 0.0002302960f, 0.9785398263f}, - {6.0f/1024.0f, 0.0003302134f, 0.9743033527f}, - {2.0f/256.0f, 0.0005820761f, 0.9658852897f}, - {3.0f/256.0f, 0.0012877837f, 0.9492662926f}, - {2.0f/128.0f, 0.0022515827f, 0.9329321561f}, - {3.0f/128.0f, 0.0049030350f, 0.9010958535f}, - {2.0f/64.0f, 0.0084426929f, 0.8703307793f}, - {3.0f/64.0f, 0.0178631928f, 0.8118317459f}, - {2.0f/32.0f, 0.0299545822f, 0.7570763753f}, - {3.0f/32.0f, 0.0604985076f, 0.6574551915f}, - {2.0f/16.0f, 0.0976310729f, 0.5690355937f}, - {3.0f/16.0f, 0.1866943331f, 0.4181633458f}, - {2.0f/8.0f, 0.2928932188f, 0.2928932188f}, -}; - diff --git a/decoder/drc_src/impd_drc_rom.h b/decoder/drc_src/impd_drc_rom.h index c0c7933..9add85d 100644 --- a/decoder/drc_src/impd_drc_rom.h +++ b/decoder/drc_src/impd_drc_rom.h @@ -19,7 +19,7 @@ */ #ifndef IMPD_DRC_ROM_H #define IMPD_DRC_ROM_H -#define MAX_NUM_QMF_BANDS 128 +#define MAX_NUM_QMF_BANDS 128 #define NUM_GAIN_TBL_PROF_0_1_ENTRIES 25 #define NUM_GAIN_TBL_PROF_2_ENTRIES 49 @@ -27,14 +27,16 @@ extern const FLOAT32 samp_rate_tbl[13][12]; -extern const ia_delta_gain_code_table_struct ia_drc_gain_tbls_prof_0_1[NUM_GAIN_TBL_PROF_0_1_ENTRIES]; +extern const ia_delta_gain_code_table_struct + ia_drc_gain_tbls_prof_0_1[NUM_GAIN_TBL_PROF_0_1_ENTRIES]; -extern const ia_delta_gain_code_table_struct ia_drc_gain_tbls_prof_2[NUM_GAIN_TBL_PROF_2_ENTRIES]; +extern const ia_delta_gain_code_table_struct + ia_drc_gain_tbls_prof_2[NUM_GAIN_TBL_PROF_2_ENTRIES]; extern const FLOAT32 channel_weight[]; extern const FLOAT32 dwnmix_coeff_v1[]; -extern const FLOAT32 eq_slope_tbl []; +extern const FLOAT32 eq_slope_tbl[]; extern const FLOAT32 eq_gain_delta_tbl[]; @@ -54,14 +56,14 @@ extern const FLOAT32 shape_filt_hf_radius_tbl[]; extern const FLOAT32 shape_filt_cutoff_freq_norm_hf_tbl[]; -extern const ia_cicp_sigmoid_characteristic_param_struct pstr_cicp_sigmoid_characteristic_param[]; +extern const ia_cicp_sigmoid_characteristic_param_struct + pstr_cicp_sigmoid_characteristic_param[]; - -extern const ia_slope_code_table_struct slope_code_tbl_entries_by_size[NUM_SLOPE_TBL_ENTRIES]; +extern const ia_slope_code_table_struct + slope_code_tbl_entries_by_size[NUM_SLOPE_TBL_ENTRIES]; extern const FLOAT32 dwnmix_coeff[]; - extern const FLOAT32 dwnmix_coeff_lfe[]; extern WORD32 drc_characteristic_order_default[][3]; @@ -82,69 +84,72 @@ extern WORD32 measurement_method_peak_loudness_tbl[]; #define MAX_NUM_DOWNMIX_ID_REQUESTS_LOCAL 3 typedef struct { - WORD32 target_config_request_type; - WORD32 num_downmix_id_requests; - WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS_LOCAL]; - WORD32 requested_target_layout; - WORD32 requested_target_ch_count; + WORD32 target_config_request_type; + WORD32 num_downmix_id_requests; + WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS_LOCAL]; + WORD32 requested_target_layout; + WORD32 requested_target_ch_count; } ia_loc_sys_interface_struct; - extern const ia_loc_sys_interface_struct loc_sys_interface[]; typedef struct { - WORD32 loudness_normalization_on; - FLOAT32 target_loudness; + WORD32 loudness_normalization_on; + FLOAT32 target_loudness; } ia_loc_loudness_norm_ctrl_interface_struct; -extern const ia_loc_loudness_norm_ctrl_interface_struct loc_loudness_norm_ctrl_interface[]; +extern const ia_loc_loudness_norm_ctrl_interface_struct + loc_loudness_norm_ctrl_interface[]; typedef struct { - WORD32 album_mode; - WORD32 peak_limiter; - WORD32 loudness_deviation_max; - WORD32 loudness_measurement_method; - WORD32 loudness_measurement_system; - WORD32 loudness_measurement_pre_proc; - WORD32 device_cut_off_frequency; - FLOAT32 loudness_norm_gain_db_max; - FLOAT32 loudness_norm_gain_modification_db; - FLOAT32 output_peak_level_max; + WORD32 album_mode; + WORD32 peak_limiter; + WORD32 loudness_deviation_max; + WORD32 loudness_measurement_method; + WORD32 loudness_measurement_system; + WORD32 loudness_measurement_pre_proc; + WORD32 device_cut_off_frequency; + FLOAT32 loudness_norm_gain_db_max; + FLOAT32 loudness_norm_gain_modification_db; + FLOAT32 output_peak_level_max; } ia_loc_loudness_norm_param_interface_struct; -extern const ia_loc_loudness_norm_param_interface_struct loc_loudness_norm_param_interface[]; +extern const ia_loc_loudness_norm_param_interface_struct + loc_loudness_norm_param_interface[]; #define MAX_NUM_DRC_FEATURE_REQUESTS_LOCAL 3 typedef struct { - WORD32 dynamic_range_control_on; - WORD32 num_drc_feature_requests; - WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS_LOCAL]; - WORD32 requested_dyn_rng_measurement_type; - WORD32 requested_dyn_range_is_single_val_flag; - FLOAT32 requested_dyn_range_value; - FLOAT32 requested_dyn_range_min_val; - FLOAT32 requested_dyn_range_max_val; - WORD32 requested_drc_characteristic; + WORD32 dynamic_range_control_on; + WORD32 num_drc_feature_requests; + WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS_LOCAL]; + WORD32 requested_dyn_rng_measurement_type; + WORD32 requested_dyn_range_is_single_val_flag; + FLOAT32 requested_dyn_range_value; + FLOAT32 requested_dyn_range_min_val; + FLOAT32 requested_dyn_range_max_val; + WORD32 requested_drc_characteristic; } ia_loc_drc_interface_struct; extern const ia_loc_drc_interface_struct loc_dyn_range_ctrl_interface[]; #define MAX_NUM_DRC_EFFECT_TYPE_REQUESTS_LOCAL 5 typedef struct { - WORD32 requested_num_drc_effects; - WORD32 desired_num_drc_effects_of_requested; - WORD32 requested_drc_effect_type[MAX_NUM_DRC_EFFECT_TYPE_REQUESTS_LOCAL]; + WORD32 requested_num_drc_effects; + WORD32 desired_num_drc_effects_of_requested; + WORD32 requested_drc_effect_type[MAX_NUM_DRC_EFFECT_TYPE_REQUESTS_LOCAL]; } ia_loc_requested_drc_effect_struct; -extern const ia_loc_requested_drc_effect_struct loc_requested_drc_effect_type_str[]; +extern const ia_loc_requested_drc_effect_struct + loc_requested_drc_effect_type_str[]; typedef struct { - FLOAT32 compress; - FLOAT32 boost; - WORD32 drc_characteristic_target; + FLOAT32 compress; + FLOAT32 boost; + WORD32 drc_characteristic_target; } ia_loc_drc_parameter_interface_struct; -extern const ia_loc_drc_parameter_interface_struct loc_drc_parameter_interface[]; +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]; @@ -152,5 +157,6 @@ extern FLOAT32 f_bands_nrm_STFT256[257]; FLOAT64 qmf_filter_coeff[640]; -extern const ia_filter_bank_params_struct normal_cross_freq[FILTER_BANK_PARAMETER_COUNT]; +extern const ia_filter_bank_params_struct + normal_cross_freq[FILTER_BANK_PARAMETER_COUNT]; #endif 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 18c5697..6c96751 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 @@ -24,28 +24,27 @@ extern "C" { #endif /* __cplusplus */ - -#define SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH (1<<0) -#define SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT (1<<1) +#define SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH (1 << 0) +#define SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT (1 << 1) typedef struct { - WORD32 drc_instructions_index; - WORD32 downmix_id_request_index; - WORD32 eq_set_id; - FLOAT32 output_peak_level; - FLOAT32 loudness_norm_db_gain_adjusted; - FLOAT32 output_loudness; - FLOAT32 mixing_level; - WORD32 selection_flags; + WORD32 drc_instructions_index; + WORD32 downmix_id_request_index; + WORD32 eq_set_id; + FLOAT32 output_peak_level; + FLOAT32 loudness_norm_db_gain_adjusted; + FLOAT32 output_loudness; + FLOAT32 mixing_level; + WORD32 selection_flags; } ia_selection_candidate_info_struct; - WORD32 -impd_validate_requested_drc_feature(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct); +impd_validate_requested_drc_feature( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct); WORD32 impd_map_requested_effect_bit_idx(WORD32 requested_effect_type, - WORD32* effect_bit_idx); + WORD32* effect_bit_idx); WORD32 impd_get_fading_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); @@ -55,127 +54,123 @@ impd_get_ducking_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 impd_get_selected_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 drc_set_id_selected); + WORD32 drc_set_id_selected); WORD32 impd_get_dependent_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 -impd_get_dependent_drc_instructions(const ia_drc_config* drc_config, - const ia_drc_instructions_struct* str_drc_instruction_str, - ia_drc_instructions_struct** ppstr_drc_instructions_dependent); +impd_get_dependent_drc_instructions( + const ia_drc_config* drc_config, + const ia_drc_instructions_struct* str_drc_instruction_str, + ia_drc_instructions_struct** ppstr_drc_instructions_dependent); WORD32 -impd_manage_drc_complexity (ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config); +impd_manage_drc_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config); WORD32 -impd_manage_eq_complexity (ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config); +impd_manage_eq_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config); WORD32 -impd_manage_complexity (ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config, - WORD32* repeat_selection); +impd_manage_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config, + WORD32* repeat_selection); WORD32 impd_get_selected_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 eq_set_id_selected); + WORD32 eq_set_id_selected); WORD32 impd_get_dependent_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 impd_get_selected_loud_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 loudEqSetIdSelected); + WORD32 loudEqSetIdSelected); WORD32 -impd_select_drcs_without_compr_effects (ia_drc_config* pstr_drc_config, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_select_drcs_without_compr_effects( + ia_drc_config* pstr_drc_config, WORD32* match_found_flag, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_effect_type_attempt(ia_drc_config* pstr_drc_config, - WORD32 requested_effect_type, - WORD32 stateRequested, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_effect_type_attempt( + ia_drc_config* pstr_drc_config, WORD32 requested_effect_type, + WORD32 stateRequested, WORD32* match_found_flag, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_effect_types(ia_drc_config* pstr_drc_config, - WORD32 total_effect_type_requested, - WORD32 desired_effect_type_requested, - WORD32* requested_effect_type, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_effect_types( + ia_drc_config* pstr_drc_config, WORD32 total_effect_type_requested, + WORD32 desired_effect_type_requested, WORD32* requested_effect_type, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); -WORD32 impd_match_dynamic_range(ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - WORD32 num_drc_requests, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +WORD32 impd_match_dynamic_range( + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + WORD32 num_drc_requests, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_drc_characteristic_attempt(ia_drc_config* pstr_drc_config, - WORD32 requested_drc_characteristic, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_drc_characteristic_attempt( + ia_drc_config* pstr_drc_config, WORD32 requested_drc_characteristic, + WORD32* match_found_flag, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_drc_characteristic(ia_drc_config* pstr_drc_config, - WORD32 requested_drc_characteristic, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_drc_characteristic( + ia_drc_config* pstr_drc_config, WORD32 requested_drc_characteristic, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); -VOID impd_select_drc_coeff3(ia_drc_config* drc_config, - ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); +VOID impd_select_drc_coeff3( + ia_drc_config* drc_config, + ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); WORD32 -impd_drc_set_preselection(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 restrict_to_drc_with_album_loudness, - ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_drc_set_preselection( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 restrict_to_drc_with_album_loudness, + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); -WORD32 impd_drc_set_final_selection(ia_drc_config* pstr_drc_config, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info - , WORD32* eq_set_id_valid_flag -); +WORD32 impd_drc_set_final_selection( + ia_drc_config* pstr_drc_config, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info, + WORD32* eq_set_id_valid_flag); -WORD32 impd_match_eq_set_purpose(ia_drc_config* drc_config, - WORD32 eq_set_purpose_requested, - WORD32* eq_set_id_valid_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info, - ia_selection_candidate_info_struct* selection_candidate_info_step_2 - ); +WORD32 impd_match_eq_set_purpose( + ia_drc_config* drc_config, WORD32 eq_set_purpose_requested, + WORD32* eq_set_id_valid_flag, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info, + ia_selection_candidate_info_struct* selection_candidate_info_step_2); WORD32 impd_select_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32* drc_set_id_selected - , WORD32* eq_set_id_selected - , WORD32* loud_eq_id_sel - ); + WORD32* drc_set_id_selected, WORD32* eq_set_id_selected, + WORD32* loud_eq_id_sel); WORD32 impd_drc_sel_proc_init_dflt(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 -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); +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(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_interface_struct* pstr_drc_interface); - - +impd_drc_sel_proc_init_interface_params( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_interface_struct* pstr_drc_interface); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_selection_process.c b/decoder/drc_src/impd_drc_selection_process.c index b7b6e36..b5b1b7f 100644 --- a/decoder/drc_src/impd_drc_selection_process.c +++ b/decoder/drc_src/impd_drc_selection_process.c @@ -29,1072 +29,1090 @@ #include "impd_drc_selection_process.h" #include "impd_drc_sel_proc_drc_set_sel.h" -WORD32 impd_drc_uni_selction_proc_init(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_interface_struct* pstr_drc_interface, - WORD32 subband_domain_mode) -{ - WORD32 err = 0; - - if (pstr_drc_uni_sel_proc == NULL) { - return 1; - } +WORD32 impd_drc_uni_selction_proc_init( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_interface_struct* pstr_drc_interface, WORD32 subband_domain_mode) { + WORD32 err = 0; + + if (pstr_drc_uni_sel_proc == NULL) { + return 1; + } + + if (pstr_drc_uni_sel_proc->first_frame == 1) { + err = impd_drc_sel_proc_init_dflt(pstr_drc_uni_sel_proc); + if (err) return (err); + } - if (pstr_drc_uni_sel_proc->first_frame == 1) { - err = impd_drc_sel_proc_init_dflt(pstr_drc_uni_sel_proc); - if (err) return (err); + err = impd_drc_sel_proc_init_sel_proc_params(pstr_drc_uni_sel_proc, + pstr_drc_sel_proc_params_struct); + if (err) return (err); + { + WORD32 i; + pstr_drc_uni_sel_proc->drc_set_id_valid_flag[0] = 1; + for (i = 1; i < DRC_INSTRUCTIONS_COUNT_MAX; i++) { + pstr_drc_uni_sel_proc->drc_set_id_valid_flag[i] = 0; } - err = impd_drc_sel_proc_init_sel_proc_params(pstr_drc_uni_sel_proc, - pstr_drc_sel_proc_params_struct); - if (err) return (err); - { - WORD32 i; - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[0] = 1; - for (i=1; i<DRC_INSTRUCTIONS_COUNT_MAX; i++) - { - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[i] = 0; - } - - pstr_drc_uni_sel_proc->eq_set_id_valid_flag[0] = 1; - for (i=1; i<EQ_INSTRUCTIONS_COUNT_MAX; i++) - { - pstr_drc_uni_sel_proc->eq_set_id_valid_flag[i] = 0; - } + pstr_drc_uni_sel_proc->eq_set_id_valid_flag[0] = 1; + for (i = 1; i < EQ_INSTRUCTIONS_COUNT_MAX; i++) { + 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); + } + err = impd_drc_sel_proc_init_interface_params(pstr_drc_uni_sel_proc, + pstr_drc_interface); + if (err) return (err); - pstr_drc_uni_sel_proc->subband_domain_mode = subband_domain_mode; + pstr_drc_uni_sel_proc->subband_domain_mode = subband_domain_mode; - return 0; + return 0; } - WORD32 -impd_drc_uni_sel_proc_process(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_sel_proc_output_struct* hia_drc_sel_proc_output_struct) -{ - WORD32 i, err, drc_set_id_selected, activeDrcSetIndex; - WORD32 eq_set_id_selected; - WORD32 loudEqSetIdSelected; - - - if (pstr_drc_config != NULL) - { - if ( memcmp ( &pstr_drc_uni_sel_proc->drc_config, pstr_drc_config, sizeof(ia_drc_config) )) - { - pstr_drc_uni_sel_proc->drc_config = *pstr_drc_config; - pstr_drc_uni_sel_proc->drc_config_flag = 1; - - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count != pstr_drc_uni_sel_proc->drc_config.channel_layout.base_channel_count) - { - - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count = pstr_drc_uni_sel_proc->drc_config.channel_layout.base_channel_count; - } - if (pstr_drc_uni_sel_proc->drc_config.channel_layout.layout_signaling_present == 1 && pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout != pstr_drc_uni_sel_proc->drc_config.channel_layout.defined_layout) - { - - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout = pstr_drc_uni_sel_proc->drc_config.channel_layout.defined_layout; - } - } - else - { - pstr_drc_uni_sel_proc->drc_config_flag = 0; - } +impd_drc_uni_sel_proc_process( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_sel_proc_output_struct* hia_drc_sel_proc_output_struct) { + WORD32 i, err, drc_set_id_selected, activeDrcSetIndex; + WORD32 eq_set_id_selected; + WORD32 loudEqSetIdSelected; + + if (pstr_drc_config != NULL) { + if (memcmp(&pstr_drc_uni_sel_proc->drc_config, pstr_drc_config, + sizeof(ia_drc_config))) { + pstr_drc_uni_sel_proc->drc_config = *pstr_drc_config; + pstr_drc_uni_sel_proc->drc_config_flag = 1; + + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count != + pstr_drc_uni_sel_proc->drc_config.channel_layout.base_channel_count) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count = + pstr_drc_uni_sel_proc->drc_config.channel_layout.base_channel_count; + } + if (pstr_drc_uni_sel_proc->drc_config.channel_layout + .layout_signaling_present == 1 && + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout != + pstr_drc_uni_sel_proc->drc_config.channel_layout.defined_layout) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout = + pstr_drc_uni_sel_proc->drc_config.channel_layout.defined_layout; + } + } else { + pstr_drc_uni_sel_proc->drc_config_flag = 0; } - if (pstr_loudness_info != NULL) - { - if ( memcmp ( &pstr_drc_uni_sel_proc->loudness_info_set, pstr_loudness_info, sizeof(ia_drc_loudness_info_set_struct) )) - { - pstr_drc_uni_sel_proc->loudness_info_set = *pstr_loudness_info; - pstr_drc_uni_sel_proc->loudness_info_set_flag = 1; - } - else - { - pstr_drc_uni_sel_proc->loudness_info_set_flag = 0; - } - } - - if ((pstr_drc_uni_sel_proc->drc_config_flag && pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type != 0) || - (pstr_drc_uni_sel_proc->sel_proc_request_flag && pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type != 0) || - (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type == 0 && pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == 0)) - { - err = impd_map_target_config_req_downmix_id(pstr_drc_uni_sel_proc, - &pstr_drc_uni_sel_proc->drc_config); - if (err) return (err); + } + if (pstr_loudness_info != NULL) { + if (memcmp(&pstr_drc_uni_sel_proc->loudness_info_set, pstr_loudness_info, + sizeof(ia_drc_loudness_info_set_struct))) { + pstr_drc_uni_sel_proc->loudness_info_set = *pstr_loudness_info; + pstr_drc_uni_sel_proc->loudness_info_set_flag = 1; + } else { + pstr_drc_uni_sel_proc->loudness_info_set_flag = 0; } + } + + if ((pstr_drc_uni_sel_proc->drc_config_flag && + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type != 0) || + (pstr_drc_uni_sel_proc->sel_proc_request_flag && + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type != 0) || + (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type == 0 && + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == + 0)) { + err = impd_map_target_config_req_downmix_id( + pstr_drc_uni_sel_proc, &pstr_drc_uni_sel_proc->drc_config); + if (err) return (err); + } - if (pstr_drc_uni_sel_proc->drc_config_flag || 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); - err = impd_manage_eq_complexity (pstr_drc_uni_sel_proc, pstr_drc_config); - if (err) return(err); - while (repeat_selection==1) - { - err = impd_select_drc_set(pstr_drc_uni_sel_proc, - &drc_set_id_selected - , &eq_set_id_selected - , &loudEqSetIdSelected - ); - if (err) return (err); - - err = impd_get_selected_drc_set(pstr_drc_uni_sel_proc, - drc_set_id_selected); - if (err) return (err); - - err = impd_get_dependent_drc_set(pstr_drc_uni_sel_proc); - if (err) return (err); - - err = impd_get_fading_drc_set(pstr_drc_uni_sel_proc); - if (err) return (err); - - err = impd_get_ducking_drc_set(pstr_drc_uni_sel_proc); - if (err) return (err); - - pstr_drc_uni_sel_proc->eq_inst_index[0] = -1; - pstr_drc_uni_sel_proc->eq_inst_index[1] = -1; - - err = impd_get_selected_eq_set(pstr_drc_uni_sel_proc, eq_set_id_selected); - if (err) return (err); - - err = impd_get_dependent_eq_set(pstr_drc_uni_sel_proc); - if (err) return (err); - - err = impd_get_selected_loud_eq_set(pstr_drc_uni_sel_proc, loudEqSetIdSelected); - if (err) return (err); - - activeDrcSetIndex = 0; - 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; - - str_drc_instruction_str = pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[drc_instructions_index]; - - if (drc_instructions_index >= 0 && str_drc_instruction_str.drc_set_id > 0) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[activeDrcSetIndex] = str_drc_instruction_str.drc_set_id; - - if ((i==3) && (str_drc_instruction_str.drc_set_effect & (EFFECT_BIT_DUCK_SELF | EFFECT_BIT_DUCK_OTHER))) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_downmix_ids[activeDrcSetIndex] = 0; - } - else { - if (str_drc_instruction_str.drc_apply_to_dwnmix == 1) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_downmix_ids[activeDrcSetIndex] = str_drc_instruction_str.downmix_id[0]; - } else { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_downmix_ids[activeDrcSetIndex] = 0; - } - } + if (pstr_drc_uni_sel_proc->drc_config_flag || + 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; - activeDrcSetIndex++; - } - } - if (activeDrcSetIndex <= 3) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.num_sel_drc_sets = activeDrcSetIndex; - } else - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.num_sel_drc_sets = -1; - return(UNEXPECTED_ERROR); + err = impd_manage_drc_complexity(pstr_drc_uni_sel_proc, pstr_drc_config); + if (err) return (err); + err = impd_manage_eq_complexity(pstr_drc_uni_sel_proc, pstr_drc_config); + if (err) return (err); + while (repeat_selection == 1) { + err = impd_select_drc_set(pstr_drc_uni_sel_proc, &drc_set_id_selected, + &eq_set_id_selected, &loudEqSetIdSelected); + if (err) return (err); + + err = + impd_get_selected_drc_set(pstr_drc_uni_sel_proc, drc_set_id_selected); + if (err) return (err); + + err = impd_get_dependent_drc_set(pstr_drc_uni_sel_proc); + if (err) return (err); + + err = impd_get_fading_drc_set(pstr_drc_uni_sel_proc); + if (err) return (err); + + err = impd_get_ducking_drc_set(pstr_drc_uni_sel_proc); + if (err) return (err); + + pstr_drc_uni_sel_proc->eq_inst_index[0] = -1; + pstr_drc_uni_sel_proc->eq_inst_index[1] = -1; + + err = impd_get_selected_eq_set(pstr_drc_uni_sel_proc, eq_set_id_selected); + if (err) return (err); + + err = impd_get_dependent_eq_set(pstr_drc_uni_sel_proc); + if (err) return (err); + + err = impd_get_selected_loud_eq_set(pstr_drc_uni_sel_proc, + loudEqSetIdSelected); + if (err) return (err); + + activeDrcSetIndex = 0; + 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; + + str_drc_instruction_str = + pstr_drc_uni_sel_proc->drc_config + .str_drc_instruction_str[drc_instructions_index]; + + if (drc_instructions_index >= 0 && + str_drc_instruction_str.drc_set_id > 0) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .sel_drc_set_ids[activeDrcSetIndex] = + str_drc_instruction_str.drc_set_id; + + if ((i == 3) && (str_drc_instruction_str.drc_set_effect & + (EFFECT_BIT_DUCK_SELF | EFFECT_BIT_DUCK_OTHER))) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .sel_downmix_ids[activeDrcSetIndex] = 0; + } else { + if (str_drc_instruction_str.drc_apply_to_dwnmix == 1) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .sel_downmix_ids[activeDrcSetIndex] = + str_drc_instruction_str.downmix_id[0]; + } else { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .sel_downmix_ids[activeDrcSetIndex] = 0; } + } - impd_sel_downmix_matrix(pstr_drc_uni_sel_proc, - &pstr_drc_uni_sel_proc->drc_config); - - 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); - } + activeDrcSetIndex++; } + } + if (activeDrcSetIndex <= 3) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.num_sel_drc_sets = + activeDrcSetIndex; + } else { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.num_sel_drc_sets = -1; + return (UNEXPECTED_ERROR); + } - pstr_drc_uni_sel_proc->sel_proc_request_flag = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.boost = pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.compress = pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.drc_characteristic_target = pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_characteristic_target; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.loudness_normalization_gain_db += pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_modification_db; - + impd_sel_downmix_matrix(pstr_drc_uni_sel_proc, + &pstr_drc_uni_sel_proc->drc_config); + 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); + } } - for (i=0; i<2; i++) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_eq_set_ids[i] = pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.str_eq_instructions[pstr_drc_uni_sel_proc->eq_inst_index[i]].eq_set_id; - } - if (pstr_drc_uni_sel_proc->loud_eq_inst_index_sel >= 0) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_loud_eq_id = pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.loud_eq_instructions[pstr_drc_uni_sel_proc->loud_eq_inst_index_sel].loud_eq_set_id; - } - else - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_loud_eq_id = 0; - } - *hia_drc_sel_proc_output_struct = pstr_drc_uni_sel_proc->uni_drc_sel_proc_output; - return 0; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.boost = + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.compress = + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.drc_characteristic_target = + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .drc_characteristic_target; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .loudness_normalization_gain_db += + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_norm_gain_modification_db; + } + for (i = 0; i < 2; i++) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_eq_set_ids[i] = + pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .str_eq_instructions[pstr_drc_uni_sel_proc->eq_inst_index[i]] + .eq_set_id; + } + if (pstr_drc_uni_sel_proc->loud_eq_inst_index_sel >= 0) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_loud_eq_id = + pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .loud_eq_instructions[pstr_drc_uni_sel_proc->loud_eq_inst_index_sel] + .loud_eq_set_id; + } else { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_loud_eq_id = 0; + } + *hia_drc_sel_proc_output_struct = + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output; + + return 0; } -WORD32 impd_map_target_config_req_downmix_id(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config) -{ - WORD32 i, dwnmix_instructions_count; - WORD32 target_ch_count_prelim = pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count; - - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 0; - switch (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type) { - case 0: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == 0) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 1; - } - break; - case 1: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_layout == pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == 0) { - dwnmix_instructions_count = pstr_drc_uni_sel_proc->drc_config.dwnmix_instructions_count; - for (i=0; i<dwnmix_instructions_count; i++) - { - ia_downmix_instructions_struct* dwnmix_instructions = &(pstr_drc_config->dwnmix_instructions[i]); - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_layout == dwnmix_instructions->target_layout) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests] = dwnmix_instructions->downmix_id; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests += 1; - target_ch_count_prelim = dwnmix_instructions->target_channel_count; - } - } - } - - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == 0) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 1; - } - break; - case 2: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_ch_count == pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == 0) - { - dwnmix_instructions_count = pstr_drc_uni_sel_proc->drc_config.dwnmix_instructions_count; - for (i=0; i<dwnmix_instructions_count; i++) - { - ia_downmix_instructions_struct* dwnmix_instructions = &(pstr_drc_config->dwnmix_instructions[i]); - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_ch_count == dwnmix_instructions->target_channel_count) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests] = dwnmix_instructions->downmix_id; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests += 1; - target_ch_count_prelim = dwnmix_instructions->target_channel_count; - } - } - } - - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests == 0) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 1; - } - break; - default: - return UNEXPECTED_ERROR; - break; - } - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_ch_count_prelim = target_ch_count_prelim; - - return 0; +WORD32 impd_map_target_config_req_downmix_id( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config) { + WORD32 i, dwnmix_instructions_count; + WORD32 target_ch_count_prelim = + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count; + + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 0; + switch (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type) { + case 0: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests == 0) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = + 1; + } + break; + case 1: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_layout == + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = + 1; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests == 0) { + dwnmix_instructions_count = + pstr_drc_uni_sel_proc->drc_config.dwnmix_instructions_count; + for (i = 0; i < dwnmix_instructions_count; i++) { + ia_downmix_instructions_struct* dwnmix_instructions = + &(pstr_drc_config->dwnmix_instructions[i]); + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_layout == + dwnmix_instructions->target_layout) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id + [pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests] = + dwnmix_instructions->downmix_id; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests += 1; + target_ch_count_prelim = dwnmix_instructions->target_channel_count; + } + } + } + + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests == 0) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = + 1; + } + break; + case 2: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_ch_count == + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = + 1; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests == 0) { + dwnmix_instructions_count = + pstr_drc_uni_sel_proc->drc_config.dwnmix_instructions_count; + for (i = 0; i < dwnmix_instructions_count; i++) { + ia_downmix_instructions_struct* dwnmix_instructions = + &(pstr_drc_config->dwnmix_instructions[i]); + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_ch_count == + dwnmix_instructions->target_channel_count) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id + [pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests] = + dwnmix_instructions->downmix_id; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests += 1; + target_ch_count_prelim = dwnmix_instructions->target_channel_count; + } + } + } + + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests == 0) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[0] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = + 1; + } + break; + default: + return UNEXPECTED_ERROR; + break; + } + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_ch_count_prelim = + target_ch_count_prelim; + + return 0; } VOID impd_sel_downmix_matrix(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config) -{ - WORD32 i, j, n; - - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.base_channel_count = pstr_drc_config->channel_layout.base_channel_count; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count = pstr_drc_config->channel_layout.base_channel_count; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_layout = -1; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.downmix_matrix_present = 0; - pstr_drc_uni_sel_proc->downmix_inst_index_sel = -1; - - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id != 0) { - - for (n=0; n<pstr_drc_config->dwnmix_instructions_count; n++) { - ia_downmix_instructions_struct* dwnmix_instructions = &(pstr_drc_config->dwnmix_instructions[n]); - - - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id == dwnmix_instructions->downmix_id) { - pstr_drc_uni_sel_proc->downmix_inst_index_sel = n; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count = dwnmix_instructions->target_channel_count; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_layout = dwnmix_instructions->target_layout; - if (dwnmix_instructions->downmix_coefficients_present) { - for( i =0 ; i < pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.base_channel_count; i++) - { - for( j =0 ; j < pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count; j++) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.downmix_matrix[i][j] = dwnmix_instructions->downmix_coefficient[i+j*pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.base_channel_count]; - } - } - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.downmix_matrix_present = 1; - } - break; + ia_drc_config* pstr_drc_config) { + WORD32 i, j, n; + + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.base_channel_count = + pstr_drc_config->channel_layout.base_channel_count; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count = + pstr_drc_config->channel_layout.base_channel_count; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_layout = -1; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.downmix_matrix_present = 0; + pstr_drc_uni_sel_proc->downmix_inst_index_sel = -1; + + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id != 0) { + for (n = 0; n < pstr_drc_config->dwnmix_instructions_count; n++) { + ia_downmix_instructions_struct* dwnmix_instructions = + &(pstr_drc_config->dwnmix_instructions[n]); + + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id == + dwnmix_instructions->downmix_id) { + pstr_drc_uni_sel_proc->downmix_inst_index_sel = n; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count = + dwnmix_instructions->target_channel_count; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_layout = + dwnmix_instructions->target_layout; + if (dwnmix_instructions->downmix_coefficients_present) { + for (i = 0; i < pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .base_channel_count; + i++) { + for (j = 0; j < pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .target_channel_count; + j++) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .downmix_matrix[i][j] = + dwnmix_instructions->downmix_coefficient + [i + + j * + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .base_channel_count]; } + } + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .downmix_matrix_present = 1; } + break; + } } - return; + } + return; } - WORD32 impd_get_selected_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 eq_set_id_selected) -{ - WORD32 n; - - pstr_drc_uni_sel_proc->eq_inst_index_sel = -1; - - if (eq_set_id_selected > 0) - { - for(n=0; n<pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.eq_instructions_count; n++) - { - if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.str_eq_instructions[n].eq_set_id == eq_set_id_selected) break; - } - if (n == pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.eq_instructions_count) - { - return(EXTERNAL_ERROR); - } - pstr_drc_uni_sel_proc->eq_inst_index_sel = n; - if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.str_eq_instructions[n].eq_apply_to_downmix == 1) - { - pstr_drc_uni_sel_proc->eq_inst_index[1] = pstr_drc_uni_sel_proc->eq_inst_index_sel; - } - else - { - pstr_drc_uni_sel_proc->eq_inst_index[0] = pstr_drc_uni_sel_proc->eq_inst_index_sel; - } + WORD32 eq_set_id_selected) { + WORD32 n; + + pstr_drc_uni_sel_proc->eq_inst_index_sel = -1; + + if (eq_set_id_selected > 0) { + for (n = 0; n < pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .eq_instructions_count; + n++) { + if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .str_eq_instructions[n] + .eq_set_id == eq_set_id_selected) + break; } - return (0); + if (n == + pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .eq_instructions_count) { + return (EXTERNAL_ERROR); + } + pstr_drc_uni_sel_proc->eq_inst_index_sel = n; + if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .str_eq_instructions[n] + .eq_apply_to_downmix == 1) { + pstr_drc_uni_sel_proc->eq_inst_index[1] = + pstr_drc_uni_sel_proc->eq_inst_index_sel; + } else { + pstr_drc_uni_sel_proc->eq_inst_index[0] = + pstr_drc_uni_sel_proc->eq_inst_index_sel; + } + } + return (0); } -WORD32 impd_get_dependent_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) -{ - ia_eq_instructions_struct* str_eq_instructions = NULL; - - if (pstr_drc_uni_sel_proc->eq_inst_index_sel >= 0) - { - str_eq_instructions = &(pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.str_eq_instructions[pstr_drc_uni_sel_proc->eq_inst_index_sel]); - - if (str_eq_instructions->depends_on_eq_set_present == 1) - { - WORD32 n; - WORD32 dependsOnEqSetID = str_eq_instructions->depends_on_eq_set; - - for(n=0; n<pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.eq_instructions_count; n++) - { - if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.str_eq_instructions[n].eq_set_id == dependsOnEqSetID) break; - } - if (n == pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.eq_instructions_count) - { - return(UNEXPECTED_ERROR); - } - if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.str_eq_instructions[n].eq_apply_to_downmix == 1) - { - pstr_drc_uni_sel_proc->eq_inst_index[1] = n; - } - else - { - pstr_drc_uni_sel_proc->eq_inst_index[0] = n; - } - } +WORD32 impd_get_dependent_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { + ia_eq_instructions_struct* str_eq_instructions = NULL; + + if (pstr_drc_uni_sel_proc->eq_inst_index_sel >= 0) { + str_eq_instructions = + &(pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .str_eq_instructions[pstr_drc_uni_sel_proc->eq_inst_index_sel]); + + if (str_eq_instructions->depends_on_eq_set_present == 1) { + WORD32 n; + WORD32 dependsOnEqSetID = str_eq_instructions->depends_on_eq_set; + + for (n = 0; n < pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .eq_instructions_count; + n++) { + if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .str_eq_instructions[n] + .eq_set_id == dependsOnEqSetID) + break; + } + if (n == + pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .eq_instructions_count) { + return (UNEXPECTED_ERROR); + } + if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .str_eq_instructions[n] + .eq_apply_to_downmix == 1) { + pstr_drc_uni_sel_proc->eq_inst_index[1] = n; + } else { + pstr_drc_uni_sel_proc->eq_inst_index[0] = n; + } } - return (0); + } + return (0); } -WORD32 impd_get_selected_loud_eq_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 loudEqSetIdSelected) -{ - WORD32 n; +WORD32 impd_get_selected_loud_eq_set( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, WORD32 loudEqSetIdSelected) { + WORD32 n; - pstr_drc_uni_sel_proc->loud_eq_inst_index_sel = -1; + pstr_drc_uni_sel_proc->loud_eq_inst_index_sel = -1; - if (loudEqSetIdSelected > 0) - { - for(n=0; n<pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.loud_eq_instructions_count; n++) - { - if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.loud_eq_instructions[n].loud_eq_set_id == loudEqSetIdSelected) break; - } - if (n == pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext.loud_eq_instructions_count) - { - return(EXTERNAL_ERROR); - } - pstr_drc_uni_sel_proc->loud_eq_inst_index_sel = n; + if (loudEqSetIdSelected > 0) { + for (n = 0; n < pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .loud_eq_instructions_count; + n++) { + if (pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .loud_eq_instructions[n] + .loud_eq_set_id == loudEqSetIdSelected) + break; } - return (0); + if (n == + pstr_drc_uni_sel_proc->drc_config.str_drc_config_ext + .loud_eq_instructions_count) { + return (EXTERNAL_ERROR); + } + pstr_drc_uni_sel_proc->loud_eq_inst_index_sel = n; + } + return (0); } WORD32 impd_select_loud_eq(ia_drc_config* pstr_drc_config, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32 eq_set_id_requested, - WORD32* loud_eq_id_sel) -{ - WORD32 i, c, d, e; - - *loud_eq_id_sel = 0; - for (i=0; i<pstr_drc_config->str_drc_config_ext.loud_eq_instructions_count; i++) - { - ia_loud_eq_instructions_struct* loud_eq_instructions = &pstr_drc_config->str_drc_config_ext.loud_eq_instructions[i]; - if (loud_eq_instructions->drc_location == LOCATION_SELECTED) { - for (d=0; d<loud_eq_instructions->dwnmix_id_count; d++) - { - if ((loud_eq_instructions->downmix_id[d] == requested_dwnmix_id) || (loud_eq_instructions->downmix_id[d] == ID_FOR_ANY_DOWNMIX)) { - for (c=0; c<loud_eq_instructions->drc_set_id_count; c++) - { - if ((loud_eq_instructions->drc_set_id[c] == drc_set_id_requested) || (loud_eq_instructions->drc_set_id[c] == ID_FOR_ANY_DRC)) { - for (e=0; e<loud_eq_instructions->eq_set_id_count; e++) - { - if ((loud_eq_instructions->eq_set_id[e] == eq_set_id_requested) || (loud_eq_instructions->eq_set_id[e] == ID_FOR_ANY_EQ)) { - *loud_eq_id_sel = loud_eq_instructions->loud_eq_set_id; - } - } - } - } + WORD32 requested_dwnmix_id, + WORD32 drc_set_id_requested, + WORD32 eq_set_id_requested, WORD32* loud_eq_id_sel) { + WORD32 i, c, d, e; + + *loud_eq_id_sel = 0; + for (i = 0; + i < pstr_drc_config->str_drc_config_ext.loud_eq_instructions_count; + i++) { + ia_loud_eq_instructions_struct* loud_eq_instructions = + &pstr_drc_config->str_drc_config_ext.loud_eq_instructions[i]; + if (loud_eq_instructions->drc_location == LOCATION_SELECTED) { + for (d = 0; d < loud_eq_instructions->dwnmix_id_count; d++) { + if ((loud_eq_instructions->downmix_id[d] == requested_dwnmix_id) || + (loud_eq_instructions->downmix_id[d] == ID_FOR_ANY_DOWNMIX)) { + for (c = 0; c < loud_eq_instructions->drc_set_id_count; c++) { + if ((loud_eq_instructions->drc_set_id[c] == drc_set_id_requested) || + (loud_eq_instructions->drc_set_id[c] == ID_FOR_ANY_DRC)) { + for (e = 0; e < loud_eq_instructions->eq_set_id_count; e++) { + if ((loud_eq_instructions->eq_set_id[e] == + eq_set_id_requested) || + (loud_eq_instructions->eq_set_id[e] == ID_FOR_ANY_EQ)) { + *loud_eq_id_sel = loud_eq_instructions->loud_eq_set_id; } + } } + } } + } } - return (0); + } + return (0); } -WORD32 impd_match_eq_set(ia_drc_config* drc_config, - WORD32 downmix_id, - WORD32 drc_set_id, - WORD32* eq_set_id_valid_flag, - WORD32* matching_eq_set_count, - WORD32* matching_eq_set_idx) -{ - ia_eq_instructions_struct* str_eq_instructions = NULL; - WORD32 i, k, n; - WORD32 match = 0; - *matching_eq_set_count = 0; - for (i=0; i<drc_config->str_drc_config_ext.eq_instructions_count; i++) - { - str_eq_instructions = &drc_config->str_drc_config_ext.str_eq_instructions[i]; - - if (str_eq_instructions->depends_on_eq_set_present == 0) { - if (str_eq_instructions->no_independent_eq_use == 1) continue; - } - if (eq_set_id_valid_flag[str_eq_instructions->eq_set_id] == 0) continue; - for (k=0; k<str_eq_instructions->dwnmix_id_count; k++) { - if ((str_eq_instructions->downmix_id[k] == ID_FOR_ANY_DOWNMIX) || (downmix_id == str_eq_instructions->downmix_id[k])) { - for (n=0; n<str_eq_instructions->drc_set_id_count; n++) { - if ((str_eq_instructions->drc_set_id[n] == ID_FOR_ANY_DRC) || (drc_set_id == str_eq_instructions->drc_set_id[n])) { - match = 1; - matching_eq_set_idx[*matching_eq_set_count] = i; - (*matching_eq_set_count)++; - } - } - } +WORD32 impd_match_eq_set(ia_drc_config* drc_config, WORD32 downmix_id, + WORD32 drc_set_id, WORD32* eq_set_id_valid_flag, + WORD32* matching_eq_set_count, + WORD32* matching_eq_set_idx) { + ia_eq_instructions_struct* str_eq_instructions = NULL; + WORD32 i, k, n; + WORD32 match = 0; + *matching_eq_set_count = 0; + for (i = 0; i < drc_config->str_drc_config_ext.eq_instructions_count; i++) { + str_eq_instructions = + &drc_config->str_drc_config_ext.str_eq_instructions[i]; + + if (str_eq_instructions->depends_on_eq_set_present == 0) { + if (str_eq_instructions->no_independent_eq_use == 1) continue; + } + if (eq_set_id_valid_flag[str_eq_instructions->eq_set_id] == 0) continue; + for (k = 0; k < str_eq_instructions->dwnmix_id_count; k++) { + if ((str_eq_instructions->downmix_id[k] == ID_FOR_ANY_DOWNMIX) || + (downmix_id == str_eq_instructions->downmix_id[k])) { + for (n = 0; n < str_eq_instructions->drc_set_id_count; n++) { + if ((str_eq_instructions->drc_set_id[n] == ID_FOR_ANY_DRC) || + (drc_set_id == str_eq_instructions->drc_set_id[n])) { + match = 1; + matching_eq_set_idx[*matching_eq_set_count] = i; + (*matching_eq_set_count)++; + } } + } } - return(0); + } + return (0); } -WORD32 impd_match_eq_set_purpose(ia_drc_config* drc_config, - WORD32 eq_set_purpose_requested, - WORD32* eq_set_id_valid_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info, - ia_selection_candidate_info_struct* selection_candidate_info_step_2 - ) -{ - WORD32 i,j,k; - WORD32 match_found_flag; - WORD32 loop_cnt = 0; - ia_eq_instructions_struct* str_eq_instructions = NULL; - match_found_flag = 0; - - k = 0; - while ((k==0) && (loop_cnt < 2)) - { - for (j=0; j < *selection_candidate_count; j++) - { - WORD32 eq_set_id_requested = selection_candidate_info[j].eq_set_id; - - for (i=0; i<drc_config->str_drc_config_ext.eq_instructions_count; i++) - { - str_eq_instructions = &drc_config->str_drc_config_ext.str_eq_instructions[i]; - - if (str_eq_instructions->depends_on_eq_set_present == 0) { - if (eq_set_id_valid_flag[str_eq_instructions->eq_set_id] == 0) continue; - } - if (eq_set_id_valid_flag[str_eq_instructions->eq_set_id] == 0) continue; - if ((str_eq_instructions->eq_set_id == eq_set_id_requested) && (str_eq_instructions->eq_set_purpose & eq_set_purpose_requested)) - { - match_found_flag = 1; - } - } +WORD32 impd_match_eq_set_purpose( + ia_drc_config* drc_config, WORD32 eq_set_purpose_requested, + WORD32* eq_set_id_valid_flag, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info, + ia_selection_candidate_info_struct* selection_candidate_info_step_2) { + WORD32 i, j, k; + WORD32 match_found_flag; + WORD32 loop_cnt = 0; + ia_eq_instructions_struct* str_eq_instructions = NULL; + match_found_flag = 0; + + k = 0; + while ((k == 0) && (loop_cnt < 2)) { + for (j = 0; j < *selection_candidate_count; j++) { + WORD32 eq_set_id_requested = selection_candidate_info[j].eq_set_id; + + for (i = 0; i < drc_config->str_drc_config_ext.eq_instructions_count; + i++) { + str_eq_instructions = + &drc_config->str_drc_config_ext.str_eq_instructions[i]; - if (match_found_flag > 0) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[j], sizeof(ia_selection_candidate_info_struct)); - k++; - } + if (str_eq_instructions->depends_on_eq_set_present == 0) { + if (eq_set_id_valid_flag[str_eq_instructions->eq_set_id] == 0) + continue; } - eq_set_purpose_requested = EQ_PURPOSE_DEFAULT; - loop_cnt++; + if (eq_set_id_valid_flag[str_eq_instructions->eq_set_id] == 0) continue; + if ((str_eq_instructions->eq_set_id == eq_set_id_requested) && + (str_eq_instructions->eq_set_purpose & eq_set_purpose_requested)) { + match_found_flag = 1; + } + } + + if (match_found_flag > 0) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info[j], + sizeof(ia_selection_candidate_info_struct)); + k++; + } } + eq_set_purpose_requested = EQ_PURPOSE_DEFAULT; + loop_cnt++; + } - if (k>0) { - memcpy(&selection_candidate_info[0], &selection_candidate_info_step_2[0], k * sizeof(ia_selection_candidate_info_struct)); - *selection_candidate_count = k; - } + if (k > 0) { + memcpy(&selection_candidate_info[0], &selection_candidate_info_step_2[0], + k * sizeof(ia_selection_candidate_info_struct)); + *selection_candidate_count = k; + } - return(0); + return (0); } WORD32 impd_find_eq_set_no_compression(ia_drc_config* pstr_drc_config, - WORD32 requested_dwnmix_id, - WORD32* num_compression_eq_count, - WORD32* num_compression_eq_id) -{ - WORD32 i, d, k, c; - k=0; - for (i=0; i<pstr_drc_config->str_drc_config_ext.eq_instructions_count; i++) - { - ia_eq_instructions_struct* str_eq_instructions = &pstr_drc_config->str_drc_config_ext.str_eq_instructions[i]; - for (d=0; d<str_eq_instructions->dwnmix_id_count; d++) - { - if (requested_dwnmix_id == str_eq_instructions->downmix_id[d]) - { - for (c=0; c<str_eq_instructions->drc_set_id_count; c++) - { - if ((str_eq_instructions->drc_set_id[c] == ID_FOR_ANY_DRC) || (str_eq_instructions->drc_set_id[c] == 0)) - { - num_compression_eq_id[k] = str_eq_instructions->eq_set_id; - k++; - } - } - } + WORD32 requested_dwnmix_id, + WORD32* num_compression_eq_count, + WORD32* num_compression_eq_id) { + WORD32 i, d, k, c; + k = 0; + for (i = 0; i < pstr_drc_config->str_drc_config_ext.eq_instructions_count; + i++) { + ia_eq_instructions_struct* str_eq_instructions = + &pstr_drc_config->str_drc_config_ext.str_eq_instructions[i]; + for (d = 0; d < str_eq_instructions->dwnmix_id_count; d++) { + if (requested_dwnmix_id == str_eq_instructions->downmix_id[d]) { + for (c = 0; c < str_eq_instructions->drc_set_id_count; c++) { + if ((str_eq_instructions->drc_set_id[c] == ID_FOR_ANY_DRC) || + (str_eq_instructions->drc_set_id[c] == 0)) { + num_compression_eq_id[k] = str_eq_instructions->eq_set_id; + k++; + } } + } } - *num_compression_eq_count = k; - return (0); + } + *num_compression_eq_count = k; + return (0); } - -VOID impd_select_drc_coeff3(ia_drc_config* drc_config, - ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc) -{ - WORD32 n; - WORD32 cV1 = -1; - WORD32 cV0 = -1; - for(n=0; n<drc_config->drc_coefficients_drc_count; n++) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == 1) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].version == 0) - { - cV0 = n; - } - else - { - cV1 = n; - } - } +VOID impd_select_drc_coeff3( + ia_drc_config* drc_config, + ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc) { + WORD32 n; + WORD32 cV1 = -1; + WORD32 cV0 = -1; + for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == 1) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].version == 0) { + cV0 = n; + } else { + cV1 = n; + } } - if (cV1 >= 0) { - *str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[cV1]); - } - else if (cV0 >= 0) { - *str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[cV0]); - } - else { - *str_p_loc_drc_coefficients_uni_drc = NULL; - } - return; + } + if (cV1 >= 0) { + *str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[cV1]); + } else if (cV0 >= 0) { + *str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[cV0]); + } else { + *str_p_loc_drc_coefficients_uni_drc = NULL; + } + return; } - - -WORD32 impd_manage_drc_complexity (ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config) -{ - WORD32 i, j, err, channel_count; - WORD32 numBandsTooLarge = 0; - FLOAT32 complexityDrcPrelim; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; - FLOAT32 complexitySupportedTotal = (FLOAT32)(pow(2.0f, pstr_drc_uni_sel_proc->compl_level_supported_total)); - ia_drc_instructions_struct* str_drc_instruction_str; - ia_drc_instructions_struct* drc_inst_uni_drc_dependent; - ia_drc_sel_proc_output_struct* uni_drc_sel_proc_output = &pstr_drc_uni_sel_proc->uni_drc_sel_proc_output; - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; - - impd_select_drc_coeff3(pstr_drc_config, &str_p_loc_drc_coefficients_uni_drc); - - for (i=0; i<pstr_drc_config->drc_instructions_uni_drc_count; i++) - { - str_drc_instruction_str = &pstr_drc_config->str_drc_instruction_str[i]; - if (str_drc_instruction_str->no_independent_use) continue; - - numBandsTooLarge = 0; - if (str_drc_instruction_str->drc_apply_to_dwnmix == 1) - { - channel_count = uni_drc_sel_proc_output->target_channel_count; - } - else - { - channel_count = uni_drc_sel_proc_output->base_channel_count; - } - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - for (j=0; j<str_drc_instruction_str->num_drc_ch_groups; j++) - { - ia_gain_set_params_struct* gain_set_params = &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[str_drc_instruction_str->gain_set_index_for_channel_group[j]]); - if (gain_set_params->band_count > pstr_drc_sel_proc_params_struct->num_bands_supported) - { - numBandsTooLarge = 1; - } - else - { - if (gain_set_params->band_count > 4) - { - /* Add complexity for analysis and synthesis QMF bank here, if supported */ - } - } - } +WORD32 impd_manage_drc_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config) { + WORD32 i, j, err, channel_count; + WORD32 numBandsTooLarge = 0; + FLOAT32 complexityDrcPrelim; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; + FLOAT32 complexitySupportedTotal = + (FLOAT32)(pow(2.0f, pstr_drc_uni_sel_proc->compl_level_supported_total)); + ia_drc_instructions_struct* str_drc_instruction_str; + ia_drc_instructions_struct* drc_inst_uni_drc_dependent; + ia_drc_sel_proc_output_struct* uni_drc_sel_proc_output = + &pstr_drc_uni_sel_proc->uni_drc_sel_proc_output; + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = + &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; + + impd_select_drc_coeff3(pstr_drc_config, &str_p_loc_drc_coefficients_uni_drc); + + for (i = 0; i < pstr_drc_config->drc_instructions_uni_drc_count; i++) { + str_drc_instruction_str = &pstr_drc_config->str_drc_instruction_str[i]; + if (str_drc_instruction_str->no_independent_use) continue; + + numBandsTooLarge = 0; + if (str_drc_instruction_str->drc_apply_to_dwnmix == 1) { + channel_count = uni_drc_sel_proc_output->target_channel_count; + } else { + channel_count = uni_drc_sel_proc_output->base_channel_count; + } + if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) { + for (j = 0; j < str_drc_instruction_str->num_drc_ch_groups; j++) { + ia_gain_set_params_struct* gain_set_params = &( + str_p_loc_drc_coefficients_uni_drc->gain_set_params + [str_drc_instruction_str->gain_set_index_for_channel_group[j]]); + if (gain_set_params->band_count > + pstr_drc_sel_proc_params_struct->num_bands_supported) { + numBandsTooLarge = 1; + } else { + if (gain_set_params->band_count > 4) { + /* Add complexity for analysis and synthesis QMF bank here, if + * supported */ + } } - complexityDrcPrelim =(FLOAT32)( channel_count * (1 << str_drc_instruction_str->drc_set_complexity_level)); - - if (str_drc_instruction_str->depends_on_drc_set > 0) - { - err = impd_find_drc_instructions_uni_drc(pstr_drc_config, str_drc_instruction_str->depends_on_drc_set, &drc_inst_uni_drc_dependent); - if (err) return (err); - if (drc_inst_uni_drc_dependent->drc_apply_to_dwnmix == 1) - { - channel_count = uni_drc_sel_proc_output->target_channel_count; - } - else - { - channel_count = uni_drc_sel_proc_output->base_channel_count; - } - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - for (j=0; j<str_drc_instruction_str->num_drc_ch_groups; j++) - { - ia_gain_set_params_struct* gain_set_params = &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[drc_inst_uni_drc_dependent->gain_set_index_for_channel_group[j]]); - if (gain_set_params->band_count > pstr_drc_sel_proc_params_struct->num_bands_supported) - { - numBandsTooLarge = 1; - } - else - { - if (gain_set_params->band_count > 4) - { - /* Add complexity for analysis and synthesis QMF bank here, if supported */ - } - } - } + } + } + complexityDrcPrelim = + (FLOAT32)(channel_count * + (1 << str_drc_instruction_str->drc_set_complexity_level)); + + if (str_drc_instruction_str->depends_on_drc_set > 0) { + err = impd_find_drc_instructions_uni_drc( + pstr_drc_config, str_drc_instruction_str->depends_on_drc_set, + &drc_inst_uni_drc_dependent); + if (err) return (err); + if (drc_inst_uni_drc_dependent->drc_apply_to_dwnmix == 1) { + channel_count = uni_drc_sel_proc_output->target_channel_count; + } else { + channel_count = uni_drc_sel_proc_output->base_channel_count; + } + if (pstr_drc_uni_sel_proc->subband_domain_mode == + SUBBAND_DOMAIN_MODE_OFF) { + for (j = 0; j < str_drc_instruction_str->num_drc_ch_groups; j++) { + ia_gain_set_params_struct* gain_set_params = &( + str_p_loc_drc_coefficients_uni_drc + ->gain_set_params[drc_inst_uni_drc_dependent + ->gain_set_index_for_channel_group[j]]); + if (gain_set_params->band_count > + pstr_drc_sel_proc_params_struct->num_bands_supported) { + numBandsTooLarge = 1; + } else { + if (gain_set_params->band_count > 4) { + /* Add complexity for analysis and synthesis QMF bank here, if + * supported */ } - complexityDrcPrelim += channel_count * (1 << drc_inst_uni_drc_dependent->drc_set_complexity_level); + } } + } + complexityDrcPrelim += + channel_count * + (1 << drc_inst_uni_drc_dependent->drc_set_complexity_level); + } - complexityDrcPrelim *= pstr_drc_config->sampling_rate / 48000.0f; + complexityDrcPrelim *= pstr_drc_config->sampling_rate / 48000.0f; - if ((complexityDrcPrelim <= complexitySupportedTotal) && (numBandsTooLarge == 0)) - { - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 1; - } + if ((complexityDrcPrelim <= complexitySupportedTotal) && + (numBandsTooLarge == 0)) { + pstr_drc_uni_sel_proc + ->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 1; } - return (0); + } + return (0); } -WORD32 impd_manage_eq_complexity (ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config) -{ - WORD32 k, n, m, err; - WORD32 eqComplexityPrimary = 0; - WORD32 eqComplexityDependent = 0; - WORD32 eqChannelCountPrimary = 0, eqChannelCountDependent = 0; - FLOAT32 complexityTotalEq; - ia_drc_config* drc_config = &pstr_drc_uni_sel_proc->drc_config; - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; - FLOAT32 complexitySupportedTotal =(FLOAT32)( pow(2.0f, pstr_drc_uni_sel_proc->compl_level_supported_total)); - - for (n=0; n<drc_config->str_drc_config_ext.eq_instructions_count; n++) - { - ia_eq_instructions_struct* str_eq_instructions = &pstr_drc_config->str_drc_config_ext.str_eq_instructions[n]; - - eqChannelCountPrimary = pstr_drc_sel_proc_params_struct->base_channel_count; - eqChannelCountDependent = pstr_drc_sel_proc_params_struct->base_channel_count; - - eqComplexityPrimary = 1 << str_eq_instructions->eq_set_complexity_level; - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - if (str_eq_instructions->td_filter_cascade_present == 0) - { - eqComplexityPrimary = 0; +WORD32 impd_manage_eq_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config) { + WORD32 k, n, m, err; + WORD32 eqComplexityPrimary = 0; + WORD32 eqComplexityDependent = 0; + WORD32 eqChannelCountPrimary = 0, eqChannelCountDependent = 0; + FLOAT32 complexityTotalEq; + ia_drc_config* drc_config = &pstr_drc_uni_sel_proc->drc_config; + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = + &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; + FLOAT32 complexitySupportedTotal = + (FLOAT32)(pow(2.0f, pstr_drc_uni_sel_proc->compl_level_supported_total)); + + for (n = 0; n < drc_config->str_drc_config_ext.eq_instructions_count; n++) { + ia_eq_instructions_struct* str_eq_instructions = + &pstr_drc_config->str_drc_config_ext.str_eq_instructions[n]; + + eqChannelCountPrimary = pstr_drc_sel_proc_params_struct->base_channel_count; + eqChannelCountDependent = + pstr_drc_sel_proc_params_struct->base_channel_count; + + eqComplexityPrimary = 1 << str_eq_instructions->eq_set_complexity_level; + if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) { + if (str_eq_instructions->td_filter_cascade_present == 0) { + eqComplexityPrimary = 0; + } + } else { + if (str_eq_instructions->td_filter_cascade_present == 1) { + eqComplexityPrimary = (WORD32)2.5f; + } + } + if (str_eq_instructions->eq_apply_to_downmix == 1) { + if (str_eq_instructions->downmix_id[0] == ID_FOR_ANY_DOWNMIX) { + eqChannelCountPrimary = + pstr_drc_sel_proc_params_struct->target_ch_count_prelim; + } else { + for (k = 0; k < pstr_drc_config->dwnmix_instructions_count; k++) { + for (m = 0; m < str_eq_instructions->dwnmix_id_count; m++) { + if (pstr_drc_config->dwnmix_instructions[k].downmix_id == + str_eq_instructions->downmix_id[m]) { + if (eqChannelCountPrimary > + pstr_drc_config->dwnmix_instructions[k] + .target_channel_count) { + eqChannelCountPrimary = pstr_drc_config->dwnmix_instructions[k] + .target_channel_count; + } } + } } - else - { - if (str_eq_instructions->td_filter_cascade_present == 1) - { - eqComplexityPrimary =(WORD32) 2.5f; - } + } + } + complexityTotalEq = (FLOAT32)(eqChannelCountPrimary * eqComplexityPrimary); + + if (str_eq_instructions->depends_on_eq_set_present > 0) { + ia_eq_instructions_struct* eq_instructionsDependent; + err = impd_find_eq_instructions(drc_config, + str_eq_instructions->depends_on_eq_set, + &eq_instructionsDependent); + if (err) return (err); + eqComplexityDependent = + 1 << eq_instructionsDependent->eq_set_complexity_level; + if (pstr_drc_uni_sel_proc->subband_domain_mode == + SUBBAND_DOMAIN_MODE_OFF) { + if (str_eq_instructions->td_filter_cascade_present == 0) { + eqComplexityDependent = 0; } - if (str_eq_instructions->eq_apply_to_downmix == 1) - { - if (str_eq_instructions->downmix_id[0] == ID_FOR_ANY_DOWNMIX) - { - eqChannelCountPrimary = pstr_drc_sel_proc_params_struct->target_ch_count_prelim; - } - else - { - for (k=0; k<pstr_drc_config->dwnmix_instructions_count; k++) - { - for (m=0; m<str_eq_instructions->dwnmix_id_count; m++) - { - if (pstr_drc_config->dwnmix_instructions[k].downmix_id == str_eq_instructions->downmix_id[m]) - { - if (eqChannelCountPrimary > pstr_drc_config->dwnmix_instructions[k].target_channel_count) { - eqChannelCountPrimary = pstr_drc_config->dwnmix_instructions[k].target_channel_count; - } - } - } - } - } + } else { + if (str_eq_instructions->td_filter_cascade_present == 1) { + eqComplexityDependent = (WORD32)2.5f; } - complexityTotalEq = (FLOAT32)(eqChannelCountPrimary * eqComplexityPrimary); - - if (str_eq_instructions->depends_on_eq_set_present > 0) - { - ia_eq_instructions_struct* eq_instructionsDependent; - err = impd_find_eq_instructions(drc_config, str_eq_instructions->depends_on_eq_set, &eq_instructionsDependent); - if (err) return (err); - eqComplexityDependent = 1 << eq_instructionsDependent->eq_set_complexity_level; - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - if (str_eq_instructions->td_filter_cascade_present == 0) - { - eqComplexityDependent = 0; + } + if (eq_instructionsDependent->eq_apply_to_downmix == 1) { + if (eq_instructionsDependent->downmix_id[0] == ID_FOR_ANY_DOWNMIX) { + eqChannelCountDependent = + pstr_drc_sel_proc_params_struct->target_ch_count_prelim; + } else { + for (k = 0; k < pstr_drc_config->dwnmix_instructions_count; k++) { + for (m = 0; m < str_eq_instructions->dwnmix_id_count; m++) { + if (pstr_drc_config->dwnmix_instructions[k].downmix_id == + eq_instructionsDependent->downmix_id[m]) { + if (eqChannelCountDependent > + pstr_drc_config->dwnmix_instructions[k] + .target_channel_count) { + eqChannelCountDependent = + pstr_drc_config->dwnmix_instructions[k] + .target_channel_count; } + } } - else - { - if (str_eq_instructions->td_filter_cascade_present == 1) - { - eqComplexityDependent =(WORD32) 2.5f; - } - } - if (eq_instructionsDependent->eq_apply_to_downmix == 1) - { - if (eq_instructionsDependent->downmix_id[0] == ID_FOR_ANY_DOWNMIX) - { - eqChannelCountDependent = pstr_drc_sel_proc_params_struct->target_ch_count_prelim; - } - else - { - for (k=0; k<pstr_drc_config->dwnmix_instructions_count; k++) - { - for (m=0; m<str_eq_instructions->dwnmix_id_count; m++) - { - if (pstr_drc_config->dwnmix_instructions[k].downmix_id == eq_instructionsDependent->downmix_id[m]) - { - if (eqChannelCountDependent > pstr_drc_config->dwnmix_instructions[k].target_channel_count) { - eqChannelCountDependent = pstr_drc_config->dwnmix_instructions[k].target_channel_count; - } - } - } - } - } - } - complexityTotalEq += eqChannelCountDependent * eqComplexityDependent; + } } + } + complexityTotalEq += eqChannelCountDependent * eqComplexityDependent; + } - pstr_drc_uni_sel_proc->eq_set_id_valid_flag[str_eq_instructions->eq_set_id] = 0; - complexityTotalEq *= pstr_drc_config->sampling_rate / 48000.0f; + pstr_drc_uni_sel_proc + ->eq_set_id_valid_flag[str_eq_instructions->eq_set_id] = 0; + complexityTotalEq *= pstr_drc_config->sampling_rate / 48000.0f; - if (complexityTotalEq <= complexitySupportedTotal) - { - pstr_drc_uni_sel_proc->eq_set_id_valid_flag[str_eq_instructions->eq_set_id] = 1; - } + if (complexityTotalEq <= complexitySupportedTotal) { + pstr_drc_uni_sel_proc + ->eq_set_id_valid_flag[str_eq_instructions->eq_set_id] = 1; } - return 0; + } + return 0; } +WORD32 impd_manage_complexity(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config, + WORD32* repeat_selection) { + WORD32 i, j, p, err; + WORD32 channel_count; + WORD32 numBandsTooLarge = 0; + WORD32 drcRequiresEq; + FLOAT32 complexityEq; + FLOAT32 complexityDrcTotal = 0.0f; + FLOAT32 complexityEqTotal = 0.0f; + FLOAT32 freqNorm = pstr_drc_config->sampling_rate / 48000.0f; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; + ia_drc_instructions_struct* str_drc_instruction_str = + &pstr_drc_config->str_drc_instruction_str[0]; + ia_drc_sel_proc_output_struct* uni_drc_sel_proc_output = + &pstr_drc_uni_sel_proc->uni_drc_sel_proc_output; + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = + &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; + FLOAT32 complexitySupportedTotal = + (FLOAT32)(pow(2.0f, pstr_drc_uni_sel_proc->compl_level_supported_total)); + + impd_select_drc_coeff3(pstr_drc_config, &str_p_loc_drc_coefficients_uni_drc); + + for (p = 0; p < 4; p++) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] <= 0) + continue; + err = impd_find_drc_instructions_uni_drc( + pstr_drc_config, + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p], + &str_drc_instruction_str); + if (err) return (err); -WORD32 impd_manage_complexity (ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config, - WORD32* repeat_selection) -{ - WORD32 i, j, p, err; - WORD32 channel_count; - WORD32 numBandsTooLarge = 0; - WORD32 drcRequiresEq; - FLOAT32 complexityEq; - FLOAT32 complexityDrcTotal = 0.0f; - FLOAT32 complexityEqTotal = 0.0f; - FLOAT32 freqNorm = pstr_drc_config->sampling_rate / 48000.0f; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; - ia_drc_instructions_struct* str_drc_instruction_str = &pstr_drc_config->str_drc_instruction_str[0]; - ia_drc_sel_proc_output_struct* uni_drc_sel_proc_output = &pstr_drc_uni_sel_proc->uni_drc_sel_proc_output; - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; - FLOAT32 complexitySupportedTotal =(FLOAT32)( pow(2.0f, pstr_drc_uni_sel_proc->compl_level_supported_total)); - - impd_select_drc_coeff3(pstr_drc_config, &str_p_loc_drc_coefficients_uni_drc); - - for (p=0; p<4; p++) - { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] <= 0) continue; - err = impd_find_drc_instructions_uni_drc(pstr_drc_config, pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p], &str_drc_instruction_str); - if (err) return (err); - - if (str_drc_instruction_str->drc_apply_to_dwnmix == 1) - { - channel_count = uni_drc_sel_proc_output->target_channel_count; - } - else - { - channel_count = uni_drc_sel_proc_output->base_channel_count; - } - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - for (j=0; j<str_drc_instruction_str->num_drc_ch_groups; j++) - { - ia_gain_set_params_struct* gain_set_params = &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[str_drc_instruction_str->gain_set_index_for_channel_group[j]]); - if (gain_set_params->band_count > pstr_drc_sel_proc_params_struct->num_bands_supported) - { - if (p<2) - { - numBandsTooLarge = 1; - } - else - { - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] = 0; - } - } - else - { - if (gain_set_params->band_count > 4) - { - /* Add complexity for analysis and synthesis QMF bank here, if supported */ - } - } - } - } - complexityDrcTotal += channel_count * (1 << str_drc_instruction_str->drc_set_complexity_level); + if (str_drc_instruction_str->drc_apply_to_dwnmix == 1) { + channel_count = uni_drc_sel_proc_output->target_channel_count; + } else { + channel_count = uni_drc_sel_proc_output->base_channel_count; } - - if (uni_drc_sel_proc_output->active_downmix_id > 0) - { - FLOAT32 complexityPerCoeff; - ia_downmix_instructions_struct* dwnmix_instructions; - - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - complexityPerCoeff = 1.0f; - } - else - { - complexityPerCoeff = 2.0f; - } - impd_find_downmix(pstr_drc_config, uni_drc_sel_proc_output->active_downmix_id, &dwnmix_instructions); - 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++) - { - if (uni_drc_sel_proc_output->downmix_matrix[i][j] != 0.0f) - { - complexityDrcTotal += complexityPerCoeff; - } - } - } - } - else - { - /* add standard downmix here */ + if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) { + for (j = 0; j < str_drc_instruction_str->num_drc_ch_groups; j++) { + ia_gain_set_params_struct* gain_set_params = &( + str_p_loc_drc_coefficients_uni_drc->gain_set_params + [str_drc_instruction_str->gain_set_index_for_channel_group[j]]); + if (gain_set_params->band_count > + pstr_drc_sel_proc_params_struct->num_bands_supported) { + if (p < 2) { + numBandsTooLarge = 1; + } else { + pstr_drc_uni_sel_proc + ->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] = + 0; + } + } else { + if (gain_set_params->band_count > 4) { + /* Add complexity for analysis and synthesis QMF bank here, if + * supported */ + } } + } } - - for (p=0; p<2; p++) - { - if(pstr_drc_uni_sel_proc->eq_inst_index[p] >= 0) - { - ia_eq_instructions_struct* str_eq_instructions = &pstr_drc_config->str_drc_config_ext.str_eq_instructions[pstr_drc_uni_sel_proc->eq_inst_index[p]]; - if (p==0) - { - channel_count = uni_drc_sel_proc_output->base_channel_count; - } - else - { - channel_count = uni_drc_sel_proc_output->target_channel_count; - } - - complexityEq =(FLOAT32)(1 << str_eq_instructions->eq_set_complexity_level); - if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) - { - if (str_eq_instructions->td_filter_cascade_present == 0) - { - complexityEq = 0.0; - } - } - else - { - if (str_eq_instructions->td_filter_cascade_present == 1) - { - complexityEq = 2.5; - } - } - - complexityEqTotal += channel_count * complexityEq; - } + complexityDrcTotal += + channel_count * + (1 << str_drc_instruction_str->drc_set_complexity_level); + } + + if (uni_drc_sel_proc_output->active_downmix_id > 0) { + FLOAT32 complexityPerCoeff; + ia_downmix_instructions_struct* dwnmix_instructions; + + if (pstr_drc_uni_sel_proc->subband_domain_mode == SUBBAND_DOMAIN_MODE_OFF) { + complexityPerCoeff = 1.0f; + } else { + complexityPerCoeff = 2.0f; } - - complexityDrcTotal *= freqNorm; - complexityEqTotal *= freqNorm; - - if (numBandsTooLarge == 1) - { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0] > 0) - { - err = impd_find_drc_instructions_uni_drc(pstr_drc_config, pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0], &str_drc_instruction_str); - if (err) return (err); - - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 0; + impd_find_downmix(pstr_drc_config, + uni_drc_sel_proc_output->active_downmix_id, + &dwnmix_instructions); + 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++) { + if (uni_drc_sel_proc_output->downmix_matrix[i][j] != 0.0f) { + complexityDrcTotal += complexityPerCoeff; + } } - *repeat_selection = 1; + } + } else { + /* add standard downmix here */ } - else - { - if (complexityDrcTotal + complexityEqTotal <= complexitySupportedTotal) - { - *repeat_selection = 0; + } + + for (p = 0; p < 2; p++) { + if (pstr_drc_uni_sel_proc->eq_inst_index[p] >= 0) { + ia_eq_instructions_struct* str_eq_instructions = + &pstr_drc_config->str_drc_config_ext + .str_eq_instructions[pstr_drc_uni_sel_proc->eq_inst_index[p]]; + if (p == 0) { + channel_count = uni_drc_sel_proc_output->base_channel_count; + } else { + channel_count = uni_drc_sel_proc_output->target_channel_count; + } + + complexityEq = + (FLOAT32)(1 << str_eq_instructions->eq_set_complexity_level); + if (pstr_drc_uni_sel_proc->subband_domain_mode == + SUBBAND_DOMAIN_MODE_OFF) { + if (str_eq_instructions->td_filter_cascade_present == 0) { + complexityEq = 0.0; } - else - { - drcRequiresEq = 0; - for (p=0; p<2; p++) - { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] <= 0) continue; - err = impd_find_drc_instructions_uni_drc(pstr_drc_config, pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p], &str_drc_instruction_str); - if (err) return (err); - if (str_drc_instruction_str->requires_eq == 1) - { - drcRequiresEq = 1; - } - } - if ((drcRequiresEq == 0) && (complexityDrcTotal <= complexitySupportedTotal)) - { - for (p=0; p<2; p++) - { - pstr_drc_uni_sel_proc->eq_inst_index[p] = 0; - } - *repeat_selection = 0; - } - else - { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0] > 0) - { - err = impd_find_drc_instructions_uni_drc(pstr_drc_config, pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0], &str_drc_instruction_str); - if (err) return (err); - - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 0; - } - else - { - for (p=2; p<4; p++) - { - pstr_drc_uni_sel_proc->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] = 0; - } - } - *repeat_selection = 1; - } + } else { + if (str_eq_instructions->td_filter_cascade_present == 1) { + complexityEq = 2.5; } - } + } - if (*repeat_selection == 1) - { - memset (&pstr_drc_uni_sel_proc->uni_drc_sel_proc_output, 0, sizeof(ia_drc_sel_proc_output_struct)); + complexityEqTotal += channel_count * complexityEq; } - return (0); -} + } + complexityDrcTotal *= freqNorm; + complexityEqTotal *= freqNorm; + if (numBandsTooLarge == 1) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0] > 0) { + err = impd_find_drc_instructions_uni_drc( + pstr_drc_config, + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0], + &str_drc_instruction_str); + if (err) return (err); -WORD32 impd_find_loud_eq_instructions_idx_for_id(ia_drc_config* drc_config, - WORD32 loud_eq_set_id_requested, - WORD32* instructions_idx) -{ - WORD32 i; - if (loud_eq_set_id_requested > 0) - { - for (i=0; i<drc_config->str_drc_config_ext.loud_eq_instructions_count; i++) - { - if (drc_config->str_drc_config_ext.loud_eq_instructions[i].loud_eq_set_id == loud_eq_set_id_requested) break; + pstr_drc_uni_sel_proc + ->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 0; + } + *repeat_selection = 1; + } else { + if (complexityDrcTotal + complexityEqTotal <= complexitySupportedTotal) { + *repeat_selection = 0; + } else { + drcRequiresEq = 0; + for (p = 0; p < 2; p++) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] <= + 0) + continue; + err = impd_find_drc_instructions_uni_drc( + pstr_drc_config, + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p], + &str_drc_instruction_str); + if (err) return (err); + if (str_drc_instruction_str->requires_eq == 1) { + drcRequiresEq = 1; } - if (i == drc_config->str_drc_config_ext.loud_eq_instructions_count) - { - return (UNEXPECTED_ERROR); + } + if ((drcRequiresEq == 0) && + (complexityDrcTotal <= complexitySupportedTotal)) { + for (p = 0; p < 2; p++) { + pstr_drc_uni_sel_proc->eq_inst_index[p] = 0; } - *instructions_idx = i; - } - else - { - *instructions_idx = -1; + *repeat_selection = 0; + } else { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0] > + 0) { + err = impd_find_drc_instructions_uni_drc( + pstr_drc_config, + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[0], + &str_drc_instruction_str); + if (err) return (err); + + pstr_drc_uni_sel_proc + ->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = 0; + } else { + for (p = 2; p < 4; p++) { + pstr_drc_uni_sel_proc + ->drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id] = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.sel_drc_set_ids[p] = + 0; + } + } + *repeat_selection = 1; + } } - return (0); -} + } + if (*repeat_selection == 1) { + memset(&pstr_drc_uni_sel_proc->uni_drc_sel_proc_output, 0, + sizeof(ia_drc_sel_proc_output_struct)); + } + return (0); +} -WORD32 impd_find_eq_instructions(ia_drc_config* drc_config, - WORD32 eq_set_id_requested, - ia_eq_instructions_struct** str_eq_instructions) -{ - WORD32 i; - for (i=0; i<drc_config->str_drc_config_ext.eq_instructions_count; i++) - { - if (eq_set_id_requested == drc_config->str_drc_config_ext.str_eq_instructions[i].eq_set_id) break; +WORD32 impd_find_loud_eq_instructions_idx_for_id( + ia_drc_config* drc_config, WORD32 loud_eq_set_id_requested, + WORD32* instructions_idx) { + WORD32 i; + if (loud_eq_set_id_requested > 0) { + for (i = 0; i < drc_config->str_drc_config_ext.loud_eq_instructions_count; + i++) { + if (drc_config->str_drc_config_ext.loud_eq_instructions[i] + .loud_eq_set_id == loud_eq_set_id_requested) + break; } - if (i == drc_config->str_drc_config_ext.eq_instructions_count) - { - return (UNEXPECTED_ERROR); + if (i == drc_config->str_drc_config_ext.loud_eq_instructions_count) { + return (UNEXPECTED_ERROR); } - *str_eq_instructions = &drc_config->str_drc_config_ext.str_eq_instructions[i]; - return (0); + *instructions_idx = i; + } else { + *instructions_idx = -1; + } + return (0); } -WORD32 impd_find_downmix(ia_drc_config* drc_config, - WORD32 requested_dwnmix_id, - ia_downmix_instructions_struct** dwnmix_instructions) -{ - WORD32 i; - for (i=0; i<drc_config->dwnmix_instructions_count; i++) - { - if (requested_dwnmix_id == drc_config->dwnmix_instructions[i].downmix_id) break; - } - if (i == drc_config->dwnmix_instructions_count) - { +WORD32 impd_find_eq_instructions( + ia_drc_config* drc_config, WORD32 eq_set_id_requested, + ia_eq_instructions_struct** str_eq_instructions) { + WORD32 i; + for (i = 0; i < drc_config->str_drc_config_ext.eq_instructions_count; i++) { + if (eq_set_id_requested == + drc_config->str_drc_config_ext.str_eq_instructions[i].eq_set_id) + break; + } + if (i == drc_config->str_drc_config_ext.eq_instructions_count) { + return (UNEXPECTED_ERROR); + } + *str_eq_instructions = &drc_config->str_drc_config_ext.str_eq_instructions[i]; + return (0); +} - return (UNEXPECTED_ERROR); - } - *dwnmix_instructions = &drc_config->dwnmix_instructions[i]; - return (0); +WORD32 impd_find_downmix(ia_drc_config* drc_config, WORD32 requested_dwnmix_id, + ia_downmix_instructions_struct** dwnmix_instructions) { + WORD32 i; + for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { + if (requested_dwnmix_id == drc_config->dwnmix_instructions[i].downmix_id) + break; + } + if (i == drc_config->dwnmix_instructions_count) { + return (UNEXPECTED_ERROR); + } + *dwnmix_instructions = &drc_config->dwnmix_instructions[i]; + return (0); } diff --git a/decoder/drc_src/impd_drc_selection_process.h b/decoder/drc_src/impd_drc_selection_process.h index 9061cec..4fdabe3 100644 --- a/decoder/drc_src/impd_drc_selection_process.h +++ b/decoder/drc_src/impd_drc_selection_process.h @@ -20,168 +20,153 @@ #ifndef IMPD_DRC_SECLECTION_PROCESS_H #define IMPD_DRC_SECLECTION_PROCESS_H - #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ -#define EFFECT_TYPE_REQUESTED_NONE 0 -#define EFFECT_TYPE_REQUESTED_NIGHT 1 -#define EFFECT_TYPE_REQUESTED_NOISY 2 -#define EFFECT_TYPE_REQUESTED_LIMITED 3 -#define EFFECT_TYPE_REQUESTED_LOWLEVEL 4 -#define EFFECT_TYPE_REQUESTED_DIALOG 5 -#define EFFECT_TYPE_REQUESTED_GENERAL_COMPR 6 -#define EFFECT_TYPE_REQUESTED_EXPAND 7 -#define EFFECT_TYPE_REQUESTED_ARTISTIC 8 -#define EFFECT_TYPE_REQUESTED_COUNT 9 - -#define MATCH_EFFECT_TYPE 0 -#define MATCH_DYNAMIC_RANGE 1 -#define MATCH_DRC_CHARACTERISTIC 2 - - -typedef struct ia_drc_sel_proc_params_struct -{ - WORD32 base_channel_count; - WORD32 base_layout; - WORD32 target_config_request_type; - WORD32 num_downmix_id_requests; - WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS]; - WORD32 requested_target_layout; - WORD32 requested_target_ch_count; - WORD32 target_ch_count_prelim; - - WORD32 loudness_normalization_on; - FLOAT32 target_loudness; - WORD32 album_mode; - WORD32 peak_limiter; - WORD32 loudness_deviation_max; - WORD32 loudness_measurement_method; - WORD32 loudness_measurement_system; - WORD32 loudness_measurement_pre_proc; - WORD32 device_cut_off_frequency; - FLOAT32 loudness_norm_gain_db_max; - FLOAT32 loudness_norm_gain_modification_db; - FLOAT32 output_peak_level_max; - - WORD32 num_bands_supported; - WORD32 dynamic_range_control_on; - WORD32 num_drc_feature_requests; - WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_num_drc_effects[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 desired_num_drc_effects_of_requested[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_drc_effect_type[MAX_NUM_DRC_FEATURE_REQUESTS][MAX_NUM_DRC_EFFECT_TYPE_REQUESTS]; - WORD32 requested_dyn_range_measur_type[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_dyn_range_range_flag[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_value[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_min_val[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_max_val[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_drc_characteristic[MAX_NUM_DRC_FEATURE_REQUESTS]; - - - WORD32 loudness_eq_request; - FLOAT32 sensitivity; - FLOAT32 playback_gain; - WORD32 eq_set_purpose_request; - - FLOAT32 boost; - FLOAT32 compress; - WORD32 drc_characteristic_target; +#define EFFECT_TYPE_REQUESTED_NONE 0 +#define EFFECT_TYPE_REQUESTED_NIGHT 1 +#define EFFECT_TYPE_REQUESTED_NOISY 2 +#define EFFECT_TYPE_REQUESTED_LIMITED 3 +#define EFFECT_TYPE_REQUESTED_LOWLEVEL 4 +#define EFFECT_TYPE_REQUESTED_DIALOG 5 +#define EFFECT_TYPE_REQUESTED_GENERAL_COMPR 6 +#define EFFECT_TYPE_REQUESTED_EXPAND 7 +#define EFFECT_TYPE_REQUESTED_ARTISTIC 8 +#define EFFECT_TYPE_REQUESTED_COUNT 9 + +#define MATCH_EFFECT_TYPE 0 +#define MATCH_DYNAMIC_RANGE 1 +#define MATCH_DRC_CHARACTERISTIC 2 + +typedef struct ia_drc_sel_proc_params_struct { + WORD32 base_channel_count; + WORD32 base_layout; + WORD32 target_config_request_type; + WORD32 num_downmix_id_requests; + WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS]; + WORD32 requested_target_layout; + WORD32 requested_target_ch_count; + WORD32 target_ch_count_prelim; + + WORD32 loudness_normalization_on; + FLOAT32 target_loudness; + WORD32 album_mode; + WORD32 peak_limiter; + WORD32 loudness_deviation_max; + WORD32 loudness_measurement_method; + WORD32 loudness_measurement_system; + WORD32 loudness_measurement_pre_proc; + WORD32 device_cut_off_frequency; + FLOAT32 loudness_norm_gain_db_max; + FLOAT32 loudness_norm_gain_modification_db; + FLOAT32 output_peak_level_max; + + WORD32 num_bands_supported; + WORD32 dynamic_range_control_on; + WORD32 num_drc_feature_requests; + WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_num_drc_effects[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 desired_num_drc_effects_of_requested[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_drc_effect_type[MAX_NUM_DRC_FEATURE_REQUESTS] + [MAX_NUM_DRC_EFFECT_TYPE_REQUESTS]; + WORD32 requested_dyn_range_measur_type[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_dyn_range_range_flag[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_value[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_min_val[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_max_val[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_drc_characteristic[MAX_NUM_DRC_FEATURE_REQUESTS]; + + WORD32 loudness_eq_request; + FLOAT32 sensitivity; + FLOAT32 playback_gain; + WORD32 eq_set_purpose_request; + + FLOAT32 boost; + FLOAT32 compress; + WORD32 drc_characteristic_target; } ia_drc_sel_proc_params_struct; -typedef struct ia_drc_sel_pro_struct -{ - - WORD32 first_frame; - WORD32 drc_config_flag; - WORD32 loudness_info_set_flag; - WORD32 sel_proc_request_flag; - WORD32 subband_domain_mode; - WORD32 eq_inst_index[SUB_EQ_COUNT]; - WORD32 drc_instructions_index[SUB_DRC_COUNT]; +typedef struct ia_drc_sel_pro_struct { + WORD32 first_frame; + WORD32 drc_config_flag; + WORD32 loudness_info_set_flag; + WORD32 sel_proc_request_flag; + WORD32 subband_domain_mode; + WORD32 eq_inst_index[SUB_EQ_COUNT]; + WORD32 drc_instructions_index[SUB_DRC_COUNT]; - ia_drc_sel_proc_params_struct uni_drc_sel_proc_params; + ia_drc_sel_proc_params_struct uni_drc_sel_proc_params; - ia_drc_config drc_config; - ia_drc_loudness_info_set_struct loudness_info_set; + ia_drc_config drc_config; + ia_drc_loudness_info_set_struct loudness_info_set; - WORD32 drc_inst_index_sel; - WORD32 drc_coef_index_sel; - WORD32 downmix_inst_index_sel; + WORD32 drc_inst_index_sel; + WORD32 drc_coef_index_sel; + WORD32 downmix_inst_index_sel; - WORD32 drc_set_id_valid_flag[DRC_INSTRUCTIONS_COUNT_MAX]; - WORD32 eq_set_id_valid_flag[EQ_INSTRUCTIONS_COUNT_MAX]; + WORD32 drc_set_id_valid_flag[DRC_INSTRUCTIONS_COUNT_MAX]; + WORD32 eq_set_id_valid_flag[EQ_INSTRUCTIONS_COUNT_MAX]; - WORD32 eq_inst_index_sel; - WORD32 loud_eq_inst_index_sel; + WORD32 eq_inst_index_sel; + WORD32 loud_eq_inst_index_sel; - FLOAT32 compl_level_supported_total; + FLOAT32 compl_level_supported_total; - ia_drc_sel_proc_output_struct uni_drc_sel_proc_output; + ia_drc_sel_proc_output_struct uni_drc_sel_proc_output; } ia_drc_sel_pro_struct; -WORD32 impd_map_target_config_req_downmix_id(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config); +WORD32 impd_map_target_config_req_downmix_id( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config); VOID impd_sel_downmix_matrix(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config); + ia_drc_config* pstr_drc_config); WORD32 -impd_find_drc_instructions_uni_drc(ia_drc_config* drc_config, - WORD32 drc_set_id_requested, - ia_drc_instructions_struct** str_drc_instruction_str); +impd_find_drc_instructions_uni_drc( + ia_drc_config* drc_config, WORD32 drc_set_id_requested, + ia_drc_instructions_struct** str_drc_instruction_str); WORD32 -impd_find_eq_instructions(ia_drc_config* drc_config, - WORD32 eq_set_id_requested, - ia_eq_instructions_struct** str_eq_instructions); +impd_find_eq_instructions(ia_drc_config* drc_config, WORD32 eq_set_id_requested, + ia_eq_instructions_struct** str_eq_instructions); WORD32 -impd_find_downmix(ia_drc_config* drc_config, - WORD32 requested_dwnmix_id, - ia_downmix_instructions_struct** dwnmix_instructions); - +impd_find_downmix(ia_drc_config* drc_config, WORD32 requested_dwnmix_id, + ia_downmix_instructions_struct** dwnmix_instructions); - WORD32 +WORD32 impd_find_eq_set_no_compression(ia_drc_config* pstr_drc_config, - WORD32 requested_dwnmix_id, - WORD32* no_compression_eq_cnt, - WORD32* no_compression_eq_id); - WORD32 -impd_match_eq_set(ia_drc_config* drc_config, - WORD32 downmix_id, - WORD32 drc_set_id, - WORD32* eq_set_id_valid_flag, - WORD32* matching_eq_set_cnt, - WORD32* matching_eq_set_idx); - - - - WORD32 -impd_select_loud_eq(ia_drc_config* pstr_drc_config, - WORD32 requested_dwnmix_id, - WORD32 drc_set_id_requested, - WORD32 eq_set_id_requested, - WORD32* loud_eq_id_selected); - + WORD32 requested_dwnmix_id, + WORD32* no_compression_eq_cnt, + WORD32* no_compression_eq_id); WORD32 -impd_drc_uni_selction_proc_init(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_sel_proc_params_struct * pstr_drc_sel_proc_params_struct, - ia_drc_interface_struct* pstr_drc_interface, - WORD32 sub_band_domain_mode); +impd_match_eq_set(ia_drc_config* drc_config, WORD32 downmix_id, + WORD32 drc_set_id, WORD32* eq_set_id_valid_flag, + WORD32* matching_eq_set_cnt, WORD32* matching_eq_set_idx); WORD32 -impd_drc_uni_sel_proc_process(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_sel_proc_output_struct* hia_drc_sel_proc_output_struct); +impd_select_loud_eq(ia_drc_config* pstr_drc_config, WORD32 requested_dwnmix_id, + WORD32 drc_set_id_requested, WORD32 eq_set_id_requested, + WORD32* loud_eq_id_selected); WORD32 -impd_find_loud_eq_instructions_idx_for_id(ia_drc_config* drc_config, - WORD32 loud_eq_set_id_requested, - WORD32* instructions_idx); +impd_drc_uni_selction_proc_init( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_interface_struct* pstr_drc_interface, WORD32 sub_band_domain_mode); +WORD32 +impd_drc_uni_sel_proc_process( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_sel_proc_output_struct* hia_drc_sel_proc_output_struct); +WORD32 +impd_find_loud_eq_instructions_idx_for_id(ia_drc_config* drc_config, + WORD32 loud_eq_set_id_requested, + WORD32* instructions_idx); #ifdef __cplusplus } 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 f09e7ea..7ca8aec 100644 --- a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c +++ b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c @@ -32,1506 +32,1506 @@ #include "impd_drc_rom.h" static 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 -}; - - -WORD32 impd_validate_requested_drc_feature(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct) -{ - WORD32 i,j; - - for (i=0; i<pstr_drc_sel_proc_params_struct->num_drc_feature_requests; i++) - { - switch (pstr_drc_sel_proc_params_struct->drc_feature_req_type[i]) { - case MATCH_EFFECT_TYPE: - for (j=0; j<pstr_drc_sel_proc_params_struct->desired_num_drc_effects_of_requested[i]; j++) - { - if (pstr_drc_sel_proc_params_struct->requested_drc_effect_type[i][j] == EFFECT_TYPE_REQUESTED_NONE) - { - if (pstr_drc_sel_proc_params_struct->desired_num_drc_effects_of_requested[i] > 1) - { - return (UNEXPECTED_ERROR); - } - } + 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}; + +WORD32 impd_validate_requested_drc_feature( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct) { + WORD32 i, j; + + for (i = 0; i < pstr_drc_sel_proc_params_struct->num_drc_feature_requests; + i++) { + switch (pstr_drc_sel_proc_params_struct->drc_feature_req_type[i]) { + case MATCH_EFFECT_TYPE: + for (j = 0; j < pstr_drc_sel_proc_params_struct + ->desired_num_drc_effects_of_requested[i]; + j++) { + if (pstr_drc_sel_proc_params_struct + ->requested_drc_effect_type[i][j] == + EFFECT_TYPE_REQUESTED_NONE) { + if (pstr_drc_sel_proc_params_struct + ->desired_num_drc_effects_of_requested[i] > 1) { + return (UNEXPECTED_ERROR); } - break; - case MATCH_DYNAMIC_RANGE: - break; - case MATCH_DRC_CHARACTERISTIC: - break; - default: - return (UNEXPECTED_ERROR); - break; + } } + break; + case MATCH_DYNAMIC_RANGE: + break; + case MATCH_DRC_CHARACTERISTIC: + break; + default: + return (UNEXPECTED_ERROR); + break; } - return (0); + } + return (0); } -WORD32 impd_find_drc_instructions_uni_drc(ia_drc_config* drc_config, - WORD32 drc_set_id_requested, - ia_drc_instructions_struct** str_drc_instruction_str) -{ - WORD32 i; - for (i=0; i<drc_config->drc_instructions_uni_drc_count; i++) - { - if (drc_set_id_requested == drc_config->str_drc_instruction_str[i].drc_set_id) break; - } - if (i == drc_config->drc_instructions_uni_drc_count) { - return (UNEXPECTED_ERROR); - } - *str_drc_instruction_str = &drc_config->str_drc_instruction_str[i]; - return (0); +WORD32 impd_find_drc_instructions_uni_drc( + ia_drc_config* drc_config, WORD32 drc_set_id_requested, + ia_drc_instructions_struct** str_drc_instruction_str) { + WORD32 i; + for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { + if (drc_set_id_requested == + drc_config->str_drc_instruction_str[i].drc_set_id) + break; + } + if (i == drc_config->drc_instructions_uni_drc_count) { + return (UNEXPECTED_ERROR); + } + *str_drc_instruction_str = &drc_config->str_drc_instruction_str[i]; + return (0); } -WORD32 impd_map_requested_effect_bit_idx( WORD32 requested_effect_type, - WORD32* effect_bit_idx) -{ - switch (requested_effect_type) { +WORD32 impd_map_requested_effect_bit_idx(WORD32 requested_effect_type, + WORD32* effect_bit_idx) { + switch (requested_effect_type) { case EFFECT_TYPE_REQUESTED_NONE: - *effect_bit_idx = EFFECT_BIT_NONE; - break; + *effect_bit_idx = EFFECT_BIT_NONE; + break; case EFFECT_TYPE_REQUESTED_NIGHT: - *effect_bit_idx = EFFECT_BIT_NIGHT; - break; + *effect_bit_idx = EFFECT_BIT_NIGHT; + break; case EFFECT_TYPE_REQUESTED_NOISY: - *effect_bit_idx = EFFECT_BIT_NOISY; - break; + *effect_bit_idx = EFFECT_BIT_NOISY; + break; case EFFECT_TYPE_REQUESTED_LIMITED: - *effect_bit_idx = EFFECT_BIT_LIMITED; - break; + *effect_bit_idx = EFFECT_BIT_LIMITED; + break; case EFFECT_TYPE_REQUESTED_LOWLEVEL: - *effect_bit_idx = EFFECT_BIT_LOWLEVEL; - break; + *effect_bit_idx = EFFECT_BIT_LOWLEVEL; + break; case EFFECT_TYPE_REQUESTED_DIALOG: - *effect_bit_idx = EFFECT_BIT_DIALOG; - break; + *effect_bit_idx = EFFECT_BIT_DIALOG; + break; case EFFECT_TYPE_REQUESTED_GENERAL_COMPR: - *effect_bit_idx = EFFECT_BIT_GENERAL_COMPR; - break; + *effect_bit_idx = EFFECT_BIT_GENERAL_COMPR; + break; case EFFECT_TYPE_REQUESTED_EXPAND: - *effect_bit_idx = EFFECT_BIT_EXPAND; - break; + *effect_bit_idx = EFFECT_BIT_EXPAND; + break; case EFFECT_TYPE_REQUESTED_ARTISTIC: - *effect_bit_idx = EFFECT_BIT_ARTISTIC; - break; + *effect_bit_idx = EFFECT_BIT_ARTISTIC; + break; default: - return (UNEXPECTED_ERROR); + return (UNEXPECTED_ERROR); - break; - } - return (0); + break; + } + return (0); } - -WORD32 impd_get_fading_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) -{ - pstr_drc_uni_sel_proc->drc_instructions_index[2] = -1; - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode == 0) - { - WORD32 n; - ia_drc_instructions_struct* str_drc_instruction_str = NULL; - for (n=0; n<pstr_drc_uni_sel_proc->drc_config.drc_instructions_uni_drc_count; n++) - { - str_drc_instruction_str = &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]); - - if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_FADE) - { - if (str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) - { - pstr_drc_uni_sel_proc->drc_instructions_index[2] = n; - - } - else - { - return (UNEXPECTED_ERROR); - } - } +WORD32 impd_get_fading_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { + pstr_drc_uni_sel_proc->drc_instructions_index[2] = -1; + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode == 0) { + WORD32 n; + ia_drc_instructions_struct* str_drc_instruction_str = NULL; + for (n = 0; + n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_uni_drc_count; + n++) { + str_drc_instruction_str = + &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]); + + if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_FADE) { + if (str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) { + pstr_drc_uni_sel_proc->drc_instructions_index[2] = n; + + } else { + return (UNEXPECTED_ERROR); } + } } - return (0); + } + return (0); } -WORD32 impd_get_ducking_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) -{ - WORD32 drc_instructions_index; - WORD32 n, k; - ia_drc_instructions_struct* str_drc_instruction_str; - - WORD32 requested_dwnmix_id = pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id; - - pstr_drc_uni_sel_proc->drc_instructions_index[3] = -1; - drc_instructions_index = -1; - str_drc_instruction_str = NULL; - - for (n=0; n<pstr_drc_uni_sel_proc->drc_config.drc_instructions_uni_drc_count; n++) - { - str_drc_instruction_str = &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]); - - if (str_drc_instruction_str->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) - { - for (k=0; k<str_drc_instruction_str->dwnmix_id_count; k++) { - if (str_drc_instruction_str->downmix_id[k] == requested_dwnmix_id) - { - - drc_instructions_index = n; - - } - } +WORD32 impd_get_ducking_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { + WORD32 drc_instructions_index; + WORD32 n, k; + ia_drc_instructions_struct* str_drc_instruction_str; + + WORD32 requested_dwnmix_id = + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id; + + pstr_drc_uni_sel_proc->drc_instructions_index[3] = -1; + drc_instructions_index = -1; + str_drc_instruction_str = NULL; + + for (n = 0; + n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_uni_drc_count; + n++) { + str_drc_instruction_str = + &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]); + + if (str_drc_instruction_str->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { + for (k = 0; k < str_drc_instruction_str->dwnmix_id_count; k++) { + if (str_drc_instruction_str->downmix_id[k] == requested_dwnmix_id) { + drc_instructions_index = n; } + } } - if (drc_instructions_index == -1) - { - for (n=0; n<pstr_drc_uni_sel_proc->drc_config.drc_instructions_uni_drc_count; n++) - { - str_drc_instruction_str = &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]); - - if (str_drc_instruction_str->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) - { - for (k=0; k<str_drc_instruction_str->dwnmix_id_count; k++) { - if (str_drc_instruction_str->downmix_id[k] == ID_FOR_BASE_LAYOUT) - { - drc_instructions_index = n; - } - } - } + } + if (drc_instructions_index == -1) { + for (n = 0; + n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_uni_drc_count; + n++) { + str_drc_instruction_str = + &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n]); + + if (str_drc_instruction_str->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { + for (k = 0; k < str_drc_instruction_str->dwnmix_id_count; k++) { + if (str_drc_instruction_str->downmix_id[k] == ID_FOR_BASE_LAYOUT) { + drc_instructions_index = n; + } } + } } - if (drc_instructions_index > -1) - { - pstr_drc_uni_sel_proc->drc_instructions_index[2] = -1; - pstr_drc_uni_sel_proc->drc_instructions_index[3] = drc_instructions_index; - } - return (0); + } + if (drc_instructions_index > -1) { + pstr_drc_uni_sel_proc->drc_instructions_index[2] = -1; + pstr_drc_uni_sel_proc->drc_instructions_index[3] = drc_instructions_index; + } + return (0); } WORD32 impd_get_selected_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 drc_set_id_selected) -{ - WORD32 n; - - ia_drc_instructions_struct* str_drc_instruction_str = NULL; - - for(n=0; n<pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus; n++) - { - if (pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n].drc_set_id == drc_set_id_selected) break; - } - if (n == pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus) - { - return(EXTERNAL_ERROR); - } - pstr_drc_uni_sel_proc->drc_inst_index_sel = n; - str_drc_instruction_str = &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[pstr_drc_uni_sel_proc->drc_inst_index_sel]); - - pstr_drc_uni_sel_proc->drc_instructions_index[0] = pstr_drc_uni_sel_proc->drc_inst_index_sel; - return (0); + WORD32 drc_set_id_selected) { + WORD32 n; + + ia_drc_instructions_struct* str_drc_instruction_str = NULL; + + for (n = 0; n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus; + n++) { + if (pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n] + .drc_set_id == drc_set_id_selected) + break; + } + if (n == pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus) { + return (EXTERNAL_ERROR); + } + pstr_drc_uni_sel_proc->drc_inst_index_sel = n; + str_drc_instruction_str = &( + pstr_drc_uni_sel_proc->drc_config + .str_drc_instruction_str[pstr_drc_uni_sel_proc->drc_inst_index_sel]); + + pstr_drc_uni_sel_proc->drc_instructions_index[0] = + pstr_drc_uni_sel_proc->drc_inst_index_sel; + return (0); } +WORD32 impd_get_dependent_drc_set( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { + ia_drc_instructions_struct* str_drc_instruction_str = NULL; + str_drc_instruction_str = &( + pstr_drc_uni_sel_proc->drc_config + .str_drc_instruction_str[pstr_drc_uni_sel_proc->drc_inst_index_sel]); -WORD32 impd_get_dependent_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) -{ - ia_drc_instructions_struct* str_drc_instruction_str = NULL; - str_drc_instruction_str = &(pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[pstr_drc_uni_sel_proc->drc_inst_index_sel]); - - if (str_drc_instruction_str->depends_on_drc_set_present == 1) - { - WORD32 n; - WORD32 drc_dependent_set_id = str_drc_instruction_str->depends_on_drc_set; + if (str_drc_instruction_str->depends_on_drc_set_present == 1) { + WORD32 n; + WORD32 drc_dependent_set_id = str_drc_instruction_str->depends_on_drc_set; - for (n=0; n<pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus; n++) - { - if (pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n].drc_set_id == drc_dependent_set_id) break; - } - if (n == pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus) - { - return(UNEXPECTED_ERROR); - } - pstr_drc_uni_sel_proc->drc_instructions_index[1] = n; + for (n = 0; + n < pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus; + n++) { + if (pstr_drc_uni_sel_proc->drc_config.str_drc_instruction_str[n] + .drc_set_id == drc_dependent_set_id) + break; } - else - { - pstr_drc_uni_sel_proc->drc_instructions_index[1] = -1; + if (n == pstr_drc_uni_sel_proc->drc_config.drc_instructions_count_plus) { + return (UNEXPECTED_ERROR); } - return (0); + pstr_drc_uni_sel_proc->drc_instructions_index[1] = n; + } else { + pstr_drc_uni_sel_proc->drc_instructions_index[1] = -1; + } + return (0); } -WORD32 impd_get_dependent_drc_instructions(const ia_drc_config* drc_config, - const ia_drc_instructions_struct* str_drc_instruction_str, - ia_drc_instructions_struct** drc_instructions_dependent) -{ - WORD32 j; - ia_drc_instructions_struct* dependent_drc = NULL; - for (j=0; j<drc_config->drc_instructions_uni_drc_count; j++) - { - dependent_drc = (ia_drc_instructions_struct*) &(drc_config->str_drc_instruction_str[j]); - if (dependent_drc->drc_set_id == str_drc_instruction_str->depends_on_drc_set) - { - break; - } +WORD32 impd_get_dependent_drc_instructions( + const ia_drc_config* drc_config, + const ia_drc_instructions_struct* str_drc_instruction_str, + ia_drc_instructions_struct** drc_instructions_dependent) { + WORD32 j; + ia_drc_instructions_struct* dependent_drc = NULL; + for (j = 0; j < drc_config->drc_instructions_uni_drc_count; j++) { + dependent_drc = + (ia_drc_instructions_struct*)&(drc_config->str_drc_instruction_str[j]); + if (dependent_drc->drc_set_id == + str_drc_instruction_str->depends_on_drc_set) { + break; } - if (j == drc_config->drc_instructions_uni_drc_count) - { - return (UNEXPECTED_ERROR); - } - if (dependent_drc->depends_on_drc_set_present == 1) - { - return (UNEXPECTED_ERROR); - } - *drc_instructions_dependent = dependent_drc; - return(0); + } + if (j == drc_config->drc_instructions_uni_drc_count) { + return (UNEXPECTED_ERROR); + } + if (dependent_drc->depends_on_drc_set_present == 1) { + return (UNEXPECTED_ERROR); + } + *drc_instructions_dependent = dependent_drc; + return (0); } -WORD32 impd_select_drcs_without_compr_effects (ia_drc_config* pstr_drc_config, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - WORD32 i, k, n; - WORD32 selection_candidate_step_2_count=0; - ia_selection_candidate_info_struct selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; - WORD32 effect_types_request_table_size; - WORD32 match; - ia_drc_instructions_struct* str_drc_instruction_str; - - effect_types_request_table_size = sizeof(effect_types_request_table) / sizeof(WORD32); - - k=0; - for (i=0; i < *selection_candidate_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i].drc_instructions_index]); - - match = 1; - for (n=0; n<effect_types_request_table_size; n++) - { - if ((str_drc_instruction_str->drc_set_effect & effect_types_request_table[n]) != 0x0) - { - match = 0; - } - } - if (match == 1) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } +WORD32 impd_select_drcs_without_compr_effects( + ia_drc_config* pstr_drc_config, WORD32* match_found_flag, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + WORD32 i, k, n; + WORD32 selection_candidate_step_2_count = 0; + ia_selection_candidate_info_struct + selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; + WORD32 effect_types_request_table_size; + WORD32 match; + ia_drc_instructions_struct* str_drc_instruction_str; + + effect_types_request_table_size = + sizeof(effect_types_request_table) / sizeof(WORD32); + + k = 0; + for (i = 0; i < *selection_candidate_count; i++) { + str_drc_instruction_str = &( + pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i] + .drc_instructions_index]); + + match = 1; + for (n = 0; n < effect_types_request_table_size; n++) { + if ((str_drc_instruction_str->drc_set_effect & + effect_types_request_table[n]) != 0x0) { + match = 0; + } } - selection_candidate_step_2_count = k; - - if (selection_candidate_step_2_count > 0) - { - *match_found_flag = 1; - for (i=0; i<selection_candidate_step_2_count; i++) - { - memcpy(&selection_candidate_info[i], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - *selection_candidate_count = selection_candidate_step_2_count; - } + if (match == 1) { + memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } - else - { - *match_found_flag = 0; + } + selection_candidate_step_2_count = k; + + if (selection_candidate_step_2_count > 0) { + *match_found_flag = 1; + for (i = 0; i < selection_candidate_step_2_count; i++) { + memcpy(&selection_candidate_info[i], &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + *selection_candidate_count = selection_candidate_step_2_count; } + } else { + *match_found_flag = 0; + } - return (0); + return (0); } -WORD32 impd_match_effect_type_attempt(ia_drc_config* pstr_drc_config, - WORD32 requested_effect_type, - WORD32 state_requested, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - WORD32 i, k, err; - WORD32 selection_candidate_step_2_count=0; - ia_selection_candidate_info_struct selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; - ia_drc_instructions_struct* str_drc_instruction_str; - ia_drc_instructions_struct* drc_instructions_dependent; - WORD32 effect_bit_idx; - - err = impd_map_requested_effect_bit_idx(requested_effect_type, &effect_bit_idx); +WORD32 impd_match_effect_type_attempt( + ia_drc_config* pstr_drc_config, WORD32 requested_effect_type, + WORD32 state_requested, WORD32* match_found_flag, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + WORD32 i, k, err; + WORD32 selection_candidate_step_2_count = 0; + ia_selection_candidate_info_struct + selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; + ia_drc_instructions_struct* str_drc_instruction_str; + ia_drc_instructions_struct* drc_instructions_dependent; + WORD32 effect_bit_idx; + + err = + impd_map_requested_effect_bit_idx(requested_effect_type, &effect_bit_idx); + if (err) return (err); + + if (effect_bit_idx == EFFECT_BIT_NONE) { + err = impd_select_drcs_without_compr_effects( + pstr_drc_config, match_found_flag, selection_candidate_count, + selection_candidate_info); if (err) return (err); - - if (effect_bit_idx == EFFECT_BIT_NONE) - { - err = impd_select_drcs_without_compr_effects (pstr_drc_config, match_found_flag, selection_candidate_count, selection_candidate_info); + } else { + k = 0; + for (i = 0; i < *selection_candidate_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info[i].drc_instructions_index]); + if (str_drc_instruction_str->depends_on_drc_set_present == 1) { + err = impd_get_dependent_drc_instructions(pstr_drc_config, + str_drc_instruction_str, + &drc_instructions_dependent); if (err) return (err); - } - else - { - k=0; - for (i=0; i < *selection_candidate_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i].drc_instructions_index]); - if (str_drc_instruction_str->depends_on_drc_set_present == 1) - { - err = impd_get_dependent_drc_instructions(pstr_drc_config, str_drc_instruction_str, &drc_instructions_dependent); - if (err) return (err); - - if (state_requested == 1) - { - if (((str_drc_instruction_str->drc_set_effect & effect_bit_idx) != 0x0) || - ((drc_instructions_dependent->drc_set_effect & effect_bit_idx) != 0x0)) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - else - { - if (((str_drc_instruction_str->drc_set_effect & effect_bit_idx) == 0x0) && - ((drc_instructions_dependent->drc_set_effect & effect_bit_idx) == 0x0)) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - } - else - { - if (state_requested == 1) - { - if ((str_drc_instruction_str->drc_set_effect & effect_bit_idx) != 0x0) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - else - { - if ((str_drc_instruction_str->drc_set_effect & effect_bit_idx) == 0x0) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - } - } - selection_candidate_step_2_count = k; - - if (selection_candidate_step_2_count > 0) - { - *match_found_flag = 1; - for (i=0; i<selection_candidate_step_2_count; i++) - { - *selection_candidate_count = selection_candidate_step_2_count; - memcpy(&selection_candidate_info[i], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - } + + if (state_requested == 1) { + if (((str_drc_instruction_str->drc_set_effect & effect_bit_idx) != + 0x0) || + ((drc_instructions_dependent->drc_set_effect & effect_bit_idx) != + 0x0)) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } + } else { + if (((str_drc_instruction_str->drc_set_effect & effect_bit_idx) == + 0x0) && + ((drc_instructions_dependent->drc_set_effect & effect_bit_idx) == + 0x0)) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } } - else - { - *match_found_flag = 0; + } else { + if (state_requested == 1) { + if ((str_drc_instruction_str->drc_set_effect & effect_bit_idx) != + 0x0) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } + } else { + if ((str_drc_instruction_str->drc_set_effect & effect_bit_idx) == + 0x0) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } } + } } - return(0); -} + selection_candidate_step_2_count = k; -WORD32 impd_match_effect_types(ia_drc_config* pstr_drc_config, - WORD32 effect_type_requested_total_count, - WORD32 effect_type_requested_desired_count, - WORD32* requested_effect_type, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - WORD32 k, err; - WORD32 match_found_flag = 0; - WORD32 state_requested; - WORD32 desired_effect_type_found, fallback_effect_type_found; - - desired_effect_type_found = 0; - fallback_effect_type_found = 0; - k = 0; - while (k<effect_type_requested_desired_count) - { - state_requested = 1; - err = impd_match_effect_type_attempt(pstr_drc_config, requested_effect_type[k], state_requested, &match_found_flag, selection_candidate_count, selection_candidate_info); - if (err) return (err); - if (match_found_flag) desired_effect_type_found = 1; - k++; + if (selection_candidate_step_2_count > 0) { + *match_found_flag = 1; + for (i = 0; i < selection_candidate_step_2_count; i++) { + *selection_candidate_count = selection_candidate_step_2_count; + memcpy(&selection_candidate_info[i], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + } + } else { + *match_found_flag = 0; } - if (desired_effect_type_found == 0) - { - while ((k<effect_type_requested_total_count) && (match_found_flag == 0)) - { - state_requested = 1; - err = impd_match_effect_type_attempt(pstr_drc_config, requested_effect_type[k], state_requested, &match_found_flag, selection_candidate_count, selection_candidate_info); - if (err) return (err); - if (match_found_flag) fallback_effect_type_found = 1; - k++; - } + } + return (0); +} + +WORD32 impd_match_effect_types( + ia_drc_config* pstr_drc_config, WORD32 effect_type_requested_total_count, + WORD32 effect_type_requested_desired_count, WORD32* requested_effect_type, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + WORD32 k, err; + WORD32 match_found_flag = 0; + WORD32 state_requested; + WORD32 desired_effect_type_found, fallback_effect_type_found; + + desired_effect_type_found = 0; + fallback_effect_type_found = 0; + k = 0; + while (k < effect_type_requested_desired_count) { + state_requested = 1; + err = impd_match_effect_type_attempt( + pstr_drc_config, requested_effect_type[k], state_requested, + &match_found_flag, selection_candidate_count, selection_candidate_info); + if (err) return (err); + if (match_found_flag) desired_effect_type_found = 1; + k++; + } + if (desired_effect_type_found == 0) { + while ((k < effect_type_requested_total_count) && (match_found_flag == 0)) { + state_requested = 1; + err = impd_match_effect_type_attempt( + pstr_drc_config, requested_effect_type[k], state_requested, + &match_found_flag, selection_candidate_count, + selection_candidate_info); + if (err) return (err); + if (match_found_flag) fallback_effect_type_found = 1; + k++; } + } - return(0); + return (0); } -WORD32 impd_match_dynamic_range(ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - WORD32 num_drc_requests, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - ia_drc_instructions_struct* str_drc_instruction_str; - WORD32 err, i, k; - WORD32 lp_avg_present_val; - FLOAT32 lp_avg_val; - FLOAT32 deviation_min = 1000.0f; - WORD32 selected[DRC_INSTRUCTIONS_COUNT_MAX]; - WORD32 dynamic_range_measurement_type = pstr_drc_sel_proc_params_struct-> - requested_dyn_range_measur_type[num_drc_requests]; - - WORD32 requested_dyn_range_range_flag = pstr_drc_sel_proc_params_struct-> - requested_dyn_range_range_flag[num_drc_requests]; - - FLOAT32 dynamic_range_requested = pstr_drc_sel_proc_params_struct-> - requested_dyn_range_value[num_drc_requests]; - - FLOAT32 dynamic_range_min_requested = pstr_drc_sel_proc_params_struct-> - requested_dyn_range_min_val[num_drc_requests]; - - FLOAT32 dynamic_range_max_requested = pstr_drc_sel_proc_params_struct-> - requested_dyn_range_max_val[num_drc_requests]; - - WORD32* requested_dwnmix_id = pstr_drc_sel_proc_params_struct->requested_dwnmix_id; - - WORD32 album_mode = pstr_drc_sel_proc_params_struct->album_mode; - - k=0; - for (i=0; i < *selection_candidate_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i].drc_instructions_index]); - - err = impd_loudness_peak_to_average_info( - pstr_loudness_info, - str_drc_instruction_str, - requested_dwnmix_id[selection_candidate_info[i].downmix_id_request_index], - dynamic_range_measurement_type, - album_mode, - &lp_avg_present_val, - &lp_avg_val); - if (err) return (err); +WORD32 impd_match_dynamic_range( + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + WORD32 num_drc_requests, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + ia_drc_instructions_struct* str_drc_instruction_str; + WORD32 err, i, k; + WORD32 lp_avg_present_val; + FLOAT32 lp_avg_val; + FLOAT32 deviation_min = 1000.0f; + WORD32 selected[DRC_INSTRUCTIONS_COUNT_MAX]; + WORD32 dynamic_range_measurement_type = + pstr_drc_sel_proc_params_struct + ->requested_dyn_range_measur_type[num_drc_requests]; + + WORD32 requested_dyn_range_range_flag = + pstr_drc_sel_proc_params_struct + ->requested_dyn_range_range_flag[num_drc_requests]; + + FLOAT32 dynamic_range_requested = + pstr_drc_sel_proc_params_struct + ->requested_dyn_range_value[num_drc_requests]; + + FLOAT32 dynamic_range_min_requested = + pstr_drc_sel_proc_params_struct + ->requested_dyn_range_min_val[num_drc_requests]; + + FLOAT32 dynamic_range_max_requested = + pstr_drc_sel_proc_params_struct + ->requested_dyn_range_max_val[num_drc_requests]; + + WORD32* requested_dwnmix_id = + pstr_drc_sel_proc_params_struct->requested_dwnmix_id; + + WORD32 album_mode = pstr_drc_sel_proc_params_struct->album_mode; + + k = 0; + for (i = 0; i < *selection_candidate_count; i++) { + str_drc_instruction_str = &( + pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i] + .drc_instructions_index]); + + err = impd_loudness_peak_to_average_info( + pstr_loudness_info, str_drc_instruction_str, + requested_dwnmix_id[selection_candidate_info[i] + .downmix_id_request_index], + dynamic_range_measurement_type, album_mode, &lp_avg_present_val, + &lp_avg_val); + if (err) return (err); - if (lp_avg_present_val == 1) - { - if (requested_dyn_range_range_flag == 1) - { - if ((lp_avg_val >= dynamic_range_min_requested) && (lp_avg_val <= dynamic_range_max_requested)) - { - selected[k] = i; - k++; - } - } - else - { - FLOAT32 deviation = (FLOAT32)fabs((FLOAT64)(dynamic_range_requested - lp_avg_val)); - if (deviation_min >= deviation) - { - if (deviation_min > deviation) - { - deviation_min = deviation; - k = 0; - } - selected[k] = i; - k++; - } - } + if (lp_avg_present_val == 1) { + if (requested_dyn_range_range_flag == 1) { + if ((lp_avg_val >= dynamic_range_min_requested) && + (lp_avg_val <= dynamic_range_max_requested)) { + selected[k] = i; + k++; } - } - if (k>0) - { - for (i=0; i<k; i++) - { - memcpy(&selection_candidate_info[i], &selection_candidate_info[selected[i]], sizeof(ia_selection_candidate_info_struct)); + } else { + FLOAT32 deviation = + (FLOAT32)fabs((FLOAT64)(dynamic_range_requested - lp_avg_val)); + if (deviation_min >= deviation) { + if (deviation_min > deviation) { + deviation_min = deviation; + k = 0; + } + selected[k] = i; + k++; } - *selection_candidate_count = k; + } } + } + if (k > 0) { + for (i = 0; i < k; i++) { + memcpy(&selection_candidate_info[i], + &selection_candidate_info[selected[i]], + sizeof(ia_selection_candidate_info_struct)); + } + *selection_candidate_count = k; + } - return(0); + return (0); } - -WORD32 impd_match_drc_characteristic_attempt(ia_drc_config* pstr_drc_config, - WORD32 requested_drc_characteristic, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - WORD32 i, k, n, b, m; - WORD32 ref_count; - WORD32 drc_characteristic; - FLOAT32 match_count; - WORD32 drc_characteristic_request_1; - WORD32 drc_characteristic_request_2; - WORD32 drc_characteristic_request_3; - - ia_drc_instructions_struct* str_drc_instruction_str = NULL; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; - ia_gain_set_params_struct* gain_set_params = NULL; - *match_found_flag = 0; - - if (requested_drc_characteristic < 1) - { - return(UNEXPECTED_ERROR); - } - if(requested_drc_characteristic < 12) - { - drc_characteristic_request_1 = drc_characteristic_order_default[requested_drc_characteristic-1][0]; - drc_characteristic_request_2 = drc_characteristic_order_default[requested_drc_characteristic-1][1]; - drc_characteristic_request_3 = drc_characteristic_order_default[requested_drc_characteristic-1][2]; - } - else - { - drc_characteristic_request_1 = requested_drc_characteristic; - drc_characteristic_request_2 = -1; - drc_characteristic_request_3 = -1; +WORD32 impd_match_drc_characteristic_attempt( + ia_drc_config* pstr_drc_config, WORD32 requested_drc_characteristic, + WORD32* match_found_flag, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + WORD32 i, k, n, b, m; + WORD32 ref_count; + WORD32 drc_characteristic; + FLOAT32 match_count; + WORD32 drc_characteristic_request_1; + WORD32 drc_characteristic_request_2; + WORD32 drc_characteristic_request_3; + + ia_drc_instructions_struct* str_drc_instruction_str = NULL; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; + ia_gain_set_params_struct* gain_set_params = NULL; + *match_found_flag = 0; + + if (requested_drc_characteristic < 1) { + return (UNEXPECTED_ERROR); + } + if (requested_drc_characteristic < 12) { + drc_characteristic_request_1 = + drc_characteristic_order_default[requested_drc_characteristic - 1][0]; + drc_characteristic_request_2 = + drc_characteristic_order_default[requested_drc_characteristic - 1][1]; + drc_characteristic_request_3 = + drc_characteristic_order_default[requested_drc_characteristic - 1][2]; + } else { + drc_characteristic_request_1 = requested_drc_characteristic; + drc_characteristic_request_2 = -1; + drc_characteristic_request_3 = -1; + } + + if (pstr_drc_config->drc_coefficients_drc_count) { + for (i = 0; i < pstr_drc_config->drc_coefficients_drc_count; i++) { + str_p_loc_drc_coefficients_uni_drc = + &(pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[i]); + if (str_p_loc_drc_coefficients_uni_drc->drc_location == LOCATION_SELECTED) + break; } - if (pstr_drc_config->drc_coefficients_drc_count) { - for (i=0; i<pstr_drc_config->drc_coefficients_drc_count; i++) - { - str_p_loc_drc_coefficients_uni_drc = &(pstr_drc_config->str_p_loc_drc_coefficients_uni_drc[i]); - if (str_p_loc_drc_coefficients_uni_drc->drc_location == LOCATION_SELECTED) break; - } - - if (i == pstr_drc_config->drc_coefficients_drc_count) - { - return (UNEXPECTED_ERROR); - } + if (i == pstr_drc_config->drc_coefficients_drc_count) { + return (UNEXPECTED_ERROR); } - - n = 0; - for (i=0; i < *selection_candidate_count; i++) - { - ref_count = 0; - match_count = 0; - - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i].drc_instructions_index]); - for (k=0; k<str_drc_instruction_str->num_drc_ch_groups; k++) - { - gain_set_params = &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[str_drc_instruction_str->gain_set_index_for_channel_group[k]]); - for (b=0; b<gain_set_params->band_count; b++) - { - ref_count++; - drc_characteristic = gain_set_params->gain_params[b].drc_characteristic; - if ( drc_characteristic == drc_characteristic_request_1) match_count += 1.0f; - else if ( drc_characteristic == drc_characteristic_request_2) match_count += 0.75f; - else if ( drc_characteristic == drc_characteristic_request_3) match_count += 0.5f; - } - } - if (str_drc_instruction_str->depends_on_drc_set_present == 1) - { - WORD32 depends_on_drc_set = str_drc_instruction_str->depends_on_drc_set; - for (m=0; m<pstr_drc_config->drc_instructions_uni_drc_count; m++) - { - if (pstr_drc_config->str_drc_instruction_str[m].drc_set_id == depends_on_drc_set) break; - } - if (m == pstr_drc_config->drc_instructions_uni_drc_count) - { - return (UNEXPECTED_ERROR); - } - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[m]); - if ((str_drc_instruction_str->drc_set_effect & (EFFECT_BIT_FADE | EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) - { - if (str_drc_instruction_str->drc_set_effect != EFFECT_BIT_CLIPPING) { - for (k=0; k<str_drc_instruction_str->num_drc_ch_groups; k++) - { - gain_set_params = &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[str_drc_instruction_str->gain_set_index_for_channel_group[k]]); - for (b=0; b<gain_set_params->band_count; b++) - { - ref_count++; - drc_characteristic = gain_set_params->gain_params[b].drc_characteristic; - if ( drc_characteristic == drc_characteristic_request_1) match_count += 1.0f; - else if ( drc_characteristic == drc_characteristic_request_2) match_count += 0.75f; - else if ( drc_characteristic == drc_characteristic_request_3) match_count += 0.5; - } - } - } + } + + n = 0; + for (i = 0; i < *selection_candidate_count; i++) { + ref_count = 0; + match_count = 0; + + str_drc_instruction_str = &( + pstr_drc_config->str_drc_instruction_str[selection_candidate_info[i] + .drc_instructions_index]); + for (k = 0; k < str_drc_instruction_str->num_drc_ch_groups; k++) { + gain_set_params = + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params + [str_drc_instruction_str->gain_set_index_for_channel_group[k]]); + for (b = 0; b < gain_set_params->band_count; b++) { + ref_count++; + drc_characteristic = gain_set_params->gain_params[b].drc_characteristic; + if (drc_characteristic == drc_characteristic_request_1) + match_count += 1.0f; + else if (drc_characteristic == drc_characteristic_request_2) + match_count += 0.75f; + else if (drc_characteristic == drc_characteristic_request_3) + match_count += 0.5f; + } + } + if (str_drc_instruction_str->depends_on_drc_set_present == 1) { + WORD32 depends_on_drc_set = str_drc_instruction_str->depends_on_drc_set; + for (m = 0; m < pstr_drc_config->drc_instructions_uni_drc_count; m++) { + if (pstr_drc_config->str_drc_instruction_str[m].drc_set_id == + depends_on_drc_set) + break; + } + if (m == pstr_drc_config->drc_instructions_uni_drc_count) { + return (UNEXPECTED_ERROR); + } + str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[m]); + if ((str_drc_instruction_str->drc_set_effect & + (EFFECT_BIT_FADE | EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == + 0) { + if (str_drc_instruction_str->drc_set_effect != EFFECT_BIT_CLIPPING) { + for (k = 0; k < str_drc_instruction_str->num_drc_ch_groups; k++) { + gain_set_params = + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params + [str_drc_instruction_str + ->gain_set_index_for_channel_group[k]]); + for (b = 0; b < gain_set_params->band_count; b++) { + ref_count++; + drc_characteristic = + gain_set_params->gain_params[b].drc_characteristic; + if (drc_characteristic == drc_characteristic_request_1) + match_count += 1.0f; + else if (drc_characteristic == drc_characteristic_request_2) + match_count += 0.75f; + else if (drc_characteristic == drc_characteristic_request_3) + match_count += 0.5; } + } } - if ((ref_count > 0) && (((FLOAT32)match_count) > 0.5f * ref_count)) - { - memcpy(&selection_candidate_info[n], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - n++; - } + } } - if (n > 0) - { - *selection_candidate_count = n; - *match_found_flag = 1; + if ((ref_count > 0) && (((FLOAT32)match_count) > 0.5f * ref_count)) { + memcpy(&selection_candidate_info[n], &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + n++; } + } + if (n > 0) { + *selection_candidate_count = n; + *match_found_flag = 1; + } - return(0); + return (0); } - - -WORD32 impd_match_drc_characteristic(ia_drc_config* pstr_drc_config, - WORD32 requested_drc_characteristic, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - WORD32 k, err; - WORD32 match_found_flag = 0; - - WORD32* drc_characteristic_order = drc_characteristic_order_default[requested_drc_characteristic-1]; - WORD32 drc_characteristic_order_count = sizeof(drc_characteristic_order_default[requested_drc_characteristic]) / sizeof(WORD32); - k = 0; - while ((k<drc_characteristic_order_count) && (match_found_flag == 0) && (drc_characteristic_order[k] > 0)) - { - err = impd_match_drc_characteristic_attempt(pstr_drc_config, - drc_characteristic_order[k], - &match_found_flag, - selection_candidate_count, - selection_candidate_info); - if (err) return (err); - k++; - } - return (0); +WORD32 impd_match_drc_characteristic( + ia_drc_config* pstr_drc_config, WORD32 requested_drc_characteristic, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + WORD32 k, err; + WORD32 match_found_flag = 0; + + WORD32* drc_characteristic_order = + drc_characteristic_order_default[requested_drc_characteristic - 1]; + WORD32 drc_characteristic_order_count = + sizeof(drc_characteristic_order_default[requested_drc_characteristic]) / + sizeof(WORD32); + k = 0; + while ((k < drc_characteristic_order_count) && (match_found_flag == 0) && + (drc_characteristic_order[k] > 0)) { + err = impd_match_drc_characteristic_attempt( + pstr_drc_config, drc_characteristic_order[k], &match_found_flag, + selection_candidate_count, selection_candidate_info); + if (err) return (err); + k++; + } + return (0); } +WORD32 impd_drc_set_preselection( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 restrict_to_drc_with_album_loudness, + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info) { + WORD32 i, j, k, l, d, n, err; + WORD32 downmix_id_match = 0; + + WORD32 selection_candidate_step_2_count; + ia_selection_candidate_info_struct + selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; + + WORD32 num_downmix_id_requests = + pstr_drc_sel_proc_params_struct->num_downmix_id_requests; + WORD32* requested_dwnmix_id = + pstr_drc_sel_proc_params_struct->requested_dwnmix_id; + FLOAT32 output_peak_level_max = + pstr_drc_sel_proc_params_struct->output_peak_level_max; + WORD32 loudness_deviation_max = + pstr_drc_sel_proc_params_struct->loudness_deviation_max; + WORD32* drc_set_id_valid_flag = pstr_drc_uni_sel_proc->drc_set_id_valid_flag; + WORD32* eq_set_id_valid_flag = pstr_drc_uni_sel_proc->eq_set_id_valid_flag; + + FLOAT32 output_peak_level_min = 1000.0f; + FLOAT32 adjustment; + WORD32 loudness_drc_set_id_requested; + + WORD32 num_compression_eq_count = 0; + WORD32 num_compression_eq_id[16]; + + WORD32 loudness_info_count = 0; + WORD32 eq_set_id_loudness[16]; + FLOAT32 loudness_normalization_gain_db[16]; + FLOAT32 loudness[16]; + WORD32 peak_info_count; + WORD32 eq_set_id_Peak[16]; + FLOAT32 signal_peak_level[16]; + WORD32 explicit_peak_information_present[16]; + + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; + ia_drc_instructions_struct* str_drc_instruction_str = NULL; + + impd_select_drc_coeff3(pstr_drc_config, &str_p_loc_drc_coefficients_uni_drc); + + k = 0; + for (d = 0; d < num_downmix_id_requests; d++) { + err = impd_find_eq_set_no_compression( + pstr_drc_config, requested_dwnmix_id[d], &num_compression_eq_count, + num_compression_eq_id); + if (err) return (err); + for (i = 0; i < pstr_drc_config->drc_instructions_count_plus; i++) { + downmix_id_match = 0; + str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[i]); + + for (j = 0; j < str_drc_instruction_str->dwnmix_id_count; j++) { + if ((str_drc_instruction_str->downmix_id[j] == + requested_dwnmix_id[d]) || + ((str_drc_instruction_str->downmix_id[j] == ID_FOR_BASE_LAYOUT) && + (str_drc_instruction_str->drc_set_id > 0)) || + (str_drc_instruction_str->downmix_id[j] == ID_FOR_ANY_DOWNMIX)) { + downmix_id_match = 1; + } + } + if (downmix_id_match == 1) { + if (pstr_drc_sel_proc_params_struct->dynamic_range_control_on == 1) { + if ((str_drc_instruction_str->drc_set_effect != EFFECT_BIT_FADE) && + (str_drc_instruction_str->drc_set_effect != + EFFECT_BIT_DUCK_OTHER) && + (str_drc_instruction_str->drc_set_effect != + EFFECT_BIT_DUCK_SELF) && + (str_drc_instruction_str->drc_set_effect != 0 || + str_drc_instruction_str->drc_set_id < 0) && + (((str_drc_instruction_str->depends_on_drc_set_present == 0) && + (str_drc_instruction_str->no_independent_use == 0)) || + (str_drc_instruction_str->depends_on_drc_set_present == 1))) { + WORD32 drc_is_permitted = 1; + if (str_drc_instruction_str->drc_set_id > 0) { + drc_is_permitted = + drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id]; + } + if (drc_is_permitted == 1) { + err = impd_init_loudness_control( + pstr_drc_sel_proc_params_struct, pstr_loudness_info, + requested_dwnmix_id[d], str_drc_instruction_str->drc_set_id, + + num_compression_eq_count, num_compression_eq_id, + &loudness_info_count, eq_set_id_loudness, + loudness_normalization_gain_db, loudness); + if (err) return (err); + + err = 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; + selection_candidate_info[k].loudness_norm_db_gain_adjusted = + loudness_normalization_gain_db[l]; + + selection_candidate_info[k] + .loudness_norm_db_gain_adjusted = min( + selection_candidate_info[k].loudness_norm_db_gain_adjusted, + pstr_drc_sel_proc_params_struct->loudness_norm_gain_db_max); + + if (loudness[l] != UNDEFINED_LOUDNESS_VALUE) { + selection_candidate_info[k].output_loudness = + loudness[l] + + selection_candidate_info[k] + .loudness_norm_db_gain_adjusted; + } else { + selection_candidate_info[k].output_loudness = + UNDEFINED_LOUDNESS_VALUE; + } -WORD32 impd_drc_set_preselection(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 restrict_to_drc_with_album_loudness, - ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info) -{ - WORD32 i, j, k, l, d, n, err; - WORD32 downmix_id_match = 0; - - - WORD32 selection_candidate_step_2_count; - ia_selection_candidate_info_struct selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; - - WORD32 num_downmix_id_requests = pstr_drc_sel_proc_params_struct->num_downmix_id_requests; - WORD32* requested_dwnmix_id = pstr_drc_sel_proc_params_struct->requested_dwnmix_id; - FLOAT32 output_peak_level_max = pstr_drc_sel_proc_params_struct->output_peak_level_max; - WORD32 loudness_deviation_max = pstr_drc_sel_proc_params_struct->loudness_deviation_max; - WORD32* drc_set_id_valid_flag = pstr_drc_uni_sel_proc->drc_set_id_valid_flag; - WORD32* eq_set_id_valid_flag = pstr_drc_uni_sel_proc->eq_set_id_valid_flag; - - FLOAT32 output_peak_level_min = 1000.0f; - FLOAT32 adjustment; - WORD32 loudness_drc_set_id_requested; - - WORD32 num_compression_eq_count = 0; - WORD32 num_compression_eq_id[16]; - - WORD32 loudness_info_count = 0; - WORD32 eq_set_id_loudness[16]; - FLOAT32 loudness_normalization_gain_db[16]; - FLOAT32 loudness[16]; - WORD32 peak_info_count; - WORD32 eq_set_id_Peak[16]; - FLOAT32 signal_peak_level[16]; - WORD32 explicit_peak_information_present[16]; - - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; - ia_drc_instructions_struct* str_drc_instruction_str = NULL; - - impd_select_drc_coeff3(pstr_drc_config, &str_p_loc_drc_coefficients_uni_drc); + 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) - k=0; - for (d=0; d<num_downmix_id_requests; d++) - { - err = impd_find_eq_set_no_compression(pstr_drc_config, - requested_dwnmix_id[d], - &num_compression_eq_count, - num_compression_eq_id); - if (err) return (err); - for (i=0; i<pstr_drc_config->drc_instructions_count_plus; i++) - { - downmix_id_match = 0; - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[i]); - - for (j=0; j<str_drc_instruction_str->dwnmix_id_count; j++) - { - if ((str_drc_instruction_str->downmix_id[j] == requested_dwnmix_id[d]) || - ((str_drc_instruction_str->downmix_id[j] == ID_FOR_BASE_LAYOUT) && (str_drc_instruction_str->drc_set_id > 0)) || - (str_drc_instruction_str->downmix_id[j] == ID_FOR_ANY_DOWNMIX)) - { - downmix_id_match = 1; - } - } - if (downmix_id_match == 1) - { - if (pstr_drc_sel_proc_params_struct->dynamic_range_control_on == 1) - { - if ((str_drc_instruction_str->drc_set_effect != EFFECT_BIT_FADE) && - (str_drc_instruction_str->drc_set_effect != EFFECT_BIT_DUCK_OTHER) && - (str_drc_instruction_str->drc_set_effect != EFFECT_BIT_DUCK_SELF) && - (str_drc_instruction_str->drc_set_effect != 0 || str_drc_instruction_str->drc_set_id < 0) && - (((str_drc_instruction_str->depends_on_drc_set_present == 0) && (str_drc_instruction_str->no_independent_use == 0)) || - (str_drc_instruction_str->depends_on_drc_set_present == 1)) ) { - WORD32 drc_is_permitted = 1; - if (str_drc_instruction_str->drc_set_id > 0) - { - drc_is_permitted = drc_set_id_valid_flag[str_drc_instruction_str->drc_set_id]; - } - if (drc_is_permitted == 1) - { - - err = impd_init_loudness_control (pstr_drc_sel_proc_params_struct, - pstr_loudness_info, - requested_dwnmix_id[d], - str_drc_instruction_str->drc_set_id, - - num_compression_eq_count, - num_compression_eq_id, - &loudness_info_count, - eq_set_id_loudness, - loudness_normalization_gain_db, - loudness); - if (err) return (err); - - err = 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; - selection_candidate_info[k].loudness_norm_db_gain_adjusted = loudness_normalization_gain_db[l]; - - selection_candidate_info[k].loudness_norm_db_gain_adjusted = min(selection_candidate_info[k].loudness_norm_db_gain_adjusted, pstr_drc_sel_proc_params_struct->loudness_norm_gain_db_max); - - if (loudness[l] != UNDEFINED_LOUDNESS_VALUE) - { - selection_candidate_info[k].output_loudness = loudness[l] + selection_candidate_info[k].loudness_norm_db_gain_adjusted; - } - else - { - selection_candidate_info[k].output_loudness = UNDEFINED_LOUDNESS_VALUE; - } - - 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) - - - { - match_found_flag = 1; - break; - } - } - } - if (match_found_flag == 1) - { - selection_candidate_info[k].output_peak_level = signal_peak_level[p] + selection_candidate_info[k].loudness_norm_db_gain_adjusted; - } - else - { - selection_candidate_info[k].output_peak_level = selection_candidate_info[k].loudness_norm_db_gain_adjusted; - } - if ((str_drc_instruction_str->requires_eq == 1) && (eq_set_id_valid_flag[eq_set_id_loudness[l]] == 0)) continue; - selection_candidate_info[k].drc_instructions_index = i; - selection_candidate_info[k].downmix_id_request_index = d; - selection_candidate_info[k].eq_set_id = eq_set_id_loudness[l]; - if (explicit_peak_information_present[p] == 1) - { - selection_candidate_info[k].selection_flags = SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT; - } - else - { - selection_candidate_info[k].selection_flags = 0; - } - impd_mixing_level_info(pstr_drc_sel_proc_params_struct, - pstr_loudness_info, - requested_dwnmix_id[d], - str_drc_instruction_str->drc_set_id, - eq_set_id_loudness[l], - &selection_candidate_info[k].mixing_level); - if (str_drc_instruction_str->drc_set_target_loudness_present && - ((pstr_drc_sel_proc_params_struct->loudness_normalization_on && - str_drc_instruction_str->drc_set_target_loudness_value_upper >= pstr_drc_sel_proc_params_struct->target_loudness && - str_drc_instruction_str->drc_set_target_loudness_value_lower < pstr_drc_sel_proc_params_struct->target_loudness) || - !pstr_drc_sel_proc_params_struct->loudness_normalization_on)) { - selection_candidate_info[k].selection_flags |= SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH; - if (!explicit_peak_information_present[p]) - { - if (pstr_drc_sel_proc_params_struct->loudness_normalization_on) { - selection_candidate_info[k].output_peak_level = pstr_drc_sel_proc_params_struct->target_loudness - str_drc_instruction_str->drc_set_target_loudness_value_upper; - } - else { - selection_candidate_info[k].output_peak_level = 0.0f; - } - } - } - if ((selection_candidate_info[k].selection_flags & (SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH | SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT) || !str_drc_instruction_str->drc_set_target_loudness_present)) - { - k++; - } else { - } - } - } + match_found_flag = 1; + break; } + } } - else - { - if (str_drc_instruction_str->drc_set_id < 0) - { - - - - err = impd_init_loudness_control (pstr_drc_sel_proc_params_struct, - pstr_loudness_info, - requested_dwnmix_id[d], - str_drc_instruction_str->drc_set_id, - num_compression_eq_count, - num_compression_eq_id, - &loudness_info_count, - eq_set_id_loudness, - loudness_normalization_gain_db, - loudness); - if (err) return (err); - - err = 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; - 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) - { - match_found_flag = 1; - break; - } - } - } - if (match_found_flag == 1) - { - adjustment = max(0.0f, 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)); - selection_candidate_info[k].loudness_norm_db_gain_adjusted = loudness_normalization_gain_db[l] - adjustment; - - selection_candidate_info[k].loudness_norm_db_gain_adjusted = min(selection_candidate_info[k].loudness_norm_db_gain_adjusted, pstr_drc_sel_proc_params_struct->loudness_norm_gain_db_max); - - selection_candidate_info[k].output_peak_level = signal_peak_level[p] + selection_candidate_info[k].loudness_norm_db_gain_adjusted; - if (loudness[l] != UNDEFINED_LOUDNESS_VALUE) - { - selection_candidate_info[k].output_loudness = loudness[l] + selection_candidate_info[k].loudness_norm_db_gain_adjusted; - } - else - { - selection_candidate_info[k].output_loudness = UNDEFINED_LOUDNESS_VALUE; - } - selection_candidate_info[k].drc_instructions_index = i; - selection_candidate_info[k].downmix_id_request_index = d; - selection_candidate_info[k].eq_set_id = eq_set_id_loudness[l]; - if (explicit_peak_information_present[p]==1) - { - selection_candidate_info[k].selection_flags = SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT; - } - else - { - selection_candidate_info[k].selection_flags = 0; - } - impd_mixing_level_info(pstr_drc_sel_proc_params_struct, - pstr_loudness_info, - requested_dwnmix_id[d], - str_drc_instruction_str->drc_set_id, - eq_set_id_loudness[l], - &selection_candidate_info[k].mixing_level); - k++; - } - } + if (match_found_flag == 1) { + selection_candidate_info[k].output_peak_level = + signal_peak_level[p] + + selection_candidate_info[k] + .loudness_norm_db_gain_adjusted; + } else { + selection_candidate_info[k].output_peak_level = + selection_candidate_info[k] + .loudness_norm_db_gain_adjusted; + } + if ((str_drc_instruction_str->requires_eq == 1) && + (eq_set_id_valid_flag[eq_set_id_loudness[l]] == 0)) + continue; + selection_candidate_info[k].drc_instructions_index = i; + selection_candidate_info[k].downmix_id_request_index = d; + selection_candidate_info[k].eq_set_id = eq_set_id_loudness[l]; + if (explicit_peak_information_present[p] == 1) { + selection_candidate_info[k].selection_flags = + SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT; + } else { + selection_candidate_info[k].selection_flags = 0; + } + impd_mixing_level_info( + pstr_drc_sel_proc_params_struct, pstr_loudness_info, + requested_dwnmix_id[d], str_drc_instruction_str->drc_set_id, + eq_set_id_loudness[l], + &selection_candidate_info[k].mixing_level); + if (str_drc_instruction_str->drc_set_target_loudness_present && + ((pstr_drc_sel_proc_params_struct + ->loudness_normalization_on && + str_drc_instruction_str + ->drc_set_target_loudness_value_upper >= + pstr_drc_sel_proc_params_struct->target_loudness && + str_drc_instruction_str + ->drc_set_target_loudness_value_lower < + pstr_drc_sel_proc_params_struct->target_loudness) || + !pstr_drc_sel_proc_params_struct + ->loudness_normalization_on)) { + selection_candidate_info[k].selection_flags |= + SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH; + if (!explicit_peak_information_present[p]) { + if (pstr_drc_sel_proc_params_struct + ->loudness_normalization_on) { + selection_candidate_info[k].output_peak_level = + pstr_drc_sel_proc_params_struct->target_loudness - + str_drc_instruction_str + ->drc_set_target_loudness_value_upper; + } else { + selection_candidate_info[k].output_peak_level = 0.0f; } + } } - } - } - } - *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) - { - n = 0; - for (k=0; k<*selection_candidate_count; k++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info[k].drc_instructions_index]); - - if (pstr_drc_sel_proc_params_struct->eq_set_purpose_request != EQ_PURPOSE_EQ_OFF) - { - WORD32 matching_eq_set_count = 0; - WORD32 matching_eq_instrucions_index[64]; - err = impd_match_eq_set(pstr_drc_config, - requested_dwnmix_id[selection_candidate_info[k].downmix_id_request_index], - str_drc_instruction_str->drc_set_id, - eq_set_id_valid_flag, - &matching_eq_set_count, - matching_eq_instrucions_index); - if (err) return(err); - for (j=0; j<matching_eq_set_count; j++) { - memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - selection_candidate_info_step_2[n].eq_set_id = pstr_drc_config->str_drc_config_ext.str_eq_instructions[matching_eq_instrucions_index[j]].eq_set_id; - n++; + if ((selection_candidate_info[k].selection_flags & + (SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH | + SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT) || + !str_drc_instruction_str + ->drc_set_target_loudness_present)) { + k++; + } else { } + } } - if (str_drc_instruction_str->requires_eq == 0) { - memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - selection_candidate_info_step_2[n].eq_set_id = 0; - n++; - } - } - for (k=0; k<n; k++) - { - memcpy(&selection_candidate_info[k], &selection_candidate_info_step_2[k], sizeof(ia_selection_candidate_info_struct)); - } - *selection_candidate_count = n; - n = 0; - for (k=0; k<*selection_candidate_count; k++) - { - if ((selection_candidate_info[k].selection_flags & SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH) && - !(selection_candidate_info[k].selection_flags & SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT)) { - memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - n++; - } else { - if (selection_candidate_info[k].output_peak_level <= output_peak_level_max) { - memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - n++; - } - if (selection_candidate_info[k].output_peak_level < output_peak_level_min) - { - output_peak_level_min = selection_candidate_info[k].output_peak_level; + } + } else { + if (str_drc_instruction_str->drc_set_id < 0) { + err = impd_init_loudness_control( + pstr_drc_sel_proc_params_struct, pstr_loudness_info, + requested_dwnmix_id[d], str_drc_instruction_str->drc_set_id, + num_compression_eq_count, num_compression_eq_id, + &loudness_info_count, eq_set_id_loudness, + loudness_normalization_gain_db, loudness); + if (err) return (err); + err = 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; + 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) { + match_found_flag = 1; + break; + } } - } - } - selection_candidate_step_2_count = n; - if (selection_candidate_step_2_count == 0) - { - n = 0; - for (k=0; k<*selection_candidate_count; k++) - { - if ((selection_candidate_info[k].selection_flags & SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH) && - (selection_candidate_info[k].selection_flags & SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT)) { - memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - n++; + } + if (match_found_flag == 1) { + adjustment = max( + 0.0f, + 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)); + selection_candidate_info[k].loudness_norm_db_gain_adjusted = + loudness_normalization_gain_db[l] - adjustment; + + selection_candidate_info[k] + .loudness_norm_db_gain_adjusted = min( + selection_candidate_info[k].loudness_norm_db_gain_adjusted, + pstr_drc_sel_proc_params_struct->loudness_norm_gain_db_max); + + selection_candidate_info[k].output_peak_level = + signal_peak_level[p] + + selection_candidate_info[k].loudness_norm_db_gain_adjusted; + if (loudness[l] != UNDEFINED_LOUDNESS_VALUE) { + selection_candidate_info[k].output_loudness = + loudness[l] + + selection_candidate_info[k] + .loudness_norm_db_gain_adjusted; + } else { + selection_candidate_info[k].output_loudness = + UNDEFINED_LOUDNESS_VALUE; } - } - selection_candidate_step_2_count = n; - } - if (selection_candidate_step_2_count == 0) - { - n = 0; - for (k=0; k<*selection_candidate_count; k++) - { - if (selection_candidate_info_step_2[k].output_peak_level < output_peak_level_min + 1.0f) - { - memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - adjustment = max(0.0f, selection_candidate_info_step_2[n].output_peak_level - output_peak_level_max); - adjustment = min(adjustment, max(0.0f, loudness_deviation_max)); - selection_candidate_info_step_2[n].loudness_norm_db_gain_adjusted -= adjustment; - selection_candidate_info_step_2[n].output_peak_level -= adjustment; - selection_candidate_info_step_2[n].output_loudness -= adjustment; - n++; + selection_candidate_info[k].drc_instructions_index = i; + selection_candidate_info[k].downmix_id_request_index = d; + selection_candidate_info[k].eq_set_id = eq_set_id_loudness[l]; + if (explicit_peak_information_present[p] == 1) { + selection_candidate_info[k].selection_flags = + SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT; + } else { + selection_candidate_info[k].selection_flags = 0; } + impd_mixing_level_info( + pstr_drc_sel_proc_params_struct, pstr_loudness_info, + requested_dwnmix_id[d], str_drc_instruction_str->drc_set_id, + eq_set_id_loudness[l], + &selection_candidate_info[k].mixing_level); + k++; + } } - selection_candidate_step_2_count = n; + } } + } + } + } + *selection_candidate_count = k; - for (n=0; n<selection_candidate_step_2_count; n++) - { - memcpy(&selection_candidate_info[n], &selection_candidate_info_step_2[n], sizeof(ia_selection_candidate_info_struct)); + if (*selection_candidate_count > SELECTION_CANDIDATE_COUNT_MAX) { + return UNEXPECTED_ERROR; + } else 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 = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info[k].drc_instructions_index]); + + if (pstr_drc_sel_proc_params_struct->eq_set_purpose_request != + EQ_PURPOSE_EQ_OFF) { + WORD32 matching_eq_set_count = 0; + WORD32 matching_eq_instrucions_index[64]; + err = impd_match_eq_set( + pstr_drc_config, requested_dwnmix_id[selection_candidate_info[k] + .downmix_id_request_index], + str_drc_instruction_str->drc_set_id, eq_set_id_valid_flag, + &matching_eq_set_count, matching_eq_instrucions_index); + if (err) return (err); + for (j = 0; j < matching_eq_set_count; j++) { + memcpy(&selection_candidate_info_step_2[n], + &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + selection_candidate_info_step_2[n].eq_set_id = + pstr_drc_config->str_drc_config_ext + .str_eq_instructions[matching_eq_instrucions_index[j]] + .eq_set_id; + n++; } - *selection_candidate_count = selection_candidate_step_2_count; + } + if (str_drc_instruction_str->requires_eq == 0) { + memcpy(&selection_candidate_info_step_2[n], + &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + selection_candidate_info_step_2[n].eq_set_id = 0; + n++; + } + } + for (k = 0; k < n; k++) { + memcpy(&selection_candidate_info[k], &selection_candidate_info_step_2[k], + sizeof(ia_selection_candidate_info_struct)); + } + *selection_candidate_count = n; + n = 0; + for (k = 0; k < *selection_candidate_count; k++) { + if ((selection_candidate_info[k].selection_flags & + SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH) && + !(selection_candidate_info[k].selection_flags & + SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT)) { + memcpy(&selection_candidate_info_step_2[n], + &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + n++; + } else { + if (selection_candidate_info[k].output_peak_level <= + output_peak_level_max) { + memcpy(&selection_candidate_info_step_2[n], + &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + n++; + } + if (selection_candidate_info[k].output_peak_level < + output_peak_level_min) { + output_peak_level_min = selection_candidate_info[k].output_peak_level; + } + } + } + selection_candidate_step_2_count = n; + if (selection_candidate_step_2_count == 0) { + n = 0; + for (k = 0; k < *selection_candidate_count; k++) { + if ((selection_candidate_info[k].selection_flags & + SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH) && + (selection_candidate_info[k].selection_flags & + SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT)) { + memcpy(&selection_candidate_info_step_2[n], + &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + n++; + } + } + selection_candidate_step_2_count = n; + } + if (selection_candidate_step_2_count == 0) { + n = 0; + for (k = 0; k < *selection_candidate_count; k++) { + if (selection_candidate_info_step_2[k].output_peak_level < + output_peak_level_min + 1.0f) { + memcpy(&selection_candidate_info_step_2[n], + &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + adjustment = + max(0.0f, selection_candidate_info_step_2[n].output_peak_level - + output_peak_level_max); + adjustment = min(adjustment, max(0.0f, loudness_deviation_max)); + selection_candidate_info_step_2[n].loudness_norm_db_gain_adjusted -= + adjustment; + selection_candidate_info_step_2[n].output_peak_level -= adjustment; + selection_candidate_info_step_2[n].output_loudness -= adjustment; + n++; + } + } + selection_candidate_step_2_count = n; } - if (restrict_to_drc_with_album_loudness == 1) - { - j = 0; - for (k=0; k<*selection_candidate_count; k++) - { - loudness_drc_set_id_requested = max(0, pstr_drc_config->str_drc_instruction_str[selection_candidate_info[k].drc_instructions_index].drc_set_id); - for (n=0; n<pstr_loudness_info->loudness_info_album_count; n++) - { - if (loudness_drc_set_id_requested == pstr_loudness_info->str_loudness_info_album[n].drc_set_id) - { - memcpy(&selection_candidate_info[j], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); - j++; - break; - } - } + for (n = 0; n < selection_candidate_step_2_count; n++) { + memcpy(&selection_candidate_info[n], &selection_candidate_info_step_2[n], + sizeof(ia_selection_candidate_info_struct)); + } + *selection_candidate_count = selection_candidate_step_2_count; + } + + if (restrict_to_drc_with_album_loudness == 1) { + j = 0; + for (k = 0; k < *selection_candidate_count; k++) { + loudness_drc_set_id_requested = + max(0, pstr_drc_config + ->str_drc_instruction_str[selection_candidate_info[k] + .drc_instructions_index] + .drc_set_id); + for (n = 0; n < pstr_loudness_info->loudness_info_album_count; n++) { + if (loudness_drc_set_id_requested == + pstr_loudness_info->str_loudness_info_album[n].drc_set_id) { + memcpy(&selection_candidate_info[j], &selection_candidate_info[k], + sizeof(ia_selection_candidate_info_struct)); + j++; + break; } - *selection_candidate_count = j; + } } - return (0); + *selection_candidate_count = j; + } + return (0); } -WORD32 impd_drc_set_final_selection(ia_drc_config* pstr_drc_config, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info - , WORD32* eq_set_id_valid_flag - ) -{ - WORD32 k, i, n, err; - WORD32 selection_candidate_step_2_count; - ia_selection_candidate_info_struct selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; - WORD32 drc_set_id_max; - FLOAT32 output_level_max; - FLOAT32 output_level_min; - WORD32 effect_count, effect_count_min; - WORD32 effect_types_request_table_size; - WORD32 drc_set_target_loudness_val_upper_min; - ia_drc_instructions_struct* str_drc_instruction_str; - ia_drc_instructions_struct* drc_instructions_dependent; - - - if (pstr_drc_sel_proc_params_struct->eq_set_purpose_request > 0) - { - 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); - } +WORD32 impd_drc_set_final_selection( + ia_drc_config* pstr_drc_config, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info, + WORD32* eq_set_id_valid_flag) { + WORD32 k, i, n, err; + WORD32 selection_candidate_step_2_count; + ia_selection_candidate_info_struct + selection_candidate_info_step_2[SELECTION_CANDIDATE_COUNT_MAX]; + WORD32 drc_set_id_max; + FLOAT32 output_level_max; + FLOAT32 output_level_min; + WORD32 effect_count, effect_count_min; + WORD32 effect_types_request_table_size; + WORD32 drc_set_target_loudness_val_upper_min; + ia_drc_instructions_struct* str_drc_instruction_str; + ia_drc_instructions_struct* drc_instructions_dependent; + + if (pstr_drc_sel_proc_params_struct->eq_set_purpose_request > 0) { + 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); + } + + output_level_min = 10000.0f; + k = 0; + for (i = 0; i < *selection_candidate_count; i++) { + if (output_level_min >= selection_candidate_info[i].output_peak_level) { + if (output_level_min > selection_candidate_info[i].output_peak_level) { + output_level_min = selection_candidate_info[i].output_peak_level; + k = 0; + } + memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } + } + selection_candidate_step_2_count = k; - output_level_min = 10000.0f; + if (output_level_min <= 0.0f) { + selection_candidate_step_2_count = *selection_candidate_count; k = 0; - for (i=0; i < *selection_candidate_count; i++) - { - if (output_level_min >= selection_candidate_info[i].output_peak_level) - { - if (output_level_min > selection_candidate_info[i].output_peak_level) - { - output_level_min = selection_candidate_info[i].output_peak_level; - k = 0; - } - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } + for (i = 0; i < selection_candidate_step_2_count; i++) { + if (selection_candidate_info[i].output_peak_level <= 0.0f) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } } selection_candidate_step_2_count = k; - if (output_level_min <= 0.0f ) - { - selection_candidate_step_2_count = *selection_candidate_count; - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) { - if (selection_candidate_info[i].output_peak_level <= 0.0f) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + for (n = 0; n < str_drc_instruction_str->dwnmix_id_count; n++) { + 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]) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } - selection_candidate_step_2_count = k; + } + } + if (k > 0) { + selection_candidate_step_2_count = k; + } - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - for (n=0; n<str_drc_instruction_str->dwnmix_id_count; n++) { - 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]) - { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - } - if (k > 0) - { - selection_candidate_step_2_count = k; - } + effect_types_request_table_size = + sizeof(effect_types_request_table) / sizeof(WORD32); + effect_count_min = 100; + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + effect_count = 0; + if (str_drc_instruction_str->depends_on_drc_set_present == 1) { + err = impd_get_dependent_drc_instructions(pstr_drc_config, + str_drc_instruction_str, + &drc_instructions_dependent); + if (err) return (err); - effect_types_request_table_size = sizeof(effect_types_request_table) / sizeof(WORD32); - effect_count_min = 100; - k=0; - for (i=0; i < selection_candidate_step_2_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - effect_count = 0; - if (str_drc_instruction_str->depends_on_drc_set_present == 1) - { - err = impd_get_dependent_drc_instructions(pstr_drc_config, str_drc_instruction_str, &drc_instructions_dependent); - if (err) return (err); - - for (n=0; n<effect_types_request_table_size; n++) - { - if (effect_types_request_table[n] != EFFECT_BIT_GENERAL_COMPR) - { - if (((str_drc_instruction_str->drc_set_effect & effect_types_request_table[n]) != 0x0) || - ((drc_instructions_dependent->drc_set_effect & effect_types_request_table[n]) != 0x0)) - { - effect_count++; - } - } - } + for (n = 0; n < effect_types_request_table_size; n++) { + if (effect_types_request_table[n] != EFFECT_BIT_GENERAL_COMPR) { + if (((str_drc_instruction_str->drc_set_effect & + effect_types_request_table[n]) != 0x0) || + ((drc_instructions_dependent->drc_set_effect & + effect_types_request_table[n]) != 0x0)) { + effect_count++; } - else - { - for (n=0; n<effect_types_request_table_size; n++) - { - if (effect_types_request_table[n] != EFFECT_BIT_GENERAL_COMPR) - { - if ((str_drc_instruction_str->drc_set_effect & effect_types_request_table[n]) != 0x0) - { - effect_count++; - } - } - } - } - if (effect_count_min >= effect_count) - { - if (effect_count_min > effect_count) - { - effect_count_min = effect_count; - k = 0; - } - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; + } + } + } else { + for (n = 0; n < effect_types_request_table_size; n++) { + if (effect_types_request_table[n] != EFFECT_BIT_GENERAL_COMPR) { + if ((str_drc_instruction_str->drc_set_effect & + effect_types_request_table[n]) != 0x0) { + effect_count++; } + } } - selection_candidate_step_2_count = k; + } + if (effect_count_min >= effect_count) { + if (effect_count_min > effect_count) { + effect_count_min = effect_count; + k = 0; + } + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + } + } + selection_candidate_step_2_count = k; - drc_set_target_loudness_val_upper_min = 100; - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) { - if (selection_candidate_info_step_2[i].selection_flags & SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH) { - k++; - } + drc_set_target_loudness_val_upper_min = 100; + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + if (selection_candidate_info_step_2[i].selection_flags & + SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH) { + k++; + } + } + if (k != 0 && k != selection_candidate_step_2_count) { + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + if (!(selection_candidate_info_step_2[i].selection_flags & + SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH)) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } - if (k != 0 && k != selection_candidate_step_2_count) - { - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) { - if (!(selection_candidate_info_step_2[i].selection_flags & SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH)) { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - selection_candidate_step_2_count = k; + } + selection_candidate_step_2_count = k; + } else if (k == selection_candidate_step_2_count) { + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + if (str_drc_instruction_str->drc_set_target_loudness_present != 1) { + return UNEXPECTED_ERROR; } - else if (k == selection_candidate_step_2_count) - { + if (drc_set_target_loudness_val_upper_min >= + str_drc_instruction_str->drc_set_target_loudness_value_upper) { + if (drc_set_target_loudness_val_upper_min > + str_drc_instruction_str->drc_set_target_loudness_value_upper) { + drc_set_target_loudness_val_upper_min = + str_drc_instruction_str->drc_set_target_loudness_value_upper; k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - if (str_drc_instruction_str->drc_set_target_loudness_present != 1) - { - return UNEXPECTED_ERROR; - } - if (drc_set_target_loudness_val_upper_min >= str_drc_instruction_str->drc_set_target_loudness_value_upper) - { - if (drc_set_target_loudness_val_upper_min > str_drc_instruction_str->drc_set_target_loudness_value_upper) - { - drc_set_target_loudness_val_upper_min = str_drc_instruction_str->drc_set_target_loudness_value_upper; - k = 0; - } - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - selection_candidate_step_2_count = k; + } + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } + } + selection_candidate_step_2_count = k; + } - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - if (str_drc_instruction_str->drc_set_target_loudness_present && pstr_drc_sel_proc_params_struct->loudness_normalization_on && str_drc_instruction_str->drc_set_target_loudness_value_upper >= pstr_drc_sel_proc_params_struct->target_loudness && str_drc_instruction_str->drc_set_target_loudness_value_lower < pstr_drc_sel_proc_params_struct->target_loudness) { - k++; - } + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + if (str_drc_instruction_str->drc_set_target_loudness_present && + pstr_drc_sel_proc_params_struct->loudness_normalization_on && + str_drc_instruction_str->drc_set_target_loudness_value_upper >= + pstr_drc_sel_proc_params_struct->target_loudness && + str_drc_instruction_str->drc_set_target_loudness_value_lower < + pstr_drc_sel_proc_params_struct->target_loudness) { + k++; + } + } + if (k != 0 && k != selection_candidate_step_2_count) { + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + if (str_drc_instruction_str->drc_set_target_loudness_present && + pstr_drc_sel_proc_params_struct->loudness_normalization_on && + str_drc_instruction_str->drc_set_target_loudness_value_upper >= + pstr_drc_sel_proc_params_struct->target_loudness && + str_drc_instruction_str->drc_set_target_loudness_value_lower < + pstr_drc_sel_proc_params_struct->target_loudness) { + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } - if (k != 0 && k != selection_candidate_step_2_count) - { - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - if (str_drc_instruction_str->drc_set_target_loudness_present && pstr_drc_sel_proc_params_struct->loudness_normalization_on && str_drc_instruction_str->drc_set_target_loudness_value_upper >= pstr_drc_sel_proc_params_struct->target_loudness && str_drc_instruction_str->drc_set_target_loudness_value_lower < pstr_drc_sel_proc_params_struct->target_loudness) { - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - selection_candidate_step_2_count = k; - drc_set_target_loudness_val_upper_min = 100; - k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - if (str_drc_instruction_str->drc_set_target_loudness_present != 1) - { - return UNEXPECTED_ERROR; - } - if (drc_set_target_loudness_val_upper_min >= str_drc_instruction_str->drc_set_target_loudness_value_upper) - { - if (drc_set_target_loudness_val_upper_min > str_drc_instruction_str->drc_set_target_loudness_value_upper) - { - drc_set_target_loudness_val_upper_min = str_drc_instruction_str->drc_set_target_loudness_value_upper; - k = 0; - } - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - selection_candidate_step_2_count = k; + } + selection_candidate_step_2_count = k; + drc_set_target_loudness_val_upper_min = 100; + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + if (str_drc_instruction_str->drc_set_target_loudness_present != 1) { + return UNEXPECTED_ERROR; } - else if (k == selection_candidate_step_2_count) - { - drc_set_target_loudness_val_upper_min = 100; + if (drc_set_target_loudness_val_upper_min >= + str_drc_instruction_str->drc_set_target_loudness_value_upper) { + if (drc_set_target_loudness_val_upper_min > + str_drc_instruction_str->drc_set_target_loudness_value_upper) { + drc_set_target_loudness_val_upper_min = + str_drc_instruction_str->drc_set_target_loudness_value_upper; k = 0; - for (i=0; i<selection_candidate_step_2_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - if (str_drc_instruction_str->drc_set_target_loudness_present != 1) - { - return UNEXPECTED_ERROR; - } - if (drc_set_target_loudness_val_upper_min >= str_drc_instruction_str->drc_set_target_loudness_value_upper) - { - if (drc_set_target_loudness_val_upper_min > str_drc_instruction_str->drc_set_target_loudness_value_upper) - { - drc_set_target_loudness_val_upper_min = str_drc_instruction_str->drc_set_target_loudness_value_upper; - k = 0; - } - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - } - } - selection_candidate_step_2_count = k; + } + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } - k = 0; - output_level_max = -1000.0f; - for (i=0; i < selection_candidate_step_2_count; i++) - { - if ((selection_candidate_info_step_2[i].output_peak_level <= 0.0f) && (output_level_max <= selection_candidate_info_step_2[i].output_peak_level)) - { - if (output_level_max < selection_candidate_info_step_2[i].output_peak_level) - { - output_level_max = selection_candidate_info_step_2[i].output_peak_level; - k = 0; - } - memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - k++; - output_level_max = selection_candidate_info_step_2[i].output_peak_level; - } + } + selection_candidate_step_2_count = k; + } else if (k == selection_candidate_step_2_count) { + drc_set_target_loudness_val_upper_min = 100; + k = 0; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + if (str_drc_instruction_str->drc_set_target_loudness_present != 1) { + return UNEXPECTED_ERROR; } - selection_candidate_step_2_count = k; + if (drc_set_target_loudness_val_upper_min >= + str_drc_instruction_str->drc_set_target_loudness_value_upper) { + if (drc_set_target_loudness_val_upper_min > + str_drc_instruction_str->drc_set_target_loudness_value_upper) { + drc_set_target_loudness_val_upper_min = + str_drc_instruction_str->drc_set_target_loudness_value_upper; + k = 0; + } + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; } - - drc_set_id_max = -1000; - for (i=0; i < selection_candidate_step_2_count; i++) - { - str_drc_instruction_str = &(pstr_drc_config->str_drc_instruction_str[selection_candidate_info_step_2[i].drc_instructions_index]); - if (drc_set_id_max < str_drc_instruction_str->drc_set_id) - { - drc_set_id_max = str_drc_instruction_str->drc_set_id; - memcpy(&selection_candidate_info_step_2[0], &selection_candidate_info_step_2[i], sizeof(ia_selection_candidate_info_struct)); - } + } + selection_candidate_step_2_count = k; + } + k = 0; + output_level_max = -1000.0f; + for (i = 0; i < selection_candidate_step_2_count; i++) { + if ((selection_candidate_info_step_2[i].output_peak_level <= 0.0f) && + (output_level_max <= + selection_candidate_info_step_2[i].output_peak_level)) { + if (output_level_max < + selection_candidate_info_step_2[i].output_peak_level) { + output_level_max = + selection_candidate_info_step_2[i].output_peak_level; + k = 0; } - memcpy(&selection_candidate_info[0], &selection_candidate_info_step_2[0], sizeof(ia_selection_candidate_info_struct)); - *selection_candidate_count = 1; + memcpy(&selection_candidate_info_step_2[k], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + k++; + output_level_max = selection_candidate_info_step_2[i].output_peak_level; + } + } + selection_candidate_step_2_count = k; + } + + drc_set_id_max = -1000; + for (i = 0; i < selection_candidate_step_2_count; i++) { + str_drc_instruction_str = + &(pstr_drc_config->str_drc_instruction_str + [selection_candidate_info_step_2[i].drc_instructions_index]); + if (drc_set_id_max < str_drc_instruction_str->drc_set_id) { + drc_set_id_max = str_drc_instruction_str->drc_set_id; + memcpy(&selection_candidate_info_step_2[0], + &selection_candidate_info_step_2[i], + sizeof(ia_selection_candidate_info_struct)); + } + } + memcpy(&selection_candidate_info[0], &selection_candidate_info_step_2[0], + sizeof(ia_selection_candidate_info_struct)); + *selection_candidate_count = 1; - return 0; + return 0; } WORD32 impd_select_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32* drc_set_id_selected - , WORD32* eq_set_id_selected - , WORD32* loud_eq_id_sel - ) -{ - WORD32 i, err; - - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; - ia_drc_config* pstr_drc_config = &pstr_drc_uni_sel_proc->drc_config; - ia_drc_loudness_info_set_struct* pstr_loudness_info = &pstr_drc_uni_sel_proc->loudness_info_set; - - WORD32 selection_candidate_count = 0; - WORD32 restrict_to_drc_with_album_loudness = 0; - ia_selection_candidate_info_struct selection_candidate_info[SELECTION_CANDIDATE_COUNT_MAX]; - -// WORD32 selected_eq_set_count = 0; - - if (pstr_drc_sel_proc_params_struct->album_mode == 1) - { - restrict_to_drc_with_album_loudness = 1; + WORD32* drc_set_id_selected, + WORD32* eq_set_id_selected, WORD32* loud_eq_id_sel) { + WORD32 i, err; + + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct = + &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params; + ia_drc_config* pstr_drc_config = &pstr_drc_uni_sel_proc->drc_config; + ia_drc_loudness_info_set_struct* pstr_loudness_info = + &pstr_drc_uni_sel_proc->loudness_info_set; + + WORD32 selection_candidate_count = 0; + WORD32 restrict_to_drc_with_album_loudness = 0; + ia_selection_candidate_info_struct + selection_candidate_info[SELECTION_CANDIDATE_COUNT_MAX]; + + // WORD32 selected_eq_set_count = 0; + + if (pstr_drc_sel_proc_params_struct->album_mode == 1) { + restrict_to_drc_with_album_loudness = 1; + } + + while (!selection_candidate_count) { + impd_drc_set_preselection( + pstr_drc_sel_proc_params_struct, pstr_drc_config, pstr_loudness_info, + restrict_to_drc_with_album_loudness, pstr_drc_uni_sel_proc, + &selection_candidate_count, selection_candidate_info); + + if (selection_candidate_count == 0) { + if (restrict_to_drc_with_album_loudness == 1) { + restrict_to_drc_with_album_loudness = 0; + continue; + } else { + return (UNEXPECTED_ERROR); + } } - while (!selection_candidate_count) - { - impd_drc_set_preselection(pstr_drc_sel_proc_params_struct, - pstr_drc_config, - pstr_loudness_info, - restrict_to_drc_with_album_loudness, - pstr_drc_uni_sel_proc, - &selection_candidate_count, - selection_candidate_info); + err = impd_validate_requested_drc_feature(pstr_drc_sel_proc_params_struct); + if (err) return (err); - if (selection_candidate_count == 0) - { - if (restrict_to_drc_with_album_loudness == 1) - { - restrict_to_drc_with_album_loudness = 0; - continue; - } - else - { - return(UNEXPECTED_ERROR); - } + if (pstr_drc_sel_proc_params_struct->dynamic_range_control_on == 1) { + if (pstr_drc_sel_proc_params_struct->num_drc_feature_requests > 0) { + for (i = 0; + i < pstr_drc_sel_proc_params_struct->num_drc_feature_requests; + i++) { + switch (pstr_drc_sel_proc_params_struct->drc_feature_req_type[i]) { + case MATCH_EFFECT_TYPE: + err = impd_match_effect_types( + pstr_drc_config, + pstr_drc_sel_proc_params_struct->requested_num_drc_effects[i], + pstr_drc_sel_proc_params_struct + ->desired_num_drc_effects_of_requested[i], + pstr_drc_sel_proc_params_struct->requested_drc_effect_type[i], + &selection_candidate_count, selection_candidate_info); + if (err) return (err); + break; + case MATCH_DYNAMIC_RANGE: + err = impd_match_dynamic_range( + pstr_drc_config, pstr_loudness_info, + pstr_drc_sel_proc_params_struct, i, + &selection_candidate_count, selection_candidate_info); + if (err) return (err); + break; + case MATCH_DRC_CHARACTERISTIC: + err = impd_match_drc_characteristic( + pstr_drc_config, pstr_drc_sel_proc_params_struct + ->requested_drc_characteristic[i], + &selection_candidate_count, selection_candidate_info); + if (err) return (err); + break; + + default: + return (UNEXPECTED_ERROR); + break; + } } + } else { + WORD32 match_found_flag = 0; - err = impd_validate_requested_drc_feature(pstr_drc_sel_proc_params_struct); + err = impd_select_drcs_without_compr_effects( + pstr_drc_config, &match_found_flag, &selection_candidate_count, + selection_candidate_info); if (err) return (err); - if (pstr_drc_sel_proc_params_struct->dynamic_range_control_on == 1) - { - if (pstr_drc_sel_proc_params_struct->num_drc_feature_requests > 0) - { - for (i=0; i<pstr_drc_sel_proc_params_struct->num_drc_feature_requests; i++) - { - switch (pstr_drc_sel_proc_params_struct->drc_feature_req_type[i]) - { - case MATCH_EFFECT_TYPE: - err = impd_match_effect_types(pstr_drc_config, - pstr_drc_sel_proc_params_struct->requested_num_drc_effects[i], - pstr_drc_sel_proc_params_struct->desired_num_drc_effects_of_requested[i], - pstr_drc_sel_proc_params_struct->requested_drc_effect_type[i], - &selection_candidate_count, - selection_candidate_info); - if (err) return (err); - break; - case MATCH_DYNAMIC_RANGE: - err = impd_match_dynamic_range(pstr_drc_config, - pstr_loudness_info, - pstr_drc_sel_proc_params_struct, - i, - &selection_candidate_count, - selection_candidate_info); - if (err) return (err); - break; - case MATCH_DRC_CHARACTERISTIC: - err = impd_match_drc_characteristic(pstr_drc_config, - pstr_drc_sel_proc_params_struct->requested_drc_characteristic[i], - &selection_candidate_count, - selection_candidate_info); - if (err) return (err); - break; - - default: - return (UNEXPECTED_ERROR); - break; - } - } - } - else - { - WORD32 match_found_flag = 0; - - err = impd_select_drcs_without_compr_effects (pstr_drc_config, - &match_found_flag, - &selection_candidate_count, - selection_candidate_info); - if (err) return (err); - - if (match_found_flag == 0) - { - WORD32 requested_num_drc_effects = 5; - WORD32 desired_num_drc_effects_of_requested = 1; - WORD32 requested_drc_effect_type[5] = { - EFFECT_TYPE_REQUESTED_GENERAL_COMPR, - EFFECT_TYPE_REQUESTED_NIGHT, - EFFECT_TYPE_REQUESTED_NOISY, - EFFECT_TYPE_REQUESTED_LIMITED, - EFFECT_TYPE_REQUESTED_LOWLEVEL - }; - - err = impd_match_effect_types(pstr_drc_config, - requested_num_drc_effects, - desired_num_drc_effects_of_requested, - requested_drc_effect_type, - &selection_candidate_count, - selection_candidate_info); - if (err) return (err); - } - } - - if (selection_candidate_count > 0) - { - err = impd_drc_set_final_selection (pstr_drc_config, - pstr_drc_sel_proc_params_struct, - &selection_candidate_count, - selection_candidate_info - , pstr_drc_uni_sel_proc->eq_set_id_valid_flag - ); - if (err) return (err); - } - else - { - selection_candidate_count = 0; - return(UNEXPECTED_ERROR); - } - + if (match_found_flag == 0) { + WORD32 requested_num_drc_effects = 5; + WORD32 desired_num_drc_effects_of_requested = 1; + WORD32 requested_drc_effect_type[5] = { + EFFECT_TYPE_REQUESTED_GENERAL_COMPR, EFFECT_TYPE_REQUESTED_NIGHT, + EFFECT_TYPE_REQUESTED_NOISY, EFFECT_TYPE_REQUESTED_LIMITED, + EFFECT_TYPE_REQUESTED_LOWLEVEL}; + + err = impd_match_effect_types( + pstr_drc_config, requested_num_drc_effects, + desired_num_drc_effects_of_requested, requested_drc_effect_type, + &selection_candidate_count, selection_candidate_info); + if (err) return (err); } + } - if (selection_candidate_count == 0) - { - if (restrict_to_drc_with_album_loudness == 1) - { - restrict_to_drc_with_album_loudness = 0; - } - else - { - return(UNEXPECTED_ERROR); - } - } + if (selection_candidate_count > 0) { + err = impd_drc_set_final_selection( + pstr_drc_config, pstr_drc_sel_proc_params_struct, + &selection_candidate_count, selection_candidate_info, + pstr_drc_uni_sel_proc->eq_set_id_valid_flag); + if (err) return (err); + } else { + selection_candidate_count = 0; + return (UNEXPECTED_ERROR); + } } - *drc_set_id_selected = pstr_drc_config->str_drc_instruction_str[selection_candidate_info[0].drc_instructions_index].drc_set_id; - *eq_set_id_selected = selection_candidate_info[0].eq_set_id; - - 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 (selection_candidate_count > 0) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.loudness_normalization_gain_db = selection_candidate_info[0].loudness_norm_db_gain_adjusted; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_peak_level_db = selection_candidate_info[0].output_peak_level; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_loudness = selection_candidate_info[0].output_loudness; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id = pstr_drc_sel_proc_params_struct->requested_dwnmix_id[selection_candidate_info[0].downmix_id_request_index]; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.mixing_level = selection_candidate_info[0].mixing_level; + + if (selection_candidate_count == 0) { + if (restrict_to_drc_with_album_loudness == 1) { + restrict_to_drc_with_album_loudness = 0; + } else { + return (UNEXPECTED_ERROR); + } } - return(0); + } + *drc_set_id_selected = + pstr_drc_config + ->str_drc_instruction_str[selection_candidate_info[0] + .drc_instructions_index] + .drc_set_id; + *eq_set_id_selected = selection_candidate_info[0].eq_set_id; + + 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 (selection_candidate_count > 0) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .loudness_normalization_gain_db = + selection_candidate_info[0].loudness_norm_db_gain_adjusted; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_peak_level_db = + selection_candidate_info[0].output_peak_level; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_loudness = + selection_candidate_info[0].output_loudness; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id = + pstr_drc_sel_proc_params_struct->requested_dwnmix_id + [selection_candidate_info[0].downmix_id_request_index]; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.mixing_level = + selection_candidate_info[0].mixing_level; + } + return (0); } - - diff --git a/decoder/drc_src/impd_drc_selection_process_init.c b/decoder/drc_src/impd_drc_selection_process_init.c index 93ad236..1cb234a 100644 --- a/decoder/drc_src/impd_drc_selection_process_init.c +++ b/decoder/drc_src/impd_drc_selection_process_init.c @@ -27,310 +27,504 @@ #include "impd_drc_interface.h" #include "impd_drc_selection_process.h" -WORD32 impd_drc_sel_proc_init_dflt(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) -{ - if (pstr_drc_uni_sel_proc != NULL) { +WORD32 impd_drc_sel_proc_init_dflt( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc) { + if (pstr_drc_uni_sel_proc != NULL) { + pstr_drc_uni_sel_proc->first_frame = 0; - pstr_drc_uni_sel_proc->first_frame = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count = -1; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout = -1; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_channel_count = -1; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.base_layout = -1; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_normalization_on = + 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_loudness = -24.0f; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_normalization_on = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_loudness = -24.0f; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_deviation_max = + LOUDNESS_DEVIATION_MAX_DEFAULT; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_deviation_max = LOUDNESS_DEVIATION_MAX_DEFAULT; - - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_method = USER_METHOD_DEFINITION_DEFAULT; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_system = USER_MEASUREMENT_SYSTEM_DEFAULT; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_pre_proc = USER_LOUDNESS_PREPROCESSING_DEFAULT; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.device_cut_off_frequency = 500; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_db_max = LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_modification_db = 0.0f; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max = 0.0f; - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter == 1) { - - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max = 6.0f; - - } + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_method = + USER_METHOD_DEFINITION_DEFAULT; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_system = + USER_MEASUREMENT_SYSTEM_DEFAULT; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_pre_proc = USER_LOUDNESS_PREPROCESSING_DEFAULT; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.device_cut_off_frequency = + 500; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_db_max = + LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_norm_gain_modification_db = 0.0f; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max = 0.0f; + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter == 1) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max = + 6.0f; + } - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.dynamic_range_control_on = 1; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_bands_supported = 4; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_drc_feature_requests = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.dynamic_range_control_on = 1; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_bands_supported = 4; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_drc_feature_requests = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost = 1.f; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress = 1.f; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_characteristic_target = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost = 1.f; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress = 1.f; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_characteristic_target = + 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_eq_request = LOUD_EQ_REQUEST_OFF; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.eq_set_purpose_request = EQ_PURPOSE_EQ_OFF; - pstr_drc_uni_sel_proc->compl_level_supported_total = COMPLEXITY_LEVEL_SUPPORTED_TOTAL; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_eq_request = + LOUD_EQ_REQUEST_OFF; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.eq_set_purpose_request = + EQ_PURPOSE_EQ_OFF; + pstr_drc_uni_sel_proc->compl_level_supported_total = + COMPLEXITY_LEVEL_SUPPORTED_TOTAL; - pstr_drc_uni_sel_proc->drc_inst_index_sel = -1; - pstr_drc_uni_sel_proc->drc_coef_index_sel = -1; - pstr_drc_uni_sel_proc->downmix_inst_index_sel = -1; - pstr_drc_uni_sel_proc->drc_instructions_index[0] = -1; - pstr_drc_uni_sel_proc->drc_instructions_index[1] = -1; - pstr_drc_uni_sel_proc->drc_instructions_index[2] = -1; - pstr_drc_uni_sel_proc->drc_instructions_index[3] = -1; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_peak_level_db = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.loudness_normalization_gain_db = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_loudness = UNDEFINED_LOUDNESS_VALUE; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.num_sel_drc_sets = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.base_channel_count = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count = 0; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.downmix_matrix_present = 0; + pstr_drc_uni_sel_proc->drc_inst_index_sel = -1; + pstr_drc_uni_sel_proc->drc_coef_index_sel = -1; + pstr_drc_uni_sel_proc->downmix_inst_index_sel = -1; + pstr_drc_uni_sel_proc->drc_instructions_index[0] = -1; + pstr_drc_uni_sel_proc->drc_instructions_index[1] = -1; + pstr_drc_uni_sel_proc->drc_instructions_index[2] = -1; + pstr_drc_uni_sel_proc->drc_instructions_index[3] = -1; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_peak_level_db = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output + .loudness_normalization_gain_db = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.output_loudness = + UNDEFINED_LOUDNESS_VALUE; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.num_sel_drc_sets = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.active_downmix_id = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.base_channel_count = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.target_channel_count = 0; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_output.downmix_matrix_present = 0; - pstr_drc_uni_sel_proc->eq_inst_index[0] = -1; - pstr_drc_uni_sel_proc->eq_inst_index[1] = -1; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } else { - return 1; - } + pstr_drc_uni_sel_proc->eq_inst_index[0] = -1; + pstr_drc_uni_sel_proc->eq_inst_index[1] = -1; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } else { + return 1; + } - return 0; + return 0; } WORD32 -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) -{ - - if (pstr_drc_uni_sel_proc != NULL && pstr_drc_sel_proc_params_struct != NULL) { - - if ( memcmp ( &pstr_drc_uni_sel_proc->uni_drc_sel_proc_params, pstr_drc_sel_proc_params_struct, sizeof(ia_drc_sel_proc_params_struct) )) - { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params = *pstr_drc_sel_proc_params_struct; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } +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) { + if (pstr_drc_uni_sel_proc != NULL && + pstr_drc_sel_proc_params_struct != NULL) { + if (memcmp(&pstr_drc_uni_sel_proc->uni_drc_sel_proc_params, + pstr_drc_sel_proc_params_struct, + sizeof(ia_drc_sel_proc_params_struct))) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params = + *pstr_drc_sel_proc_params_struct; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } + } - return 0; + return 0; } WORD32 -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; - - if (pstr_drc_uni_sel_proc != NULL && pstr_drc_interface != NULL) { +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; - if (pstr_drc_interface->system_interface_flag) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type != pstr_drc_interface->system_interface.target_config_request_type) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type = pstr_drc_interface->system_interface.target_config_request_type; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - switch (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_config_request_type) { - case 0: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests != pstr_drc_interface->system_interface.num_downmix_id_requests) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests = pstr_drc_interface->system_interface.num_downmix_id_requests; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - for (i=0; i<pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_downmix_id_requests; i++) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[i] != pstr_drc_interface->system_interface.requested_dwnmix_id[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dwnmix_id[i] = pstr_drc_interface->system_interface.requested_dwnmix_id[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - break; - case 1: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_layout != pstr_drc_interface->system_interface.requested_target_layout) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_layout = pstr_drc_interface->system_interface.requested_target_layout; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - break; - case 2: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_ch_count != pstr_drc_interface->system_interface.requested_target_ch_count) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_target_ch_count = pstr_drc_interface->system_interface.requested_target_ch_count; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - break; + if (pstr_drc_uni_sel_proc != NULL && pstr_drc_interface != NULL) { + if (pstr_drc_interface->system_interface_flag) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type != + pstr_drc_interface->system_interface.target_config_request_type) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type = + pstr_drc_interface->system_interface.target_config_request_type; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + switch (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .target_config_request_type) { + case 0: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests != + pstr_drc_interface->system_interface.num_downmix_id_requests) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests = + pstr_drc_interface->system_interface.num_downmix_id_requests; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + for (i = 0; i < pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_downmix_id_requests; + i++) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dwnmix_id[i] != + pstr_drc_interface->system_interface.requested_dwnmix_id[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dwnmix_id[i] = + pstr_drc_interface->system_interface.requested_dwnmix_id[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } + } + break; + case 1: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_layout != + pstr_drc_interface->system_interface.requested_target_layout) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_layout = + pstr_drc_interface->system_interface.requested_target_layout; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + break; + case 2: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_ch_count != + pstr_drc_interface->system_interface.requested_target_ch_count) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_target_ch_count = + pstr_drc_interface->system_interface.requested_target_ch_count; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + break; + } + } + if (pstr_drc_interface->loudness_norm_ctrl_interface_flag) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_normalization_on != + pstr_drc_interface->loudness_norm_ctrl_interface + .loudness_normalization_on) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_normalization_on = + pstr_drc_interface->loudness_norm_ctrl_interface + .loudness_normalization_on; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_normalization_on) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_loudness != + pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_loudness = + pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - if (pstr_drc_interface->loudness_norm_ctrl_interface_flag) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_normalization_on != pstr_drc_interface->loudness_norm_ctrl_interface.loudness_normalization_on) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_normalization_on = pstr_drc_interface->loudness_norm_ctrl_interface.loudness_normalization_on; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_normalization_on) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_loudness != pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.target_loudness = pstr_drc_interface->loudness_norm_ctrl_interface.target_loudness; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } + } + } + if (pstr_drc_interface->loudness_norm_parameter_interface_flag) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode != + pstr_drc_interface->loudness_norm_param_interface.album_mode) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode = + pstr_drc_interface->loudness_norm_param_interface.album_mode; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter != + pstr_drc_interface->loudness_norm_param_interface.peak_limiter) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter = + pstr_drc_interface->loudness_norm_param_interface.peak_limiter; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_loudness_deviation_max) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_deviation_max != + pstr_drc_interface->loudness_norm_param_interface + .loudness_deviation_max) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_deviation_max = + pstr_drc_interface->loudness_norm_param_interface + .loudness_deviation_max; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_loudness_measur_method) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_method != + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_method) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_method = + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_method; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_loudness_measur_pre_proc) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_pre_proc != + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_pre_proc) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_pre_proc = + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_pre_proc; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_loudness_measur_system) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_system != + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_system) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_measurement_system = + pstr_drc_interface->loudness_norm_param_interface + .loudness_measurement_system; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - if (pstr_drc_interface->loudness_norm_parameter_interface_flag) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode != pstr_drc_interface->loudness_norm_param_interface.album_mode) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.album_mode = pstr_drc_interface->loudness_norm_param_interface.album_mode; + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_device_cut_off_freq) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .device_cut_off_frequency != + pstr_drc_interface->loudness_norm_param_interface + .device_cut_off_frequency) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .device_cut_off_frequency = + pstr_drc_interface->loudness_norm_param_interface + .device_cut_off_frequency; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_loudness_norm_gain_db_max) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_norm_gain_db_max != + pstr_drc_interface->loudness_norm_param_interface + .loudness_norm_gain_db_max) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_norm_gain_db_max = + pstr_drc_interface->loudness_norm_param_interface + .loudness_norm_gain_db_max; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_loudness_norm_gain_modification_db) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_norm_gain_modification_db != + pstr_drc_interface->loudness_norm_param_interface + .loudness_norm_gain_modification_db) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .loudness_norm_gain_modification_db = + pstr_drc_interface->loudness_norm_param_interface + .loudness_norm_gain_modification_db; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + if (pstr_drc_interface->loudness_norm_param_interface + .change_output_peak_level_max) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .output_peak_level_max != + pstr_drc_interface->loudness_norm_param_interface + .output_peak_level_max) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max = + pstr_drc_interface->loudness_norm_param_interface + .output_peak_level_max; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } + } + if (pstr_drc_interface->drc_interface_flag) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .dynamic_range_control_on != + pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .dynamic_range_control_on = + pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + if (!pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .dynamic_range_control_on) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_drc_feature_requests = 0; + } + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .dynamic_range_control_on) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_drc_feature_requests != + pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_drc_feature_requests = + pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + for (i = 0; i < pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .num_drc_feature_requests; + i++) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .drc_feature_req_type[i] != + pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .drc_feature_req_type[i] = + pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + switch (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .drc_feature_req_type[i]) { + case 0: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_num_drc_effects[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_num_drc_effects[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_num_drc_effects[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_num_drc_effects[i]; pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter != pstr_drc_interface->loudness_norm_param_interface.peak_limiter) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.peak_limiter = pstr_drc_interface->loudness_norm_param_interface.peak_limiter; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .desired_num_drc_effects_of_requested[i] != + pstr_drc_interface->drc_ctrl_interface + .desired_num_drc_effects_of_requested[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .desired_num_drc_effects_of_requested[i] = + pstr_drc_interface->drc_ctrl_interface + .desired_num_drc_effects_of_requested[i]; pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_interface->loudness_norm_param_interface.change_loudness_deviation_max) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_deviation_max != pstr_drc_interface->loudness_norm_param_interface.loudness_deviation_max) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_deviation_max = pstr_drc_interface->loudness_norm_param_interface.loudness_deviation_max; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_loudness_measur_method) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_method != pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_method) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_method = pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_method; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_loudness_measur_pre_proc) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_pre_proc != pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_pre_proc) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_pre_proc = pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_pre_proc; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_loudness_measur_system) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_system != pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_system) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_measurement_system = pstr_drc_interface->loudness_norm_param_interface.loudness_measurement_system; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_device_cut_off_freq) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.device_cut_off_frequency != pstr_drc_interface->loudness_norm_param_interface.device_cut_off_frequency) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.device_cut_off_frequency = pstr_drc_interface->loudness_norm_param_interface.device_cut_off_frequency; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + for (j = 0; j < pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_num_drc_effects[i]; + j++) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_drc_effect_type[i][j] != + pstr_drc_interface->drc_ctrl_interface + .requested_drc_effect_type[i][j]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_drc_effect_type[i][j] = + pstr_drc_interface->drc_ctrl_interface + .requested_drc_effect_type[i][j]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_loudness_norm_gain_db_max) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_db_max != pstr_drc_interface->loudness_norm_param_interface.loudness_norm_gain_db_max) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_db_max = pstr_drc_interface->loudness_norm_param_interface.loudness_norm_gain_db_max; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_loudness_norm_gain_modification_db ) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_modification_db != pstr_drc_interface->loudness_norm_param_interface.loudness_norm_gain_modification_db) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_norm_gain_modification_db = pstr_drc_interface->loudness_norm_param_interface.loudness_norm_gain_modification_db; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->loudness_norm_param_interface.change_output_peak_level_max) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max != pstr_drc_interface->loudness_norm_param_interface.output_peak_level_max) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.output_peak_level_max = pstr_drc_interface->loudness_norm_param_interface.output_peak_level_max; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - } - if (pstr_drc_interface->drc_interface_flag) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.dynamic_range_control_on != pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.dynamic_range_control_on = pstr_drc_interface->drc_ctrl_interface.dynamic_range_control_on; + } + break; + case 1: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_measur_type[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_rng_measurement_type[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_measur_type[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_rng_measurement_type[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_range_flag[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_is_single_val_flag[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_range_flag[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_is_single_val_flag[i]; pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - if (!pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.dynamic_range_control_on) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_drc_feature_requests = 0; + } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_range_flag[i] == 0) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_value[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_value[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_value[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_value[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.dynamic_range_control_on) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_drc_feature_requests != pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_drc_feature_requests = pstr_drc_interface->drc_ctrl_interface.num_drc_feature_requests; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } else { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_min_val[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_min_val[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_min_val[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_min_val[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - for (i=0; i<pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.num_drc_feature_requests; i++) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_feature_req_type[i] != pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_feature_req_type[i] = pstr_drc_interface->drc_ctrl_interface.drc_feature_req_type[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - switch (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_feature_req_type[i]) { - case 0: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_num_drc_effects[i] != pstr_drc_interface->drc_ctrl_interface.requested_num_drc_effects[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_num_drc_effects[i] = pstr_drc_interface->drc_ctrl_interface.requested_num_drc_effects[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.desired_num_drc_effects_of_requested[i] != pstr_drc_interface->drc_ctrl_interface.desired_num_drc_effects_of_requested[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.desired_num_drc_effects_of_requested[i] = pstr_drc_interface->drc_ctrl_interface.desired_num_drc_effects_of_requested[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - for (j=0; j<pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_num_drc_effects[i]; j++) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_drc_effect_type[i][j] != pstr_drc_interface->drc_ctrl_interface.requested_drc_effect_type[i][j]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_drc_effect_type[i][j] = pstr_drc_interface->drc_ctrl_interface.requested_drc_effect_type[i][j]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - break; - case 1: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_measur_type[i] != pstr_drc_interface->drc_ctrl_interface.requested_dyn_rng_measurement_type[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_measur_type[i] = pstr_drc_interface->drc_ctrl_interface.requested_dyn_rng_measurement_type[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_range_flag[i] != pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_is_single_val_flag[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_range_flag[i] = pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_is_single_val_flag[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_range_flag[i] == 0) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_value[i] != pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_value[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_value[i] = pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_value[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } else { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_min_val[i] != pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_min_val[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_min_val[i] = pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_min_val[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_max_val[i] != pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_max_val[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_dyn_range_max_val[i] = pstr_drc_interface->drc_ctrl_interface.requested_dyn_range_max_val[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - break; - case 2: - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_drc_characteristic[i] != pstr_drc_interface->drc_ctrl_interface.requested_drc_characteristic[i]) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.requested_drc_characteristic[i] = pstr_drc_interface->drc_ctrl_interface.requested_drc_characteristic[i]; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - break; - } + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_max_val[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_max_val[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_dyn_range_max_val[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_dyn_range_max_val[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - } + } + break; + case 2: + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_drc_characteristic[i] != + pstr_drc_interface->drc_ctrl_interface + .requested_drc_characteristic[i]) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .requested_drc_characteristic[i] = + pstr_drc_interface->drc_ctrl_interface + .requested_drc_characteristic[i]; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + break; + } } - if (pstr_drc_interface->drc_parameter_interface_flag) { - if (pstr_drc_interface->drc_parameter_interface.change_compress) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress != pstr_drc_interface->drc_parameter_interface.compress) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress = pstr_drc_interface->drc_parameter_interface.compress; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->drc_parameter_interface.change_boost) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost != pstr_drc_interface->drc_parameter_interface.boost) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost = pstr_drc_interface->drc_parameter_interface.boost; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } - if (pstr_drc_interface->drc_parameter_interface.change_drc_characteristic_target) { - if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_characteristic_target != pstr_drc_interface->drc_parameter_interface.drc_characteristic_target) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.drc_characteristic_target = pstr_drc_interface->drc_parameter_interface.drc_characteristic_target; - pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; - } - } + } + } + if (pstr_drc_interface->drc_parameter_interface_flag) { + if (pstr_drc_interface->drc_parameter_interface.change_compress) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress != + pstr_drc_interface->drc_parameter_interface.compress) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.compress = + pstr_drc_interface->drc_parameter_interface.compress; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } - if (pstr_drc_interface->drc_uni_interface_ext_flag) { - ia_drc_uni_interface_ext_struct* drc_uni_interface_ext = &pstr_drc_interface->drc_uni_interface_ext; - if (drc_uni_interface_ext->loudness_eq_parameter_interface_flag) { - ia_loudness_eq_parameter_interface_struct* loudness_eq_parameter_interface = &drc_uni_interface_ext->loudness_eq_parameter_interface; - if (loudness_eq_parameter_interface->loudness_eq_request_flag) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_eq_request = loudness_eq_parameter_interface->loudness_eq_request; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.sensitivity = loudness_eq_parameter_interface->sensitivity; - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.playback_gain = loudness_eq_parameter_interface->playback_gain; - } - } - if (drc_uni_interface_ext->eq_ctrl_interface_flag) { - pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.eq_set_purpose_request = drc_uni_interface_ext->eq_ctrl_interface.eq_set_purpose_request; - } + } + if (pstr_drc_interface->drc_parameter_interface.change_boost) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost != + pstr_drc_interface->drc_parameter_interface.boost) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.boost = + pstr_drc_interface->drc_parameter_interface.boost; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; } + } + if (pstr_drc_interface->drc_parameter_interface + .change_drc_characteristic_target) { + if (pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .drc_characteristic_target != + pstr_drc_interface->drc_parameter_interface + .drc_characteristic_target) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params + .drc_characteristic_target = + pstr_drc_interface->drc_parameter_interface + .drc_characteristic_target; + pstr_drc_uni_sel_proc->sel_proc_request_flag = 1; + } + } } + if (pstr_drc_interface->drc_uni_interface_ext_flag) { + ia_drc_uni_interface_ext_struct* drc_uni_interface_ext = + &pstr_drc_interface->drc_uni_interface_ext; + if (drc_uni_interface_ext->loudness_eq_parameter_interface_flag) { + ia_loudness_eq_parameter_interface_struct* + loudness_eq_parameter_interface = + &drc_uni_interface_ext->loudness_eq_parameter_interface; + if (loudness_eq_parameter_interface->loudness_eq_request_flag) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.loudness_eq_request = + loudness_eq_parameter_interface->loudness_eq_request; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.sensitivity = + loudness_eq_parameter_interface->sensitivity; + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.playback_gain = + loudness_eq_parameter_interface->playback_gain; + } + } + if (drc_uni_interface_ext->eq_ctrl_interface_flag) { + pstr_drc_uni_sel_proc->uni_drc_sel_proc_params.eq_set_purpose_request = + drc_uni_interface_ext->eq_ctrl_interface.eq_set_purpose_request; + } + } + } - return 0; + return 0; } - - - diff --git a/decoder/drc_src/impd_drc_shape_filter.c b/decoder/drc_src/impd_drc_shape_filter.c index 4a33c7b..ef16658 100644 --- a/decoder/drc_src/impd_drc_shape_filter.c +++ b/decoder/drc_src/impd_drc_shape_filter.c @@ -38,228 +38,270 @@ #include "impd_drc_rom.h" WORD32 impd_shape_filt_block_adapt(const FLOAT32 drc_gain, - shape_filter_block* shape_filter_block) -{ -// WORD32 err = 0; - WORD32 i; - FLOAT32 warpedGain, x1, y1; - shape_filter_block->drc_gain_last = drc_gain; - for (i=0; i<4; i++) { - - if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_OFF) - continue; - else if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_LF_CUT||shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_HF_CUT) - { - if (drc_gain < 1.0f) - warpedGain = -1.0f; - else - warpedGain = (drc_gain - 1.0f) / (drc_gain - 1.0f + shape_filter_block->shape_filter[i].gain_offset); - x1 = shape_filter_block->shape_filter[i].a1; - } - else if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_LF_BOOST||shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_HF_BOOST) - { - if (drc_gain >= 1.0f) - warpedGain = -1.0f; - else - warpedGain = (1.0f - drc_gain) / (1.0f + drc_gain * (shape_filter_block->shape_filter[i].gain_offset - 1.0f)); - x1 = shape_filter_block->shape_filter[i].b1; - + shape_filter_block* shape_filter_block) { + // WORD32 err = 0; + WORD32 i; + FLOAT32 warpedGain, x1, y1; + shape_filter_block->drc_gain_last = drc_gain; + for (i = 0; i < 4; i++) { + if (shape_filter_block->shape_filter[i].type == SHAPE_FILTER_TYPE_OFF) + continue; + else if (shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_LF_CUT || + shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_HF_CUT) { + if (drc_gain < 1.0f) + warpedGain = -1.0f; + else + warpedGain = + (drc_gain - 1.0f) / + (drc_gain - 1.0f + shape_filter_block->shape_filter[i].gain_offset); + x1 = shape_filter_block->shape_filter[i].a1; + } else if (shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_LF_BOOST || + shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_HF_BOOST) { + if (drc_gain >= 1.0f) + warpedGain = -1.0f; + else + warpedGain = + (1.0f - drc_gain) / + (1.0f + + drc_gain * + (shape_filter_block->shape_filter[i].gain_offset - 1.0f)); + x1 = shape_filter_block->shape_filter[i].b1; } - if (warpedGain <= 0.0f) - { - y1 = x1; - } - else if (warpedGain < shape_filter_block->shape_filter[i].warped_gain_max) { - y1 = x1 + shape_filter_block->shape_filter[i].factor * warpedGain; - } - else - { - y1 = shape_filter_block->shape_filter[i].y1_bound; + if (warpedGain <= 0.0f) { + y1 = x1; + } else if (warpedGain < + shape_filter_block->shape_filter[i].warped_gain_max) { + y1 = x1 + shape_filter_block->shape_filter[i].factor * warpedGain; + } else { + y1 = shape_filter_block->shape_filter[i].y1_bound; } - if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_LF_CUT) - { - shape_filter_block->shape_filter[i].b1 = y1; + if (shape_filter_block->shape_filter[i].type == SHAPE_FILTER_TYPE_LF_CUT) { + shape_filter_block->shape_filter[i].b1 = y1; + } else if (shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_HF_CUT) { + shape_filter_block->shape_filter[i].g_norm = + shape_filter_block->shape_filter[i].coeff_sum / + (shape_filter_block->shape_filter[i].partial_coeff_sum + y1); + shape_filter_block->shape_filter[i].b1 = y1; + } else if (shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_HF_BOOST) { + shape_filter_block->shape_filter[i].g_norm = + (shape_filter_block->shape_filter[i].partial_coeff_sum + y1) / + shape_filter_block->shape_filter[i].coeff_sum; + shape_filter_block->shape_filter[i].a1 = y1; + } else if (shape_filter_block->shape_filter[i].type == + SHAPE_FILTER_TYPE_LF_BOOST) { + shape_filter_block->shape_filter[i].a1 = y1; } - else if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_HF_CUT) - { - shape_filter_block->shape_filter[i].g_norm = shape_filter_block->shape_filter[i].coeff_sum / (shape_filter_block->shape_filter[i].partial_coeff_sum + y1); - shape_filter_block->shape_filter[i].b1 = y1; -} - else if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_HF_BOOST) -{ - shape_filter_block->shape_filter[i].g_norm = (shape_filter_block->shape_filter[i].partial_coeff_sum + y1) / shape_filter_block->shape_filter[i].coeff_sum; - shape_filter_block->shape_filter[i].a1 = y1; - } - else if(shape_filter_block->shape_filter[i].type==SHAPE_FILTER_TYPE_LF_BOOST) - { - shape_filter_block->shape_filter[i].a1 = y1; + } + return (0); } +WORD32 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); + for (i = 0; i < 4; i++) { + for (c = 0; c < MAX_CHANNEL_COUNT; c++) { + shape_filter_block->shape_filter[i].audio_in_state_1[c] = 0.0f; + shape_filter_block->shape_filter[i].audio_in_state_2[c] = 0.0f; + shape_filter_block->shape_filter[i].audio_out_state_1[c] = 0.0f; + shape_filter_block->shape_filter[i].audio_out_state_2[c] = 0.0f; } - return (0); + } + return (0); } -WORD32 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); - for (i=0; i<4; i++) { - for (c=0; c<MAX_CHANNEL_COUNT; c++) - { - shape_filter_block->shape_filter[i].audio_in_state_1[c] = 0.0f; - shape_filter_block->shape_filter[i].audio_in_state_2[c] = 0.0f; - shape_filter_block->shape_filter[i].audio_out_state_1[c] = 0.0f; - shape_filter_block->shape_filter[i].audio_out_state_2[c] = 0.0f; - } - } - return (0); -} - - -WORD32 impd_shape_filt_block_init(ia_shape_filter_block_params_struct* shape_flter_block_params, - shape_filter_block* shape_filter_block) -{ - //WORD32 err = 0; - FLOAT32 x1; - FLOAT32 x2 = 0.0f; - FLOAT32 radius; - if (shape_flter_block_params->lf_cut_filter_present) { - - ia_shape_filter_params_struct* params = &shape_flter_block_params->str_lf_cut_params; - shape_filter_block->shape_filter[0].type = SHAPE_FILTER_TYPE_LF_CUT; - shape_filter_block->shape_filter[0].gain_offset = shape_filt_lf_gain_offset_tbl[params->corner_freq_index][params->filter_strength_index]; - shape_filter_block->shape_filter[0].y1_bound = shape_filt_lf_y1_bound_tbl[params->corner_freq_index][params->filter_strength_index]; - x1 = - shape_filt_lf_radius_tbl[params->corner_freq_index]; - shape_filter_block->shape_filter[0].warped_gain_max = SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + shape_filter_block->shape_filter[0].gain_offset); - shape_filter_block->shape_filter[0].factor = (shape_filter_block->shape_filter[0].y1_bound - x1) / shape_filter_block->shape_filter[0].warped_gain_max; - shape_filter_block->shape_filter[0].a1 = x1; - - } - else - { - shape_filter_block->shape_filter[0].type = SHAPE_FILTER_TYPE_OFF; - } - if (shape_flter_block_params->lf_boost_filter_present) { - - ia_shape_filter_params_struct* params = &shape_flter_block_params->str_lf_boost_params; - shape_filter_block->shape_filter[1].type = SHAPE_FILTER_TYPE_LF_BOOST; - shape_filter_block->shape_filter[1].gain_offset = shape_filt_lf_gain_offset_tbl[params->corner_freq_index][params->filter_strength_index]; - shape_filter_block->shape_filter[1].y1_bound = shape_filt_lf_y1_bound_tbl[params->corner_freq_index][params->filter_strength_index]; - x1 = - shape_filt_lf_radius_tbl[params->corner_freq_index]; - shape_filter_block->shape_filter[1].warped_gain_max = SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + shape_filter_block->shape_filter[1].gain_offset); - shape_filter_block->shape_filter[1].factor = (shape_filter_block->shape_filter[1].y1_bound - x1) / shape_filter_block->shape_filter[1].warped_gain_max; - shape_filter_block->shape_filter[1].b1 = x1; +WORD32 impd_shape_filt_block_init( + ia_shape_filter_block_params_struct* shape_flter_block_params, + shape_filter_block* shape_filter_block) { + // WORD32 err = 0; + FLOAT32 x1; + FLOAT32 x2 = 0.0f; + FLOAT32 radius; + if (shape_flter_block_params->lf_cut_filter_present) { + ia_shape_filter_params_struct* params = + &shape_flter_block_params->str_lf_cut_params; + shape_filter_block->shape_filter[0].type = SHAPE_FILTER_TYPE_LF_CUT; + shape_filter_block->shape_filter[0].gain_offset = + shape_filt_lf_gain_offset_tbl[params->corner_freq_index] + [params->filter_strength_index]; + shape_filter_block->shape_filter[0].y1_bound = + shape_filt_lf_y1_bound_tbl[params->corner_freq_index] + [params->filter_strength_index]; + x1 = -shape_filt_lf_radius_tbl[params->corner_freq_index]; + shape_filter_block->shape_filter[0].warped_gain_max = + SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / + (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + + shape_filter_block->shape_filter[0].gain_offset); + shape_filter_block->shape_filter[0].factor = + (shape_filter_block->shape_filter[0].y1_bound - x1) / + shape_filter_block->shape_filter[0].warped_gain_max; + shape_filter_block->shape_filter[0].a1 = x1; - } - else - { - shape_filter_block->shape_filter[1].type = SHAPE_FILTER_TYPE_OFF; - } - if (shape_flter_block_params->hf_cut_filter_present) { - - ia_shape_filter_params_struct* params = &shape_flter_block_params->str_hfCutParams; - shape_filter_block->shape_filter[2].type = SHAPE_FILTER_TYPE_HF_CUT; - shape_filter_block->shape_filter[2].gain_offset = shape_filt_hf_gain_offset_tbl[params->corner_freq_index][params->filter_strength_index]; - shape_filter_block->shape_filter[2].y1_bound = shape_filt_hf_y1_bound_tbl[params->corner_freq_index][params->filter_strength_index]; - radius = shape_filt_hf_radius_tbl[params->corner_freq_index]; - x1 = (FLOAT32)(- 2.0f * radius * cos(2.0f * M_PI * shape_filt_cutoff_freq_norm_hf_tbl[params->corner_freq_index])); - x2 = radius * radius; - shape_filter_block->shape_filter[2].warped_gain_max = SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + shape_filter_block->shape_filter[2].gain_offset); - shape_filter_block->shape_filter[2].factor = (shape_filter_block->shape_filter[2].y1_bound - x1) / shape_filter_block->shape_filter[2].warped_gain_max; - shape_filter_block->shape_filter[2].coeff_sum = 1.0f + x1 + x2; - shape_filter_block->shape_filter[2].partial_coeff_sum = 1.0f + x2; - shape_filter_block->shape_filter[2].a1 = x1; - shape_filter_block->shape_filter[2].a2 = x2; - shape_filter_block->shape_filter[2].b2 = x2; - } - else - { - shape_filter_block->shape_filter[2].type = SHAPE_FILTER_TYPE_OFF; - } - if (shape_flter_block_params->hf_boost_filter_present) { + } else { + shape_filter_block->shape_filter[0].type = SHAPE_FILTER_TYPE_OFF; + } + if (shape_flter_block_params->lf_boost_filter_present) { + ia_shape_filter_params_struct* params = + &shape_flter_block_params->str_lf_boost_params; + shape_filter_block->shape_filter[1].type = SHAPE_FILTER_TYPE_LF_BOOST; + shape_filter_block->shape_filter[1].gain_offset = + shape_filt_lf_gain_offset_tbl[params->corner_freq_index] + [params->filter_strength_index]; + shape_filter_block->shape_filter[1].y1_bound = + shape_filt_lf_y1_bound_tbl[params->corner_freq_index] + [params->filter_strength_index]; + x1 = -shape_filt_lf_radius_tbl[params->corner_freq_index]; + shape_filter_block->shape_filter[1].warped_gain_max = + SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / + (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + + shape_filter_block->shape_filter[1].gain_offset); + shape_filter_block->shape_filter[1].factor = + (shape_filter_block->shape_filter[1].y1_bound - x1) / + shape_filter_block->shape_filter[1].warped_gain_max; + shape_filter_block->shape_filter[1].b1 = x1; - ia_shape_filter_params_struct* params = &shape_flter_block_params->str_hf_boost_params; - shape_filter_block->shape_filter[3].type = SHAPE_FILTER_TYPE_HF_BOOST; - shape_filter_block->shape_filter[3].gain_offset = shape_filt_hf_gain_offset_tbl[params->corner_freq_index][params->filter_strength_index]; - shape_filter_block->shape_filter[3].y1_bound = shape_filt_hf_y1_bound_tbl[params->corner_freq_index][params->filter_strength_index]; - radius = shape_filt_hf_radius_tbl[params->corner_freq_index]; - x1 = (FLOAT32)(- 2.0f * radius * cos(2.0f * M_PI * shape_filt_cutoff_freq_norm_hf_tbl[params->corner_freq_index])); - x2 = radius * radius; - shape_filter_block->shape_filter[3].warped_gain_max = SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + shape_filter_block->shape_filter[3].gain_offset); - shape_filter_block->shape_filter[3].factor = (shape_filter_block->shape_filter[3].y1_bound - x1) / shape_filter_block->shape_filter[3].warped_gain_max; - shape_filter_block->shape_filter[3].coeff_sum = 1.0f + x1 + x2; - shape_filter_block->shape_filter[3].partial_coeff_sum = 1.0f + x2; - shape_filter_block->shape_filter[3].b1 = x1; - shape_filter_block->shape_filter[3].b2 = x2; - shape_filter_block->shape_filter[3].a2 = x2; + } else { + shape_filter_block->shape_filter[1].type = SHAPE_FILTER_TYPE_OFF; + } + if (shape_flter_block_params->hf_cut_filter_present) { + ia_shape_filter_params_struct* params = + &shape_flter_block_params->str_hfCutParams; + shape_filter_block->shape_filter[2].type = SHAPE_FILTER_TYPE_HF_CUT; + shape_filter_block->shape_filter[2].gain_offset = + shape_filt_hf_gain_offset_tbl[params->corner_freq_index] + [params->filter_strength_index]; + shape_filter_block->shape_filter[2].y1_bound = + shape_filt_hf_y1_bound_tbl[params->corner_freq_index] + [params->filter_strength_index]; + radius = shape_filt_hf_radius_tbl[params->corner_freq_index]; + x1 = (FLOAT32)( + -2.0f * radius * + cos(2.0f * M_PI * + shape_filt_cutoff_freq_norm_hf_tbl[params->corner_freq_index])); + x2 = radius * radius; + shape_filter_block->shape_filter[2].warped_gain_max = + SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / + (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + + shape_filter_block->shape_filter[2].gain_offset); + shape_filter_block->shape_filter[2].factor = + (shape_filter_block->shape_filter[2].y1_bound - x1) / + shape_filter_block->shape_filter[2].warped_gain_max; + shape_filter_block->shape_filter[2].coeff_sum = 1.0f + x1 + x2; + shape_filter_block->shape_filter[2].partial_coeff_sum = 1.0f + x2; + shape_filter_block->shape_filter[2].a1 = x1; + shape_filter_block->shape_filter[2].a2 = x2; + shape_filter_block->shape_filter[2].b2 = x2; + } else { + shape_filter_block->shape_filter[2].type = SHAPE_FILTER_TYPE_OFF; + } + if (shape_flter_block_params->hf_boost_filter_present) { + ia_shape_filter_params_struct* params = + &shape_flter_block_params->str_hf_boost_params; + shape_filter_block->shape_filter[3].type = SHAPE_FILTER_TYPE_HF_BOOST; + shape_filter_block->shape_filter[3].gain_offset = + shape_filt_hf_gain_offset_tbl[params->corner_freq_index] + [params->filter_strength_index]; + shape_filter_block->shape_filter[3].y1_bound = + shape_filt_hf_y1_bound_tbl[params->corner_freq_index] + [params->filter_strength_index]; + radius = shape_filt_hf_radius_tbl[params->corner_freq_index]; + x1 = (FLOAT32)( + -2.0f * radius * + cos(2.0f * M_PI * + shape_filt_cutoff_freq_norm_hf_tbl[params->corner_freq_index])); + x2 = radius * radius; + shape_filter_block->shape_filter[3].warped_gain_max = + SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE / + (SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE + + shape_filter_block->shape_filter[3].gain_offset); + shape_filter_block->shape_filter[3].factor = + (shape_filter_block->shape_filter[3].y1_bound - x1) / + shape_filter_block->shape_filter[3].warped_gain_max; + shape_filter_block->shape_filter[3].coeff_sum = 1.0f + x1 + x2; + shape_filter_block->shape_filter[3].partial_coeff_sum = 1.0f + x2; + shape_filter_block->shape_filter[3].b1 = x1; + shape_filter_block->shape_filter[3].b2 = x2; + shape_filter_block->shape_filter[3].a2 = x2; - - } - else - { - shape_filter_block->shape_filter[3].type = SHAPE_FILTER_TYPE_OFF; - } - resetshape_flter_block(shape_filter_block); - shape_filter_block->shape_flter_block_flag = 1; - return (0); + } else { + shape_filter_block->shape_filter[3].type = SHAPE_FILTER_TYPE_OFF; + } + resetshape_flter_block(shape_filter_block); + shape_filter_block->shape_flter_block_flag = 1; + return (0); } +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; + FLOAT32 audio_out; + if (shape_filter_block->shape_flter_block_flag) { + for (i = start; i < end; i++) { + FLOAT32 tmp = audio_in[i]; + for (j = 0; j < 4; j++) { + if (shape_filter_block->shape_filter[j].type == + SHAPE_FILTER_TYPE_LF_CUT || + shape_filter_block->shape_filter[j].type == + SHAPE_FILTER_TYPE_LF_BOOST) { + audio_out = tmp + + shape_filter_block->shape_filter[j].b1 * + shape_filter_block->shape_filter[j] + .audio_in_state_1[channel] - + shape_filter_block->shape_filter[j].a1 * + shape_filter_block->shape_filter[j] + .audio_out_state_1[channel]; + shape_filter_block->shape_filter[j].audio_in_state_1[channel] = tmp; + shape_filter_block->shape_filter[j].audio_out_state_1[channel] = + audio_out; -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; - FLOAT32 audio_out; - - if(shape_filter_block->shape_flter_block_flag){ - for (i=start; i<end; i++) -{ - FLOAT32 tmp = audio_in[i]; - for (j=0; j<4; j++) { - if(shape_filter_block->shape_filter[j].type==SHAPE_FILTER_TYPE_LF_CUT||shape_filter_block->shape_filter[j].type==SHAPE_FILTER_TYPE_LF_BOOST){ - - audio_out = tmp + shape_filter_block->shape_filter[j].b1 * shape_filter_block->shape_filter[j].audio_in_state_1[channel] - - shape_filter_block->shape_filter[j].a1 * shape_filter_block->shape_filter[j].audio_out_state_1[channel]; - shape_filter_block->shape_filter[j].audio_in_state_1[channel] = tmp; - shape_filter_block->shape_filter[j].audio_out_state_1[channel] = audio_out; - - } - else if(shape_filter_block->shape_filter[j].type==SHAPE_FILTER_TYPE_HF_CUT||shape_filter_block->shape_filter[j].type==SHAPE_FILTER_TYPE_HF_BOOST){ - - audio_out = shape_filter_block->shape_filter[j].g_norm * tmp + shape_filter_block->shape_filter[j].b1 * shape_filter_block->shape_filter[j].audio_in_state_1[channel] - + shape_filter_block->shape_filter[j].b2 * shape_filter_block->shape_filter[j].audio_in_state_2[channel] - - shape_filter_block->shape_filter[j].a1 * shape_filter_block->shape_filter[j].audio_out_state_1[channel] - - shape_filter_block->shape_filter[j].a2 * shape_filter_block->shape_filter[j].audio_out_state_2[channel]; - shape_filter_block->shape_filter[j].audio_in_state_2[channel] = shape_filter_block->shape_filter[j].audio_in_state_1[channel]; - shape_filter_block->shape_filter[j].audio_in_state_1[channel] = shape_filter_block->shape_filter[j].g_norm * tmp; - shape_filter_block->shape_filter[j].audio_out_state_2[channel] = shape_filter_block->shape_filter[j].audio_out_state_1[channel]; - shape_filter_block->shape_filter[j].audio_out_state_1[channel] = audio_out; - } - else - { - audio_out = tmp; - } - tmp = audio_out; - - } - - audio_in[i] = audio_out * drc_gain[i]; + } else if (shape_filter_block->shape_filter[j].type == + SHAPE_FILTER_TYPE_HF_CUT || + shape_filter_block->shape_filter[j].type == + SHAPE_FILTER_TYPE_HF_BOOST) { + audio_out = shape_filter_block->shape_filter[j].g_norm * tmp + + shape_filter_block->shape_filter[j].b1 * + shape_filter_block->shape_filter[j] + .audio_in_state_1[channel] + + shape_filter_block->shape_filter[j].b2 * + shape_filter_block->shape_filter[j] + .audio_in_state_2[channel] - + shape_filter_block->shape_filter[j].a1 * + shape_filter_block->shape_filter[j] + .audio_out_state_1[channel] - + shape_filter_block->shape_filter[j].a2 * + shape_filter_block->shape_filter[j] + .audio_out_state_2[channel]; + shape_filter_block->shape_filter[j].audio_in_state_2[channel] = + shape_filter_block->shape_filter[j].audio_in_state_1[channel]; + shape_filter_block->shape_filter[j].audio_in_state_1[channel] = + shape_filter_block->shape_filter[j].g_norm * tmp; + shape_filter_block->shape_filter[j].audio_out_state_2[channel] = + shape_filter_block->shape_filter[j].audio_out_state_1[channel]; + shape_filter_block->shape_filter[j].audio_out_state_1[channel] = + audio_out; + } else { + audio_out = tmp; } + tmp = audio_out; + } + audio_in[i] = audio_out * drc_gain[i]; } - else{ - for (i=start; i<end; i++){ - audio_in[i] = audio_in[i] * drc_gain[i]; - } + } else { + for (i = start; i < end; i++) { + audio_in[i] = audio_in[i] * drc_gain[i]; } + } - return err; + return err; } diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c index 033674b..3f73f09 100644 --- a/decoder/drc_src/impd_drc_static_payload.c +++ b/decoder/drc_src/impd_drc_static_payload.c @@ -29,2522 +29,2351 @@ #include "impd_drc_filter_bank.h" #include "impd_drc_rom.h" +static VOID impd_parametric_drc_ffwd_init_drc_curve_params( + WORD32 drc_characteristic, ia_parametric_drc_type_feed_forward_struct* + str_parametric_drc_type_feed_forward) { + WORD32* node_level = str_parametric_drc_type_feed_forward->node_level; + WORD32* node_gain = str_parametric_drc_type_feed_forward->node_gain; -static VOID impd_parametric_drc_ffwd_init_drc_curve_params(WORD32 drc_characteristic, - ia_parametric_drc_type_feed_forward_struct* str_parametric_drc_type_feed_forward) -{ - WORD32* node_level = str_parametric_drc_type_feed_forward->node_level; - WORD32* node_gain = str_parametric_drc_type_feed_forward->node_gain; - - switch (drc_characteristic) { - case 7: - str_parametric_drc_type_feed_forward->node_count = 5; - node_level[0] = -22; node_gain[0] = 6; - node_level[1] = -10; node_gain[1] = 0; - node_level[2] = 10; node_gain[2] = 0; - node_level[3] = 20; node_gain[3] = -5; - node_level[4] = 40; node_gain[4] = -24; - break; - case 8: - str_parametric_drc_type_feed_forward->node_count = 5; - node_level[0] = -12; node_gain[0] = 6; - node_level[1] = 0; node_gain[1] = 0; - node_level[2] = 5; node_gain[2] = 0; - node_level[3] = 15; node_gain[3] = -5; - node_level[4] = 35; node_gain[4] = -24; - break; - case 9: - str_parametric_drc_type_feed_forward->node_count = 4; - node_level[0] = -34; node_gain[0] = 12; - node_level[1] = -10; node_gain[1] = 0; - node_level[2] = 10; node_gain[2] = 0; - node_level[3] = 40; node_gain[3] = -15; - break; - case 10: - str_parametric_drc_type_feed_forward->node_count = 5; - node_level[0] = -24; node_gain[0] = 12; - node_level[1] = 0; node_gain[1] = 0; - node_level[2] = 5; node_gain[2] = 0; - node_level[3] = 15; node_gain[3] = -5; - node_level[4] = 35; node_gain[4] = -24; - break; - case 11: - str_parametric_drc_type_feed_forward->node_count = 5; - node_level[0] = -19; node_gain[0] = 15; - node_level[1] = 0; node_gain[1] = 0; - node_level[2] = 5; node_gain[2] = 0; - node_level[3] = 15; node_gain[3] = -5; - node_level[4] = 35; node_gain[4] = -24; - break; - default: - str_parametric_drc_type_feed_forward->disable_paramteric_drc = 1; - } + switch (drc_characteristic) { + case 7: + str_parametric_drc_type_feed_forward->node_count = 5; + node_level[0] = -22; + node_gain[0] = 6; + node_level[1] = -10; + node_gain[1] = 0; + node_level[2] = 10; + node_gain[2] = 0; + node_level[3] = 20; + node_gain[3] = -5; + node_level[4] = 40; + node_gain[4] = -24; + break; + case 8: + str_parametric_drc_type_feed_forward->node_count = 5; + node_level[0] = -12; + node_gain[0] = 6; + node_level[1] = 0; + node_gain[1] = 0; + node_level[2] = 5; + node_gain[2] = 0; + node_level[3] = 15; + node_gain[3] = -5; + node_level[4] = 35; + node_gain[4] = -24; + break; + case 9: + str_parametric_drc_type_feed_forward->node_count = 4; + node_level[0] = -34; + node_gain[0] = 12; + node_level[1] = -10; + node_gain[1] = 0; + node_level[2] = 10; + node_gain[2] = 0; + node_level[3] = 40; + node_gain[3] = -15; + break; + case 10: + str_parametric_drc_type_feed_forward->node_count = 5; + node_level[0] = -24; + node_gain[0] = 12; + node_level[1] = 0; + node_gain[1] = 0; + node_level[2] = 5; + node_gain[2] = 0; + node_level[3] = 15; + node_gain[3] = -5; + node_level[4] = 35; + node_gain[4] = -24; + break; + case 11: + str_parametric_drc_type_feed_forward->node_count = 5; + node_level[0] = -19; + node_gain[0] = 15; + node_level[1] = 0; + node_gain[1] = 0; + node_level[2] = 5; + node_gain[2] = 0; + node_level[3] = 15; + node_gain[3] = -5; + node_level[4] = 35; + node_gain[4] = -24; + break; + default: + str_parametric_drc_type_feed_forward->disable_paramteric_drc = 1; + } - return; + return; } -static VOID impd_parametric_drc_ffwd_init_drc_gain_smooth_params(WORD32 drc_characteristic, - ia_parametric_drc_type_feed_forward_struct* str_parametric_drc_type_feed_forward) -{ - str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow = 100; - str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present = 1; - str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = 10; - str_parametric_drc_type_feed_forward->gain_smooth_threshold_present = 1; - str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present = 1; - str_parametric_drc_type_feed_forward->gain_smooth_hold_off = 10; - - switch (drc_characteristic) - { +static VOID impd_parametric_drc_ffwd_init_drc_gain_smooth_params( + WORD32 drc_characteristic, ia_parametric_drc_type_feed_forward_struct* + str_parametric_drc_type_feed_forward) { + str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow = 100; + str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present = 1; + str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = 10; + str_parametric_drc_type_feed_forward->gain_smooth_threshold_present = 1; + str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present = 1; + str_parametric_drc_type_feed_forward->gain_smooth_hold_off = 10; + + switch (drc_characteristic) { case 7: case 8: case 9: - str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 3000; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 1000; - str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; - str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; - break; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = + 3000; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = + 1000; + str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; + str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; + break; case 10: - str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 10000; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 1000; - str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; - str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; - break; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = + 10000; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = + 1000; + str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; + str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; + break; case 11: - str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 1000; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 200; - str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 10; - str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 10; - break; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = + 1000; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 200; + str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 10; + str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 10; + break; default: - str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = 3000; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = 1000; - str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; - str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; - break; - } - - return; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = + 3000; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = + 1000; + str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 15; + str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 20; + break; + } + + return; } -static WORD32 impd_parse_parametric_drc_ffwd(ia_bit_buf_struct* it_bit_buff, - WORD32 parametric_drc_frame_size, - ia_parametric_drc_type_feed_forward_struct* str_parametric_drc_type_feed_forward) -{ - WORD32 i = 0, tmp = 0; - //WORD32 err = 0; - - str_parametric_drc_type_feed_forward->disable_paramteric_drc = 0; - - tmp = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_type_feed_forward->level_estim_k_weighting_type = (tmp>>1)&3; - str_parametric_drc_type_feed_forward->level_estim_integration_time_present = tmp&1; - - if (str_parametric_drc_type_feed_forward->level_estim_integration_time_present) - { - tmp = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - str_parametric_drc_type_feed_forward->level_estim_integration_time = (tmp+1)*parametric_drc_frame_size; - } else - { - str_parametric_drc_type_feed_forward->level_estim_integration_time = parametric_drc_frame_size; - } - - str_parametric_drc_type_feed_forward->drc_curve_definition_type = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_parametric_drc_type_feed_forward->drc_curve_definition_type == 0) - { - str_parametric_drc_type_feed_forward->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - impd_parametric_drc_ffwd_init_drc_curve_params(str_parametric_drc_type_feed_forward->drc_characteristic, str_parametric_drc_type_feed_forward); - } - else - { - str_parametric_drc_type_feed_forward->drc_characteristic = 0; - - tmp = impd_read_bits_buf(it_bit_buff, 15); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_type_feed_forward->node_count = ((tmp>>12)&3) + 2; - str_parametric_drc_type_feed_forward->node_level[0] = -11-((tmp>>6)&0x3f); - str_parametric_drc_type_feed_forward->node_gain[0] = (tmp&0x3f)-39; - - for (i=1; i<str_parametric_drc_type_feed_forward->node_count; i++) - { - tmp = impd_read_bits_buf(it_bit_buff, 11); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_type_feed_forward->node_level[i] = str_parametric_drc_type_feed_forward->node_level[i-1]+1+((tmp>>6)&0x1f); - str_parametric_drc_type_feed_forward->node_gain[i] = (tmp&0x3f)-39; - } - } - - impd_parametric_drc_ffwd_init_drc_gain_smooth_params(str_parametric_drc_type_feed_forward->drc_characteristic, str_parametric_drc_type_feed_forward); - - str_parametric_drc_type_feed_forward->drc_gain_smooth_parameters_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_parametric_drc_type_feed_forward->drc_gain_smooth_parameters_present) - { - - tmp = impd_read_bits_buf(it_bit_buff, 17); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow = ((tmp>>9)&0xff)*5; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = ((tmp>>1)&0xff)*40; - str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present = tmp&1; - - if (str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present) - { - - tmp = impd_read_bits_buf(it_bit_buff, 17); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = ((tmp>>9)&0xff)*5; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = ((tmp>>1)&0xff)*20; - str_parametric_drc_type_feed_forward->gain_smooth_threshold_present = tmp&1; - - if (str_parametric_drc_type_feed_forward->gain_smooth_threshold_present) - { - str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - if ( str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold == 31) - { - str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = 1000; - } - - str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold == 31) - { - str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = 1000; - } - } - } - else - { - str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow; - str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow; - } - - str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present) - { - str_parametric_drc_type_feed_forward->gain_smooth_hold_off = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - return 0; +static WORD32 impd_parse_parametric_drc_ffwd( + ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size, + ia_parametric_drc_type_feed_forward_struct* + str_parametric_drc_type_feed_forward) { + WORD32 i = 0, tmp = 0; + // WORD32 err = 0; + + str_parametric_drc_type_feed_forward->disable_paramteric_drc = 0; + + tmp = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_type_feed_forward->level_estim_k_weighting_type = + (tmp >> 1) & 3; + str_parametric_drc_type_feed_forward->level_estim_integration_time_present = + tmp & 1; + + if (str_parametric_drc_type_feed_forward + ->level_estim_integration_time_present) { + tmp = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + str_parametric_drc_type_feed_forward->level_estim_integration_time = + (tmp + 1) * parametric_drc_frame_size; + } else { + str_parametric_drc_type_feed_forward->level_estim_integration_time = + parametric_drc_frame_size; + } + + str_parametric_drc_type_feed_forward->drc_curve_definition_type = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_parametric_drc_type_feed_forward->drc_curve_definition_type == 0) { + str_parametric_drc_type_feed_forward->drc_characteristic = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + impd_parametric_drc_ffwd_init_drc_curve_params( + str_parametric_drc_type_feed_forward->drc_characteristic, + str_parametric_drc_type_feed_forward); + } else { + str_parametric_drc_type_feed_forward->drc_characteristic = 0; + + tmp = impd_read_bits_buf(it_bit_buff, 15); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_type_feed_forward->node_count = ((tmp >> 12) & 3) + 2; + str_parametric_drc_type_feed_forward->node_level[0] = + -11 - ((tmp >> 6) & 0x3f); + str_parametric_drc_type_feed_forward->node_gain[0] = (tmp & 0x3f) - 39; + + for (i = 1; i < str_parametric_drc_type_feed_forward->node_count; i++) { + tmp = impd_read_bits_buf(it_bit_buff, 11); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_type_feed_forward->node_level[i] = + str_parametric_drc_type_feed_forward->node_level[i - 1] + 1 + + ((tmp >> 6) & 0x1f); + str_parametric_drc_type_feed_forward->node_gain[i] = (tmp & 0x3f) - 39; + } + } + + impd_parametric_drc_ffwd_init_drc_gain_smooth_params( + str_parametric_drc_type_feed_forward->drc_characteristic, + str_parametric_drc_type_feed_forward); + + str_parametric_drc_type_feed_forward->drc_gain_smooth_parameters_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_parametric_drc_type_feed_forward + ->drc_gain_smooth_parameters_present) { + tmp = impd_read_bits_buf(it_bit_buff, 17); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow = + ((tmp >> 9) & 0xff) * 5; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow = + ((tmp >> 1) & 0xff) * 40; + str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present = + tmp & 1; + + if (str_parametric_drc_type_feed_forward->gain_smooth_time_fast_present) { + tmp = impd_read_bits_buf(it_bit_buff, 17); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = + ((tmp >> 9) & 0xff) * 5; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = + ((tmp >> 1) & 0xff) * 20; + str_parametric_drc_type_feed_forward->gain_smooth_threshold_present = + tmp & 1; + + if (str_parametric_drc_type_feed_forward->gain_smooth_threshold_present) { + str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = + impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_parametric_drc_type_feed_forward + ->gain_smooth_attack_threshold == 31) { + str_parametric_drc_type_feed_forward->gain_smooth_attack_threshold = + 1000; + } + + str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = + impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold == + 31) { + str_parametric_drc_type_feed_forward->gain_smooth_rel_threshold = + 1000; + } + } + } else { + str_parametric_drc_type_feed_forward->gain_smooth_attack_time_fast = + str_parametric_drc_type_feed_forward->gain_smooth_attack_time_slow; + str_parametric_drc_type_feed_forward->gain_smooth_release_time_fast = + str_parametric_drc_type_feed_forward->gain_smooth_release_time_slow; + } + + str_parametric_drc_type_feed_forward->gain_smooth_hold_off_count_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_parametric_drc_type_feed_forward + ->gain_smooth_hold_off_count_present) { + str_parametric_drc_type_feed_forward->gain_smooth_hold_off = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } + } + return 0; } -static WORD32 impd_parse_parametric_drc_lim(ia_bit_buf_struct* it_bit_buff, - ia_parametric_drc_lim_struct* parametric_drc_lim) -{ - //WORD32 err = 0; - WORD32 tmp = 0; - - parametric_drc_lim->disable_paramteric_drc = 0; - - parametric_drc_lim->parametric_lim_threshold_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (parametric_drc_lim->parametric_lim_threshold_present) - { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - parametric_drc_lim->parametric_lim_threshold = - tmp * 0.125f; - } else - { - parametric_drc_lim->parametric_lim_threshold = PARAM_DRC_TYPE_LIM_THRESHOLD_DEFAULT; - } - - parametric_drc_lim->parametric_lim_release_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (parametric_drc_lim->parametric_lim_release_present) - { - tmp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - parametric_drc_lim->parametric_lim_release = tmp*10; - } - else - { - parametric_drc_lim->parametric_lim_release = PARAM_DRC_TYPE_LIM_RELEASE_DEFAULT; - } - - parametric_drc_lim->parametric_lim_attack = PARAM_DRC_TYPE_LIM_ATTACK_DEFAULT; - parametric_drc_lim->drc_characteristic = 0; - - return 0; +static WORD32 impd_parse_parametric_drc_lim( + ia_bit_buf_struct* it_bit_buff, + ia_parametric_drc_lim_struct* parametric_drc_lim) { + // WORD32 err = 0; + WORD32 tmp = 0; + + parametric_drc_lim->disable_paramteric_drc = 0; + + parametric_drc_lim->parametric_lim_threshold_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (parametric_drc_lim->parametric_lim_threshold_present) { + tmp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + parametric_drc_lim->parametric_lim_threshold = -tmp * 0.125f; + } else { + parametric_drc_lim->parametric_lim_threshold = + PARAM_DRC_TYPE_LIM_THRESHOLD_DEFAULT; + } + + parametric_drc_lim->parametric_lim_release_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (parametric_drc_lim->parametric_lim_release_present) { + tmp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + parametric_drc_lim->parametric_lim_release = tmp * 10; + } else { + parametric_drc_lim->parametric_lim_release = + PARAM_DRC_TYPE_LIM_RELEASE_DEFAULT; + } + + parametric_drc_lim->parametric_lim_attack = PARAM_DRC_TYPE_LIM_ATTACK_DEFAULT; + parametric_drc_lim->drc_characteristic = 0; + + return 0; } WORD32 -impd_parametric_drc_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, - ia_drc_config* drc_config, - ia_parametric_drc_gain_set_params_struct* str_parametric_drc_gain_set_params) -{ - WORD32 i = 0, bsDrcInputLoudness = 0, bs_channel_weight = 0, temp; - //WORD32 err = 0; - temp = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - - 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) - { - - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_gain_set_params->downmix_id = (temp>>1)&0x7f; - str_parametric_drc_gain_set_params->level_estim_channel_weight_format = temp&1; - - if (str_parametric_drc_gain_set_params->downmix_id == ID_FOR_BASE_LAYOUT) - { - str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = drc_config->channel_layout.base_channel_count; - } - else if (str_parametric_drc_gain_set_params->downmix_id == ID_FOR_ANY_DOWNMIX) - { - str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 1; - } else - { - for(i=0; i<drc_config->dwnmix_instructions_count; i++) - { - if (str_parametric_drc_gain_set_params->downmix_id == drc_config->dwnmix_instructions[i].downmix_id) break; - } - if (i == drc_config->dwnmix_instructions_count) - { - /* dwnmix_instructions not found */ - return(UNEXPECTED_ERROR); - } - str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = drc_config->dwnmix_instructions[i].target_channel_count; - } - - for (i=0; i<str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id; i++) - { - if (str_parametric_drc_gain_set_params->level_estim_channel_weight_format == 0) - { - str_parametric_drc_gain_set_params->level_estim_ch_weight[i] = (FLOAT32)impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } else - { - bs_channel_weight = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - str_parametric_drc_gain_set_params->level_estim_ch_weight[i] = (FLOAT32)pow(10.0f, 0.05f * channel_weight[bs_channel_weight]); - } - } - } - else - { - str_parametric_drc_gain_set_params->downmix_id = 0; - str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 0; - } - - str_parametric_drc_gain_set_params->drc_input_loudness_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_parametric_drc_gain_set_params->drc_input_loudness_present) - { - bsDrcInputLoudness = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - str_parametric_drc_gain_set_params->drc_input_loudness = -57.75f + bsDrcInputLoudness * 0.25f; - } - - return 0; +impd_parametric_drc_parse_gain_set_params( + ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, + ia_parametric_drc_gain_set_params_struct* + str_parametric_drc_gain_set_params) { + WORD32 i = 0, bsDrcInputLoudness = 0, bs_channel_weight = 0, temp; + // WORD32 err = 0; + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + + 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) { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_gain_set_params->downmix_id = (temp >> 1) & 0x7f; + str_parametric_drc_gain_set_params->level_estim_channel_weight_format = + temp & 1; + + if (str_parametric_drc_gain_set_params->downmix_id == ID_FOR_BASE_LAYOUT) { + str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = + drc_config->channel_layout.base_channel_count; + } else if (str_parametric_drc_gain_set_params->downmix_id == + ID_FOR_ANY_DOWNMIX) { + str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 1; + } else { + for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { + if (str_parametric_drc_gain_set_params->downmix_id == + drc_config->dwnmix_instructions[i].downmix_id) + break; + } + if (i == drc_config->dwnmix_instructions_count) { + /* dwnmix_instructions not found */ + return (UNEXPECTED_ERROR); + } + str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = + drc_config->dwnmix_instructions[i].target_channel_count; + } + + for (i = 0; i < str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id; + i++) { + if (str_parametric_drc_gain_set_params + ->level_estim_channel_weight_format == 0) { + str_parametric_drc_gain_set_params->level_estim_ch_weight[i] = + (FLOAT32)impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + bs_channel_weight = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + str_parametric_drc_gain_set_params->level_estim_ch_weight[i] = + (FLOAT32)pow(10.0f, 0.05f * channel_weight[bs_channel_weight]); + } + } + } else { + str_parametric_drc_gain_set_params->downmix_id = 0; + str_parametric_drc_gain_set_params->ch_count_from_dwnmix_id = 0; + } + + str_parametric_drc_gain_set_params->drc_input_loudness_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_parametric_drc_gain_set_params->drc_input_loudness_present) { + bsDrcInputLoudness = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + str_parametric_drc_gain_set_params->drc_input_loudness = + -57.75f + bsDrcInputLoudness * 0.25f; + } + + return 0; } -static WORD32 impd_parametric_drc_gen_virtual_gain_sets(ia_drc_config* drc_config) -{ - - WORD32 i = 0, j = 0, c1 = -1, c0 = -1, parametric_drc_id = 0, drc_characteristic = 0; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; - ia_parametric_drc_instructions_struct* str_parametric_drc_instructions; - ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = &(drc_config->str_drc_config_ext.str_drc_coeff_param_drc); - - for(i=0; i<drc_config->drc_coefficients_drc_count; i++) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].drc_location == str_drc_coeff_param_drc->drc_location) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].version == 0) - { - c0 = i; - } - else - { - c1 = i; - } - } - } - if (c1 >= 0) - { - str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); - } - else if (c0 >= 0) - { - str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); - } - else - { - str_p_loc_drc_coefficients_uni_drc = &drc_config->str_p_loc_drc_coefficients_uni_drc[drc_config->drc_coefficients_drc_count]; - - str_p_loc_drc_coefficients_uni_drc->version = 1; - str_p_loc_drc_coefficients_uni_drc->drc_location = str_drc_coeff_param_drc->drc_location; - str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = 0; - - str_p_loc_drc_coefficients_uni_drc->gain_set_count = 0; - str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 0; - - str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; - str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; - str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; - 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; - 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; - - parametric_drc_id = drc_config->str_drc_config_ext.str_drc_coeff_param_drc.str_parametric_drc_gain_set_params[i-str_p_loc_drc_coefficients_uni_drc->gain_set_count].parametric_drc_id; - - for(j=0; j<drc_config->str_drc_config_ext.parametric_drc_instructions_count; j++) - { - if (parametric_drc_id == drc_config->str_drc_config_ext.str_parametric_drc_instructions[j].parametric_drc_id) break; - } - if (j == drc_config->str_drc_config_ext.parametric_drc_instructions_count) - { - /* str_parametric_drc_instructions not found */ - return(UNEXPECTED_ERROR); - } - str_parametric_drc_instructions = &drc_config->str_drc_config_ext.str_parametric_drc_instructions[j]; - - drc_characteristic = 0; - if (str_parametric_drc_instructions->parametric_drc_preset_id_present) - { - drc_characteristic = str_parametric_drc_instructions->drc_characteristic; - } - else if (str_parametric_drc_instructions->parametric_drc_type == PARAM_DRC_TYPE_FF) - { - if (str_parametric_drc_instructions->str_parametric_drc_type_feed_forward.drc_curve_definition_type == 0) - { - drc_characteristic = str_parametric_drc_instructions->str_parametric_drc_type_feed_forward.drc_characteristic; - } - } - if (drc_characteristic != 0) - { - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[0].drc_characteristic_present = 1; - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[0].drc_characteristic_format_is_cicp = 1; - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[0].drc_characteristic = drc_characteristic; - } - else - { - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[0].drc_characteristic_present = 0; - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[0].drc_characteristic_format_is_cicp = 0; - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[0].drc_characteristic = 0; - } +static WORD32 impd_parametric_drc_gen_virtual_gain_sets( + ia_drc_config* drc_config) { + WORD32 i = 0, j = 0, c1 = -1, c0 = -1, parametric_drc_id = 0, + drc_characteristic = 0; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc; + ia_parametric_drc_instructions_struct* str_parametric_drc_instructions; + ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = + &(drc_config->str_drc_config_ext.str_drc_coeff_param_drc); + + for (i = 0; i < drc_config->drc_coefficients_drc_count; i++) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].drc_location == + str_drc_coeff_param_drc->drc_location) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[i].version == 0) { + c0 = i; + } else { + c1 = i; + } + } + } + if (c1 >= 0) { + str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); + } else if (c0 >= 0) { + str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); + } else { + str_p_loc_drc_coefficients_uni_drc = + &drc_config->str_p_loc_drc_coefficients_uni_drc + [drc_config->drc_coefficients_drc_count]; + + str_p_loc_drc_coefficients_uni_drc->version = 1; + str_p_loc_drc_coefficients_uni_drc->drc_location = + str_drc_coeff_param_drc->drc_location; + str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = 0; + + str_p_loc_drc_coefficients_uni_drc->gain_set_count = 0; + str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = 0; + + str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; + str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; + str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; + 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; + 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; + + parametric_drc_id = + drc_config->str_drc_config_ext.str_drc_coeff_param_drc + .str_parametric_drc_gain_set_params + [i - str_p_loc_drc_coefficients_uni_drc->gain_set_count] + .parametric_drc_id; + + for (j = 0; + j < drc_config->str_drc_config_ext.parametric_drc_instructions_count; + j++) { + if (parametric_drc_id == + drc_config->str_drc_config_ext.str_parametric_drc_instructions[j] + .parametric_drc_id) + break; } - - return 0; + if (j == drc_config->str_drc_config_ext.parametric_drc_instructions_count) { + /* str_parametric_drc_instructions not found */ + return (UNEXPECTED_ERROR); + } + str_parametric_drc_instructions = + &drc_config->str_drc_config_ext.str_parametric_drc_instructions[j]; + + drc_characteristic = 0; + if (str_parametric_drc_instructions->parametric_drc_preset_id_present) { + drc_characteristic = str_parametric_drc_instructions->drc_characteristic; + } else if (str_parametric_drc_instructions->parametric_drc_type == + PARAM_DRC_TYPE_FF) { + if (str_parametric_drc_instructions->str_parametric_drc_type_feed_forward + .drc_curve_definition_type == 0) { + drc_characteristic = + str_parametric_drc_instructions + ->str_parametric_drc_type_feed_forward.drc_characteristic; + } + } + if (drc_characteristic != 0) { + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[0] + .drc_characteristic_present = 1; + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[0] + .drc_characteristic_format_is_cicp = 1; + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[0] + .drc_characteristic = drc_characteristic; + } else { + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[0] + .drc_characteristic_present = 0; + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[0] + .drc_characteristic_format_is_cicp = 0; + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[0] + .drc_characteristic = 0; + } + } + + return 0; } +static WORD32 impd_parametic_drc_parse_coeff( + ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, + ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc) { + WORD32 i = 0, err = 0, code = 0, mu = 0, nu = 0, temp; + + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + str_drc_coeff_param_drc->drc_location = (temp >> 1) & 0xf; + str_drc_coeff_param_drc->parametric_drc_frame_size_format = temp & 1; + + if (str_drc_coeff_param_drc->parametric_drc_frame_size) { + 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; + } else { + code = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_coeff_param_drc->parametric_drc_frame_size = 1 << code; + } + + str_drc_coeff_param_drc->parametric_drc_delay_max_present = + impd_read_bits_buf(it_bit_buff, 1); + 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; -static WORD32 impd_parametic_drc_parse_coeff(ia_bit_buf_struct* it_bit_buff, - ia_drc_config* drc_config, - ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc) -{ - WORD32 i = 0, err = 0, code = 0, mu = 0, nu = 0, temp; - - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_drc_coeff_param_drc->drc_location = (temp>>1)&0xf; - str_drc_coeff_param_drc->parametric_drc_frame_size_format = temp&1; - - if (str_drc_coeff_param_drc->parametric_drc_frame_size) - { - 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; - } - else - { - code = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_coeff_param_drc->parametric_drc_frame_size = 1 << code; - } - - str_drc_coeff_param_drc->parametric_drc_delay_max_present = impd_read_bits_buf(it_bit_buff, 1); - 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; + mu = (temp >> 3) & 0x1f; + nu = temp & 3; - mu = (temp>>3)&0x1f; - nu = temp&3; + str_drc_coeff_param_drc->parametric_drc_delay_max = 16 * mu * (1 << nu); + } - str_drc_coeff_param_drc->parametric_drc_delay_max = 16 * mu * (1<<nu); - } + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - temp = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + str_drc_coeff_param_drc->reset_parametric_drc = (temp >> 6) & 1; + str_drc_coeff_param_drc->parametric_drc_gain_set_count = temp & 0x3f; - str_drc_coeff_param_drc->reset_parametric_drc = (temp>>6)&1; - str_drc_coeff_param_drc->parametric_drc_gain_set_count = temp&0x3f; - - for(i=0; i<str_drc_coeff_param_drc->parametric_drc_gain_set_count; i++) - { - err = impd_parametric_drc_parse_gain_set_params(it_bit_buff, drc_config, &(str_drc_coeff_param_drc->str_parametric_drc_gain_set_params[i])); - if (err) return (err); - } + for (i = 0; i < str_drc_coeff_param_drc->parametric_drc_gain_set_count; i++) { + err = impd_parametric_drc_parse_gain_set_params( + it_bit_buff, drc_config, + &(str_drc_coeff_param_drc->str_parametric_drc_gain_set_params[i])); + if (err) return (err); + } - return 0; + return 0; } -static WORD32 impd_parse_parametric_drc_instructions(ia_bit_buf_struct* it_bit_buff, - WORD32 parametric_drc_frame_size, - ia_parametric_drc_instructions_struct* str_parametric_drc_instructions) -{ - WORD32 i = 0, err = 0, temp; - WORD32 bit_size_len, bit_size, other_bit; - - str_parametric_drc_instructions->drc_characteristic = 0; - str_parametric_drc_instructions->disable_paramteric_drc = 0; - - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_parametric_drc_instructions->parametric_drc_id = (temp>>1)&0xf; - str_parametric_drc_instructions->parametric_drc_look_ahead_flag = temp&1; +static WORD32 impd_parse_parametric_drc_instructions( + ia_bit_buf_struct* it_bit_buff, WORD32 parametric_drc_frame_size, + ia_parametric_drc_instructions_struct* str_parametric_drc_instructions) { + WORD32 i = 0, err = 0, temp; + WORD32 bit_size_len, bit_size, other_bit; + + str_parametric_drc_instructions->drc_characteristic = 0; + str_parametric_drc_instructions->disable_paramteric_drc = 0; + + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + str_parametric_drc_instructions->parametric_drc_id = (temp >> 1) & 0xf; + str_parametric_drc_instructions->parametric_drc_look_ahead_flag = temp & 1; + + if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { + str_parametric_drc_instructions->parametric_drc_look_ahead = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + str_parametric_drc_instructions->parametric_drc_look_ahead = 0; + } + + str_parametric_drc_instructions->parametric_drc_preset_id_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_parametric_drc_instructions->parametric_drc_preset_id_present) { + str_parametric_drc_instructions->parametric_drc_preset_id = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + + switch (str_parametric_drc_instructions->parametric_drc_preset_id) { + case 0: + case 1: + case 2: + case 3: + case 4: + str_parametric_drc_instructions->drc_characteristic = + str_parametric_drc_instructions->parametric_drc_preset_id + 7; + str_parametric_drc_instructions->parametric_drc_type = + PARAM_DRC_TYPE_FF; + + str_parametric_drc_instructions->str_parametric_drc_type_feed_forward + .level_estim_k_weighting_type = 2; + str_parametric_drc_instructions->str_parametric_drc_type_feed_forward + .level_estim_integration_time = parametric_drc_frame_size; + + impd_parametric_drc_ffwd_init_drc_curve_params( + str_parametric_drc_instructions->drc_characteristic, + &str_parametric_drc_instructions + ->str_parametric_drc_type_feed_forward); + impd_parametric_drc_ffwd_init_drc_gain_smooth_params( + str_parametric_drc_instructions->drc_characteristic, + &str_parametric_drc_instructions + ->str_parametric_drc_type_feed_forward); - if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) - { - str_parametric_drc_instructions->parametric_drc_look_ahead = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - else - { - str_parametric_drc_instructions->parametric_drc_look_ahead = 0; + break; + default: + str_parametric_drc_instructions->disable_paramteric_drc = 1; + break; } - - str_parametric_drc_instructions->parametric_drc_preset_id_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_parametric_drc_instructions->parametric_drc_preset_id_present) - { - str_parametric_drc_instructions->parametric_drc_preset_id = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - - switch (str_parametric_drc_instructions->parametric_drc_preset_id) - { - case 0: - case 1: - case 2: - case 3: - case 4: - str_parametric_drc_instructions->drc_characteristic = str_parametric_drc_instructions->parametric_drc_preset_id + 7; - str_parametric_drc_instructions->parametric_drc_type = PARAM_DRC_TYPE_FF; - - str_parametric_drc_instructions->str_parametric_drc_type_feed_forward.level_estim_k_weighting_type = 2; - str_parametric_drc_instructions->str_parametric_drc_type_feed_forward.level_estim_integration_time = parametric_drc_frame_size; - - impd_parametric_drc_ffwd_init_drc_curve_params(str_parametric_drc_instructions->drc_characteristic, &str_parametric_drc_instructions->str_parametric_drc_type_feed_forward); - impd_parametric_drc_ffwd_init_drc_gain_smooth_params(str_parametric_drc_instructions->drc_characteristic, &str_parametric_drc_instructions->str_parametric_drc_type_feed_forward); - - break; + } else { + str_parametric_drc_instructions->parametric_drc_type = + impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_parametric_drc_instructions->parametric_drc_type == + PARAM_DRC_TYPE_FF) { + err = impd_parse_parametric_drc_ffwd( + it_bit_buff, parametric_drc_frame_size, + &(str_parametric_drc_instructions + ->str_parametric_drc_type_feed_forward)); + if (err) return (err); + str_parametric_drc_instructions->disable_paramteric_drc = + str_parametric_drc_instructions->str_parametric_drc_type_feed_forward + .disable_paramteric_drc; + str_parametric_drc_instructions->drc_characteristic = + str_parametric_drc_instructions->str_parametric_drc_type_feed_forward + .drc_characteristic; + } else if (str_parametric_drc_instructions->parametric_drc_type == + PARAM_DRC_TYPE_LIM) { + err = impd_parse_parametric_drc_lim( + it_bit_buff, &(str_parametric_drc_instructions->parametric_drc_lim)); + if (err) return (err); + str_parametric_drc_instructions->disable_paramteric_drc = + str_parametric_drc_instructions->parametric_drc_lim + .disable_paramteric_drc; + str_parametric_drc_instructions->drc_characteristic = + str_parametric_drc_instructions->parametric_drc_lim + .drc_characteristic; + if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) { + str_parametric_drc_instructions->parametric_drc_lim + .parametric_lim_attack = + str_parametric_drc_instructions->parametric_drc_look_ahead; + } + } else { + bit_size_len = impd_read_bits_buf(it_bit_buff, 3) + 4; + if (it_bit_buff->error) return it_bit_buff->error; + + bit_size = impd_read_bits_buf(it_bit_buff, bit_size_len); + if (it_bit_buff->error) return it_bit_buff->error; + str_parametric_drc_instructions->len_bit_size = bit_size + 1; + + switch (str_parametric_drc_instructions->parametric_drc_type) { default: - str_parametric_drc_instructions->disable_paramteric_drc = 1; - break; - } - } - else - { - str_parametric_drc_instructions->parametric_drc_type = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_parametric_drc_instructions->parametric_drc_type == PARAM_DRC_TYPE_FF) - { - err = impd_parse_parametric_drc_ffwd(it_bit_buff, parametric_drc_frame_size, &(str_parametric_drc_instructions->str_parametric_drc_type_feed_forward)); - if (err) return (err); - str_parametric_drc_instructions->disable_paramteric_drc = str_parametric_drc_instructions->str_parametric_drc_type_feed_forward.disable_paramteric_drc; - str_parametric_drc_instructions->drc_characteristic = str_parametric_drc_instructions->str_parametric_drc_type_feed_forward.drc_characteristic; - } - else if (str_parametric_drc_instructions->parametric_drc_type == PARAM_DRC_TYPE_LIM) - { - err = impd_parse_parametric_drc_lim(it_bit_buff, &(str_parametric_drc_instructions->parametric_drc_lim)); - if (err) return (err); - str_parametric_drc_instructions->disable_paramteric_drc = str_parametric_drc_instructions->parametric_drc_lim.disable_paramteric_drc; - str_parametric_drc_instructions->drc_characteristic = str_parametric_drc_instructions->parametric_drc_lim.drc_characteristic; - if (str_parametric_drc_instructions->parametric_drc_look_ahead_flag) - { - str_parametric_drc_instructions->parametric_drc_lim.parametric_lim_attack = str_parametric_drc_instructions->parametric_drc_look_ahead; - } - } - else - { - bit_size_len = impd_read_bits_buf(it_bit_buff, 3) + 4; - if(it_bit_buff->error) - return it_bit_buff->error; - - bit_size = impd_read_bits_buf(it_bit_buff, bit_size_len); - if(it_bit_buff->error) - return it_bit_buff->error; - str_parametric_drc_instructions->len_bit_size = bit_size + 1; - - switch(str_parametric_drc_instructions->parametric_drc_type) - { - - default: - str_parametric_drc_instructions->disable_paramteric_drc = 1; - for(i = 0; i<str_parametric_drc_instructions->len_bit_size; i++) - { - other_bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - break; - } - } + str_parametric_drc_instructions->disable_paramteric_drc = 1; + for (i = 0; i < str_parametric_drc_instructions->len_bit_size; i++) { + other_bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + break; + } } + } - return 0; + return 0; } -WORD32 impd_parse_loud_info_set_ext_eq(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* loudness_info_set) -{ - WORD32 err, i, offset, version = 1, temp; - WORD32 loudness_info_v1_album_cnt, loudness_info_v1_cnt; +WORD32 impd_parse_loud_info_set_ext_eq( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* loudness_info_set) { + WORD32 err, i, offset, version = 1, temp; + WORD32 loudness_info_v1_album_cnt, loudness_info_v1_cnt; - temp = impd_read_bits_buf(it_bit_buff, 12); - if(it_bit_buff->error) - return it_bit_buff->error; - - loudness_info_v1_album_cnt = (temp>>6)&0x3f; - loudness_info_v1_cnt = temp&0x3f; - - offset = loudness_info_set->loudness_info_album_count; - loudness_info_set->loudness_info_album_count += loudness_info_v1_album_cnt; - for (i=0; i<loudness_info_v1_album_cnt; i++) - { - err = impd_parse_loudness_info(it_bit_buff, version, &loudness_info_set->str_loudness_info_album[i + offset]); - if (err) return(err); - } - offset = loudness_info_set->loudness_info_count; - loudness_info_set->loudness_info_count += loudness_info_v1_cnt; - for (i=0; i<loudness_info_v1_cnt; i++) - { - err = impd_parse_loudness_info(it_bit_buff, version, &loudness_info_set->loudness_info[i + offset]); - if (err) return(err); - } - return (0); + temp = impd_read_bits_buf(it_bit_buff, 12); + if (it_bit_buff->error) return it_bit_buff->error; + + loudness_info_v1_album_cnt = (temp >> 6) & 0x3f; + loudness_info_v1_cnt = temp & 0x3f; + + offset = loudness_info_set->loudness_info_album_count; + loudness_info_set->loudness_info_album_count += loudness_info_v1_album_cnt; + for (i = 0; i < loudness_info_v1_album_cnt; i++) { + err = impd_parse_loudness_info( + it_bit_buff, version, + &loudness_info_set->str_loudness_info_album[i + offset]); + if (err) return (err); + } + offset = loudness_info_set->loudness_info_count; + loudness_info_set->loudness_info_count += loudness_info_v1_cnt; + for (i = 0; i < loudness_info_v1_cnt; i++) { + err = impd_parse_loudness_info( + it_bit_buff, version, &loudness_info_set->loudness_info[i + offset]); + if (err) return (err); + } + return (0); } WORD32 impd_parse_ch_layout(ia_bit_buf_struct* it_bit_buff, ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_channel_layout_struct* channel_layout) -{ - //WORD32 err = 0; - WORD32 i; - - channel_layout->base_channel_count = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - if (ia_drc_params_struct->lfe_channel_map_count != -1 && channel_layout->base_channel_count != ia_drc_params_struct->lfe_channel_map_count) - { - return (UNEXPECTED_ERROR); - } - channel_layout->layout_signaling_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (channel_layout->layout_signaling_present) - { - channel_layout->defined_layout = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (channel_layout->defined_layout == 0) - { - for (i=0; i<channel_layout->base_channel_count; i++) - { - channel_layout->speaker_position[i] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - if (channel_layout->speaker_position[i] == 3 || channel_layout->speaker_position[i] == 26) { - ia_drc_params_struct->lfe_channel_map[i] = 1; - } - else - { - ia_drc_params_struct->lfe_channel_map[i] = 0; - } - } + ia_channel_layout_struct* channel_layout) { + // WORD32 err = 0; + WORD32 i; + + channel_layout->base_channel_count = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + if (ia_drc_params_struct->lfe_channel_map_count != -1 && + channel_layout->base_channel_count != + ia_drc_params_struct->lfe_channel_map_count) { + return (UNEXPECTED_ERROR); + } + channel_layout->layout_signaling_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (channel_layout->layout_signaling_present) { + channel_layout->defined_layout = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + + if (channel_layout->defined_layout == 0) { + for (i = 0; i < channel_layout->base_channel_count; i++) { + channel_layout->speaker_position[i] = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + if (channel_layout->speaker_position[i] == 3 || + channel_layout->speaker_position[i] == 26) { + ia_drc_params_struct->lfe_channel_map[i] = 1; + } else { + ia_drc_params_struct->lfe_channel_map[i] = 0; } + } } + } - return(0); + return (0); } WORD32 -impd_parse_dwnmix_instructions(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_channel_layout_struct* channel_layout, - ia_downmix_instructions_struct* dwnmix_instructions) -{ - //WORD32 err = 0; - WORD32 i, j, k, temp; - - temp = impd_read_bits_buf(it_bit_buff, 23); - if(it_bit_buff->error) - return it_bit_buff->error; - - dwnmix_instructions->downmix_id = (temp>>16)&0x7f; - dwnmix_instructions->target_channel_count = (temp>>9)&0x7f; - dwnmix_instructions->target_layout = (temp>>1)&0xff; - dwnmix_instructions->downmix_coefficients_present = temp&1; - - if (dwnmix_instructions->downmix_coefficients_present) - { - if (version == 0) - { - WORD32 dmix_coeff; - k=0; - for (i=0; i<dwnmix_instructions->target_channel_count; i++) - { - for (j=0; j<channel_layout->base_channel_count; j++) - { - dmix_coeff = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (ia_drc_params_struct->lfe_channel_map[j]) - { - dwnmix_instructions->downmix_coefficient[k] = (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff_lfe[dmix_coeff]); - } - else - { - dwnmix_instructions->downmix_coefficient[k] = (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff[dmix_coeff]); - } - k++; - } - } - } - else - { - WORD32 dmix_coeff_v1, bs_dmix_offset; - FLOAT32 a, b, dmix_offset, sum; - - bs_dmix_offset = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - k=0; - for (i=0; i<dwnmix_instructions->target_channel_count; i++) - { - for (j=0; j<channel_layout->base_channel_count; j++) - { - dmix_coeff_v1 = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - dwnmix_instructions->downmix_coefficient[k] = dwnmix_coeff_v1[dmix_coeff_v1]; - k++; - } - } - switch (bs_dmix_offset) - { - case 0: - dmix_offset = 0.0f; - break; - case 1: - a = 20.0f * (FLOAT32)log10((FLOAT32) dwnmix_instructions->target_channel_count / (FLOAT32)channel_layout->base_channel_count); - dmix_offset = 0.5f *(FLOAT32) floor(0.5f + a); - break; - case 2: - a = 20.0f *(FLOAT32) log10((FLOAT32) dwnmix_instructions->target_channel_count / (FLOAT32)channel_layout->base_channel_count); - dmix_offset = 0.5f *(FLOAT32) floor(0.5f + 2.0f * a); - break; - case 3: - sum = 0.0f; - for (k=0; k<dwnmix_instructions->target_channel_count * channel_layout->base_channel_count; k++) - { - sum += (FLOAT32)pow(10.0f, 0.1f * dwnmix_instructions->downmix_coefficient[k]); - } - b = 10.0f * (FLOAT32)log10(sum); - dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * b); - break; - - default: - return (BITSTREAM_ERROR); - break; - } - for (k=0; k<dwnmix_instructions->target_channel_count * channel_layout->base_channel_count; k++) - { - dwnmix_instructions->downmix_coefficient[k] = (FLOAT32)pow(10.0f, 0.05f * (dwnmix_instructions->downmix_coefficient[k] + dmix_offset)); - } - } - } - return(0); -} - -VOID impd_drc_gen_instructions_for_drc_off(ia_drc_config* drc_config) -{ - WORD32 i, k, s; - ia_drc_instructions_struct* str_drc_instruction_str; - s = -1; - +impd_parse_dwnmix_instructions( + ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_channel_layout_struct* channel_layout, + ia_downmix_instructions_struct* dwnmix_instructions) { + // WORD32 err = 0; + WORD32 i, j, k, temp; + + temp = impd_read_bits_buf(it_bit_buff, 23); + if (it_bit_buff->error) return it_bit_buff->error; + + dwnmix_instructions->downmix_id = (temp >> 16) & 0x7f; + dwnmix_instructions->target_channel_count = (temp >> 9) & 0x7f; + dwnmix_instructions->target_layout = (temp >> 1) & 0xff; + dwnmix_instructions->downmix_coefficients_present = temp & 1; + + if (dwnmix_instructions->downmix_coefficients_present) { + if (version == 0) { + WORD32 dmix_coeff; + k = 0; + for (i = 0; i < dwnmix_instructions->target_channel_count; i++) { + for (j = 0; j < channel_layout->base_channel_count; j++) { + dmix_coeff = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + + if (ia_drc_params_struct->lfe_channel_map[j]) { + dwnmix_instructions->downmix_coefficient[k] = + (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff_lfe[dmix_coeff]); + } else { + dwnmix_instructions->downmix_coefficient[k] = + (FLOAT32)pow(10.0f, 0.05f * dwnmix_coeff[dmix_coeff]); + } + k++; + } + } + } else { + WORD32 dmix_coeff_v1, bs_dmix_offset; + FLOAT32 a, b, dmix_offset, sum; + + bs_dmix_offset = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + k = 0; + for (i = 0; i < dwnmix_instructions->target_channel_count; i++) { + for (j = 0; j < channel_layout->base_channel_count; j++) { + dmix_coeff_v1 = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + dwnmix_instructions->downmix_coefficient[k] = + dwnmix_coeff_v1[dmix_coeff_v1]; + k++; + } + } + switch (bs_dmix_offset) { + case 0: + dmix_offset = 0.0f; + break; + case 1: + a = 20.0f * (FLOAT32)log10( + (FLOAT32)dwnmix_instructions->target_channel_count / + (FLOAT32)channel_layout->base_channel_count); + dmix_offset = 0.5f * (FLOAT32)floor(0.5f + a); + break; + case 2: + a = 20.0f * (FLOAT32)log10( + (FLOAT32)dwnmix_instructions->target_channel_count / + (FLOAT32)channel_layout->base_channel_count); + dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * a); + break; + case 3: + sum = 0.0f; + for (k = 0; k < dwnmix_instructions->target_channel_count * + channel_layout->base_channel_count; + k++) { + sum += (FLOAT32)pow( + 10.0f, 0.1f * dwnmix_instructions->downmix_coefficient[k]); + } + b = 10.0f * (FLOAT32)log10(sum); + dmix_offset = 0.5f * (FLOAT32)floor(0.5f + 2.0f * b); + break; - k = drc_config->drc_instructions_uni_drc_count; + default: + return (BITSTREAM_ERROR); + break; + } + for (k = 0; k < dwnmix_instructions->target_channel_count * + channel_layout->base_channel_count; + k++) { + dwnmix_instructions->downmix_coefficient[k] = (FLOAT32)pow( + 10.0f, 0.05f * (dwnmix_instructions->downmix_coefficient[k] + + dmix_offset)); + } + } + } + return (0); +} - str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k]); +VOID impd_drc_gen_instructions_for_drc_off(ia_drc_config* drc_config) { + WORD32 i, k, s; + ia_drc_instructions_struct* str_drc_instruction_str; + s = -1; + + k = drc_config->drc_instructions_uni_drc_count; + + str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k]); + memset(str_drc_instruction_str, 0, sizeof(ia_drc_instructions_struct)); + str_drc_instruction_str->drc_set_id = s; + s--; + str_drc_instruction_str->downmix_id[0] = ID_FOR_BASE_LAYOUT; + str_drc_instruction_str->dwnmix_id_count = 1; + str_drc_instruction_str->drc_apply_to_dwnmix = 0; + str_drc_instruction_str->depends_on_drc_set_present = 0; + str_drc_instruction_str->no_independent_use = 0; + str_drc_instruction_str->gain_element_count = 0; + for (i = 1; i < drc_config->dwnmix_instructions_count + 1; i++) { + str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k + i]); memset(str_drc_instruction_str, 0, sizeof(ia_drc_instructions_struct)); str_drc_instruction_str->drc_set_id = s; s--; - str_drc_instruction_str->downmix_id[0] = ID_FOR_BASE_LAYOUT; + str_drc_instruction_str->drc_set_complexity_level = 0; + str_drc_instruction_str->requires_eq = 0; + str_drc_instruction_str->downmix_id[0] = + drc_config->dwnmix_instructions[i - 1].downmix_id; str_drc_instruction_str->dwnmix_id_count = 1; str_drc_instruction_str->drc_apply_to_dwnmix = 0; str_drc_instruction_str->depends_on_drc_set_present = 0; str_drc_instruction_str->no_independent_use = 0; str_drc_instruction_str->gain_element_count = 0; - for (i=1; i<drc_config->dwnmix_instructions_count + 1; i++) - { - str_drc_instruction_str = &(drc_config->str_drc_instruction_str[k+i]); - memset(str_drc_instruction_str, 0, sizeof(ia_drc_instructions_struct)); - str_drc_instruction_str->drc_set_id = s; - s--; - str_drc_instruction_str->drc_set_complexity_level = 0; - str_drc_instruction_str->requires_eq = 0; - str_drc_instruction_str->downmix_id[0] = drc_config->dwnmix_instructions[i-1].downmix_id; - str_drc_instruction_str->dwnmix_id_count = 1; - str_drc_instruction_str->drc_apply_to_dwnmix = 0; - str_drc_instruction_str->depends_on_drc_set_present = 0; - str_drc_instruction_str->no_independent_use = 0; - str_drc_instruction_str->gain_element_count = 0; - } - drc_config->drc_instructions_count_plus = drc_config->drc_instructions_uni_drc_count + drc_config->dwnmix_instructions_count + 1; - return; + } + drc_config->drc_instructions_count_plus = + drc_config->drc_instructions_uni_drc_count + + drc_config->dwnmix_instructions_count + 1; + return; } WORD32 impd_parse_drc_config_ext(ia_bit_buf_struct* it_bit_buff, ia_drc_params_bs_dec_struct* ia_drc_params_struct, ia_drc_config* drc_config, - ia_drc_config_ext* str_drc_config_ext) -{ - WORD32 err = 0, i, k; - WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; - - k = 0; - str_drc_config_ext->drc_config_ext_type[k] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - while(str_drc_config_ext->drc_config_ext_type[k] != UNIDRCCONFEXT_TERM) - { - bit_size_len = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - ext_size_bits = bit_size_len + 4; - - bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_config_ext->ext_bit_size[k] = bit_size + 1; - - switch(str_drc_config_ext->drc_config_ext_type[k]) - { - case UNIDRCCONFEXT_PARAM_DRC: - str_drc_config_ext->parametric_drc_present = 1; - err = impd_parametic_drc_parse_coeff(it_bit_buff, drc_config, &(str_drc_config_ext->str_drc_coeff_param_drc)); - if (err) return(err); - str_drc_config_ext->parametric_drc_instructions_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=0; i<str_drc_config_ext->parametric_drc_instructions_count; i++) - { - err = impd_parse_parametric_drc_instructions(it_bit_buff, str_drc_config_ext->str_drc_coeff_param_drc.parametric_drc_frame_size, &(str_drc_config_ext->str_parametric_drc_instructions[i])); - if (err) return (err); - } - break; - case UNIDRCCONFEXT_V1: - str_drc_config_ext->drc_extension_v1_present = 1; - err = impd_parse_drc_ext_v1( it_bit_buff, ia_drc_params_struct, drc_config, str_drc_config_ext); - if (err) return(err); - break; - default: - for(i = 0; i<str_drc_config_ext->ext_bit_size[k]; i++) - { - other_bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - break; + ia_drc_config_ext* str_drc_config_ext) { + WORD32 err = 0, i, k; + WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; + + k = 0; + str_drc_config_ext->drc_config_ext_type[k] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + while (str_drc_config_ext->drc_config_ext_type[k] != UNIDRCCONFEXT_TERM) { + bit_size_len = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + ext_size_bits = bit_size_len + 4; + + bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_config_ext->ext_bit_size[k] = bit_size + 1; + + switch (str_drc_config_ext->drc_config_ext_type[k]) { + case UNIDRCCONFEXT_PARAM_DRC: + str_drc_config_ext->parametric_drc_present = 1; + err = impd_parametic_drc_parse_coeff( + it_bit_buff, drc_config, + &(str_drc_config_ext->str_drc_coeff_param_drc)); + if (err) return (err); + str_drc_config_ext->parametric_drc_instructions_count = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < str_drc_config_ext->parametric_drc_instructions_count; + i++) { + err = impd_parse_parametric_drc_instructions( + it_bit_buff, str_drc_config_ext->str_drc_coeff_param_drc + .parametric_drc_frame_size, + &(str_drc_config_ext->str_parametric_drc_instructions[i])); + if (err) return (err); } - k++; - str_drc_config_ext->drc_config_ext_type[k] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; + break; + case UNIDRCCONFEXT_V1: + str_drc_config_ext->drc_extension_v1_present = 1; + err = impd_parse_drc_ext_v1(it_bit_buff, ia_drc_params_struct, + drc_config, str_drc_config_ext); + if (err) return (err); + break; + default: + for (i = 0; i < str_drc_config_ext->ext_bit_size[k]; i++) { + other_bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + break; } + k++; + str_drc_config_ext->drc_config_ext_type[k] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } - return (0); + return (0); } -static WORD32 impd_parse_split_drc_characteristic(ia_bit_buf_struct* it_bit_buff, const WORD32 side, ia_split_drc_characteristic_struct* split_drc_characteristic) { - //WORD32 err = 0; - WORD32 i, temp; - - split_drc_characteristic->characteristic_format = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (split_drc_characteristic->characteristic_format == 0) - { - WORD32 bsGain, bsIoRatio, bsExp; - bsGain = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - if (side == LEFT_SIDE) - { - split_drc_characteristic->gain = (FLOAT32)bsGain; - } - else - { - split_drc_characteristic->gain = (FLOAT32)- bsGain; - } - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - bsIoRatio = (temp>>4)&0xf; - bsExp = temp&0xf; - split_drc_characteristic->in_out_ratio = 0.05f + 0.15f * bsIoRatio; - - if (bsExp<15) - { - split_drc_characteristic->exp = 1.0f + 2.0f * bsExp; - } - else - { - split_drc_characteristic->exp = 1000.0f; - } - split_drc_characteristic->flip_sign = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; +static WORD32 impd_parse_split_drc_characteristic( + ia_bit_buf_struct* it_bit_buff, const WORD32 side, + ia_split_drc_characteristic_struct* split_drc_characteristic) { + // WORD32 err = 0; + WORD32 i, temp; + + split_drc_characteristic->characteristic_format = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (split_drc_characteristic->characteristic_format == 0) { + WORD32 bsGain, bsIoRatio, bsExp; + bsGain = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + if (side == LEFT_SIDE) { + split_drc_characteristic->gain = (FLOAT32)bsGain; + } else { + split_drc_characteristic->gain = (FLOAT32)-bsGain; } - else - { - WORD32 char_node_cnt, node_level_delta, node_gain; - char_node_cnt = impd_read_bits_buf(it_bit_buff, 2); - if(it_bit_buff->error) - return it_bit_buff->error; - split_drc_characteristic->characteristic_node_count = char_node_cnt + 1; - split_drc_characteristic->node_level[0] = DRC_INPUT_LOUDNESS_TARGET; - split_drc_characteristic->node_gain[0] = 0.0f; - for (i=1; i<=split_drc_characteristic->characteristic_node_count; i++) - { - node_level_delta = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - if (side == LEFT_SIDE) - { - split_drc_characteristic->node_level[i] = split_drc_characteristic->node_level[i-1] - (1.0f + node_level_delta); - } - else - { - split_drc_characteristic->node_level[i] = split_drc_characteristic->node_level[i-1] + (1.0f + node_level_delta); - } - node_gain = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - split_drc_characteristic->node_gain[i] = 0.5f * node_gain - 64.0f; - } - } - return(0); + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + + bsIoRatio = (temp >> 4) & 0xf; + bsExp = temp & 0xf; + split_drc_characteristic->in_out_ratio = 0.05f + 0.15f * bsIoRatio; + + if (bsExp < 15) { + split_drc_characteristic->exp = 1.0f + 2.0f * bsExp; + } else { + split_drc_characteristic->exp = 1000.0f; + } + split_drc_characteristic->flip_sign = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + WORD32 char_node_cnt, node_level_delta, node_gain; + char_node_cnt = impd_read_bits_buf(it_bit_buff, 2); + if (it_bit_buff->error) return it_bit_buff->error; + split_drc_characteristic->characteristic_node_count = char_node_cnt + 1; + split_drc_characteristic->node_level[0] = DRC_INPUT_LOUDNESS_TARGET; + split_drc_characteristic->node_gain[0] = 0.0f; + for (i = 1; i <= split_drc_characteristic->characteristic_node_count; i++) { + node_level_delta = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + if (side == LEFT_SIDE) { + split_drc_characteristic->node_level[i] = + split_drc_characteristic->node_level[i - 1] - + (1.0f + node_level_delta); + } else { + split_drc_characteristic->node_level[i] = + split_drc_characteristic->node_level[i - 1] + + (1.0f + node_level_delta); + } + node_gain = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + split_drc_characteristic->node_gain[i] = 0.5f * node_gain - 64.0f; + } + } + return (0); } - WORD32 -impd_drc_gen_instructions_derived_data(ia_drc_config* drc_config, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_instructions_struct* str_drc_instruction_str) -{ - WORD32 n, g; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; - ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = NULL; - WORD32 gain_element_count = 0; - - for(n=0; n<drc_config->drc_coefficients_drc_count; n++) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == str_drc_instruction_str->drc_location) break; - } - if ((n == drc_config->drc_coefficients_drc_count) - && (drc_config->drc_coefficients_drc_count > 0) - ) - { +impd_drc_gen_instructions_derived_data( + ia_drc_config* drc_config, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_drc_instructions_struct* str_drc_instruction_str) { + WORD32 n, g; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; + ia_drc_coeff_parametric_drc_struct* str_drc_coeff_param_drc = NULL; + WORD32 gain_element_count = 0; + + for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == + str_drc_instruction_str->drc_location) + break; + } + if ((n == drc_config->drc_coefficients_drc_count) && + (drc_config->drc_coefficients_drc_count > 0)) { + return -1; + } + str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[n]); + + if (drc_config->drc_config_ext_present && + drc_config->str_drc_config_ext.parametric_drc_present && + drc_config->str_drc_config_ext.str_drc_coeff_param_drc.drc_location == + str_drc_instruction_str->drc_location) { + str_drc_coeff_param_drc = + &drc_config->str_drc_config_ext.str_drc_coeff_param_drc; + } + + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { + WORD32 seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; + if (seq != -1 && + (drc_config->drc_coefficients_drc_count == 0 || + seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count)) { + str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 1; + if (drc_config->drc_coefficients_drc_count != 0) { + seq = seq - str_p_loc_drc_coefficients_uni_drc->gain_set_count; + } + str_drc_instruction_str->gain_set_idx_of_ch_group_parametric_drc[g] = seq; + + if (str_drc_coeff_param_drc == NULL || + seq >= str_drc_coeff_param_drc->parametric_drc_gain_set_count) { + /* parametric drc gain set not available */ + return (EXTERNAL_ERROR); + } + str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = 1; + str_drc_instruction_str->time_delta_min_for_channel_group[g] = + str_drc_coeff_param_drc->parametric_drc_frame_size; + str_drc_instruction_str->time_alignment_for_channel_group[g] = 0; + } else { + str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 0; + } + if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { + if (seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count) { return -1; - } - str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[n]); - - if (drc_config->drc_config_ext_present && drc_config->str_drc_config_ext.parametric_drc_present && - drc_config->str_drc_config_ext.str_drc_coeff_param_drc.drc_location == str_drc_instruction_str->drc_location) - { - str_drc_coeff_param_drc = &drc_config->str_drc_config_ext.str_drc_coeff_param_drc; - } - - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups; g++) - { - WORD32 seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; - if (seq != -1 && (drc_config->drc_coefficients_drc_count == 0 || seq >= str_p_loc_drc_coefficients_uni_drc->gain_set_count)) - { - str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 1; - if (drc_config->drc_coefficients_drc_count != 0) - { - seq = seq - str_p_loc_drc_coefficients_uni_drc->gain_set_count; - } - str_drc_instruction_str->gain_set_idx_of_ch_group_parametric_drc[g] = seq; - - if (str_drc_coeff_param_drc == NULL || seq>=str_drc_coeff_param_drc->parametric_drc_gain_set_count) - { - /* parametric drc gain set not available */ - return(EXTERNAL_ERROR); - } - str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = 1; - str_drc_instruction_str->time_delta_min_for_channel_group[g] = str_drc_coeff_param_drc->parametric_drc_frame_size; - str_drc_instruction_str->time_alignment_for_channel_group[g] = 0; - } else { - str_drc_instruction_str->ch_group_parametric_drc_flag[g] = 0; - } - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 0) { - if (seq>=str_p_loc_drc_coefficients_uni_drc->gain_set_count) { - return -1; - } - str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].gain_interpolation_type; - if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].time_delt_min_flag) - { - str_drc_instruction_str->time_delta_min_for_channel_group[g] = str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].time_delt_min_val; - } - else - { - str_drc_instruction_str->time_delta_min_for_channel_group[g] = ia_drc_params_struct->delta_tmin_default; - } - str_drc_instruction_str->time_alignment_for_channel_group[g] = str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].time_alignment; - } - } - - if (str_drc_instruction_str->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) - { - str_drc_instruction_str->gain_element_count = str_drc_instruction_str->num_drc_ch_groups; - } - else - { - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups; g++) - { - if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 1) - { - gain_element_count++; - str_drc_instruction_str->band_count_of_ch_group[g] = 1; - } - else - { - WORD32 seq, band_count; - seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; - band_count = str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].band_count; - str_drc_instruction_str->band_count_of_ch_group[g] = band_count; - gain_element_count += band_count; - } - } - str_drc_instruction_str->gain_element_count = gain_element_count; - } - - return(0); + } + str_drc_instruction_str->gain_interpolation_type_for_channel_group[g] = + str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] + .gain_interpolation_type; + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] + .time_delt_min_flag) { + str_drc_instruction_str->time_delta_min_for_channel_group[g] = + str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] + .time_delt_min_val; + } else { + str_drc_instruction_str->time_delta_min_for_channel_group[g] = + ia_drc_params_struct->delta_tmin_default; + } + str_drc_instruction_str->time_alignment_for_channel_group[g] = + str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq] + .time_alignment; + } + } + + if (str_drc_instruction_str->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { + str_drc_instruction_str->gain_element_count = + str_drc_instruction_str->num_drc_ch_groups; + } else { + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { + if (str_drc_instruction_str->ch_group_parametric_drc_flag[g] == 1) { + gain_element_count++; + str_drc_instruction_str->band_count_of_ch_group[g] = 1; + } else { + WORD32 seq, band_count; + seq = str_drc_instruction_str->gain_set_index_for_channel_group[g]; + band_count = + str_p_loc_drc_coefficients_uni_drc->gain_set_params[seq].band_count; + str_drc_instruction_str->band_count_of_ch_group[g] = band_count; + gain_element_count += band_count; + } + } + str_drc_instruction_str->gain_element_count = gain_element_count; + } + + return (0); } WORD32 impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_config* drc_config - ) -{ - WORD32 i, err = 0, temp; - WORD32 version = 0; - - drc_config->sample_rate_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if(drc_config->sample_rate_present == 1) - { - WORD32 bssample_rate; - bssample_rate = impd_read_bits_buf(it_bit_buff, 18); - if(it_bit_buff->error) - return it_bit_buff->error; - drc_config->sampling_rate = bssample_rate + 1000; - } + ia_drc_config* drc_config) { + WORD32 i, err = 0, temp; + WORD32 version = 0; - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; + drc_config->sample_rate_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - drc_config->dwnmix_instructions_count = (temp>>1)&0x7f; - drc_config->drc_description_basic_present = temp&1; + if (drc_config->sample_rate_present == 1) { + WORD32 bssample_rate; + bssample_rate = impd_read_bits_buf(it_bit_buff, 18); + if (it_bit_buff->error) return it_bit_buff->error; + drc_config->sampling_rate = bssample_rate + 1000; + } - if (drc_config->drc_description_basic_present == 1) - { - temp = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - drc_config->drc_coefficients_basic_count = (temp>>4)&7; - drc_config->drc_instructions_basic_count = temp&0xf; + drc_config->dwnmix_instructions_count = (temp >> 1) & 0x7f; + drc_config->drc_description_basic_present = temp & 1; - } - else - { - drc_config->drc_coefficients_basic_count = 0; - drc_config->drc_instructions_basic_count = 0; - } + if (drc_config->drc_description_basic_present == 1) { + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; - temp = impd_read_bits_buf(it_bit_buff, 9); - if(it_bit_buff->error) - return it_bit_buff->error; + drc_config->drc_coefficients_basic_count = (temp >> 4) & 7; + drc_config->drc_instructions_basic_count = temp & 0xf; - drc_config->drc_coefficients_drc_count = (temp>>6)&7; - drc_config->drc_instructions_uni_drc_count = temp&0x3f; + } else { + drc_config->drc_coefficients_basic_count = 0; + drc_config->drc_instructions_basic_count = 0; + } - err = impd_parse_ch_layout(it_bit_buff, ia_drc_params_struct, &drc_config->channel_layout); - if (err) return(err); + temp = impd_read_bits_buf(it_bit_buff, 9); + if (it_bit_buff->error) return it_bit_buff->error; - for(i=0; i<drc_config->dwnmix_instructions_count; i++) - { - err = impd_parse_dwnmix_instructions(it_bit_buff, version, ia_drc_params_struct, &drc_config->channel_layout, &(drc_config->dwnmix_instructions[i])); - if (err) return(err); - } - for(i=0; i<drc_config->drc_coefficients_basic_count ; i++) - { - temp = impd_read_bits_buf(it_bit_buff, 11); - if(it_bit_buff->error) - return it_bit_buff->error; + drc_config->drc_coefficients_drc_count = (temp >> 6) & 7; + drc_config->drc_instructions_uni_drc_count = temp & 0x3f; - drc_config->str_drc_coefficients_basic[i].drc_location = (temp>>7)&0xf; - drc_config->str_drc_coefficients_basic[i].drc_characteristic = temp&0x3f; + err = impd_parse_ch_layout(it_bit_buff, ia_drc_params_struct, + &drc_config->channel_layout); + if (err) return (err); - } - for(i=0; i<drc_config->drc_instructions_basic_count; i++) - { - err = impd_drc_parse_instructions_basic(it_bit_buff, &(drc_config->str_drc_instructions_basic[i])); - if (err) return(err); - } - for(i=0; i<drc_config->drc_coefficients_drc_count; i++) - { - err = impd_drc_parse_coeff(it_bit_buff, version, ia_drc_params_struct, &(drc_config->str_p_loc_drc_coefficients_uni_drc[i])); - if (err) return(err); - } - for(i=0; i<drc_config->drc_instructions_uni_drc_count; i++) - { - err = impd_parse_drc_instructions_uni_drc(it_bit_buff, version, drc_config, &(drc_config->str_drc_instruction_str[i])); - if (err) return(err); - } + for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { + err = impd_parse_dwnmix_instructions( + it_bit_buff, version, ia_drc_params_struct, &drc_config->channel_layout, + &(drc_config->dwnmix_instructions[i])); + if (err) return (err); + } + for (i = 0; i < drc_config->drc_coefficients_basic_count; i++) { + temp = impd_read_bits_buf(it_bit_buff, 11); + if (it_bit_buff->error) return it_bit_buff->error; + + drc_config->str_drc_coefficients_basic[i].drc_location = (temp >> 7) & 0xf; + drc_config->str_drc_coefficients_basic[i].drc_characteristic = temp & 0x3f; + } + for (i = 0; i < drc_config->drc_instructions_basic_count; i++) { + err = impd_drc_parse_instructions_basic( + it_bit_buff, &(drc_config->str_drc_instructions_basic[i])); + if (err) return (err); + } + for (i = 0; i < drc_config->drc_coefficients_drc_count; i++) { + err = impd_drc_parse_coeff( + it_bit_buff, version, ia_drc_params_struct, + &(drc_config->str_p_loc_drc_coefficients_uni_drc[i])); + if (err) return (err); + } + for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { + err = impd_parse_drc_instructions_uni_drc( + it_bit_buff, version, drc_config, + &(drc_config->str_drc_instruction_str[i])); + if (err) return (err); + } - drc_config->drc_config_ext_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + drc_config->drc_config_ext_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - if (drc_config->drc_config_ext_present == 1) - { - err = impd_parse_drc_config_ext( it_bit_buff, ia_drc_params_struct, drc_config, &(drc_config->str_drc_config_ext)); - if (err) return(err); - } + if (drc_config->drc_config_ext_present == 1) { + err = + impd_parse_drc_config_ext(it_bit_buff, ia_drc_params_struct, drc_config, + &(drc_config->str_drc_config_ext)); + if (err) return (err); + } - if ( drc_config->str_drc_config_ext.parametric_drc_present ) - { - err = impd_parametric_drc_gen_virtual_gain_sets(drc_config); - if (err) return(err); - } + if (drc_config->str_drc_config_ext.parametric_drc_present) { + err = impd_parametric_drc_gen_virtual_gain_sets(drc_config); + if (err) return (err); + } - for(i=0; i<drc_config->drc_instructions_uni_drc_count; i++) - { - err = impd_drc_gen_instructions_derived_data(drc_config, ia_drc_params_struct, &(drc_config->str_drc_instruction_str[i])); - if (err) return(err); - } + for (i = 0; i < drc_config->drc_instructions_uni_drc_count; i++) { + err = impd_drc_gen_instructions_derived_data( + drc_config, ia_drc_params_struct, + &(drc_config->str_drc_instruction_str[i])); + if (err) return (err); + } - impd_drc_gen_instructions_for_drc_off(drc_config); - return(0); + impd_drc_gen_instructions_for_drc_off(drc_config); + return (0); } WORD32 -impd_dec_method_value(ia_bit_buf_struct* it_bit_buff, - WORD32 method_def, - FLOAT32* method_val) -{ - //WORD32 err = 0; - WORD32 tmp; - FLOAT32 val; - switch (method_def) { +impd_dec_method_value(ia_bit_buf_struct* it_bit_buff, WORD32 method_def, + FLOAT32* method_val) { + // WORD32 err = 0; + WORD32 tmp; + FLOAT32 val; + switch (method_def) { case METHOD_DEFINITION_UNKNOWN_OTHER: case METHOD_DEFINITION_PROGRAM_LOUDNESS: case METHOD_DEFINITION_ANCHOR_LOUDNESS: case METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE: case METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX: case METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX: - tmp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - val = -57.75f + tmp * 0.25f; - break; + tmp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + val = -57.75f + tmp * 0.25f; + break; case METHOD_DEFINITION_LOUDNESS_RANGE: - tmp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - if (tmp == 0) - val = 0.0f; - else if(tmp <= 128) - val = tmp * 0.25f; - else if(tmp <= 204) - val = 0.5f * tmp - 32.0f; - else - val = tmp - 134.0f; - break; + tmp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + if (tmp == 0) + val = 0.0f; + else if (tmp <= 128) + val = tmp * 0.25f; + else if (tmp <= 204) + val = 0.5f * tmp - 32.0f; + else + val = tmp - 134.0f; + break; case METHOD_DEFINITION_MIXING_LEVEL: - tmp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - val = tmp + 80.0f; - break; + tmp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + val = tmp + 80.0f; + break; case METHOD_DEFINITION_ROOM_TYPE: - tmp = impd_read_bits_buf(it_bit_buff, 2); - if(it_bit_buff->error) - return it_bit_buff->error; - val = (FLOAT32)tmp; - break; + tmp = impd_read_bits_buf(it_bit_buff, 2); + if (it_bit_buff->error) return it_bit_buff->error; + val = (FLOAT32)tmp; + break; case METHOD_DEFINITION_SHORT_TERM_LOUDNESS: - tmp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - val = -116.f + tmp * 0.5f; - break; + tmp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + val = -116.f + tmp * 0.5f; + break; default: - return -1; - break; - } - *method_val = val; - return 0; + return -1; + break; + } + *method_val = val; + return 0; } - WORD32 -impd_parse_loudness_info_set(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* loudness_info_set) -{ - WORD32 err = 0, i, version = 0, offset, temp; - WORD32 loudness_info_album_count, loudness_info_count; - - temp = impd_read_bits_buf(it_bit_buff, 12); - if(it_bit_buff->error) - return it_bit_buff->error; - - loudness_info_album_count = (temp>>6)&0x3f; - loudness_info_count = temp&0x3f; - - offset = loudness_info_set->loudness_info_album_count; - loudness_info_set->loudness_info_album_count += loudness_info_album_count; - for (i = 0; i< loudness_info_set->loudness_info_album_count; i++) - { - err = impd_parse_loudness_info(it_bit_buff, version, &(loudness_info_set->str_loudness_info_album[i+offset])); - if (err) return(err); - } +impd_parse_loudness_info_set( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* loudness_info_set) { + WORD32 err = 0, i, version = 0, offset, temp; + WORD32 loudness_info_album_count, loudness_info_count; + + temp = impd_read_bits_buf(it_bit_buff, 12); + if (it_bit_buff->error) return it_bit_buff->error; + + loudness_info_album_count = (temp >> 6) & 0x3f; + loudness_info_count = temp & 0x3f; + + offset = loudness_info_set->loudness_info_album_count; + loudness_info_set->loudness_info_album_count += loudness_info_album_count; + for (i = 0; i < loudness_info_set->loudness_info_album_count; i++) { + err = impd_parse_loudness_info( + it_bit_buff, version, + &(loudness_info_set->str_loudness_info_album[i + offset])); + if (err) return (err); + } - offset = loudness_info_set->loudness_info_count; - loudness_info_set->loudness_info_count += loudness_info_count; - for (i = 0; i<loudness_info_set->loudness_info_count; i++) - { - err = impd_parse_loudness_info(it_bit_buff, version, &(loudness_info_set->loudness_info[i+offset])); - if (err) return(err); - } + offset = loudness_info_set->loudness_info_count; + loudness_info_set->loudness_info_count += loudness_info_count; + for (i = 0; i < loudness_info_set->loudness_info_count; i++) { + err = impd_parse_loudness_info( + it_bit_buff, version, &(loudness_info_set->loudness_info[i + offset])); + if (err) return (err); + } - loudness_info_set->loudness_info_set_ext_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + loudness_info_set->loudness_info_set_ext_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - if ( loudness_info_set->loudness_info_set_ext_present == 1) - { - err = impd_parse_loudness_info_set_ext(it_bit_buff, loudness_info_set); - if (err) return(err); - } + if (loudness_info_set->loudness_info_set_ext_present == 1) { + err = impd_parse_loudness_info_set_ext(it_bit_buff, loudness_info_set); + if (err) return (err); + } - return (0); + return (0); } WORD32 impd_parse_gain_set_params_characteristics(ia_bit_buf_struct* it_bit_buff, WORD32 version, - ia_gain_params_struct* gain_params) -{ - //WORD32 err = 0; - WORD32 temp; - if (version == 0) - { + ia_gain_params_struct* gain_params) { + // WORD32 err = 0; + WORD32 temp; + if (version == 0) { + gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + if (gain_params->drc_characteristic > 0) { + gain_params->drc_characteristic_present = 1; + gain_params->drc_characteristic_format_is_cicp = 1; + } else { + gain_params->drc_characteristic_present = 0; + } + } else { + gain_params->drc_characteristic_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (gain_params->drc_characteristic_present) { + gain_params->drc_characteristic_format_is_cicp = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (gain_params->drc_characteristic_format_is_cicp) { gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - if (gain_params->drc_characteristic > 0) - { - gain_params->drc_characteristic_present = 1; - gain_params->drc_characteristic_format_is_cicp = 1; - } - else - { - gain_params->drc_characteristic_present = 0; - } - } - else { - gain_params->drc_characteristic_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (gain_params->drc_characteristic_present) - { - gain_params->drc_characteristic_format_is_cicp = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (gain_params->drc_characteristic_format_is_cicp) - { - gain_params->drc_characteristic = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - else - { - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - gain_params->drc_characteristic_left_index = (temp>>4)&0xf; - gain_params->drc_characteristic_right_index = temp&0xf; + if (it_bit_buff->error) return it_bit_buff->error; + } else { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - } - } + gain_params->drc_characteristic_left_index = (temp >> 4) & 0xf; + gain_params->drc_characteristic_right_index = temp & 0xf; + } } - return(0); + } + return (0); } WORD32 impd_parse_loudness_measure(ia_bit_buf_struct* it_bit_buff, - ia_loudness_measure_struct* loudness_measure) -{ - WORD32 err = 0, temp; + ia_loudness_measure_struct* loudness_measure) { + WORD32 err = 0, temp; - loudness_measure->method_def = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; + loudness_measure->method_def = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; - err = impd_dec_method_value(it_bit_buff, loudness_measure->method_def, &(loudness_measure->method_val)); - if(err) return err; + err = impd_dec_method_value(it_bit_buff, loudness_measure->method_def, + &(loudness_measure->method_val)); + if (err) return err; - temp = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; - loudness_measure->measurement_system = (temp>>2)&0xf; - loudness_measure->reliability = temp&3; + loudness_measure->measurement_system = (temp >> 2) & 0xf; + loudness_measure->reliability = temp & 3; - return (0); + return (0); } - WORD32 -impd_dec_gain_modifiers(ia_bit_buf_struct* it_bit_buff, - WORD32 version, +impd_dec_gain_modifiers(ia_bit_buf_struct* it_bit_buff, WORD32 version, WORD32 band_count, - ia_gain_modifiers_struct* pstr_gain_modifiers) -{ - - //WORD32 err = 0; - WORD32 sign, temp; - - if (version > 0) - { - WORD32 b; - for (b=0; b<band_count; b++) - { - pstr_gain_modifiers->target_characteristic_left_present[b] = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_gain_modifiers->target_characteristic_left_present[b]) - { - pstr_gain_modifiers->target_characteristic_left_index[b] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - } - pstr_gain_modifiers->target_characteristic_right_present[b] = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_gain_modifiers->target_characteristic_right_present[b]) - { - pstr_gain_modifiers->target_characteristic_right_index[b] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - } - pstr_gain_modifiers->gain_scaling_flag[b] = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_gain_modifiers->gain_scaling_flag[b]) - { - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - pstr_gain_modifiers->attn_scaling[b] = ((temp>>4)&0xf) * 0.125f; - pstr_gain_modifiers->ampl_scaling[b] = (temp&0xf) * 0.125f; - } - - pstr_gain_modifiers->gain_offset_flag[b] = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_gain_modifiers->gain_offset_flag[b]) - { - FLOAT32 gain_offset; - temp = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - sign = ((temp>>5)&1); - gain_offset = (1+(temp&0x1f)) * 0.25f; - - if (sign) - { - gain_offset = - gain_offset; - } - pstr_gain_modifiers->gain_offset[b] = gain_offset; - } - } - if (band_count == 1) - { - 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); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - } - else if (version == 0) - { - WORD32 b, gain_scaling_flag, gain_offset_flag; - FLOAT32 attn_scaling = 1.0f, ampl_scaling = 1.0f, gain_offset = 0.0f; - - gain_scaling_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if(gain_scaling_flag) - { - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - - attn_scaling = ((temp>>4)&0xf) * 0.125f; - ampl_scaling = (temp&0xf) * 0.125f; - - } - - gain_offset_flag = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if(gain_offset_flag) - { - - temp = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; + ia_gain_modifiers_struct* pstr_gain_modifiers) { + // WORD32 err = 0; + WORD32 sign, temp; + + if (version > 0) { + WORD32 b; + for (b = 0; b < band_count; b++) { + pstr_gain_modifiers->target_characteristic_left_present[b] = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_gain_modifiers->target_characteristic_left_present[b]) { + pstr_gain_modifiers->target_characteristic_left_index[b] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } + pstr_gain_modifiers->target_characteristic_right_present[b] = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_gain_modifiers->target_characteristic_right_present[b]) { + pstr_gain_modifiers->target_characteristic_right_index[b] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } + pstr_gain_modifiers->gain_scaling_flag[b] = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_gain_modifiers->gain_scaling_flag[b]) { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - sign = ((temp>>5)&1); - gain_offset = (1+(temp&0x1f)) * 0.25f; + pstr_gain_modifiers->attn_scaling[b] = ((temp >> 4) & 0xf) * 0.125f; + pstr_gain_modifiers->ampl_scaling[b] = (temp & 0xf) * 0.125f; + } - if (sign) - { - gain_offset = - gain_offset; - } - } - for (b=0; b<band_count; b++) { - pstr_gain_modifiers->target_characteristic_left_present[b] = 0; - pstr_gain_modifiers->target_characteristic_right_present[b] = 0; - pstr_gain_modifiers->gain_scaling_flag[b] = gain_scaling_flag; - pstr_gain_modifiers->attn_scaling[b] = attn_scaling; - pstr_gain_modifiers->ampl_scaling[b] = ampl_scaling; - pstr_gain_modifiers->gain_offset_flag[b] = gain_offset_flag; - pstr_gain_modifiers->gain_offset[b] = gain_offset; - } - pstr_gain_modifiers->shape_filter_flag = 0; - } - return (0); + pstr_gain_modifiers->gain_offset_flag[b] = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_gain_modifiers->gain_offset_flag[b]) { + FLOAT32 gain_offset; + temp = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + sign = ((temp >> 5) & 1); + gain_offset = (1 + (temp & 0x1f)) * 0.25f; + + if (sign) { + gain_offset = -gain_offset; + } + pstr_gain_modifiers->gain_offset[b] = gain_offset; + } + } + if (band_count == 1) { + 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); + if (it_bit_buff->error) return it_bit_buff->error; + } + } + } else if (version == 0) { + WORD32 b, gain_scaling_flag, gain_offset_flag; + FLOAT32 attn_scaling = 1.0f, ampl_scaling = 1.0f, gain_offset = 0.0f; + + gain_scaling_flag = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (gain_scaling_flag) { + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + + attn_scaling = ((temp >> 4) & 0xf) * 0.125f; + ampl_scaling = (temp & 0xf) * 0.125f; + } + + gain_offset_flag = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (gain_offset_flag) { + temp = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + sign = ((temp >> 5) & 1); + gain_offset = (1 + (temp & 0x1f)) * 0.25f; + + if (sign) { + gain_offset = -gain_offset; + } + } + for (b = 0; b < band_count; b++) { + pstr_gain_modifiers->target_characteristic_left_present[b] = 0; + pstr_gain_modifiers->target_characteristic_right_present[b] = 0; + pstr_gain_modifiers->gain_scaling_flag[b] = gain_scaling_flag; + pstr_gain_modifiers->attn_scaling[b] = attn_scaling; + pstr_gain_modifiers->ampl_scaling[b] = ampl_scaling; + pstr_gain_modifiers->gain_offset_flag[b] = gain_offset_flag; + pstr_gain_modifiers->gain_offset[b] = gain_offset; + } + pstr_gain_modifiers->shape_filter_flag = 0; + } + return (0); } WORD32 -impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, - WORD32 version, +impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, WORD32 version, WORD32* gain_seq_idx, - ia_gain_set_params_struct* gain_set_params) -{ - WORD32 err = 0, i, temp; - - temp = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - gain_set_params->gain_coding_profile = (temp>>4)&3; - gain_set_params->gain_interpolation_type = (temp>>3)&1; - gain_set_params->full_frame = (temp>>2)&1; - gain_set_params->time_alignment = (temp>>1)&1; - gain_set_params->time_delt_min_flag = temp&1; - - if(gain_set_params->time_delt_min_flag) - { - WORD32 time_delta_min; - time_delta_min = impd_read_bits_buf(it_bit_buff, 11); - if(it_bit_buff->error) - return it_bit_buff->error; - gain_set_params->time_delt_min_val = time_delta_min + 1; - } - - if (gain_set_params->gain_coding_profile == GAIN_CODING_PROFILE_CONSTANT) - { - gain_set_params->band_count = 1; + ia_gain_set_params_struct* gain_set_params) { + WORD32 err = 0, i, temp; + + temp = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + gain_set_params->gain_coding_profile = (temp >> 4) & 3; + gain_set_params->gain_interpolation_type = (temp >> 3) & 1; + gain_set_params->full_frame = (temp >> 2) & 1; + gain_set_params->time_alignment = (temp >> 1) & 1; + gain_set_params->time_delt_min_flag = temp & 1; + + if (gain_set_params->time_delt_min_flag) { + WORD32 time_delta_min; + time_delta_min = impd_read_bits_buf(it_bit_buff, 11); + if (it_bit_buff->error) return it_bit_buff->error; + gain_set_params->time_delt_min_val = time_delta_min + 1; + } + + if (gain_set_params->gain_coding_profile == GAIN_CODING_PROFILE_CONSTANT) { + gain_set_params->band_count = 1; + *gain_seq_idx = (*gain_seq_idx) + 1; + } else { + gain_set_params->band_count = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + + if (gain_set_params->band_count > 1) { + gain_set_params->drc_band_type = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + for (i = 0; i < gain_set_params->band_count; i++) { + if (version == 0) { *gain_seq_idx = (*gain_seq_idx) + 1; - } - else - { - gain_set_params->band_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - - if(gain_set_params->band_count>1) - { - gain_set_params->drc_band_type = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - for(i=0; i<gain_set_params->band_count; i++) - { - if (version == 0) { - *gain_seq_idx = (*gain_seq_idx) + 1; - } - else - { - WORD32 indexPresent; - indexPresent = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (indexPresent) - { - WORD32 bsIndex; - bsIndex = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - *gain_seq_idx = bsIndex; - } - else - { - *gain_seq_idx = (*gain_seq_idx) + 1; - } - } - gain_set_params->gain_params[i].gain_seq_idx = *gain_seq_idx; - err = impd_parse_gain_set_params_characteristics(it_bit_buff, version, &(gain_set_params->gain_params[i])); - if (err) return(err); - } - if (gain_set_params->drc_band_type) - { - for(i=1; i<gain_set_params->band_count; i++) - { - gain_set_params->gain_params[i].crossover_freq_idx = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - else - { - for(i=1; i<gain_set_params->band_count; i++) - { - gain_set_params->gain_params[i].start_subband_index = impd_read_bits_buf(it_bit_buff, 10); - if(it_bit_buff->error) - return it_bit_buff->error; - } - } - - } - - return(0); + } else { + WORD32 indexPresent; + indexPresent = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (indexPresent) { + WORD32 bsIndex; + bsIndex = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + *gain_seq_idx = bsIndex; + } else { + *gain_seq_idx = (*gain_seq_idx) + 1; + } + } + gain_set_params->gain_params[i].gain_seq_idx = *gain_seq_idx; + err = impd_parse_gain_set_params_characteristics( + it_bit_buff, version, &(gain_set_params->gain_params[i])); + if (err) return (err); + } + if (gain_set_params->drc_band_type) { + for (i = 1; i < gain_set_params->band_count; i++) { + gain_set_params->gain_params[i].crossover_freq_idx = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } + } else { + for (i = 1; i < gain_set_params->band_count; i++) { + gain_set_params->gain_params[i].start_subband_index = + impd_read_bits_buf(it_bit_buff, 10); + if (it_bit_buff->error) return it_bit_buff->error; + } + } + } + + return (0); } WORD32 -impd_sel_drc_coeff(ia_drc_config* drc_config, - WORD32 location, - ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc) -{ - WORD32 n; - WORD32 c1 = -1; - WORD32 c0 = -1; - for(n=0; n<drc_config->drc_coefficients_drc_count; n++) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == location) - { - if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].version == 0) - { - c0 = n; - } - else - { - c1 = n; - } - } - } - if (c1 >= 0) { - *str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); - } - else if (c0 >= 0) { - *str_p_loc_drc_coefficients_uni_drc = &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); - } - else { - *str_p_loc_drc_coefficients_uni_drc = NULL; - } - return (0); +impd_sel_drc_coeff( + ia_drc_config* drc_config, WORD32 location, + ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc) { + WORD32 n; + WORD32 c1 = -1; + WORD32 c0 = -1; + for (n = 0; n < drc_config->drc_coefficients_drc_count; n++) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].drc_location == + location) { + if (drc_config->str_p_loc_drc_coefficients_uni_drc[n].version == 0) { + c0 = n; + } else { + c1 = n; + } + } + } + if (c1 >= 0) { + *str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[c1]); + } else if (c0 >= 0) { + *str_p_loc_drc_coefficients_uni_drc = + &(drc_config->str_p_loc_drc_coefficients_uni_drc[c0]); + } else { + *str_p_loc_drc_coefficients_uni_drc = NULL; + } + return (0); } - - WORD32 -impd_parse_loudness_info_set_ext(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* loudness_info_set) -{ - WORD32 err = 0, i, k; - WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; - - k = 0; - loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - while(loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] != UNIDRCLOUDEXT_TERM) - { - bit_size_len = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - ext_size_bits = bit_size_len + 4; - - bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); - if(it_bit_buff->error) - return it_bit_buff->error; - loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k] = bit_size + 1; - - switch(loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k]) - { - case UNIDRCLOUDEXT_EQ: - err = impd_parse_loud_info_set_ext_eq(it_bit_buff, loudness_info_set); - if (err) return(err); - break; - default: - for(i = 0; i<loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k]; i++) - { - other_bit = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - break; +impd_parse_loudness_info_set_ext( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* loudness_info_set) { + WORD32 err = 0, i, k; + WORD32 bit_size_len, ext_size_bits, bit_size, other_bit; + + k = 0; + loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + while (loudness_info_set->str_loudness_info_set_ext + .loudness_info_set_ext_type[k] != UNIDRCLOUDEXT_TERM) { + bit_size_len = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + ext_size_bits = bit_size_len + 4; + + bit_size = impd_read_bits_buf(it_bit_buff, ext_size_bits); + if (it_bit_buff->error) return it_bit_buff->error; + loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k] = bit_size + 1; + + switch (loudness_info_set->str_loudness_info_set_ext + .loudness_info_set_ext_type[k]) { + case UNIDRCLOUDEXT_EQ: + err = impd_parse_loud_info_set_ext_eq(it_bit_buff, loudness_info_set); + if (err) return (err); + break; + default: + for (i = 0; + i < loudness_info_set->str_loudness_info_set_ext.ext_bit_size[k]; + i++) { + other_bit = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; } - k++; - loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; + break; } + k++; + loudness_info_set->str_loudness_info_set_ext.loudness_info_set_ext_type[k] = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } - return (0); + return (0); } WORD32 -impd_drc_parse_coeff(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc) -{ - WORD32 err = 0, i, drc_frame_size, temp; - WORD32 gain_seq_idx = -1; - - str_p_loc_drc_coefficients_uni_drc->version = version; - if (version == 0) { - WORD32 gain_sequence_count = 0; - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_p_loc_drc_coefficients_uni_drc->drc_location = (temp>>1)&0xf; - str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp&1; - - if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) - { - 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; - } - - str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; - str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; - str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; - str_p_loc_drc_coefficients_uni_drc->gain_set_count = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = str_p_loc_drc_coefficients_uni_drc->gain_set_count; - for(i=0; i<str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) - { - err = impd_parse_gain_set_params(it_bit_buff, version, &gain_seq_idx, &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); - if (err) return (err); - - if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].time_delt_min_flag) - { - if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].time_delt_min_val > ia_drc_params_struct->drc_frame_size) - { - /* drc time interval too big */ - return(PARAM_ERROR); - } - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].num_gain_max_values = 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); - } - gain_sequence_count += str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; - } - str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = gain_sequence_count; - } - else { - - ia_shape_filter_block_params_struct* pstr_shape_filter_block_params; - for (i=0; i<SEQUENCE_COUNT_MAX; i++) - { - str_p_loc_drc_coefficients_uni_drc->gain_set_params_index_for_gain_sequence[i] = -1; - } - - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_p_loc_drc_coefficients_uni_drc->drc_location = (temp>>1)&0xf; - str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp&1; - - if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) - { - 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; - } - str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present == 1) - { - str_p_loc_drc_coefficients_uni_drc->characteristic_left_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=1; i<=str_p_loc_drc_coefficients_uni_drc->characteristic_left_count; i++) - { - err = impd_parse_split_drc_characteristic(it_bit_buff, LEFT_SIDE, &(str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_left[i])); - if (err) return(err); - } - } - str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present == 1) - { - str_p_loc_drc_coefficients_uni_drc->characteristic_right_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=1; i<=str_p_loc_drc_coefficients_uni_drc->characteristic_right_count; i++) - { - err = impd_parse_split_drc_characteristic(it_bit_buff, RIGHT_SIDE, &(str_p_loc_drc_coefficients_uni_drc->str_split_characteristic_right[i])); - if (err) return(err); - } - } - str_p_loc_drc_coefficients_uni_drc->shape_filters_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_p_loc_drc_coefficients_uni_drc->shape_filters_present == 1) - { - str_p_loc_drc_coefficients_uni_drc->shape_num_filter = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - for (i=1; i<=str_p_loc_drc_coefficients_uni_drc->shape_num_filter; i++) - { - pstr_shape_filter_block_params = &(str_p_loc_drc_coefficients_uni_drc->str_shape_filter_block_params[i]); - pstr_shape_filter_block_params->lf_cut_filter_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (pstr_shape_filter_block_params->lf_cut_filter_present == 1) - { - - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - pstr_shape_filter_block_params->str_lf_cut_params.corner_freq_index = (temp>>2)&7; - pstr_shape_filter_block_params->str_lf_cut_params.filter_strength_index = temp&3; - } - pstr_shape_filter_block_params->lf_boost_filter_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_shape_filter_block_params->lf_boost_filter_present == 1) - { - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - pstr_shape_filter_block_params->str_lf_boost_params.corner_freq_index = (temp>>2)&7; - pstr_shape_filter_block_params->str_lf_boost_params.filter_strength_index = temp&3; - - } - pstr_shape_filter_block_params->hf_cut_filter_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_shape_filter_block_params->hf_cut_filter_present == 1) - { - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - pstr_shape_filter_block_params->str_hfCutParams.corner_freq_index = (temp>>2)&7; - pstr_shape_filter_block_params->str_hfCutParams.filter_strength_index = temp&3; - - } - pstr_shape_filter_block_params->hf_boost_filter_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (pstr_shape_filter_block_params->hf_boost_filter_present == 1) - { - temp = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - pstr_shape_filter_block_params->str_hf_boost_params.corner_freq_index = (temp>>2)&7; - pstr_shape_filter_block_params->str_hf_boost_params.filter_strength_index = temp&3; - - } - } - } - - temp = impd_read_bits_buf(it_bit_buff, 12); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = (temp>>6)&0x3f; - str_p_loc_drc_coefficients_uni_drc->gain_set_count = temp&0x3f; - - str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = str_p_loc_drc_coefficients_uni_drc->gain_set_count; - for(i=0; i<str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) - { - err = impd_parse_gain_set_params(it_bit_buff, version, &gain_seq_idx, &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); - if (err) return (err); - - if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].time_delt_min_flag) - { - if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].time_delt_min_val > ia_drc_params_struct->drc_frame_size) - { - /* drc time interval too big */ - return(PARAM_ERROR); - } - str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].num_gain_max_values = 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); - } - } - - for(i=0; i<str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) - { - WORD32 b; - for (b=0; b<str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; b++) { - str_p_loc_drc_coefficients_uni_drc->gain_set_params_index_for_gain_sequence[str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].gain_params[b].gain_seq_idx] = i; - } - } +impd_drc_parse_coeff( + ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc) { + WORD32 err = 0, i, drc_frame_size, temp; + WORD32 gain_seq_idx = -1; + + str_p_loc_drc_coefficients_uni_drc->version = version; + if (version == 0) { + WORD32 gain_sequence_count = 0; + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + str_p_loc_drc_coefficients_uni_drc->drc_location = (temp >> 1) & 0xf; + str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp & 1; + + if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) { + 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; + } + + str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = 0; + str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = 0; + str_p_loc_drc_coefficients_uni_drc->shape_filters_present = 0; + str_p_loc_drc_coefficients_uni_drc->gain_set_count = + impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = + str_p_loc_drc_coefficients_uni_drc->gain_set_count; + for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { + err = impd_parse_gain_set_params( + it_bit_buff, version, &gain_seq_idx, + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); + if (err) return (err); + + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .time_delt_min_flag) { + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .time_delt_min_val > ia_drc_params_struct->drc_frame_size) { + /* drc time interval too big */ + return (PARAM_ERROR); + } + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .num_gain_max_values = + 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); + } + gain_sequence_count += + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; } - return(0); -} - - -WORD32 -impd_drc_parse_instructions_basic(ia_bit_buf_struct* it_bit_buff, - ia_drc_instructions_basic_struct* str_drc_instructions_basic) -{ - //WORD32 err = 0; - WORD32 i, limiter_peak_target, temp; - WORD32 additional_dmix_id_present, additional_dmix_id_cnt; - - temp = impd_read_bits_buf(it_bit_buff, 18); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_drc_instructions_basic->drc_set_id = (temp>>12)&0x3f; - str_drc_instructions_basic->drc_location = (temp>>8)&0xf; - str_drc_instructions_basic->downmix_id[0] = (temp>>1)&0x7f; - additional_dmix_id_present = temp&1; - str_drc_instructions_basic->dwnmix_id_count = 1; - - if (additional_dmix_id_present) - { - additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - for(i=0; i<additional_dmix_id_cnt; i++) - { - str_drc_instructions_basic->downmix_id[i+1] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - str_drc_instructions_basic->dwnmix_id_count = 1 + additional_dmix_id_cnt; + str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = + gain_sequence_count; + } else { + ia_shape_filter_block_params_struct* pstr_shape_filter_block_params; + for (i = 0; i < SEQUENCE_COUNT_MAX; i++) { + str_p_loc_drc_coefficients_uni_drc + ->gain_set_params_index_for_gain_sequence[i] = -1; } - - str_drc_instructions_basic->drc_set_effect = impd_read_bits_buf(it_bit_buff, 16); - if(it_bit_buff->error) - return it_bit_buff->error; - - if ((str_drc_instructions_basic->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) - { - str_drc_instructions_basic->limiter_peak_target_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_drc_instructions_basic->limiter_peak_target_present) - { - - limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_instructions_basic->limiter_peak_target = - limiter_peak_target * 0.125f; - } + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + str_p_loc_drc_coefficients_uni_drc->drc_location = (temp >> 1) & 0xf; + str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present = temp & 1; + + if (str_p_loc_drc_coefficients_uni_drc->drc_frame_size_present == 1) { + 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; + } + str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_left_present == + 1) { + str_p_loc_drc_coefficients_uni_drc->characteristic_left_count = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 1; + i <= str_p_loc_drc_coefficients_uni_drc->characteristic_left_count; + i++) { + err = impd_parse_split_drc_characteristic( + it_bit_buff, LEFT_SIDE, &(str_p_loc_drc_coefficients_uni_drc + ->str_split_characteristic_left[i])); + if (err) return (err); + } + } + str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_p_loc_drc_coefficients_uni_drc->drc_characteristic_right_present == + 1) { + str_p_loc_drc_coefficients_uni_drc->characteristic_right_count = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 1; + i <= str_p_loc_drc_coefficients_uni_drc->characteristic_right_count; + i++) { + err = impd_parse_split_drc_characteristic( + it_bit_buff, RIGHT_SIDE, + &(str_p_loc_drc_coefficients_uni_drc + ->str_split_characteristic_right[i])); + if (err) return (err); + } + } + str_p_loc_drc_coefficients_uni_drc->shape_filters_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_p_loc_drc_coefficients_uni_drc->shape_filters_present == 1) { + str_p_loc_drc_coefficients_uni_drc->shape_num_filter = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 1; i <= str_p_loc_drc_coefficients_uni_drc->shape_num_filter; + i++) { + pstr_shape_filter_block_params = + &(str_p_loc_drc_coefficients_uni_drc + ->str_shape_filter_block_params[i]); + pstr_shape_filter_block_params->lf_cut_filter_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (pstr_shape_filter_block_params->lf_cut_filter_present == 1) { + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + pstr_shape_filter_block_params->str_lf_cut_params.corner_freq_index = + (temp >> 2) & 7; + pstr_shape_filter_block_params->str_lf_cut_params + .filter_strength_index = temp & 3; + } + pstr_shape_filter_block_params->lf_boost_filter_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_shape_filter_block_params->lf_boost_filter_present == 1) { + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + pstr_shape_filter_block_params->str_lf_boost_params + .corner_freq_index = (temp >> 2) & 7; + pstr_shape_filter_block_params->str_lf_boost_params + .filter_strength_index = temp & 3; + } + pstr_shape_filter_block_params->hf_cut_filter_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_shape_filter_block_params->hf_cut_filter_present == 1) { + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + pstr_shape_filter_block_params->str_hfCutParams.corner_freq_index = + (temp >> 2) & 7; + pstr_shape_filter_block_params->str_hfCutParams + .filter_strength_index = temp & 3; + } + pstr_shape_filter_block_params->hf_boost_filter_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (pstr_shape_filter_block_params->hf_boost_filter_present == 1) { + temp = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + pstr_shape_filter_block_params->str_hf_boost_params + .corner_freq_index = (temp >> 2) & 7; + pstr_shape_filter_block_params->str_hf_boost_params + .filter_strength_index = temp & 3; + } + } } - str_drc_instructions_basic->drc_set_target_loudness_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_drc_instructions_basic->drc_set_target_loudness_value_upper = 0; - str_drc_instructions_basic->drc_set_target_loudness_value_lower = -63; - - if (str_drc_instructions_basic->drc_set_target_loudness_present == 1) - { - WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; - bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_instructions_basic->drc_set_target_loudness_value_upper = bsDrcSetTargetLoudnessValueUpper - 63; - - str_drc_instructions_basic->drc_set_target_loudness_value_lower_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (str_drc_instructions_basic->drc_set_target_loudness_value_lower_present == 1) - { - bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_instructions_basic->drc_set_target_loudness_value_lower = bsDrcSetTargetLoudnessValueLower - 63; - } - } + temp = impd_read_bits_buf(it_bit_buff, 12); + if (it_bit_buff->error) return it_bit_buff->error; + + str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = + (temp >> 6) & 0x3f; + str_p_loc_drc_coefficients_uni_drc->gain_set_count = temp & 0x3f; + + str_p_loc_drc_coefficients_uni_drc->gain_set_count_plus = + str_p_loc_drc_coefficients_uni_drc->gain_set_count; + for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { + err = impd_parse_gain_set_params( + it_bit_buff, version, &gain_seq_idx, + &(str_p_loc_drc_coefficients_uni_drc->gain_set_params[i])); + if (err) return (err); + + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .time_delt_min_flag) { + if (str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .time_delt_min_val > ia_drc_params_struct->drc_frame_size) { + /* drc time interval too big */ + return (PARAM_ERROR); + } + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .num_gain_max_values = + 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); + } + } + + for (i = 0; i < str_p_loc_drc_coefficients_uni_drc->gain_set_count; i++) { + WORD32 b; + for (b = 0; + b < + str_p_loc_drc_coefficients_uni_drc->gain_set_params[i].band_count; + b++) { + str_p_loc_drc_coefficients_uni_drc + ->gain_set_params_index_for_gain_sequence + [str_p_loc_drc_coefficients_uni_drc->gain_set_params[i] + .gain_params[b] + .gain_seq_idx] = i; + } + } + } + return (0); +} - return(0); +WORD32 +impd_drc_parse_instructions_basic( + ia_bit_buf_struct* it_bit_buff, + ia_drc_instructions_basic_struct* str_drc_instructions_basic) { + // WORD32 err = 0; + WORD32 i, limiter_peak_target, temp; + WORD32 additional_dmix_id_present, additional_dmix_id_cnt; + + temp = impd_read_bits_buf(it_bit_buff, 18); + if (it_bit_buff->error) return it_bit_buff->error; + + str_drc_instructions_basic->drc_set_id = (temp >> 12) & 0x3f; + str_drc_instructions_basic->drc_location = (temp >> 8) & 0xf; + str_drc_instructions_basic->downmix_id[0] = (temp >> 1) & 0x7f; + additional_dmix_id_present = temp & 1; + str_drc_instructions_basic->dwnmix_id_count = 1; + + if (additional_dmix_id_present) { + additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < additional_dmix_id_cnt; i++) { + str_drc_instructions_basic->downmix_id[i + 1] = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } + str_drc_instructions_basic->dwnmix_id_count = 1 + additional_dmix_id_cnt; + } + + str_drc_instructions_basic->drc_set_effect = + impd_read_bits_buf(it_bit_buff, 16); + if (it_bit_buff->error) return it_bit_buff->error; + + if ((str_drc_instructions_basic->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) { + str_drc_instructions_basic->limiter_peak_target_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_drc_instructions_basic->limiter_peak_target_present) { + limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_instructions_basic->limiter_peak_target = + -limiter_peak_target * 0.125f; + } + } + + str_drc_instructions_basic->drc_set_target_loudness_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + str_drc_instructions_basic->drc_set_target_loudness_value_upper = 0; + str_drc_instructions_basic->drc_set_target_loudness_value_lower = -63; + + if (str_drc_instructions_basic->drc_set_target_loudness_present == 1) { + WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; + bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_instructions_basic->drc_set_target_loudness_value_upper = + bsDrcSetTargetLoudnessValueUpper - 63; + + str_drc_instructions_basic->drc_set_target_loudness_value_lower_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (str_drc_instructions_basic + ->drc_set_target_loudness_value_lower_present == 1) { + bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_instructions_basic->drc_set_target_loudness_value_lower = + bsDrcSetTargetLoudnessValueLower - 63; + } + } + + return (0); } WORD32 impd_dec_ducking_scaling(ia_bit_buf_struct* it_bit_buff, WORD32* ducking_scaling_flag, - FLOAT32* p_ducking_scaling) -{ - WORD32 ducking_scaling_present, ducking_scaling, sigma, mu; - - ducking_scaling_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (ducking_scaling_present == 0) - { - *ducking_scaling_flag = 0; - *p_ducking_scaling = 1.0f; - } - else - { - *ducking_scaling_flag = 1; - ducking_scaling = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - - - sigma = ducking_scaling >> 3; - mu = ducking_scaling & 0x7; - - if (sigma == 0) - { - *p_ducking_scaling = 1.0f + 0.125f * (1.0f + mu); - } - else - { - *p_ducking_scaling = 1.0f - 0.125f * (1.0f + mu); - } - } - return (0); + FLOAT32* p_ducking_scaling) { + WORD32 ducking_scaling_present, ducking_scaling, sigma, mu; + + ducking_scaling_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (ducking_scaling_present == 0) { + *ducking_scaling_flag = 0; + *p_ducking_scaling = 1.0f; + } else { + *ducking_scaling_flag = 1; + ducking_scaling = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + + sigma = ducking_scaling >> 3; + mu = ducking_scaling & 0x7; + + if (sigma == 0) { + *p_ducking_scaling = 1.0f + 0.125f * (1.0f + mu); + } else { + *p_ducking_scaling = 1.0f - 0.125f * (1.0f + mu); + } + } + return (0); } WORD32 -impd_parse_drc_instructions_uni_drc(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_config* drc_config, - ia_drc_instructions_struct* str_drc_instruction_str) -{ - WORD32 err = 0, i, n, k, g, c, limiter_peak_target, idx; - WORD32 additional_dmix_id_present, additional_dmix_id_cnt; - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; - WORD32 ch_cnt; - WORD32 unique_idx[MAX_CHANNEL_COUNT]; - FLOAT32 unique_scaling[MAX_CHANNEL_COUNT]; - WORD32 match; - WORD32 dmix_id_present; - WORD32 repeat_parameters, repeat_parameters_cnt; - WORD32 ducking_sequence; - FLOAT32 factor; - - str_drc_instruction_str->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - if (version == 0) - { - str_drc_instruction_str->drc_set_complexity_level = DRC_COMPLEXITY_LEVEL_MAX; - } - else - { - str_drc_instruction_str->drc_set_complexity_level = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - } - str_drc_instruction_str->drc_location = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; - dmix_id_present = 1; - if (version >= 1) - { - dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - if (dmix_id_present == 1) - { - str_drc_instruction_str->downmix_id[0] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - if (version >= 1) - { - str_drc_instruction_str->drc_apply_to_dwnmix = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - } - if (version == 0) - { - if (str_drc_instruction_str->downmix_id[0] == 0) - { - str_drc_instruction_str->drc_apply_to_dwnmix = 0; - } - else - { - str_drc_instruction_str->drc_apply_to_dwnmix = 1; - } - } - additional_dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (additional_dmix_id_present) - { - additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); - if(it_bit_buff->error) - return it_bit_buff->error; - for(i=0; i<additional_dmix_id_cnt; i++) - { - str_drc_instruction_str->downmix_id[i+1] = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - } - str_drc_instruction_str->dwnmix_id_count = 1 + additional_dmix_id_cnt; - } else - { - str_drc_instruction_str->dwnmix_id_count = 1; - } - } - else - { - str_drc_instruction_str->downmix_id[0] = 0; - str_drc_instruction_str->dwnmix_id_count = 1; +impd_parse_drc_instructions_uni_drc( + ia_bit_buf_struct* it_bit_buff, WORD32 version, ia_drc_config* drc_config, + ia_drc_instructions_struct* str_drc_instruction_str) { + WORD32 err = 0, i, n, k, g, c, limiter_peak_target, idx; + WORD32 additional_dmix_id_present, additional_dmix_id_cnt; + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc = NULL; + WORD32 ch_cnt; + WORD32 unique_idx[MAX_CHANNEL_COUNT]; + FLOAT32 unique_scaling[MAX_CHANNEL_COUNT]; + WORD32 match; + WORD32 dmix_id_present; + WORD32 repeat_parameters, repeat_parameters_cnt; + WORD32 ducking_sequence; + FLOAT32 factor; + + str_drc_instruction_str->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + if (version == 0) { + str_drc_instruction_str->drc_set_complexity_level = + DRC_COMPLEXITY_LEVEL_MAX; + } else { + str_drc_instruction_str->drc_set_complexity_level = + impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + } + str_drc_instruction_str->drc_location = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; + dmix_id_present = 1; + if (version >= 1) { + dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + if (dmix_id_present == 1) { + str_drc_instruction_str->downmix_id[0] = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + if (version >= 1) { + str_drc_instruction_str->drc_apply_to_dwnmix = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; } - - str_drc_instruction_str->drc_set_effect = impd_read_bits_buf(it_bit_buff, 16); - if(it_bit_buff->error) - return it_bit_buff->error; - - if ((str_drc_instruction_str->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) - { - str_drc_instruction_str->limiter_peak_target_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_drc_instruction_str->limiter_peak_target_present) - { - limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_instruction_str->limiter_peak_target = - limiter_peak_target * 0.125f; - } - } - - str_drc_instruction_str->drc_set_target_loudness_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - str_drc_instruction_str->drc_set_target_loudness_value_upper = 0; - str_drc_instruction_str->drc_set_target_loudness_value_lower = -63; - - if (str_drc_instruction_str->drc_set_target_loudness_present == 1) - { - WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; - bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_instruction_str->drc_set_target_loudness_value_upper = bsDrcSetTargetLoudnessValueUpper - 63; - str_drc_instruction_str->drc_set_target_loudness_value_lower_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - if (str_drc_instruction_str->drc_set_target_loudness_value_lower_present == 1) - { - bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - str_drc_instruction_str->drc_set_target_loudness_value_lower = bsDrcSetTargetLoudnessValueLower - 63; - } - } - - - str_drc_instruction_str->depends_on_drc_set_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - - str_drc_instruction_str->no_independent_use = 0; - if (str_drc_instruction_str->depends_on_drc_set_present) - { - - str_drc_instruction_str->depends_on_drc_set = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - } - else - { - - str_drc_instruction_str->no_independent_use = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - } - if (version == 0) - { - str_drc_instruction_str->requires_eq = 0; - } - else - { - - str_drc_instruction_str->requires_eq = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - } - - err = impd_sel_drc_coeff(drc_config, str_drc_instruction_str->drc_location, &str_p_loc_drc_coefficients_uni_drc); - if (err) return (err); - - ch_cnt = drc_config->channel_layout.base_channel_count; - - for (c=0; c<MAX_CHANNEL_COUNT; c++) - { - unique_idx[c] = -10; - unique_scaling[c] = -10.0f; - } - - if (str_drc_instruction_str->drc_set_effect & (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) - { - c=0; - while (c<ch_cnt) - { - 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; - str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; - impd_dec_ducking_scaling(it_bit_buff, - &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c].ducking_scaling_flag), - &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c].ducking_scaling)); - - c++; - - repeat_parameters = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; - - - if (repeat_parameters == 1) - { - - repeat_parameters_cnt = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - repeat_parameters_cnt += 1; - for (k=0; k<repeat_parameters_cnt; k++) - { - str_drc_instruction_str->gain_set_index[c] = str_drc_instruction_str->gain_set_index[c-1]; - str_drc_instruction_str->str_ducking_modifiers_for_channel[c].ducking_scaling_flag = str_drc_instruction_str->str_ducking_modifiers_for_channel[c-1].ducking_scaling_flag; - str_drc_instruction_str->str_ducking_modifiers_for_channel[c].ducking_scaling = str_drc_instruction_str->str_ducking_modifiers_for_channel[c-1].ducking_scaling; - c++; - } - } - } - if (c>ch_cnt) - { - return(UNEXPECTED_ERROR); - } - ducking_sequence = -1; - g = 0; - if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) - { - for (c=0; c<ch_cnt; c++) - { - match = 0; - idx = str_drc_instruction_str->gain_set_index[c]; - factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c].ducking_scaling; - if (idx < 0) { - for (n=0; n<g; n++) - { - if (unique_scaling[n] == factor) - { - match = 1; - str_drc_instruction_str->channel_group_of_ch[c] = n; - break; - } - } - if (match == 0) - { - unique_idx[g] = idx; - unique_scaling[g] = factor; - str_drc_instruction_str->channel_group_of_ch[c] = g; - g++; - } - } - else - { - if ((ducking_sequence > 0) && (ducking_sequence != idx)) - { - /* drc for ducking can have only one ducking sequence */ - return(UNEXPECTED_ERROR); - } - ducking_sequence = idx; - str_drc_instruction_str->channel_group_of_ch[c] = -1; - } - } - str_drc_instruction_str->num_drc_ch_groups = g; - if (ducking_sequence == -1) - { - /* ducking sequence not found */ - return(UNEXPECTED_ERROR); - } - } else if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_SELF) - { - for (c=0; c<ch_cnt; c++) - { - match = 0; - idx = str_drc_instruction_str->gain_set_index[c]; - factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c].ducking_scaling; - if (idx >= 0) { - for (n=0; n<g; n++) { - if ((unique_idx[n] == idx) && (unique_scaling[n] == factor)) - { - match = 1; - str_drc_instruction_str->channel_group_of_ch[c] = n; - break; - } - } - if (match == 0) - { - unique_idx[g] = idx; - unique_scaling[g] = factor; - str_drc_instruction_str->channel_group_of_ch[c] = g; - g++; - } - } - else - { - str_drc_instruction_str->channel_group_of_ch[c] = -1; - } + if (version == 0) { + if (str_drc_instruction_str->downmix_id[0] == 0) { + str_drc_instruction_str->drc_apply_to_dwnmix = 0; + } else { + str_drc_instruction_str->drc_apply_to_dwnmix = 1; + } + } + additional_dmix_id_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (additional_dmix_id_present) { + additional_dmix_id_cnt = impd_read_bits_buf(it_bit_buff, 3); + if (it_bit_buff->error) return it_bit_buff->error; + for (i = 0; i < additional_dmix_id_cnt; i++) { + str_drc_instruction_str->downmix_id[i + 1] = + impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + } + str_drc_instruction_str->dwnmix_id_count = 1 + additional_dmix_id_cnt; + } else { + str_drc_instruction_str->dwnmix_id_count = 1; + } + } else { + str_drc_instruction_str->downmix_id[0] = 0; + str_drc_instruction_str->dwnmix_id_count = 1; + } + + str_drc_instruction_str->drc_set_effect = impd_read_bits_buf(it_bit_buff, 16); + if (it_bit_buff->error) return it_bit_buff->error; + + if ((str_drc_instruction_str->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) == 0) { + str_drc_instruction_str->limiter_peak_target_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_drc_instruction_str->limiter_peak_target_present) { + limiter_peak_target = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_instruction_str->limiter_peak_target = + -limiter_peak_target * 0.125f; + } + } + + str_drc_instruction_str->drc_set_target_loudness_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + str_drc_instruction_str->drc_set_target_loudness_value_upper = 0; + str_drc_instruction_str->drc_set_target_loudness_value_lower = -63; + + if (str_drc_instruction_str->drc_set_target_loudness_present == 1) { + WORD32 bsDrcSetTargetLoudnessValueUpper, bsDrcSetTargetLoudnessValueLower; + bsDrcSetTargetLoudnessValueUpper = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_instruction_str->drc_set_target_loudness_value_upper = + bsDrcSetTargetLoudnessValueUpper - 63; + str_drc_instruction_str->drc_set_target_loudness_value_lower_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + if (str_drc_instruction_str->drc_set_target_loudness_value_lower_present == + 1) { + bsDrcSetTargetLoudnessValueLower = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + str_drc_instruction_str->drc_set_target_loudness_value_lower = + bsDrcSetTargetLoudnessValueLower - 63; + } + } + + str_drc_instruction_str->depends_on_drc_set_present = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + str_drc_instruction_str->no_independent_use = 0; + if (str_drc_instruction_str->depends_on_drc_set_present) { + str_drc_instruction_str->depends_on_drc_set = + impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + str_drc_instruction_str->no_independent_use = + impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + if (version == 0) { + str_drc_instruction_str->requires_eq = 0; + } else { + str_drc_instruction_str->requires_eq = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + } + + err = impd_sel_drc_coeff(drc_config, str_drc_instruction_str->drc_location, + &str_p_loc_drc_coefficients_uni_drc); + if (err) return (err); + + ch_cnt = drc_config->channel_layout.base_channel_count; + + for (c = 0; c < MAX_CHANNEL_COUNT; c++) { + unique_idx[c] = -10; + unique_scaling[c] = -10.0f; + } + + if (str_drc_instruction_str->drc_set_effect & + (EFFECT_BIT_DUCK_OTHER | EFFECT_BIT_DUCK_SELF)) { + c = 0; + while (c < ch_cnt) { + 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; + str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; + impd_dec_ducking_scaling( + it_bit_buff, + &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c] + .ducking_scaling_flag), + &(str_drc_instruction_str->str_ducking_modifiers_for_channel[c] + .ducking_scaling)); + + c++; + + repeat_parameters = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; + + if (repeat_parameters == 1) { + repeat_parameters_cnt = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + repeat_parameters_cnt += 1; + for (k = 0; k < repeat_parameters_cnt; k++) { + str_drc_instruction_str->gain_set_index[c] = + str_drc_instruction_str->gain_set_index[c - 1]; + str_drc_instruction_str->str_ducking_modifiers_for_channel[c] + .ducking_scaling_flag = + str_drc_instruction_str->str_ducking_modifiers_for_channel[c - 1] + .ducking_scaling_flag; + str_drc_instruction_str->str_ducking_modifiers_for_channel[c] + .ducking_scaling = + str_drc_instruction_str->str_ducking_modifiers_for_channel[c - 1] + .ducking_scaling; + c++; + } + } + } + if (c > ch_cnt) { + return (UNEXPECTED_ERROR); + } + ducking_sequence = -1; + g = 0; + if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) { + for (c = 0; c < ch_cnt; c++) { + match = 0; + idx = str_drc_instruction_str->gain_set_index[c]; + factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c] + .ducking_scaling; + if (idx < 0) { + for (n = 0; n < g; n++) { + if (unique_scaling[n] == factor) { + match = 1; + str_drc_instruction_str->channel_group_of_ch[c] = n; + break; } - str_drc_instruction_str->num_drc_ch_groups = g; - } - - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups; g++) - { - WORD32 set = (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) ? ducking_sequence : unique_idx[g]; - 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]; - if (unique_scaling[g] != 1.0f) - { - str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g].ducking_scaling_flag = 1; + } + if (match == 0) { + unique_idx[g] = idx; + unique_scaling[g] = factor; + str_drc_instruction_str->channel_group_of_ch[c] = g; + g++; + } + } else { + if ((ducking_sequence > 0) && (ducking_sequence != idx)) { + /* drc for ducking can have only one ducking sequence */ + return (UNEXPECTED_ERROR); + } + ducking_sequence = idx; + str_drc_instruction_str->channel_group_of_ch[c] = -1; + } + } + str_drc_instruction_str->num_drc_ch_groups = g; + if (ducking_sequence == -1) { + /* ducking sequence not found */ + return (UNEXPECTED_ERROR); + } + } else if (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_SELF) { + for (c = 0; c < ch_cnt; c++) { + match = 0; + idx = str_drc_instruction_str->gain_set_index[c]; + factor = str_drc_instruction_str->str_ducking_modifiers_for_channel[c] + .ducking_scaling; + if (idx >= 0) { + for (n = 0; n < g; n++) { + if ((unique_idx[n] == idx) && (unique_scaling[n] == factor)) { + match = 1; + str_drc_instruction_str->channel_group_of_ch[c] = n; + break; } - else - { - str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g].ducking_scaling_flag = 0; + } + if (match == 0) { + unique_idx[g] = idx; + unique_scaling[g] = factor; + str_drc_instruction_str->channel_group_of_ch[c] = g; + g++; + } + } else { + str_drc_instruction_str->channel_group_of_ch[c] = -1; + } + } + str_drc_instruction_str->num_drc_ch_groups = g; + } + + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { + WORD32 set = + (str_drc_instruction_str->drc_set_effect & EFFECT_BIT_DUCK_OTHER) + ? ducking_sequence + : unique_idx[g]; + 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]; + if (unique_scaling[g] != 1.0f) { + str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] + .ducking_scaling_flag = 1; + } else { + str_drc_instruction_str->str_ducking_modifiers_for_channel_group[g] + .ducking_scaling_flag = 0; + } + str_drc_instruction_str->band_count_of_ch_group[g] = 1; + } + } else { + if (((version == 0) || + (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && + (str_drc_instruction_str->downmix_id[0] != 0) && + (str_drc_instruction_str->downmix_id[0] != ID_FOR_ANY_DOWNMIX) && + (str_drc_instruction_str->dwnmix_id_count == 1)) { + for (i = 0; i < drc_config->dwnmix_instructions_count; i++) { + if (str_drc_instruction_str->downmix_id[0] == + drc_config->dwnmix_instructions[i].downmix_id) + break; + } + if (i == drc_config->dwnmix_instructions_count) { + /* dwnmix_instructions not found */ + return (UNEXPECTED_ERROR); + } + ch_cnt = drc_config->dwnmix_instructions[i].target_channel_count; + } else if (((version == 0) || + (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && + ((str_drc_instruction_str->downmix_id[0] == + ID_FOR_ANY_DOWNMIX) || + (str_drc_instruction_str->dwnmix_id_count > 1))) { + ch_cnt = 1; + } + + c = 0; + while (c < ch_cnt) { + WORD32 bs_gain_set_idx; + WORD32 repeat_gain_set_idx, repeat_gain_set_idx_cnt, temp; + + temp = impd_read_bits_buf(it_bit_buff, 7); + if (it_bit_buff->error) return it_bit_buff->error; + + bs_gain_set_idx = (temp >> 1) & 0x7f; + repeat_gain_set_idx = temp & 1; + + str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; + c++; + + if (repeat_gain_set_idx == 1) { + repeat_gain_set_idx_cnt = impd_read_bits_buf(it_bit_buff, 5); + if (it_bit_buff->error) return it_bit_buff->error; + + repeat_gain_set_idx_cnt += 1; + for (k = 0; k < repeat_gain_set_idx_cnt; k++) { + str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; + c++; + } + } + } + if (c > ch_cnt) { + return (UNEXPECTED_ERROR); + } + + g = 0; + if ((str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || + (str_drc_instruction_str->dwnmix_id_count > 1)) { + WORD32 idx = str_drc_instruction_str->gain_set_index[0]; + if (idx >= 0) { + unique_idx[0] = idx; + g = 1; + } + } else { + for (c = 0; c < ch_cnt; c++) { + WORD32 idx = str_drc_instruction_str->gain_set_index[c]; + match = 0; + if (idx >= 0) { + for (n = 0; n < g; n++) { + if (unique_idx[n] == idx) { + match = 1; + str_drc_instruction_str->channel_group_of_ch[c] = n; + break; } - str_drc_instruction_str->band_count_of_ch_group[g] = 1; + } + if (match == 0) { + unique_idx[g] = idx; + str_drc_instruction_str->channel_group_of_ch[c] = g; + g++; + } + } else { + str_drc_instruction_str->channel_group_of_ch[c] = -1; } + } } - else - { - if ( - ((version==0) || (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && - (str_drc_instruction_str->downmix_id[0] != 0) && (str_drc_instruction_str->downmix_id[0] != ID_FOR_ANY_DOWNMIX) && (str_drc_instruction_str->dwnmix_id_count==1)) - { - for(i=0; i<drc_config->dwnmix_instructions_count; i++) - { - if (str_drc_instruction_str->downmix_id[0] == drc_config->dwnmix_instructions[i].downmix_id) break; - } - if (i == drc_config->dwnmix_instructions_count) - { - /* dwnmix_instructions not found */ - return(UNEXPECTED_ERROR); - } - ch_cnt = drc_config->dwnmix_instructions[i].target_channel_count; - } - else if ( - ((version==0) || (str_drc_instruction_str->drc_apply_to_dwnmix != 0)) && - ((str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || (str_drc_instruction_str->dwnmix_id_count > 1))) - { - ch_cnt = 1; - } - - c=0; - while (c<ch_cnt) - { - WORD32 bs_gain_set_idx; - WORD32 repeat_gain_set_idx, repeat_gain_set_idx_cnt, temp; - - temp = impd_read_bits_buf(it_bit_buff, 7); - if(it_bit_buff->error) - return it_bit_buff->error; - - bs_gain_set_idx = (temp>>1)&0x7f; - repeat_gain_set_idx = temp&1; - - str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; - c++; - - if (repeat_gain_set_idx == 1) - { - - repeat_gain_set_idx_cnt = impd_read_bits_buf(it_bit_buff, 5); - if(it_bit_buff->error) - return it_bit_buff->error; - - repeat_gain_set_idx_cnt += 1; - for (k=0; k<repeat_gain_set_idx_cnt; k++) - { - str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; - c++; - } - } - } - if (c>ch_cnt) - { - return(UNEXPECTED_ERROR); - } - g = 0; - if ((str_drc_instruction_str->downmix_id[0] == ID_FOR_ANY_DOWNMIX) || (str_drc_instruction_str->dwnmix_id_count > 1)) - { - WORD32 idx = str_drc_instruction_str->gain_set_index[0]; - if (idx >= 0) - { - unique_idx[0] = idx; - g = 1; - } - } - else { - for (c=0; c<ch_cnt; c++) - { - WORD32 idx = str_drc_instruction_str->gain_set_index[c]; - match = 0; - if (idx>=0) - { - for (n=0; n<g; n++) - { - if (unique_idx[n] == idx) - { - match = 1; - str_drc_instruction_str->channel_group_of_ch[c] = n; - break; - } - } - if (match == 0) - { - unique_idx[g] = idx; - str_drc_instruction_str->channel_group_of_ch[c] = g; - g++; - } - } - else - { - str_drc_instruction_str->channel_group_of_ch[c] = -1; - } - } - } + str_drc_instruction_str->num_drc_ch_groups = g; + for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { + WORD32 set, band_count; - str_drc_instruction_str->num_drc_ch_groups = g; - for (g=0; g<str_drc_instruction_str->num_drc_ch_groups; g++) - { - WORD32 set, band_count; + set = unique_idx[g]; + str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; - set = unique_idx[g]; - str_drc_instruction_str->gain_set_index_for_channel_group[g] = set; + if (str_p_loc_drc_coefficients_uni_drc != NULL && + set < str_p_loc_drc_coefficients_uni_drc->gain_set_count) { + band_count = + str_p_loc_drc_coefficients_uni_drc->gain_set_params[set].band_count; + } else { + band_count = 1; + } - if (str_p_loc_drc_coefficients_uni_drc != NULL && set < str_p_loc_drc_coefficients_uni_drc->gain_set_count) - { - band_count = str_p_loc_drc_coefficients_uni_drc->gain_set_params[set].band_count; - } else - { - band_count = 1; - } - - err = impd_dec_gain_modifiers(it_bit_buff, version, band_count, &(str_drc_instruction_str->str_gain_modifiers_of_ch_group[g])); - if (err) return (err); - } + err = impd_dec_gain_modifiers( + it_bit_buff, version, band_count, + &(str_drc_instruction_str->str_gain_modifiers_of_ch_group[g])); + if (err) return (err); } + } - return(0); + return (0); } WORD32 -impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_loudness_info_struct* loudness_info) -{ - WORD32 err = 0, sample_peak_level, true_peak_level, i, temp; - - loudness_info->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - if (version >= 1) - { - loudness_info->eq_set_id = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - } - else - { - loudness_info->eq_set_id = 0; - } - - temp = impd_read_bits_buf(it_bit_buff, 8); - if(it_bit_buff->error) - return it_bit_buff->error; +impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_loudness_info_struct* loudness_info) { + WORD32 err = 0, sample_peak_level, true_peak_level, i, temp; - loudness_info->downmix_id = (temp>>1)&0x7f; - loudness_info->sample_peak_level_present = temp&1; + loudness_info->drc_set_id = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; - if(loudness_info->sample_peak_level_present) - { + if (version >= 1) { + loudness_info->eq_set_id = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + } else { + loudness_info->eq_set_id = 0; + } - sample_peak_level = impd_read_bits_buf(it_bit_buff, 12); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf(it_bit_buff, 8); + if (it_bit_buff->error) return it_bit_buff->error; - if (sample_peak_level == 0) - { - loudness_info->sample_peak_level_present = 0; - loudness_info->sample_peak_level = 0.0f; - } - else - { - loudness_info->sample_peak_level = 20.0f - sample_peak_level * 0.03125f; - } - } + loudness_info->downmix_id = (temp >> 1) & 0x7f; + loudness_info->sample_peak_level_present = temp & 1; - loudness_info->true_peak_level_present = impd_read_bits_buf(it_bit_buff, 1); - if(it_bit_buff->error) - return it_bit_buff->error; + if (loudness_info->sample_peak_level_present) { + sample_peak_level = impd_read_bits_buf(it_bit_buff, 12); + if (it_bit_buff->error) return it_bit_buff->error; - if(loudness_info->true_peak_level_present) - { + if (sample_peak_level == 0) { + loudness_info->sample_peak_level_present = 0; + loudness_info->sample_peak_level = 0.0f; + } else { + loudness_info->sample_peak_level = 20.0f - sample_peak_level * 0.03125f; + } + } - true_peak_level = impd_read_bits_buf(it_bit_buff, 12); - if(it_bit_buff->error) - return it_bit_buff->error; + loudness_info->true_peak_level_present = impd_read_bits_buf(it_bit_buff, 1); + if (it_bit_buff->error) return it_bit_buff->error; - if (true_peak_level == 0) - { - loudness_info->true_peak_level_present = 0; - loudness_info->true_peak_level = 0.0f; - } - else - { - loudness_info->true_peak_level = 20.0f - true_peak_level * 0.03125f; - } + if (loudness_info->true_peak_level_present) { + true_peak_level = impd_read_bits_buf(it_bit_buff, 12); + if (it_bit_buff->error) return it_bit_buff->error; - temp = impd_read_bits_buf(it_bit_buff, 6); - if(it_bit_buff->error) - return it_bit_buff->error; - - loudness_info->true_peak_level_measurement_system = (temp>>2)&0xf; - loudness_info->true_peak_level_reliability = temp&3; + if (true_peak_level == 0) { + loudness_info->true_peak_level_present = 0; + loudness_info->true_peak_level = 0.0f; + } else { + loudness_info->true_peak_level = 20.0f - true_peak_level * 0.03125f; } - loudness_info->measurement_count = impd_read_bits_buf(it_bit_buff, 4); - if(it_bit_buff->error) - return it_bit_buff->error; + temp = impd_read_bits_buf(it_bit_buff, 6); + if (it_bit_buff->error) return it_bit_buff->error; + + loudness_info->true_peak_level_measurement_system = (temp >> 2) & 0xf; + loudness_info->true_peak_level_reliability = temp & 3; + } + loudness_info->measurement_count = impd_read_bits_buf(it_bit_buff, 4); + if (it_bit_buff->error) return it_bit_buff->error; - for (i=0; i<loudness_info->measurement_count; i++) - { - err = impd_parse_loudness_measure(it_bit_buff, &(loudness_info->loudness_measure[i])); - if (err) return(err); - } + for (i = 0; i < loudness_info->measurement_count; i++) { + err = impd_parse_loudness_measure(it_bit_buff, + &(loudness_info->loudness_measure[i])); + if (err) return (err); + } - return(0); + return (0); }
\ No newline at end of file diff --git a/decoder/drc_src/impd_drc_struct.h b/decoder/drc_src/impd_drc_struct.h index f3fe501..a608da9 100644 --- a/decoder/drc_src/impd_drc_struct.h +++ b/decoder/drc_src/impd_drc_struct.h @@ -20,639 +20,653 @@ #ifndef IMPD_DRC_STURCT_H #define IMPD_DRC_STURCT_H - #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -#define METHOD_DEFINITION_UNKNOWN_OTHER 0 -#define METHOD_DEFINITION_PROGRAM_LOUDNESS 1 -#define METHOD_DEFINITION_ANCHOR_LOUDNESS 2 -#define METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE 3 -#define METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX 4 -#define METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX 5 -#define METHOD_DEFINITION_LOUDNESS_RANGE 6 -#define METHOD_DEFINITION_MIXING_LEVEL 7 -#define METHOD_DEFINITION_ROOM_TYPE 8 -#define METHOD_DEFINITION_SHORT_TERM_LOUDNESS 9 - -#define MEASUREMENT_SYSTEM_UNKNOWN_OTHER 0 -#define MEASUREMENT_SYSTEM_EBU_R_128 1 -#define MEASUREMENT_SYSTEM_BS_1770_4 2 -#define MEASUREMENT_SYSTEM_BS_1770_3 MEASUREMENT_SYSTEM_BS_1770_4 +#define METHOD_DEFINITION_UNKNOWN_OTHER 0 +#define METHOD_DEFINITION_PROGRAM_LOUDNESS 1 +#define METHOD_DEFINITION_ANCHOR_LOUDNESS 2 +#define METHOD_DEFINITION_MAX_OF_LOUDNESS_RANGE 3 +#define METHOD_DEFINITION_MOMENTARY_LOUDNESS_MAX 4 +#define METHOD_DEFINITION_SHORT_TERM_LOUDNESS_MAX 5 +#define METHOD_DEFINITION_LOUDNESS_RANGE 6 +#define METHOD_DEFINITION_MIXING_LEVEL 7 +#define METHOD_DEFINITION_ROOM_TYPE 8 +#define METHOD_DEFINITION_SHORT_TERM_LOUDNESS 9 + +#define MEASUREMENT_SYSTEM_UNKNOWN_OTHER 0 +#define MEASUREMENT_SYSTEM_EBU_R_128 1 +#define MEASUREMENT_SYSTEM_BS_1770_4 2 +#define MEASUREMENT_SYSTEM_BS_1770_3 MEASUREMENT_SYSTEM_BS_1770_4 #define MEASUREMENT_SYSTEM_BS_1770_4_PRE_PROCESSING 3 -#define MEASUREMENT_SYSTEM_BS_1770_3_PRE_PROCESSING MEASUREMENT_SYSTEM_BS_1770_4_PRE_PROCESSING -#define MEASUREMENT_SYSTEM_USER 4 -#define MEASUREMENT_SYSTEM_EXPERT_PANEL 5 -#define MEASUREMENT_SYSTEM_BS_1771_1 6 -#define MEASUREMENT_SYSTEM_RESERVED_A 7 -#define MEASUREMENT_SYSTEM_RESERVED_B 8 -#define MEASUREMENT_SYSTEM_RESERVED_C 9 -#define MEASUREMENT_SYSTEM_RESERVED_D 10 -#define MEASUREMENT_SYSTEM_RESERVED_E 11 - -#define RELIABILITY_UKNOWN 0 -#define RELIABILITY_UNVERIFIED 1 -#define RELIABILITY_CEILING 2 -#define RELIABILITY_ACCURATE 3 - -#define EFFECT_BIT_COUNT 12 - -#define EFFECT_BIT_NONE (-1) -#define EFFECT_BIT_NIGHT 0x0001 -#define EFFECT_BIT_NOISY 0x0002 -#define EFFECT_BIT_LIMITED 0x0004 -#define EFFECT_BIT_LOWLEVEL 0x0008 -#define EFFECT_BIT_DIALOG 0x0010 -#define EFFECT_BIT_GENERAL_COMPR 0x0020 -#define EFFECT_BIT_EXPAND 0x0040 -#define EFFECT_BIT_ARTISTIC 0x0080 -#define EFFECT_BIT_CLIPPING 0x0100 -#define EFFECT_BIT_FADE 0x0200 -#define EFFECT_BIT_DUCK_OTHER 0x0400 -#define EFFECT_BIT_DUCK_SELF 0x0800 - -#define GAIN_CODING_PROFILE_REGULAR 0 -#define GAIN_CODING_PROFILE_FADING 1 -#define GAIN_CODING_PROFILE_CLIPPING 2 -#define GAIN_CODING_PROFILE_CONSTANT 3 -#define GAIN_CODING_PROFILE_DUCKING GAIN_CODING_PROFILE_CLIPPING - -#define GAIN_INTERPOLATION_TYPE_SPLINE 0 -#define GAIN_INTERPOLATION_TYPE_LINEAR 1 - -#define USER_METHOD_DEFINITION_DEFAULT 0 -#define USER_METHOD_DEFINITION_PROGRAM_LOUDNESS 1 -#define USER_METHOD_DEFINITION_ANCHOR_LOUDNESS 2 - -#define USER_MEASUREMENT_SYSTEM_DEFAULT 0 -#define USER_MEASUREMENT_SYSTEM_BS_1770_4 1 -#define USER_MEASUREMENT_SYSTEM_BS_1770_3 USER_MEASUREMENT_SYSTEM_BS_1770_4 -#define USER_MEASUREMENT_SYSTEM_USER 2 -#define USER_MEASUREMENT_SYSTEM_EXPERT_PANEL 3 -#define USER_MEASUREMENT_SYSTEM_RESERVED_A 4 -#define USER_MEASUREMENT_SYSTEM_RESERVED_B 5 -#define USER_MEASUREMENT_SYSTEM_RESERVED_C 6 -#define USER_MEASUREMENT_SYSTEM_RESERVED_D 7 -#define USER_MEASUREMENT_SYSTEM_RESERVED_E 8 - -#define USER_LOUDNESS_PREPROCESSING_DEFAULT 0 -#define USER_LOUDNESS_PREPROCESSING_OFF 1 -#define USER_LOUDNESS_PREPROCESSING_HIGHPASS 2 - -#define LOUDNESS_DEVIATION_MAX_DEFAULT 63 -#define LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT 1000 - -#define SHORT_TERM_LOUDNESS_TO_AVG 0 -#define MOMENTARY_LOUDNESS_TO_AVG 1 -#define TOP_OF_LOUDNESS_RANGE_TO_AVG 2 - -#define DRC_COMPLEXITY_LEVEL_MAX 0xF -#define EQ_COMPLEXITY_LEVEL_MAX 0xF -#define COMPLEXITY_LEVEL_SUPPORTED_TOTAL 20.0f - -#define COMPLEXITY_W_SUBBAND_EQ 2.5f -#define COMPLEXITY_W_FIR 0.4f -#define COMPLEXITY_W_IIR 5.0f -#define COMPLEXITY_W_MOD_TIME 1.0f -#define COMPLEXITY_W_MOD_SUBBAND 2.0f -#define COMPLEXITY_W_LAP 2.0f -#define COMPLEXITY_W_SHAPE 6.0f -#define COMPLEXITY_W_SPLINE 5.0f -#define COMPLEXITY_W_LINEAR 2.5f -#define COMPLEXITY_W_PARAM_DRC_FILT 5.0f -#define COMPLEXITY_W_PARAM_DRC_SUBBAND 5.0f -#define COMPLEXITY_W_PARAM_LIM_FILT 4.5f -#define COMPLEXITY_W_PARAM_DRC_ATTACK 136.0f - -#define LEFT_SIDE 0 -#define RIGHT_SIDE 1 - -#define CHARACTERISTIC_SIGMOID 0 -#define CHARACTERISTIC_NODES 1 -#define CHARACTERISTIC_PASS_THRU 2 - -#define GAINFORMAT_QMF32 0x1 -#define GAINFORMAT_QMFHYBRID39 0x2 -#define GAINFORMAT_QMF64 0x3 -#define GAINFORMAT_QMFHYBRID71 0x4 -#define GAINFORMAT_QMF128 0x5 -#define GAINFORMAT_QMFHYBRID135 0x6 -#define GAINFORMAT_UNIFORM 0x7 - -#define DRC_INPUT_LOUDNESS_TARGET (-31.0f) - -#define SHAPE_FILTER_TYPE_OFF 0 -#define SHAPE_FILTER_TYPE_LF_CUT 1 -#define SHAPE_FILTER_TYPE_LF_BOOST 2 -#define SHAPE_FILTER_TYPE_HF_CUT 3 -#define SHAPE_FILTER_TYPE_HF_BOOST 4 - -#define SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE 1583.8931924611f - -typedef struct { - WORD32 type; - FLOAT32 gain_offset; - FLOAT32 y1_bound; - FLOAT32 warped_gain_max; - FLOAT32 factor; - FLOAT32 coeff_sum; - FLOAT32 partial_coeff_sum; - FLOAT32 g_norm; - FLOAT32 a1; - FLOAT32 a2; - FLOAT32 b1; - FLOAT32 b2; - FLOAT32 audio_in_state_1[MAX_CHANNEL_COUNT]; - FLOAT32 audio_in_state_2[MAX_CHANNEL_COUNT]; - FLOAT32 audio_out_state_1[MAX_CHANNEL_COUNT]; - FLOAT32 audio_out_state_2[MAX_CHANNEL_COUNT]; +#define MEASUREMENT_SYSTEM_BS_1770_3_PRE_PROCESSING \ + MEASUREMENT_SYSTEM_BS_1770_4_PRE_PROCESSING +#define MEASUREMENT_SYSTEM_USER 4 +#define MEASUREMENT_SYSTEM_EXPERT_PANEL 5 +#define MEASUREMENT_SYSTEM_BS_1771_1 6 +#define MEASUREMENT_SYSTEM_RESERVED_A 7 +#define MEASUREMENT_SYSTEM_RESERVED_B 8 +#define MEASUREMENT_SYSTEM_RESERVED_C 9 +#define MEASUREMENT_SYSTEM_RESERVED_D 10 +#define MEASUREMENT_SYSTEM_RESERVED_E 11 + +#define RELIABILITY_UKNOWN 0 +#define RELIABILITY_UNVERIFIED 1 +#define RELIABILITY_CEILING 2 +#define RELIABILITY_ACCURATE 3 + +#define EFFECT_BIT_COUNT 12 + +#define EFFECT_BIT_NONE (-1) +#define EFFECT_BIT_NIGHT 0x0001 +#define EFFECT_BIT_NOISY 0x0002 +#define EFFECT_BIT_LIMITED 0x0004 +#define EFFECT_BIT_LOWLEVEL 0x0008 +#define EFFECT_BIT_DIALOG 0x0010 +#define EFFECT_BIT_GENERAL_COMPR 0x0020 +#define EFFECT_BIT_EXPAND 0x0040 +#define EFFECT_BIT_ARTISTIC 0x0080 +#define EFFECT_BIT_CLIPPING 0x0100 +#define EFFECT_BIT_FADE 0x0200 +#define EFFECT_BIT_DUCK_OTHER 0x0400 +#define EFFECT_BIT_DUCK_SELF 0x0800 + +#define GAIN_CODING_PROFILE_REGULAR 0 +#define GAIN_CODING_PROFILE_FADING 1 +#define GAIN_CODING_PROFILE_CLIPPING 2 +#define GAIN_CODING_PROFILE_CONSTANT 3 +#define GAIN_CODING_PROFILE_DUCKING GAIN_CODING_PROFILE_CLIPPING + +#define GAIN_INTERPOLATION_TYPE_SPLINE 0 +#define GAIN_INTERPOLATION_TYPE_LINEAR 1 + +#define USER_METHOD_DEFINITION_DEFAULT 0 +#define USER_METHOD_DEFINITION_PROGRAM_LOUDNESS 1 +#define USER_METHOD_DEFINITION_ANCHOR_LOUDNESS 2 + +#define USER_MEASUREMENT_SYSTEM_DEFAULT 0 +#define USER_MEASUREMENT_SYSTEM_BS_1770_4 1 +#define USER_MEASUREMENT_SYSTEM_BS_1770_3 USER_MEASUREMENT_SYSTEM_BS_1770_4 +#define USER_MEASUREMENT_SYSTEM_USER 2 +#define USER_MEASUREMENT_SYSTEM_EXPERT_PANEL 3 +#define USER_MEASUREMENT_SYSTEM_RESERVED_A 4 +#define USER_MEASUREMENT_SYSTEM_RESERVED_B 5 +#define USER_MEASUREMENT_SYSTEM_RESERVED_C 6 +#define USER_MEASUREMENT_SYSTEM_RESERVED_D 7 +#define USER_MEASUREMENT_SYSTEM_RESERVED_E 8 + +#define USER_LOUDNESS_PREPROCESSING_DEFAULT 0 +#define USER_LOUDNESS_PREPROCESSING_OFF 1 +#define USER_LOUDNESS_PREPROCESSING_HIGHPASS 2 + +#define LOUDNESS_DEVIATION_MAX_DEFAULT 63 +#define LOUDNESS_NORMALIZATION_GAIN_MAX_DEFAULT 1000 + +#define SHORT_TERM_LOUDNESS_TO_AVG 0 +#define MOMENTARY_LOUDNESS_TO_AVG 1 +#define TOP_OF_LOUDNESS_RANGE_TO_AVG 2 + +#define DRC_COMPLEXITY_LEVEL_MAX 0xF +#define EQ_COMPLEXITY_LEVEL_MAX 0xF +#define COMPLEXITY_LEVEL_SUPPORTED_TOTAL 20.0f + +#define COMPLEXITY_W_SUBBAND_EQ 2.5f +#define COMPLEXITY_W_FIR 0.4f +#define COMPLEXITY_W_IIR 5.0f +#define COMPLEXITY_W_MOD_TIME 1.0f +#define COMPLEXITY_W_MOD_SUBBAND 2.0f +#define COMPLEXITY_W_LAP 2.0f +#define COMPLEXITY_W_SHAPE 6.0f +#define COMPLEXITY_W_SPLINE 5.0f +#define COMPLEXITY_W_LINEAR 2.5f +#define COMPLEXITY_W_PARAM_DRC_FILT 5.0f +#define COMPLEXITY_W_PARAM_DRC_SUBBAND 5.0f +#define COMPLEXITY_W_PARAM_LIM_FILT 4.5f +#define COMPLEXITY_W_PARAM_DRC_ATTACK 136.0f + +#define LEFT_SIDE 0 +#define RIGHT_SIDE 1 + +#define CHARACTERISTIC_SIGMOID 0 +#define CHARACTERISTIC_NODES 1 +#define CHARACTERISTIC_PASS_THRU 2 + +#define GAINFORMAT_QMF32 0x1 +#define GAINFORMAT_QMFHYBRID39 0x2 +#define GAINFORMAT_QMF64 0x3 +#define GAINFORMAT_QMFHYBRID71 0x4 +#define GAINFORMAT_QMF128 0x5 +#define GAINFORMAT_QMFHYBRID135 0x6 +#define GAINFORMAT_UNIFORM 0x7 + +#define DRC_INPUT_LOUDNESS_TARGET (-31.0f) + +#define SHAPE_FILTER_TYPE_OFF 0 +#define SHAPE_FILTER_TYPE_LF_CUT 1 +#define SHAPE_FILTER_TYPE_LF_BOOST 2 +#define SHAPE_FILTER_TYPE_HF_CUT 3 +#define SHAPE_FILTER_TYPE_HF_BOOST 4 + +#define SHAPE_FILTER_DRC_GAIN_MAX_MINUS_ONE 1583.8931924611f + +typedef struct { + WORD32 type; + FLOAT32 gain_offset; + FLOAT32 y1_bound; + FLOAT32 warped_gain_max; + FLOAT32 factor; + FLOAT32 coeff_sum; + FLOAT32 partial_coeff_sum; + FLOAT32 g_norm; + FLOAT32 a1; + FLOAT32 a2; + FLOAT32 b1; + FLOAT32 b2; + FLOAT32 audio_in_state_1[MAX_CHANNEL_COUNT]; + FLOAT32 audio_in_state_2[MAX_CHANNEL_COUNT]; + FLOAT32 audio_out_state_1[MAX_CHANNEL_COUNT]; + FLOAT32 audio_out_state_2[MAX_CHANNEL_COUNT]; } ia_shape_filter_struct; typedef struct { - WORD32 shape_flter_block_flag; - FLOAT32 drc_gain_last; - ia_shape_filter_struct shape_filter[4]; + WORD32 shape_flter_block_flag; + FLOAT32 drc_gain_last; + ia_shape_filter_struct shape_filter[4]; } shape_filter_block; typedef struct { - WORD32 level_estim_k_weighting_type; - WORD32 level_estim_integration_time_present; - WORD32 level_estim_integration_time; - WORD32 drc_curve_definition_type; - WORD32 drc_characteristic; - WORD32 node_count; - WORD32 node_level[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; - WORD32 node_gain[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; - WORD32 drc_gain_smooth_parameters_present; - WORD32 gain_smooth_attack_time_slow; - WORD32 gain_smooth_release_time_slow; - WORD32 gain_smooth_time_fast_present; - WORD32 gain_smooth_attack_time_fast; - WORD32 gain_smooth_release_time_fast; - WORD32 gain_smooth_threshold_present; - WORD32 gain_smooth_attack_threshold; - WORD32 gain_smooth_rel_threshold; - WORD32 gain_smooth_hold_off_count_present; - WORD32 gain_smooth_hold_off; - - WORD32 disable_paramteric_drc; + WORD32 level_estim_k_weighting_type; + WORD32 level_estim_integration_time_present; + WORD32 level_estim_integration_time; + WORD32 drc_curve_definition_type; + WORD32 drc_characteristic; + WORD32 node_count; + WORD32 node_level[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; + WORD32 node_gain[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; + WORD32 drc_gain_smooth_parameters_present; + WORD32 gain_smooth_attack_time_slow; + WORD32 gain_smooth_release_time_slow; + WORD32 gain_smooth_time_fast_present; + WORD32 gain_smooth_attack_time_fast; + WORD32 gain_smooth_release_time_fast; + WORD32 gain_smooth_threshold_present; + WORD32 gain_smooth_attack_threshold; + WORD32 gain_smooth_rel_threshold; + WORD32 gain_smooth_hold_off_count_present; + WORD32 gain_smooth_hold_off; + + WORD32 disable_paramteric_drc; } ia_parametric_drc_type_feed_forward_struct; typedef struct { - WORD32 parametric_lim_threshold_present; - FLOAT32 parametric_lim_threshold; - WORD32 parametric_lim_attack; - WORD32 parametric_lim_release_present; - WORD32 parametric_lim_release; - WORD32 drc_characteristic; + WORD32 parametric_lim_threshold_present; + FLOAT32 parametric_lim_threshold; + WORD32 parametric_lim_attack; + WORD32 parametric_lim_release_present; + WORD32 parametric_lim_release; + WORD32 drc_characteristic; - WORD32 disable_paramteric_drc; + WORD32 disable_paramteric_drc; } ia_parametric_drc_lim_struct; typedef struct { - WORD32 parametric_drc_id; - WORD32 parametric_drc_look_ahead_flag; - WORD32 parametric_drc_look_ahead; - WORD32 parametric_drc_preset_id_present; - WORD32 parametric_drc_preset_id; - WORD32 parametric_drc_type; - WORD32 len_bit_size; - ia_parametric_drc_type_feed_forward_struct str_parametric_drc_type_feed_forward; - ia_parametric_drc_lim_struct parametric_drc_lim; + WORD32 parametric_drc_id; + WORD32 parametric_drc_look_ahead_flag; + WORD32 parametric_drc_look_ahead; + WORD32 parametric_drc_preset_id_present; + WORD32 parametric_drc_preset_id; + WORD32 parametric_drc_type; + WORD32 len_bit_size; + ia_parametric_drc_type_feed_forward_struct + str_parametric_drc_type_feed_forward; + ia_parametric_drc_lim_struct parametric_drc_lim; - WORD32 drc_characteristic; - WORD32 disable_paramteric_drc; + WORD32 drc_characteristic; + WORD32 disable_paramteric_drc; } ia_parametric_drc_instructions_struct; typedef struct { - WORD32 parametric_drc_id; - WORD32 side_chain_config_type; - WORD32 downmix_id; - WORD32 level_estim_channel_weight_format; - FLOAT32 level_estim_ch_weight[MAX_CHANNEL_COUNT]; - WORD32 drc_input_loudness_present; - FLOAT32 drc_input_loudness; + WORD32 parametric_drc_id; + WORD32 side_chain_config_type; + WORD32 downmix_id; + WORD32 level_estim_channel_weight_format; + FLOAT32 level_estim_ch_weight[MAX_CHANNEL_COUNT]; + WORD32 drc_input_loudness_present; + FLOAT32 drc_input_loudness; - WORD32 ch_count_from_dwnmix_id; + WORD32 ch_count_from_dwnmix_id; } ia_parametric_drc_gain_set_params_struct; typedef struct { - WORD32 drc_location; - WORD32 parametric_drc_frame_size_format; - WORD32 parametric_drc_frame_size; - WORD32 parametric_drc_delay_max_present; - WORD32 parametric_drc_delay_max; - WORD32 reset_parametric_drc; - WORD32 parametric_drc_gain_set_count; - ia_parametric_drc_gain_set_params_struct str_parametric_drc_gain_set_params[SEQUENCE_COUNT_MAX]; + WORD32 drc_location; + WORD32 parametric_drc_frame_size_format; + WORD32 parametric_drc_frame_size; + WORD32 parametric_drc_delay_max_present; + WORD32 parametric_drc_delay_max; + WORD32 reset_parametric_drc; + WORD32 parametric_drc_gain_set_count; + ia_parametric_drc_gain_set_params_struct + str_parametric_drc_gain_set_params[SEQUENCE_COUNT_MAX]; } ia_drc_coeff_parametric_drc_struct; typedef struct { - WORD32 base_channel_count; - WORD32 layout_signaling_present; - WORD32 defined_layout; - WORD32 speaker_position[SPEAKER_POS_COUNT_MAX]; + WORD32 base_channel_count; + WORD32 layout_signaling_present; + WORD32 defined_layout; + WORD32 speaker_position[SPEAKER_POS_COUNT_MAX]; } ia_channel_layout_struct; typedef struct { - WORD32 downmix_id; - WORD32 target_channel_count; - WORD32 target_layout; - WORD32 downmix_coefficients_present; - FLOAT32 downmix_coefficient[DOWNMIX_COEFF_COUNT_MAX]; + WORD32 downmix_id; + WORD32 target_channel_count; + WORD32 target_layout; + WORD32 downmix_coefficients_present; + FLOAT32 downmix_coefficient[DOWNMIX_COEFF_COUNT_MAX]; } ia_downmix_instructions_struct; typedef struct { - WORD32 gain_seq_idx; - WORD32 drc_characteristic; - WORD32 drc_characteristic_present; - WORD32 drc_characteristic_format_is_cicp; - WORD32 drc_characteristic_left_index; - WORD32 drc_characteristic_right_index; - WORD32 crossover_freq_idx; - WORD32 start_subband_index; + WORD32 gain_seq_idx; + WORD32 drc_characteristic; + WORD32 drc_characteristic_present; + WORD32 drc_characteristic_format_is_cicp; + WORD32 drc_characteristic_left_index; + WORD32 drc_characteristic_right_index; + WORD32 crossover_freq_idx; + WORD32 start_subband_index; } ia_gain_params_struct; typedef struct { - WORD32 ducking_scaling_flag; - FLOAT32 ducking_scaling; - FLOAT32 ducking_scaling_quantized; + WORD32 ducking_scaling_flag; + FLOAT32 ducking_scaling; + FLOAT32 ducking_scaling_quantized; } ia_ducking_modifiers_struct; typedef struct { - WORD32 target_characteristic_left_present [DRC_BAND_COUNT_MAX]; - WORD32 target_characteristic_left_index [DRC_BAND_COUNT_MAX]; - WORD32 target_characteristic_right_present[DRC_BAND_COUNT_MAX]; - WORD32 target_characteristic_right_index [DRC_BAND_COUNT_MAX]; - WORD32 shape_filter_flag; - WORD32 shape_filter_idx; - WORD32 gain_scaling_flag [BAND_COUNT_MAX]; - FLOAT32 attn_scaling [BAND_COUNT_MAX]; - FLOAT32 ampl_scaling[BAND_COUNT_MAX]; - WORD32 gain_offset_flag [BAND_COUNT_MAX]; - FLOAT32 gain_offset [BAND_COUNT_MAX]; + WORD32 target_characteristic_left_present[DRC_BAND_COUNT_MAX]; + WORD32 target_characteristic_left_index[DRC_BAND_COUNT_MAX]; + WORD32 target_characteristic_right_present[DRC_BAND_COUNT_MAX]; + WORD32 target_characteristic_right_index[DRC_BAND_COUNT_MAX]; + WORD32 shape_filter_flag; + WORD32 shape_filter_idx; + WORD32 gain_scaling_flag[BAND_COUNT_MAX]; + FLOAT32 attn_scaling[BAND_COUNT_MAX]; + FLOAT32 ampl_scaling[BAND_COUNT_MAX]; + WORD32 gain_offset_flag[BAND_COUNT_MAX]; + FLOAT32 gain_offset[BAND_COUNT_MAX]; } ia_gain_modifiers_struct; typedef struct { - WORD32 gain_coding_profile; - WORD32 gain_interpolation_type; - WORD32 full_frame; - WORD32 time_alignment; - WORD32 time_delt_min_flag; - WORD32 time_delt_min_val; - WORD32 band_count; - WORD32 drc_band_type; - ia_gain_params_struct gain_params[BAND_COUNT_MAX]; + WORD32 gain_coding_profile; + WORD32 gain_interpolation_type; + WORD32 full_frame; + WORD32 time_alignment; + WORD32 time_delt_min_flag; + WORD32 time_delt_min_val; + WORD32 band_count; + WORD32 drc_band_type; + ia_gain_params_struct gain_params[BAND_COUNT_MAX]; - WORD32 num_gain_max_values; - ia_tables_struct str_tables; + WORD32 num_gain_max_values; + ia_tables_struct str_tables; } ia_gain_set_params_struct; #define SPLIT_CHARACTERISTIC_NODE_COUNT_MAX 4 typedef struct { - WORD32 characteristic_format; - FLOAT32 in_out_ratio; - FLOAT32 gain; - FLOAT32 exp; - WORD32 flip_sign; - WORD32 characteristic_node_count; - FLOAT32 node_level[SPLIT_CHARACTERISTIC_NODE_COUNT_MAX+1]; - FLOAT32 node_gain [SPLIT_CHARACTERISTIC_NODE_COUNT_MAX+1]; + WORD32 characteristic_format; + FLOAT32 in_out_ratio; + FLOAT32 gain; + FLOAT32 exp; + WORD32 flip_sign; + WORD32 characteristic_node_count; + FLOAT32 node_level[SPLIT_CHARACTERISTIC_NODE_COUNT_MAX + 1]; + FLOAT32 node_gain[SPLIT_CHARACTERISTIC_NODE_COUNT_MAX + 1]; } ia_split_drc_characteristic_struct; typedef struct { - WORD32 corner_freq_index; - WORD32 filter_strength_index; + WORD32 corner_freq_index; + WORD32 filter_strength_index; } ia_shape_filter_params_struct; typedef struct { - WORD32 lf_cut_filter_present; - ia_shape_filter_params_struct str_lf_cut_params; - WORD32 lf_boost_filter_present; - ia_shape_filter_params_struct str_lf_boost_params; - WORD32 hf_cut_filter_present; - ia_shape_filter_params_struct str_hfCutParams; - WORD32 hf_boost_filter_present; - ia_shape_filter_params_struct str_hf_boost_params; + WORD32 lf_cut_filter_present; + ia_shape_filter_params_struct str_lf_cut_params; + WORD32 lf_boost_filter_present; + ia_shape_filter_params_struct str_lf_boost_params; + WORD32 hf_cut_filter_present; + ia_shape_filter_params_struct str_hfCutParams; + WORD32 hf_boost_filter_present; + ia_shape_filter_params_struct str_hf_boost_params; } ia_shape_filter_block_params_struct; typedef struct { - WORD32 drc_location; - WORD32 drc_characteristic; + WORD32 drc_location; + WORD32 drc_characteristic; } ia_drc_coefficients_basic_struct; typedef struct { - WORD32 version; - WORD32 drc_location; - WORD32 drc_frame_size_present; - WORD32 drc_frame_size; - WORD32 gain_set_count; - ia_gain_set_params_struct gain_set_params[GAIN_SET_COUNT_MAX]; - WORD32 drc_characteristic_left_present; - WORD32 characteristic_left_count; - ia_split_drc_characteristic_struct str_split_characteristic_left [SPLIT_CHARACTERISTIC_COUNT_MAX]; - WORD32 drc_characteristic_right_present; - WORD32 characteristic_right_count; - ia_split_drc_characteristic_struct str_split_characteristic_right[SPLIT_CHARACTERISTIC_COUNT_MAX]; - WORD32 shape_filters_present; - WORD32 shape_num_filter; - ia_shape_filter_block_params_struct str_shape_filter_block_params[SHAPE_FILTER_COUNT_MAX+1]; - WORD32 gain_sequence_count; - WORD32 gain_set_params_index_for_gain_sequence[SEQUENCE_COUNT_MAX]; - WORD32 gain_set_count_plus; + WORD32 version; + WORD32 drc_location; + WORD32 drc_frame_size_present; + WORD32 drc_frame_size; + WORD32 gain_set_count; + ia_gain_set_params_struct gain_set_params[GAIN_SET_COUNT_MAX]; + WORD32 drc_characteristic_left_present; + WORD32 characteristic_left_count; + ia_split_drc_characteristic_struct + str_split_characteristic_left[SPLIT_CHARACTERISTIC_COUNT_MAX]; + WORD32 drc_characteristic_right_present; + WORD32 characteristic_right_count; + ia_split_drc_characteristic_struct + str_split_characteristic_right[SPLIT_CHARACTERISTIC_COUNT_MAX]; + WORD32 shape_filters_present; + WORD32 shape_num_filter; + ia_shape_filter_block_params_struct + str_shape_filter_block_params[SHAPE_FILTER_COUNT_MAX + 1]; + WORD32 gain_sequence_count; + WORD32 gain_set_params_index_for_gain_sequence[SEQUENCE_COUNT_MAX]; + WORD32 gain_set_count_plus; } ia_uni_drc_coeffs_struct; typedef struct { - WORD32 drc_set_id; - WORD32 drc_location; - WORD32 dwnmix_id_count; - WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; - WORD32 drc_set_effect; - WORD32 limiter_peak_target_present; - FLOAT32 limiter_peak_target; - WORD32 drc_set_target_loudness_present; - WORD32 drc_set_target_loudness_value_upper; - WORD32 drc_set_target_loudness_value_lower_present; - WORD32 drc_set_target_loudness_value_lower; + WORD32 drc_set_id; + WORD32 drc_location; + WORD32 dwnmix_id_count; + WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; + WORD32 drc_set_effect; + WORD32 limiter_peak_target_present; + FLOAT32 limiter_peak_target; + WORD32 drc_set_target_loudness_present; + WORD32 drc_set_target_loudness_value_upper; + WORD32 drc_set_target_loudness_value_lower_present; + WORD32 drc_set_target_loudness_value_lower; } ia_drc_instructions_basic_struct; typedef struct { - WORD32 drc_set_id; - WORD32 drc_set_complexity_level; - WORD32 requires_eq; - WORD32 drc_apply_to_dwnmix; - WORD32 drc_location; - WORD32 dwnmix_id_count; - WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; - WORD32 depends_on_drc_set_present; - WORD32 depends_on_drc_set; - WORD32 no_independent_use; - WORD32 drc_set_effect; - WORD32 gain_set_index[MAX_CHANNEL_COUNT]; - ia_gain_modifiers_struct str_gain_modifiers_of_ch_group[CHANNEL_GROUP_COUNT_MAX]; - ia_ducking_modifiers_struct str_ducking_modifiers_for_channel[MAX_CHANNEL_COUNT]; - WORD32 limiter_peak_target_present; - FLOAT32 limiter_peak_target; - WORD32 drc_set_target_loudness_present; - WORD32 drc_set_target_loudness_value_upper; - WORD32 drc_set_target_loudness_value_lower_present; - WORD32 drc_set_target_loudness_value_lower; - - WORD32 audio_num_chan; - WORD32 num_drc_ch_groups; - WORD32 gain_set_index_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; - WORD32 band_count_of_ch_group[CHANNEL_GROUP_COUNT_MAX]; - WORD32 gain_interpolation_type_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; - WORD32 time_delta_min_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; - WORD32 time_alignment_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; - ia_ducking_modifiers_struct str_ducking_modifiers_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; - WORD32 channel_group_of_ch[MAX_CHANNEL_COUNT]; - WORD32 num_chan_per_ch_group[CHANNEL_GROUP_COUNT_MAX]; - WORD32 gain_element_count; - WORD32 multiband_audio_sig_count; - WORD32 ch_group_parametric_drc_flag[CHANNEL_GROUP_COUNT_MAX]; - WORD32 gain_set_idx_of_ch_group_parametric_drc[CHANNEL_GROUP_COUNT_MAX]; - WORD32 parametric_drc_look_ahead_samples[CHANNEL_GROUP_COUNT_MAX]; - WORD32 parametric_drc_look_ahead_samples_max; + WORD32 drc_set_id; + WORD32 drc_set_complexity_level; + WORD32 requires_eq; + WORD32 drc_apply_to_dwnmix; + WORD32 drc_location; + WORD32 dwnmix_id_count; + WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; + WORD32 depends_on_drc_set_present; + WORD32 depends_on_drc_set; + WORD32 no_independent_use; + WORD32 drc_set_effect; + WORD32 gain_set_index[MAX_CHANNEL_COUNT]; + ia_gain_modifiers_struct + str_gain_modifiers_of_ch_group[CHANNEL_GROUP_COUNT_MAX]; + ia_ducking_modifiers_struct + str_ducking_modifiers_for_channel[MAX_CHANNEL_COUNT]; + WORD32 limiter_peak_target_present; + FLOAT32 limiter_peak_target; + WORD32 drc_set_target_loudness_present; + WORD32 drc_set_target_loudness_value_upper; + WORD32 drc_set_target_loudness_value_lower_present; + WORD32 drc_set_target_loudness_value_lower; + + WORD32 audio_num_chan; + WORD32 num_drc_ch_groups; + WORD32 gain_set_index_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; + WORD32 band_count_of_ch_group[CHANNEL_GROUP_COUNT_MAX]; + WORD32 gain_interpolation_type_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; + WORD32 time_delta_min_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; + WORD32 time_alignment_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; + ia_ducking_modifiers_struct + str_ducking_modifiers_for_channel_group[CHANNEL_GROUP_COUNT_MAX]; + WORD32 channel_group_of_ch[MAX_CHANNEL_COUNT]; + WORD32 num_chan_per_ch_group[CHANNEL_GROUP_COUNT_MAX]; + WORD32 gain_element_count; + WORD32 multiband_audio_sig_count; + WORD32 ch_group_parametric_drc_flag[CHANNEL_GROUP_COUNT_MAX]; + WORD32 gain_set_idx_of_ch_group_parametric_drc[CHANNEL_GROUP_COUNT_MAX]; + WORD32 parametric_drc_look_ahead_samples[CHANNEL_GROUP_COUNT_MAX]; + WORD32 parametric_drc_look_ahead_samples_max; } ia_drc_instructions_struct; typedef struct { - WORD32 method_def; - FLOAT32 method_val; - WORD32 measurement_system; - WORD32 reliability; + WORD32 method_def; + FLOAT32 method_val; + WORD32 measurement_system; + WORD32 reliability; } ia_loudness_measure_struct; typedef struct { - WORD32 drc_set_id; - WORD32 eq_set_id; - WORD32 downmix_id; - WORD32 sample_peak_level_present; - FLOAT32 sample_peak_level; - WORD32 true_peak_level_present; - FLOAT32 true_peak_level; - WORD32 true_peak_level_measurement_system; - WORD32 true_peak_level_reliability; - WORD32 measurement_count; - ia_loudness_measure_struct loudness_measure[MEASUREMENT_COUNT_MAX]; + WORD32 drc_set_id; + WORD32 eq_set_id; + WORD32 downmix_id; + WORD32 sample_peak_level_present; + FLOAT32 sample_peak_level; + WORD32 true_peak_level_present; + FLOAT32 true_peak_level; + WORD32 true_peak_level_measurement_system; + WORD32 true_peak_level_reliability; + WORD32 measurement_count; + ia_loudness_measure_struct loudness_measure[MEASUREMENT_COUNT_MAX]; } ia_loudness_info_struct; typedef struct { - WORD32 loud_eq_set_id; - WORD32 drc_location; - WORD32 dwnmix_id_count; - WORD32 downmix_id [DOWNMIX_ID_COUNT_MAX]; - WORD32 drc_set_id_count; - WORD32 drc_set_id [DRC_SET_ID_COUNT_MAX]; - WORD32 eq_set_id_count; - WORD32 eq_set_id [EQ_SET_ID_COUNT_MAX]; - WORD32 loudness_after_drc; - WORD32 loudness_after_eq; - WORD32 loud_eq_gain_sequence_count; - WORD32 gain_seq_idx [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - WORD32 drc_characteristic_format_is_cicp [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - WORD32 drc_characteristic [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - WORD32 drc_characteristic_left_index [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - WORD32 drc_characteristic_right_index [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - WORD32 frequency_range_index [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - FLOAT32 loud_eq_scaling [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; - FLOAT32 loud_eq_offset [LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + WORD32 loud_eq_set_id; + WORD32 drc_location; + WORD32 dwnmix_id_count; + WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; + WORD32 drc_set_id_count; + WORD32 drc_set_id[DRC_SET_ID_COUNT_MAX]; + WORD32 eq_set_id_count; + WORD32 eq_set_id[EQ_SET_ID_COUNT_MAX]; + WORD32 loudness_after_drc; + WORD32 loudness_after_eq; + WORD32 loud_eq_gain_sequence_count; + WORD32 gain_seq_idx[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + WORD32 drc_characteristic_format_is_cicp[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + WORD32 drc_characteristic[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + WORD32 drc_characteristic_left_index[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + WORD32 drc_characteristic_right_index[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + WORD32 frequency_range_index[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + FLOAT32 loud_eq_scaling[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; + FLOAT32 loud_eq_offset[LOUD_EQ_GAIN_SEQUENCE_COUNT_MAX]; } ia_loud_eq_instructions_struct; typedef struct { - WORD32 filt_ele_idx; - WORD32 filt_ele_gain_flag; - FLOAT32 filt_ele_gain; + WORD32 filt_ele_idx; + WORD32 filt_ele_gain_flag; + FLOAT32 filt_ele_gain; } ia_filt_ele_struct; typedef struct { - WORD32 filter_element_count; - ia_filt_ele_struct str_filter_element[FILTER_ELEMENT_COUNT_MAX]; + WORD32 filter_element_count; + ia_filt_ele_struct str_filter_element[FILTER_ELEMENT_COUNT_MAX]; } ia_filt_block_struct; typedef struct { - WORD32 eq_filter_format; - WORD32 bs_real_zero_radius_one_count; - WORD32 real_zero_count; - WORD32 generic_zero_count; - WORD32 real_pole_count; - WORD32 cmplx_pole_count; - WORD32 zero_sign [REAL_ZERO_RADIUS_ONE_COUNT_MAX]; - FLOAT32 real_zero_radius [REAL_ZERO_COUNT_MAX]; - FLOAT32 generic_zero_radius [COMPLEX_ZERO_COUNT_MAX]; - FLOAT32 generic_zero_angle [COMPLEX_ZERO_COUNT_MAX]; - FLOAT32 real_pole_radius [REAL_POLE_COUNT_MAX]; - FLOAT32 complex_pole_radius [COMPLEX_POLE_COUNT_MAX]; - FLOAT32 complex_pole_angle [COMPLEX_POLE_COUNT_MAX]; - WORD32 fir_filt_order; - WORD32 fir_symmetry; - FLOAT32 fir_coeff [FIR_ORDER_MAX/2]; + WORD32 eq_filter_format; + WORD32 bs_real_zero_radius_one_count; + WORD32 real_zero_count; + WORD32 generic_zero_count; + WORD32 real_pole_count; + WORD32 cmplx_pole_count; + WORD32 zero_sign[REAL_ZERO_RADIUS_ONE_COUNT_MAX]; + FLOAT32 real_zero_radius[REAL_ZERO_COUNT_MAX]; + FLOAT32 generic_zero_radius[COMPLEX_ZERO_COUNT_MAX]; + FLOAT32 generic_zero_angle[COMPLEX_ZERO_COUNT_MAX]; + FLOAT32 real_pole_radius[REAL_POLE_COUNT_MAX]; + FLOAT32 complex_pole_radius[COMPLEX_POLE_COUNT_MAX]; + FLOAT32 complex_pole_angle[COMPLEX_POLE_COUNT_MAX]; + WORD32 fir_filt_order; + WORD32 fir_symmetry; + FLOAT32 fir_coeff[FIR_ORDER_MAX / 2]; } ia_unique_td_filt_element; typedef struct { - WORD32 num_eq_nodes; - FLOAT32 eq_slope [EQ_NODE_COUNT_MAX]; - WORD32 eq_freq_delta [EQ_NODE_COUNT_MAX]; - FLOAT32 eq_gain_initial; - FLOAT32 eq_gain_delta [EQ_NODE_COUNT_MAX]; + WORD32 num_eq_nodes; + FLOAT32 eq_slope[EQ_NODE_COUNT_MAX]; + WORD32 eq_freq_delta[EQ_NODE_COUNT_MAX]; + FLOAT32 eq_gain_initial; + FLOAT32 eq_gain_delta[EQ_NODE_COUNT_MAX]; } ia_eq_subband_gain_spline_struct; typedef struct { - FLOAT32 eq_subband_gain [EQ_SUBBAND_GAIN_COUNT_MAX]; + FLOAT32 eq_subband_gain[EQ_SUBBAND_GAIN_COUNT_MAX]; } ia_eq_subband_gain_vector; typedef struct { - WORD32 eq_delay_max_present; - WORD32 eq_delay_max; - WORD32 unique_filter_block_count; - ia_filt_block_struct str_filter_block [FILTER_BLOCK_COUNT_MAX]; - WORD32 unique_td_filter_element_count; - ia_unique_td_filt_element unique_td_filt_ele [FILTER_ELEMENT_COUNT_MAX]; - WORD32 unique_eq_subband_gains_count; - WORD32 eq_subband_gain_representation; - WORD32 eq_subband_gain_format; - WORD32 eq_subband_gain_count; - ia_eq_subband_gain_spline_struct str_eq_subband_gain_spline [UNIQUE_SUBBAND_GAIN_COUNT_MAX]; - ia_eq_subband_gain_vector str_eq_subband_gain_vector [UNIQUE_SUBBAND_GAIN_COUNT_MAX]; + WORD32 eq_delay_max_present; + WORD32 eq_delay_max; + WORD32 unique_filter_block_count; + ia_filt_block_struct str_filter_block[FILTER_BLOCK_COUNT_MAX]; + WORD32 unique_td_filter_element_count; + ia_unique_td_filt_element unique_td_filt_ele[FILTER_ELEMENT_COUNT_MAX]; + WORD32 unique_eq_subband_gains_count; + WORD32 eq_subband_gain_representation; + WORD32 eq_subband_gain_format; + WORD32 eq_subband_gain_count; + ia_eq_subband_gain_spline_struct + str_eq_subband_gain_spline[UNIQUE_SUBBAND_GAIN_COUNT_MAX]; + ia_eq_subband_gain_vector + str_eq_subband_gain_vector[UNIQUE_SUBBAND_GAIN_COUNT_MAX]; } ia_eq_coeff_struct; typedef struct { - WORD32 filter_block_count; - WORD32 filter_block_index[EQ_FILTER_BLOCK_COUNT_MAX]; + WORD32 filter_block_count; + WORD32 filter_block_index[EQ_FILTER_BLOCK_COUNT_MAX]; } ia_filter_block_refs_struct; typedef struct { - WORD32 eq_cascade_gain_present [EQ_CHANNEL_GROUP_COUNT_MAX]; - FLOAT32 eq_cascade_gain [EQ_CHANNEL_GROUP_COUNT_MAX]; - ia_filter_block_refs_struct str_filter_block_refs [EQ_CHANNEL_GROUP_COUNT_MAX]; - WORD32 eq_phase_alignment_present; - WORD32 eq_phase_alignment [EQ_CHANNEL_GROUP_COUNT_MAX][EQ_CHANNEL_GROUP_COUNT_MAX]; + WORD32 eq_cascade_gain_present[EQ_CHANNEL_GROUP_COUNT_MAX]; + FLOAT32 eq_cascade_gain[EQ_CHANNEL_GROUP_COUNT_MAX]; + ia_filter_block_refs_struct str_filter_block_refs[EQ_CHANNEL_GROUP_COUNT_MAX]; + WORD32 eq_phase_alignment_present; + WORD32 eq_phase_alignment[EQ_CHANNEL_GROUP_COUNT_MAX] + [EQ_CHANNEL_GROUP_COUNT_MAX]; } ia_td_filter_cascade_struct; typedef struct { - WORD32 eq_set_id; - WORD32 eq_set_complexity_level; - WORD32 dwnmix_id_count; - WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; - WORD32 eq_apply_to_downmix; - WORD32 drc_set_id_count; - WORD32 drc_set_id[DRC_SET_ID_COUNT_MAX]; - WORD32 eq_set_purpose; - WORD32 depends_on_eq_set_present; - WORD32 depends_on_eq_set; - WORD32 no_independent_eq_use; - WORD32 eq_channel_count; - WORD32 eq_ch_group_count; - WORD32 eq_ch_group_of_channel [MAX_CHANNEL_COUNT]; - WORD32 td_filter_cascade_present; - ia_td_filter_cascade_struct str_td_filter_cascade; - WORD32 subband_gains_present; - WORD32 subband_gains_index [EQ_CHANNEL_GROUP_COUNT_MAX]; - WORD32 eq_transition_duration_present; - WORD32 eq_transition_duration; + WORD32 eq_set_id; + WORD32 eq_set_complexity_level; + WORD32 dwnmix_id_count; + WORD32 downmix_id[DOWNMIX_ID_COUNT_MAX]; + WORD32 eq_apply_to_downmix; + WORD32 drc_set_id_count; + WORD32 drc_set_id[DRC_SET_ID_COUNT_MAX]; + WORD32 eq_set_purpose; + WORD32 depends_on_eq_set_present; + WORD32 depends_on_eq_set; + WORD32 no_independent_eq_use; + WORD32 eq_channel_count; + WORD32 eq_ch_group_count; + WORD32 eq_ch_group_of_channel[MAX_CHANNEL_COUNT]; + WORD32 td_filter_cascade_present; + ia_td_filter_cascade_struct str_td_filter_cascade; + WORD32 subband_gains_present; + WORD32 subband_gains_index[EQ_CHANNEL_GROUP_COUNT_MAX]; + WORD32 eq_transition_duration_present; + WORD32 eq_transition_duration; } ia_eq_instructions_struct; typedef struct { - WORD32 drc_config_ext_type[EXT_COUNT_MAX]; - WORD32 ext_bit_size[EXT_COUNT_MAX-1]; - - WORD32 parametric_drc_present; - ia_drc_coeff_parametric_drc_struct str_drc_coeff_param_drc; - WORD32 parametric_drc_instructions_count; - ia_parametric_drc_instructions_struct str_parametric_drc_instructions[PARAM_DRC_INSTRUCTIONS_COUNT_MAX]; - WORD32 drc_extension_v1_present; - WORD32 loud_eq_instructions_flag; - WORD32 loud_eq_instructions_count; - ia_loud_eq_instructions_struct loud_eq_instructions [LOUD_EQ_INSTRUCTIONS_COUNT_MAX]; - WORD32 eq_flag; - ia_eq_coeff_struct str_eq_coeff; - WORD32 eq_instructions_count; - ia_eq_instructions_struct str_eq_instructions [EQ_INSTRUCTIONS_COUNT_MAX]; + WORD32 drc_config_ext_type[EXT_COUNT_MAX]; + WORD32 ext_bit_size[EXT_COUNT_MAX - 1]; + + WORD32 parametric_drc_present; + ia_drc_coeff_parametric_drc_struct str_drc_coeff_param_drc; + WORD32 parametric_drc_instructions_count; + ia_parametric_drc_instructions_struct + str_parametric_drc_instructions[PARAM_DRC_INSTRUCTIONS_COUNT_MAX]; + WORD32 drc_extension_v1_present; + WORD32 loud_eq_instructions_flag; + WORD32 loud_eq_instructions_count; + ia_loud_eq_instructions_struct + loud_eq_instructions[LOUD_EQ_INSTRUCTIONS_COUNT_MAX]; + WORD32 eq_flag; + ia_eq_coeff_struct str_eq_coeff; + WORD32 eq_instructions_count; + ia_eq_instructions_struct str_eq_instructions[EQ_INSTRUCTIONS_COUNT_MAX]; } ia_drc_config_ext; -typedef struct ia_drc_config{ - WORD32 sample_rate_present; - WORD32 sampling_rate; - WORD32 dwnmix_instructions_count; - WORD32 drc_coefficients_drc_count; - WORD32 drc_instructions_uni_drc_count; - WORD32 drc_instructions_count_plus; - WORD32 drc_description_basic_present; - WORD32 drc_coefficients_basic_count; - WORD32 drc_instructions_basic_count; - WORD32 drc_config_ext_present; - WORD32 apply_drc; - ia_drc_config_ext str_drc_config_ext; - ia_drc_coefficients_basic_struct str_drc_coefficients_basic[DRC_COEFF_COUNT_MAX]; - ia_drc_instructions_basic_struct str_drc_instructions_basic[DRC_INSTRUCTIONS_COUNT_MAX]; - ia_uni_drc_coeffs_struct str_p_loc_drc_coefficients_uni_drc[DRC_COEFF_COUNT_MAX]; - ia_drc_instructions_struct str_drc_instruction_str[DRC_INSTRUCTIONS_COUNT_MAX]; - ia_channel_layout_struct channel_layout; - ia_downmix_instructions_struct dwnmix_instructions[DOWNMIX_INSTRUCTION_COUNT_MAX]; +typedef struct ia_drc_config { + WORD32 sample_rate_present; + WORD32 sampling_rate; + WORD32 dwnmix_instructions_count; + WORD32 drc_coefficients_drc_count; + WORD32 drc_instructions_uni_drc_count; + WORD32 drc_instructions_count_plus; + WORD32 drc_description_basic_present; + WORD32 drc_coefficients_basic_count; + WORD32 drc_instructions_basic_count; + WORD32 drc_config_ext_present; + WORD32 apply_drc; + ia_drc_config_ext str_drc_config_ext; + ia_drc_coefficients_basic_struct + str_drc_coefficients_basic[DRC_COEFF_COUNT_MAX]; + ia_drc_instructions_basic_struct + str_drc_instructions_basic[DRC_INSTRUCTIONS_COUNT_MAX]; + ia_uni_drc_coeffs_struct + str_p_loc_drc_coefficients_uni_drc[DRC_COEFF_COUNT_MAX]; + ia_drc_instructions_struct + str_drc_instruction_str[DRC_INSTRUCTIONS_COUNT_MAX]; + ia_channel_layout_struct channel_layout; + ia_downmix_instructions_struct + dwnmix_instructions[DOWNMIX_INSTRUCTION_COUNT_MAX]; } ia_drc_config; typedef struct { - WORD32 loudness_info_set_ext_type[EXT_COUNT_MAX]; - WORD32 ext_bit_size[EXT_COUNT_MAX-1]; + WORD32 loudness_info_set_ext_type[EXT_COUNT_MAX]; + WORD32 ext_bit_size[EXT_COUNT_MAX - 1]; } ia_loudness_info_set_ext_struct; -typedef struct ia_drc_loudness_info_set_struct{ - WORD32 loudness_info_album_count; - WORD32 loudness_info_count; - WORD32 loudness_info_set_ext_present; - ia_loudness_info_struct str_loudness_info_album[LOUDNESS_INFO_COUNT_MAX]; - ia_loudness_info_struct loudness_info[LOUDNESS_INFO_COUNT_MAX]; - ia_loudness_info_set_ext_struct str_loudness_info_set_ext; +typedef struct ia_drc_loudness_info_set_struct { + WORD32 loudness_info_album_count; + WORD32 loudness_info_count; + WORD32 loudness_info_set_ext_present; + ia_loudness_info_struct str_loudness_info_album[LOUDNESS_INFO_COUNT_MAX]; + ia_loudness_info_struct loudness_info[LOUDNESS_INFO_COUNT_MAX]; + ia_loudness_info_set_ext_struct str_loudness_info_set_ext; } ia_drc_loudness_info_set_struct; typedef struct { - FLOAT32 loc_db_gain; - FLOAT32 slope; - WORD32 time; + FLOAT32 loc_db_gain; + FLOAT32 slope; + WORD32 time; } ia_node_struct; typedef struct { - WORD32 drc_gain_coding_mode; - WORD32 num_nodes; - ia_node_struct str_node[NODE_COUNT_MAX]; + WORD32 drc_gain_coding_mode; + WORD32 num_nodes; + ia_node_struct str_node[NODE_COUNT_MAX]; } ia_spline_nodes_struct; typedef struct { - ia_spline_nodes_struct str_spline_nodes [1]; + ia_spline_nodes_struct str_spline_nodes[1]; } ia_drc_gain_sequence_struct; typedef struct { - WORD32 uni_drc_gain_ext_type[EXT_COUNT_MAX]; - WORD32 ext_bit_size[EXT_COUNT_MAX-1]; + WORD32 uni_drc_gain_ext_type[EXT_COUNT_MAX]; + WORD32 ext_bit_size[EXT_COUNT_MAX - 1]; } ia_uni_drc_gain_ext_struct; -typedef struct ia_drc_gain_struct{ - WORD32 num_drc_gain_sequences; - ia_drc_gain_sequence_struct drc_gain_sequence[SEQUENCE_COUNT_MAX]; - WORD32 uni_drc_gain_ext_flag; - ia_uni_drc_gain_ext_struct uni_drc_gain_ext; +typedef struct ia_drc_gain_struct { + WORD32 num_drc_gain_sequences; + ia_drc_gain_sequence_struct drc_gain_sequence[SEQUENCE_COUNT_MAX]; + WORD32 uni_drc_gain_ext_flag; + ia_uni_drc_gain_ext_struct uni_drc_gain_ext; } ia_drc_gain_struct; typedef struct { - WORD32 delta_tmin_default; - WORD32 drc_frame_size; - WORD32 num_gain_values_max_default; - WORD32 delay_mode; - WORD32 lfe_channel_map_count; - WORD32 lfe_channel_map[MAX_CHANNEL_COUNT]; + WORD32 delta_tmin_default; + WORD32 drc_frame_size; + WORD32 num_gain_values_max_default; + WORD32 delay_mode; + WORD32 lfe_channel_map_count; + WORD32 lfe_channel_map[MAX_CHANNEL_COUNT]; } ia_drc_params_bs_dec_struct; -typedef struct ia_drc_bits_dec_struct -{ - - ia_tables_struct tables_default; - ia_drc_params_bs_dec_struct ia_drc_params_struct; - -}ia_drc_bits_dec_struct; +typedef struct ia_drc_bits_dec_struct { + ia_tables_struct tables_default; + ia_drc_params_bs_dec_struct ia_drc_params_struct; +} ia_drc_bits_dec_struct; #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_tables.c b/decoder/drc_src/impd_drc_tables.c index 849c300..b099b5e 100644 --- a/decoder/drc_src/impd_drc_tables.c +++ b/decoder/drc_src/impd_drc_tables.c @@ -28,93 +28,75 @@ #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); + 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_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_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; - } - +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; +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_tables.h b/decoder/drc_src/impd_drc_tables.h index c9a7b4a..7734763 100644 --- a/decoder/drc_src/impd_drc_tables.h +++ b/decoder/drc_src/impd_drc_tables.h @@ -20,23 +20,24 @@ #ifndef IMPD_DRC_TABLES_H #define IMPD_DRC_TABLES_H -const ia_filter_bank_params_struct normal_cross_freq[FILTER_BANK_PARAMETER_COUNT] = { - {2.0f/1024.0f, 0.0000373252f, 0.9913600345f}, - {3.0f/1024.0f, 0.0000836207f, 0.9870680830f}, - {4.0f/1024.0f, 0.0001480220f, 0.9827947083f}, - {5.0f/1024.0f, 0.0002302960f, 0.9785398263f}, - {6.0f/1024.0f, 0.0003302134f, 0.9743033527f}, - {2.0f/256.0f, 0.0005820761f, 0.9658852897f}, - {3.0f/256.0f, 0.0012877837f, 0.9492662926f}, - {2.0f/128.0f, 0.0022515827f, 0.9329321561f}, - {3.0f/128.0f, 0.0049030350f, 0.9010958535f}, - {2.0f/64.0f, 0.0084426929f, 0.8703307793f}, - {3.0f/64.0f, 0.0178631928f, 0.8118317459f}, - {2.0f/32.0f, 0.0299545822f, 0.7570763753f}, - {3.0f/32.0f, 0.0604985076f, 0.6574551915f}, - {2.0f/16.0f, 0.0976310729f, 0.5690355937f}, - {3.0f/16.0f, 0.1866943331f, 0.4181633458f}, - {2.0f/8.0f, 0.2928932188f, 0.2928932188f}, +const ia_filter_bank_params_struct + normal_cross_freq[FILTER_BANK_PARAMETER_COUNT] = { + {2.0f / 1024.0f, 0.0000373252f, 0.9913600345f}, + {3.0f / 1024.0f, 0.0000836207f, 0.9870680830f}, + {4.0f / 1024.0f, 0.0001480220f, 0.9827947083f}, + {5.0f / 1024.0f, 0.0002302960f, 0.9785398263f}, + {6.0f / 1024.0f, 0.0003302134f, 0.9743033527f}, + {2.0f / 256.0f, 0.0005820761f, 0.9658852897f}, + {3.0f / 256.0f, 0.0012877837f, 0.9492662926f}, + {2.0f / 128.0f, 0.0022515827f, 0.9329321561f}, + {3.0f / 128.0f, 0.0049030350f, 0.9010958535f}, + {2.0f / 64.0f, 0.0084426929f, 0.8703307793f}, + {3.0f / 64.0f, 0.0178631928f, 0.8118317459f}, + {2.0f / 32.0f, 0.0299545822f, 0.7570763753f}, + {3.0f / 32.0f, 0.0604985076f, 0.6574551915f}, + {2.0f / 16.0f, 0.0976310729f, 0.5690355937f}, + {3.0f / 16.0f, 0.1866943331f, 0.4181633458f}, + {2.0f / 8.0f, 0.2928932188f, 0.2928932188f}, }; #endif diff --git a/decoder/drc_src/impd_drc_uni_bitstream_dec_api.h b/decoder/drc_src/impd_drc_uni_bitstream_dec_api.h index 1c0bfe3..e3cdf4b 100644 --- a/decoder/drc_src/impd_drc_uni_bitstream_dec_api.h +++ b/decoder/drc_src/impd_drc_uni_bitstream_dec_api.h @@ -20,45 +20,32 @@ #ifndef IMPD_DRC_UNI_BITSTREAM_DEC_API_H #define IMPD_DRC_UNI_BITSTREAM_DEC_API_H - -WORD32 impd_init_drc_bitstream_dec(ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, - WORD32 sample_rate, - 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, - UWORD8* bitstream_config, - WORD32 num_bytes); - -WORD32 impd_process_drc_bitstream_dec_gain(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_gain_struct* pstr_drc_gain, - UWORD8* bitstream_gain, - WORD32 num_bytes, - WORD32 num_bits_offset, - WORD32* num_bits_read); - -WORD32 impd_process_drc_bitstream_dec_loudness_info_set(ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, - ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - UWORD8* bitstream_loudness, - WORD32 num_bytes_loudness - ); +WORD32 impd_init_drc_bitstream_dec( + ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, WORD32 sample_rate, + 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, + UWORD8* bitstream_config, WORD32 num_bytes); + +WORD32 impd_process_drc_bitstream_dec_gain( + 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_gain_struct* pstr_drc_gain, UWORD8* bitstream_gain, WORD32 num_bytes, + WORD32 num_bits_offset, WORD32* num_bits_read); + +WORD32 impd_process_drc_bitstream_dec_loudness_info_set( + ia_drc_bits_dec_struct* p_uni_drc_bs_dec_struct, + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + UWORD8* bitstream_loudness, WORD32 num_bytes_loudness); #endif - - - diff --git a/decoder/drc_src/impd_drc_uni_common.h b/decoder/drc_src/impd_drc_uni_common.h index e59af5d..f661405 100644 --- a/decoder/drc_src/impd_drc_uni_common.h +++ b/decoder/drc_src/impd_drc_uni_common.h @@ -21,112 +21,107 @@ #define IMPD_DRC_UNI_COMMON_H #ifdef __cplusplus -extern "C" -{ +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 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 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 MAXPACKETLOSSTIME 2.5f - -#define SLOPE_FACTOR_DB_TO_LINEAR 0.1151f +#define SLOPE_FACTOR_DB_TO_LINEAR 0.1151f #ifndef min #define min(a, b) ((a) < (b) ? (a) : (b)) @@ -139,27 +134,25 @@ extern "C" #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; - +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; diff --git a/decoder/drc_src/impd_drc_uni_dec.h b/decoder/drc_src/impd_drc_uni_dec.h index 3370068..6004418 100644 --- a/decoder/drc_src/impd_drc_uni_dec.h +++ b/decoder/drc_src/impd_drc_uni_dec.h @@ -21,22 +21,18 @@ #define IMPD_DRC_UNI_DEC_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -WORD32 impd_select_drc_coefficients(ia_drc_config* drc_config, - ia_uni_drc_coeffs_struct** drc_coefficients_drc, - WORD32* drc_coefficients_selected); +WORD32 impd_select_drc_coefficients( + ia_drc_config* drc_config, ia_uni_drc_coeffs_struct** drc_coefficients_drc, + WORD32* drc_coefficients_selected); -WORD32 impd_init_selected_drc_set(ia_drc_config* drc_config, - ia_drc_params_struct* ia_drc_params_struct, - WORD32 audio_num_chan, - WORD32 drc_set_id_selected, - WORD32 downmix_id_selected, - ia_filter_banks_struct* ia_filter_banks_struct, - ia_overlap_params_struct* pstr_overlap_params - ); +WORD32 impd_init_selected_drc_set( + ia_drc_config* drc_config, ia_drc_params_struct* ia_drc_params_struct, + WORD32 audio_num_chan, WORD32 drc_set_id_selected, + WORD32 downmix_id_selected, ia_filter_banks_struct* ia_filter_banks_struct, + ia_overlap_params_struct* pstr_overlap_params); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_eq.h b/decoder/drc_src/impd_drc_uni_eq.h index d83521f..faabf48 100644 --- a/decoder/drc_src/impd_drc_uni_eq.h +++ b/decoder/drc_src/impd_drc_uni_eq.h @@ -23,24 +23,23 @@ #ifndef COMPILE_FOR_DRC_ENCODER #endif -#define EQ_CHANNEL_COUNT_MAX 8 -#define EQ_AUDIO_DELAY_MAX 1024 -#define EQ_FIR_FILTER_SIZE_MAX 128 -#define EQ_SUBBAND_COUNT_MAX 256 -#define EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX 32 -#define EQ_INTERMEDIATE_PARAMETER_COUNT_MAX 32 -#define EQ_FILTER_SECTION_COUNT_MAX 8 -#define EQ_FILTER_ELEMENT_COUNT_MAX 4 -#define EQ_FILTER_COUNT_MAX 4 -#define MATCHING_PHASE_FILTER_COUNT_MAX 32 +#define EQ_CHANNEL_COUNT_MAX 8 +#define EQ_AUDIO_DELAY_MAX 1024 +#define EQ_FIR_FILTER_SIZE_MAX 128 +#define EQ_SUBBAND_COUNT_MAX 256 +#define EQ_INTERMEDIATE_2ND_ORDER_PARAMS_COUNT_MAX 32 +#define EQ_INTERMEDIATE_PARAMETER_COUNT_MAX 32 +#define EQ_FILTER_SECTION_COUNT_MAX 8 +#define EQ_FILTER_ELEMENT_COUNT_MAX 4 +#define EQ_FILTER_COUNT_MAX 4 +#define MATCHING_PHASE_FILTER_COUNT_MAX 32 -#define EQ_FILTER_DOMAIN_NONE 0 -#define EQ_FILTER_DOMAIN_TIME (1<<0) -#define EQ_FILTER_DOMAIN_SUBBAND (1<<1) +#define EQ_FILTER_DOMAIN_NONE 0 +#define EQ_FILTER_DOMAIN_TIME (1 << 0) +#define EQ_FILTER_DOMAIN_SUBBAND (1 << 1) #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #ifdef __cplusplus diff --git a/decoder/drc_src/impd_drc_uni_gain_dec.h b/decoder/drc_src/impd_drc_uni_gain_dec.h index 1137db4..918cc17 100644 --- a/decoder/drc_src/impd_drc_uni_gain_dec.h +++ b/decoder/drc_src/impd_drc_uni_gain_dec.h @@ -20,115 +20,93 @@ #ifndef IMPD_DRC_UNI_GAIN_DEC_H #define IMPD_DRC_UNI_GAIN_DEC_H - - - - #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct { - ia_node_struct str_node; - ia_node_struct prev_node; - FLOAT32 lpcm_gains[2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY]; + ia_node_struct str_node; + ia_node_struct prev_node; + FLOAT32 lpcm_gains[2 * AUDIO_CODEC_FRAME_SIZE_MAX + MAX_SIGNAL_DELAY]; } ia_interp_buf_struct; typedef struct { #if DRC_GAIN_DEBUG_FILE - FILE* f_gain_debug; + FILE* f_gain_debug; #endif - WORD32 buf_interpolation_count; - ia_interp_buf_struct* buf_interpolation; + WORD32 buf_interpolation_count; + ia_interp_buf_struct* buf_interpolation; } ia_gain_buffer_struct; typedef struct { - ia_gain_buffer_struct pstr_gain_buf[SEL_DRC_COUNT]; + ia_gain_buffer_struct pstr_gain_buf[SEL_DRC_COUNT]; } ia_drc_gain_buffers_struct; typedef struct { - WORD32 gain_interpolation_type; - WORD32 gain_modification_flag; - WORD32 ducking_flag; - WORD32 clipping_flag; - ia_ducking_modifiers_struct* pstr_ducking_modifiers; - ia_gain_modifiers_struct* pstr_gain_modifiers; - WORD32 limiter_peak_target_present; - FLOAT32 limiter_peak_target; - FLOAT32 loudness_normalization_gain_db; - WORD32 delta_tmin; - WORD32 characteristic_index; - FLOAT32 compress; - FLOAT32 boost; + WORD32 gain_interpolation_type; + WORD32 gain_modification_flag; + WORD32 ducking_flag; + WORD32 clipping_flag; + ia_ducking_modifiers_struct* pstr_ducking_modifiers; + ia_gain_modifiers_struct* pstr_gain_modifiers; + WORD32 limiter_peak_target_present; + FLOAT32 limiter_peak_target; + FLOAT32 loudness_normalization_gain_db; + WORD32 delta_tmin; + WORD32 characteristic_index; + FLOAT32 compress; + FLOAT32 boost; } ia_interp_params_struct; - typedef struct { - WORD32 drc_instructions_index; - WORD32 drc_coeff_idx; - WORD32 dwnmix_instructions_index; + WORD32 drc_instructions_index; + WORD32 drc_coeff_idx; + WORD32 dwnmix_instructions_index; } ia_sel_drc_struct; typedef struct { - WORD32 sample_rate; - WORD32 delta_tmin_default; - WORD32 drc_frame_size; - WORD32 delay_mode; - WORD32 sub_band_domain_mode; - WORD32 gain_delay_samples; - WORD32 audio_delay_samples; - WORD32 drc_set_counter; - WORD32 multiband_sel_drc_idx; - - ia_sel_drc_struct sel_drc_array[SEL_DRC_COUNT]; + WORD32 sample_rate; + WORD32 delta_tmin_default; + WORD32 drc_frame_size; + WORD32 delay_mode; + WORD32 sub_band_domain_mode; + WORD32 gain_delay_samples; + WORD32 audio_delay_samples; + WORD32 drc_set_counter; + WORD32 multiband_sel_drc_idx; + + ia_sel_drc_struct sel_drc_array[SEL_DRC_COUNT]; } ia_drc_params_struct; WORD32 -impd_gain_buf_init(WORD32 index, - WORD32 gain_element_count, - WORD32 drc_frame_size, - ia_gain_buffer_struct* pstr_gain_buf); +impd_gain_buf_init(WORD32 index, WORD32 gain_element_count, + WORD32 drc_frame_size, ia_gain_buffer_struct* pstr_gain_buf); WORD32 -impd_advance_buf(WORD32 drc_frame_size, - ia_gain_buffer_struct* pstr_gain_buf); - +impd_advance_buf(WORD32 drc_frame_size, ia_gain_buffer_struct* pstr_gain_buf); WORD32 -impd_map_gain ( - FLOAT32 gain_in_db, - FLOAT32* gain_out_db); +impd_map_gain(FLOAT32 gain_in_db, FLOAT32* gain_out_db); WORD32 -impd_conv_to_linear_domain (ia_interp_params_struct* interp_params_str, - WORD32 drc_band, - FLOAT32 loc_db_gain, - FLOAT32 in_param_db_slope, - FLOAT32* out_param_lin_gain, - FLOAT32* out_param_lin_slope); +impd_conv_to_linear_domain(ia_interp_params_struct* interp_params_str, + WORD32 drc_band, FLOAT32 loc_db_gain, + FLOAT32 in_param_db_slope, + FLOAT32* out_param_lin_gain, + FLOAT32* out_param_lin_slope); WORD32 impd_interpolate_drc_gain(ia_interp_params_struct* interp_params_str, - WORD32 drc_band, - WORD32 gain_step_tdomain, - FLOAT32 gain0, - FLOAT32 gain1, - FLOAT32 slope0, - FLOAT32 slope1, - FLOAT32* result); + WORD32 drc_band, WORD32 gain_step_tdomain, + FLOAT32 gain0, FLOAT32 gain1, FLOAT32 slope0, + FLOAT32 slope1, FLOAT32* result); WORD32 -impd_concatenate_segments(WORD32 drc_frame_size, - WORD32 drc_band, - ia_interp_params_struct* interp_params_str, - ia_spline_nodes_struct* str_spline_nodes, - ia_interp_buf_struct* buf_interpolation); - - - - +impd_concatenate_segments(WORD32 drc_frame_size, WORD32 drc_band, + ia_interp_params_struct* interp_params_str, + ia_spline_nodes_struct* str_spline_nodes, + ia_interp_buf_struct* buf_interpolation); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_interface.h b/decoder/drc_src/impd_drc_uni_interface.h index 222a3e3..afeedcd 100644 --- a/decoder/drc_src/impd_drc_uni_interface.h +++ b/decoder/drc_src/impd_drc_uni_interface.h @@ -20,97 +20,97 @@ #ifndef IMPD_DRC_UNI_INTERFACE_H #define IMPD_DRC_UNI_INTERFACE_H - typedef struct { - WORD32 ext_size_bits; - WORD32 ext_bit_size; - WORD32 uni_drc_interface_ext_type; + WORD32 ext_size_bits; + WORD32 ext_bit_size; + WORD32 uni_drc_interface_ext_type; } ia_specific_interface_extension_struct; typedef struct { - WORD32 interface_ext_count; - ia_specific_interface_extension_struct specific_interface_ext[EXT_COUNT_MAX]; + WORD32 interface_ext_count; + ia_specific_interface_extension_struct specific_interface_ext[EXT_COUNT_MAX]; } ia_drc_uni_interface_ext_struct; typedef struct { - WORD32 change_compress; - WORD32 change_boost; - FLOAT32 compress; - FLOAT32 boost; - WORD32 change_drc_characteristic_target; - WORD32 drc_characteristic_target; + WORD32 change_compress; + WORD32 change_boost; + FLOAT32 compress; + FLOAT32 boost; + WORD32 change_drc_characteristic_target; + WORD32 drc_characteristic_target; } ia_drc_parameter_interface_struct; typedef struct { - WORD32 dynamic_range_control_on; - WORD32 num_drc_feature_requests; - WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_num_drc_effects[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 desired_num_drc_effects_of_requested[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_drc_effect_type[MAX_NUM_DRC_FEATURE_REQUESTS][MAX_NUM_DRC_EFFECT_TYPE_REQUESTS]; - WORD32 requested_dyn_rng_measurement_type[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_dyn_range_is_single_val_flag[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_value[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_min_val[MAX_NUM_DRC_FEATURE_REQUESTS]; - FLOAT32 requested_dyn_range_max_val[MAX_NUM_DRC_FEATURE_REQUESTS]; - WORD32 requested_drc_characteristic[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 dynamic_range_control_on; + WORD32 num_drc_feature_requests; + WORD32 drc_feature_req_type[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_num_drc_effects[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 desired_num_drc_effects_of_requested[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_drc_effect_type[MAX_NUM_DRC_FEATURE_REQUESTS] + [MAX_NUM_DRC_EFFECT_TYPE_REQUESTS]; + WORD32 requested_dyn_rng_measurement_type[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_dyn_range_is_single_val_flag[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_value[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_min_val[MAX_NUM_DRC_FEATURE_REQUESTS]; + FLOAT32 requested_dyn_range_max_val[MAX_NUM_DRC_FEATURE_REQUESTS]; + WORD32 requested_drc_characteristic[MAX_NUM_DRC_FEATURE_REQUESTS]; } ia_dyn_rng_ctrl_interface_struct; typedef struct { - WORD32 album_mode; - WORD32 peak_limiter; - WORD32 change_loudness_deviation_max; - WORD32 loudness_deviation_max; - WORD32 change_loudness_measur_method; - WORD32 loudness_measurement_method; - WORD32 change_loudness_measur_system; - WORD32 loudness_measurement_system; - WORD32 change_loudness_measur_pre_proc; - WORD32 loudness_measurement_pre_proc; - WORD32 change_device_cut_off_freq; - WORD32 device_cut_off_frequency; - WORD32 change_loudness_norm_gain_db_max; - FLOAT32 loudness_norm_gain_db_max; - WORD32 change_loudness_norm_gain_modification_db; - FLOAT32 loudness_norm_gain_modification_db; - WORD32 change_output_peak_level_max; - FLOAT32 output_peak_level_max; + WORD32 album_mode; + WORD32 peak_limiter; + WORD32 change_loudness_deviation_max; + WORD32 loudness_deviation_max; + WORD32 change_loudness_measur_method; + WORD32 loudness_measurement_method; + WORD32 change_loudness_measur_system; + WORD32 loudness_measurement_system; + WORD32 change_loudness_measur_pre_proc; + WORD32 loudness_measurement_pre_proc; + WORD32 change_device_cut_off_freq; + WORD32 device_cut_off_frequency; + WORD32 change_loudness_norm_gain_db_max; + FLOAT32 loudness_norm_gain_db_max; + WORD32 change_loudness_norm_gain_modification_db; + FLOAT32 loudness_norm_gain_modification_db; + WORD32 change_output_peak_level_max; + FLOAT32 output_peak_level_max; } ia_loudness_norm_parameter_interface_struct; typedef struct { - WORD32 loudness_normalization_on; - FLOAT32 target_loudness; + WORD32 loudness_normalization_on; + FLOAT32 target_loudness; } ia_loudness_norm_ctrl_interface_struct; typedef struct { - WORD32 target_config_request_type; - WORD32 num_downmix_id_requests; - WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS]; - WORD32 requested_target_layout; - WORD32 requested_target_ch_count; + WORD32 target_config_request_type; + WORD32 num_downmix_id_requests; + WORD32 requested_dwnmix_id[MAX_NUM_DOWNMIX_ID_REQUESTS]; + WORD32 requested_target_layout; + WORD32 requested_target_ch_count; } ia_system_interface_struct; typedef struct { - WORD32 interface_signat_type; - WORD32 interface_signat_data_len; - UWORD32 interface_signat_data[MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE*8]; + WORD32 interface_signat_type; + WORD32 interface_signat_data_len; + UWORD32 interface_signat_data[MAX_SIGNATURE_DATA_LENGTH_PLUS_ONE * 8]; } ia_drc_uni_interface_signat_struct; -typedef struct ia_drc_interface_struct{ - WORD32 interface_signat_flag; - WORD32 system_interface_flag; - WORD32 loudness_norm_ctrl_interface_flag; - WORD32 loudness_norm_parameter_interface_flag; - WORD32 drc_interface_flag; - WORD32 drc_parameter_interface_flag; - WORD32 drc_uni_interface_ext_flag; - ia_drc_uni_interface_signat_struct drc_uni_interface_signature; - ia_system_interface_struct system_interface; - ia_loudness_norm_ctrl_interface_struct loudness_norm_ctrl_interface; - ia_loudness_norm_parameter_interface_struct loudness_norm_param_interface; - ia_dyn_rng_ctrl_interface_struct drc_ctrl_interface; - ia_drc_parameter_interface_struct drc_parameter_interface; - ia_drc_uni_interface_ext_struct drc_uni_interface_ext; +typedef struct ia_drc_interface_struct { + WORD32 interface_signat_flag; + WORD32 system_interface_flag; + WORD32 loudness_norm_ctrl_interface_flag; + WORD32 loudness_norm_parameter_interface_flag; + WORD32 drc_interface_flag; + WORD32 drc_parameter_interface_flag; + WORD32 drc_uni_interface_ext_flag; + ia_drc_uni_interface_signat_struct drc_uni_interface_signature; + ia_system_interface_struct system_interface; + ia_loudness_norm_ctrl_interface_struct loudness_norm_ctrl_interface; + ia_loudness_norm_parameter_interface_struct loudness_norm_param_interface; + ia_dyn_rng_ctrl_interface_struct drc_ctrl_interface; + ia_drc_parameter_interface_struct drc_parameter_interface; + ia_drc_uni_interface_ext_struct drc_uni_interface_ext; } ia_drc_interface_struct; #endif diff --git a/decoder/drc_src/impd_drc_uni_loud_eq.h b/decoder/drc_src/impd_drc_uni_loud_eq.h index 4f85f81..5145a23 100644 --- a/decoder/drc_src/impd_drc_uni_loud_eq.h +++ b/decoder/drc_src/impd_drc_uni_loud_eq.h @@ -20,10 +20,8 @@ #ifndef IMPD_DRC_UNI_LOUD_EQ_H #define IMPD_DRC_UNI_LOUD_EQ_H - #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif #ifdef __cplusplus diff --git a/decoder/drc_src/impd_drc_uni_multi_band.h b/decoder/drc_src/impd_drc_uni_multi_band.h index 0b60ee6..b380db8 100644 --- a/decoder/drc_src/impd_drc_uni_multi_band.h +++ b/decoder/drc_src/impd_drc_uni_multi_band.h @@ -20,51 +20,45 @@ #ifndef IMPD_DRC_UNI_MULTI_BAND_H #define IMPD_DRC_UNI_MULTI_BAND_H -#define DRC_SUBBAND_COUNT_WITH_AUDIO_CODEC_FILTERBANK_MAX FILTER_BANK_PARAMETER_COUNT +#define DRC_SUBBAND_COUNT_WITH_AUDIO_CODEC_FILTERBANK_MAX \ + FILTER_BANK_PARAMETER_COUNT #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct { - FLOAT32 overlap_weight[AUDIO_CODEC_SUBBAND_COUNT_MAX]; + FLOAT32 overlap_weight[AUDIO_CODEC_SUBBAND_COUNT_MAX]; } ia_band_overlap_params_struct; typedef struct { - ia_band_overlap_params_struct str_band_overlap_params[BAND_COUNT_MAX]; + ia_band_overlap_params_struct str_band_overlap_params[BAND_COUNT_MAX]; } ia_group_overlap_params_struct; typedef struct { - ia_group_overlap_params_struct str_group_overlap_params[CHANNEL_GROUP_COUNT_MAX]; + ia_group_overlap_params_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); +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); +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 (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); +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 ( 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); - +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); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_parser.h b/decoder/drc_src/impd_drc_uni_parser.h index 7713304..d2e6dd4 100644 --- a/decoder/drc_src/impd_drc_uni_parser.h +++ b/decoder/drc_src/impd_drc_uni_parser.h @@ -22,86 +22,77 @@ WORD32 impd_dec_ducking_scaling(ia_bit_buf_struct* it_bit_buff, - WORD32* ducking_scaling_flag, - FLOAT32* ducking_scaling); + WORD32* ducking_scaling_flag, + FLOAT32* ducking_scaling); WORD32 -impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_loudness_info_struct* loudness_info); - +impd_parse_loudness_info(ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_loudness_info_struct* loudness_info); WORD32 -impd_parse_loudness_info_set_ext(ia_bit_buf_struct* it_bit_buff, - ia_drc_loudness_info_set_struct* loudness_info_set); +impd_parse_loudness_info_set_ext( + ia_bit_buf_struct* it_bit_buff, + ia_drc_loudness_info_set_struct* loudness_info_set); WORD32 -impd_sel_drc_coeff(ia_drc_config* drc_config, - WORD32 location, - ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); +impd_sel_drc_coeff( + ia_drc_config* drc_config, WORD32 location, + ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); WORD32 -impd_drc_parse_instructions_basic(ia_bit_buf_struct* it_bit_buff, - ia_drc_config* drc_config, - ia_drc_instructions_basic_struct* str_drc_instructions_basic); +impd_drc_parse_instructions_basic( + ia_bit_buf_struct* it_bit_buff, ia_drc_config* drc_config, + ia_drc_instructions_basic_struct* str_drc_instructions_basic); WORD32 -impd_parse_drc_instructions_uni_drc(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_config* drc_config, - ia_channel_layout_struct* channel_layout, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_instructions_struct* str_drc_instruction_str); - +impd_parse_drc_instructions_uni_drc( + ia_bit_buf_struct* it_bit_buff, WORD32 version, ia_drc_config* drc_config, + ia_channel_layout_struct* channel_layout, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_drc_instructions_struct* str_drc_instruction_str); WORD32 -impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - WORD32* gain_seq_idx, - ia_gain_set_params_struct* gain_set_params); +impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, WORD32 version, + WORD32* gain_seq_idx, + ia_gain_set_params_struct* gain_set_params); WORD32 -impd_drc_parse_coeff(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc); +impd_drc_parse_coeff( + ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_uni_drc_coeffs_struct* str_p_loc_drc_coefficients_uni_drc); WORD32 -impd_parse_dwnmix_instructions(ia_bit_buf_struct* it_bit_buff, - WORD32 version, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_channel_layout_struct* channel_layout, - ia_downmix_instructions_struct* dwnmix_instructions); - +impd_parse_dwnmix_instructions( + ia_bit_buf_struct* it_bit_buff, WORD32 version, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_channel_layout_struct* channel_layout, + ia_downmix_instructions_struct* dwnmix_instructions); WORD32 -impd_parse_drc_config( - ia_bit_buf_struct* it_bit_buff, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_config* drc_config - ); +impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_drc_config* drc_config); WORD32 -impd_parse_loudness_info_set(ia_bit_buf_struct* it_bit_buff, - ia_drc_params_bs_dec_struct* ia_drc_params_struct, - ia_drc_loudness_info_set_struct* loudness_info_set); +impd_parse_loudness_info_set( + ia_bit_buf_struct* it_bit_buff, + ia_drc_params_bs_dec_struct* ia_drc_params_struct, + ia_drc_loudness_info_set_struct* loudness_info_set); WORD32 -impd_parse_drc_gain_sequence( - ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, - ia_gain_set_params_struct* gain_set_params, - ia_drc_gain_sequence_struct* drc_gain_sequence); +impd_parse_drc_gain_sequence(ia_bit_buf_struct* it_bit_buff, + ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, + ia_gain_set_params_struct* gain_set_params, + ia_drc_gain_sequence_struct* drc_gain_sequence); WORD32 impd_parse_uni_drc_gain_ext(ia_bit_buf_struct* it_bit_buff, - ia_uni_drc_gain_ext_struct* uni_drc_gain_ext); - -WORD32 impd_drc_uni_gain_read( - ia_bit_buf_struct* it_bit_buff, - ia_drc_bits_dec_struct *pstr_drc_uni_bs_dec, - ia_drc_config* drc_config, - ia_drc_gain_struct* pstr_uni_drc_gain); + ia_uni_drc_gain_ext_struct* uni_drc_gain_ext); +WORD32 impd_drc_uni_gain_read(ia_bit_buf_struct* it_bit_buff, + ia_drc_bits_dec_struct* pstr_drc_uni_bs_dec, + ia_drc_config* drc_config, + ia_drc_gain_struct* pstr_uni_drc_gain); #endif diff --git a/decoder/drc_src/impd_drc_uni_process_audio.h b/decoder/drc_src/impd_drc_uni_process_audio.h index da57588..d5a8266 100644 --- a/decoder/drc_src/impd_drc_uni_process_audio.h +++ b/decoder/drc_src/impd_drc_uni_process_audio.h @@ -21,37 +21,32 @@ #define IMPD_DRC_UNI_PROCESS_AUDIO_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct { - WORD32 multiband_audio_sig_count; - WORD32 frame_size; - FLOAT32** non_interleaved_audio; + WORD32 multiband_audio_sig_count; + WORD32 frame_size; + FLOAT32** non_interleaved_audio; } ia_audio_band_buffer_struct; - - 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_re[], - FLOAT32* deinterleaved_audio_im[]); - + 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_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, - FLOAT32* audio_io_buf[], - ia_audio_band_buffer_struct* audio_band_buffer, - ia_filter_banks_struct* ia_filter_banks_struct, - const WORD32 passThru); - + const WORD32 drc_instructions_index, + ia_drc_params_struct* ia_drc_params_struct, + FLOAT32* audio_io_buf[], + ia_audio_band_buffer_struct* audio_band_buffer, + ia_filter_banks_struct* ia_filter_banks_struct, + const WORD32 passThru); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_sel_proc_drc_set_sel.h b/decoder/drc_src/impd_drc_uni_sel_proc_drc_set_sel.h index 7b31d5a..90b0327 100644 --- a/decoder/drc_src/impd_drc_uni_sel_proc_drc_set_sel.h +++ b/decoder/drc_src/impd_drc_uni_sel_proc_drc_set_sel.h @@ -24,28 +24,27 @@ extern "C" { #endif /* __cplusplus */ - -#define SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH (1<<0) -#define SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT (1<<1) +#define SELECTION_FLAG_DRC_TARGET_LOUDNESS_MATCH (1 << 0) +#define SELECTION_FLAG_EXPLICIT_PEAK_INFO_PRESENT (1 << 1) typedef struct { - WORD32 drc_instructions_index; - WORD32 downmix_id_request_index; - WORD32 eq_set_id; - FLOAT32 output_peak_level; - FLOAT32 loudness_norm_db_gain_adjusted; - FLOAT32 output_loudness; - FLOAT32 mixing_level; - WORD32 selection_flags; + WORD32 drc_instructions_index; + WORD32 downmix_id_request_index; + WORD32 eq_set_id; + FLOAT32 output_peak_level; + FLOAT32 loudness_norm_db_gain_adjusted; + FLOAT32 output_loudness; + FLOAT32 mixing_level; + WORD32 selection_flags; } ia_selection_candidate_info_struct; - WORD32 -impd_validate_requested_drc_feature(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct); +impd_validate_requested_drc_feature( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct); WORD32 impd_map_requested_effect_bit_idx(WORD32 requested_effect_type, - WORD32* effect_bit_idx); + WORD32* effect_bit_idx); WORD32 impd_get_fading_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); @@ -55,88 +54,84 @@ impd_get_ducking_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 impd_get_selected_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32 drc_set_id_selected); + WORD32 drc_set_id_selected); WORD32 impd_get_dependent_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 -impd_get_dependent_drc_instructions(const ia_drc_config* drc_config, - const ia_drc_instructions_struct* str_drc_instruction_str, - ia_drc_instructions_struct** ppstr_drc_instructions_dependent); - +impd_get_dependent_drc_instructions( + const ia_drc_config* drc_config, + const ia_drc_instructions_struct* str_drc_instruction_str, + ia_drc_instructions_struct** ppstr_drc_instructions_dependent); WORD32 -impd_select_drcs_without_compr_effects (ia_drc_config* pstr_drc_config, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_select_drcs_without_compr_effects( + ia_drc_config* pstr_drc_config, WORD32* match_found_flag, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_effect_type_attempt(ia_drc_config* pstr_drc_config, - WORD32 requested_effect_type, - WORD32 stateRequested, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_effect_type_attempt( + ia_drc_config* pstr_drc_config, WORD32 requested_effect_type, + WORD32 stateRequested, WORD32* match_found_flag, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_effect_types(ia_drc_config* pstr_drc_config, - WORD32 total_effect_type_requested, - WORD32 desired_effect_type_requested, - WORD32* requested_effect_type, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); - -WORD32 impd_match_dynamic_range(ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - WORD32 num_drc_requests, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_effect_types( + ia_drc_config* pstr_drc_config, WORD32 total_effect_type_requested, + WORD32 desired_effect_type_requested, WORD32* requested_effect_type, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); + +WORD32 impd_match_dynamic_range( + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + WORD32 num_drc_requests, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_drc_characteristic_attempt(ia_drc_config* pstr_drc_config, - WORD32 requested_drc_characteristic, - WORD32* match_found_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_drc_characteristic_attempt( + ia_drc_config* pstr_drc_config, WORD32 requested_drc_characteristic, + WORD32* match_found_flag, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); WORD32 -impd_match_drc_characteristic(ia_drc_config* pstr_drc_config, - WORD32 requested_drc_characteristic, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); +impd_match_drc_characteristic( + ia_drc_config* pstr_drc_config, WORD32 requested_drc_characteristic, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); -VOID impd_select_drc_coeff3(ia_drc_config* drc_config, - ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); +VOID impd_select_drc_coeff3( + ia_drc_config* drc_config, + ia_uni_drc_coeffs_struct** str_p_loc_drc_coefficients_uni_drc); WORD32 -impd_drc_set_preselection(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - WORD32 restrict_to_drc_with_album_loudness, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info); - -WORD32 impd_drc_set_final_selection(ia_drc_config* pstr_drc_config, - ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info -); - -WORD32 impd_match_eq_set_purpose(ia_drc_config* drc_config, - WORD32 eq_set_purpose_requested, - WORD32* eq_set_id_valid_flag, - WORD32* selection_candidate_count, - ia_selection_candidate_info_struct* selection_candidate_info, - ia_selection_candidate_info_struct* selection_candidate_info_step_2 - ); +impd_drc_set_preselection( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + WORD32 restrict_to_drc_with_album_loudness, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); + +WORD32 impd_drc_set_final_selection( + ia_drc_config* pstr_drc_config, + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info); + +WORD32 impd_match_eq_set_purpose( + ia_drc_config* drc_config, WORD32 eq_set_purpose_requested, + WORD32* eq_set_id_valid_flag, WORD32* selection_candidate_count, + ia_selection_candidate_info_struct* selection_candidate_info, + ia_selection_candidate_info_struct* selection_candidate_info_step_2); WORD32 impd_select_drc_set(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - WORD32* drc_set_id_selected - ); + WORD32* drc_set_id_selected); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_sel_proc_init.h b/decoder/drc_src/impd_drc_uni_sel_proc_init.h index 5603008..977ba6a 100644 --- a/decoder/drc_src/impd_drc_uni_sel_proc_init.h +++ b/decoder/drc_src/impd_drc_uni_sel_proc_init.h @@ -28,12 +28,14 @@ WORD32 impd_drc_sel_proc_init_dflt(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc); WORD32 -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); +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(ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, - ia_drc_interface_struct* pstr_drc_interface); +impd_drc_sel_proc_init_interface_params( + ia_drc_sel_pro_struct* pstr_drc_uni_sel_proc, + ia_drc_interface_struct* pstr_drc_interface); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_sel_proc_loudness_control.h b/decoder/drc_src/impd_drc_uni_sel_proc_loudness_control.h index 057d338..cf8c36c 100644 --- a/decoder/drc_src/impd_drc_uni_sel_proc_loudness_control.h +++ b/decoder/drc_src/impd_drc_uni_sel_proc_loudness_control.h @@ -26,62 +26,55 @@ extern "C" { 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, - const WORD32 requested_dwnmix_id, - const WORD32 album_mode, - const WORD32 num_compression_eq_count, - const WORD32* num_compression_eq_id, - WORD32* peak_info_count, - WORD32 eq_set_id[], - FLOAT32 signal_peak_level[], - WORD32 explicit_peak_information_present[]); + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_drc_instructions_struct* str_drc_instruction_str, + const WORD32 requested_dwnmix_id, + const WORD32 album_mode, + const WORD32 num_compression_eq_count, + const 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(ia_loudness_info_struct* loudness_info, - const WORD32 dyn_range_measurement_type, - WORD32 * loudness_peak_2_avg_value_present, - FLOAT32* loudness_peak_2_avg_value); +impd_extract_loudness_peak_to_average_info( + ia_loudness_info_struct* loudness_info, + const WORD32 dyn_range_measurement_type, + WORD32* loudness_peak_2_avg_value_present, + FLOAT32* loudness_peak_2_avg_value); WORD32 impd_overall_loudness_present(const ia_loudness_info_struct* loudness_info, WORD32* loudness_info_present); WORD32 -impd_find_overall_loudness_info(ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - const WORD32 requested_dwnmix_id, - const WORD32 drc_set_id_requested, - WORD32* overall_loudness_info_present, - WORD32* loudness_info_count, - ia_loudness_info_struct* loudness_info[]); +impd_find_overall_loudness_info( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + const WORD32 requested_dwnmix_id, const WORD32 drc_set_id_requested, + WORD32* overall_loudness_info_present, WORD32* loudness_info_count, + ia_loudness_info_struct* loudness_info[]); WORD32 -impd_high_pass_loudness_adjust_info(const ia_loudness_info_struct* loudness_info, - WORD32* loudness_hp_adjust_present, - FLOAT32* loudness_hp_adjust); +impd_high_pass_loudness_adjust_info( + const ia_loudness_info_struct* loudness_info, + WORD32* loudness_hp_adjust_present, FLOAT32* loudness_hp_adjust); WORD32 impd_find_high_pass_loudness_adjust( - ia_drc_loudness_info_set_struct* pstr_loudness_info, - const WORD32 requested_dwnmix_id, - const WORD32 drc_set_id_requested, - const WORD32 album_mode, - const FLOAT32 device_cutoff_freq, - WORD32* loudness_hp_adjust_present, - FLOAT32* loudness_hp_adjust); + ia_drc_loudness_info_set_struct* pstr_loudness_info, + const WORD32 requested_dwnmix_id, const WORD32 drc_set_id_requested, + const WORD32 album_mode, const FLOAT32 device_cutoff_freq, + WORD32* loudness_hp_adjust_present, FLOAT32* loudness_hp_adjust); WORD32 -impd_init_loudness_control (ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - const WORD32 requested_dwnmix_id, - const WORD32 drc_set_id_requested, - const WORD32 num_compression_eq_count, - const WORD32* num_compression_eq_id, - WORD32* loudness_info_count, - WORD32 eq_set_id[], - FLOAT32 loudness_normalization_gain_db[], - FLOAT32 loudness[]); +impd_init_loudness_control( + ia_drc_sel_proc_params_struct* pstr_drc_sel_proc_params_struct, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + const WORD32 requested_dwnmix_id, const WORD32 drc_set_id_requested, + const WORD32 num_compression_eq_count, const WORD32* num_compression_eq_id, + WORD32* loudness_info_count, WORD32 eq_set_id[], + FLOAT32 loudness_normalization_gain_db[], FLOAT32 loudness[]); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_drc_uni_shape_filter.h b/decoder/drc_src/impd_drc_uni_shape_filter.h index 17cb04a..25adbe9 100644 --- a/decoder/drc_src/impd_drc_uni_shape_filter.h +++ b/decoder/drc_src/impd_drc_uni_shape_filter.h @@ -20,6 +20,4 @@ #ifndef IMPD_DRC_UNI_SHAPE_FILTER_H #define IMPD_DRC_UNI_SHAPE_FILTER_H - - #endif diff --git a/decoder/drc_src/impd_drc_uni_tables.h b/decoder/drc_src/impd_drc_uni_tables.h index 89b864b..517a9db 100644 --- a/decoder/drc_src/impd_drc_uni_tables.h +++ b/decoder/drc_src/impd_drc_uni_tables.h @@ -21,70 +21,69 @@ #define IMPD_DRC_UNI_TABLES_H #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif -#define N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX (512+14) +#define N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX (512 + 14) typedef struct { - WORD32 size; - WORD32 code; - WORD32 value; + WORD32 size; + WORD32 code; + WORD32 value; } ia_delta_time_code_table_entry_struct; typedef struct { - WORD32 size; - WORD32 code; - FLOAT32 value; - WORD32 index; + WORD32 size; + WORD32 code; + FLOAT32 value; + WORD32 index; } ia_slope_code_table_struct; typedef struct { - WORD32 size; - WORD32 code; - FLOAT32 value; + WORD32 size; + WORD32 code; + FLOAT32 value; } ia_delta_gain_code_table_struct; typedef struct { - ia_delta_time_code_table_entry_struct delta_time_code_table[N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX]; + ia_delta_time_code_table_entry_struct + delta_time_code_table[N_DELTA_TIME_CODE_TABLE_ENTRIES_MAX]; } ia_tables_struct; typedef struct { - FLOAT32 in_out_ratio; - FLOAT32 exp_lo; - FLOAT32 exp_hi; + FLOAT32 in_out_ratio; + FLOAT32 exp_lo; + FLOAT32 exp_hi; } ia_cicp_sigmoid_characteristic_param_struct; typedef struct { - FLOAT32 inLevel; - FLOAT32 gain; + FLOAT32 inLevel; + FLOAT32 gain; } ia_characteristic_node_coordinate_struct; typedef struct { - WORD32 coordinateCount; - ia_characteristic_node_coordinate_struct characteristicNodeCoordinate[5]; + WORD32 coordinateCount; + 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); +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, - ia_delta_time_code_table_entry_struct* delta_time_code_tbl_item); +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); -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); +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); -void -impd_get_slope_code_tbl_and_size(ia_slope_code_table_struct const** slope_code_tbl_entry, - WORD32* num_slope_code_tbl_entries); +void impd_get_slope_code_tbl_and_size( + ia_slope_code_table_struct const** slope_code_tbl_entry, + WORD32* num_slope_code_tbl_entries); WORD32 -impd_get_delta_tmin (const WORD32 sampling_rate); +impd_get_delta_tmin(const WORD32 sampling_rate); #ifdef __cplusplus } diff --git a/decoder/drc_src/impd_error_handler.h b/decoder/drc_src/impd_error_handler.h index 6de2968..fd475fe 100644 --- a/decoder/drc_src/impd_error_handler.h +++ b/decoder/drc_src/impd_error_handler.h @@ -34,25 +34,25 @@ /*****************************************************************************/ /* Constant hash defines */ /*****************************************************************************/ -#define IA_ERROR_NON_FATAL_IDX 0x0 -#define IA_ERROR_FATAL_IDX 0x1 +#define IA_ERROR_NON_FATAL_IDX 0x0 +#define IA_ERROR_FATAL_IDX 0x1 -#define IA_ERROR_CLASS_0 0x0 -#define IA_ERROR_CLASS_1 0x1 -#define IA_ERROR_CLASS_2 0x2 -#define IA_ERROR_CLASS_3 0x3 -#define IA_ERROR_CLASS_4 0x4 -#define IA_ERROR_CLASS_5 0x5 -#define IA_ERROR_CLASS_6 0x6 -#define IA_ERROR_CLASS_7 0x7 -#define IA_ERROR_CLASS_8 0x8 -#define IA_ERROR_CLASS_9 0x9 -#define IA_ERROR_CLASS_A 0xA -#define IA_ERROR_CLASS_B 0xB -#define IA_ERROR_CLASS_C 0xC -#define IA_ERROR_CLASS_D 0xD -#define IA_ERROR_CLASS_E 0xE -#define IA_ERROR_CLASS_F 0xF +#define IA_ERROR_CLASS_0 0x0 +#define IA_ERROR_CLASS_1 0x1 +#define IA_ERROR_CLASS_2 0x2 +#define IA_ERROR_CLASS_3 0x3 +#define IA_ERROR_CLASS_4 0x4 +#define IA_ERROR_CLASS_5 0x5 +#define IA_ERROR_CLASS_6 0x6 +#define IA_ERROR_CLASS_7 0x7 +#define IA_ERROR_CLASS_8 0x8 +#define IA_ERROR_CLASS_9 0x9 +#define IA_ERROR_CLASS_A 0xA +#define IA_ERROR_CLASS_B 0xB +#define IA_ERROR_CLASS_C 0xC +#define IA_ERROR_CLASS_D 0xD +#define IA_ERROR_CLASS_E 0xE +#define IA_ERROR_CLASS_F 0xF /* each module, hence, needs to copy the following structure */ /* the first index is for FATAL/NONFATAL */ @@ -63,11 +63,10 @@ /*****************************************************************************/ /* Type definitions */ /*****************************************************************************/ -typedef struct -{ - pWORD8 pb_module_name; - pWORD8 ppb_class_names[16]; - WORD8 **ppppb_error_msg_pointers[2][16]; +typedef struct { + pWORD8 pb_module_name; + pWORD8 ppb_class_names[16]; + WORD8 **ppppb_error_msg_pointers[2][16]; } ia_error_info_struct; /*****************************************************************************/ @@ -76,19 +75,17 @@ typedef struct /* this error handler maps the code generated by a module to a error string */ /* pb_context is a string to specify where the module broke */ IA_ERRORCODE ia_error_handler(ia_error_info_struct *p_mod_err_info, - WORD8 *pb_context, IA_ERRORCODE code); + WORD8 *pb_context, IA_ERRORCODE code); /*****************************************************************************/ /* Macro functions */ /*****************************************************************************/ /* the following macro does a line job of returning back to the parent */ /* in case a fatal error occurs after calling the errorhandler */ -#define _IA_HANDLE_ERROR(p_mod_err_info, context, e) \ - if((e) != IA_NO_ERROR) \ - { \ - ia_error_handler((p_mod_err_info), (context), (e)); \ - if((e) & IA_FATAL_ERROR) \ - return (e); \ - } +#define _IA_HANDLE_ERROR(p_mod_err_info, context, e) \ + if ((e) != IA_NO_ERROR) { \ + ia_error_handler((p_mod_err_info), (context), (e)); \ + if ((e)&IA_FATAL_ERROR) return (e); \ + } #endif diff --git a/decoder/drc_src/impd_error_standards.h b/decoder/drc_src/impd_error_standards.h index 8bce654..2ef331c 100644 --- a/decoder/drc_src/impd_error_standards.h +++ b/decoder/drc_src/impd_error_standards.h @@ -33,8 +33,8 @@ typedef WORD32 IA_ERRORCODE; /*****************************************************************************/ /* Constant hash defines */ /*****************************************************************************/ -#define IA_NO_ERROR 0x00000000 +#define IA_NO_ERROR 0x00000000 /* error handling 'AND' definition */ -#define IA_FATAL_ERROR 0x80000000 +#define IA_FATAL_ERROR 0x80000000 #endif /* __IMPD_ERROR_STANDARDS_H__ */ diff --git a/decoder/drc_src/impd_memory_standards.h b/decoder/drc_src/impd_memory_standards.h index a7ef91c..0cb5aa6 100644 --- a/decoder/drc_src/impd_memory_standards.h +++ b/decoder/drc_src/impd_memory_standards.h @@ -25,85 +25,84 @@ /* Type definitions */ /*****************************************************************************/ /* standard memory table descriptor for libraries */ -typedef struct -{ - UWORD32 ui_size; /* size of the memory in bytes */ - UWORD32 ui_alignment; /* alignment in bytes */ - UWORD32 ui_type; /* type of memory */ - UWORD32 ui_placement[2]; /* 64 bit placement info */ - UWORD32 ui_priority; /* the importance for placement */ - UWORD32 ui_placed[2]; /* the o_red location for placement */ -}ia_mem_info_struct; +typedef struct { + UWORD32 ui_size; /* size of the memory in bytes */ + UWORD32 ui_alignment; /* alignment in bytes */ + UWORD32 ui_type; /* type of memory */ + UWORD32 ui_placement[2]; /* 64 bit placement info */ + UWORD32 ui_priority; /* the importance for placement */ + UWORD32 ui_placed[2]; /* the o_red location for placement */ +} ia_mem_info_struct; /*****************************************************************************/ /* Constant hash defines */ /*****************************************************************************/ /* when you don't need alignment, pass this to memory library */ -#define IA_MEM_NO_ALIGN 0x01 +#define IA_MEM_NO_ALIGN 0x01 /* ittiam standard memory types */ /* to be used inter frames */ -#define IA_MEMTYPE_PERSIST 0x00 +#define IA_MEMTYPE_PERSIST 0x00 /* read write, to be used intra frames */ -#define IA_MEMTYPE_SCRATCH 0x01 +#define IA_MEMTYPE_SCRATCH 0x01 /* read only memory, intra frame */ -#define IA_MEMTYPE_INPUT 0x02 +#define IA_MEMTYPE_INPUT 0x02 /* read-write memory, for usable output, intra frame */ -#define IA_MEMTYPE_OUTPUT 0x03 +#define IA_MEMTYPE_OUTPUT 0x03 /* readonly memory, inter frame */ -#define IA_MEMTYPE_TABLE 0x04 +#define IA_MEMTYPE_TABLE 0x04 /* input buffer before mem tabs allocation */ -#define IA_MEMTYPE_PRE_FRAME_INPUT 0x05 +#define IA_MEMTYPE_PRE_FRAME_INPUT 0x05 /* input buffer before mem tabs allocation */ -#define IA_MEMTYPE_PRE_FRAME_SCRATCH 0x06 +#define IA_MEMTYPE_PRE_FRAME_SCRATCH 0x06 /* for local variables */ -#define IA_MEMTYPE_AUTO_VAR 0x80 +#define IA_MEMTYPE_AUTO_VAR 0x80 /* ittiam standard memory priorities */ -#define IA_MEMPRIORITY_ANYWHERE 0x00 -#define IA_MEMPRIORITY_LOWEST 0x01 -#define IA_MEMPRIORITY_LOW 0x02 -#define IA_MEMPRIORITY_NORM 0x03 -#define IA_MEMPRIORITY_ABOVE_NORM 0x04 -#define IA_MEMPRIORITY_HIGH 0x05 -#define IA_MEMPRIORITY_HIGHER 0x06 -#define IA_MEMPRIORITY_CRITICAL 0x07 +#define IA_MEMPRIORITY_ANYWHERE 0x00 +#define IA_MEMPRIORITY_LOWEST 0x01 +#define IA_MEMPRIORITY_LOW 0x02 +#define IA_MEMPRIORITY_NORM 0x03 +#define IA_MEMPRIORITY_ABOVE_NORM 0x04 +#define IA_MEMPRIORITY_HIGH 0x05 +#define IA_MEMPRIORITY_HIGHER 0x06 +#define IA_MEMPRIORITY_CRITICAL 0x07 /* ittiam standard memory placements */ /* placement is defined by 64 bits */ -#define IA_MEMPLACE_FAST_RAM_0 0x000001 -#define IA_MEMPLACE_FAST_RAM_1 0x000002 -#define IA_MEMPLACE_FAST_RAM_2 0x000004 -#define IA_MEMPLACE_FAST_RAM_3 0x000008 -#define IA_MEMPLACE_FAST_RAM_4 0x000010 -#define IA_MEMPLACE_FAST_RAM_5 0x000020 -#define IA_MEMPLACE_FAST_RAM_6 0x000040 -#define IA_MEMPLACE_FAST_RAM_7 0x000080 +#define IA_MEMPLACE_FAST_RAM_0 0x000001 +#define IA_MEMPLACE_FAST_RAM_1 0x000002 +#define IA_MEMPLACE_FAST_RAM_2 0x000004 +#define IA_MEMPLACE_FAST_RAM_3 0x000008 +#define IA_MEMPLACE_FAST_RAM_4 0x000010 +#define IA_MEMPLACE_FAST_RAM_5 0x000020 +#define IA_MEMPLACE_FAST_RAM_6 0x000040 +#define IA_MEMPLACE_FAST_RAM_7 0x000080 -#define IA_MEMPLACE_INT_RAM_0 0x000100 -#define IA_MEMPLACE_INT_RAM_1 0x000200 -#define IA_MEMPLACE_INT_RAM_2 0x000400 -#define IA_MEMPLACE_INT_RAM_3 0x000800 -#define IA_MEMPLACE_INT_RAM_4 0x001000 -#define IA_MEMPLACE_INT_RAM_5 0x002000 -#define IA_MEMPLACE_INT_RAM_6 0x004000 -#define IA_MEMPLACE_INT_RAM_7 0x008000 +#define IA_MEMPLACE_INT_RAM_0 0x000100 +#define IA_MEMPLACE_INT_RAM_1 0x000200 +#define IA_MEMPLACE_INT_RAM_2 0x000400 +#define IA_MEMPLACE_INT_RAM_3 0x000800 +#define IA_MEMPLACE_INT_RAM_4 0x001000 +#define IA_MEMPLACE_INT_RAM_5 0x002000 +#define IA_MEMPLACE_INT_RAM_6 0x004000 +#define IA_MEMPLACE_INT_RAM_7 0x008000 -#define IA_MEMPLACE_EXT_RAM_0 0x010000 -#define IA_MEMPLACE_EXT_RAM_1 0x020000 -#define IA_MEMPLACE_EXT_RAM_2 0x040000 -#define IA_MEMPLACE_EXT_RAM_3 0x080000 -#define IA_MEMPLACE_EXT_RAM_4 0x100000 -#define IA_MEMPLACE_EXT_RAM_5 0x200000 -#define IA_MEMPLACE_EXT_RAM_6 0x400000 -#define IA_MEMPLACE_EXT_RAM_7 0x800000 +#define IA_MEMPLACE_EXT_RAM_0 0x010000 +#define IA_MEMPLACE_EXT_RAM_1 0x020000 +#define IA_MEMPLACE_EXT_RAM_2 0x040000 +#define IA_MEMPLACE_EXT_RAM_3 0x080000 +#define IA_MEMPLACE_EXT_RAM_4 0x100000 +#define IA_MEMPLACE_EXT_RAM_5 0x200000 +#define IA_MEMPLACE_EXT_RAM_6 0x400000 +#define IA_MEMPLACE_EXT_RAM_7 0x800000 -#define IA_MEMPLACE_DONTCARE_H 0xFFFFFFFF -#define IA_MEMPLACE_DONTCARE_L 0xFFFFFFFF +#define IA_MEMPLACE_DONTCARE_H 0xFFFFFFFF +#define IA_MEMPLACE_DONTCARE_L 0xFFFFFFFF /* the simple common PC RAM */ -#define IA_PC_RAM_H 0x00000000 -#define IA_PC_RAM_L IA_MEMPLACE_EXT_RAM_0 +#define IA_PC_RAM_H 0x00000000 +#define IA_PC_RAM_L IA_MEMPLACE_EXT_RAM_0 #endif diff --git a/decoder/drc_src/impd_parametric_drc_dec.h b/decoder/drc_src/impd_parametric_drc_dec.h index d0ab76b..6829246 100644 --- a/decoder/drc_src/impd_parametric_drc_dec.h +++ b/decoder/drc_src/impd_parametric_drc_dec.h @@ -20,179 +20,173 @@ #ifndef IMPD_PARAMETRIC_DRC_DEC_H #define IMPD_PARAMETRIC_DRC_DEC_H - - #ifdef __cplusplus -extern "C" -{ +extern "C" { #endif typedef struct ia_2nd_order_filt_coeff_struct_t { - FLOAT32 b0, b1, b2; - FLOAT32 a1, a2; + FLOAT32 b0, b1, b2; + FLOAT32 a1, a2; } ia_2nd_order_filt_coeff_struct; typedef struct ia_2nd_order_filt_state_struct_t { - FLOAT32 z1, z2; + FLOAT32 z1, z2; } ia_2nd_order_filt_state_struct; typedef struct ia_parametric_drc_type_ff_params_struct_t { - - WORD32 audio_num_chan; - WORD32 frame_size; - WORD32 sub_band_domain_mode; - WORD32 sub_band_count; - WORD32 level_estim_integration_time; - WORD32 level_estim_frame_index; - WORD32 level_estim_frame_count; - FLOAT32 level[PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX]; - WORD32 start_up_phase; - FLOAT32 level_estim_ch_weight[MAX_CHANNEL_COUNT]; - WORD32 level_estim_k_weighting_type; - ia_2nd_order_filt_coeff_struct pre_filt_coeff; - ia_2nd_order_filt_coeff_struct rlb_filt_coeff; - ia_2nd_order_filt_state_struct pre_filt_state[MAX_CHANNEL_COUNT]; - ia_2nd_order_filt_state_struct rlb_filt_state[MAX_CHANNEL_COUNT]; - FLOAT32 weighting_filt[AUDIO_CODEC_SUBBAND_COUNT_MAX]; - WORD32 sub_band_compensation_type; - ia_2nd_order_filt_coeff_struct filt_coeff_subband; - ia_2nd_order_filt_state_struct filt_state_subband_real[MAX_CHANNEL_COUNT]; - ia_2nd_order_filt_state_struct filt_state_subband_imag[MAX_CHANNEL_COUNT]; - FLOAT32 ref_level_parametric_drc; - - WORD32 node_count; - WORD32 node_level[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; - WORD32 node_gain[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; - - FLOAT32 gain_smooth_attack_alpha_slow; - FLOAT32 gain_smooth_rel_alpha_slow; - FLOAT32 gain_smooth_attack_alpha_fast; - FLOAT32 gain_smooth_rel_alpha_fast; - WORD32 gain_smooth_attack_threshold; - WORD32 gain_smooth_rel_threshold; - WORD32 gain_smooth_hold_off_count; - FLOAT32 db_level_smooth; - FLOAT32 db_gain_smooth; - WORD32 hold_counter; + WORD32 audio_num_chan; + WORD32 frame_size; + WORD32 sub_band_domain_mode; + WORD32 sub_band_count; + WORD32 level_estim_integration_time; + WORD32 level_estim_frame_index; + WORD32 level_estim_frame_count; + FLOAT32 level[PARAM_DRC_TYPE_FF_LEVEL_ESTIM_FRAME_COUNT_MAX]; + WORD32 start_up_phase; + FLOAT32 level_estim_ch_weight[MAX_CHANNEL_COUNT]; + WORD32 level_estim_k_weighting_type; + ia_2nd_order_filt_coeff_struct pre_filt_coeff; + ia_2nd_order_filt_coeff_struct rlb_filt_coeff; + ia_2nd_order_filt_state_struct pre_filt_state[MAX_CHANNEL_COUNT]; + ia_2nd_order_filt_state_struct rlb_filt_state[MAX_CHANNEL_COUNT]; + FLOAT32 weighting_filt[AUDIO_CODEC_SUBBAND_COUNT_MAX]; + WORD32 sub_band_compensation_type; + ia_2nd_order_filt_coeff_struct filt_coeff_subband; + ia_2nd_order_filt_state_struct filt_state_subband_real[MAX_CHANNEL_COUNT]; + ia_2nd_order_filt_state_struct filt_state_subband_imag[MAX_CHANNEL_COUNT]; + FLOAT32 ref_level_parametric_drc; + + WORD32 node_count; + WORD32 node_level[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; + WORD32 node_gain[PARAM_DRC_TYPE_FF_NODE_COUNT_MAX]; + + FLOAT32 gain_smooth_attack_alpha_slow; + FLOAT32 gain_smooth_rel_alpha_slow; + FLOAT32 gain_smooth_attack_alpha_fast; + FLOAT32 gain_smooth_rel_alpha_fast; + WORD32 gain_smooth_attack_threshold; + WORD32 gain_smooth_rel_threshold; + WORD32 gain_smooth_hold_off_count; + FLOAT32 db_level_smooth; + FLOAT32 db_gain_smooth; + WORD32 hold_counter; } ia_parametric_drc_type_ff_params_struct; typedef struct ia_parametric_drc_type_lim_params_struct_t { - - WORD32 audio_num_chan; - WORD32 frame_size; - FLOAT32 level_estim_ch_weight[MAX_CHANNEL_COUNT]; - - UWORD32 attack; - FLOAT32 attack_constant; - FLOAT32 release_constant; - FLOAT32 attack_ms; - FLOAT32 release_ms; - FLOAT32 threshold; - UWORD32 channels; - UWORD32 sampling_rate; - FLOAT32 cor; - FLOAT32* max_buf; - FLOAT32* max_buf_slow; - UWORD32 max_buf_idx; - UWORD32 max_buf_slow_idx; - UWORD32 sec_len; - UWORD32 num_max_buf_sec; - UWORD32 max_buf_sec_idx; - UWORD32 max_buf_sec_ctr; - FLOAT64 smooth_state_0; + WORD32 audio_num_chan; + WORD32 frame_size; + FLOAT32 level_estim_ch_weight[MAX_CHANNEL_COUNT]; + + UWORD32 attack; + FLOAT32 attack_constant; + FLOAT32 release_constant; + FLOAT32 attack_ms; + FLOAT32 release_ms; + FLOAT32 threshold; + UWORD32 channels; + UWORD32 sampling_rate; + FLOAT32 cor; + FLOAT32* max_buf; + FLOAT32* max_buf_slow; + UWORD32 max_buf_idx; + UWORD32 max_buf_slow_idx; + UWORD32 sec_len; + UWORD32 num_max_buf_sec; + UWORD32 max_buf_sec_idx; + UWORD32 max_buf_sec_ctr; + FLOAT64 smooth_state_0; } ia_parametric_drc_type_lim_params_struct; typedef struct ia_parametric_drc_instance_params_struct_t { - WORD32 disable_paramteric_drc; - WORD32 parametric_drc_type; - ia_spline_nodes_struct str_spline_nodes; - ia_parametric_drc_type_ff_params_struct str_parametric_drc_type_ff_params; - ia_parametric_drc_type_lim_params_struct str_parametric_drc_type_lim_params; + WORD32 disable_paramteric_drc; + WORD32 parametric_drc_type; + ia_spline_nodes_struct str_spline_nodes; + ia_parametric_drc_type_ff_params_struct str_parametric_drc_type_ff_params; + ia_parametric_drc_type_lim_params_struct str_parametric_drc_type_lim_params; } ia_parametric_drc_instance_params_struct; typedef struct ia_parametric_drc_params_struct_t { - WORD32 sampling_rate; - WORD32 audio_num_chan; - WORD32 sub_band_domain_mode; - WORD32 sub_band_count; - - WORD32 num_nodes; - WORD32 drc_frame_size; - WORD32 parametric_drc_frame_size; - WORD32 parametric_drc_look_ahead_samples_max; - WORD32 reset_parametric_drc; - - WORD32 parametric_drc_instance_count; - WORD32 parametric_drc_idx[PARAM_DRC_INSTANCE_COUNT_MAX]; - WORD32 gain_set_index[PARAM_DRC_INSTANCE_COUNT_MAX]; - WORD32 dwnmix_id_from_drc_instructions[PARAM_DRC_INSTANCE_COUNT_MAX]; - WORD32 channel_map[PARAM_DRC_INSTANCE_COUNT_MAX][MAX_CHANNEL_COUNT]; - - ia_parametric_drc_instance_params_struct str_parametric_drc_instance_params[PARAM_DRC_INSTANCE_COUNT_MAX]; + WORD32 sampling_rate; + WORD32 audio_num_chan; + WORD32 sub_band_domain_mode; + WORD32 sub_band_count; + + WORD32 num_nodes; + WORD32 drc_frame_size; + WORD32 parametric_drc_frame_size; + WORD32 parametric_drc_look_ahead_samples_max; + WORD32 reset_parametric_drc; + + WORD32 parametric_drc_instance_count; + WORD32 parametric_drc_idx[PARAM_DRC_INSTANCE_COUNT_MAX]; + WORD32 gain_set_index[PARAM_DRC_INSTANCE_COUNT_MAX]; + WORD32 dwnmix_id_from_drc_instructions[PARAM_DRC_INSTANCE_COUNT_MAX]; + WORD32 channel_map[PARAM_DRC_INSTANCE_COUNT_MAX][MAX_CHANNEL_COUNT]; + + ia_parametric_drc_instance_params_struct + str_parametric_drc_instance_params[PARAM_DRC_INSTANCE_COUNT_MAX]; } ia_parametric_drc_params_struct; -WORD32 impd_init_parametric_drc( WORD32 drc_frame_size, - WORD32 sampling_rate, - WORD32 sub_band_domain_mode, - ia_parametric_drc_params_struct* pstr_parametric_drc_params); - -WORD32 impd_init_parametric_drc_after_config(ia_drc_config* pstr_drc_config, - ia_drc_loudness_info_set_struct* pstr_loudness_info, - ia_parametric_drc_params_struct *pstr_parametric_drc_params, - pVOID *mem_ptr); +WORD32 impd_init_parametric_drc( + WORD32 drc_frame_size, WORD32 sampling_rate, WORD32 sub_band_domain_mode, + ia_parametric_drc_params_struct* pstr_parametric_drc_params); +WORD32 impd_init_parametric_drc_after_config( + ia_drc_config* pstr_drc_config, + ia_drc_loudness_info_set_struct* pstr_loudness_info, + ia_parametric_drc_params_struct* pstr_parametric_drc_params, + pVOID* mem_ptr); WORD32 -impd_init_lvl_est_filt_time( WORD32 level_estim_k_weighting_type, - WORD32 sampling_rate, - ia_2nd_order_filt_coeff_struct* pre_filt_coeff, - ia_2nd_order_filt_coeff_struct* rlb_filt_coeff); +impd_init_lvl_est_filt_time(WORD32 level_estim_k_weighting_type, + WORD32 sampling_rate, + ia_2nd_order_filt_coeff_struct* pre_filt_coeff, + ia_2nd_order_filt_coeff_struct* rlb_filt_coeff); WORD32 -impd_init_lvl_est_filt_subband( WORD32 level_estim_k_weighting_type, - WORD32 sampling_rate, - WORD32 sub_band_domain_mode, - WORD32 sub_band_count, - WORD32 sub_band_compensation_type, - FLOAT32 *weighting_filt, - ia_2nd_order_filt_coeff_struct* filt_coeff_subband); - +impd_init_lvl_est_filt_subband( + WORD32 level_estim_k_weighting_type, WORD32 sampling_rate, + WORD32 sub_band_domain_mode, WORD32 sub_band_count, + WORD32 sub_band_compensation_type, FLOAT32* weighting_filt, + ia_2nd_order_filt_coeff_struct* filt_coeff_subband); WORD32 -impd_parametric_ffwd_type_drc_reset(ia_parametric_drc_type_ff_params_struct* pstr_parametric_ffwd_type_drc_params); +impd_parametric_ffwd_type_drc_reset(ia_parametric_drc_type_ff_params_struct* + pstr_parametric_ffwd_type_drc_params); WORD32 -impd_parametric_lim_type_drc_reset( WORD32 instance_idx, - ia_parametric_drc_type_lim_params_struct* pstr_parametric_lim_type_drc_params); +impd_parametric_lim_type_drc_reset(WORD32 instance_idx, + ia_parametric_drc_type_lim_params_struct* + pstr_parametric_lim_type_drc_params); WORD32 -impd_parametric_drc_instance_process (FLOAT32* audio_in_out_buf[], - FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - ia_parametric_drc_params_struct* pstr_parametric_drc_params, - ia_parametric_drc_instance_params_struct* pstr_parametric_drc_instance_params); - +impd_parametric_drc_instance_process( + FLOAT32* audio_in_out_buf[], FLOAT32* audio_real_buff[], + FLOAT32* audio_imag_buff[], + ia_parametric_drc_params_struct* pstr_parametric_drc_params, + ia_parametric_drc_instance_params_struct* + pstr_parametric_drc_instance_params); WORD32 -impd_parametric_ffwd_type_drc_process(FLOAT32* audio_in_out_buf[], - FLOAT32* audio_real_buff[], - FLOAT32* audio_imag_buff[], - WORD32 nodeIdx, - ia_parametric_drc_type_ff_params_struct* pstr_parametric_ffwd_type_drc_params, - ia_spline_nodes_struct* str_spline_nodes); +impd_parametric_ffwd_type_drc_process(FLOAT32* audio_in_out_buf[], + FLOAT32* audio_real_buff[], + FLOAT32* audio_imag_buff[], + WORD32 nodeIdx, + ia_parametric_drc_type_ff_params_struct* + 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); - +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 } #endif #endif - diff --git a/decoder/drc_src/impd_type_def.h b/decoder/drc_src/impd_type_def.h index f77a1cb..6ac933b 100644 --- a/decoder/drc_src/impd_type_def.h +++ b/decoder/drc_src/impd_type_def.h @@ -24,91 +24,89 @@ /****************************************************************************/ /* types type define prefix examples bytes */ /************************ *********** ****** **************** ***** */ -typedef char CHAR8 ;/* c CHAR8 c_name 1 */ -typedef char * pCHAR8 ;/* pc pCHAR8 pc_nmae 1 */ +typedef char CHAR8; /* c CHAR8 c_name 1 */ +typedef char* pCHAR8; /* pc pCHAR8 pc_nmae 1 */ -typedef signed char WORD8 ;/* b WORD8 b_name 1 */ -typedef signed char * pWORD8 ;/* pb pWORD8 pb_nmae 1 */ +typedef signed char WORD8; /* b WORD8 b_name 1 */ +typedef signed char* pWORD8; /* pb pWORD8 pb_nmae 1 */ -typedef unsigned char UWORD8 ;/* ub UWORD8 ub_count 1 */ -typedef unsigned char * pUWORD8 ;/* pub pUWORD8 pub_count 1 */ +typedef unsigned char UWORD8; /* ub UWORD8 ub_count 1 */ +typedef unsigned char* pUWORD8; /* pub pUWORD8 pub_count 1 */ -typedef signed short WORD16 ;/* s WORD16 s_count 2 */ -typedef signed short * pWORD16 ;/* ps pWORD16 ps_count 2 */ -typedef unsigned short UWORD16 ;/* us UWORD16 us_count 2 */ -typedef unsigned short * pUWORD16;/* pus pUWORD16 pus_count 2 */ +typedef signed short WORD16; /* s WORD16 s_count 2 */ +typedef signed short* pWORD16; /* ps pWORD16 ps_count 2 */ +typedef unsigned short UWORD16; /* us UWORD16 us_count 2 */ +typedef unsigned short* pUWORD16; /* pus pUWORD16 pus_count 2 */ -typedef signed int WORD24 ;/* k WORD24 k_count 3 */ -typedef signed int * pWORD24 ;/* pk pWORD24 pk_count 3 */ -typedef unsigned int UWORD24 ;/* uk UWORD24 uk_count 3 */ -typedef unsigned int * pUWORD24;/* puk pUWORD24 puk_count 3 */ +typedef signed int WORD24; /* k WORD24 k_count 3 */ +typedef signed int* pWORD24; /* pk pWORD24 pk_count 3 */ +typedef unsigned int UWORD24; /* uk UWORD24 uk_count 3 */ +typedef unsigned int* pUWORD24; /* puk pUWORD24 puk_count 3 */ -typedef signed int WORD32 ;/* i WORD32 i_count 4 */ -typedef signed int * pWORD32 ;/* pi pWORD32 pi_count 4 */ -typedef unsigned int UWORD32 ;/* ui UWORD32 ui_count 4 */ -typedef unsigned int * pUWORD32;/* pui pUWORD32 pui_count 4 */ +typedef signed int WORD32; /* i WORD32 i_count 4 */ +typedef signed int* pWORD32; /* pi pWORD32 pi_count 4 */ +typedef unsigned int UWORD32; /* ui UWORD32 ui_count 4 */ +typedef unsigned int* pUWORD32; /* pui pUWORD32 pui_count 4 */ #ifdef WIN32 #ifndef ECLIPSE -typedef signed __int64 WORD40 ;/* m WORD40 m_count 5 */ -typedef signed __int64 * pWORD40 ;/* pm pWORD40 pm_count 5 */ -typedef unsigned __int64 UWORD40 ;/* um UWORD40 um_count 5 */ -typedef unsigned __int64 * pUWORD40;/* pum pUWORD40 pum_count 5 */ - -typedef signed __int64 WORD64 ;/* h WORD64 h_count 8 */ -typedef signed __int64 * pWORD64 ;/* ph pWORD64 ph_count 8 */ -typedef unsigned __int64 UWORD64 ;/* uh UWORD64 uh_count 8 */ -typedef unsigned __int64 * pUWORD64;/* puh pUWORD64 puh_count 8 */ +typedef signed __int64 WORD40; /* m WORD40 m_count 5 */ +typedef signed __int64* pWORD40; /* pm pWORD40 pm_count 5 */ +typedef unsigned __int64 UWORD40; /* um UWORD40 um_count 5 */ +typedef unsigned __int64* pUWORD40; /* pum pUWORD40 pum_count 5 */ + +typedef signed __int64 WORD64; /* h WORD64 h_count 8 */ +typedef signed __int64* pWORD64; /* ph pWORD64 ph_count 8 */ +typedef unsigned __int64 UWORD64; /* uh UWORD64 uh_count 8 */ +typedef unsigned __int64* pUWORD64; /* puh pUWORD64 puh_count 8 */ #else -typedef signed long long WORD40 ;/* m WORD40 m_count 5 */ -typedef signed long long * pWORD40 ;/* pm pWORD40 pm_count 5 */ -typedef unsigned long long UWORD40 ;/* um UWORD40 um_count 5 */ -typedef unsigned long long * pUWORD40;/* pum pUWORD40 pum_count 5 */ - -typedef signed long long WORD64 ;/* h WORD64 h_count 8 */ -typedef signed long long * pWORD64 ;/* ph pWORD64 ph_count 8 */ -typedef unsigned long long UWORD64 ;/* uh UWORD64 uh_count 8 */ -typedef unsigned long long * pUWORD64;/* puh pUWORD64 puh_count 8 */ +typedef signed long long WORD40; /* m WORD40 m_count 5 */ +typedef signed long long* pWORD40; /* pm pWORD40 pm_count 5 */ +typedef unsigned long long UWORD40; /* um UWORD40 um_count 5 */ +typedef unsigned long long* pUWORD40; /* pum pUWORD40 pum_count 5 */ + +typedef signed long long WORD64; /* h WORD64 h_count 8 */ +typedef signed long long* pWORD64; /* ph pWORD64 ph_count 8 */ +typedef unsigned long long UWORD64; /* uh UWORD64 uh_count 8 */ +typedef unsigned long long* pUWORD64; /* puh pUWORD64 puh_count 8 */ #endif #else -typedef signed long long WORD40 ;/* m WORD40 m_count 5 */ -typedef signed long long * pWORD40 ;/* pm pWORD40 pm_count 5 */ -typedef unsigned long long UWORD40 ;/* um UWORD40 um_count 5 */ -typedef unsigned long long * pUWORD40;/* pum pUWORD40 pum_count 5 */ +typedef signed long long WORD40; /* m WORD40 m_count 5 */ +typedef signed long long* pWORD40; /* pm pWORD40 pm_count 5 */ +typedef unsigned long long UWORD40; /* um UWORD40 um_count 5 */ +typedef unsigned long long* pUWORD40; /* pum pUWORD40 pum_count 5 */ -typedef signed long long WORD64 ;/* h WORD64 h_count 8 */ -typedef signed long long * pWORD64 ;/* ph pWORD64 ph_count 8 */ -typedef unsigned long long UWORD64 ;/* uh UWORD64 uh_count 8 */ -typedef unsigned long long * pUWORD64;/* puh pUWORD64 puh_count 8 */ +typedef signed long long WORD64; /* h WORD64 h_count 8 */ +typedef signed long long* pWORD64; /* ph pWORD64 ph_count 8 */ +typedef unsigned long long UWORD64; /* uh UWORD64 uh_count 8 */ +typedef unsigned long long* pUWORD64; /* puh pUWORD64 puh_count 8 */ #endif +typedef float FLOAT32; /* f FLOAT32 f_count 4 */ +typedef float* pFLOAT32; /* pf pFLOAT32 pf_count 4 */ +typedef double FLOAT64; /* d UFLOAT64 d_count 8 */ +typedef double* pFlOAT64; /* pd pFLOAT64 pd_count 8 */ -typedef float FLOAT32 ;/* f FLOAT32 f_count 4 */ -typedef float * pFLOAT32;/* pf pFLOAT32 pf_count 4 */ -typedef double FLOAT64 ;/* d UFLOAT64 d_count 8 */ -typedef double * pFlOAT64;/* pd pFLOAT64 pd_count 8 */ - -typedef void VOID ;/* v VOID v_flag 4 */ -typedef void * pVOID ;/* pv pVOID pv_flag 4 */ +typedef void VOID; /* v VOID v_flag 4 */ +typedef void* pVOID; /* pv pVOID pv_flag 4 */ /* variable size types: platform optimized implementation */ -typedef signed int BOOL ;/* bool BOOL bool_true */ -typedef unsigned int UBOOL ;/* ubool BOOL ubool_true */ -typedef signed int FLAG ;/* flag FLAG flag_false */ -typedef unsigned int UFLAG ;/* uflag FLAG uflag_false */ -typedef signed int LOOPIDX ;/* lp LOOPIDX lp_index */ -typedef unsigned int ULOOPIDX;/* ulp SLOOPIDX ulp_index */ -typedef signed int WORD ;/* lp LOOPIDX lp_index */ -typedef unsigned int UWORD ;/* ulp SLOOPIDX ulp_index */ - -typedef LOOPIDX LOOPINDEX; /* lp LOOPIDX lp_index */ -typedef ULOOPIDX ULOOPINDEX;/* ulp SLOOPIDX ulp_index */ +typedef signed int BOOL; /* bool BOOL bool_true */ +typedef unsigned int UBOOL; /* ubool BOOL ubool_true */ +typedef signed int FLAG; /* flag FLAG flag_false */ +typedef unsigned int UFLAG; /* uflag FLAG uflag_false */ +typedef signed int LOOPIDX; /* lp LOOPIDX lp_index */ +typedef unsigned int ULOOPIDX; /* ulp SLOOPIDX ulp_index */ +typedef signed int WORD; /* lp LOOPIDX lp_index */ +typedef unsigned int UWORD; /* ulp SLOOPIDX ulp_index */ + +typedef LOOPIDX LOOPINDEX; /* lp LOOPIDX lp_index */ +typedef ULOOPIDX ULOOPINDEX; /* ulp SLOOPIDX ulp_index */ #define SIZE_T size_t #define PLATFORM_INLINE __inline #endif - diff --git a/decoder/generic/ixheaacd_function_selector_generic.c b/decoder/generic/ixheaacd_function_selector_generic.c index 8fdb4b9..08aac1b 100644 --- a/decoder/generic/ixheaacd_function_selector_generic.c +++ b/decoder/generic/ixheaacd_function_selector_generic.c @@ -230,20 +230,20 @@ VOID(*ixheaacd_aac_ld_dec_rearrange) (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, UWORD8 *re_arr_tab) = &ixheaacd_rearrange_dec; -VOID (*ixheaacd_fft32x32_ld) +VOID(*ixheaacd_fft32x32_ld) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = ixheaacd_fft32x32_ld_dec; -VOID (*ixheaacd_fft32x32_ld2) +VOID(*ixheaacd_fft32x32_ld2) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_fft32x32_ld_dec; WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo) = &ixheaacd_neg_expo_inc_dec; -VOID (*ixheaacd_inv_dit_fft_8pt) +VOID(*ixheaacd_inv_dit_fft_8pt) (WORD32 *x, WORD32 *real, WORD32 *imag) = &ixheaacd_inv_dit_fft_8pt_dec; -VOID (*ixheaacd_scale_factor_process) +VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec; diff --git a/decoder/generic/ixheaacd_qmf_dec_generic.c b/decoder/generic/ixheaacd_qmf_dec_generic.c index a813a3c..20e19a8 100644 --- a/decoder/generic/ixheaacd_qmf_dec_generic.c +++ b/decoder/generic/ixheaacd_qmf_dec_generic.c @@ -706,8 +706,8 @@ VOID ixheaacd_cplx_anal_qmffilt(const WORD16 *time_sample_buf, } VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, - ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { WORD32 L = syn_qmf->no_channels; const WORD32 M = (L >> 1); WORD32 *dct_in = qmf_real; @@ -723,9 +723,9 @@ VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, filter_states[3 * M] = 0; } -VOID ixheaacd_inv_emodulation( - WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { +VOID ixheaacd_inv_emodulation(WORD32 *qmf_real, + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr) { if (syn_qmf->no_channels == 64) ixheaacd_cos_sin_mod(qmf_real, syn_qmf, qmf_dec_tables_ptr->w_32, qmf_dec_tables_ptr->dig_rev_table2_32); @@ -1675,7 +1675,7 @@ VOID ixheaacd_radix4bfly(const WORD16 *w, WORD32 *x, WORD32 index1, VOID ixheaacd_postradixcompute4(WORD32 *ptr_y, WORD32 *ptr_x, const WORD32 *p_dig_rev_tbl, WORD32 npoints) { - WORD32 i, k; + WORD32 i, k; WORD32 h2; WORD32 xh0_0, xh1_0, xl0_0, xl1_0; WORD32 xh0_1, xh1_1, xl0_1, xl1_1; @@ -1782,7 +1782,7 @@ VOID ixheaacd_postradixcompute4(WORD32 *ptr_y, WORD32 *ptr_x, VOID ixheaacd_postradixcompute2(WORD32 *ptr_y, WORD32 *ptr_x, const WORD32 *pdig_rev_tbl, WORD32 npoints) { - WORD32 i, k; + WORD32 i, k; WORD32 h2; WORD32 x_0, x_1, x_2, x_3; WORD32 x_4, x_5, x_6, x_7; diff --git a/decoder/ixheaacd_aac_config.h b/decoder/ixheaacd_aac_config.h index c55bb6b..bfe7a39 100644 --- a/decoder/ixheaacd_aac_config.h +++ b/decoder/ixheaacd_aac_config.h @@ -28,7 +28,7 @@ #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_SBR_MODE 0x0005 #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_EFFECT_TYPE 0x0006 #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_TARGET_LOUDNESS 0x0007 -#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM 0x0008 +#define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DRC_LOUD_NORM 0x0008 #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_DOWNMIX 0x0009 #define IA_ENHAACPLUS_DEC_CONFIG_PARAM_OUT08KHZ 0x000A diff --git a/decoder/ixheaacd_aac_imdct.c b/decoder/ixheaacd_aac_imdct.c index ab8d0dd..68d5bf3 100644 --- a/decoder/ixheaacd_aac_imdct.c +++ b/decoder/ixheaacd_aac_imdct.c @@ -49,11 +49,11 @@ (j) = _ >> (m); \ } while (0) -#define MPYHIRC(x, y) \ - \ -(((WORD32)((short)(x >> 16) * (unsigned short)(y & 0x0000FFFF) + 0x4000) >> \ - 15) + \ - ((WORD32)((short)(x >> 16) * (short)((y) >> 16)) << 1)) +#define MPYHIRC(x, y) \ + \ + (((WORD32)((short)(x >> 16) * (unsigned short)(y & 0x0000FFFF) + 0x4000) >> \ + 15) + \ + ((WORD32)((short)(x >> 16) * (short)((y) >> 16)) << 1)) #define MPYLUHS(x, y) \ ((WORD32)((unsigned short)(x & 0x0000FFFF) * (short)(y >> 16))) @@ -78,7 +78,7 @@ static PLATFORM_INLINE WORD32 ixheaacd_shr32_drc(WORD32 a, WORD32 b) { else out_val = 0; } else { - a = ixheaacd_add32_sat(a,(1 << (b - 1))); + a = ixheaacd_add32_sat(a, (1 << (b - 1))); out_val = (WORD32)a >> b; } diff --git a/decoder/ixheaacd_aac_tns.c b/decoder/ixheaacd_aac_tns.c index c00a523..99f8c05 100644 --- a/decoder/ixheaacd_aac_tns.c +++ b/decoder/ixheaacd_aac_tns.c @@ -256,8 +256,10 @@ VOID ixheaacd_tns_ar_filter_fixed_dec(WORD32 *spectrum, WORD32 size, WORD32 inc, } VOID ixheaacd_tns_ar_filter_fixed_non_neon_armv7(WORD32 *spectrum, WORD32 size, - WORD32 inc, WORD32 *lpc, WORD32 order, - WORD32 shift_value, WORD scale_spec) { + WORD32 inc, WORD32 *lpc, + WORD32 order, + WORD32 shift_value, + WORD scale_spec) { WORD32 i, j; WORD32 y, state[MAX_ORDER + 1]; WORD32 acc; diff --git a/decoder/ixheaacd_aacdecoder.c b/decoder/ixheaacd_aacdecoder.c index 69d060c..8af03ee 100644 --- a/decoder/ixheaacd_aacdecoder.c +++ b/decoder/ixheaacd_aacdecoder.c @@ -647,9 +647,8 @@ WORD32 ixheaacd_aacdec_decodeframe( it_bit_buff, ptr_ics_info, object_type, aac_dec_handle->samples_per_frame, LEFT); - if(temp!=0) - { - return temp; + if (temp != 0) { + return temp; } } } @@ -706,8 +705,9 @@ WORD32 ixheaacd_aacdec_decodeframe( ixheaacd_extension_payload(it_bit_buff, cnt_bits); } - if (((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD)) - && (p_obj_exhaacplus_dec->aac_config.ld_decoder != 1)) { + if (((object_type == AOT_ER_AAC_ELD) || + (object_type == AOT_ER_AAC_LD)) && + (p_obj_exhaacplus_dec->aac_config.ld_decoder != 1)) { if (it_bit_buff->cnt_bits) { WORD32 alignment = it_bit_buff->bit_pos & 0x07; it_bit_buff->cnt_bits = (it_bit_buff->cnt_bits + alignment) & 7; diff --git a/decoder/ixheaacd_acelp_decode.c b/decoder/ixheaacd_acelp_decode.c index aaa168c..73a7c9f 100644 --- a/decoder/ixheaacd_acelp_decode.c +++ b/decoder/ixheaacd_acelp_decode.c @@ -506,8 +506,7 @@ WORD32 ixheaacd_acelp_alias_cnx(ia_usac_data_struct *usac_data, ixheaacd_preemphsis_tool_float(code, TILT_CODE, LEN_SUBFR, tmp); i = pitch_lag; if (pitch_lag_frac > 2) i++; - if(i >= 0) - ixheaacd_acelp_pitch_sharpening(code, i); + if (i >= 0) ixheaacd_acelp_pitch_sharpening(code, i); index = pstr_td_frame_data->gains[k * 4 + subfr_nb]; diff --git a/decoder/ixheaacd_api.c b/decoder/ixheaacd_api.c index 88eaaac..afc4510 100644 --- a/decoder/ixheaacd_api.c +++ b/decoder/ixheaacd_api.c @@ -143,8 +143,9 @@ IA_ERRORCODE ixheaacd_dec_mem_api( UWORD32 *meminfo = (UWORD32 *)p_obj_exhaacplus_dec->p_mem_info_aac + i_idx; UWORD32 pers_size = meminfo[0]; - p_temp = p_temp + pers_size - (sizeof(ia_dec_data_struct) + - sizeof(ia_audio_specific_config_struct) + (8300)); + p_temp = p_temp + pers_size - + (sizeof(ia_dec_data_struct) + + sizeof(ia_audio_specific_config_struct) + (8300)); p_obj_exhaacplus_dec->p_state_aac = pv_value; memset(p_obj_exhaacplus_dec->p_state_aac, 0, @@ -153,8 +154,9 @@ IA_ERRORCODE ixheaacd_dec_mem_api( p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data = p_temp; p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config = p_temp + sizeof(ia_dec_data_struct); -p_obj_exhaacplus_dec->p_state_aac->header_ptr = p_temp + sizeof(ia_dec_data_struct) - + sizeof(ia_audio_specific_config_struct); + p_obj_exhaacplus_dec->p_state_aac->header_ptr = + p_temp + sizeof(ia_dec_data_struct) + + sizeof(ia_audio_specific_config_struct); } } else { @@ -665,25 +667,25 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, } case IA_ENHAACPLUS_DEC_DRC_EFFECT_TYPE: { - if (((*pui_value_signed) > 8) || ((*pui_value_signed) < -1) ) { - p_obj_exhaacplus_dec->aac_config.ui_effect_type = -1; - return (IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_EFFECT_TYPE); - } - p_obj_exhaacplus_dec->aac_config.ui_effect_type = *pui_value_signed; - break; + if (((*pui_value_signed) > 8) || ((*pui_value_signed) < -1)) { + p_obj_exhaacplus_dec->aac_config.ui_effect_type = -1; + return (IA_ENHAACPLUS_DEC_CONFIG_NON_FATAL_INVALID_EFFECT_TYPE); + } + p_obj_exhaacplus_dec->aac_config.ui_effect_type = *pui_value_signed; + break; } case IA_ENHAACPLUS_DEC_DRC_TARGET_LOUDNESS: { - if(*pui_value_signed>=0) - { - p_obj_exhaacplus_dec->aac_config.ui_loud_norm_flag=1; - } - *pui_value_signed = -(*pui_value_signed >> 2); - if (((*pui_value_signed) > 0) ||((*pui_value_signed) < -63)) { - p_obj_exhaacplus_dec->aac_config.ui_target_loudness = 0; - return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS); - } - p_obj_exhaacplus_dec->aac_config.ui_target_loudness = *pui_value_signed; - break; + if (*pui_value_signed >= 0) { + p_obj_exhaacplus_dec->aac_config.ui_loud_norm_flag = 1; + } + *pui_value_signed = -(*pui_value_signed >> 2); + if (((*pui_value_signed) > 0) || ((*pui_value_signed) < -63)) { + p_obj_exhaacplus_dec->aac_config.ui_target_loudness = 0; + return (IA_ENHAACPLUS_DEC_CONFIG_NONFATAL_INVALID_TARGET_LOUDNESS); + } + p_obj_exhaacplus_dec->aac_config.ui_target_loudness = + *pui_value_signed; + break; } default: { return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CONFIG_PARAM; } } @@ -697,8 +699,7 @@ 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_EXT_ELE_PTR == i_idx) { + } 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 *) p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); @@ -767,8 +768,7 @@ IA_ERRORCODE ixheaacd_dec_api(pVOID p_ia_enhaacplus_dec_obj, WORD32 i_cmd, p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config); *pp_value = ptr_audio_specific_config->str_usac_config .str_usac_dec_config.usac_ext_gain_payload_buf; - } - else { + } else { return IA_ENHAACPLUS_DEC_API_FATAL_INVALID_CONFIG_PARAM; } break; @@ -910,18 +910,19 @@ IA_ERRORCODE ixheaacd_decoder_flush_api( sizeof(ia_aac_dec_state_struct)); { pUWORD8 p_temp = (pUWORD8)p_obj_exhaacplus_dec->p_state_aac; - UWORD32 *meminfo = - (UWORD32 *)p_obj_exhaacplus_dec->p_mem_info_aac; + UWORD32 *meminfo = (UWORD32 *)p_obj_exhaacplus_dec->p_mem_info_aac; UWORD32 pers_size = meminfo[0]; - p_temp = p_temp + pers_size - (sizeof(ia_dec_data_struct) + - sizeof(ia_audio_specific_config_struct) + (8300)); + p_temp = p_temp + pers_size - + (sizeof(ia_dec_data_struct) + + sizeof(ia_audio_specific_config_struct) + (8300)); p_obj_exhaacplus_dec->p_state_aac->pstr_dec_data = p_temp; p_obj_exhaacplus_dec->p_state_aac->ia_audio_specific_config = p_temp + sizeof(ia_dec_data_struct); -p_obj_exhaacplus_dec->p_state_aac->header_ptr = p_temp + sizeof(ia_dec_data_struct) - + sizeof(ia_audio_specific_config_struct); -} + p_obj_exhaacplus_dec->p_state_aac->header_ptr = + p_temp + sizeof(ia_dec_data_struct) + + sizeof(ia_audio_specific_config_struct); + } memset(&(p_obj_exhaacplus_dec->aac_config), 0, sizeof(ia_aac_dec_config_struct)); @@ -1496,9 +1497,9 @@ IA_ERRORCODE ixheaacd_dec_init( p_state_enhaacplus_dec->ptr_bit_stream = p_state_enhaacplus_dec->pstr_bit_buf; - if (p_state_enhaacplus_dec->s_adts_hdr_present) { //rajat - if (p_obj_exhaacplus_dec->aac_config.ld_decoder == 1) - p_state_enhaacplus_dec->audio_object_type = 23; + if (p_state_enhaacplus_dec->s_adts_hdr_present) { // rajat + if (p_obj_exhaacplus_dec->aac_config.ld_decoder == 1) + p_state_enhaacplus_dec->audio_object_type = 23; } if ((p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_ELD) || @@ -2340,7 +2341,7 @@ IA_ERRORCODE ixheaacd_dec_execute( { it_bit_buff->initial_cnt_bits = it_bit_buff->cnt_bits; } if (p_state_enhaacplus_dec->audio_object_type == AOT_ER_AAC_LD) { - if(p_state_enhaacplus_dec->s_adts_hdr_present) + if (p_state_enhaacplus_dec->s_adts_hdr_present) p_state_enhaacplus_dec->frame_size = adts.aac_frame_length; } diff --git a/decoder/ixheaacd_arith_dec.c b/decoder/ixheaacd_arith_dec.c index c732f3d..af9f4c0 100644 --- a/decoder/ixheaacd_arith_dec.c +++ b/decoder/ixheaacd_arith_dec.c @@ -47,7 +47,6 @@ #include "ixheaacd_error_codes.h" - #define ARITH_ESCAPE 16 UWORD16 ixheaacd_ari_cf_r[3][4] = { @@ -1673,8 +1672,6 @@ VOID ixheaacd_copy_to_bitbuff(ia_bit_buf_struct *it_bit_buff_src, it_bit_buff_dst->size = it_bit_buff_src->size; it_bit_buff_dst->max_size = it_bit_buff_src->max_size; - - } static WORD32 ixheaacd_arith_get_context(WORD8 *c_prev, WORD8 *c_pres, @@ -1826,8 +1823,7 @@ WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, pki = ixheaacd_arith_get_pk(s1 + ixheaacd_esc_nb_offset[esc_nb]); bit_count = ixheaacd_arith_decode(&it_bit_buff_temp, bit_count, &m, &as, ixheaacd_ari_cf_m[pki], 17); - if(bit_count == -1) - { + if (bit_count == -1) { return -1; } @@ -1861,17 +1857,14 @@ WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, WORD32 lsbidx = (a == 0) ? 1 : ((b == 0) ? 0 : 2); bit_count = ixheaacd_arith_decode(&it_bit_buff_temp, bit_count, &m, &as, ixheaacd_ari_cf_r[lsbidx], 4); - if(bit_count == -1) - { + if (bit_count == -1) { return -1; } a = (a << 1) | (m & 1); b = (b << 1) | ((m >> 1) & 1); } - if((a > (8183)) || (b > (8183))) - return -1; - if((a < (-8183)) || (b < (-8183))) - return -1; + if ((a > (8183)) || (b > (8183))) return -1; + if ((a < (-8183)) || (b < (-8183))) return -1; quant[2 * i + 0] = a; quant[2 * i + 1] = b; temp = a + b + 1; @@ -1883,8 +1876,8 @@ WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, } bit_count -= 16 - 2; - if(bit_count > it_bit_buff->cnt_bits) - return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; + if (bit_count > it_bit_buff->cnt_bits) + return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; if (bit_count > 0) { bit_count_5 = bit_count >> 5; @@ -1910,10 +1903,8 @@ WORD32 ixheaacd_arth_decoding_level2(ia_bit_buf_struct *it_bit_buff, m = (m << 1) * temp1; temp1 = m - (temp1); } - if((temp0 > (8183)) || (temp1 > (8183))) - return -1; - if((temp0 < (-8183)) || (temp1 < (-8183))) - return -1; + if ((temp0 > (8183)) || (temp1 > (8183))) return -1; + if ((temp0 < (-8183)) || (temp1 < (-8183))) return -1; *quant++ = temp0; *quant++ = temp1; } @@ -1976,7 +1967,7 @@ static VOID ixheaacd_esc_iquant(WORD32 *q, WORD32 *coef, WORD32 noise_level, coef[i] = flag * (coef[i] << 1); } - temp = ixheaacd_mult64_sat(fac_fix , (WORD64)coef[i]); + temp = ixheaacd_mult64_sat(fac_fix, (WORD64)coef[i]); coef[i] = (WORD32)(temp >> 22); } diff --git a/decoder/ixheaacd_avq_dec.c b/decoder/ixheaacd_avq_dec.c index edd6a96..fae899d 100644 --- a/decoder/ixheaacd_avq_dec.c +++ b/decoder/ixheaacd_avq_dec.c @@ -158,10 +158,10 @@ VOID ixheaacd_voronoi_idx_dec(WORD32 *kv, WORD32 m, WORD32 *y, WORD32 count) { } y[0] += (4 * kv[0] + sum); z[0] = (y[0] - 2) >> count; - if(m != 0) - rem1[0] = (y[0] - 2) % m; + if (m != 0) + rem1[0] = (y[0] - 2) % m; else - rem1[0] = (y[0] - 2); + rem1[0] = (y[0] - 2); memcpy(rem2, rem1, 8 * sizeof(WORD32)); diff --git a/decoder/ixheaacd_basic_ops32.h b/decoder/ixheaacd_basic_ops32.h index d49112e..b25972f 100644 --- a/decoder/ixheaacd_basic_ops32.h +++ b/decoder/ixheaacd_basic_ops32.h @@ -319,13 +319,9 @@ static PLATFORM_INLINE WORD32 ixheaacd_negate32(WORD32 a) { static PLATFORM_INLINE WORD32 ixheaacd_negate32_sat(WORD32 a) { WORD32 neg_val; - - if (a == MIN_32) - { + if (a == MIN_32) { neg_val = MAX_32; - } - else - { + } else { neg_val = -a; } return neg_val; diff --git a/decoder/ixheaacd_basic_ops40.h b/decoder/ixheaacd_basic_ops40.h index d5d5ee8..f653505 100644 --- a/decoder/ixheaacd_basic_ops40.h +++ b/decoder/ixheaacd_basic_ops40.h @@ -327,21 +327,20 @@ static PLATFORM_INLINE WORD64 ixheaacd_mult64(WORD32 a, WORD32 b) { static PLATFORM_INLINE WORD64 ixheaacd_mult64_sat(WORD64 a, WORD64 b) { WORD64 result; - if (a > 0 && b > 0 && a > MAX_64 / b) return MAX_64; - if (a < 0 && b > 0 && a < MIN_64 / b) return MIN_64; - if (a > 0 && b < 0 && b < MIN_64 / a) return MIN_64; - if (a < 0 && b < 0 && a < MAX_64 / b) return MAX_64; + if (a > 0 && b > 0 && a > MAX_64 / b) return MAX_64; + if (a < 0 && b > 0 && a < MIN_64 / b) return MIN_64; + if (a > 0 && b < 0 && b < MIN_64 / a) return MIN_64; + if (a < 0 && b < 0 && a < MAX_64 / b) return MAX_64; result = a * b; return (result); } static PLATFORM_INLINE WORD64 ixheaacd_add64_sat(WORD64 a, WORD64 b) { - WORD64 result , comp; - result = (a < 0) ? MIN_64 : MAX_64; + WORD64 result, comp; + result = (a < 0) ? MIN_64 : MAX_64; comp = result - a; - if ((a < 0) == (b > comp)) - result = a + b; + if ((a < 0) == (b > comp)) result = a + b; return (result); } diff --git a/decoder/ixheaacd_block.c b/decoder/ixheaacd_block.c index 1385922..aa6f22a 100644 --- a/decoder/ixheaacd_block.c +++ b/decoder/ixheaacd_block.c @@ -1199,7 +1199,6 @@ VOID ixheaacd_process_single_scf(WORD32 scale_factor, WORD32 *x_invquant, object_type = 0; aac_sf_data_resil_flag = 0; - if (scale_factor < 24) { for (j = width; j > 0; j--) { *x_invquant++ = 0; diff --git a/decoder/ixheaacd_channel.c b/decoder/ixheaacd_channel.c index 4ba0836..efe1cf7 100644 --- a/decoder/ixheaacd_channel.c +++ b/decoder/ixheaacd_channel.c @@ -213,8 +213,8 @@ static WORD16 ixheaacd_read_block_data( if (error_code) { return error_code; } - if (aac_sf_data_resil_flag && ((object_type == AOT_ER_AAC_ELD) - || (object_type == AOT_ER_AAC_LD))) + if (aac_sf_data_resil_flag && + ((object_type == AOT_ER_AAC_ELD) || (object_type == AOT_ER_AAC_LD))) ixheaacd_rvlc_read(it_bit_buff, ptr_aac_dec_channel_info); else ixheaacd_read_scale_factor_data(it_bit_buff, ptr_aac_dec_channel_info, @@ -296,8 +296,7 @@ static WORD16 ixheaacd_read_block_data( } WORD16 ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff, - ia_ics_info_struct *ptr_ics_info, - WORD32 object_type, + ia_ics_info_struct *ptr_ics_info, WORD32 object_type, WORD32 frame_size, WORD32 ch) { WORD32 retval = AAC_DEC_OK; @@ -329,8 +328,7 @@ WORD16 ixheaacd_ltp_decode(ia_bit_buf_struct *it_bit_buff, WORD16 ixheaacd_ics_read(ia_bit_buf_struct *it_bit_buff, ia_ics_info_struct *ptr_ics_info, WORD8 num_swb_window[2], WORD32 object_type, - WORD32 common_window, - WORD32 frame_size) { + WORD32 common_window, WORD32 frame_size) { WORD i; WORD mask; WORD value = 0; @@ -510,13 +508,12 @@ 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 = ixheaacd_ltp_decode( - it_bit_buff, ptr_ics_info, object_type, - aac_dec_handle->samples_per_frame, 1); + WORD16 temp = + ixheaacd_ltp_decode(it_bit_buff, ptr_ics_info, object_type, + aac_dec_handle->samples_per_frame, 1); - if(temp!=0) - { - return temp; + if (temp != 0) { + return temp; } aac_dec_handle->pstr_aac_dec_ch_info[ch + 1]->str_ics_info.ltp.lag = ptr_ics_info->ltp2.lag; diff --git a/decoder/ixheaacd_channelinfo.h b/decoder/ixheaacd_channelinfo.h index 199079d..1e451c9 100644 --- a/decoder/ixheaacd_channelinfo.h +++ b/decoder/ixheaacd_channelinfo.h @@ -330,12 +330,10 @@ typedef struct { WORD16 ixheaacd_ics_read(ia_bit_buf_struct *it_bit_buff, ia_ics_info_struct *ptr_ics_info, WORD8 num_swb_window[2], WORD32 object_type, - WORD32 common_window, - WORD32 frame_size); + 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, + 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 45e4194..bc5f5ff 100644 --- a/decoder/ixheaacd_common_initfuncs.c +++ b/decoder/ixheaacd_common_initfuncs.c @@ -142,7 +142,6 @@ ia_bit_buf_struct *ixheaacd_create_bit_buf(ia_bit_buf_struct *it_bit_buff, it_bit_buff->max_size = it_bit_buff->size; - ixheaacd_adts_crc_open(it_bit_buff->pstr_adts_crc_info); return it_bit_buff; diff --git a/decoder/ixheaacd_config.h b/decoder/ixheaacd_config.h index f0c5cd3..7029fd2 100644 --- a/decoder/ixheaacd_config.h +++ b/decoder/ixheaacd_config.h @@ -624,7 +624,8 @@ UWORD32 ixheaacd_sbr_ratio(UWORD32 core_sbr_frame_len_idx); UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_frame_len_idx, WORD32 *output_frame_length, WORD32 *block_size, - WORD32 *output_samples,WORD32 *sampling_freq, UWORD32* sample_freq_indx); + WORD32 *output_samples, WORD32 *sampling_freq, + UWORD32 *sample_freq_indx); WORD32 ixheaacd_config(ia_bit_buf_struct *bit_buff, ia_usac_config_struct *pstr_usac_conf, UINT32 *chan); diff --git a/decoder/ixheaacd_create.c b/decoder/ixheaacd_create.c index 8b32040..9091a95 100644 --- a/decoder/ixheaacd_create.c +++ b/decoder/ixheaacd_create.c @@ -232,8 +232,7 @@ WORD32 ixheaacd_decode_init( &aac_dec_handle->pstr_aac_tables->pstr_block_tables ->tns_max_bands_tbl_usac; - - for (i = 0; i < 11 ; i++) { + for (i = 0; i < 11; i++) { if (ixheaacd_sampling_boundaries[i] <= sample_rate) break; } @@ -257,8 +256,10 @@ WORD32 ixheaacd_decode_init( usac_data->pstr_usac_winmap[3] = &usac_data->str_only_long_info; usac_data->pstr_usac_winmap[4] = &usac_data->str_only_long_info; - if((usac_data->ccfl != 480) && (usac_data->ccfl != 512) && (usac_data->ccfl != 768) && (usac_data->ccfl != 960) &&(usac_data->ccfl != 1024)) - return -1; + if ((usac_data->ccfl != 480) && (usac_data->ccfl != 512) && + (usac_data->ccfl != 768) && (usac_data->ccfl != 960) && + (usac_data->ccfl != 1024)) + return -1; ixheaacd_info_init(&ixheaacd_samp_rate_info[usac_data->sampling_rate_idx], usac_data->ccfl, usac_data->pstr_usac_winmap[0], usac_data->pstr_usac_winmap[2], usac_data->sfb_width_short, @@ -323,8 +324,8 @@ WORD32 ixheaacd_decode_init( .str_usac_element_config[ele_id] .str_usac_mps212_config); - ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle, - bs_frame_length, bs_residual_coding, ptr_usac_mps212_config); + ixheaacd_mps_create(&aac_dec_handle->mps_dec_handle, bs_frame_length, + bs_residual_coding, ptr_usac_mps212_config); } break; } @@ -371,7 +372,8 @@ WORD32 ixheaacd_dec_data_init(VOID *handle, &pstr_frame_data->str_layer.sample_rate_layer, &layer_config->samp_frequency_index); - pstr_stream_config->sampling_frequency = pstr_frame_data->str_layer.sample_rate_layer; + pstr_stream_config->sampling_frequency = + pstr_frame_data->str_layer.sample_rate_layer; pstr_stream_config->samp_frequency_index = layer_config->samp_frequency_index; num_elements = ptr_usac_config->str_usac_dec_config.num_elements; @@ -400,8 +402,6 @@ WORD32 ixheaacd_dec_data_init(VOID *handle, num_out_chan = ptr_usac_config->num_out_channels; - - if (usac_data->ccfl == 768) pstr_frame_data->str_layer.sample_rate_layer = 4 * pstr_frame_data->str_layer.sample_rate_layer / 3; @@ -535,28 +535,28 @@ WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle, switch (aot) { case AOT_USAC: - err = ixheaacd_dec_data_init(handle, pstr_frame_data, - &(pstr_dec_data->str_usac_data)); - - switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) { - case 0: - handle->aac_config.ui_sbr_mode = 0; - break; - case 1: - handle->aac_config.ui_sbr_mode = 1; - break; - case 2: - handle->aac_config.ui_sbr_mode = 1; - break; - case 3: - handle->aac_config.ui_sbr_mode = 3; - break; - - default: - handle->aac_config.ui_sbr_mode = 0; - } - - if (err == -1) return -1; + err = ixheaacd_dec_data_init(handle, pstr_frame_data, + &(pstr_dec_data->str_usac_data)); + + switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) { + case 0: + handle->aac_config.ui_sbr_mode = 0; + break; + case 1: + handle->aac_config.ui_sbr_mode = 1; + break; + case 2: + handle->aac_config.ui_sbr_mode = 1; + break; + case 3: + handle->aac_config.ui_sbr_mode = 3; + break; + + default: + handle->aac_config.ui_sbr_mode = 0; + } + + if (err == -1) return -1; break; @@ -595,11 +595,11 @@ WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle, memset(&usac_def_header, 0, sizeof(ia_sbr_header_data_struct)); for (elem_idx = 0; elem_idx < num_ele; elem_idx++) { - - UWORD32 usac_ele_type = - ptr_usac_config->str_usac_dec_config.usac_element_type[elem_idx]; - ia_usac_dec_element_config_struct *ptr_usac_ele_config = - &ptr_usac_config->str_usac_dec_config.str_usac_element_config[elem_idx]; + UWORD32 usac_ele_type = + ptr_usac_config->str_usac_dec_config.usac_element_type[elem_idx]; + ia_usac_dec_element_config_struct *ptr_usac_ele_config = + &ptr_usac_config->str_usac_dec_config + .str_usac_element_config[elem_idx]; ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config = &(ptr_usac_dec_config->str_usac_element_config[elem_idx] @@ -611,39 +611,29 @@ WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle, harmonic_sbr[elem_idx] = (ptr_usac_sbr_config != NULL) ? ptr_usac_sbr_config->harmonic_sbr : 0; - if (ptr_usac_sbr_config->bs_inter_tes) - inter_test_flag = 1; - if (ptr_usac_sbr_config->bs_pvc) - bs_pvc_flag = 1; - if (ptr_usac_sbr_config->harmonic_sbr) - harmonic_Sbr_flag = 1; - - - - - if ((usac_ele_type != ID_USAC_LFE) && (usac_ele_type != ID_USAC_EXT)) { - ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config = - &(ptr_usac_ele_config->str_usac_sbr_config); - - usac_def_header.start_freq = ptr_usac_sbr_config->dflt_start_freq; - usac_def_header.stop_freq = ptr_usac_sbr_config->dflt_stop_freq; - usac_def_header.header_extra_1 = - ptr_usac_sbr_config->dflt_header_extra1; - usac_def_header.header_extra_2 = - ptr_usac_sbr_config->dflt_header_extra2; - usac_def_header.freq_scale = ptr_usac_sbr_config->dflt_freq_scale; - usac_def_header.alter_scale = ptr_usac_sbr_config->dflt_alter_scale; - usac_def_header.noise_bands = ptr_usac_sbr_config->dflt_noise_bands; - usac_def_header.limiter_bands = - ptr_usac_sbr_config->dflt_limiter_bands; - usac_def_header.limiter_gains = - ptr_usac_sbr_config->dflt_limiter_gains; - usac_def_header.interpol_freq = - ptr_usac_sbr_config->dflt_interpol_freq; - usac_def_header.smoothing_mode = - ptr_usac_sbr_config->dflt_smoothing_mode; - } - + if (ptr_usac_sbr_config->bs_inter_tes) inter_test_flag = 1; + if (ptr_usac_sbr_config->bs_pvc) bs_pvc_flag = 1; + if (ptr_usac_sbr_config->harmonic_sbr) harmonic_Sbr_flag = 1; + + if ((usac_ele_type != ID_USAC_LFE) && (usac_ele_type != ID_USAC_EXT)) { + ia_usac_dec_sbr_config_struct *ptr_usac_sbr_config = + &(ptr_usac_ele_config->str_usac_sbr_config); + + usac_def_header.start_freq = ptr_usac_sbr_config->dflt_start_freq; + usac_def_header.stop_freq = ptr_usac_sbr_config->dflt_stop_freq; + usac_def_header.header_extra_1 = + ptr_usac_sbr_config->dflt_header_extra1; + usac_def_header.header_extra_2 = + ptr_usac_sbr_config->dflt_header_extra2; + usac_def_header.freq_scale = ptr_usac_sbr_config->dflt_freq_scale; + usac_def_header.alter_scale = ptr_usac_sbr_config->dflt_alter_scale; + usac_def_header.noise_bands = ptr_usac_sbr_config->dflt_noise_bands; + usac_def_header.limiter_bands = ptr_usac_sbr_config->dflt_limiter_bands; + usac_def_header.limiter_gains = ptr_usac_sbr_config->dflt_limiter_gains; + usac_def_header.interpol_freq = ptr_usac_sbr_config->dflt_interpol_freq; + usac_def_header.smoothing_mode = + ptr_usac_sbr_config->dflt_smoothing_mode; + } } pstr_dec_data->str_usac_data.down_samp_sbr = 0; @@ -664,7 +654,6 @@ WORD32 ixheaacd_decode_create(ia_exhaacplus_dec_api_struct *handle, } { - void *sbr_persistent_mem_v = aac_dec_handle->sbr_persistent_mem_u; pstr_dec_data->str_usac_data.pstr_esbr_dec = ixheaacd_init_sbr( diff --git a/decoder/ixheaacd_decode_main.c b/decoder/ixheaacd_decode_main.c index aefb4ba..21e6bca 100644 --- a/decoder/ixheaacd_decode_main.c +++ b/decoder/ixheaacd_decode_main.c @@ -125,96 +125,94 @@ VOID ixheaacd_samples_sat(WORD8 *outbuffer, WORD32 num_samples_out, } /* audio pre roll frame parsing*/ -static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, UWORD8 *conf_buf,WORD32 *preroll_units, WORD32 *preroll_frame_offset) -{ - ia_bit_buf_struct *temp_buff = (ia_bit_buf_struct *)&(pstr_dec_data->dec_bit_buf); - WORD32 independency_flag = 0; - WORD32 ext_ele_present = 0; - WORD32 ext_ele_use_dflt_len = 0; - WORD32 ext_ele_payload_len = 0; - - WORD32 apply_crossfade = 0; - WORD32 un_used_val = 0; - 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 temp = 0; - - WORD32 config_len = 0; - WORD32 loop; - - if (pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config.str_usac_dec_config.usac_element_type[0] == ID_USAC_EXT) - { - temp = ixheaacd_show_bits_buf(temp_buff, 3); - independency_flag = (temp >> 2) & 0x1; - ext_ele_present = (temp >> 1) & 0x1; - - if (ext_ele_present) - { - ext_ele_use_dflt_len = temp & 0x1; // ixheaacd_read_bit(&temp_buff, 1); - if (ext_ele_use_dflt_len != 0) - return 0; - - un_used_val = ixheaacd_read_bits_buf(temp_buff, 3); - - ext_ele_payload_len = ixheaacd_read_bits_buf(temp_buff, 8); - - if (ext_ele_payload_len == 255) { - WORD32 val_add = 0; - val_add = ixheaacd_read_bits_buf(temp_buff, 16); - ext_ele_payload_len = (UWORD32)((WORD32)ext_ele_payload_len + val_add - 2); - } - - //escapedValue(4, 4, 8); - config_len = ixheaacd_read_bits_buf(temp_buff, 4); - if (config_len == 15) - { - WORD32 val_add = 0; - val_add = ixheaacd_read_bits_buf(temp_buff, 4); - config_len += val_add; - if (val_add == 15) - { - WORD32 val_add1 = 0; - val_add1 = ixheaacd_read_bits_buf(temp_buff, 8); - config_len += val_add1; - } - } - - for(loop=0; loop < config_len; loop++) - conf_buf[loop] = ixheaacd_read_bits_buf(temp_buff, 8); - - - apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1); - un_used_val = ixheaacd_read_bits_buf(temp_buff, 1); // reserverd - - //escapedValue(2, 4, 0); - num_pre_roll_frames = ixheaacd_read_bits_buf(temp_buff, 2); - if (num_pre_roll_frames == 3) - { - WORD32 val_add = 0; - val_add = ixheaacd_read_bits_buf(temp_buff, 4); - num_pre_roll_frames += val_add; - } - - 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); - if (au_len == 65535) - { - WORD32 val_add = ixheaacd_read_bits_buf(temp_buff, 16); - au_len += val_add; - } - preroll_frame_offset[frame_idx]=temp_buff->size-temp_buff->cnt_bits; - frame_len[frame_idx] = (8 * au_len) + (temp_buff->size - temp_buff->cnt_bits); - temp_buff->ptr_read_next += au_len; - temp_buff->cnt_bits -= au_len * 8; - } +static WORD32 ixheaacd_audio_preroll_parsing(ia_dec_data_struct *pstr_dec_data, + UWORD8 *conf_buf, + WORD32 *preroll_units, + WORD32 *preroll_frame_offset) { + ia_bit_buf_struct *temp_buff = + (ia_bit_buf_struct *)&(pstr_dec_data->dec_bit_buf); + WORD32 independency_flag = 0; + WORD32 ext_ele_present = 0; + WORD32 ext_ele_use_dflt_len = 0; + WORD32 ext_ele_payload_len = 0; + + WORD32 apply_crossfade = 0; + WORD32 un_used_val = 0; + 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 temp = 0; + + WORD32 config_len = 0; + WORD32 loop; + + if (pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config + .str_usac_dec_config.usac_element_type[0] == ID_USAC_EXT) { + temp = ixheaacd_show_bits_buf(temp_buff, 3); + independency_flag = (temp >> 2) & 0x1; + ext_ele_present = (temp >> 1) & 0x1; + + if (ext_ele_present) { + ext_ele_use_dflt_len = temp & 0x1; // ixheaacd_read_bit(&temp_buff, 1); + if (ext_ele_use_dflt_len != 0) return 0; + + un_used_val = ixheaacd_read_bits_buf(temp_buff, 3); + + ext_ele_payload_len = ixheaacd_read_bits_buf(temp_buff, 8); + + if (ext_ele_payload_len == 255) { + WORD32 val_add = 0; + val_add = ixheaacd_read_bits_buf(temp_buff, 16); + ext_ele_payload_len = + (UWORD32)((WORD32)ext_ele_payload_len + val_add - 2); + } + + // escapedValue(4, 4, 8); + config_len = ixheaacd_read_bits_buf(temp_buff, 4); + if (config_len == 15) { + WORD32 val_add = 0; + val_add = ixheaacd_read_bits_buf(temp_buff, 4); + config_len += val_add; + if (val_add == 15) { + WORD32 val_add1 = 0; + val_add1 = ixheaacd_read_bits_buf(temp_buff, 8); + config_len += val_add1; + } + } + + for (loop = 0; loop < config_len; loop++) + conf_buf[loop] = ixheaacd_read_bits_buf(temp_buff, 8); + + apply_crossfade = ixheaacd_read_bits_buf(temp_buff, 1); + un_used_val = ixheaacd_read_bits_buf(temp_buff, 1); // reserverd + + // escapedValue(2, 4, 0); + num_pre_roll_frames = ixheaacd_read_bits_buf(temp_buff, 2); + if (num_pre_roll_frames == 3) { + WORD32 val_add = 0; + val_add = ixheaacd_read_bits_buf(temp_buff, 4); + num_pre_roll_frames += val_add; + } + + 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); + if (au_len == 65535) { + WORD32 val_add = ixheaacd_read_bits_buf(temp_buff, 16); + au_len += val_add; } + preroll_frame_offset[frame_idx] = temp_buff->size - temp_buff->cnt_bits; + frame_len[frame_idx] = + (8 * au_len) + (temp_buff->size - temp_buff->cnt_bits); + temp_buff->ptr_read_next += au_len; + temp_buff->cnt_bits -= au_len * 8; + } } - *preroll_units=num_pre_roll_frames; - return config_len; + } + *preroll_units = num_pre_roll_frames; + return config_len; } WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, @@ -232,13 +230,13 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, WORD32 suitable_tracks = 1; WORD32 num_samples_out; ia_dec_data_struct *pstr_dec_data; - UWORD8 config[285]; //max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 + 2^8 -1; + UWORD8 config[285]; // max of escapedValue(4, 4, 8) i.e. 2^4 -1 + 2^4 -1 + + // 2^8 -1; WORD32 config_len; WORD32 delay; - WORD preroll_frame_offset[4]={0}; - WORD preroll_units=-1; - WORD32 access_units=0; - + WORD preroll_frame_offset[4] = {0}; + WORD preroll_units = -1; + WORD32 access_units = 0; if (frames_done == 0) { if ((pstr_audio_specific_config->channel_configuration > 2) || @@ -268,7 +266,8 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, delay = ixheaacd_decode_create( handle, pstr_dec_data, pstr_dec_data->str_frame_data.scal_out_select + 1); - pstr_dec_data->dec_bit_buf.max_size = handle->p_mem_info_aac[IA_MEMTYPE_INPUT].ui_size; + pstr_dec_data->dec_bit_buf.max_size = + handle->p_mem_info_aac[IA_MEMTYPE_INPUT].ui_size; if (delay == -1) return -1; *num_channel_out = pstr_dec_data->str_frame_data.scal_out_num_channels; return 0; @@ -284,120 +283,119 @@ WORD32 ixheaacd_dec_main(VOID *temp_handle, WORD8 *inbuffer, WORD8 *outbuffer, pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag; if (pstr_dec_data->dec_bit_buf.size > pstr_dec_data->dec_bit_buf.max_size) - pstr_dec_data->dec_bit_buf.max_size = pstr_dec_data->dec_bit_buf.size; + pstr_dec_data->dec_bit_buf.max_size = pstr_dec_data->dec_bit_buf.size; /* audio pre roll frame parsing*/ - do{ - - config_len=0; - if(access_units==0&&pstr_audio_specific_config->str_usac_config.str_usac_dec_config.preroll_flag) - { - config_len = ixheaacd_audio_preroll_parsing(pstr_dec_data,&config[0],&preroll_units,&preroll_frame_offset[0]); - } - - if (config_len != 0) - { - + do { + config_len = 0; + if (access_units == 0 && + pstr_audio_specific_config->str_usac_config.str_usac_dec_config + .preroll_flag) { + config_len = ixheaacd_audio_preroll_parsing(pstr_dec_data, &config[0], + &preroll_units, + &preroll_frame_offset[0]); + } + if (config_len != 0) { /* updating the config parameters*/ - ia_bit_buf_struct *config_bit_buf = (ia_bit_buf_struct *)malloc(sizeof(ia_bit_buf_struct)); + ia_bit_buf_struct *config_bit_buf = + (ia_bit_buf_struct *)malloc(sizeof(ia_bit_buf_struct)); config_bit_buf->ptr_bit_buf_base = config; config_bit_buf->size = config_len << 3; config_bit_buf->ptr_read_next = config_bit_buf->ptr_bit_buf_base; - config_bit_buf->ptr_bit_buf_end =(UWORD8 *)config + config_len; + config_bit_buf->ptr_bit_buf_end = (UWORD8 *)config + config_len; config_bit_buf->bit_pos = 7; config_bit_buf->cnt_bits = config_bit_buf->size; - - - - - suitable_tracks = ixheaacd_frm_data_init(pstr_audio_specific_config, pstr_dec_data); - if (suitable_tracks <= 0) - return -1; + if (suitable_tracks <= 0) return -1; /* call codec re-configure*/ - err = ixheaacd_config(config_bit_buf, &(pstr_dec_data->str_frame_data.str_audio_specific_config.str_usac_config),&(pstr_audio_specific_config->channel_configuration)/*&pstr_audio_specific_config->str_usac_config*/); + err = ixheaacd_config( + config_bit_buf, &(pstr_dec_data->str_frame_data + .str_audio_specific_config.str_usac_config), + &(pstr_audio_specific_config + ->channel_configuration) /*&pstr_audio_specific_config->str_usac_config*/); free(config_bit_buf); if (err != 0) return -1; - delay = ixheaacd_decode_create( handle, pstr_dec_data, pstr_dec_data->str_frame_data.scal_out_select + 1); if (delay == -1) return -1; *num_channel_out = pstr_dec_data->str_frame_data.scal_out_num_channels; + } - } - - pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer; - pstr_dec_data->dec_bit_buf.size = aac_dec_handle->ui_in_bytes << 3; - pstr_dec_data->dec_bit_buf.ptr_bit_buf_end = - (UWORD8 *)inbuffer + aac_dec_handle->ui_in_bytes - 1; - pstr_dec_data->dec_bit_buf.ptr_read_next = (UWORD8 *)inbuffer; - pstr_dec_data->dec_bit_buf.bit_pos = 7; - pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size; - - pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag; - - - if(preroll_frame_offset[access_units]) - { - pstr_dec_data->dec_bit_buf.cnt_bits=pstr_dec_data->dec_bit_buf.size - preroll_frame_offset[access_units]; - pstr_dec_data->dec_bit_buf.bit_pos=7-preroll_frame_offset[access_units]%8; - pstr_dec_data->dec_bit_buf.ptr_read_next=pstr_dec_data->dec_bit_buf.ptr_read_next+(preroll_frame_offset[access_units]/8); - } - - - //temp_read=ixheaacd_show_bits_buf(pstr_dec_data->dec_bit_buf,preroll_frame_offset[access_unit]); - - err = ixheaacd_usac_process(pstr_dec_data, num_channel_out, aac_dec_handle); - - switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) { - case 0: - handle->aac_config.ui_sbr_mode = 0; - break; - case 1: - handle->aac_config.ui_sbr_mode = 1; - break; - case 2: - handle->aac_config.ui_sbr_mode = 1; - break; - case 3: - handle->aac_config.ui_sbr_mode = 3; - break; + pstr_dec_data->dec_bit_buf.ptr_bit_buf_base = (UWORD8 *)inbuffer; + pstr_dec_data->dec_bit_buf.size = aac_dec_handle->ui_in_bytes << 3; + pstr_dec_data->dec_bit_buf.ptr_bit_buf_end = + (UWORD8 *)inbuffer + aac_dec_handle->ui_in_bytes - 1; + pstr_dec_data->dec_bit_buf.ptr_read_next = (UWORD8 *)inbuffer; + pstr_dec_data->dec_bit_buf.bit_pos = 7; + pstr_dec_data->dec_bit_buf.cnt_bits = pstr_dec_data->dec_bit_buf.size; + + pstr_dec_data->str_usac_data.usac_flag = aac_dec_handle->usac_flag; + + if (preroll_frame_offset[access_units]) { + pstr_dec_data->dec_bit_buf.cnt_bits = + pstr_dec_data->dec_bit_buf.size - + preroll_frame_offset[access_units]; + pstr_dec_data->dec_bit_buf.bit_pos = + 7 - preroll_frame_offset[access_units] % 8; + pstr_dec_data->dec_bit_buf.ptr_read_next = + pstr_dec_data->dec_bit_buf.ptr_read_next + + (preroll_frame_offset[access_units] / 8); + } - default: - handle->aac_config.ui_sbr_mode = 0; - } + // temp_read=ixheaacd_show_bits_buf(pstr_dec_data->dec_bit_buf,preroll_frame_offset[access_unit]); + + err = + ixheaacd_usac_process(pstr_dec_data, num_channel_out, aac_dec_handle); + + switch (pstr_dec_data->str_usac_data.sbr_ratio_idx) { + case 0: + handle->aac_config.ui_sbr_mode = 0; + break; + case 1: + handle->aac_config.ui_sbr_mode = 1; + break; + case 2: + handle->aac_config.ui_sbr_mode = 1; + break; + case 3: + handle->aac_config.ui_sbr_mode = 3; + break; + + default: + handle->aac_config.ui_sbr_mode = 0; + } - if (err == -1) return err; - - num_samples_out = pstr_dec_data->str_usac_data.output_samples; - - ixheaacd_samples_sat(outbuffer, 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)); - - access_units++; - preroll_units--; - }while(preroll_units>=0); + if (err == -1) return err; + + num_samples_out = pstr_dec_data->str_usac_data.output_samples; + + ixheaacd_samples_sat(outbuffer, 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)); + + access_units++; + preroll_units--; + } while (preroll_units >= 0); } return err; diff --git a/decoder/ixheaacd_drc_freq_dec.c b/decoder/ixheaacd_drc_freq_dec.c index ce88aba..9adef97 100644 --- a/decoder/ixheaacd_drc_freq_dec.c +++ b/decoder/ixheaacd_drc_freq_dec.c @@ -1008,20 +1008,15 @@ VOID ixheaacd_drc_apply(ia_drc_dec_struct *pstr_drc_dec, (num_qmf_sub_sample - alpha_val) * (WORD64)prev_frame_drc_sbr_factors[i]; - if (frame_size == 512) - { - drc_sbr_factors[num_qmf_sub_sample + j][i] = - (WORD32)(temp_drc >> 4); - } - else if (frame_size == 480) - { - drc_sbr_factors[num_qmf_sub_sample + j][i] = - ixheaacd_div_by_15(temp_drc); - } - else - { - drc_sbr_factors[num_qmf_sub_sample + j][i] = - (WORD32)(temp_drc >> 5); + if (frame_size == 512) { + drc_sbr_factors[num_qmf_sub_sample + j][i] = + (WORD32)(temp_drc >> 4); + } else if (frame_size == 480) { + drc_sbr_factors[num_qmf_sub_sample + j][i] = + ixheaacd_div_by_15(temp_drc); + } else { + drc_sbr_factors[num_qmf_sub_sample + j][i] = + (WORD32)(temp_drc >> 5); } if (960 == frame_size) { diff --git a/decoder/ixheaacd_env_calc.c b/decoder/ixheaacd_env_calc.c index 652e810..26590c4 100644 --- a/decoder/ixheaacd_env_calc.c +++ b/decoder/ixheaacd_env_calc.c @@ -1311,12 +1311,14 @@ VOID ixheaacd_enery_calc_persfb(WORD32 **anal_buf_real, WORD32 **anal_buf_imag, } } -VOID ixheaacd_subbandgain_calc( - WORD16 e_orig_mant_matrix, WORD16 tmp_noise_mant, WORD16 nrg_est_mant, - WORD16 nrg_est_exp, WORD16 tmp_noise_exp, WORD16 nrg_ref_exp, - FLAG sine_present_flag, FLAG sine_mapped_matrix, FLAG noise_absc_flag, - WORD16 *ptr_nrg_gain_mant, WORD16 *ptr_noise_floor_mant, - WORD16 *ptr_nrg_sine_m, ixheaacd_misc_tables *pstr_common_tables) { +VOID ixheaacd_subbandgain_calc(WORD16 e_orig_mant_matrix, WORD16 tmp_noise_mant, + WORD16 nrg_est_mant, WORD16 nrg_est_exp, + WORD16 tmp_noise_exp, WORD16 nrg_ref_exp, + FLAG sine_present_flag, FLAG sine_mapped_matrix, + FLAG noise_absc_flag, WORD16 *ptr_nrg_gain_mant, + WORD16 *ptr_noise_floor_mant, + WORD16 *ptr_nrg_sine_m, + ixheaacd_misc_tables *pstr_common_tables) { WORD16 var1_mant; WORD16 var1_exp; WORD16 var2_mant; diff --git a/decoder/ixheaacd_env_calc.h b/decoder/ixheaacd_env_calc.h index 8b03ade..b4a581d 100644 --- a/decoder/ixheaacd_env_calc.h +++ b/decoder/ixheaacd_env_calc.h @@ -71,7 +71,6 @@ VOID ixheaacd_enery_calc_persfb(WORD32 **anal_buf_real, WORD32 **anal_buf_imag, WORD16 *nrg_est_m, FLAG low_pow_flag, ia_sbr_tables_struct *ptr_sbr_tables); - VOID ixheaacd_avggain_calc(WORD16 *ptr_enrg_orig, WORD16 *nrg_est, WORD32 sub_band_start, WORD32 sub_band_end, WORD16 *sum_orig_mant, WORD16 *sum_orig_exp, @@ -172,12 +171,14 @@ VOID ixheaacd_conv_ergtoamplitude_armv7(WORD32 bands, WORD16 noise_e, WORD16 *noise_level_mant, WORD16 *sqrt_table); - VOID ixheaacd_subbandgain_calc( - WORD16 e_orig_mant_matrix, WORD16 tmp_noise_mant, WORD16 nrg_est_mant, - WORD16 nrg_est_exp, WORD16 tmp_noise_exp, WORD16 nrg_ref_exp, - FLAG sine_present_flag, FLAG sine_mapped_matrix, FLAG noise_absc_flag, - WORD16 *ptr_nrg_gain_mant, WORD16 *ptr_noise_floor_mant, - WORD16 *ptr_nrg_sine_m, ixheaacd_misc_tables *pstr_common_tables); +VOID ixheaacd_subbandgain_calc(WORD16 e_orig_mant_matrix, WORD16 tmp_noise_mant, + WORD16 nrg_est_mant, WORD16 nrg_est_exp, + WORD16 tmp_noise_exp, WORD16 nrg_ref_exp, + FLAG sine_present_flag, FLAG sine_mapped_matrix, + FLAG noise_absc_flag, WORD16 *ptr_nrg_gain_mant, + WORD16 *ptr_noise_floor_mant, + WORD16 *ptr_nrg_sine_m, + ixheaacd_misc_tables *pstr_common_tables); PLATFORM_INLINE VOID ixheaacd_filt_buf_update(WORD16 *ptr_filt_buf, WORD16 *ptr_filt_buf_noise, WORD16 *nrg_gain, diff --git a/decoder/ixheaacd_env_extr.c b/decoder/ixheaacd_env_extr.c index 2560701..67f3499 100644 --- a/decoder/ixheaacd_env_extr.c +++ b/decoder/ixheaacd_env_extr.c @@ -108,8 +108,8 @@ VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len, } static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data, - ia_bit_buf_struct *it_bit_buff, - WORD32 indepFlag) { + ia_bit_buf_struct *it_bit_buff, + WORD32 indepFlag) { WORD32 i, j, k; WORD32 fixed_length = 0, num_grid_info = 0, grid_info; UWORD8 div_mode, ns_mode; @@ -158,9 +158,8 @@ static WORD32 ixheaacd_read_esbr_pvc_envelope(ia_pvc_data_struct *ptr_pvc_data, length = (UWORD8)ixheaacd_read_bits_buf(it_bit_buff, length_bits); length += 1; sum_length += length; - if((k+length-1) > PVC_NUM_TIME_SLOTS) - { - return -1; + if ((k + length - 1) > PVC_NUM_TIME_SLOTS) { + return -1; } for (j = 1; j < length; j++, k++) { pvc_id[k] = pvc_id[k - 1]; @@ -565,7 +564,6 @@ 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) { @@ -630,10 +628,11 @@ static WORD16 ixheaacd_read_extn_data( } WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_bit_buf_struct *it_bit_buff, WORD32 hbe_flag, - ia_pvc_data_struct *ptr_pvc_data, - ia_sbr_tables_struct *ptr_sbr_tables, - ia_sbr_header_data_struct *ptr_header_data) { + ia_bit_buf_struct *it_bit_buff, + WORD32 hbe_flag, + ia_pvc_data_struct *ptr_pvc_data, + ia_sbr_tables_struct *ptr_sbr_tables, + ia_sbr_header_data_struct *ptr_header_data) { WORD32 i; WORD32 err_code = 0; ia_env_extr_tables_struct *env_extr_tables_ptr = @@ -658,8 +657,7 @@ WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, } err_code = ixheaacd_pvc_time_freq_grid_info(it_bit_buff, ptr_frame_data); - if(err_code) - return err_code; + if (err_code) return err_code; ptr_pvc_data->prev_sbr_mode = PVC_SBR; @@ -1485,8 +1483,7 @@ WORD32 ixheaacd_pvc_time_freq_grid_info( } else { time_border[0] = 0; } - if(time_border[0] < 0) - return -1; + if (time_border[0] < 0) return -1; pvc_time_border[0] = 0; bs_freq_res[0] = 0; diff --git a/decoder/ixheaacd_esbr_polyphase.c b/decoder/ixheaacd_esbr_polyphase.c index 169231c..bcb4685 100644 --- a/decoder/ixheaacd_esbr_polyphase.c +++ b/decoder/ixheaacd_esbr_polyphase.c @@ -120,10 +120,10 @@ WORD32 ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) { *ptr_u++ = ((*analy_cos_sin_tab++) * u[k]); *ptr_u++ = ((*analy_cos_sin_tab++) * u[k]); } - if(ixheaacd_cmplx_anal_fft != NULL) - (*ixheaacd_cmplx_anal_fft)(u_in, u_out, anal_size * 2); + if (ixheaacd_cmplx_anal_fft != NULL) + (*ixheaacd_cmplx_anal_fft)(u_in, u_out, anal_size * 2); else - return -1; + return -1; for (k = 0; k < anal_size / 2; k++) { *(anal_buf + 1) = -*ptr_v++; @@ -142,8 +142,8 @@ WORD32 ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer) { } WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, - WORD32 num_columns, FLOAT32 qmf_buf_real[][64], - FLOAT32 qmf_buf_imag[][64]) { + WORD32 num_columns, FLOAT32 qmf_buf_real[][64], + FLOAT32 qmf_buf_imag[][64]) { WORD32 i, j, k, l, idx; FLOAT32 g[640]; FLOAT32 w[640]; @@ -162,8 +162,7 @@ WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, (idx + 1) * ptr_hbe_txposer->synth_size; FLOAT32 *synth_cos_tab = ptr_hbe_txposer->synth_cos_tab; const FLOAT32 *interp_window_coeff = ptr_hbe_txposer->synth_wind_coeff; - if(ptr_hbe_txposer->k_start < 0) - return -1; + if (ptr_hbe_txposer->k_start < 0) return -1; for (k = 0; k < synth_size; k++) { WORD32 ki = ptr_hbe_txposer->k_start + k; synth_buf_r[k] = (FLOAT32)( @@ -210,10 +209,10 @@ WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, FLOAT32 *syn_buf = &buffer[kmax]; kmax += synth_size; - if(ixheaacd_real_synth_fft != NULL) - (*ixheaacd_real_synth_fft)(synth_buf_r, synth_out, synth_size * 2); + if (ixheaacd_real_synth_fft != NULL) + (*ixheaacd_real_synth_fft)(synth_buf_r, synth_out, synth_size * 2); else - return -1; + return -1; for (k = 0; k < kmax; k++) { tmp = ((*ptr_u++) * (*synth_cos_tab++)); diff --git a/decoder/ixheaacd_ext_ch_ele.c b/decoder/ixheaacd_ext_ch_ele.c index bfa8d92..5f09ba8 100644 --- a/decoder/ixheaacd_ext_ch_ele.c +++ b/decoder/ixheaacd_ext_ch_ele.c @@ -323,8 +323,8 @@ VOID ixheaacd_ms_stereo(ia_usac_data_struct *usac_data, WORD32 *r_spec, for (k = 0; k < ptr_sfb_info->sfb_width[sfb]; k++) { temp_r = *r_spec; temp_l = *l_spec; - *l_spec = ixheaacd_add32_sat(temp_r , temp_l); - *r_spec = ixheaacd_sub32_sat(temp_l , temp_r); + *l_spec = ixheaacd_add32_sat(temp_r, temp_l); + *r_spec = ixheaacd_sub32_sat(temp_l, temp_r); r_spec++; l_spec++; } @@ -491,7 +491,9 @@ static WORD32 ixheaacd_cplx_pred_upmixing( else { for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) { - dmx_re[i] = (WORD32)(((WORD64)l_spec[i] + ((WORD64)factor * (WORD64)r_spec[i])) >> 1); + dmx_re[i] = (WORD32)( + ((WORD64)l_spec[i] + ((WORD64)factor * (WORD64)r_spec[i])) >> + 1); } } } @@ -540,13 +542,13 @@ static WORD32 ixheaacd_cplx_pred_upmixing( alpha_q_re_temp = alpha_q_re[grp][sfb] * 1677722; if (cplx_pred_used[grp][sfb]) { for (k = 0; k < pstr_sfb_info->sfb_width[sfb]; k++, i++) { - WORD32 mid_side = - ixheaacd_sub32_sat(r_spec[i] , (WORD32)((WORD64)ixheaacd_mult32x32in64( - alpha_q_re_temp, l_spec[i]) >> - 24)); + WORD32 mid_side = ixheaacd_sub32_sat( + r_spec[i], (WORD32)((WORD64)ixheaacd_mult32x32in64( + alpha_q_re_temp, l_spec[i]) >> + 24)); - r_spec[i] = (factor) * (ixheaacd_sub32_sat(l_spec[i] , mid_side)); - l_spec[i] = ixheaacd_add32_sat(l_spec[i] , mid_side); + r_spec[i] = (factor) * (ixheaacd_sub32_sat(l_spec[i], mid_side)); + l_spec[i] = ixheaacd_add32_sat(l_spec[i], mid_side); } } else { diff --git a/decoder/ixheaacd_fft.c b/decoder/ixheaacd_fft.c index ec7dab0..c5ac7b9 100644 --- a/decoder/ixheaacd_fft.c +++ b/decoder/ixheaacd_fft.c @@ -1154,14 +1154,14 @@ VOID ixheaacd_complex_fft_p2_dec(WORD32 *xr, WORD32 *xi, WORD32 nlength, x3r = x1r - (x3r << 1); x3i = x1i - (x3i << 1); - x0r = ixheaacd_add32_sat(x0r , x1r); - x0i = ixheaacd_add32_sat(x0i , x1i); - x1r = ixheaacd_sub32_sat(x0r , (x1r << 1)); - x1i = ixheaacd_sub32_sat(x0i , (x1i << 1)); - x2r = ixheaacd_sub32_sat(x2r , x3i); - x2i = ixheaacd_add32_sat(x2i , x3r); - x3i = ixheaacd_add32_sat(x2r , (x3i << 1)); - x3r = ixheaacd_sub32_sat(x2i , (x3r << 1)); + x0r = ixheaacd_add32_sat(x0r, x1r); + x0i = ixheaacd_add32_sat(x0i, x1i); + x1r = ixheaacd_sub32_sat(x0r, (x1r << 1)); + x1i = ixheaacd_sub32_sat(x0i, (x1i << 1)); + x2r = ixheaacd_sub32_sat(x2r, x3i); + x2i = ixheaacd_add32_sat(x2i, x3r); + x3i = ixheaacd_add32_sat(x2r, (x3i << 1)); + x3r = ixheaacd_sub32_sat(x2i, (x3r << 1)); *data = x0r; *(data + 1) = x0i; diff --git a/decoder/ixheaacd_freq_sca.c b/decoder/ixheaacd_freq_sca.c index a29dd8f..1694307 100644 --- a/decoder/ixheaacd_freq_sca.c +++ b/decoder/ixheaacd_freq_sca.c @@ -75,7 +75,6 @@ static WORD32 ixheaacd_int_div(WORD32 num, WORD32 den) { } } - VOID ixheaacd_aac_shellsort(WORD16 *in, WORD32 n) { WORD32 i, j; WORD32 inc; @@ -105,218 +104,179 @@ VOID ixheaacd_aac_shellsort(WORD16 *in, WORD32 n) { } while (inc > 1); } - - - WORD32 -ixheaacd_calc_start_band(WORD32 fs, const WORD32 start_freq, FLOAT32 upsamp_fac) -{ - WORD32 k0_min; - WORD32 fs_mapped = 0; +ixheaacd_calc_start_band(WORD32 fs, const WORD32 start_freq, + FLOAT32 upsamp_fac) { + WORD32 k0_min; + WORD32 fs_mapped = 0; - if (upsamp_fac == 4) { - fs = fs / 2; - } + 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 (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) { - k0_min = (WORD32)(((FLOAT32)(3000 * 2 * 32) / fs_mapped) + 0.5); - } - else { - if (fs_mapped < 64000) { - k0_min = (WORD32)(((FLOAT32)(4000 * 2 * 32) / fs_mapped) + 0.5); - } - else { - k0_min = (WORD32)(((FLOAT32)(5000 * 2 * 32) / fs_mapped) + 0.5); - } - } + if (upsamp_fac == 4) { + if (fs_mapped < 32000) { + k0_min = (WORD32)(((FLOAT32)(3000 * 2 * 32) / fs_mapped) + 0.5); + } else { + if (fs_mapped < 64000) { + k0_min = (WORD32)(((FLOAT32)(4000 * 2 * 32) / fs_mapped) + 0.5); + } else { + k0_min = (WORD32)(((FLOAT32)(5000 * 2 * 32) / fs_mapped) + 0.5); + } } - else { - if (fs_mapped < 32000) { - k0_min = (WORD32)(((FLOAT32)(3000 * 2 * 64) / fs_mapped) + 0.5); - } - else { - if (fs_mapped < 64000) { - k0_min = (WORD32)(((FLOAT32)(4000 * 2 * 64) / fs_mapped) + 0.5); - } - else { - k0_min = (WORD32)(((FLOAT32)(5000 * 2 * 64) / fs_mapped) + 0.5); - } - } + } else { + if (fs_mapped < 32000) { + k0_min = (WORD32)(((FLOAT32)(3000 * 2 * 64) / fs_mapped) + 0.5); + } else { + if (fs_mapped < 64000) { + k0_min = (WORD32)(((FLOAT32)(4000 * 2 * 64) / fs_mapped) + 0.5); + } else { + k0_min = (WORD32)(((FLOAT32)(5000 * 2 * 64) / fs_mapped) + 0.5); + } } + } - switch (fs_mapped) { - case 16000: - { - WORD32 v_offset[] = { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 }; - return (k0_min + v_offset[start_freq]); - } - break; - case 22050: - { - WORD32 v_offset[] = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 }; - return (k0_min + v_offset[start_freq]); - } - break; - case 24000: - { - WORD32 v_offset[] = { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }; - return (k0_min + v_offset[start_freq]); - } - break; - case 32000: - { - WORD32 v_offset[] = { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }; - return (k0_min + v_offset[start_freq]); - } - break; - case 40000: - { - WORD32 v_offset[] = { -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 13, 15, 17, 19 }; - return (k0_min + v_offset[start_freq]); - } - break; + switch (fs_mapped) { + case 16000: { + WORD32 v_offset[] = {-8, -7, -6, -5, -4, -3, -2, -1, + 0, 1, 2, 3, 4, 5, 6, 7}; + return (k0_min + v_offset[start_freq]); + } break; + case 22050: { + WORD32 v_offset[] = {-5, -4, -3, -2, -1, 0, 1, 2, + 3, 4, 5, 6, 7, 9, 11, 13}; + return (k0_min + v_offset[start_freq]); + } break; + case 24000: { + WORD32 v_offset[] = {-5, -3, -2, -1, 0, 1, 2, 3, + 4, 5, 6, 7, 9, 11, 13, 16}; + return (k0_min + v_offset[start_freq]); + } break; + case 32000: { + WORD32 v_offset[] = {-6, -4, -2, -1, 0, 1, 2, 3, + 4, 5, 6, 7, 9, 11, 13, 16}; + return (k0_min + v_offset[start_freq]); + } break; + case 40000: { + WORD32 v_offset[] = {-1, 0, 1, 2, 3, 4, 5, 6, + 7, 8, 9, 11, 13, 15, 17, 19}; + return (k0_min + v_offset[start_freq]); + } break; case 44100: case 48000: - case 64000: - { - WORD32 v_offset[] = { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 }; - return (k0_min + v_offset[start_freq]); - } - break; + case 64000: { + WORD32 v_offset[] = {-4, -2, -1, 0, 1, 2, 3, 4, + 5, 6, 7, 9, 11, 13, 16, 20}; + return (k0_min + v_offset[start_freq]); + } break; case 88200: - case 96000: - { - WORD32 v_offset[] = { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 }; - return (k0_min + v_offset[start_freq]); - } - break; + case 96000: { + WORD32 v_offset[] = {-2, -1, 0, 1, 2, 3, 4, 5, + 6, 7, 9, 11, 13, 16, 20, 24}; + return (k0_min + v_offset[start_freq]); + } break; - default: - { - WORD32 v_offset[] = { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 }; - return (k0_min + v_offset[start_freq]); - } + default: { + WORD32 v_offset[] = {0, 1, 2, 3, 4, 5, 6, 7, + 9, 11, 13, 16, 20, 24, 28, 33}; + return (k0_min + v_offset[start_freq]); } + } } WORD32 -ixheaacd_calc_stop_band(WORD32 fs, const WORD32 stop_freq, FLOAT32 upsamp_fac) -{ - WORD32 result, i; - WORD16 arr_stop_freq[14]; - WORD32 k1_min; - WORD16 arr_diff_stop_freq[13]; - - if (upsamp_fac == 4) { - fs = fs / 2; - if (fs < 32000) { - k1_min = (WORD32)(((FLOAT32)(6000 * 2 * 32) / fs) + 0.5); - } - else { - if (fs < 64000) { - k1_min = (WORD32)(((FLOAT32)(8000 * 2 * 32) / fs) + 0.5); - } - else { - k1_min = (WORD32)(((FLOAT32)(10000 * 2 * 32) / fs) + 0.5); - } - } - } - else { - if (fs < 32000) { - k1_min = (WORD32)(((FLOAT32)(6000 * 2 * 64) / fs) + 0.5); - } - else { - if (fs < 64000) { - k1_min = (WORD32)(((FLOAT32)(8000 * 2 * 64) / fs) + 0.5); - } - else { - k1_min = (WORD32)(((FLOAT32)(10000 * 2 * 64) / fs) + 0.5); - } - } - } +ixheaacd_calc_stop_band(WORD32 fs, const WORD32 stop_freq, FLOAT32 upsamp_fac) { + WORD32 result, i; + WORD16 arr_stop_freq[14]; + WORD32 k1_min; + WORD16 arr_diff_stop_freq[13]; - /*Calculate stop frequency vector*/ - for (i = 0; i <= 13; i++) { - arr_stop_freq[i] = (WORD32)(k1_min * pow(64.0 / k1_min, i / 13.0) + 0.5); + if (upsamp_fac == 4) { + fs = fs / 2; + if (fs < 32000) { + k1_min = (WORD32)(((FLOAT32)(6000 * 2 * 32) / fs) + 0.5); + } else { + if (fs < 64000) { + k1_min = (WORD32)(((FLOAT32)(8000 * 2 * 32) / fs) + 0.5); + } else { + k1_min = (WORD32)(((FLOAT32)(10000 * 2 * 32) / fs) + 0.5); + } } + } else { + if (fs < 32000) { + k1_min = (WORD32)(((FLOAT32)(6000 * 2 * 64) / fs) + 0.5); + } else { + if (fs < 64000) { + k1_min = (WORD32)(((FLOAT32)(8000 * 2 * 64) / fs) + 0.5); + } else { + k1_min = (WORD32)(((FLOAT32)(10000 * 2 * 64) / fs) + 0.5); + } + } + } + /*Calculate stop frequency vector*/ + for (i = 0; i <= 13; i++) { + arr_stop_freq[i] = (WORD32)(k1_min * pow(64.0 / k1_min, i / 13.0) + 0.5); + } - /*Ensure increasing bandwidth */ - for (i = 0; i <= 12; i++) { - arr_diff_stop_freq[i] = arr_stop_freq[i + 1] - arr_stop_freq[i]; - } + /*Ensure increasing bandwidth */ + for (i = 0; i <= 12; i++) { + arr_diff_stop_freq[i] = arr_stop_freq[i + 1] - arr_stop_freq[i]; + } - ixheaacd_aac_shellsort(&arr_diff_stop_freq[0], 13); /*Sort bandwidth changes */ + ixheaacd_aac_shellsort(&arr_diff_stop_freq[0], + 13); /*Sort bandwidth changes */ - result = k1_min; - for (i = 0; i<stop_freq; i++) { - result = result + arr_diff_stop_freq[i]; - } + result = k1_min; + for (i = 0; i < stop_freq; i++) { + result = result + arr_diff_stop_freq[i]; + } - return(result); + 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) -{ - /* Update start_freq struct */ - *ptr_k0 = ixheaacd_calc_start_band(samp_freq, start_freq, upsamp_fac); - - - /*Update stop_freq struct */ - if (stop_freq < 14) { - *ptr_k2 = ixheaacd_calc_stop_band(samp_freq, stop_freq, upsamp_fac); - } - else if (stop_freq == 14) { - *ptr_k2 = 2 * (*ptr_k0); - } - else { - *ptr_k2 = 3 * (*ptr_k0); - } +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) { + /* Update start_freq struct */ + *ptr_k0 = ixheaacd_calc_start_band(samp_freq, start_freq, upsamp_fac); + + /*Update stop_freq struct */ + if (stop_freq < 14) { + *ptr_k2 = ixheaacd_calc_stop_band(samp_freq, stop_freq, upsamp_fac); + } else if (stop_freq == 14) { + *ptr_k2 = 2 * (*ptr_k0); + } else { + *ptr_k2 = 3 * (*ptr_k0); + } - /* limit to Nyqvist */ - if (*ptr_k2 > 64) { - *ptr_k2 = 64; - } + /* limit to Nyqvist */ + if (*ptr_k2 > 64) { + *ptr_k2 = 64; + } } WORD16 ixheaacd_calc_master_frq_bnd_tbl( @@ -338,18 +298,12 @@ WORD16 ixheaacd_calc_master_frq_bnd_tbl( WORD16 *f_master_tbl = pstr_freq_band_data->f_master_tbl; WORD16 num_mf_bands; - 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); - + ixheaacd_calc_k0_k2_bands(fs, ptr_header_data->start_freq, + ptr_header_data->stop_freq, upsamp_fac, &k0, &k2); if (k2 > NO_SYNTHESIS_CHANNELS) { k2 = NO_SYNTHESIS_CHANNELS; @@ -701,14 +655,14 @@ WORD32 ixheaacd_derive_noise_freq_bnd_tbl( } WORD32 ixheaacd_calc_frq_bnd_tbls(ia_sbr_header_data_struct *ptr_header_data, - ixheaacd_misc_tables *pstr_common_tables) { + ixheaacd_misc_tables *pstr_common_tables) { WORD32 err; WORD16 num_lf_bands, num_hf_bands, lsb, usb; ia_freq_band_data_struct *pstr_freq_band_data = ptr_header_data->pstr_freq_band_data; err = ixheaacd_calc_master_frq_bnd_tbl(pstr_freq_band_data, ptr_header_data, - pstr_common_tables); + pstr_common_tables); if (err || (ptr_header_data->xover_band > pstr_freq_band_data->num_mf_bands)) { diff --git a/decoder/ixheaacd_fwd_alias_cnx.c b/decoder/ixheaacd_fwd_alias_cnx.c index 27259ef..32f50b9 100644 --- a/decoder/ixheaacd_fwd_alias_cnx.c +++ b/decoder/ixheaacd_fwd_alias_cnx.c @@ -76,10 +76,14 @@ static VOID ixheaacd_synthesis_tool(WORD32 a[], WORD32 x[], WORD32 l, for (i = 0; i < l; i++) { s = x[i]; for (j = 1; j <= ORDER; j += 4) { - s = ixheaacd_sub32_sat(s,ixheaacd_mul32_sh(a[j], x[i - j], (WORD8)(qshift))); - s = ixheaacd_sub32_sat(s,ixheaacd_mul32_sh(a[j + 1], x[i - (j + 1)], (WORD8)(qshift))); - s = ixheaacd_sub32_sat(s,ixheaacd_mul32_sh(a[j + 2], x[i - (j + 2)], (WORD8)(qshift))); - s = ixheaacd_sub32_sat(s,ixheaacd_mul32_sh(a[j + 3], x[i - (j + 3)], (WORD8)(qshift))); + s = ixheaacd_sub32_sat( + s, ixheaacd_mul32_sh(a[j], x[i - j], (WORD8)(qshift))); + s = ixheaacd_sub32_sat( + s, ixheaacd_mul32_sh(a[j + 1], x[i - (j + 1)], (WORD8)(qshift))); + s = ixheaacd_sub32_sat( + s, ixheaacd_mul32_sh(a[j + 2], x[i - (j + 2)], (WORD8)(qshift))); + s = ixheaacd_sub32_sat( + s, ixheaacd_mul32_sh(a[j + 3], x[i - (j + 3)], (WORD8)(qshift))); } x[i] = s; } @@ -125,8 +129,9 @@ WORD32 ixheaacd_fwd_alias_cancel_tool( fac_signal[i] = (WORD32)(ptr_fac_signal_flt[i] * (1 << (16 - qshift))); for (i = 0; i < fac_length; i++) - ptr_overlap_buf[i] = - ixheaacd_add32_sat(ptr_overlap_buf[i],(WORD32)ixheaacd_mul32_sh(fac_signal[i], gain, (WORD8)(16 - qshift))); + ptr_overlap_buf[i] = ixheaacd_add32_sat( + ptr_overlap_buf[i], + (WORD32)ixheaacd_mul32_sh(fac_signal[i], gain, (WORD8)(16 - qshift))); return err; } @@ -155,17 +160,14 @@ WORD32 ixheaacd_fr_alias_cnx_fix(WORD32 *x_in, WORD32 len, WORD32 fac_length, return -1; } - if( FAC_LENGTH < fac_length ) - { - return -1; + if (FAC_LENGTH < fac_length) { + return -1; } - if((1 + (len /2)) < (fac_length + 1)) - { - return -1; + if ((1 + (len / 2)) < (fac_length + 1)) { + return -1; } - if( (len/2 + 1) > (2 * LEN_FRAME - fac_length - 1)) - { - return -1; + if ((len / 2 + 1) > (2 * LEN_FRAME - fac_length - 1)) { + return -1; } if (lp_filt_coeff != NULL && fac_data_out != NULL) { diff --git a/decoder/ixheaacd_hbe_trans.c b/decoder/ixheaacd_hbe_trans.c index 30ae800..e188572 100644 --- a/decoder/ixheaacd_hbe_trans.c +++ b/decoder/ixheaacd_hbe_trans.c @@ -100,8 +100,8 @@ static FLOAT32 *ixheaacd_map_prot_filter(WORD32 filt_length) { } WORD32 ixheaacd_qmf_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, - WORD16 *p_freq_band_tab[2], WORD16 *p_num_sfb, - WORD32 upsamp_4_flag) { + WORD16 *p_freq_band_tab[2], + WORD16 *p_num_sfb, WORD32 upsamp_4_flag) { WORD32 synth_size, sfb, patch, stop_patch; if (ptr_hbe_txposer != NULL) { @@ -214,19 +214,18 @@ WORD32 ixheaacd_qmf_hbe_data_reinit(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, } } } - if(ptr_hbe_txposer->k_start < 0) - { - return -1; + if (ptr_hbe_txposer->k_start < 0) { + return -1; } return 0; } WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, - FLOAT32 qmf_buf_real[][64], - FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, - FLOAT32 pv_qmf_buf_real[][64], - FLOAT32 pv_qmf_buf_imag[][64], - WORD32 pitch_in_bins) { + FLOAT32 qmf_buf_real[][64], + FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, + FLOAT32 pv_qmf_buf_real[][64], + FLOAT32 pv_qmf_buf_imag[][64], + WORD32 pitch_in_bins) { WORD32 i, qmf_band_idx; WORD32 qmf_voc_columns = ptr_hbe_txposer->no_bins / 2; WORD32 err_code = 0; @@ -246,8 +245,7 @@ WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, } err_code = ixheaacd_complex_anal_filt(ptr_hbe_txposer); - if(err_code) - return err_code; + if (err_code) return err_code; for (i = 0; i < (ptr_hbe_txposer->hbe_qmf_out_len - ptr_hbe_txposer->no_bins); i++) { diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c index 7208525..f68ce5f 100644 --- a/decoder/ixheaacd_headerdecode.c +++ b/decoder/ixheaacd_headerdecode.c @@ -604,7 +604,8 @@ WORD32 ixheaacd_ga_hdr_dec(ia_aac_dec_state_struct *aac_state_struct, ixheaacd_conf_default(&(pstr_audio_specific_config->str_usac_config)); err = ixheaacd_config(it_bit_buff, - &(pstr_audio_specific_config->str_usac_config),&(pstr_audio_specific_config->channel_configuration)); + &(pstr_audio_specific_config->str_usac_config), + &(pstr_audio_specific_config->channel_configuration)); if (err != 0) return -1; if (pstr_audio_specific_config->audio_object_type == AOT_USAC) { @@ -798,10 +799,11 @@ WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts, result = ixheaacd_adtsframe(adts, it_bit_buff); - max_frm_len_per_ch = ixheaacd_mult32(768 , (adts->no_raw_data_blocks + 1)); + max_frm_len_per_ch = ixheaacd_mult32(768, (adts->no_raw_data_blocks + 1)); if (adts->channel_configuration != 0) - max_frm_len_per_ch = ixheaacd_mult32(max_frm_len_per_ch, adts->channel_configuration); + max_frm_len_per_ch = + ixheaacd_mult32(max_frm_len_per_ch, adts->channel_configuration); else max_frm_len_per_ch = max_frm_len_per_ch * usr_max_ch; diff --git a/decoder/ixheaacd_huff_code_reorder.c b/decoder/ixheaacd_huff_code_reorder.c index f02127a..9d8c2a5 100644 --- a/decoder/ixheaacd_huff_code_reorder.c +++ b/decoder/ixheaacd_huff_code_reorder.c @@ -140,8 +140,7 @@ static UWORD8 ixheaacd_err_detect_pcw_segment(WORD8 remaining_bits_in_segment, return 0; } -static VOID ixheaacd_nonpcw_sideinfo_init( - ia_hcr_info_struct *ptr_hcr_info) { +static VOID ixheaacd_nonpcw_sideinfo_init(ia_hcr_info_struct *ptr_hcr_info) { UWORD16 i, k; UWORD8 cb_dim; UWORD8 *ptr_cb = ptr_hcr_info->str_non_pcw_side_info.ptr_cb; @@ -1066,15 +1065,14 @@ static UWORD16 *ixheaacd_huff_dec_word_hcr_pcw( return arr_seg_start_l; } -static VOID ixheaacd_decode_pcw( - ia_bit_buf_struct *itt_bit_buff, ia_hcr_info_struct *ptr_hcr_info, - ia_aac_dec_tables_struct *ptr_aac_tables) { +static VOID ixheaacd_decode_pcw(ia_bit_buf_struct *itt_bit_buff, + ia_hcr_info_struct *ptr_hcr_info, + ia_aac_dec_tables_struct *ptr_aac_tables) { UWORD16 ext_sort_sec; UWORD16 cur_ext_sort_cw_sec; UWORD8 codebook; UWORD8 dimension; - WORD32 num_ext_sorted_cw_in_sect_idx = ptr_hcr_info->sect_info.num_ext_sorted_cw_in_sect_idx; UWORD8 *ptr_ext_sorted_cw = ptr_hcr_info->sect_info.ptr_ext_sorted_cw; @@ -1102,7 +1100,6 @@ static VOID ixheaacd_decode_pcw( WORD32 read_word = ixheaacd_aac_showbits_32(itt_bit_buff->ptr_read_next); WORD32 read_bits = itt_bit_buff->cnt_bits; - itt_bit_buff->ptr_read_next += 4; for (ext_sort_sec = @@ -1342,10 +1339,8 @@ static PLATFORM_INLINE UWORD16 ixheaacd_huff_dec_word_hcr_non_pcw( WORD32 out1, out2; UWORD16 cw_len; - WORD16 index, length; - WORD32 read_word = ixheaacd_aac_showbits_32(itt_bit_buff->byte_ptr); UWORD8 *ptr_read_next = itt_bit_buff->byte_ptr; ptr_read_next += 4; @@ -1353,7 +1348,6 @@ static PLATFORM_INLINE UWORD16 ixheaacd_huff_dec_word_hcr_non_pcw( ixheaacd_huff_sfb_table(read_word, &index, &length, code_book_tbl, idx_table); cw_len = length; - ixheaacd_aac_read_byte_corr1(&ptr_read_next, &length, &read_word); out1 = index / 17; @@ -1363,7 +1357,6 @@ static PLATFORM_INLINE UWORD16 ixheaacd_huff_dec_word_hcr_non_pcw( sp1 = out1; sp2 = out2; - if (out1) { if (flush_cw & 0x80000000) { out1 = -out1; @@ -1384,7 +1377,6 @@ static PLATFORM_INLINE UWORD16 ixheaacd_huff_dec_word_hcr_non_pcw( ixheaacd_aac_read_byte_corr1(&ptr_read_next, &length, &read_word); if (sp1 == 16) { - i = 4; value = ixheaacd_extu(read_word, length, 23); value = value | 0xfffffe00; @@ -1616,8 +1608,6 @@ static VOID ixheaacd_decode_hcr_non_pcw( extra_code_bits = max(tot_bits_to_save - 32, 0); code_bits_to_save = min(tot_bits_to_save, 32); - - ptr_hcr_info->str_segment_info.code_extra[*cw_offset] = ixheaacd_read_bit(itt_bit_buff, extra_code_bits); ptr_hcr_info->str_segment_info.code[*cw_offset] = @@ -1654,9 +1644,9 @@ static VOID ixheaacd_decode_hcr_non_pcw( } } -VOID ixheaacd_decode_non_pcw( - ia_bit_buf_struct *itt_bit_buff, ia_hcr_info_struct *ptr_hcr_info, - ia_aac_dec_tables_struct *ptr_aac_tables) { +VOID ixheaacd_decode_non_pcw(ia_bit_buf_struct *itt_bit_buff, + ia_hcr_info_struct *ptr_hcr_info, + ia_aac_dec_tables_struct *ptr_aac_tables) { UWORD32 num_valid_segment; WORD32 cw_offset; WORD32 trial; @@ -1856,8 +1846,8 @@ UWORD32 ixheaacd_hcr_decoder( ptr_hcr_info->str_dec_io.quant_spec_coeff_idx = ptr_tmp4; ptr_hcr_info->sect_info.ext_sorted_sect_max_cb_len_idx = ptr_tmp5; - ixheaacd_hcr_reorder_quantized_spec_coeff( - ptr_hcr_info, ptr_aac_dec_channel_info); + ixheaacd_hcr_reorder_quantized_spec_coeff(ptr_hcr_info, + ptr_aac_dec_channel_info); bit_cnt_offset = (WORD32)itt_bit_buff->cnt_bits - (WORD32)save_bit_cnt; if (bit_cnt_offset) { diff --git a/decoder/ixheaacd_imdct.c b/decoder/ixheaacd_imdct.c index 302c981..a93b04b 100644 --- a/decoder/ixheaacd_imdct.c +++ b/decoder/ixheaacd_imdct.c @@ -72,8 +72,8 @@ extern const FLOAT64 ixheaacd_power_10_table[28]; static WORD32 ixheaacd_calc_max_spectralline(WORD32 *p_in_ibuffer, WORD32 n) { WORD32 k, shiftp, itemp = 0; for (k = 0; k < n; k++) { - - if (ixheaacd_abs32_sat(p_in_ibuffer[k]) > itemp) itemp = ixheaacd_abs32_sat(p_in_ibuffer[k]); + if (ixheaacd_abs32_sat(p_in_ibuffer[k]) > itemp) + itemp = ixheaacd_abs32_sat(p_in_ibuffer[k]); } shiftp = ixheaacd_norm32(itemp); @@ -400,8 +400,7 @@ static WORD32 ixheaacd_fd_imdct_short(ia_usac_data_struct *usac_data, p_out_buffer[k] = ((FLOAT32)p_out_ibuffer[k]) * qfac; } err_code = ixheaacd_lpd_bpf_fix(usac_data, 1, p_out_buffer, st); - if(err_code != 0) - return err_code; + if (err_code != 0) return err_code; for (k = 0; k < ixheaacd_drc_offset->n_long; k++) { p_out_ibuffer[k] = (WORD32)(p_out_buffer[k] * (1 << 15)); @@ -498,8 +497,7 @@ static WORD32 ixheaacd_fd_imdct_long(ia_usac_data_struct *usac_data, p_out_buffer[k] = ((FLOAT32)p_out_ibuffer[k]) * qfac; } err_code = ixheaacd_lpd_bpf_fix(usac_data, 0, p_out_buffer, st); - if(err_code != 0) - return err_code; + if (err_code != 0) return err_code; for (k = 0; k < ixheaacd_drc_offset->n_long; k++) { p_out_ibuffer[k] = (WORD32)(p_out_buffer[k] * (1 << 15)); diff --git a/decoder/ixheaacd_init_config.c b/decoder/ixheaacd_init_config.c index fe02d9b..0fe2fa7 100644 --- a/decoder/ixheaacd_init_config.c +++ b/decoder/ixheaacd_init_config.c @@ -85,30 +85,28 @@ 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}; +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}; - WORD32 index; - WORD32 tbl_size = sizeof(sampling_rate_tbl)/sizeof(WORD32) - 1; + WORD32 index; + 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; - } + for (index = 0; index < tbl_size; index++) { + if (sampling_rate_tbl[index] == sampling_freq) break; + } - if (index > tbl_size) { - return tbl_size - 1; - } + if (index > tbl_size) { + return tbl_size - 1; + } - return index; + return index; } UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx, WORD32 *output_framelength, WORD32 *block_size, - WORD32 *output_samples, - WORD32 * sample_rate_layer, - UWORD32 * sample_freq_indx) { + WORD32 *output_samples, WORD32 *sample_rate_layer, + UWORD32 *sample_freq_indx) { UWORD32 sbr_ratio_index = 0x0FF; *output_framelength = -1; @@ -151,7 +149,6 @@ UWORD32 ixheaacd_sbr_params(UWORD32 core_sbr_framelength_idx, *sample_freq_indx = ixheaacd_get_sample_freq_indx(*sample_rate_layer); - return sbr_ratio_index; } @@ -236,11 +233,9 @@ VOID ixheaacd_sbr_config(ia_bit_buf_struct *it_bit_buff, WORD32 ixheaacd_ext_element_config( ia_bit_buf_struct *it_bit_buff, - ia_usac_dec_element_config_struct *pstr_usac_element_config - , - UWORD8 *ptr_usac_ext_ele_payload, WORD32 *ptr_usac_ext_ele_payload_len - ,WORD32 *preroll_flag - ) { + ia_usac_dec_element_config_struct *pstr_usac_element_config, + UWORD8 *ptr_usac_ext_ele_payload, WORD32 *ptr_usac_ext_ele_payload_len, + WORD32 *preroll_flag) { UWORD32 usac_ext_element_type, usac_ext_element_config_length, flag; UWORD32 i; @@ -249,8 +244,7 @@ WORD32 ixheaacd_ext_element_config( ixheaacd_read_escape_value(it_bit_buff, &(usac_ext_element_config_length), 4, 8, 16); - if(usac_ext_element_config_length >= 768) - return -1; + if (usac_ext_element_config_length >= 768) return -1; flag = ixheaacd_read_bits_buf(it_bit_buff, 1); @@ -274,7 +268,7 @@ WORD32 ixheaacd_ext_element_config( case ID_EXT_ELE_FILL: break; case ID_EXT_ELE_AUDIOPREROLL: - *preroll_flag=1; + *preroll_flag = 1; break; case ID_EXT_ELE_UNI_DRC: for (i = 0; i < usac_ext_element_config_length; i++) { @@ -375,7 +369,7 @@ WORD32 ixheaacd_decoder_config( ixheaacd_read_escape_value( it_bit_buff, &(pstr_usac_decoder_config->num_elements), 4, 8, 16); pstr_usac_decoder_config->num_elements += 1; - pstr_usac_decoder_config->preroll_flag=0; + pstr_usac_decoder_config->preroll_flag = 0; if (pstr_usac_decoder_config->num_elements > USAC_MAX_ELEMENTS) { return -1; @@ -406,8 +400,8 @@ WORD32 ixheaacd_decoder_config( case ID_USAC_CPE: ixheaacd_cpe_config(it_bit_buff, pstr_usac_element_config, sbr_ratio_index); - if (pstr_usac_element_config->stereo_config_index > 1 && *chan <2) - return -1; + if (pstr_usac_element_config->stereo_config_index > 1 && *chan < 2) + return -1; break; @@ -419,12 +413,10 @@ WORD32 ixheaacd_decoder_config( case ID_USAC_EXT: err = ixheaacd_ext_element_config( - it_bit_buff, pstr_usac_element_config - , + it_bit_buff, pstr_usac_element_config, &pstr_usac_decoder_config->usac_ext_ele_payload_buf[elem_idx][0], - &pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx] - ,&(pstr_usac_decoder_config->preroll_flag) - ); + &pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx], + &(pstr_usac_decoder_config->preroll_flag)); if (pstr_usac_decoder_config->usac_ext_ele_payload_len[elem_idx] > 0) { pstr_usac_decoder_config->usac_ext_ele_payload_present[elem_idx] = 1; @@ -443,8 +435,7 @@ WORD32 ixheaacd_decoder_config( WORD32 ixheaacd_config_extension( ia_bit_buf_struct *it_bit_buff, - ia_usac_decoder_config_struct *pstr_usac_decoder_config - ) { + ia_usac_decoder_config_struct *pstr_usac_decoder_config) { UWORD32 i, j; UWORD32 num_config_extensions; UWORD32 usac_config_ext_type, usac_config_ext_len; @@ -539,15 +530,14 @@ WORD32 ixheaacd_config(ia_bit_buf_struct *it_bit_buff, err = ixheaacd_decoder_config( it_bit_buff, &(pstr_usac_conf->str_usac_dec_config), - ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index),chan); + ixheaacd_sbr_ratio(pstr_usac_conf->core_sbr_framelength_index), chan); if (err != 0) return -1; tmp = ixheaacd_read_bits_buf(it_bit_buff, 1); if (tmp) { err = ixheaacd_config_extension(it_bit_buff, - &pstr_usac_conf->str_usac_dec_config - ); + &pstr_usac_conf->str_usac_dec_config); if (err != 0) return -1; } diff --git a/decoder/ixheaacd_lpc.c b/decoder/ixheaacd_lpc.c index ca0546f..70c514f 100644 --- a/decoder/ixheaacd_lpc.c +++ b/decoder/ixheaacd_lpc.c @@ -203,9 +203,9 @@ static VOID ixheaacd_lsf_2_lsp_conversion_float(FLOAT32 lsf[], FLOAT32 lsp[], } static WORD32 ixheaacd_bass_post_filter(FLOAT32 *synth_sig, WORD32 *pitch, - FLOAT32 *pitch_gain, FLOAT32 *synth_out, - WORD32 len_fr, WORD32 len2, - FLOAT32 bpf_prev[]) { + FLOAT32 *pitch_gain, FLOAT32 *synth_out, + WORD32 len_fr, WORD32 len2, + FLOAT32 bpf_prev[]) { WORD32 i, j, sf, num_subfr, pitch_lag, lg; FLOAT32 x_energy, xy_corr, y_energy, norm_corr, energy, gain, tmp, alpha; FLOAT32 noise_buf[FILTER_DELAY + (2 * LEN_SUBFR)], *noise_tmp1, *noise_tmp2, @@ -223,8 +223,7 @@ static WORD32 ixheaacd_bass_post_filter(FLOAT32 *synth_sig, WORD32 *pitch, for (num_subfr = 0; num_subfr < len_fr; num_subfr += LEN_SUBFR, sf++) { pitch_lag = pitch[sf]; gain = pitch_gain[sf]; - if(((pitch_lag >> 1) + 96 - num_subfr) > MAX_PITCH) - return -1; + if (((pitch_lag >> 1) + 96 - num_subfr) > MAX_PITCH) return -1; if (gain > 1.0f) gain = 1.0f; if (gain < 0.0f) gain = 0.0f; @@ -413,9 +412,9 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, } else { fac_length = len_subfrm / 2; } - if((pstr_td_frame_data->fac_data[0] < 0) || (pstr_td_frame_data->fac_data[0] > 128)) - { - return -1; + if ((pstr_td_frame_data->fac_data[0] < 0) || + (pstr_td_frame_data->fac_data[0] > 128)) { + return -1; } gain = ixheaacd_pow_10_i_by_128[pstr_td_frame_data->fac_data[0]]; @@ -605,10 +604,11 @@ WORD32 ixheaacd_lpd_dec(ia_usac_data_struct *usac_data, if (mod[3] == 0) { err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr, - synth_delay, st->bpf_prev); + synth_delay, st->bpf_prev); } else { - err = ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr, - synth_delay - (len_subfrm / 2), st->bpf_prev); + err = + ixheaacd_bass_post_filter(synth, pitch, pitch_gain, fsynth, len_fr, + synth_delay - (len_subfrm / 2), st->bpf_prev); } return err; } @@ -657,8 +657,9 @@ WORD32 ixheaacd_lpd_dec_update(ia_usac_lpd_decoder_handle tddec, return err; } -WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, WORD32 is_short_flag, - FLOAT32 out_buffer[], ia_usac_lpd_decoder_handle st) { +WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, + WORD32 is_short_flag, FLOAT32 out_buffer[], + ia_usac_lpd_decoder_handle st) { WORD32 i, tp, k; float synth_buf[MAX_PITCH + SYNTH_DELAY_LMAX + LEN_SUPERFRAME]; float signal_out[LEN_SUPERFRAME]; @@ -702,13 +703,10 @@ WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, WORD32 is_short_flag for (i = 0; i < num_subfr_by2 + 2; i++) { tp = pitch[i]; - if((i * LEN_SUBFR + MAX_PITCH) < tp) - { - return -1; - } - else if((i * LEN_SUBFR + MAX_PITCH - tp) >= 1883) - { - return -1; + if ((i * LEN_SUBFR + MAX_PITCH) < tp) { + return -1; + } else if ((i * LEN_SUBFR + MAX_PITCH - tp) >= 1883) { + return -1; } if (pitch_gain[i] > 0.0f) { synth_corr = 0.0f, synth_energy = 1e-6f; @@ -723,11 +721,10 @@ WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, WORD32 is_short_flag } 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, - st->bpf_prev); - if(err != 0) - return err; + (lpd_sbf_len + 2) * LEN_SUBFR + LEN_SUBFR, + len_fr - (lpd_sbf_len + 2) * LEN_SUBFR, + st->bpf_prev); + if (err != 0) return err; ixheaacd_mem_cpy(signal_out, out_buffer, (lpd_sbf_len + 2) * LEN_SUBFR + LEN_SUBFR); diff --git a/decoder/ixheaacd_lpfuncs.c b/decoder/ixheaacd_lpfuncs.c index 747dd7c..06fce57 100644 --- a/decoder/ixheaacd_lpfuncs.c +++ b/decoder/ixheaacd_lpfuncs.c @@ -139,7 +139,7 @@ VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, ixheaacd_mult32x16in32(coef[SIZE08 + i], window_long[2 * i]), (q_shift + 1)); - accu = ixheaacd_add32_sat(temp1 , ((WORD32)prev[i] << 16)); + accu = ixheaacd_add32_sat(temp1, ((WORD32)prev[i] << 16)); out[ch_fac * i] = ixheaacd_round16(accu << 1); accu = ixheaacd_shl32_dir_sat_limit( @@ -192,10 +192,11 @@ VOID ixheaacd_process_win_seq(WORD32 *coef, WORD32 *prev, WORD16 *out, *out1 = ixheaacd_round16(accu << 2); out1 += ch_fac; - accu = ixheaacd_sub32_sat(ixheaacd_shl32_dir_sat_limit( - ixheaacd_mult32x16in32(ixheaacd_negate32_sat(temp_coef), win2), - q_shift), - ixheaacd_mult32x16in32_drc(prev1, win4)); + accu = ixheaacd_sub32_sat( + ixheaacd_shl32_dir_sat_limit( + ixheaacd_mult32x16in32(ixheaacd_negate32_sat(temp_coef), win2), + q_shift), + ixheaacd_mult32x16in32_drc(prev1, win4)); *out2 = ixheaacd_round16(accu << 2); out2 -= ch_fac; } diff --git a/decoder/ixheaacd_main.h b/decoder/ixheaacd_main.h index bf80bda..55b8eb3 100644 --- a/decoder/ixheaacd_main.h +++ b/decoder/ixheaacd_main.h @@ -221,7 +221,8 @@ WORD32 ixheaacd_fwd_alias_cancel_tool( WORD32 fac_length, FLOAT32 *iaq, WORD32 gain); WORD32 ixheaacd_lpd_bpf_fix(ia_usac_data_struct *usac_data, WORD32 is_short, - FLOAT32 out_buffer[], ia_usac_lpd_decoder_handle st); + FLOAT32 out_buffer[], + ia_usac_lpd_decoder_handle st); VOID ixheaacd_reset_acelp_data_fix(ia_usac_data_struct *usac_data, ia_usac_lpd_decoder_handle st, diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c index fd3b632..890ce15 100644 --- a/decoder/ixheaacd_mps_dec.c +++ b/decoder/ixheaacd_mps_dec.c @@ -79,9 +79,9 @@ 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; -VOID ixheaacd_mps_create(ia_mps_dec_state_struct* self, - WORD32 bs_frame_len, WORD32 residual_coding, - ia_usac_dec_mps_config_struct* mps212_config) { +VOID ixheaacd_mps_create(ia_mps_dec_state_struct* self, WORD32 bs_frame_len, + WORD32 residual_coding, + ia_usac_dec_mps_config_struct* mps212_config) { WORD32 num_ch; WORD32 err_code = 0; @@ -272,8 +272,8 @@ VOID ixheaacd_mps_create_w(ia_mps_dec_state_struct* self) { ixheaacd_mps_mix_res_decor(self); } WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, - FLOAT32** input_buffer[4], - FLOAT32 (*output_buffer)[4096]) { + FLOAT32** input_buffer[4], + FLOAT32 (*output_buffer)[4096]) { WORD32 ch, ts, qs; WORD32 time_slots = self->time_slots; WORD32 in_ch_count = self->in_ch_count + self->res_ch_count; @@ -319,8 +319,7 @@ WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, } err = ixheaacd_mps_temp_process(self); - if(err) - return err; + if (err) return err; self->parse_nxt_frame = 1; return 0; diff --git a/decoder/ixheaacd_mps_interface.h b/decoder/ixheaacd_mps_interface.h index 7a6412d..7587773 100644 --- a/decoder/ixheaacd_mps_interface.h +++ b/decoder/ixheaacd_mps_interface.h @@ -20,15 +20,15 @@ #ifndef IXHEAACD_MPS_INTERFACE_H #define IXHEAACD_MPS_INTERFACE_H -VOID 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_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); WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, FLOAT32** pointers[4], - FLOAT32 (*out_samples)[4096]); + FLOAT32 (*out_samples)[4096]); #endif diff --git a/decoder/ixheaacd_mps_temp_process.c b/decoder/ixheaacd_mps_temp_process.c index b7ca817..43e5781 100644 --- a/decoder/ixheaacd_mps_temp_process.c +++ b/decoder/ixheaacd_mps_temp_process.c @@ -234,10 +234,9 @@ WORD32 ixheaacd_mps_temp_process(ia_mps_dec_state_struct* self) { for (ch = 0; ch < self->out_ch_count; ch++) { err = ixheaacd_sbr_dec_from_mps(&self->qmf_out_dir[ch][0][0].re, - self->p_sbr_dec[ch], self->p_sbr_frame[ch], - self->p_sbr_header[ch]); - if(err) - return err; + self->p_sbr_dec[ch], self->p_sbr_frame[ch], + self->p_sbr_header[ch]); + if (err) return err; } ixheaacd_mps_synt_calc(self); diff --git a/decoder/ixheaacd_process.c b/decoder/ixheaacd_process.c index ba4558b..b87b61a 100644 --- a/decoder/ixheaacd_process.c +++ b/decoder/ixheaacd_process.c @@ -147,8 +147,7 @@ static VOID ixheaacd_sbr_ext_data_read( cnt_bits_in = it_bit_buff->cnt_bits; count = (it_bit_buff->cnt_bits) >> 3; if (count > 0) { - if ( - (esbr_bit_str->no_elements < MAXNRSBRELEMENTS)) { + if ((esbr_bit_str->no_elements < MAXNRSBRELEMENTS)) { esbr_bit_str->str_sbr_ele[esbr_bit_str->no_elements].extension_type = EXT_SBR_DATA; esbr_bit_str->str_sbr_ele[esbr_bit_str->no_elements].size_payload = count; @@ -168,10 +167,8 @@ static VOID ixheaacd_sbr_ext_data_read( static WORD32 ixheaacd_read_ext_element( UWORD32 usac_ext_element_default_length, - UWORD32 usac_ext_element_payload_frag, ia_bit_buf_struct *it_bit_buff - , - ia_usac_decoder_config_struct *pstr_usac_dec_config, WORD32 elem_idx - ) { + UWORD32 usac_ext_element_payload_frag, ia_bit_buf_struct *it_bit_buff, + ia_usac_decoder_config_struct *pstr_usac_dec_config, WORD32 elem_idx) { UWORD32 usac_ext_element_present; UWORD32 usac_ext_element_use_dft_length; UWORD32 pay_load_length, tmp; @@ -193,7 +190,7 @@ static WORD32 ixheaacd_read_ext_element( } } if ((it_bit_buff->cnt_bits >> 3) < (WORD32)pay_load_length) - return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; + return IA_ENHAACPLUS_DEC_EXE_NONFATAL_INSUFFICIENT_INPUT_BYTES; if (pay_load_length > 0) { if (usac_ext_element_payload_frag) tmp = ixheaacd_read_bits_buf(it_bit_buff, 2); @@ -206,12 +203,10 @@ static WORD32 ixheaacd_read_ext_element( } pstr_usac_dec_config->usac_ext_gain_payload_len += pay_load_length; } else { - it_bit_buff->ptr_read_next = it_bit_buff->ptr_read_next + pay_load_length; it_bit_buff->cnt_bits = it_bit_buff->cnt_bits - (WORD32)(pay_load_length * 8); - } } } @@ -313,15 +308,15 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, case ID_USAC_CPE: nr_core_coder_channels = (stereo_config_index == 1) ? 1 : 2; - if((stereo_config_index > 1) && (p_state_aac_dec->num_of_output_ch<2)) - return -1; + if ((stereo_config_index > 1) && + (p_state_aac_dec->num_of_output_ch < 2)) + return -1; goto core_data_extracting; case ID_USAC_LFE: nr_core_coder_channels = 1; core_data_extracting: - if(ch_offset >= MAX_NUM_CHANNELS) - return -1; + if (ch_offset >= MAX_NUM_CHANNELS) return -1; err = ixheaacd_core_coder_data(ele_id, pstr_usac_data, elem_idx, &ch_offset, it_bit_buff, nr_core_coder_channels); @@ -346,16 +341,14 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, pstr_usac_data, it_bit_buff, stereo_config_index, nr_core_coder_channels, pstr_dec_data->str_usac_data.audio_object_type); - if(err_code < 0) - return err_code; + if (err_code < 0) return err_code; } if (stereo_config_index > 0) { FLOAT32 **ptr_inp[2 * 2]; WORD32 ch; - *num_out_channels = - p_state_aac_dec->mps_dec_handle.out_ch_count; + *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, @@ -387,9 +380,8 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, } err = ixheaacd_mps_apply(&p_state_aac_dec->mps_dec_handle, ptr_inp, - pstr_usac_data->time_sample_vector); - if(err) - return err; + pstr_usac_data->time_sample_vector); + if (err) return err; } ch_offset += nr_core_coder_channels; @@ -398,13 +390,11 @@ WORD32 ixheaacd_usac_process(ia_dec_data_struct *pstr_dec_data, case ID_USAC_EXT: { ia_usac_dec_element_config_struct *pusac_element_config = &pstr_usac_dec_config->str_usac_element_config[elem_idx]; - err = ixheaacd_read_ext_element(pusac_element_config->usac_ext_eleme_def_len, - pusac_element_config->usac_ext_elem_pld_frag, - it_bit_buff, - pstr_usac_dec_config, elem_idx - ); - if (err != 0) - return err; + err = ixheaacd_read_ext_element( + pusac_element_config->usac_ext_eleme_def_len, + pusac_element_config->usac_ext_elem_pld_frag, it_bit_buff, + pstr_usac_dec_config, elem_idx); + if (err != 0) return err; break; } diff --git a/decoder/ixheaacd_qmf_dec.c b/decoder/ixheaacd_qmf_dec.c index a01b8ec..ffc0c84 100644 --- a/decoder/ixheaacd_qmf_dec.c +++ b/decoder/ixheaacd_qmf_dec.c @@ -983,4 +983,3 @@ VOID ixheaacd_cplx_synt_qmffilt( qmf_bank->filter_pos_syn = filter_coeff; qmf_bank->ixheaacd_drc_offset = ixheaacd_drc_offset; } - diff --git a/decoder/ixheaacd_qmf_dec.h b/decoder/ixheaacd_qmf_dec.h index 96356ee..89f2e5f 100644 --- a/decoder/ixheaacd_qmf_dec.h +++ b/decoder/ixheaacd_qmf_dec.h @@ -187,15 +187,14 @@ VOID ixheaacd_esbr_cos_sin_mod(WORD32 *subband, WORD32 *p_twiddle, WORD32 *p_dig_rev_tbl); VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, - ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); -VOID ixheaacd_sbr_pre_twiddle(WORD32 *p_xre, WORD32 *p_xim, - WORD16 *p_twiddles); +VOID ixheaacd_sbr_pre_twiddle(WORD32 *p_xre, WORD32 *p_xim, WORD16 *p_twiddles); -VOID ixheaacd_inv_emodulation( - WORD32 *qmf_real, ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); +VOID ixheaacd_inv_emodulation(WORD32 *qmf_real, + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); VOID ixheaacd_pretwdct2(WORD32 *inp, WORD32 *out_fwd); @@ -208,8 +207,8 @@ VOID ixheaacd_dct2_32(WORD32 *inp, WORD32 *out, WORD16 *filter_states); VOID ixheaacd_inv_modulation_lp(WORD32 *qmf_real, WORD16 *filter_states, - ia_sbr_qmf_filter_bank_struct *syn_qmf, - ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); + ia_sbr_qmf_filter_bank_struct *syn_qmf, + ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); VOID ixheaacd_fftposttw(WORD32 *out, ia_qmf_dec_tables_struct *qmf_dec_tables_ptr); diff --git a/decoder/ixheaacd_qmf_poly.h b/decoder/ixheaacd_qmf_poly.h index debdad5..8a67480 100644 --- a/decoder/ixheaacd_qmf_poly.h +++ b/decoder/ixheaacd_qmf_poly.h @@ -26,8 +26,8 @@ double *ixheaacd_interpo_esbr_fcoff(const double *orig_prot, WORD32 no, WORD32 ixheaacd_complex_anal_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer); WORD32 ixheaacd_real_synth_filt(ia_esbr_hbe_txposer_struct *ptr_hbe_txposer, - WORD32 num_columns, FLOAT32 qmf_buf_real[][64], - FLOAT32 qmf_buf_imag[][64]); + WORD32 num_columns, FLOAT32 qmf_buf_real[][64], + FLOAT32 qmf_buf_imag[][64]); VOID ixheaacd_cmplx_anal_fft_p2(FLOAT32 *inp, FLOAT32 *out, WORD32 n_points); diff --git a/decoder/ixheaacd_sbr_dec.c b/decoder/ixheaacd_sbr_dec.c index 31beb76..1adc72a 100644 --- a/decoder/ixheaacd_sbr_dec.c +++ b/decoder/ixheaacd_sbr_dec.c @@ -555,18 +555,19 @@ VOID ixheaacd_esbr_synthesis_filt_block( } WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, - ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, - ia_ps_dec_struct *ptr_ps_dec, - ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, - ia_sbr_scale_fact_struct *ptr_sbr_sf_r, - FLAG apply_processing, FLAG low_pow_flag, - WORD32 *ptr_work_buf_core, - ia_sbr_tables_struct *sbr_tables_ptr, - ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, - ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, - WORD32 drc_sbr_factors[][64], WORD32 audio_object_type) { + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct *ptr_frame_data, + ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, + ia_ps_dec_struct *ptr_ps_dec, + ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, + ia_sbr_scale_fact_struct *ptr_sbr_sf_r, + FLAG apply_processing, FLAG low_pow_flag, + WORD32 *ptr_work_buf_core, + ia_sbr_tables_struct *sbr_tables_ptr, + ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, + ia_pvc_data_struct *ptr_pvc_data, FLAG drc_on, + WORD32 drc_sbr_factors[][64], + WORD32 audio_object_type) { WORD i; WORD slot, reserve; WORD save_lb_scale; @@ -715,8 +716,7 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), ptr_frame_data->pitch_in_bins); - if(err_code) - return err_code; + if (err_code) return err_code; if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { ixheaacd_hbe_repl_spec( @@ -731,15 +731,15 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, if (!mps_sbr_flag && apply_processing) { WORD32 err_code = 0; - err_code = ixheaacd_generate_hf(ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), - ptr_frame_data, ptr_header_data); - if(err_code) - return err_code; + err_code = ixheaacd_generate_hf( + ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->ph_vocod_qmf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->ph_vocod_qmf_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), ptr_frame_data, + ptr_header_data); + if (err_code) return err_code; ptr_pvc_data->pvc_rate = ptr_header_data->upsamp_fac; @@ -759,22 +759,21 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, ptr_pvc_data->prev_pvc_rate = ptr_pvc_data->pvc_rate; ptr_frame_data->pstr_sbr_header = ptr_header_data; - if(ptr_header_data->hbe_flag == 0) - ixheaacd_sbr_env_calc(ptr_frame_data, - ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), - NULL, - ptr_sbr_dec->scratch_buff, pvc_dec_out_buf); + if (ptr_header_data->hbe_flag == 0) + ixheaacd_sbr_env_calc( + ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), NULL, + ptr_sbr_dec->scratch_buff, pvc_dec_out_buf); else - ixheaacd_sbr_env_calc(ptr_frame_data, - ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), - ptr_sbr_dec->p_hbe_txposer->x_over_qmf, - ptr_sbr_dec->scratch_buff, pvc_dec_out_buf); + ixheaacd_sbr_env_calc( + ptr_frame_data, ptr_sbr_dec->sbr_qmf_out_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->sbr_qmf_out_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_real + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->qmf_buf_imag + (SBR_HF_ADJ_OFFSET), + ptr_sbr_dec->p_hbe_txposer->x_over_qmf, ptr_sbr_dec->scratch_buff, + pvc_dec_out_buf); } else { for (i = 0; i < 64; i++) { @@ -1015,10 +1014,10 @@ WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, } WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, - ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct *ptr_frame_data, - FLAG apply_processing, FLAG low_pow_flag, - ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) { + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct *ptr_frame_data, + FLAG apply_processing, FLAG low_pow_flag, + ia_sbr_tables_struct *ptr_sbr_tables, WORD ch_fac) { WORD32 i; WORD32 op_delay; @@ -1110,8 +1109,7 @@ WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, ptr_sbr_dec->ph_vocod_qmf_real + (op_delay + SBR_HF_ADJ_OFFSET), ptr_sbr_dec->ph_vocod_qmf_imag + (op_delay + SBR_HF_ADJ_OFFSET), ptr_frame_data->pitch_in_bins); - if(err) - return err; + if (err) return err; if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { ixheaacd_hbe_repl_spec( @@ -1139,7 +1137,7 @@ WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, } WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, - VOID *p_sbr_frame, VOID *p_sbr_header) { + VOID *p_sbr_frame, VOID *p_sbr_header) { WORD32 i, k; ia_sbr_frame_info_data_struct *ptr_frame_data = (ia_sbr_frame_info_data_struct *)p_sbr_frame; @@ -1204,32 +1202,32 @@ WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, ptr_header_data->pstr_freq_band_data->qmf_sb_prev = ptr_header_data->pstr_freq_band_data->sub_band_start; - err = ixheaacd_generate_hf(ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, - NULL, - ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, - ptr_frame_data, ptr_header_data); - if(err) - return err; + err = ixheaacd_generate_hf( + ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, NULL, NULL, + ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, ptr_frame_data, + ptr_header_data); + if (err) return err; ptr_frame_data->pstr_sbr_header = ptr_header_data; ptr_frame_data->sbr_mode = ORIG_SBR; ptr_frame_data->prev_sbr_mode = ORIG_SBR; - if(ptr_header_data->hbe_flag == 0) - ixheaacd_sbr_env_calc( - ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, - NULL, ptr_sbr_dec->scratch_buff, NULL); + if (ptr_header_data->hbe_flag == 0) + ixheaacd_sbr_env_calc(ptr_frame_data, + ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, + NULL, ptr_sbr_dec->scratch_buff, NULL); else - ixheaacd_sbr_env_calc( - ptr_frame_data, ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, - ptr_sbr_dec->p_hbe_txposer->x_over_qmf, ptr_sbr_dec->scratch_buff, NULL); + ixheaacd_sbr_env_calc(ptr_frame_data, + ptr_sbr_dec->mps_sbr_qmf_buf_real + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_sbr_qmf_buf_imag + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_qmf_buf_real + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->mps_qmf_buf_imag + SBR_HF_ADJ_OFFSET, + ptr_sbr_dec->p_hbe_txposer->x_over_qmf, + ptr_sbr_dec->scratch_buff, NULL); for (i = 0; i < no_bins; i++) { FLOAT32 *p_loc_mps_qmf_output = diff --git a/decoder/ixheaacd_sbr_dec.h b/decoder/ixheaacd_sbr_dec.h index 6585c51..ac92ef5 100644 --- a/decoder/ixheaacd_sbr_dec.h +++ b/decoder/ixheaacd_sbr_dec.h @@ -148,21 +148,20 @@ typedef struct ia_sbr_pers_struct { } ia_sbr_pers_struct; WORD32 ixheaacd_sbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, WORD16 *ptr_time_data, - ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, - ia_ps_dec_struct *ptr_ps_dec, - ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, - ia_sbr_scale_fact_struct *ptr_sbr_sf_r, - FLAG apply_processing, FLAG low_pow_flag, - WORD32 *ptr_work_buf_core, - ia_sbr_tables_struct *sbr_tables_ptr, - ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, - ia_pvc_data_struct *ptr_pvc_data_str, FLAG drc_on, - WORD32 drc_sbr_factors[][64], WORD32 audio_object_type); - -WORD16 ixheaacd_create_sbrdec( - ixheaacd_misc_tables *pstr_common_table, + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct *ptr_frame_data, + ia_sbr_prev_frame_data_struct *ptr_frame_data_prev, + ia_ps_dec_struct *ptr_ps_dec, + ia_sbr_qmf_filter_bank_struct *ptr_qmf_synth_bank_r, + ia_sbr_scale_fact_struct *ptr_sbr_sf_r, + FLAG apply_processing, FLAG low_pow_flag, + WORD32 *ptr_work_buf_core, + ia_sbr_tables_struct *sbr_tables_ptr, + ixheaacd_misc_tables *pstr_common_tables, WORD ch_fac, + ia_pvc_data_struct *ptr_pvc_data_str, FLAG drc_on, + WORD32 drc_sbr_factors[][64], WORD32 audio_object_type); + +WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table, ia_sbr_channel_struct *ptr_sbr_channel, ia_sbr_header_data_struct *ptr_header_data, WORD16 chan, FLAG down_sample_flag, @@ -172,14 +171,14 @@ WORD16 ixheaacd_create_sbrdec( #define MAX_NUM_QMF_BANDS_ESBR 128 WORD32 ixheaacd_sbr_dec_from_mps(FLOAT32 *p_mps_qmf_output, VOID *p_sbr_dec, - VOID *p_sbr_frame, VOID *p_sbr_header); + VOID *p_sbr_frame, VOID *p_sbr_header); WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer, - FLOAT32 qmf_buf_real[][64], - FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, - FLOAT32 pv_qmf_buf_real[][64], - FLOAT32 pv_qmf_buf_imag[][64], - WORD32 pitch_in_bins); + FLOAT32 qmf_buf_real[][64], + FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, + FLOAT32 pv_qmf_buf_real[][64], + FLOAT32 pv_qmf_buf_imag[][64], + WORD32 pitch_in_bins); VOID ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 input_real[][64], FLOAT32 input_imag[][64], @@ -188,13 +187,13 @@ VOID ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, FLOAT32 *scratch_buff, FLOAT32 *env_out); WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], - FLOAT32 ptr_src_buf_imag[][64], - FLOAT32 ptr_ph_vocod_buf_real[][64], - FLOAT32 ptr_ph_vocod_buf_imag[][64], - FLOAT32 ptr_dst_buf_real[][64], - FLOAT32 ptr_dst_buf_imag[][64], - ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_sbr_header_data_struct *ptr_header_data); + FLOAT32 ptr_src_buf_imag[][64], + FLOAT32 ptr_ph_vocod_buf_real[][64], + FLOAT32 ptr_ph_vocod_buf_imag[][64], + FLOAT32 ptr_dst_buf_real[][64], + FLOAT32 ptr_dst_buf_imag[][64], + ia_sbr_frame_info_data_struct *ptr_frame_data, + ia_sbr_header_data_struct *ptr_header_data); VOID ixheaacd_clr_subsamples(WORD32 *ptr_qmf_buf, WORD32 num, WORD32 size); @@ -217,17 +216,17 @@ WORD32 ixheaacd_sbr_read_pvc_sce(ia_sbr_frame_info_data_struct *ptr_frame_data, ia_sbr_header_data_struct *ptr_header_data); WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer, - FLOAT32 qmf_buf_real[][64], - FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, - FLOAT32 pv_qmf_buf_real[][64], - FLOAT32 pv_qmf_buf_imag[][64], - WORD32 pitch_in_bins); + FLOAT32 qmf_buf_real[][64], + FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, + FLOAT32 pv_qmf_buf_real[][64], + FLOAT32 pv_qmf_buf_imag[][64], + WORD32 pitch_in_bins); WORD32 ixheaacd_esbr_dec(ia_sbr_dec_struct *ptr_sbr_dec, - ia_sbr_header_data_struct *ptr_header_data, - ia_sbr_frame_info_data_struct *ptr_frame_data, - FLAG apply_processing, FLAG low_pow_flag, - ia_sbr_tables_struct *sbr_tables_ptr, WORD32 ch_fac); + ia_sbr_header_data_struct *ptr_header_data, + ia_sbr_frame_info_data_struct *ptr_frame_data, + FLAG apply_processing, FLAG low_pow_flag, + ia_sbr_tables_struct *sbr_tables_ptr, WORD32 ch_fac); VOID ixheaacd_hbe_repl_spec(WORD32 x_over_qmf[MAX_NUM_PATCHES], FLOAT32 qmf_buf_real[][64], diff --git a/decoder/ixheaacd_sbrdec_initfuncs.c b/decoder/ixheaacd_sbrdec_initfuncs.c index b61d8c8..7ec8ac8 100644 --- a/decoder/ixheaacd_sbrdec_initfuncs.c +++ b/decoder/ixheaacd_sbrdec_initfuncs.c @@ -601,7 +601,6 @@ ia_handle_sbr_dec_inst_struct ixheaacd_init_sbr( ixheaacd_esbr_hbe_data_init(ptr_sbr_dec[1]->p_hbe_txposer, samp_per_frame, sbr_ratio_idx == SBR_UPSAMPLE_IDX_4_1 ? 1 : 0, output_frame_size, hbe_txposer_buffers); - } p_str_sbr_dec_inst->ptr_pvc_data_str->prev_first_bnd_idx = -1; @@ -769,8 +768,7 @@ static PLATFORM_INLINE WORD16 ixheaacd_create_sbr_env_calc( ixheaacd_reset_sbrenvelope_calc(hs); if ((chan == 0) && (audio_object_type == AOT_ER_AAC_ELD)) { - err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data, - pstr_common_table); + err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data, pstr_common_table); } return err; @@ -1107,9 +1105,9 @@ WORD16 ixheaacd_create_sbrdec(ixheaacd_misc_tables *pstr_common_table, ptr_sbr_channel->pstr_prev_frame_data = sbr_persistent_mem->pstr_prev_frame_data[chan]; - err = ixheaacd_create_sbr_env_calc( - pstr_common_table, &hs->str_sbr_calc_env, chan, - sbr_persistent_mem, ptr_header_data, audio_object_type); + err = ixheaacd_create_sbr_env_calc(pstr_common_table, &hs->str_sbr_calc_env, + chan, sbr_persistent_mem, ptr_header_data, + audio_object_type); if (err) { return (-1); diff --git a/decoder/ixheaacd_sbrdec_lpfuncs.c b/decoder/ixheaacd_sbrdec_lpfuncs.c index 1af42f1..0504f66 100644 --- a/decoder/ixheaacd_sbrdec_lpfuncs.c +++ b/decoder/ixheaacd_sbrdec_lpfuncs.c @@ -936,13 +936,13 @@ VOID ixheaacd_pre_processing(FLOAT32 ptr_src_buf_real[][64], } WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], - FLOAT32 ptr_src_buf_imag[][64], - FLOAT32 ptr_ph_vocod_buf_real[][64], - FLOAT32 ptr_ph_vocod_buf_imag[][64], - FLOAT32 ptr_dst_buf_real[][64], - FLOAT32 ptr_dst_buf_imag[][64], - ia_sbr_frame_info_data_struct *ptr_frame_data, - ia_sbr_header_data_struct *ptr_header_data) { + FLOAT32 ptr_src_buf_imag[][64], + FLOAT32 ptr_ph_vocod_buf_real[][64], + FLOAT32 ptr_ph_vocod_buf_imag[][64], + FLOAT32 ptr_dst_buf_real[][64], + FLOAT32 ptr_dst_buf_imag[][64], + ia_sbr_frame_info_data_struct *ptr_frame_data, + ia_sbr_header_data_struct *ptr_header_data) { WORD32 bw_index, i, k, k2, patch = 0; WORD32 co_var_len; WORD32 start_sample, end_sample, goal_sb; @@ -1073,8 +1073,7 @@ WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], patch = 0; while (sb < usb) { - if(MAX_NUM_PATCHES <= patch) - return -1; + if (MAX_NUM_PATCHES <= patch) return -1; ptr_frame_data->patch_param.start_subband[patch] = sb; num_bands_in_patch = goal_sb - sb; @@ -1111,7 +1110,7 @@ WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], } if (num_bands_in_patch <= 0) { - return -1; + return -1; } for (k2 = sb; k2 < sb + num_bands_in_patch; k2++) { @@ -1244,8 +1243,7 @@ WORD32 ixheaacd_generate_hf(FLOAT32 ptr_src_buf_real[][64], } } ptr_frame_data->patch_param.num_patches = patch; - if(patch >= (MAX_NUM_PATCHES + 1)) - return -1; + if (patch >= (MAX_NUM_PATCHES + 1)) return -1; for (i = 0; i < num_if_bands; i++) { bw_array_prev[i] = bw_array[i]; } diff --git a/decoder/ixheaacd_sbrdecoder.c b/decoder/ixheaacd_sbrdecoder.c index 1e53ba7..c40b37f 100644 --- a/decoder/ixheaacd_sbrdecoder.c +++ b/decoder/ixheaacd_sbrdecoder.c @@ -161,8 +161,7 @@ static WORD32 ixheaacd_sbr_dec_reset(ia_sbr_dec_struct *ptr_sbr_dec, ptr_header_data->pstr_freq_band_data->freq_band_table, ptr_header_data->pstr_freq_band_data->num_sf_bands, ptr_header_data->is_usf_4); - if(err) - return err; + if (err) return err; for (k = 0; k < 2; k++) { if (!((upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) && (k == 0))) { @@ -186,8 +185,7 @@ static WORD32 ixheaacd_sbr_dec_reset(ia_sbr_dec_struct *ptr_sbr_dec, ptr_sbr_dec->qmf_buf_imag + op_delay + xpos_delay, num_time_slots, ptr_sbr_dec->ph_vocod_qmf_real + op_delay, ptr_sbr_dec->ph_vocod_qmf_imag + op_delay, pitch_in_bins); - if(err) - return err; + if (err) return err; if (upsample_ratio_idx == SBR_UPSAMPLE_IDX_4_1) { ixheaacd_hbe_repl_spec(&ptr_sbr_dec->p_hbe_txposer->x_over_qmf[0], @@ -371,7 +369,8 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, stereo = 1; ptr_header_data[1] = ptr_header_data[0]; - memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0], sizeof(ia_sbr_header_data_struct)); + memcpy(self->pstr_sbr_header[1], self->pstr_sbr_header[0], + sizeof(ia_sbr_header_data_struct)); break; default: frame_status = 0; @@ -440,9 +439,7 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag, self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins, audio_object_type); - if(err < 0) - return err; - + if (err < 0) return err; } } @@ -473,9 +470,8 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, err = ixheaacd_calc_frq_bnd_tbls(ptr_header_data[k], self->pstr_common_tables); - if(err) - { - return err; + if (err) { + return err; } } } @@ -490,8 +486,7 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, &(pstr_sbr_channel[lr]->str_sbr_dec), ptr_header_data[k], low_pow_flag, self->pstr_common_tables, ptr_frame_data[k]->pitch_in_bins, audio_object_type); - if(err < 0) - return err; + if (err < 0) return err; } } ptr_header_data[k]->status = 0; @@ -531,8 +526,7 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, frame_status = ixheaacd_sbr_read_pvc_sce( ptr_frame_data[k], it_bit_buff, 0, self->ptr_pvc_data_str, self->pstr_sbr_tables, ptr_header_data[k]); - if(frame_status < 0) - return frame_status; + if (frame_status < 0) return frame_status; } } if (audio_object_type != AOT_ER_AAC_ELD) { @@ -671,8 +665,7 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables, self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, 0, NULL, audio_object_type); - if(err_code) - return err_code; + if (err_code) return err_code; } else { WORD32 err_code = 0; err_code = ixheaacd_sbr_dec( @@ -687,20 +680,18 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, pstr_drc_dec->drc_on, pstr_drc_dec->str_drc_channel_data[0].drc_factors_sbr, audio_object_type); - if(err_code) - return err_code; + if (err_code) return err_code; } if (!down_mix_flag && (stereo || dual_mono) && (num_channels == 2)) { pstr_sbr_channel[1]->str_sbr_dec.time_sample_buf = self->time_sample_buf[1]; if (ele_channels == 1 && usac_flag) { - WORD32 err_code = ixheaacd_esbr_dec(&pstr_sbr_channel[1]->str_sbr_dec, ptr_header_data[1], - ptr_frame_data[1], - (ptr_header_data[1]->sync_state == SBR_ACTIVE), - low_pow_flag, self->pstr_sbr_tables, ch_fac); - if(err_code) - return err_code; + WORD32 err_code = ixheaacd_esbr_dec( + &pstr_sbr_channel[1]->str_sbr_dec, ptr_header_data[1], + ptr_frame_data[1], (ptr_header_data[1]->sync_state == SBR_ACTIVE), + low_pow_flag, self->pstr_sbr_tables, ch_fac); + if (err_code) return err_code; } else { if (pstr_drc_dec == NULL) { WORD32 err_code = ixheaacd_sbr_dec( @@ -711,21 +702,19 @@ WORD16 ixheaacd_applysbr(ia_handle_sbr_dec_inst_struct self, low_pow_flag, sbr_scratch_struct->ptr_work_buf_core, self->pstr_sbr_tables, self->pstr_common_tables, ch_fac, self->ptr_pvc_data_str, 0, NULL, audio_object_type); - if(err_code) - return err_code; + if (err_code) return err_code; } else { - WORD32 err_code = ixheaacd_sbr_dec(&pstr_sbr_channel[1]->str_sbr_dec, - core_sample_buf + slot_element + 1, ptr_header_data[1], - ptr_frame_data[1], - pstr_sbr_channel[1]->pstr_prev_frame_data, NULL, NULL, - NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE), - low_pow_flag, sbr_scratch_struct->ptr_work_buf_core, - self->pstr_sbr_tables, self->pstr_common_tables, - ch_fac, self->ptr_pvc_data_str, pstr_drc_dec->drc_on, - pstr_drc_dec->str_drc_channel_data[1].drc_factors_sbr, - audio_object_type); - if(err_code) - return err_code; + WORD32 err_code = ixheaacd_sbr_dec( + &pstr_sbr_channel[1]->str_sbr_dec, + core_sample_buf + slot_element + 1, ptr_header_data[1], + ptr_frame_data[1], pstr_sbr_channel[1]->pstr_prev_frame_data, NULL, + NULL, NULL, (ptr_header_data[1]->sync_state == SBR_ACTIVE), + low_pow_flag, sbr_scratch_struct->ptr_work_buf_core, + self->pstr_sbr_tables, self->pstr_common_tables, ch_fac, + self->ptr_pvc_data_str, pstr_drc_dec->drc_on, + pstr_drc_dec->str_drc_channel_data[1].drc_factors_sbr, + audio_object_type); + if (err_code) return err_code; } } diff --git a/decoder/ixheaacd_sbrqmftrans.h b/decoder/ixheaacd_sbrqmftrans.h index 55455cb..7c3e61a 100644 --- a/decoder/ixheaacd_sbrqmftrans.h +++ b/decoder/ixheaacd_sbrqmftrans.h @@ -21,11 +21,11 @@ #define IXHEAACD_SBRQMFTRANS_H WORD32 ixheaacd_qmf_hbe_apply(ia_esbr_hbe_txposer_struct *h_hbe_txposer, - FLOAT32 qmf_buf_real[][64], - FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, - FLOAT32 pv_qmf_buf_real[][64], - FLOAT32 pv_qmf_buf_imag[][64], - WORD32 pitch_in_bins); + FLOAT32 qmf_buf_real[][64], + FLOAT32 qmf_buf_imag[][64], WORD32 num_columns, + FLOAT32 pv_qmf_buf_real[][64], + FLOAT32 pv_qmf_buf_imag[][64], + WORD32 pitch_in_bins); WORD32 ixheaacd_qmf_hbe_data_reinit( ia_esbr_hbe_txposer_struct *ptr_hbe_transposer_str, diff --git a/decoder/ixheaacd_spectrum_dec.c b/decoder/ixheaacd_spectrum_dec.c index 544df08..dff3713 100644 --- a/decoder/ixheaacd_spectrum_dec.c +++ b/decoder/ixheaacd_spectrum_dec.c @@ -393,8 +393,8 @@ WORD32 ixheaacd_fd_channel_stream( ixheaacd_scale_factor_data(info, tot_sfb, *max_sfb, info->sfb_per_sbk, ptr_code_book); - if((it_bit_buff->ptr_read_next > it_bit_buff->ptr_bit_buf_end - 3) && (it_bit_buff->size == it_bit_buff->max_size)) - { + if ((it_bit_buff->ptr_read_next > it_bit_buff->ptr_bit_buf_end - 3) && + (it_bit_buff->size == it_bit_buff->max_size)) { return -1; } @@ -433,8 +433,7 @@ WORD32 ixheaacd_fd_channel_stream( usac_data, max_spec_coefficients, noise_level, noise_offset, arth_size, it_bit_buff, *max_sfb, arith_reset_flag, noise_filling, chn); - if(err_code != 0) - return err_code; + if (err_code != 0) return err_code; usac_data->fac_data_present[chn] = ixheaacd_read_bits_buf(it_bit_buff, 1); diff --git a/decoder/ixheaacd_tns.h b/decoder/ixheaacd_tns.h index 9d3cad5..d252ddd 100644 --- a/decoder/ixheaacd_tns.h +++ b/decoder/ixheaacd_tns.h @@ -75,8 +75,10 @@ VOID ixheaacd_tns_ar_filter_fixed_armv7(WORD32 *spectrum, WORD32 size, WORD32 shift_value, WORD scale_spec); VOID ixheaacd_tns_ar_filter_fixed_non_neon_armv7(WORD32 *spectrum, WORD32 size, - WORD32 inc, WORD32 *lpc, WORD32 order, - WORD32 shift_value, WORD scale_spec); + WORD32 inc, WORD32 *lpc, + WORD32 order, + WORD32 shift_value, + WORD scale_spec); VOID ixheaacd_tns_ar_filter_fixed_armv8(WORD32 *spectrum, WORD32 size, WORD32 inc, WORD32 *lpc, WORD32 order, diff --git a/decoder/ixheaacd_type_def.h b/decoder/ixheaacd_type_def.h index 9ecded3..b762b2f 100644 --- a/decoder/ixheaacd_type_def.h +++ b/decoder/ixheaacd_type_def.h @@ -33,49 +33,33 @@ typedef char* pCHAR8; /* pc pCHAR8 pc_nmae 1 */ typedef signed char WORD8; /* b WORD8 b_name 1 */ typedef signed char* pWORD8; /* pb pWORD8 pb_nmae 1 */ -typedef unsigned char - UWORD8; /* ub UWORD8 ub_count 1 */ -typedef unsigned char* - pUWORD8; /* pub pUWORD8 pub_count 1 */ - -typedef signed short WORD16; /* s WORD16 s_count 2 */ -typedef signed short* pWORD16; /* ps pWORD16 ps_count 2 */ -typedef unsigned short - UWORD16; /* us UWORD16 us_count 2 */ -typedef unsigned short* - pUWORD16; /* pus pUWORD16 pus_count 2 */ - -typedef signed int WORD24; /* k WORD24 k_count 3 */ -typedef signed int* pWORD24; /* pk pWORD24 pk_count 3 */ -typedef unsigned int - UWORD24; /* uk UWORD24 uk_count 3 */ -typedef unsigned int* - pUWORD24; /* puk pUWORD24 puk_count 3 */ - -typedef signed int WORD32; /* i WORD32 i_count 4 */ -typedef signed int* pWORD32; /* pi pWORD32 pi_count 4 */ -typedef unsigned int - UWORD32; /* ui UWORD32 ui_count 4 */ -typedef unsigned int* - pUWORD32; /* pui pUWORD32 pui_count 4 */ - -typedef signed long long - WORD40; /* m WORD40 m_count 5 */ -typedef signed long long* - pWORD40; /* pm pWORD40 pm_count 5 */ -typedef unsigned long long - UWORD40; /* um UWORD40 um_count 5 */ -typedef unsigned long long* - pUWORD40; /* pum pUWORD40 pum_count 5 */ - -typedef signed long long - WORD64; /* h WORD64 h_count 8 */ -typedef signed long long* - pWORD64; /* ph pWORD64 ph_count 8 */ -typedef unsigned long long - UWORD64; /* uh UWORD64 uh_count 8 */ -typedef unsigned long long* - pUWORD64; /* puh pUWORD64 puh_count 8 */ +typedef unsigned char UWORD8; /* ub UWORD8 ub_count 1 */ +typedef unsigned char* pUWORD8; /* pub pUWORD8 pub_count 1 */ + +typedef signed short WORD16; /* s WORD16 s_count 2 */ +typedef signed short* pWORD16; /* ps pWORD16 ps_count 2 */ +typedef unsigned short UWORD16; /* us UWORD16 us_count 2 */ +typedef unsigned short* pUWORD16; /* pus pUWORD16 pus_count 2 */ + +typedef signed int WORD24; /* k WORD24 k_count 3 */ +typedef signed int* pWORD24; /* pk pWORD24 pk_count 3 */ +typedef unsigned int UWORD24; /* uk UWORD24 uk_count 3 */ +typedef unsigned int* pUWORD24; /* puk pUWORD24 puk_count 3 */ + +typedef signed int WORD32; /* i WORD32 i_count 4 */ +typedef signed int* pWORD32; /* pi pWORD32 pi_count 4 */ +typedef unsigned int UWORD32; /* ui UWORD32 ui_count 4 */ +typedef unsigned int* pUWORD32; /* pui pUWORD32 pui_count 4 */ + +typedef signed long long WORD40; /* m WORD40 m_count 5 */ +typedef signed long long* pWORD40; /* pm pWORD40 pm_count 5 */ +typedef unsigned long long UWORD40; /* um UWORD40 um_count 5 */ +typedef unsigned long long* pUWORD40; /* pum pUWORD40 pum_count 5 */ + +typedef signed long long WORD64; /* h WORD64 h_count 8 */ +typedef signed long long* pWORD64; /* ph pWORD64 ph_count 8 */ +typedef unsigned long long UWORD64; /* uh UWORD64 uh_count 8 */ +typedef unsigned long long* pUWORD64; /* puh pUWORD64 puh_count 8 */ typedef float FLOAT32; /* f FLOAT32 f_count 4 */ @@ -88,16 +72,14 @@ typedef void VOID; /* v VOID v_flag 4 */ typedef void* pVOID; /* pv pVOID pv_flag 4 */ /* variable size types: platform optimized implementation */ -typedef signed int BOOL; /* bool BOOL bool_true */ -typedef unsigned int UBOOL; /* ubool BOOL ubool_true */ -typedef signed int FLAG; /* flag FLAG flag_false */ -typedef unsigned int UFLAG; /* uflag FLAG uflag_false */ -typedef signed int LOOPIDX; /* lp LOOPIDX lp_index */ -typedef unsigned int - ULOOPIDX; /* ulp SLOOPIDX ulp_index */ -typedef signed int WORD; /* lp LOOPIDX lp_index */ -typedef unsigned int - UWORD; /* ulp SLOOPIDX ulp_index */ +typedef signed int BOOL; /* bool BOOL bool_true */ +typedef unsigned int UBOOL; /* ubool BOOL ubool_true */ +typedef signed int FLAG; /* flag FLAG flag_false */ +typedef unsigned int UFLAG; /* uflag FLAG uflag_false */ +typedef signed int LOOPIDX; /* lp LOOPIDX lp_index */ +typedef unsigned int ULOOPIDX; /* ulp SLOOPIDX ulp_index */ +typedef signed int WORD; /* lp LOOPIDX lp_index */ +typedef unsigned int UWORD; /* ulp SLOOPIDX ulp_index */ typedef LOOPIDX LOOPINDEX; /* lp LOOPIDX lp_index */ typedef ULOOPIDX ULOOPINDEX; /* ulp SLOOPIDX ulp_index */ diff --git a/decoder/x86/ixheaacd_function_selector_x86.c b/decoder/x86/ixheaacd_function_selector_x86.c index 1501ae2..e70ab9a 100644 --- a/decoder/x86/ixheaacd_function_selector_x86.c +++ b/decoder/x86/ixheaacd_function_selector_x86.c @@ -229,20 +229,20 @@ VOID(*ixheaacd_aac_ld_dec_rearrange) (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, UWORD8 *re_arr_tab) = &ixheaacd_rearrange_dec; -VOID (*ixheaacd_fft32x32_ld) +VOID(*ixheaacd_fft32x32_ld) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = ixheaacd_fft32x32_ld_dec; -VOID (*ixheaacd_fft32x32_ld2) +VOID(*ixheaacd_fft32x32_ld2) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_fft32x32_ld_dec; WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo) = &ixheaacd_neg_expo_inc_dec; -VOID (*ixheaacd_inv_dit_fft_8pt) +VOID(*ixheaacd_inv_dit_fft_8pt) (WORD32 *x, WORD32 *real, WORD32 *imag) = &ixheaacd_inv_dit_fft_8pt_dec; -VOID (*ixheaacd_scale_factor_process) +VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file diff --git a/decoder/x86_64/ixheaacd_function_selector_x86_64.c b/decoder/x86_64/ixheaacd_function_selector_x86_64.c index 1501ae2..e70ab9a 100644 --- a/decoder/x86_64/ixheaacd_function_selector_x86_64.c +++ b/decoder/x86_64/ixheaacd_function_selector_x86_64.c @@ -229,20 +229,20 @@ VOID(*ixheaacd_aac_ld_dec_rearrange) (WORD32 *ip, WORD32 *op, WORD32 mdct_len_2, UWORD8 *re_arr_tab) = &ixheaacd_rearrange_dec; -VOID (*ixheaacd_fft32x32_ld) +VOID(*ixheaacd_fft32x32_ld) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = ixheaacd_fft32x32_ld_dec; -VOID (*ixheaacd_fft32x32_ld2) +VOID(*ixheaacd_fft32x32_ld2) (ia_aac_dec_imdct_tables_struct *imdct_tables_ptr, WORD32 npoints, WORD32 *ptr_x, WORD32 *ptr_y) = &ixheaacd_fft32x32_ld_dec; WORD16 (*ixheaacd_neg_expo_inc)(WORD16 neg_expo) = &ixheaacd_neg_expo_inc_dec; -VOID (*ixheaacd_inv_dit_fft_8pt) +VOID(*ixheaacd_inv_dit_fft_8pt) (WORD32 *x, WORD32 *real, WORD32 *imag) = &ixheaacd_inv_dit_fft_8pt_dec; -VOID (*ixheaacd_scale_factor_process) +VOID(*ixheaacd_scale_factor_process) (WORD32 *x_invquant, WORD16 *scale_fact, WORD no_band, WORD8 *width, WORD32 *scale_tables_ptr, WORD32 total_channels, WORD32 object_type, WORD32 aac_sf_data_resil_flag) = &ixheaacd_scale_factor_process_dec;
\ No newline at end of file |