xref: /aosp_15_r20/external/libopus/src/opus.c (revision a58d3d2adb790c104798cd88c8a3aff4fa8b82cc)
1*a58d3d2aSXin Li /* Copyright (c) 2011 Xiph.Org Foundation, Skype Limited
2*a58d3d2aSXin Li    Written by Jean-Marc Valin and Koen Vos */
3*a58d3d2aSXin Li /*
4*a58d3d2aSXin Li    Redistribution and use in source and binary forms, with or without
5*a58d3d2aSXin Li    modification, are permitted provided that the following conditions
6*a58d3d2aSXin Li    are met:
7*a58d3d2aSXin Li 
8*a58d3d2aSXin Li    - Redistributions of source code must retain the above copyright
9*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer.
10*a58d3d2aSXin Li 
11*a58d3d2aSXin Li    - Redistributions in binary form must reproduce the above copyright
12*a58d3d2aSXin Li    notice, this list of conditions and the following disclaimer in the
13*a58d3d2aSXin Li    documentation and/or other materials provided with the distribution.
14*a58d3d2aSXin Li 
15*a58d3d2aSXin Li    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16*a58d3d2aSXin Li    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17*a58d3d2aSXin Li    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18*a58d3d2aSXin Li    A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
19*a58d3d2aSXin Li    OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
20*a58d3d2aSXin Li    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21*a58d3d2aSXin Li    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22*a58d3d2aSXin Li    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23*a58d3d2aSXin Li    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24*a58d3d2aSXin Li    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25*a58d3d2aSXin Li    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*a58d3d2aSXin Li */
27*a58d3d2aSXin Li 
28*a58d3d2aSXin Li #ifdef HAVE_CONFIG_H
29*a58d3d2aSXin Li #include "config.h"
30*a58d3d2aSXin Li #endif
31*a58d3d2aSXin Li 
32*a58d3d2aSXin Li #include "opus.h"
33*a58d3d2aSXin Li #include "opus_private.h"
34*a58d3d2aSXin Li 
35*a58d3d2aSXin Li #ifndef DISABLE_FLOAT_API
opus_pcm_soft_clip(float * _x,int N,int C,float * declip_mem)36*a58d3d2aSXin Li OPUS_EXPORT void opus_pcm_soft_clip(float *_x, int N, int C, float *declip_mem)
37*a58d3d2aSXin Li {
38*a58d3d2aSXin Li    int c;
39*a58d3d2aSXin Li    int i;
40*a58d3d2aSXin Li    float *x;
41*a58d3d2aSXin Li 
42*a58d3d2aSXin Li    if (C<1 || N<1 || !_x || !declip_mem) return;
43*a58d3d2aSXin Li 
44*a58d3d2aSXin Li    /* First thing: saturate everything to +/- 2 which is the highest level our
45*a58d3d2aSXin Li       non-linearity can handle. At the point where the signal reaches +/-2,
46*a58d3d2aSXin Li       the derivative will be zero anyway, so this doesn't introduce any
47*a58d3d2aSXin Li       discontinuity in the derivative. */
48*a58d3d2aSXin Li    for (i=0;i<N*C;i++)
49*a58d3d2aSXin Li       _x[i] = MAX16(-2.f, MIN16(2.f, _x[i]));
50*a58d3d2aSXin Li    for (c=0;c<C;c++)
51*a58d3d2aSXin Li    {
52*a58d3d2aSXin Li       float a;
53*a58d3d2aSXin Li       float x0;
54*a58d3d2aSXin Li       int curr;
55*a58d3d2aSXin Li 
56*a58d3d2aSXin Li       x = _x+c;
57*a58d3d2aSXin Li       a = declip_mem[c];
58*a58d3d2aSXin Li       /* Continue applying the non-linearity from the previous frame to avoid
59*a58d3d2aSXin Li          any discontinuity. */
60*a58d3d2aSXin Li       for (i=0;i<N;i++)
61*a58d3d2aSXin Li       {
62*a58d3d2aSXin Li          if (x[i*C]*a>=0)
63*a58d3d2aSXin Li             break;
64*a58d3d2aSXin Li          x[i*C] = x[i*C]+a*x[i*C]*x[i*C];
65*a58d3d2aSXin Li       }
66*a58d3d2aSXin Li 
67*a58d3d2aSXin Li       curr=0;
68*a58d3d2aSXin Li       x0 = x[0];
69*a58d3d2aSXin Li       while(1)
70*a58d3d2aSXin Li       {
71*a58d3d2aSXin Li          int start, end;
72*a58d3d2aSXin Li          float maxval;
73*a58d3d2aSXin Li          int special=0;
74*a58d3d2aSXin Li          int peak_pos;
75*a58d3d2aSXin Li          for (i=curr;i<N;i++)
76*a58d3d2aSXin Li          {
77*a58d3d2aSXin Li             if (x[i*C]>1 || x[i*C]<-1)
78*a58d3d2aSXin Li                break;
79*a58d3d2aSXin Li          }
80*a58d3d2aSXin Li          if (i==N)
81*a58d3d2aSXin Li          {
82*a58d3d2aSXin Li             a=0;
83*a58d3d2aSXin Li             break;
84*a58d3d2aSXin Li          }
85*a58d3d2aSXin Li          peak_pos = i;
86*a58d3d2aSXin Li          start=end=i;
87*a58d3d2aSXin Li          maxval=ABS16(x[i*C]);
88*a58d3d2aSXin Li          /* Look for first zero crossing before clipping */
89*a58d3d2aSXin Li          while (start>0 && x[i*C]*x[(start-1)*C]>=0)
90*a58d3d2aSXin Li             start--;
91*a58d3d2aSXin Li          /* Look for first zero crossing after clipping */
92*a58d3d2aSXin Li          while (end<N && x[i*C]*x[end*C]>=0)
93*a58d3d2aSXin Li          {
94*a58d3d2aSXin Li             /* Look for other peaks until the next zero-crossing. */
95*a58d3d2aSXin Li             if (ABS16(x[end*C])>maxval)
96*a58d3d2aSXin Li             {
97*a58d3d2aSXin Li                maxval = ABS16(x[end*C]);
98*a58d3d2aSXin Li                peak_pos = end;
99*a58d3d2aSXin Li             }
100*a58d3d2aSXin Li             end++;
101*a58d3d2aSXin Li          }
102*a58d3d2aSXin Li          /* Detect the special case where we clip before the first zero crossing */
103*a58d3d2aSXin Li          special = (start==0 && x[i*C]*x[0]>=0);
104*a58d3d2aSXin Li 
105*a58d3d2aSXin Li          /* Compute a such that maxval + a*maxval^2 = 1 */
106*a58d3d2aSXin Li          a=(maxval-1)/(maxval*maxval);
107*a58d3d2aSXin Li          /* Slightly boost "a" by 2^-22. This is just enough to ensure -ffast-math
108*a58d3d2aSXin Li             does not cause output values larger than +/-1, but small enough not
109*a58d3d2aSXin Li             to matter even for 24-bit output.  */
110*a58d3d2aSXin Li          a += a*2.4e-7f;
111*a58d3d2aSXin Li          if (x[i*C]>0)
112*a58d3d2aSXin Li             a = -a;
113*a58d3d2aSXin Li          /* Apply soft clipping */
114*a58d3d2aSXin Li          for (i=start;i<end;i++)
115*a58d3d2aSXin Li             x[i*C] = x[i*C]+a*x[i*C]*x[i*C];
116*a58d3d2aSXin Li 
117*a58d3d2aSXin Li          if (special && peak_pos>=2)
118*a58d3d2aSXin Li          {
119*a58d3d2aSXin Li             /* Add a linear ramp from the first sample to the signal peak.
120*a58d3d2aSXin Li                This avoids a discontinuity at the beginning of the frame. */
121*a58d3d2aSXin Li             float delta;
122*a58d3d2aSXin Li             float offset = x0-x[0];
123*a58d3d2aSXin Li             delta = offset / peak_pos;
124*a58d3d2aSXin Li             for (i=curr;i<peak_pos;i++)
125*a58d3d2aSXin Li             {
126*a58d3d2aSXin Li                offset -= delta;
127*a58d3d2aSXin Li                x[i*C] += offset;
128*a58d3d2aSXin Li                x[i*C] = MAX16(-1.f, MIN16(1.f, x[i*C]));
129*a58d3d2aSXin Li             }
130*a58d3d2aSXin Li          }
131*a58d3d2aSXin Li          curr = end;
132*a58d3d2aSXin Li          if (curr==N)
133*a58d3d2aSXin Li             break;
134*a58d3d2aSXin Li       }
135*a58d3d2aSXin Li       declip_mem[c] = a;
136*a58d3d2aSXin Li    }
137*a58d3d2aSXin Li }
138*a58d3d2aSXin Li #endif
139*a58d3d2aSXin Li 
encode_size(int size,unsigned char * data)140*a58d3d2aSXin Li int encode_size(int size, unsigned char *data)
141*a58d3d2aSXin Li {
142*a58d3d2aSXin Li    if (size < 252)
143*a58d3d2aSXin Li    {
144*a58d3d2aSXin Li       data[0] = size;
145*a58d3d2aSXin Li       return 1;
146*a58d3d2aSXin Li    } else {
147*a58d3d2aSXin Li       data[0] = 252+(size&0x3);
148*a58d3d2aSXin Li       data[1] = (size-(int)data[0])>>2;
149*a58d3d2aSXin Li       return 2;
150*a58d3d2aSXin Li    }
151*a58d3d2aSXin Li }
152*a58d3d2aSXin Li 
parse_size(const unsigned char * data,opus_int32 len,opus_int16 * size)153*a58d3d2aSXin Li static int parse_size(const unsigned char *data, opus_int32 len, opus_int16 *size)
154*a58d3d2aSXin Li {
155*a58d3d2aSXin Li    if (len<1)
156*a58d3d2aSXin Li    {
157*a58d3d2aSXin Li       *size = -1;
158*a58d3d2aSXin Li       return -1;
159*a58d3d2aSXin Li    } else if (data[0]<252)
160*a58d3d2aSXin Li    {
161*a58d3d2aSXin Li       *size = data[0];
162*a58d3d2aSXin Li       return 1;
163*a58d3d2aSXin Li    } else if (len<2)
164*a58d3d2aSXin Li    {
165*a58d3d2aSXin Li       *size = -1;
166*a58d3d2aSXin Li       return -1;
167*a58d3d2aSXin Li    } else {
168*a58d3d2aSXin Li       *size = 4*data[1] + data[0];
169*a58d3d2aSXin Li       return 2;
170*a58d3d2aSXin Li    }
171*a58d3d2aSXin Li }
172*a58d3d2aSXin Li 
opus_packet_get_samples_per_frame(const unsigned char * data,opus_int32 Fs)173*a58d3d2aSXin Li int opus_packet_get_samples_per_frame(const unsigned char *data,
174*a58d3d2aSXin Li       opus_int32 Fs)
175*a58d3d2aSXin Li {
176*a58d3d2aSXin Li    int audiosize;
177*a58d3d2aSXin Li    if (data[0]&0x80)
178*a58d3d2aSXin Li    {
179*a58d3d2aSXin Li       audiosize = ((data[0]>>3)&0x3);
180*a58d3d2aSXin Li       audiosize = (Fs<<audiosize)/400;
181*a58d3d2aSXin Li    } else if ((data[0]&0x60) == 0x60)
182*a58d3d2aSXin Li    {
183*a58d3d2aSXin Li       audiosize = (data[0]&0x08) ? Fs/50 : Fs/100;
184*a58d3d2aSXin Li    } else {
185*a58d3d2aSXin Li       audiosize = ((data[0]>>3)&0x3);
186*a58d3d2aSXin Li       if (audiosize == 3)
187*a58d3d2aSXin Li          audiosize = Fs*60/1000;
188*a58d3d2aSXin Li       else
189*a58d3d2aSXin Li          audiosize = (Fs<<audiosize)/100;
190*a58d3d2aSXin Li    }
191*a58d3d2aSXin Li    return audiosize;
192*a58d3d2aSXin Li }
193*a58d3d2aSXin Li 
opus_packet_parse_impl(const unsigned char * data,opus_int32 len,int self_delimited,unsigned char * out_toc,const unsigned char * frames[48],opus_int16 size[48],int * payload_offset,opus_int32 * packet_offset,const unsigned char ** padding,opus_int32 * padding_len)194*a58d3d2aSXin Li int opus_packet_parse_impl(const unsigned char *data, opus_int32 len,
195*a58d3d2aSXin Li       int self_delimited, unsigned char *out_toc,
196*a58d3d2aSXin Li       const unsigned char *frames[48], opus_int16 size[48],
197*a58d3d2aSXin Li       int *payload_offset, opus_int32 *packet_offset,
198*a58d3d2aSXin Li       const unsigned char **padding, opus_int32 *padding_len)
199*a58d3d2aSXin Li {
200*a58d3d2aSXin Li    int i, bytes;
201*a58d3d2aSXin Li    int count;
202*a58d3d2aSXin Li    int cbr;
203*a58d3d2aSXin Li    unsigned char ch, toc;
204*a58d3d2aSXin Li    int framesize;
205*a58d3d2aSXin Li    opus_int32 last_size;
206*a58d3d2aSXin Li    opus_int32 pad = 0;
207*a58d3d2aSXin Li    const unsigned char *data0 = data;
208*a58d3d2aSXin Li 
209*a58d3d2aSXin Li    if (size==NULL || len<0)
210*a58d3d2aSXin Li       return OPUS_BAD_ARG;
211*a58d3d2aSXin Li    if (len==0)
212*a58d3d2aSXin Li       return OPUS_INVALID_PACKET;
213*a58d3d2aSXin Li 
214*a58d3d2aSXin Li    framesize = opus_packet_get_samples_per_frame(data, 48000);
215*a58d3d2aSXin Li 
216*a58d3d2aSXin Li    cbr = 0;
217*a58d3d2aSXin Li    toc = *data++;
218*a58d3d2aSXin Li    len--;
219*a58d3d2aSXin Li    last_size = len;
220*a58d3d2aSXin Li    switch (toc&0x3)
221*a58d3d2aSXin Li    {
222*a58d3d2aSXin Li    /* One frame */
223*a58d3d2aSXin Li    case 0:
224*a58d3d2aSXin Li       count=1;
225*a58d3d2aSXin Li       break;
226*a58d3d2aSXin Li    /* Two CBR frames */
227*a58d3d2aSXin Li    case 1:
228*a58d3d2aSXin Li       count=2;
229*a58d3d2aSXin Li       cbr = 1;
230*a58d3d2aSXin Li       if (!self_delimited)
231*a58d3d2aSXin Li       {
232*a58d3d2aSXin Li          if (len&0x1)
233*a58d3d2aSXin Li             return OPUS_INVALID_PACKET;
234*a58d3d2aSXin Li          last_size = len/2;
235*a58d3d2aSXin Li          /* If last_size doesn't fit in size[0], we'll catch it later */
236*a58d3d2aSXin Li          size[0] = (opus_int16)last_size;
237*a58d3d2aSXin Li       }
238*a58d3d2aSXin Li       break;
239*a58d3d2aSXin Li    /* Two VBR frames */
240*a58d3d2aSXin Li    case 2:
241*a58d3d2aSXin Li       count = 2;
242*a58d3d2aSXin Li       bytes = parse_size(data, len, size);
243*a58d3d2aSXin Li       len -= bytes;
244*a58d3d2aSXin Li       if (size[0]<0 || size[0] > len)
245*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
246*a58d3d2aSXin Li       data += bytes;
247*a58d3d2aSXin Li       last_size = len-size[0];
248*a58d3d2aSXin Li       break;
249*a58d3d2aSXin Li    /* Multiple CBR/VBR frames (from 0 to 120 ms) */
250*a58d3d2aSXin Li    default: /*case 3:*/
251*a58d3d2aSXin Li       if (len<1)
252*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
253*a58d3d2aSXin Li       /* Number of frames encoded in bits 0 to 5 */
254*a58d3d2aSXin Li       ch = *data++;
255*a58d3d2aSXin Li       count = ch&0x3F;
256*a58d3d2aSXin Li       if (count <= 0 || framesize*(opus_int32)count > 5760)
257*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
258*a58d3d2aSXin Li       len--;
259*a58d3d2aSXin Li       /* Padding flag is bit 6 */
260*a58d3d2aSXin Li       if (ch&0x40)
261*a58d3d2aSXin Li       {
262*a58d3d2aSXin Li          int p;
263*a58d3d2aSXin Li          do {
264*a58d3d2aSXin Li             int tmp;
265*a58d3d2aSXin Li             if (len<=0)
266*a58d3d2aSXin Li                return OPUS_INVALID_PACKET;
267*a58d3d2aSXin Li             p = *data++;
268*a58d3d2aSXin Li             len--;
269*a58d3d2aSXin Li             tmp = p==255 ? 254: p;
270*a58d3d2aSXin Li             len -= tmp;
271*a58d3d2aSXin Li             pad += tmp;
272*a58d3d2aSXin Li          } while (p==255);
273*a58d3d2aSXin Li       }
274*a58d3d2aSXin Li       if (len<0)
275*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
276*a58d3d2aSXin Li       /* VBR flag is bit 7 */
277*a58d3d2aSXin Li       cbr = !(ch&0x80);
278*a58d3d2aSXin Li       if (!cbr)
279*a58d3d2aSXin Li       {
280*a58d3d2aSXin Li          /* VBR case */
281*a58d3d2aSXin Li          last_size = len;
282*a58d3d2aSXin Li          for (i=0;i<count-1;i++)
283*a58d3d2aSXin Li          {
284*a58d3d2aSXin Li             bytes = parse_size(data, len, size+i);
285*a58d3d2aSXin Li             len -= bytes;
286*a58d3d2aSXin Li             if (size[i]<0 || size[i] > len)
287*a58d3d2aSXin Li                return OPUS_INVALID_PACKET;
288*a58d3d2aSXin Li             data += bytes;
289*a58d3d2aSXin Li             last_size -= bytes+size[i];
290*a58d3d2aSXin Li          }
291*a58d3d2aSXin Li          if (last_size<0)
292*a58d3d2aSXin Li             return OPUS_INVALID_PACKET;
293*a58d3d2aSXin Li       } else if (!self_delimited)
294*a58d3d2aSXin Li       {
295*a58d3d2aSXin Li          /* CBR case */
296*a58d3d2aSXin Li          last_size = len/count;
297*a58d3d2aSXin Li          if (last_size*count!=len)
298*a58d3d2aSXin Li             return OPUS_INVALID_PACKET;
299*a58d3d2aSXin Li          for (i=0;i<count-1;i++)
300*a58d3d2aSXin Li             size[i] = (opus_int16)last_size;
301*a58d3d2aSXin Li       }
302*a58d3d2aSXin Li       break;
303*a58d3d2aSXin Li    }
304*a58d3d2aSXin Li    /* Self-delimited framing has an extra size for the last frame. */
305*a58d3d2aSXin Li    if (self_delimited)
306*a58d3d2aSXin Li    {
307*a58d3d2aSXin Li       bytes = parse_size(data, len, size+count-1);
308*a58d3d2aSXin Li       len -= bytes;
309*a58d3d2aSXin Li       if (size[count-1]<0 || size[count-1] > len)
310*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
311*a58d3d2aSXin Li       data += bytes;
312*a58d3d2aSXin Li       /* For CBR packets, apply the size to all the frames. */
313*a58d3d2aSXin Li       if (cbr)
314*a58d3d2aSXin Li       {
315*a58d3d2aSXin Li          if (size[count-1]*count > len)
316*a58d3d2aSXin Li             return OPUS_INVALID_PACKET;
317*a58d3d2aSXin Li          for (i=0;i<count-1;i++)
318*a58d3d2aSXin Li             size[i] = size[count-1];
319*a58d3d2aSXin Li       } else if (bytes+size[count-1] > last_size)
320*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
321*a58d3d2aSXin Li    } else
322*a58d3d2aSXin Li    {
323*a58d3d2aSXin Li       /* Because it's not encoded explicitly, it's possible the size of the
324*a58d3d2aSXin Li          last packet (or all the packets, for the CBR case) is larger than
325*a58d3d2aSXin Li          1275. Reject them here.*/
326*a58d3d2aSXin Li       if (last_size > 1275)
327*a58d3d2aSXin Li          return OPUS_INVALID_PACKET;
328*a58d3d2aSXin Li       size[count-1] = (opus_int16)last_size;
329*a58d3d2aSXin Li    }
330*a58d3d2aSXin Li 
331*a58d3d2aSXin Li    if (payload_offset)
332*a58d3d2aSXin Li       *payload_offset = (int)(data-data0);
333*a58d3d2aSXin Li 
334*a58d3d2aSXin Li    for (i=0;i<count;i++)
335*a58d3d2aSXin Li    {
336*a58d3d2aSXin Li       if (frames)
337*a58d3d2aSXin Li          frames[i] = data;
338*a58d3d2aSXin Li       data += size[i];
339*a58d3d2aSXin Li    }
340*a58d3d2aSXin Li 
341*a58d3d2aSXin Li    if (padding != NULL)
342*a58d3d2aSXin Li    {
343*a58d3d2aSXin Li       *padding = data;
344*a58d3d2aSXin Li       *padding_len = pad;
345*a58d3d2aSXin Li    }
346*a58d3d2aSXin Li    if (packet_offset)
347*a58d3d2aSXin Li       *packet_offset = pad+(opus_int32)(data-data0);
348*a58d3d2aSXin Li 
349*a58d3d2aSXin Li    if (out_toc)
350*a58d3d2aSXin Li       *out_toc = toc;
351*a58d3d2aSXin Li 
352*a58d3d2aSXin Li    return count;
353*a58d3d2aSXin Li }
354*a58d3d2aSXin Li 
opus_packet_parse(const unsigned char * data,opus_int32 len,unsigned char * out_toc,const unsigned char * frames[48],opus_int16 size[48],int * payload_offset)355*a58d3d2aSXin Li int opus_packet_parse(const unsigned char *data, opus_int32 len,
356*a58d3d2aSXin Li       unsigned char *out_toc, const unsigned char *frames[48],
357*a58d3d2aSXin Li       opus_int16 size[48], int *payload_offset)
358*a58d3d2aSXin Li {
359*a58d3d2aSXin Li    return opus_packet_parse_impl(data, len, 0, out_toc,
360*a58d3d2aSXin Li                                  frames, size, payload_offset, NULL, NULL, NULL);
361*a58d3d2aSXin Li }
362*a58d3d2aSXin Li 
363