1*a58d3d2aSXin Lidiff --git a/celt/bands.c b/celt/bands.c 2*a58d3d2aSXin Liindex 6962587..32e1de6 100644 3*a58d3d2aSXin Li--- a/celt/bands.c 4*a58d3d2aSXin Li+++ b/celt/bands.c 5*a58d3d2aSXin Li@@ -1234,9 +1234,23 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, 6*a58d3d2aSXin Li b = 0; 7*a58d3d2aSXin Li } 8*a58d3d2aSXin Li 9*a58d3d2aSXin Li- if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) 10*a58d3d2aSXin Li+ if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offset==0)) 11*a58d3d2aSXin Li lowband_offset = i; 12*a58d3d2aSXin Li 13*a58d3d2aSXin Li+ if (i == start+1) 14*a58d3d2aSXin Li+ { 15*a58d3d2aSXin Li+ int n1, n2; 16*a58d3d2aSXin Li+ int offset; 17*a58d3d2aSXin Li+ n1 = M*(eBands[start+1]-eBands[start]); 18*a58d3d2aSXin Li+ n2 = M*(eBands[start+2]-eBands[start+1]); 19*a58d3d2aSXin Li+ offset = M*eBands[start]; 20*a58d3d2aSXin Li+ /* Duplicate enough of the first band folding data to be able to fold the second band. 21*a58d3d2aSXin Li+ Copies no data for CELT-only mode. */ 22*a58d3d2aSXin Li+ OPUS_COPY(&norm[offset+n1], &norm[offset+2*n1 - n2], n2-n1); 23*a58d3d2aSXin Li+ if (C==2) 24*a58d3d2aSXin Li+ OPUS_COPY(&norm2[offset+n1], &norm2[offset+2*n1 - n2], n2-n1); 25*a58d3d2aSXin Li+ } 26*a58d3d2aSXin Li+ 27*a58d3d2aSXin Li tf_change = tf_res[i]; 28*a58d3d2aSXin Li if (i>=m->effEBands) 29*a58d3d2aSXin Li { 30*a58d3d2aSXin Li@@ -1257,7 +1271,7 @@ void quant_all_bands(int encode, const CELTMode *m, int start, int end, 31*a58d3d2aSXin Li fold_start = lowband_offset; 32*a58d3d2aSXin Li while(M*eBands[--fold_start] > effective_lowband); 33*a58d3d2aSXin Li fold_end = lowband_offset-1; 34*a58d3d2aSXin Li- while(M*eBands[++fold_end] < effective_lowband+N); 35*a58d3d2aSXin Li+ while(++fold_end < i && M*eBands[fold_end] < effective_lowband+N); 36*a58d3d2aSXin Li x_cm = y_cm = 0; 37*a58d3d2aSXin Li fold_i = fold_start; do { 38*a58d3d2aSXin Li x_cm |= collapse_masks[fold_i*C+0]; 39*a58d3d2aSXin Lidiff --git a/celt/quant_bands.c b/celt/quant_bands.c 40*a58d3d2aSXin Liindex e5ed9ef..82fb823 100644 41*a58d3d2aSXin Li--- a/celt/quant_bands.c 42*a58d3d2aSXin Li+++ b/celt/quant_bands.c 43*a58d3d2aSXin Li@@ -552,6 +552,7 @@ void log2Amp(const CELTMode *m, int start, int end, 44*a58d3d2aSXin Li { 45*a58d3d2aSXin Li opus_val16 lg = ADD16(oldEBands[i+c*m->nbEBands], 46*a58d3d2aSXin Li SHL16((opus_val16)eMeans[i],6)); 47*a58d3d2aSXin Li+ lg = MIN32(QCONST32(32.f, 16), lg); 48*a58d3d2aSXin Li eBands[i+c*m->nbEBands] = PSHR32(celt_exp2(lg),4); 49*a58d3d2aSXin Li } 50*a58d3d2aSXin Li for (;i<m->nbEBands;i++) 51*a58d3d2aSXin Lidiff --git a/silk/LPC_inv_pred_gain.c b/silk/LPC_inv_pred_gain.c 52*a58d3d2aSXin Liindex 60c439b..6c301da 100644 53*a58d3d2aSXin Li--- a/silk/LPC_inv_pred_gain.c 54*a58d3d2aSXin Li+++ b/silk/LPC_inv_pred_gain.c 55*a58d3d2aSXin Li@@ -84,8 +84,13 @@ static opus_int32 LPC_inverse_pred_gain_QA( /* O Returns inver 56*a58d3d2aSXin Li 57*a58d3d2aSXin Li /* Update AR coefficient */ 58*a58d3d2aSXin Li for( n = 0; n < k; n++ ) { 59*a58d3d2aSXin Li- tmp_QA = Aold_QA[ n ] - MUL32_FRAC_Q( Aold_QA[ k - n - 1 ], rc_Q31, 31 ); 60*a58d3d2aSXin Li- Anew_QA[ n ] = MUL32_FRAC_Q( tmp_QA, rc_mult2 , mult2Q ); 61*a58d3d2aSXin Li+ opus_int64 tmp64; 62*a58d3d2aSXin Li+ tmp_QA = silk_SUB_SAT32( Aold_QA[ n ], MUL32_FRAC_Q( Aold_QA[ k - n - 1 ], rc_Q31, 31 ) ); 63*a58d3d2aSXin Li+ tmp64 = silk_RSHIFT_ROUND64( silk_SMULL( tmp_QA, rc_mult2 ), mult2Q); 64*a58d3d2aSXin Li+ if( tmp64 > silk_int32_MAX || tmp64 < silk_int32_MIN ) { 65*a58d3d2aSXin Li+ return 0; 66*a58d3d2aSXin Li+ } 67*a58d3d2aSXin Li+ Anew_QA[ n ] = ( opus_int32 )tmp64; 68*a58d3d2aSXin Li } 69*a58d3d2aSXin Li } 70*a58d3d2aSXin Li 71*a58d3d2aSXin Lidiff --git a/silk/NLSF_stabilize.c b/silk/NLSF_stabilize.c 72*a58d3d2aSXin Liindex 979aaba..2ef2398 100644 73*a58d3d2aSXin Li--- a/silk/NLSF_stabilize.c 74*a58d3d2aSXin Li+++ b/silk/NLSF_stabilize.c 75*a58d3d2aSXin Li@@ -134,7 +134,7 @@ void silk_NLSF_stabilize( 76*a58d3d2aSXin Li 77*a58d3d2aSXin Li /* Keep delta_min distance between the NLSFs */ 78*a58d3d2aSXin Li for( i = 1; i < L; i++ ) 79*a58d3d2aSXin Li- NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], NLSF_Q15[i-1] + NDeltaMin_Q15[i] ); 80*a58d3d2aSXin Li+ NLSF_Q15[i] = silk_max_int( NLSF_Q15[i], silk_ADD_SAT16( NLSF_Q15[i-1], NDeltaMin_Q15[i] ) ); 81*a58d3d2aSXin Li 82*a58d3d2aSXin Li /* Last NLSF should be no higher than 1 - NDeltaMin[L] */ 83*a58d3d2aSXin Li NLSF_Q15[L-1] = silk_min_int( NLSF_Q15[L-1], (1<<15) - NDeltaMin_Q15[L] ); 84*a58d3d2aSXin Lidiff --git a/silk/dec_API.c b/silk/dec_API.c 85*a58d3d2aSXin Liindex efd7918..21bb7e0 100644 86*a58d3d2aSXin Li--- a/silk/dec_API.c 87*a58d3d2aSXin Li+++ b/silk/dec_API.c 88*a58d3d2aSXin Li@@ -72,6 +72,9 @@ opus_int silk_InitDecoder( /* O Returns error co 89*a58d3d2aSXin Li for( n = 0; n < DECODER_NUM_CHANNELS; n++ ) { 90*a58d3d2aSXin Li ret = silk_init_decoder( &channel_state[ n ] ); 91*a58d3d2aSXin Li } 92*a58d3d2aSXin Li+ silk_memset(&((silk_decoder *)decState)->sStereo, 0, sizeof(((silk_decoder *)decState)->sStereo)); 93*a58d3d2aSXin Li+ /* Not strictly needed, but it's cleaner that way */ 94*a58d3d2aSXin Li+ ((silk_decoder *)decState)->prev_decode_only_middle = 0; 95*a58d3d2aSXin Li 96*a58d3d2aSXin Li return ret; 97*a58d3d2aSXin Li } 98*a58d3d2aSXin Lidiff --git a/silk/resampler_private_IIR_FIR.c b/silk/resampler_private_IIR_FIR.c 99*a58d3d2aSXin Liindex dbd6d9a..91a43aa 100644 100*a58d3d2aSXin Li--- a/silk/resampler_private_IIR_FIR.c 101*a58d3d2aSXin Li+++ b/silk/resampler_private_IIR_FIR.c 102*a58d3d2aSXin Li@@ -75,10 +75,10 @@ void silk_resampler_private_IIR_FIR( 103*a58d3d2aSXin Li silk_resampler_state_struct *S = (silk_resampler_state_struct *)SS; 104*a58d3d2aSXin Li opus_int32 nSamplesIn; 105*a58d3d2aSXin Li opus_int32 max_index_Q16, index_increment_Q16; 106*a58d3d2aSXin Li- opus_int16 buf[ RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_12 ]; 107*a58d3d2aSXin Li+ opus_int16 buf[ 2*RESAMPLER_MAX_BATCH_SIZE_IN + RESAMPLER_ORDER_FIR_12 ]; 108*a58d3d2aSXin Li 109*a58d3d2aSXin Li /* Copy buffered samples to start of buffer */ 110*a58d3d2aSXin Li- silk_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); 111*a58d3d2aSXin Li+ silk_memcpy( buf, S->sFIR, RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); 112*a58d3d2aSXin Li 113*a58d3d2aSXin Li /* Iterate over blocks of frameSizeIn input samples */ 114*a58d3d2aSXin Li index_increment_Q16 = S->invRatio_Q16; 115*a58d3d2aSXin Li@@ -95,13 +95,13 @@ void silk_resampler_private_IIR_FIR( 116*a58d3d2aSXin Li 117*a58d3d2aSXin Li if( inLen > 0 ) { 118*a58d3d2aSXin Li /* More iterations to do; copy last part of filtered signal to beginning of buffer */ 119*a58d3d2aSXin Li- silk_memcpy( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); 120*a58d3d2aSXin Li+ silk_memmove( buf, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); 121*a58d3d2aSXin Li } else { 122*a58d3d2aSXin Li break; 123*a58d3d2aSXin Li } 124*a58d3d2aSXin Li } 125*a58d3d2aSXin Li 126*a58d3d2aSXin Li /* Copy last part of filtered signal to the state for the next call */ 127*a58d3d2aSXin Li- silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int32 ) ); 128*a58d3d2aSXin Li+ silk_memcpy( S->sFIR, &buf[ nSamplesIn << 1 ], RESAMPLER_ORDER_FIR_12 * sizeof( opus_int16 ) ); 129*a58d3d2aSXin Li } 130*a58d3d2aSXin Li 131*a58d3d2aSXin Lidiff --git a/src/opus_decoder.c b/src/opus_decoder.c 132*a58d3d2aSXin Liindex 0cc56f8..8a30fbc 100644 133*a58d3d2aSXin Li--- a/src/opus_decoder.c 134*a58d3d2aSXin Li+++ b/src/opus_decoder.c 135*a58d3d2aSXin Li@@ -595,16 +595,14 @@ static int opus_packet_parse_impl(const unsigned char *data, int len, 136*a58d3d2aSXin Li /* Padding flag is bit 6 */ 137*a58d3d2aSXin Li if (ch&0x40) 138*a58d3d2aSXin Li { 139*a58d3d2aSXin Li- int padding=0; 140*a58d3d2aSXin Li int p; 141*a58d3d2aSXin Li do { 142*a58d3d2aSXin Li if (len<=0) 143*a58d3d2aSXin Li return OPUS_INVALID_PACKET; 144*a58d3d2aSXin Li p = *data++; 145*a58d3d2aSXin Li len--; 146*a58d3d2aSXin Li- padding += p==255 ? 254: p; 147*a58d3d2aSXin Li+ len -= p==255 ? 254: p; 148*a58d3d2aSXin Li } while (p==255); 149*a58d3d2aSXin Li- len -= padding; 150*a58d3d2aSXin Li } 151*a58d3d2aSXin Li if (len<0) 152*a58d3d2aSXin Li return OPUS_INVALID_PACKET; 153*a58d3d2aSXin Lidiff --git a/run_vectors.sh b/run_vectors.sh 154*a58d3d2aSXin Liindex 7cd23ed..4841b0a 100755 155*a58d3d2aSXin Li--- a/run_vectors.sh 156*a58d3d2aSXin Li+++ b/run_vectors.sh 157*a58d3d2aSXin Li@@ -1,3 +1,5 @@ 158*a58d3d2aSXin Li+#!/bin/sh 159*a58d3d2aSXin Li+# 160*a58d3d2aSXin Li # Copyright (c) 2011-2012 IETF Trust, Jean-Marc Valin. All rights reserved. 161*a58d3d2aSXin Li # 162*a58d3d2aSXin Li # This file is extracted from RFC6716. Please see that RFC for additional 163*a58d3d2aSXin Li@@ -31,10 +33,8 @@ 164*a58d3d2aSXin Li # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 165*a58d3d2aSXin Li # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 166*a58d3d2aSXin Li 167*a58d3d2aSXin Li-#!/bin/sh 168*a58d3d2aSXin Li- 169*a58d3d2aSXin Li-rm logs_mono.txt 170*a58d3d2aSXin Li-rm logs_stereo.txt 171*a58d3d2aSXin Li+rm -f logs_mono.txt logs_mono2.txt 172*a58d3d2aSXin Li+rm -f logs_stereo.txt logs_stereo2.txt 173*a58d3d2aSXin Li 174*a58d3d2aSXin Li if [ "$#" -ne "3" ]; then 175*a58d3d2aSXin Li echo "usage: run_vectors.sh <exec path> <vector path> <rate>" 176*a58d3d2aSXin Li@@ -45,18 +45,23 @@ CMD_PATH=$1 177*a58d3d2aSXin Li VECTOR_PATH=$2 178*a58d3d2aSXin Li RATE=$3 179*a58d3d2aSXin Li 180*a58d3d2aSXin Li-OPUS_DEMO=$CMD_PATH/opus_demo 181*a58d3d2aSXin Li-OPUS_COMPARE=$CMD_PATH/opus_compare 182*a58d3d2aSXin Li+: ${OPUS_DEMO:=$CMD_PATH/opus_demo} 183*a58d3d2aSXin Li+: ${OPUS_COMPARE:=$CMD_PATH/opus_compare} 184*a58d3d2aSXin Li 185*a58d3d2aSXin Li if [ -d $VECTOR_PATH ]; then 186*a58d3d2aSXin Li echo Test vectors found in $VECTOR_PATH 187*a58d3d2aSXin Li else 188*a58d3d2aSXin Li echo No test vectors found 189*a58d3d2aSXin Li- #Don't make the test fail here because the test vectors will be 190*a58d3d2aSXin Li- #distributed separately 191*a58d3d2aSXin Li+ #Don't make the test fail here because the test vectors 192*a58d3d2aSXin Li+ #will be distributed separately 193*a58d3d2aSXin Li exit 0 194*a58d3d2aSXin Li fi 195*a58d3d2aSXin Li 196*a58d3d2aSXin Li+if [ ! -x $OPUS_COMPARE ]; then 197*a58d3d2aSXin Li+ echo ERROR: Compare program not found: $OPUS_COMPARE 198*a58d3d2aSXin Li+ exit 1 199*a58d3d2aSXin Li+fi 200*a58d3d2aSXin Li+ 201*a58d3d2aSXin Li if [ -x $OPUS_DEMO ]; then 202*a58d3d2aSXin Li echo Decoding with $OPUS_DEMO 203*a58d3d2aSXin Li else 204*a58d3d2aSXin Li@@ -82,9 +87,11 @@ do 205*a58d3d2aSXin Li echo ERROR: decoding failed 206*a58d3d2aSXin Li exit 1 207*a58d3d2aSXin Li fi 208*a58d3d2aSXin Li- $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector$file.dec tmp.out >> logs_mono.txt 2>&1 209*a58d3d2aSXin Li+ $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector${file}.dec tmp.out >> logs_mono.txt 2>&1 210*a58d3d2aSXin Li float_ret=$? 211*a58d3d2aSXin Li- if [ "$float_ret" -eq "0" ]; then 212*a58d3d2aSXin Li+ $OPUS_COMPARE -r $RATE $VECTOR_PATH/testvector${file}m.dec tmp.out >> logs_mono2.txt 2>&1 213*a58d3d2aSXin Li+ float_ret2=$? 214*a58d3d2aSXin Li+ if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then 215*a58d3d2aSXin Li echo output matches reference 216*a58d3d2aSXin Li else 217*a58d3d2aSXin Li echo ERROR: output does not match reference 218*a58d3d2aSXin Li@@ -111,9 +118,11 @@ do 219*a58d3d2aSXin Li echo ERROR: decoding failed 220*a58d3d2aSXin Li exit 1 221*a58d3d2aSXin Li fi 222*a58d3d2aSXin Li- $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector$file.dec tmp.out >> logs_stereo.txt 2>&1 223*a58d3d2aSXin Li+ $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector${file}.dec tmp.out >> logs_stereo.txt 2>&1 224*a58d3d2aSXin Li float_ret=$? 225*a58d3d2aSXin Li- if [ "$float_ret" -eq "0" ]; then 226*a58d3d2aSXin Li+ $OPUS_COMPARE -s -r $RATE $VECTOR_PATH/testvector${file}m.dec tmp.out >> logs_stereo2.txt 2>&1 227*a58d3d2aSXin Li+ float_ret2=$? 228*a58d3d2aSXin Li+ if [ "$float_ret" -eq "0" ] || [ "$float_ret2" -eq "0" ]; then 229*a58d3d2aSXin Li echo output matches reference 230*a58d3d2aSXin Li else 231*a58d3d2aSXin Li echo ERROR: output does not match reference 232*a58d3d2aSXin Li@@ -125,5 +134,10 @@ done 233*a58d3d2aSXin Li 234*a58d3d2aSXin Li 235*a58d3d2aSXin Li echo All tests have passed successfully 236*a58d3d2aSXin Li-grep quality logs_mono.txt | awk '{sum+=$4}END{print "Average mono quality is", sum/NR, "%"}' 237*a58d3d2aSXin Li-grep quality logs_stereo.txt | awk '{sum+=$4}END{print "Average stereo quality is", sum/NR, "%"}' 238*a58d3d2aSXin Li+mono1=`grep quality logs_mono.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` 239*a58d3d2aSXin Li+mono2=`grep quality logs_mono2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` 240*a58d3d2aSXin Li+echo $mono1 $mono2 | awk '{if ($2 > $1) $1 = $2; print "Average mono quality is", $1, "%"}' 241*a58d3d2aSXin Li+ 242*a58d3d2aSXin Li+stereo1=`grep quality logs_stereo.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` 243*a58d3d2aSXin Li+stereo2=`grep quality logs_stereo2.txt | awk '{sum+=$4}END{if (NR == 12) sum /= 12; else sum = 0; print sum}'` 244*a58d3d2aSXin Li+echo $stereo1 $stereo2 | awk '{if ($2 > $1) $1 = $2; print "Average stereo quality is", $1, "%"}' 245