diff options
author | Ray Essick <essick@google.com> | 2019-07-10 20:59:29 -0700 |
---|---|---|
committer | Ray Essick <essick@google.com> | 2019-07-10 20:59:29 -0700 |
commit | de8d48c07149dcb4318a6ef6d2a7356f1d287c74 (patch) | |
tree | 52bee5401e30791336aae16140f921677a1db4f7 | |
parent | 066f5977b126981ed32ac3850806fa41c5653cd2 (diff) | |
download | libopus-de8d48c07149dcb4318a6ef6d2a7356f1d287c74.tar.gz |
Opus encode fails on 32-bit ARM
NEON optimizations overrun buffer due to improper termination condition
Also mark several arm-optimized routines which deliberately cause integer overflow
so they won't trap.
Bug: 136616344
Test: run cts -m CtsMediaTestCases -t
android.media.cts.EncoderTest#testOpusEncoders' on 32 bits project
Change-Id: Ib48b17fd1e4b13fe37c0e71d5f33f6f59f1f97d1
-rw-r--r-- | libopus_blacklist.txt | 20 | ||||
-rw-r--r-- | silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c | 2 |
2 files changed, 21 insertions, 1 deletions
diff --git a/libopus_blacklist.txt b/libopus_blacklist.txt index a789961e..fd3f398d 100644 --- a/libopus_blacklist.txt +++ b/libopus_blacklist.txt @@ -23,6 +23,26 @@ fun:ec_decode_bin src:*/celt/kiss_fft.c +# assembly optimizations that know what they are doing +fun:silk_SMULWB_armv4 +fun:silk_SMULWT_armv4 +fun:silk_SMULWW_armv4 +fun:silk_SMLAWW_armv4 +# +fun:silk_SMULWB_armv5e +fun:silk_SMLAWB_armv5e +fun:silk_SMULWT_armv5e +fun:silk_SMLAWT_armv5e +fun:silk_SMULBB_armv5e +fun:silk_SMLABB_armv5e +fun:silk_SMULBT_armv5e +fun:silk_SMLABT_armv5e +fun:silk_ADD_SAT32_armv5e +fun:silk_SUB_SAT32_armv5e +fun:silk_CLZ16_armv5 +fun:silk_CLZ32_armv5 + + # Performance related fun:exp_rotation1 fun:haar1 diff --git a/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c b/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c index 00a70cb5..ee06f986 100644 --- a/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c +++ b/silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c @@ -172,7 +172,7 @@ void silk_warped_autocorrelation_FIX_neon( state_QS_s32x4[ 0 ][ 1 ] = calc_state( state_QS_s32x4[ 0 ][ 1 ], state_QS_s32x4[ 2 ][ 1 ], state_QS_s32x4[ 1 ][ 1 ], warping_Q16_s32x4 ); state_QS_s32x4[ 1 ][ 0 ] = state_QS_s32x4[ 2 ][ 0 ]; state_QS_s32x4[ 1 ][ 1 ] = state_QS_s32x4[ 2 ][ 1 ]; - } while( ++n < ( length + order ) ); + } while( ++n < ( length + order - 3) ); in = state; o -= 8; } while( o > 4 ); |