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