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