aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Essick <essick@google.com>2019-07-10 20:59:29 -0700
committerRay Essick <essick@google.com>2019-07-10 20:59:29 -0700
commitde8d48c07149dcb4318a6ef6d2a7356f1d287c74 (patch)
tree52bee5401e30791336aae16140f921677a1db4f7
parent066f5977b126981ed32ac3850806fa41c5653cd2 (diff)
downloadlibopus-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.txt20
-rw-r--r--silk/fixed/arm/warped_autocorrelation_FIX_neon_intr.c2
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 );