|
|
a612ca |
From ac76b1503f759201f03dc6acb7bf00bd39f560d3 Mon Sep 17 00:00:00 2001
|
|
|
a612ca |
From: Jean-Marc Valin <jmvalin@jmvalin.ca>
|
|
|
a612ca |
Date: Thu, 9 May 2013 16:17:13 -0400
|
|
|
a612ca |
Subject: [PATCH] Fixes an assertion failure in SILK
|
|
|
a612ca |
|
|
|
a612ca |
We stop the schur recursion before any reflection coefficient
|
|
|
a612ca |
goes outside of ]-1,1[ and we force reporting a residual energy
|
|
|
a612ca |
of at least 1.
|
|
|
a612ca |
Assertion was:
|
|
|
a612ca |
Fatal (internal) error in ../silk/fixed/noise_shape_analysis_FIX.c, line 290: assertion failed: nrg >= 0
|
|
|
a612ca |
triggered by:
|
|
|
a612ca |
opus_demo voip 16000 1 12500 -bandwidth WB -complexity 10 pl04f087.stp-crash out.pcm
|
|
|
a612ca |
---
|
|
|
a612ca |
silk/fixed/schur64_FIX.c | 11 ++++++++++-
|
|
|
a612ca |
silk/fixed/schur_FIX.c | 10 +++++++++-
|
|
|
a612ca |
2 files changed, 19 insertions(+), 2 deletions(-)
|
|
|
a612ca |
|
|
|
a612ca |
diff --git a/silk/fixed/schur64_FIX.c b/silk/fixed/schur64_FIX.c
|
|
|
a612ca |
index 5ff2756..c75f96a 100644
|
|
|
a612ca |
--- a/silk/fixed/schur64_FIX.c
|
|
|
a612ca |
+++ b/silk/fixed/schur64_FIX.c
|
|
|
a612ca |
@@ -56,6 +56,11 @@ opus_int32 silk_schur64( /* O returns residual ene
|
|
|
a612ca |
}
|
|
|
a612ca |
|
|
|
a612ca |
for( k = 0; k < order; k++ ) {
|
|
|
a612ca |
+ /* Check that we won't be getting an unstable rc, otherwise stop here. */
|
|
|
a612ca |
+ if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) {
|
|
|
a612ca |
+ break;
|
|
|
a612ca |
+ }
|
|
|
a612ca |
+
|
|
|
a612ca |
/* Get reflection coefficient: divide two Q30 values and get result in Q31 */
|
|
|
a612ca |
rc_tmp_Q31 = silk_DIV32_varQ( -C[ k + 1 ][ 0 ], C[ 0 ][ 1 ], 31 );
|
|
|
a612ca |
|
|
|
a612ca |
@@ -73,5 +78,9 @@ opus_int32 silk_schur64( /* O returns residual ene
|
|
|
a612ca |
}
|
|
|
a612ca |
}
|
|
|
a612ca |
|
|
|
a612ca |
- return( C[ 0 ][ 1 ] );
|
|
|
a612ca |
+ for(; k < order; k++ ) {
|
|
|
a612ca |
+ rc_Q16[ k ] = 0;
|
|
|
a612ca |
+ }
|
|
|
a612ca |
+
|
|
|
a612ca |
+ return silk_max_32( 1, C[ 0 ][ 1 ] );
|
|
|
a612ca |
}
|
|
|
a612ca |
diff --git a/silk/fixed/schur_FIX.c b/silk/fixed/schur_FIX.c
|
|
|
a612ca |
index 43db501..788ad3f 100644
|
|
|
a612ca |
--- a/silk/fixed/schur_FIX.c
|
|
|
a612ca |
+++ b/silk/fixed/schur_FIX.c
|
|
|
a612ca |
@@ -68,6 +68,10 @@ opus_int32 silk_schur( /* O Returns residual ene
|
|
|
a612ca |
}
|
|
|
a612ca |
|
|
|
a612ca |
for( k = 0; k < order; k++ ) {
|
|
|
a612ca |
+ /* Check that we won't be getting an unstable rc, otherwise stop here. */
|
|
|
a612ca |
+ if (silk_abs_int32(C[ k + 1 ][ 0 ]) >= C[ 0 ][ 1 ]) {
|
|
|
a612ca |
+ break;
|
|
|
a612ca |
+ }
|
|
|
a612ca |
|
|
|
a612ca |
/* Get reflection coefficient */
|
|
|
a612ca |
rc_tmp_Q15 = -silk_DIV32_16( C[ k + 1 ][ 0 ], silk_max_32( silk_RSHIFT( C[ 0 ][ 1 ], 15 ), 1 ) );
|
|
|
a612ca |
@@ -87,6 +91,10 @@ opus_int32 silk_schur( /* O Returns residual ene
|
|
|
a612ca |
}
|
|
|
a612ca |
}
|
|
|
a612ca |
|
|
|
a612ca |
+ for(; k < order; k++ ) {
|
|
|
a612ca |
+ rc_Q15[ k ] = 0;
|
|
|
a612ca |
+ }
|
|
|
a612ca |
+
|
|
|
a612ca |
/* return residual energy */
|
|
|
a612ca |
- return C[ 0 ][ 1 ];
|
|
|
a612ca |
+ return silk_max_32( 1, C[ 0 ][ 1 ] );
|
|
|
a612ca |
}
|
|
|
a612ca |
--
|
|
|
a612ca |
1.8.4.2
|
|
|
a612ca |
|