diff options
| author | android-build-team Robot <android-build-team-robot@google.com> | 2019-05-13 14:22:03 -0700 |
|---|---|---|
| committer | android-build-merger <android-build-merger@google.com> | 2019-05-13 14:22:03 -0700 |
| commit | 60991affe37b8b2ad1f92d38e7a00ff9c172d948 (patch) | |
| tree | c3a859f2537cfc5a79217b866d6cda6b18d0bd72 | |
| parent | 3586696500db3dbc451a6d6a2060a6f05c41ba6c (diff) | |
| parent | 12f70dc2d694316a51866a7a04049fe34826307b (diff) | |
| download | platform_external_libxaac-pie-cuttlefish-testing.tar.gz platform_external_libxaac-pie-cuttlefish-testing.tar.bz2 platform_external_libxaac-pie-cuttlefish-testing.zip | |
Snap for 5450365 from 38ab286ce6caeaa4801f5da24f2549c8b45dfe40 to pi-platform-releasepie-cuttlefish-testing
am: 12f70dc2d6
Change-Id: I7cccb46c1e41af0a27852ffd623580e226d99905
| -rw-r--r-- | decoder/armv7/ixheaacd_autocorr_st2.s | 2 | ||||
| -rw-r--r-- | decoder/armv7/ixheaacd_complex_fft_p2.s | 275 | ||||
| -rw-r--r-- | decoder/armv7/ixheaacd_complex_ifft_p2.s | 275 | ||||
| -rw-r--r-- | decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s | 254 | ||||
| -rw-r--r-- | decoder/drc_src/impd_drc_dynamic_payload.c | 36 | ||||
| -rw-r--r-- | decoder/drc_src/impd_drc_init.c | 15 | ||||
| -rw-r--r-- | decoder/drc_src/impd_drc_selection_process_drcset_selection.c | 18 | ||||
| -rw-r--r-- | decoder/drc_src/impd_drc_static_payload.c | 56 | ||||
| -rw-r--r-- | decoder/ixheaacd_env_extr.h | 13 | ||||
| -rw-r--r-- | decoder/ixheaacd_esbr_envcal.c | 36 | ||||
| -rw-r--r-- | decoder/ixheaacd_headerdecode.c | 9 | ||||
| -rw-r--r-- | decoder/ixheaacd_latmdemux.c | 20 | ||||
| -rw-r--r-- | decoder/ixheaacd_mps_dec.c | 3 | ||||
| -rw-r--r-- | decoder/ixheaacd_mps_dec.h | 2 | ||||
| -rw-r--r-- | decoder/ixheaacd_mps_parse.c | 69 | ||||
| -rw-r--r-- | decoder/ixheaacd_mps_poly_filt.c | 7 | ||||
| -rw-r--r-- | decoder/ixheaacd_mps_pre_mix.c | 9 |
17 files changed, 596 insertions, 503 deletions
diff --git a/decoder/armv7/ixheaacd_autocorr_st2.s b/decoder/armv7/ixheaacd_autocorr_st2.s index 8d23e81..9fa8def 100644 --- a/decoder/armv7/ixheaacd_autocorr_st2.s +++ b/decoder/armv7/ixheaacd_autocorr_st2.s @@ -28,8 +28,6 @@ ixheaacd_covariance_matrix_calc_2_armv7: AUTO_CORR_LOOP: STR r0 , [sp, #-4]! - STR r1 , [sp, #-4]! - LDR r1 , [sp], #4 diff --git a/decoder/armv7/ixheaacd_complex_fft_p2.s b/decoder/armv7/ixheaacd_complex_fft_p2.s index 3845d87..89efa8a 100644 --- a/decoder/armv7/ixheaacd_complex_fft_p2.s +++ b/decoder/armv7/ixheaacd_complex_fft_p2.s @@ -4,19 +4,18 @@ ixheaacd_complex_fft_p2_asm: STMFD sp!, {r0-r12, lr} - SUB sp, sp, #0x28 - LDR r0, [sp, #0x2c] - @LDR r12,[sp,#0x5c+4] + SUB sp, sp, #0x44 + LDR r0, [sp, #0x48] EOR r0, r0, r0, ASR #31 CLZ r0, r0 SUB r12, r0, #16 @dig_rev_shift = norm32(npoints) + 1 -16@ SUB r0, r0, #1 RSB r0, r0, #0x1e AND r1, r0, #1 - STR r1, [sp, #0x14] + STR r1, [sp, #0x30] MOV r1, r0, ASR #1 - LDR r0, [sp, #0x2c] @npoints - STR r1, [sp, #-4]! + LDR r0, [sp, #0x48] @npoints + STR r1, [sp, #0x18] MOV lr, r0, LSL #1 @(npoints >>1) * 4 MOV r0, #0 @@ -33,7 +32,7 @@ FIRST_STAGE_R4: BIC r7, r4, #0x00FF0000 MOV r7, r7, LSR #8 ORR r4, r7, r6, LSL #8 - LDR r5, [sp, #0x18] + LDR r5, [sp, #0x30] MOV r10, r4, LSR r12 CMP r5, #0 ADDNE r10, r10, #1 @@ -70,24 +69,24 @@ FIRST_STAGE_R4: STMIA r3!, {r4-r11} BLT FIRST_STAGE_R4 - LDR r1, [sp], #4 - LDR r0, [sp, #0x2c] + LDR r1, [sp, #0x18] + LDR r0, [sp, #0x48] MOV r12, #0x40 @nodespacing = 64@ - STR r12, [sp, #0x1c] - LDR r12, [sp, #0x2c] + STR r12, [sp, #0x38] + LDR r12, [sp, #0x48] SUB r3, r3, r0, LSL #3 SUBS r1, r1, #1 - STR r3, [sp, #0x34] + STR r3, [sp, #0x50] MOV r4, r12, ASR #4 MOV r0, #4 - STR r4, [sp, #0x18] - STR r1, [sp, #0x20] + STR r4, [sp, #0x34] + STR r1, [sp, #0x3c] BLE RADIX2 OUTER_LOOP: - LDR r1, [sp, #0x28] - LDR r12, [sp, #0x34] @WORD32 *data = ptr_y@ - STR r1, [sp, #0x10] - LDR r1, [sp, #0x18] + LDR r1, [sp, #0x44] + LDR r12, [sp, #0x50] @WORD32 *data = ptr_y@ + STR r1, [sp, #0x2c] + LDR r1, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LOOP_TRIVIAL_TWIDDLE: @@ -141,11 +140,11 @@ LOOP_TRIVIAL_TWIDDLE: BNE LOOP_TRIVIAL_TWIDDLE MOV r0, r0, ASR #3 - LDR r4, [sp, #0x1c] - LDR r3, [sp, #0x34] + LDR r4, [sp, #0x38] + LDR r3, [sp, #0x50] MUL r1, r0, r4 ADD r12, r3, #8 - STR r1, [sp, #0x24] + STR r1, [sp, #0x40] MOV r3, r1, ASR #2 ADD r3, r3, r1, ASR #3 SUB r3, r3, r1, ASR #4 @@ -153,25 +152,25 @@ LOOP_TRIVIAL_TWIDDLE: SUB r3, r3, r1, ASR #6 ADD r3, r3, r1, ASR #7 SUB r3, r3, r1, ASR #8 - STR r3, [sp, #-4]! + STR r3, [sp, #0x18] SECOND_LOOP: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY: @@ -180,8 +179,8 @@ RADIX4_BFLY: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -198,8 +197,8 @@ RADIX4_BFLY: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -216,8 +215,8 @@ RADIX4_BFLY: ADD r9, r9, r8 SUB r8, r4, r5 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -237,7 +236,7 @@ RADIX4_BFLY: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -271,45 +270,45 @@ RADIX4_BFLY: BNE RADIX4_BFLY MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] ADD r4, r4, r6 CMP r4, r7 BLE SECOND_LOOP SECOND_LOOP_2: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] + STR r4, [sp, #0x24] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_2: LDRD r6, [r12, r0]! @r6=x1r, r7=x1i LDRD r8, [r12, r0]! @r8=x2r, r9=x2i LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -326,8 +325,8 @@ RADIX4_BFLY_2: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -344,8 +343,8 @@ RADIX4_BFLY_2: ADD r9, r9, r8 SUB r8, r4, r5 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -365,7 +364,7 @@ RADIX4_BFLY_2: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -399,39 +398,39 @@ RADIX4_BFLY_2: BNE RADIX4_BFLY_2 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0x24+4] + LDR r7, [sp, #0x40] ADD r4, r4, r6 CMP r4, r7, ASR #1 BLE SECOND_LOOP_2 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] CMP r4, r7, LSL #1 BGT SECOND_LOOP_4 SECOND_LOOP_3: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_3: @@ -440,8 +439,8 @@ RADIX4_BFLY_3: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -458,8 +457,8 @@ RADIX4_BFLY_3: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -476,8 +475,8 @@ RADIX4_BFLY_3: ADD r8, r9, r8 SUB r9, r5, r4 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -497,7 +496,7 @@ RADIX4_BFLY_3: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -531,38 +530,38 @@ RADIX4_BFLY_3: BNE RADIX4_BFLY_3 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] ADD r4, r4, r6 CMP r4, r7, LSL #1 BLE SECOND_LOOP_3 SECOND_LOOP_4: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_4: LDRD r6, [r12, r0]! @r6=x1r, r7=x1i @@ -570,8 +569,8 @@ RADIX4_BFLY_4: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -588,8 +587,8 @@ RADIX4_BFLY_4: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -606,8 +605,8 @@ RADIX4_BFLY_4: ADD r8, r9, r8 SUB r9, r5, r4 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -627,7 +626,7 @@ RADIX4_BFLY_4: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -661,48 +660,46 @@ RADIX4_BFLY_4: BNE RADIX4_BFLY_4 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0x24+4] + LDR r7, [sp, #0x40] ADD r4, r4, r6 CMP r4, r7 BLT SECOND_LOOP_4 - ADD sp, sp, #4 - LDR r1, [sp, #0x1c] + LDR r1, [sp, #0x38] MOV r0, r0, LSL #2 MOV r1, r1, ASR #2 - STR r1, [sp, #0x1c] - LDR r1, [sp, #0x18] + STR r1, [sp, #0x38] + LDR r1, [sp, #0x34] MOV r1, r1, ASR #2 - STR r1, [sp, #0x18] - LDR r1, [sp, #0x20] + STR r1, [sp, #0x34] + LDR r1, [sp, #0x3c] SUBS r1, r1, #1 - STR r1, [sp, #0x20] + STR r1, [sp, #0x3c] BGT OUTER_LOOP RADIX2: - LDR r1, [sp, #0x14] + LDR r1, [sp, #0x30] CMP r1, #0 BEQ EXIT - LDR r12, [sp, #0x1c] - LDR r1, [sp, #0x28] + LDR r12, [sp, #0x38] + LDR r1, [sp, #0x44] CMP r12, #0 - LDRNE r12, [sp, #0x1c] MOVEQ r4, #1 MOVNE r4, r12, LSL #1 MOVS r3, r0 BEQ EXIT MOV r3, r3, ASR #1 - LDR r5, [sp, #0x34] + LDR r5, [sp, #0x50] MOV r0, r0, LSL #3 @(del<<1) * 4 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] RADIX2_BFLY: - LDR r1, [sp, #-4] + LDR r1, [sp, #0x18] LDRD r6, [r5] @r6 = x0r ADD r5, r5, r0 LDRD r8, [r5] @r8 = x1r @@ -719,10 +716,10 @@ RADIX2_BFLY: ORR r10, r1, r10, LSL#1 - LDR r1, [sp, #-4] - LDR r2, [r1, #4] + LDR r1, [sp, #0x18] + LDR r2, [r1, #0x04] ADD r1, r1, r4, LSL #3 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] SMULL r1, r8, r8, r2 @ixheaacd_mult32(x1r,w1l) LSR r1, r1, #31 @@ -750,11 +747,11 @@ RADIX2_BFLY: BNE RADIX2_BFLY - LDR r1, [sp, #0x28] + LDR r1, [sp, #0x44] MOV r3, r0, ASR #4 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] RADIX2_BFLY_2: - LDR r1, [sp, #-4] + LDR r1, [sp, #0x18] LDRD r6, [r5] @r6 = x0r ADD r5, r5, r0 LDRD r8, [r5] @r8 = x1r @@ -772,10 +769,10 @@ RADIX2_BFLY_2: ORR r10, r1, r10, LSL#1 - LDR r1, [sp, #-4] - LDR r2, [r1, #4] + LDR r1, [sp, #0x18] + LDR r2, [r1, #0x04] ADD r1, r1, r4, LSL #3 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] SMULL r1, r8, r8, r2 @ixheaacd_mult32(x1r,w1l) LSR r1, r1, #31 @@ -804,6 +801,6 @@ RADIX2_BFLY_2: BNE RADIX2_BFLY_2 EXIT: - ADD sp, sp, #0x38 + ADD sp, sp, #0x54 LDMFD sp!, {r4-r12, pc} diff --git a/decoder/armv7/ixheaacd_complex_ifft_p2.s b/decoder/armv7/ixheaacd_complex_ifft_p2.s index ce89139..3a0ce5a 100644 --- a/decoder/armv7/ixheaacd_complex_ifft_p2.s +++ b/decoder/armv7/ixheaacd_complex_ifft_p2.s @@ -4,19 +4,18 @@ ixheaacd_complex_ifft_p2_asm: STMFD sp!, {r0-r12, lr} - SUB sp, sp, #0x28 - LDR r0, [sp, #0x2c] - @LDR r12,[sp,#0x5c+4] + SUB sp, sp, #0x44 + LDR r0, [sp, #0x48] EOR r0, r0, r0, ASR #31 CLZ r0, r0 SUB r12, r0, #16 @dig_rev_shift = norm32(npoints) + 1 -16@ SUB r0, r0, #1 RSB r0, r0, #0x1e AND r1, r0, #1 - STR r1, [sp, #0x14] + STR r1, [sp, #0x30] MOV r1, r0, ASR #1 - LDR r0, [sp, #0x2c] @npoints - STR r1, [sp, #-4]! + LDR r0, [sp, #0x48] @npoints + STR r1, [sp, #0x18] MOV lr, r0, LSL #1 @(npoints >>1) * 4 MOV r0, #0 @@ -33,7 +32,7 @@ FIRST_STAGE_R4: BIC r7, r4, #0x00FF0000 MOV r7, r7, LSR #8 ORR r4, r7, r6, LSL #8 - LDR r5, [sp, #0x18] + LDR r5, [sp, #0x30] MOV r10, r4, LSR r12 CMP r5, #0 ADDNE r10, r10, #1 @@ -70,24 +69,24 @@ FIRST_STAGE_R4: STMIA r3!, {r4-r11} BLT FIRST_STAGE_R4 - LDR r1, [sp], #4 - LDR r0, [sp, #0x2c] + LDR r1, [sp, #0x18] + LDR r0, [sp, #0x48] MOV r12, #0x40 @nodespacing = 64@ - STR r12, [sp, #0x1c] - LDR r12, [sp, #0x2c] + STR r12, [sp, #0x38] + LDR r12, [sp, #0x48] SUB r3, r3, r0, LSL #3 SUBS r1, r1, #1 - STR r3, [sp, #0x34] + STR r3, [sp, #0x50] MOV r4, r12, ASR #4 MOV r0, #4 - STR r4, [sp, #0x18] - STR r1, [sp, #0x20] + STR r4, [sp, #0x34] + STR r1, [sp, #0x3c] BLE RADIX2 OUTER_LOOP: - LDR r1, [sp, #0x28] - LDR r12, [sp, #0x34] @WORD32 *data = ptr_y@ - STR r1, [sp, #0x10] - LDR r1, [sp, #0x18] + LDR r1, [sp, #0x44] + LDR r12, [sp, #0x50] @WORD32 *data = ptr_y@ + STR r1, [sp, #0x2c] + LDR r1, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LOOP_TRIVIAL_TWIDDLE: @@ -141,11 +140,11 @@ LOOP_TRIVIAL_TWIDDLE: BNE LOOP_TRIVIAL_TWIDDLE MOV r0, r0, ASR #3 - LDR r4, [sp, #0x1c] - LDR r3, [sp, #0x34] + LDR r4, [sp, #0x38] + LDR r3, [sp, #0x50] MUL r1, r0, r4 ADD r12, r3, #8 - STR r1, [sp, #0x24] + STR r1, [sp, #0x40] MOV r3, r1, ASR #2 ADD r3, r3, r1, ASR #3 SUB r3, r3, r1, ASR #4 @@ -153,25 +152,25 @@ LOOP_TRIVIAL_TWIDDLE: SUB r3, r3, r1, ASR #6 ADD r3, r3, r1, ASR #7 SUB r3, r3, r1, ASR #8 - STR r3, [sp, #-4]! + STR r3, [sp, #0x18] SECOND_LOOP: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY: @@ -180,8 +179,8 @@ RADIX4_BFLY: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -198,8 +197,8 @@ RADIX4_BFLY: SUB r7, r7, r6 ADD r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -216,8 +215,8 @@ RADIX4_BFLY: SUB r9, r9, r8 ADD r8, r4, r5 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -237,7 +236,7 @@ RADIX4_BFLY: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -271,45 +270,45 @@ RADIX4_BFLY: BNE RADIX4_BFLY MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] ADD r4, r4, r6 CMP r4, r7 BLE SECOND_LOOP SECOND_LOOP_2: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] + STR r4, [sp, #0x24] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_2: LDRD r6, [r12, r0]! @r6=x1r, r7=x1i LDRD r8, [r12, r0]! @r8=x2r, r9=x2i LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -326,8 +325,8 @@ RADIX4_BFLY_2: SUB r7, r7, r6 ADD r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -344,8 +343,8 @@ RADIX4_BFLY_2: SUB r9, r9, r8 ADD r8, r4, r5 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -365,7 +364,7 @@ RADIX4_BFLY_2: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -399,39 +398,39 @@ RADIX4_BFLY_2: BNE RADIX4_BFLY_2 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0x24+4] + LDR r7, [sp, #0x40] ADD r4, r4, r6 CMP r4, r7, ASR #1 BLE SECOND_LOOP_2 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] CMP r4, r7, LSL #1 BGT SECOND_LOOP_4 SECOND_LOOP_3: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_3: @@ -440,8 +439,8 @@ RADIX4_BFLY_3: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -458,8 +457,8 @@ RADIX4_BFLY_3: SUB r7, r7, r6 ADD r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -476,8 +475,8 @@ RADIX4_BFLY_3: SUB r8, r8, r9 ADD r9, r5, r4 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -497,7 +496,7 @@ RADIX4_BFLY_3: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -531,38 +530,38 @@ RADIX4_BFLY_3: BNE RADIX4_BFLY_3 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] ADD r4, r4, r6 CMP r4, r7, LSL #1 BLE SECOND_LOOP_3 SECOND_LOOP_4: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_4: LDRD r6, [r12, r0]! @r6=x1r, r7=x1i @@ -570,8 +569,8 @@ RADIX4_BFLY_4: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -588,8 +587,8 @@ RADIX4_BFLY_4: SUB r7, r7, r6 ADD r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -606,8 +605,8 @@ RADIX4_BFLY_4: SUB r8, r8, r9 ADD r9, r5, r4 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -628,7 +627,7 @@ RADIX4_BFLY_4: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -662,48 +661,46 @@ RADIX4_BFLY_4: BNE RADIX4_BFLY_4 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0x24+4] + LDR r7, [sp, #0x40] ADD r4, r4, r6 CMP r4, r7 BLT SECOND_LOOP_4 - ADD sp, sp, #4 - LDR r1, [sp, #0x1c] + LDR r1, [sp, #0x38] MOV r0, r0, LSL #2 MOV r1, r1, ASR #2 - STR r1, [sp, #0x1c] - LDR r1, [sp, #0x18] + STR r1, [sp, #0x38] + LDR r1, [sp, #0x34] MOV r1, r1, ASR #2 - STR r1, [sp, #0x18] - LDR r1, [sp, #0x20] + STR r1, [sp, #0x34] + LDR r1, [sp, #0x3c] SUBS r1, r1, #1 - STR r1, [sp, #0x20] + STR r1, [sp, #0x3c] BGT OUTER_LOOP RADIX2: - LDR r1, [sp, #0x14] + LDR r1, [sp, #0x30] CMP r1, #0 BEQ EXIT - LDR r12, [sp, #0x1c] - LDR r1, [sp, #0x28] + LDR r12, [sp, #0x38] + LDR r1, [sp, #0x44] CMP r12, #0 - LDRNE r12, [sp, #0x1c] MOVEQ r4, #1 MOVNE r4, r12, LSL #1 MOVS r3, r0 BEQ EXIT MOV r3, r3, ASR #1 - LDR r5, [sp, #0x34] + LDR r5, [sp, #0x50] MOV r0, r0, LSL #3 @(del<<1) * 4 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] RADIX2_BFLY: - LDR r1, [sp, #-4] + LDR r1, [sp, #0x18] LDRD r6, [r5] @r6 = x0r ADD r5, r5, r0 LDRD r8, [r5] @r8 = x1r @@ -720,10 +717,10 @@ RADIX2_BFLY: ORR r10, r1, r10, LSL#1 - LDR r1, [sp, #-4] - LDR r2, [r1, #4] + LDR r1, [sp, #0x18] + LDR r2, [r1, #0x04] ADD r1, r1, r4, LSL #3 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] SMULL r1, r8, r8, r2 @ixheaacd_mult32(x1r,w1l) LSR r1, r1, #31 @@ -750,11 +747,11 @@ RADIX2_BFLY: BNE RADIX2_BFLY - LDR r1, [sp, #0x28] + LDR r1, [sp, #0x44] MOV r3, r0, ASR #4 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] RADIX2_BFLY_2: - LDR r1, [sp, #-4] + LDR r1, [sp, #0x18] LDRD r6, [r5] @r6 = x0r ADD r5, r5, r0 LDRD r8, [r5] @r8 = x1r @@ -772,10 +769,10 @@ RADIX2_BFLY_2: ORR r10, r1, r10, LSL#1 - LDR r1, [sp, #-4] - LDR r2, [r1, #4] + LDR r1, [sp, #0x18] + LDR r2, [r1, #0x04] ADD r1, r1, r4, LSL #3 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] SMULL r1, r8, r8, r2 @ixheaacd_mult32(x1r,w1l) LSR r1, r1, #31 @@ -804,6 +801,6 @@ RADIX2_BFLY_2: BNE RADIX2_BFLY_2 EXIT: - ADD sp, sp, #0x38 + ADD sp, sp, #0x54 LDMFD sp!, {r4-r12, pc} diff --git a/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s b/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s index 9e4ba93..0f465d2 100644 --- a/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s +++ b/decoder/armv7/ixheaacd_mps_complex_fft_64_asm.s @@ -6,20 +6,18 @@ ixheaacd_mps_complex_fft_64_asm: @LDR r4,[sp] STMFD sp!, {r0-r12, lr} LDR r4, [sp, #0x38] - SUB sp, sp, #0x28 -@ LDR r4,[sp,#0x30] - LDR r0, [sp, #0x2c] - @LDR r12,[sp,#0x5c+4] + SUB sp, sp, #0x44 + LDR r0, [sp, #0x48] EOR r0, r0, r0, ASR #31 CLZ r0, r0 SUB r12, r0, #16 @dig_rev_shift = norm32(npoints) + 1 -16@ SUB r0, r0, #1 RSB r0, r0, #0x1e AND r1, r0, #1 - STR r1, [sp, #0x14] + STR r1, [sp, #0x30] MOV r1, r0, ASR #1 - LDR r0, [sp, #0x2c] @npoints - STR r1, [sp, #-4]! + LDR r0, [sp, #0x48] @npoints + STR r1, [sp, #0x18] MOV lr, r0, LSL #1 @(npoints >>1) * 4 MOV r0, #0 MOV r12, r4 @@ -58,24 +56,24 @@ FIRST_STAGE_R4: STMIA r3!, {r4-r11} BLT FIRST_STAGE_R4 - LDR r1, [sp], #4 - LDR r0, [sp, #0x2c] + LDR r1, [sp, #0x18] + LDR r0, [sp, #0x48] MOV r12, #0x40 @nodespacing = 64@ - STR r12, [sp, #0x1c] - LDR r12, [sp, #0x2c] + STR r12, [sp, #0x38] + LDR r12, [sp, #0x48] SUB r3, r3, r0, LSL #3 SUBS r1, r1, #1 - STR r3, [sp, #0x34] + STR r3, [sp, #0x50] MOV r4, r12, ASR #4 MOV r0, #4 - STR r4, [sp, #0x18] - STR r1, [sp, #0x20] + STR r4, [sp, #0x34] + STR r1, [sp, #0x3c] BLE EXIT OUTER_LOOP: - LDR r1, [sp, #0x28] - LDR r12, [sp, #0x34] @WORD32 *data = ptr_y@ - STR r1, [sp, #0x10] - LDR r1, [sp, #0x18] + LDR r1, [sp, #0x44] + LDR r12, [sp, #0x50] @WORD32 *data = ptr_y@ + STR r1, [sp, #0x2c] + LDR r1, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LOOP_TRIVIAL_TWIDDLE: @@ -129,11 +127,11 @@ LOOP_TRIVIAL_TWIDDLE: BNE LOOP_TRIVIAL_TWIDDLE MOV r0, r0, ASR #3 - LDR r4, [sp, #0x1c] - LDR r3, [sp, #0x34] + LDR r4, [sp, #0x38] + LDR r3, [sp, #0x50] MUL r1, r0, r4 ADD r12, r3, #8 - STR r1, [sp, #0x24] + STR r1, [sp, #0x40] MOV r3, r1, ASR #2 ADD r3, r3, r1, ASR #3 SUB r3, r3, r1, ASR #4 @@ -141,25 +139,25 @@ LOOP_TRIVIAL_TWIDDLE: SUB r3, r3, r1, ASR #6 ADD r3, r3, r1, ASR #7 SUB r3, r3, r1, ASR #8 - STR r3, [sp, #-4]! + STR r3, [sp, #0x18] SECOND_LOOP: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY: @@ -168,8 +166,8 @@ RADIX4_BFLY: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -186,8 +184,8 @@ RADIX4_BFLY: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -204,8 +202,8 @@ RADIX4_BFLY: ADD r9, r9, r8 SUB r8, r4, r5 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -225,7 +223,7 @@ RADIX4_BFLY: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -259,45 +257,45 @@ RADIX4_BFLY: BNE RADIX4_BFLY MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] ADD r4, r4, r6 CMP r4, r7 BLE SECOND_LOOP SECOND_LOOP_2: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] + STR r4, [sp, #0x24] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_2: LDRD r6, [r12, r0]! @r6=x1r, r7=x1i LDRD r8, [r12, r0]! @r8=x2r, r9=x2i LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -314,8 +312,8 @@ RADIX4_BFLY_2: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -332,8 +330,8 @@ RADIX4_BFLY_2: ADD r9, r9, r8 SUB r8, r4, r5 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -353,7 +351,7 @@ RADIX4_BFLY_2: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -387,39 +385,39 @@ RADIX4_BFLY_2: BNE RADIX4_BFLY_2 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0x24+4] + LDR r7, [sp, #0x40] ADD r4, r4, r6 CMP r4, r7, ASR #1 BLE SECOND_LOOP_2 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] CMP r4, r7, LSL #1 BGT SECOND_LOOP_4 SECOND_LOOP_3: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_3: @@ -428,8 +426,8 @@ RADIX4_BFLY_3: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -446,8 +444,8 @@ RADIX4_BFLY_3: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -464,8 +462,8 @@ RADIX4_BFLY_3: ADD r8, r9, r8 SUB r9, r5, r4 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -485,7 +483,7 @@ RADIX4_BFLY_3: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -519,38 +517,38 @@ RADIX4_BFLY_3: BNE RADIX4_BFLY_3 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0] + LDR r7, [sp, #0x18] ADD r4, r4, r6 CMP r4, r7, LSL #1 BLE SECOND_LOOP_3 SECOND_LOOP_4: - LDR r3, [sp, #0x10+4] - LDR r14, [sp, #0x18+4] + LDR r3, [sp, #0x2c] + LDR r14, [sp, #0x34] MOV r0, r0, LSL #3 @(del<<1) * 4 LDR r1, [r3, r4, LSL #3]! @ w1h = *(twiddles + 2*j)@ - LDR r2, [r3, #4] @w1l = *(twiddles + 2*j + 1)@ + LDR r2, [r3, #0x04] @w1l = *(twiddles + 2*j + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r5, [r3, r4, LSL #3]! @w2h = *(twiddles + 2*(j<<1))@ - LDR r6, [r3, #4] @w2l = *(twiddles + 2*(j<<1) + 1)@ + LDR r6, [r3, #0x04] @w2l = *(twiddles + 2*(j<<1) + 1)@ SUB r3, r3, #2048 @ 512 *4 LDR r7, [r3, r4, LSL #3]! @w3h = *(twiddles + 2*j + 2*(j<<1))@ - LDR r8, [r3, #4] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ + LDR r8, [r3, #0x04] @w3l = *(twiddles + 2*j + 2*(j<<1) + 1)@ - STR r4, [sp, #8+4] - STR r1, [sp, #-4] - STR r2, [sp, #-8] - STR r5, [sp, #-12] - STR r6, [sp, #-16] - STR r7, [sp, #-20] - STR r8, [sp, #-24] + STR r4, [sp, #0x24] + STR r1, [sp, #0x14] + STR r2, [sp, #0x10] + STR r5, [sp, #0x0c] + STR r6, [sp, #0x08] + STR r7, [sp, #0x04] + STR r8, [sp] RADIX4_BFLY_4: LDRD r6, [r12, r0]! @r6=x1r, r7=x1i @@ -558,8 +556,8 @@ RADIX4_BFLY_4: LDRD r10, [r12, r0] @r10=x3r, r11=x3i SUBS r14, r14, #1 - LDR r1, [sp, #-4] - LDR r2, [sp, #-8] + LDR r1, [sp, #0x14] + LDR r2, [sp, #0x10] SMULL r3, r4, r6, r2 @ixheaacd_mult32(x1r,w1l) LSR r3, r3, #31 @@ -576,8 +574,8 @@ RADIX4_BFLY_4: ADD r7, r7, r6 SUB r6, r4, r5 @ - LDR r1, [sp, #-12] - LDR r2, [sp, #-16] + LDR r1, [sp, #0x0c] + LDR r2, [sp, #0x08] SMULL r3, r4, r8, r2 @ixheaacd_mult32(x2r,w2l) LSR r3, r3, #31 @@ -594,8 +592,8 @@ RADIX4_BFLY_4: ADD r8, r9, r8 SUB r9, r5, r4 @ - LDR r1, [sp, #-20] - LDR r2, [sp, #-24] + LDR r1, [sp, #0x04] + LDR r2, [sp] SMULL r3, r4, r10, r2 @ixheaacd_mult32(x3r,w3l) LSR r3, r3, #31 @@ -615,7 +613,7 @@ RADIX4_BFLY_4: @SUB r12,r12,r0,lsl #1 @LDRD r4,[r12] @r4=x0r, r5=x0i LDR r4, [r12, -r0, lsl #1]! @ - LDR r5, [r12, #4] + LDR r5, [r12, #0x04] ADD r4, r8, r4 @x0r = x0r + x2r@ @@ -648,47 +646,45 @@ RADIX4_BFLY_4: BNE RADIX4_BFLY_4 MOV r0, r0, ASR #3 - LDR r1, [sp, #0x2c+4] - LDR r4, [sp, #8+4] + LDR r1, [sp, #0x48] + LDR r4, [sp, #0x24] SUB r1, r12, r1, LSL #3 - LDR r6, [sp, #0x1c+4] + LDR r6, [sp, #0x38] ADD r12, r1, #8 - LDR r7, [sp, #0x24+4] + LDR r7, [sp, #0x40] ADD r4, r4, r6 CMP r4, r7 BLT SECOND_LOOP_4 - ADD sp, sp, #4 - LDR r1, [sp, #0x1c] + LDR r1, [sp, #0x38] MOV r0, r0, LSL #2 MOV r1, r1, ASR #2 - STR r1, [sp, #0x1c] - LDR r1, [sp, #0x18] + STR r1, [sp, #0x38] + LDR r1, [sp, #0x34] MOV r1, r1, ASR #2 - STR r1, [sp, #0x18] - LDR r1, [sp, #0x20] + STR r1, [sp, #0x34] + LDR r1, [sp, #0x3c] SUBS r1, r1, #1 - STR r1, [sp, #0x20] + STR r1, [sp, #0x3c] BGT OUTER_LOOP - LDR r1, [sp, #0x14] + LDR r1, [sp, #0x30] CMP r1, #0 BEQ EXIT - LDR r12, [sp, #0x1c] - LDR r1, [sp, #0x28] + LDR r12, [sp, #0x38] + LDR r1, [sp, #0x44] CMP r12, #0 - LDRNE r12, [sp, #0x1c] MOVEQ r4, #1 MOVNE r4, r12, LSL #1 MOVS r3, r0 BEQ EXIT MOV r3, r3, ASR #1 - LDR r5, [sp, #0x34] + LDR r5, [sp, #0x50] MOV r0, r0, LSL #3 @(del<<1) * 4 - STR r1, [sp, #-4] + STR r1, [sp, #0x18] EXIT: - ADD sp, sp, #0x38 + ADD sp, sp, #0x54 LDMFD sp!, {r4-r12, pc} diff --git a/decoder/drc_src/impd_drc_dynamic_payload.c b/decoder/drc_src/impd_drc_dynamic_payload.c index 35a3c37..f93f49e 100644 --- a/decoder/drc_src/impd_drc_dynamic_payload.c +++ b/decoder/drc_src/impd_drc_dynamic_payload.c @@ -123,7 +123,7 @@ WORD32 impd_dec_gains(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 k, e, bit; WORD32 code; WORD32 code_found; FLOAT32 slope_value = 0; @@ -141,6 +141,7 @@ WORD32 impd_dec_slopes(ia_bit_buf_struct* it_bit_buff, WORD32* no_nodes, end_marker = impd_read_bits_buf(it_bit_buff, 1); if (it_bit_buff->error) return it_bit_buff->error; } + if (k > NODE_COUNT_MAX) return UNEXPECTED_ERROR; *no_nodes = k; if (gain_interpolation_type == GAIN_INTERPOLATION_TYPE_SPLINE) { @@ -150,7 +151,7 @@ WORD32 impd_dec_slopes(ia_bit_buf_struct* it_bit_buff, WORD32* no_nodes, 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++) { + while (num_bits_read < ptr_slope_code_table[e].size) { bit = impd_read_bits_buf(it_bit_buff, 1); if (it_bit_buff->error) return it_bit_buff->error; code = (code << 1) + bit; @@ -163,6 +164,7 @@ WORD32 impd_dec_slopes(ia_bit_buf_struct* it_bit_buff, WORD32* no_nodes, break; } e++; + if (e >= no_slope_code_entries) return UNEXPECTED_ERROR; } } str_node[k].slope = slope_value; @@ -536,6 +538,9 @@ WORD32 impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, 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; + if ((dwnmix_instructions_v1_count + drc_config->dwnmix_instructions_count) > + DOWNMIX_INSTRUCTION_COUNT_MAX) + return UNEXPECTED_ERROR; for (i = 0; i < dwnmix_instructions_v1_count; i++) { err = impd_parse_dwnmix_instructions( it_bit_buff, version, ia_drc_params_struct, @@ -591,6 +596,9 @@ WORD32 impd_parse_drc_ext_v1(ia_bit_buf_struct* it_bit_buff, return UNEXPECTED_ERROR; if (it_bit_buff->error) return it_bit_buff->error; + if (str_drc_config_ext->loud_eq_instructions_count > + LOUD_EQ_INSTRUCTIONS_COUNT_MAX) + return UNEXPECTED_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]); @@ -638,6 +646,8 @@ WORD32 impd_parse_filt_block(ia_bit_buf_struct* it_bit_buff, if (it_bit_buff->error) return it_bit_buff->error; str_filter_element->filt_ele_idx = (temp & 0x7E) >> 1; + if (str_filter_element->filt_ele_idx >= FILTER_ELEMENT_COUNT_MAX) + return (UNEXPECTED_ERROR); str_filter_element->filt_ele_gain_flag = temp & 1; ; @@ -939,6 +949,8 @@ WORD32 impd_parse_eq_coefficients(ia_bit_buf_struct* it_bit_buff, str_eq_coeff->unique_td_filter_element_count = impd_read_bits_buf(it_bit_buff, 6); + if (str_eq_coeff->unique_td_filter_element_count > FILTER_ELEMENT_COUNT_MAX) + return (UNEXPECTED_ERROR); if (it_bit_buff->error) return it_bit_buff->error; err = impd_parse_unique_td_filt_ele( @@ -948,6 +960,9 @@ WORD32 impd_parse_eq_coefficients(ia_bit_buf_struct* it_bit_buff, str_eq_coeff->unique_eq_subband_gains_count = impd_read_bits_buf(it_bit_buff, 6); + if (str_eq_coeff->unique_eq_subband_gains_count > + UNIQUE_SUBBAND_GAIN_COUNT_MAX) + return (UNEXPECTED_ERROR); if (it_bit_buff->error) return it_bit_buff->error; if (str_eq_coeff->unique_eq_subband_gains_count > 0) { @@ -1016,10 +1031,17 @@ WORD32 impd_parser_td_filter_cascade( 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; + if (str_filter_block_refs->filter_block_count > EQ_FILTER_BLOCK_COUNT_MAX) { + return (UNEXPECTED_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; + if (str_filter_block_refs->filter_block_index[ii] >= + FILTER_BLOCK_COUNT_MAX) + return (UNEXPECTED_ERROR); } str_filter_block_refs++; } @@ -1078,6 +1100,9 @@ WORD32 impd_parse_eq_instructions( 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_cnt >= DOWNMIX_ID_COUNT_MAX) + return UNEXPECTED_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; @@ -1099,6 +1124,8 @@ WORD32 impd_parse_eq_instructions( 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_cnt >= DRC_SET_ID_COUNT_MAX) + return UNEXPECTED_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); @@ -1241,7 +1268,8 @@ WORD32 impd_parse_loud_eq_instructions( 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_cnt >= DOWNMIX_ID_COUNT_MAX) + return UNEXPECTED_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); @@ -1268,6 +1296,8 @@ WORD32 impd_parse_loud_eq_instructions( 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_cnt >= DRC_SET_ID_COUNT_MAX)) + return UNEXPECTED_ERROR; for (i = 1; i < additional_drc_set_id_cnt + 1; i++) { loud_eq_instructions->drc_set_id[i] = diff --git a/decoder/drc_src/impd_drc_init.c b/decoder/drc_src/impd_drc_init.c index 5f51a3f..cd6d467 100644 --- a/decoder/drc_src/impd_drc_init.c +++ b/decoder/drc_src/impd_drc_init.c @@ -19,6 +19,7 @@ */ #include <stdlib.h> #include <math.h> +#include <string.h> #include "impd_type_def.h" #include "impd_error_standards.h" @@ -111,19 +112,7 @@ IA_ERRORCODE impd_drc_set_default_config(ia_drc_api_struct *p_obj_drc) { 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; + memset(&p_obj_drc->str_bit_handler, 0, sizeof(p_obj_drc->str_bit_handler)); return IA_NO_ERROR; } 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 f05eceb..b91df9a 100644 --- a/decoder/drc_src/impd_drc_selection_process_drcset_selection.c +++ b/decoder/drc_src/impd_drc_selection_process_drcset_selection.c @@ -305,6 +305,7 @@ WORD32 impd_select_drcs_without_compr_effects( } } if (match == 1) { + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); k++; @@ -365,6 +366,7 @@ WORD32 impd_match_effect_type_attempt( 0x0) || ((drc_instructions_dependent->drc_set_effect & effect_bit_idx) != 0x0)) { + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); @@ -375,6 +377,7 @@ WORD32 impd_match_effect_type_attempt( 0x0) && ((drc_instructions_dependent->drc_set_effect & effect_bit_idx) == 0x0)) { + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); @@ -385,6 +388,7 @@ WORD32 impd_match_effect_type_attempt( if (state_requested == 1) { if ((str_drc_instruction_str->drc_set_effect & effect_bit_idx) != 0x0) { + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); @@ -393,6 +397,7 @@ WORD32 impd_match_effect_type_attempt( } else { if ((str_drc_instruction_str->drc_set_effect & effect_bit_idx) == 0x0) { + if (k >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[k], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); @@ -511,6 +516,7 @@ WORD32 impd_match_dynamic_range( if (requested_dyn_range_range_flag == 1) { if ((lp_avg_val >= dynamic_range_min_requested) && (lp_avg_val <= dynamic_range_max_requested)) { + if (k >= DRC_INSTRUCTIONS_COUNT_MAX) return UNEXPECTED_ERROR; selected[k] = i; k++; } @@ -522,6 +528,7 @@ WORD32 impd_match_dynamic_range( deviation_min = deviation; k = 0; } + if (k >= DRC_INSTRUCTIONS_COUNT_MAX) return UNEXPECTED_ERROR; selected[k] = i; k++; } @@ -645,6 +652,7 @@ WORD32 impd_match_drc_characteristic_attempt( } } if ((ref_count > 0) && (((FLOAT32)match_count) > 0.5f * ref_count)) { + if (n >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info[n], &selection_candidate_info[i], sizeof(ia_selection_candidate_info_struct)); n++; @@ -981,6 +989,7 @@ WORD32 impd_drc_set_preselection( &matching_eq_set_count, matching_eq_instrucions_index); if (err) return (err); for (j = 0; j < matching_eq_set_count; j++) { + if (n >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); @@ -992,6 +1001,7 @@ WORD32 impd_drc_set_preselection( } } if (str_drc_instruction_str->requires_eq == 0) { + if (n >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info_step_2[n], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); @@ -999,10 +1009,9 @@ WORD32 impd_drc_set_preselection( n++; } } - for (k = 0; k < n; k++) { - memcpy(&selection_candidate_info[k], &selection_candidate_info_step_2[k], - sizeof(ia_selection_candidate_info_struct)); - } + if (n > SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; + memcpy(selection_candidate_info, selection_candidate_info_step_2, + n * sizeof(ia_selection_candidate_info_struct)); *selection_candidate_count = n; n = 0; for (k = 0; k < *selection_candidate_count; k++) { @@ -1084,6 +1093,7 @@ WORD32 impd_drc_set_preselection( 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) { + if (j >= SELECTION_CANDIDATE_COUNT_MAX) return UNEXPECTED_ERROR; memcpy(&selection_candidate_info[j], &selection_candidate_info[k], sizeof(ia_selection_candidate_info_struct)); j++; diff --git a/decoder/drc_src/impd_drc_static_payload.c b/decoder/drc_src/impd_drc_static_payload.c index 9639046..871a452 100644 --- a/decoder/drc_src/impd_drc_static_payload.c +++ b/decoder/drc_src/impd_drc_static_payload.c @@ -695,6 +695,8 @@ WORD32 impd_parse_loud_info_set_ext_eq( offset = loudness_info_set->loudness_info_album_count; loudness_info_set->loudness_info_album_count += loudness_info_v1_album_cnt; + if ((offset + loudness_info_v1_album_cnt) > LOUDNESS_INFO_COUNT_MAX) + return (UNEXPECTED_ERROR); for (i = 0; i < loudness_info_v1_album_cnt; i++) { err = impd_parse_loudness_info( it_bit_buff, version, @@ -703,6 +705,8 @@ WORD32 impd_parse_loud_info_set_ext_eq( } offset = loudness_info_set->loudness_info_count; loudness_info_set->loudness_info_count += loudness_info_v1_cnt; + if (offset + loudness_info_v1_cnt > LOUDNESS_INFO_COUNT_MAX) + return (UNEXPECTED_ERROR); 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]); @@ -775,6 +779,7 @@ impd_parse_dwnmix_instructions( dmix_coeff = impd_read_bits_buf(it_bit_buff, 4); if (it_bit_buff->error) return it_bit_buff->error; + if (k >= DOWNMIX_COEFF_COUNT_MAX) return (UNEXPECTED_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]); @@ -792,10 +797,12 @@ impd_parse_dwnmix_instructions( 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; + if (k >= DOWNMIX_COEFF_COUNT_MAX) return (UNEXPECTED_ERROR); dwnmix_instructions->downmix_coefficient[k] = dwnmix_coeff_v1[dmix_coeff_v1]; k++; @@ -1152,6 +1159,9 @@ impd_parse_drc_config(ia_bit_buf_struct* it_bit_buff, drc_config->drc_coefficients_drc_count = (temp >> 6) & 7; drc_config->drc_instructions_uni_drc_count = temp & 0x3f; + if (drc_config->drc_instructions_uni_drc_count > DRC_INSTRUCTIONS_COUNT_MAX) + return (UNEXPECTED_ERROR); + err = impd_parse_ch_layout(it_bit_buff, ia_drc_params_struct, &drc_config->channel_layout); if (err) return (err); @@ -1280,6 +1290,9 @@ impd_parse_loudness_info_set( offset = loudness_info_set->loudness_info_album_count; loudness_info_set->loudness_info_album_count += loudness_info_album_count; + if ((offset + loudness_info_set->loudness_info_album_count) > + LOUDNESS_INFO_COUNT_MAX) + return (UNEXPECTED_ERROR); for (i = 0; i < loudness_info_set->loudness_info_album_count; i++) { err = impd_parse_loudness_info( it_bit_buff, version, @@ -1289,6 +1302,9 @@ impd_parse_loudness_info_set( offset = loudness_info_set->loudness_info_count; loudness_info_set->loudness_info_count += loudness_info_count; + if ((offset + loudness_info_set->loudness_info_count) > + LOUDNESS_INFO_COUNT_MAX) + return (UNEXPECTED_ERROR); 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])); @@ -1500,6 +1516,8 @@ impd_parse_gain_set_params(ia_bit_buf_struct* it_bit_buff, WORD32 version, 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 > BAND_COUNT_MAX) return (UNEXPECTED_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; @@ -1647,6 +1665,10 @@ impd_drc_parse_coeff( 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; + + if (str_p_loc_drc_coefficients_uni_drc->gain_set_count > GAIN_SET_COUNT_MAX) + return (UNEXPECTED_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++) { @@ -1748,6 +1770,9 @@ impd_drc_parse_coeff( 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; + if (str_p_loc_drc_coefficients_uni_drc->shape_num_filter > + SHAPE_FILTER_COUNT_MAX) + return (UNEXPECTED_ERROR); for (i = 1; i <= str_p_loc_drc_coefficients_uni_drc->shape_num_filter; i++) { pstr_shape_filter_block_params = @@ -1810,8 +1835,16 @@ impd_drc_parse_coeff( str_p_loc_drc_coefficients_uni_drc->gain_sequence_count = (temp >> 6) & 0x3f; + + if (str_p_loc_drc_coefficients_uni_drc->gain_sequence_count > + SEQUENCE_COUNT_MAX) + return UNEXPECTED_ERROR; + str_p_loc_drc_coefficients_uni_drc->gain_set_count = temp & 0x3f; + if (str_p_loc_drc_coefficients_uni_drc->gain_set_count > GAIN_SET_COUNT_MAX) + return (UNEXPECTED_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++) { @@ -2098,6 +2131,7 @@ impd_parse_drc_instructions_uni_drc( ch_cnt = drc_config->channel_layout.base_channel_count; + if (ch_cnt > MAX_CHANNEL_COUNT) return (UNEXPECTED_ERROR); for (c = 0; c < MAX_CHANNEL_COUNT; c++) { unique_idx[c] = -10; unique_scaling[c] = -10.0f; @@ -2128,17 +2162,13 @@ impd_parse_drc_instructions_uni_drc( if (it_bit_buff->error) return it_bit_buff->error; repeat_parameters_cnt += 1; + if ((c + repeat_parameters_cnt) > MAX_CHANNEL_COUNT) + return (UNEXPECTED_ERROR); for (k = 0; k < repeat_parameters_cnt; k++) { 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; + str_drc_instruction_str->str_ducking_modifiers_for_channel[c] = + str_drc_instruction_str->str_ducking_modifiers_for_channel[c - 1]; c++; } } @@ -2209,6 +2239,9 @@ impd_parse_drc_instructions_uni_drc( str_drc_instruction_str->num_drc_ch_groups = g; } + if (str_drc_instruction_str->num_drc_ch_groups > + min(CHANNEL_GROUP_COUNT_MAX, MAX_CHANNEL_COUNT)) + return UNEXPECTED_ERROR; 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) @@ -2250,6 +2283,7 @@ impd_parse_drc_instructions_uni_drc( ch_cnt = 1; } + if (ch_cnt > MAX_CHANNEL_COUNT) return (UNEXPECTED_ERROR); c = 0; while (c < ch_cnt) { WORD32 bs_gain_set_idx; @@ -2269,6 +2303,8 @@ impd_parse_drc_instructions_uni_drc( if (it_bit_buff->error) return it_bit_buff->error; repeat_gain_set_idx_cnt += 1; + if ((c + repeat_gain_set_idx_cnt) > MAX_CHANNEL_COUNT) + return (UNEXPECTED_ERROR); for (k = 0; k < repeat_gain_set_idx_cnt; k++) { str_drc_instruction_str->gain_set_index[c] = bs_gain_set_idx - 1; c++; @@ -2311,6 +2347,10 @@ impd_parse_drc_instructions_uni_drc( } str_drc_instruction_str->num_drc_ch_groups = g; + + if (str_drc_instruction_str->num_drc_ch_groups > + min(CHANNEL_GROUP_COUNT_MAX, MAX_CHANNEL_COUNT)) + return UNEXPECTED_ERROR; for (g = 0; g < str_drc_instruction_str->num_drc_ch_groups; g++) { WORD32 set, band_count; diff --git a/decoder/ixheaacd_env_extr.h b/decoder/ixheaacd_env_extr.h index 5078d98..109dfe2 100644 --- a/decoder/ixheaacd_env_extr.h +++ b/decoder/ixheaacd_env_extr.h @@ -19,7 +19,7 @@ */ #ifndef IXHEAACD_ENV_EXTR_H #define IXHEAACD_ENV_EXTR_H - +#include "ixheaacd_error_standards.h" #define ENV_EXP_FRACT 0 #define EXP_BITS 6 @@ -170,12 +170,11 @@ VOID ixheaacd_huffman_decode(WORD32 it_bit_buff, WORD16 *h_index, WORD16 *len, const UWORD16 *input_table, const UWORD32 *idx_table); -VOID ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], - WORD32 gate_mode[4], WORD16 *freq_band_tbl, - WORD32 ixheaacd_num_bands, - WORD32 x_over_qmf[MAX_NUM_PATCHES], - WORD32 b_patching_mode, WORD32 upsamp_4_flag, - struct ixheaacd_lpp_trans_patch *patch_param); +IA_ERRORCODE ixheaacd_createlimiterbands( + WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4], WORD16 *freq_band_tbl, + WORD32 ixheaacd_num_bands, WORD32 x_over_qmf[MAX_NUM_PATCHES], + WORD32 b_patching_mode, WORD32 upsamp_4_flag, + struct ixheaacd_lpp_trans_patch *patch_param); VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1, FLOAT32 *qmf_real, FLOAT32 *qmf_imag, diff --git a/decoder/ixheaacd_esbr_envcal.c b/decoder/ixheaacd_esbr_envcal.c index b90df22..e1bb1c7 100644 --- a/decoder/ixheaacd_esbr_envcal.c +++ b/decoder/ixheaacd_esbr_envcal.c @@ -167,19 +167,21 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, esbr_start_up = 1; esbr_start_up_pvc = 1; phase_index = 0; - ixheaacd_createlimiterbands( - (*lim_table), (*gate_mode), - frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, - num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode, - upsamp_4_flag, &frame_data->patch_param); + if (ixheaacd_createlimiterbands( + (*lim_table), (*gate_mode), + frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, + num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode, + upsamp_4_flag, &frame_data->patch_param)) + return IA_FATAL_ERROR; } if (frame_data->sbr_patching_mode != frame_data->prev_sbr_patching_mode) { - ixheaacd_createlimiterbands( - (*lim_table), (*gate_mode), - frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, - num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode, - upsamp_4_flag, &frame_data->patch_param); + if (ixheaacd_createlimiterbands( + (*lim_table), (*gate_mode), + frame_data->pstr_sbr_header->pstr_freq_band_data->freq_band_tbl_lo, + num_sf_bands[LOW], x_over_qmf, frame_data->sbr_patching_mode, + upsamp_4_flag, &frame_data->patch_param)) + return IA_FATAL_ERROR; frame_data->prev_sbr_patching_mode = frame_data->sbr_patching_mode; } @@ -789,12 +791,11 @@ WORD32 ixheaacd_sbr_env_calc(ia_sbr_frame_info_data_struct *frame_data, return 0; } -VOID ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], - WORD32 gate_mode[4], WORD16 *freq_band_tbl, - WORD32 ixheaacd_num_bands, - WORD32 x_over_qmf[MAX_NUM_PATCHES], - WORD32 b_patching_mode, WORD32 upsamp_4_flag, - struct ixheaacd_lpp_trans_patch *patch_param) { +IA_ERRORCODE ixheaacd_createlimiterbands( + WORD32 lim_table[4][12 + 1], WORD32 gate_mode[4], WORD16 *freq_band_tbl, + WORD32 ixheaacd_num_bands, WORD32 x_over_qmf[MAX_NUM_PATCHES], + WORD32 b_patching_mode, WORD32 upsamp_4_flag, + struct ixheaacd_lpp_trans_patch *patch_param) { WORD32 i, j, k, is_patch_border[2]; WORD32 patch_borders[MAX_NUM_PATCHES + 1]; WORD32 temp_limiter_band_calc[32 + MAX_NUM_PATCHES + 1]; @@ -887,11 +888,12 @@ VOID ixheaacd_createlimiterbands(WORD32 lim_table[4][12 + 1], } } } - + if (gate_mode[i] > 12) return IA_FATAL_ERROR; for (k = 0; k <= gate_mode[i]; k++) { lim_table[i][k] = temp_limiter_band_calc[k]; } } + return IA_NO_ERROR; } VOID ixheaacd_apply_inter_tes(FLOAT32 *qmf_real1, FLOAT32 *qmf_imag1, diff --git a/decoder/ixheaacd_headerdecode.c b/decoder/ixheaacd_headerdecode.c index c28833e..140ad78 100644 --- a/decoder/ixheaacd_headerdecode.c +++ b/decoder/ixheaacd_headerdecode.c @@ -81,6 +81,8 @@ #include "ixheaacd_struct.h" #include "ixheaacd_function_selector.h" +#include "ixheaacd_error_standards.h" + #undef ALLOW_SMALL_FRAMELENGTH #define ALLOW_SMALL_FRAMELENGTH @@ -811,11 +813,12 @@ WORD32 ixheaacd_check_if_adts(ia_adts_header_struct *adts, (adts->profile != AAC_LC_PROFILE)); } -WORD32 ixheaacd_latm_header_decode( +IA_ERRORCODE ixheaacd_latm_header_decode( ia_aac_dec_state_struct *aac_state_struct, struct ia_bit_buf_struct *it_bit_buff, WORD32 *bytes_consumed, ia_sampling_rate_info_struct *pstr_samp_rate_info) { - WORD32 sync, result; + WORD32 sync; + IA_ERRORCODE result; WORD32 next_sync, audio_mux_len_bytes_last; WORD32 audio_mux_len_bits_last; WORD32 sync_status = aac_state_struct->sync_status; @@ -931,7 +934,7 @@ WORD32 ixheaacd_latm_header_decode( } } } - return 0; + return IA_NO_ERROR; } WORD32 ixheaacd_aac_headerdecode( diff --git a/decoder/ixheaacd_latmdemux.c b/decoder/ixheaacd_latmdemux.c index d800c88..fb216f0 100644 --- a/decoder/ixheaacd_latmdemux.c +++ b/decoder/ixheaacd_latmdemux.c @@ -80,6 +80,7 @@ #include "ixheaacd_multichannel.h" #include "ixheaacd_headerdecode.h" +#include "ixheaacd_error_standards.h" WORD32 ixheaacd_latm_au_chunk_length_info( struct ia_bit_buf_struct *it_bit_buff) { @@ -150,7 +151,7 @@ static UWORD32 ixheaacd_latm_get_value(ia_bit_buf_struct *it_bit_buff) { ixheaacd_read_bits_buf(it_bit_buff, 8); } -WORD32 ixheaacd_latm_stream_mux_config( +IA_ERRORCODE ixheaacd_latm_stream_mux_config( struct ia_bit_buf_struct *it_bit_buff, ixheaacd_latm_struct *latm_element, ia_aac_dec_state_struct *aac_state_struct, ia_sampling_rate_info_struct *sample_rate_info) { @@ -159,7 +160,7 @@ WORD32 ixheaacd_latm_stream_mux_config( WORD32 bytes_consumed; WORD32 audio_mux_version_a; UWORD32 tara_buf_fullness; - WORD32 error_code = AAC_DEC_OK; + IA_ERRORCODE error_code = AAC_DEC_OK; ixheaacd_latm_layer_info *layer_info = 0; latm_element->audio_mux_version = ixheaacd_read_bits_buf(it_bit_buff, 1); @@ -178,13 +179,13 @@ WORD32 ixheaacd_latm_stream_mux_config( latm_element->num_sub_frames = ixheaacd_read_bits_buf(it_bit_buff, 6) + 1; - if (latm_element->num_sub_frames != 1) { - error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER; - return error_code; - } + if (latm_element->num_sub_frames != 1) + return IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER; latm_element->num_program = ixheaacd_read_bits_buf(it_bit_buff, 4) + 1; + if (latm_element->num_program > LATM_MAX_PROG) return IA_FATAL_ERROR; + for (prog = 0; prog < latm_element->num_program; prog++) { latm_element->num_layer = ixheaacd_read_bits_buf(it_bit_buff, 3) + 1; @@ -250,8 +251,7 @@ WORD32 ixheaacd_latm_stream_mux_config( break; default: - error_code = IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER; - return error_code; + return IA_ENHAACPLUS_DEC_EXE_FATAL_INVALID_LOAS_HEADER; } } } @@ -284,12 +284,12 @@ WORD32 ixheaacd_latm_stream_mux_config( return (error_code); } -WORD32 ixheaacd_latm_audio_mux_element( +IA_ERRORCODE ixheaacd_latm_audio_mux_element( struct ia_bit_buf_struct *it_bit_buff, ixheaacd_latm_struct *latm_element, ia_aac_dec_state_struct *aac_state_struct, ia_sampling_rate_info_struct *sample_rate_info) { UWORD32 i; - WORD32 error_code = AAC_DEC_OK; + IA_ERRORCODE error_code = AAC_DEC_OK; ixheaacd_read_bits_buf(it_bit_buff, 13); diff --git a/decoder/ixheaacd_mps_dec.c b/decoder/ixheaacd_mps_dec.c index 851f942..3540e55 100644 --- a/decoder/ixheaacd_mps_dec.c +++ b/decoder/ixheaacd_mps_dec.c @@ -302,8 +302,9 @@ WORD32 ixheaacd_mps_apply(ia_mps_dec_state_struct* self, self->present_time_slot = 0; - ixheaacd_mps_frame_decode(self); + err = ixheaacd_mps_frame_decode(self); + if (err != 0) return err; ixheaacd_mps_qmf_hyb_analysis(self); ixheaacd_pre_and_mix_matrix_calculation(self); diff --git a/decoder/ixheaacd_mps_dec.h b/decoder/ixheaacd_mps_dec.h index 9aaa64f..527cb2e 100644 --- a/decoder/ixheaacd_mps_dec.h +++ b/decoder/ixheaacd_mps_dec.h @@ -346,7 +346,7 @@ VOID ixheaacd_mps_config(ia_mps_dec_state_struct *self, WORD32 frame_len, WORD32 residual_coding, ia_usac_dec_mps_config_struct *mps212_config); -VOID ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self); +WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self); WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self); diff --git a/decoder/ixheaacd_mps_parse.c b/decoder/ixheaacd_mps_parse.c index e5ba760..a2492bd 100644 --- a/decoder/ixheaacd_mps_parse.c +++ b/decoder/ixheaacd_mps_parse.c @@ -683,7 +683,7 @@ static float ixheaacd_mps_de_quantize(int value, int param_type) { } } -static VOID ixheaacd_mps_mapindexdata( +static WORD32 ixheaacd_mps_mapindexdata( ia_mps_dec_state_struct *self, ia_mps_data_struct *frame_xxx_data, float out_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], int out_idx_data[MAX_PARAMETER_SETS_MPS][MAX_PARAMETER_BANDS], @@ -790,18 +790,25 @@ static VOID ixheaacd_mps_mapindexdata( x2 = param_slots[i2]; if (interpolate_local[i] == 1) { - assert(i2 < num_parameter_sets); + if (i2 < num_parameter_sets) { + return -1; + } for (band = band_start; band < band_stop; band++) { int yi, y1, y2; + yi = 0; y1 = out_idx_data[i1][band]; y2 = out_idx_data[i2][band]; if (param_type == IPD) { if (y2 - y1 > 8) y1 += 16; if (y1 - y2 > 8) y2 += 16; - yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16; + if (x2 != x1) { + yi = (y1 + (xi - x1) * (y2 - y1) / (x2 - x1)) % 16; + } } else { - yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1); + if (x2 != x1) { + yi = y1 + (xi - x1) * (y2 - y1) / (x2 - x1); + } } out_idx_data[i][band] = yi; } @@ -829,26 +836,35 @@ static VOID ixheaacd_mps_mapindexdata( out_idx_data[num_parameter_sets - 1][band]; } } + + return 0; } -static VOID ixheaacd_mps_dec_and_mapframeott(ia_mps_dec_state_struct *self) { +static WORD32 ixheaacd_mps_dec_and_mapframeott(ia_mps_dec_state_struct *self) { ia_mps_bs_frame *cur_bit_stream_ptr = &(self->bs_frame); + WORD32 err_code = 0; + + err_code = ixheaacd_mps_mapindexdata( + self, &cur_bit_stream_ptr->cld_data, self->cld_data, + cur_bit_stream_ptr->cld_idx, cur_bit_stream_ptr->cmp_cld_idx, + cur_bit_stream_ptr->cld_idx_pre, CLD); + if (err_code != 0) return err_code; + + err_code = ixheaacd_mps_mapindexdata( + self, &cur_bit_stream_ptr->icc_data, self->icc_data, + cur_bit_stream_ptr->icc_idx, cur_bit_stream_ptr->cmp_icc_idx, + cur_bit_stream_ptr->icc_idx_pre, ICC); + if (err_code != 0) return err_code; + if ((self->config->bs_phase_coding)) { + err_code = ixheaacd_mps_mapindexdata( + self, &cur_bit_stream_ptr->ipd_data, self->ipd_data, + cur_bit_stream_ptr->ipd_idx, cur_bit_stream_ptr->ipd_idx_data, + cur_bit_stream_ptr->ipd_idx_prev, IPD); + + if (err_code != 0) return err_code; + } - ixheaacd_mps_mapindexdata(self, &cur_bit_stream_ptr->cld_data, self->cld_data, - cur_bit_stream_ptr->cld_idx, - cur_bit_stream_ptr->cmp_cld_idx, - cur_bit_stream_ptr->cld_idx_pre, CLD); - - ixheaacd_mps_mapindexdata(self, &cur_bit_stream_ptr->icc_data, self->icc_data, - cur_bit_stream_ptr->icc_idx, - cur_bit_stream_ptr->cmp_icc_idx, - cur_bit_stream_ptr->icc_idx_pre, ICC); - - if ((self->config->bs_phase_coding)) - ixheaacd_mps_mapindexdata(self, &cur_bit_stream_ptr->ipd_data, - self->ipd_data, cur_bit_stream_ptr->ipd_idx, - cur_bit_stream_ptr->ipd_idx_data, - cur_bit_stream_ptr->ipd_idx_prev, IPD); + return 0; } static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { @@ -939,16 +955,19 @@ static VOID ixheaacd_mps_dec_and_mapframesmg(ia_mps_dec_state_struct *self) { } } -VOID ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { +WORD32 ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { int i; - if (self->parse_nxt_frame == 1) return; + WORD32 err_code = 0; + if (self->parse_nxt_frame == 1) return 0; self->ext_frame_flag = 0; if (self->param_slots[self->num_parameter_sets - 1] != self->time_slots - 1) { self->ext_frame_flag = 1; } - ixheaacd_mps_dec_and_mapframeott(self); + err_code = ixheaacd_mps_dec_and_mapframeott(self); + + if (err_code != 0) return err_code; ixheaacd_mps_dec_and_mapframesmg(self); @@ -966,6 +985,8 @@ VOID ixheaacd_mps_frame_decode(ia_mps_dec_state_struct *self) { self->inv_param_slot_diff_Q30[i] = (int)floor(self->inv_param_slot_diff[i] * 1073741824 + 0.5); } + + return 0; } WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) { @@ -1063,6 +1084,8 @@ WORD32 ixheaacd_mps_header_decode(ia_mps_dec_state_struct *self) { } } + if (self->num_bands_ipd > MAX_PARAMETER_BANDS) return -1; + self->dir_sig_count = 1; self->decor_sig_count = 1; diff --git a/decoder/ixheaacd_mps_poly_filt.c b/decoder/ixheaacd_mps_poly_filt.c index 71c930f..1d5ea47 100644 --- a/decoder/ixheaacd_mps_poly_filt.c +++ b/decoder/ixheaacd_mps_poly_filt.c @@ -73,10 +73,9 @@ VOID ixheaacd_mps_synt_pre_twiddle_dec(WORD32 *ptr_in, WORD32 *table_re, for (k = 0; k < 2 * resolution; k += 2) { tmp = ixheaacd_add32_sat(ixheaacd_mult32(ptr_in[k], table_re[k >> 1]), ixheaacd_mult32(ptr_in[k + 1], table_im[k >> 1])); - - ptr_in[k + 1] = - ixheaacd_add32_sat(ixheaacd_mult32(-ptr_in[k], table_im[k >> 1]), - ixheaacd_mult32(ptr_in[k + 1], table_re[k >> 1])); + ptr_in[k + 1] = ixheaacd_add32_sat( + ixheaacd_mult32(ixheaacd_negate32_sat(ptr_in[k]), table_im[k >> 1]), + ixheaacd_mult32(ptr_in[k + 1], table_re[k >> 1])); ptr_in[k] = tmp; } diff --git a/decoder/ixheaacd_mps_pre_mix.c b/decoder/ixheaacd_mps_pre_mix.c index 5ea8910..4aaf803 100644 --- a/decoder/ixheaacd_mps_pre_mix.c +++ b/decoder/ixheaacd_mps_pre_mix.c @@ -681,6 +681,15 @@ VOID ixheaacd_mps_phase_interpolation( r_re[ts][pb][1] = (FLOAT32)cos(t); r_im[ts][pb][1] = (FLOAT32)sin(t); ts++; + + if (ts > 71) { + ts = 0; + break; + } + if (pb > 27) { + pb = 0; + break; + } } } } |
