xref: /aosp_15_r20/external/libopus/doc/opus_update.patch (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
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