xref: /btstack/3rd-party/lc3-google/src/lc3.c (revision 9a19cd786042b1fc78813d984efdd045e84593df)
1*9a19cd78SMatthias Ringwald /******************************************************************************
2*9a19cd78SMatthias Ringwald  *
3*9a19cd78SMatthias Ringwald  *  Copyright 2021 Google, Inc.
4*9a19cd78SMatthias Ringwald  *
5*9a19cd78SMatthias Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
6*9a19cd78SMatthias Ringwald  *  you may not use this file except in compliance with the License.
7*9a19cd78SMatthias Ringwald  *  You may obtain a copy of the License at:
8*9a19cd78SMatthias Ringwald  *
9*9a19cd78SMatthias Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
10*9a19cd78SMatthias Ringwald  *
11*9a19cd78SMatthias Ringwald  *  Unless required by applicable law or agreed to in writing, software
12*9a19cd78SMatthias Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
13*9a19cd78SMatthias Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*9a19cd78SMatthias Ringwald  *  See the License for the specific language governing permissions and
15*9a19cd78SMatthias Ringwald  *  limitations under the License.
16*9a19cd78SMatthias Ringwald  *
17*9a19cd78SMatthias Ringwald  ******************************************************************************/
18*9a19cd78SMatthias Ringwald 
19*9a19cd78SMatthias Ringwald #include <lc3.h>
20*9a19cd78SMatthias Ringwald 
21*9a19cd78SMatthias Ringwald #include "common.h"
22*9a19cd78SMatthias Ringwald #include "bits.h"
23*9a19cd78SMatthias Ringwald 
24*9a19cd78SMatthias Ringwald #include "attdet.h"
25*9a19cd78SMatthias Ringwald #include "bwdet.h"
26*9a19cd78SMatthias Ringwald #include "ltpf.h"
27*9a19cd78SMatthias Ringwald #include "mdct.h"
28*9a19cd78SMatthias Ringwald #include "energy.h"
29*9a19cd78SMatthias Ringwald #include "sns.h"
30*9a19cd78SMatthias Ringwald #include "tns.h"
31*9a19cd78SMatthias Ringwald #include "spec.h"
32*9a19cd78SMatthias Ringwald #include "plc.h"
33*9a19cd78SMatthias Ringwald 
34*9a19cd78SMatthias Ringwald 
35*9a19cd78SMatthias Ringwald /**
36*9a19cd78SMatthias Ringwald  * Frame side data
37*9a19cd78SMatthias Ringwald  */
38*9a19cd78SMatthias Ringwald 
39*9a19cd78SMatthias Ringwald struct side_data {
40*9a19cd78SMatthias Ringwald     enum lc3_bandwidth bw;
41*9a19cd78SMatthias Ringwald     bool pitch_present;
42*9a19cd78SMatthias Ringwald     lc3_ltpf_data_t ltpf;
43*9a19cd78SMatthias Ringwald     lc3_sns_data_t sns;
44*9a19cd78SMatthias Ringwald     lc3_tns_data_t tns;
45*9a19cd78SMatthias Ringwald     lc3_spec_side_t spec;
46*9a19cd78SMatthias Ringwald };
47*9a19cd78SMatthias Ringwald 
48*9a19cd78SMatthias Ringwald 
49*9a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
50*9a19cd78SMatthias Ringwald  *  General
51*9a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
52*9a19cd78SMatthias Ringwald 
53*9a19cd78SMatthias Ringwald /**
54*9a19cd78SMatthias Ringwald  * Resolve frame duration in us
55*9a19cd78SMatthias Ringwald  * us              Frame duration in us
56*9a19cd78SMatthias Ringwald  * return          Frame duration identifier, or LC3_NUM_DT
57*9a19cd78SMatthias Ringwald  */
58*9a19cd78SMatthias Ringwald static enum lc3_dt resolve_dt(int us)
59*9a19cd78SMatthias Ringwald {
60*9a19cd78SMatthias Ringwald     return us ==  7500 ? LC3_DT_7M5 :
61*9a19cd78SMatthias Ringwald            us == 10000 ? LC3_DT_10M : LC3_NUM_DT;
62*9a19cd78SMatthias Ringwald }
63*9a19cd78SMatthias Ringwald 
64*9a19cd78SMatthias Ringwald /**
65*9a19cd78SMatthias Ringwald  * Resolve samplerate in Hz
66*9a19cd78SMatthias Ringwald  * hz              Samplerate in Hz
67*9a19cd78SMatthias Ringwald  * return          Sample rate identifier, or LC3_NUM_SRATE
68*9a19cd78SMatthias Ringwald  */
69*9a19cd78SMatthias Ringwald static enum lc3_srate resolve_sr(int hz)
70*9a19cd78SMatthias Ringwald {
71*9a19cd78SMatthias Ringwald     return hz ==  8000 ? LC3_SRATE_8K  : hz == 16000 ? LC3_SRATE_16K :
72*9a19cd78SMatthias Ringwald            hz == 24000 ? LC3_SRATE_24K : hz == 32000 ? LC3_SRATE_32K :
73*9a19cd78SMatthias Ringwald            hz == 48000 ? LC3_SRATE_48K : LC3_NUM_SRATE;
74*9a19cd78SMatthias Ringwald }
75*9a19cd78SMatthias Ringwald 
76*9a19cd78SMatthias Ringwald /**
77*9a19cd78SMatthias Ringwald  * Return the number of PCM samples in a frame
78*9a19cd78SMatthias Ringwald  */
79*9a19cd78SMatthias Ringwald int lc3_frame_samples(int dt_us, int sr_hz)
80*9a19cd78SMatthias Ringwald {
81*9a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
82*9a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
83*9a19cd78SMatthias Ringwald 
84*9a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
85*9a19cd78SMatthias Ringwald         return -1;
86*9a19cd78SMatthias Ringwald 
87*9a19cd78SMatthias Ringwald     return LC3_NS(dt, sr);
88*9a19cd78SMatthias Ringwald }
89*9a19cd78SMatthias Ringwald 
90*9a19cd78SMatthias Ringwald /**
91*9a19cd78SMatthias Ringwald  * Return the size of frames, from bitrate
92*9a19cd78SMatthias Ringwald  */
93*9a19cd78SMatthias Ringwald int lc3_frame_bytes(int dt_us, int bitrate)
94*9a19cd78SMatthias Ringwald {
95*9a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT)
96*9a19cd78SMatthias Ringwald         return -1;
97*9a19cd78SMatthias Ringwald 
98*9a19cd78SMatthias Ringwald     if (bitrate < LC3_MIN_BITRATE)
99*9a19cd78SMatthias Ringwald         return LC3_MIN_FRAME_BYTES;
100*9a19cd78SMatthias Ringwald 
101*9a19cd78SMatthias Ringwald     if (bitrate > LC3_MAX_BITRATE)
102*9a19cd78SMatthias Ringwald         return LC3_MAX_FRAME_BYTES;
103*9a19cd78SMatthias Ringwald 
104*9a19cd78SMatthias Ringwald     int nbytes = ((unsigned)bitrate * dt_us) / (1000*1000*8);
105*9a19cd78SMatthias Ringwald 
106*9a19cd78SMatthias Ringwald     return LC3_CLIP(nbytes, LC3_MIN_FRAME_BYTES, LC3_MAX_FRAME_BYTES);
107*9a19cd78SMatthias Ringwald }
108*9a19cd78SMatthias Ringwald 
109*9a19cd78SMatthias Ringwald /**
110*9a19cd78SMatthias Ringwald  * Resolve the bitrate, from the size of frames
111*9a19cd78SMatthias Ringwald  */
112*9a19cd78SMatthias Ringwald int lc3_resolve_bitrate(int dt_us, int nbytes)
113*9a19cd78SMatthias Ringwald {
114*9a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT)
115*9a19cd78SMatthias Ringwald         return -1;
116*9a19cd78SMatthias Ringwald 
117*9a19cd78SMatthias Ringwald     if (nbytes < LC3_MIN_FRAME_BYTES)
118*9a19cd78SMatthias Ringwald         return LC3_MIN_BITRATE;
119*9a19cd78SMatthias Ringwald 
120*9a19cd78SMatthias Ringwald     if (nbytes > LC3_MAX_FRAME_BYTES)
121*9a19cd78SMatthias Ringwald         return LC3_MAX_BITRATE;
122*9a19cd78SMatthias Ringwald 
123*9a19cd78SMatthias Ringwald     int bitrate = ((unsigned)nbytes * (1000*1000*8) + dt_us/2) / dt_us;
124*9a19cd78SMatthias Ringwald 
125*9a19cd78SMatthias Ringwald     return LC3_CLIP(bitrate, LC3_MIN_BITRATE, LC3_MAX_BITRATE);
126*9a19cd78SMatthias Ringwald }
127*9a19cd78SMatthias Ringwald 
128*9a19cd78SMatthias Ringwald /**
129*9a19cd78SMatthias Ringwald  * Return algorithmic delay, as a number of samples
130*9a19cd78SMatthias Ringwald  */
131*9a19cd78SMatthias Ringwald int lc3_delay_samples(int dt_us, int sr_hz)
132*9a19cd78SMatthias Ringwald {
133*9a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
134*9a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
135*9a19cd78SMatthias Ringwald 
136*9a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
137*9a19cd78SMatthias Ringwald         return -1;
138*9a19cd78SMatthias Ringwald 
139*9a19cd78SMatthias Ringwald     return (dt == LC3_DT_7M5 ? 8 : 5) * (LC3_SRATE_KHZ(sr) / 2);
140*9a19cd78SMatthias Ringwald }
141*9a19cd78SMatthias Ringwald 
142*9a19cd78SMatthias Ringwald 
143*9a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
144*9a19cd78SMatthias Ringwald  *  Encoder
145*9a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
146*9a19cd78SMatthias Ringwald 
147*9a19cd78SMatthias Ringwald /**
148*9a19cd78SMatthias Ringwald  * Input PCM Samples from signed 16 bits
149*9a19cd78SMatthias Ringwald  * encoder         Encoder state
150*9a19cd78SMatthias Ringwald  * pcm, stride     Input PCM samples, and count between two consecutives
151*9a19cd78SMatthias Ringwald  */
152*9a19cd78SMatthias Ringwald static void load_s16(
153*9a19cd78SMatthias Ringwald     struct lc3_encoder *encoder, const void *_pcm, int stride)
154*9a19cd78SMatthias Ringwald {
155*9a19cd78SMatthias Ringwald     const int16_t *pcm = _pcm;
156*9a19cd78SMatthias Ringwald 
157*9a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
158*9a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr_pcm;
159*9a19cd78SMatthias Ringwald     float *xs = encoder->xs;
160*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
161*9a19cd78SMatthias Ringwald 
162*9a19cd78SMatthias Ringwald     for (int i = 0; i < ns; i++)
163*9a19cd78SMatthias Ringwald         xs[i] = pcm[i*stride];
164*9a19cd78SMatthias Ringwald }
165*9a19cd78SMatthias Ringwald 
166*9a19cd78SMatthias Ringwald /**
167*9a19cd78SMatthias Ringwald  * Input PCM Samples from signed 24 bits
168*9a19cd78SMatthias Ringwald  * encoder         Encoder state
169*9a19cd78SMatthias Ringwald  * pcm, stride     Input PCM samples, and count between two consecutives
170*9a19cd78SMatthias Ringwald  */
171*9a19cd78SMatthias Ringwald static void load_s24(
172*9a19cd78SMatthias Ringwald     struct lc3_encoder *encoder, const void *_pcm, int stride)
173*9a19cd78SMatthias Ringwald {
174*9a19cd78SMatthias Ringwald     const int32_t *pcm = _pcm;
175*9a19cd78SMatthias Ringwald 
176*9a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
177*9a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr_pcm;
178*9a19cd78SMatthias Ringwald     float *xs = encoder->xs;
179*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
180*9a19cd78SMatthias Ringwald 
181*9a19cd78SMatthias Ringwald     for (int i = 0; i < ns; i++)
182*9a19cd78SMatthias Ringwald         xs[i] = ldexpf(pcm[i*stride], -8);
183*9a19cd78SMatthias Ringwald }
184*9a19cd78SMatthias Ringwald 
185*9a19cd78SMatthias Ringwald /**
186*9a19cd78SMatthias Ringwald  * Frame Analysis
187*9a19cd78SMatthias Ringwald  * encoder         Encoder state
188*9a19cd78SMatthias Ringwald  * nbytes          Size in bytes of the frame
189*9a19cd78SMatthias Ringwald  * side, xq        Return frame data
190*9a19cd78SMatthias Ringwald  */
191*9a19cd78SMatthias Ringwald static void analyze(struct lc3_encoder *encoder,
192*9a19cd78SMatthias Ringwald     int nbytes, struct side_data *side, int16_t *xq)
193*9a19cd78SMatthias Ringwald {
194*9a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
195*9a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr;
196*9a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = encoder->sr_pcm;
197*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
198*9a19cd78SMatthias Ringwald     int nd = LC3_ND(dt, sr_pcm);
199*9a19cd78SMatthias Ringwald 
200*9a19cd78SMatthias Ringwald     float *xs = encoder->xs;
201*9a19cd78SMatthias Ringwald     float *xf = encoder->xf;
202*9a19cd78SMatthias Ringwald 
203*9a19cd78SMatthias Ringwald     /* --- Temporal --- */
204*9a19cd78SMatthias Ringwald 
205*9a19cd78SMatthias Ringwald     bool att = lc3_attdet_run(dt, sr_pcm, nbytes, &encoder->attdet, xs);
206*9a19cd78SMatthias Ringwald 
207*9a19cd78SMatthias Ringwald     side->pitch_present =
208*9a19cd78SMatthias Ringwald         lc3_ltpf_analyse(dt, sr_pcm, &encoder->ltpf, xs, &side->ltpf);
209*9a19cd78SMatthias Ringwald 
210*9a19cd78SMatthias Ringwald     /* --- Spectral --- */
211*9a19cd78SMatthias Ringwald 
212*9a19cd78SMatthias Ringwald     float e[LC3_NUM_BANDS];
213*9a19cd78SMatthias Ringwald 
214*9a19cd78SMatthias Ringwald     lc3_mdct_forward(dt, sr_pcm, sr, xs, xf);
215*9a19cd78SMatthias Ringwald     memmove(xs - nd, xs + ns-nd, nd * sizeof(float));
216*9a19cd78SMatthias Ringwald 
217*9a19cd78SMatthias Ringwald     bool nn_flag = lc3_energy_compute(dt, sr, xf, e);
218*9a19cd78SMatthias Ringwald     if (nn_flag)
219*9a19cd78SMatthias Ringwald         lc3_ltpf_disable(&side->ltpf);
220*9a19cd78SMatthias Ringwald 
221*9a19cd78SMatthias Ringwald     side->bw = lc3_bwdet_run(dt, sr, e);
222*9a19cd78SMatthias Ringwald 
223*9a19cd78SMatthias Ringwald     lc3_sns_analyze(dt, sr, e, att, &side->sns, xf, xf);
224*9a19cd78SMatthias Ringwald 
225*9a19cd78SMatthias Ringwald     lc3_tns_analyze(dt, side->bw, nn_flag, nbytes, &side->tns, xf);
226*9a19cd78SMatthias Ringwald 
227*9a19cd78SMatthias Ringwald     lc3_spec_analyze(dt, sr,
228*9a19cd78SMatthias Ringwald         nbytes, side->pitch_present, &side->tns,
229*9a19cd78SMatthias Ringwald         &encoder->spec, xf, xq, &side->spec);
230*9a19cd78SMatthias Ringwald }
231*9a19cd78SMatthias Ringwald 
232*9a19cd78SMatthias Ringwald /**
233*9a19cd78SMatthias Ringwald  * Encode bitstream
234*9a19cd78SMatthias Ringwald  * encoder         Encoder state
235*9a19cd78SMatthias Ringwald  * side, xq        The frame data
236*9a19cd78SMatthias Ringwald  * nbytes          Target size of the frame (20 to 400)
237*9a19cd78SMatthias Ringwald  * buffer          Output bitstream buffer of `nbytes` size
238*9a19cd78SMatthias Ringwald  */
239*9a19cd78SMatthias Ringwald static void encode(struct lc3_encoder *encoder,
240*9a19cd78SMatthias Ringwald     const struct side_data *side, int16_t *xq, int nbytes, void *buffer)
241*9a19cd78SMatthias Ringwald {
242*9a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
243*9a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr;
244*9a19cd78SMatthias Ringwald     enum lc3_bandwidth bw = side->bw;
245*9a19cd78SMatthias Ringwald     float *xf = encoder->xf;
246*9a19cd78SMatthias Ringwald 
247*9a19cd78SMatthias Ringwald     lc3_bits_t bits;
248*9a19cd78SMatthias Ringwald 
249*9a19cd78SMatthias Ringwald     lc3_setup_bits(&bits, LC3_BITS_MODE_WRITE, buffer, nbytes);
250*9a19cd78SMatthias Ringwald 
251*9a19cd78SMatthias Ringwald     lc3_bwdet_put_bw(&bits, sr, bw);
252*9a19cd78SMatthias Ringwald 
253*9a19cd78SMatthias Ringwald     lc3_spec_put_side(&bits, dt, sr, &side->spec);
254*9a19cd78SMatthias Ringwald 
255*9a19cd78SMatthias Ringwald     lc3_tns_put_data(&bits, &side->tns);
256*9a19cd78SMatthias Ringwald 
257*9a19cd78SMatthias Ringwald     lc3_put_bit(&bits, side->pitch_present);
258*9a19cd78SMatthias Ringwald 
259*9a19cd78SMatthias Ringwald     lc3_sns_put_data(&bits, &side->sns);
260*9a19cd78SMatthias Ringwald 
261*9a19cd78SMatthias Ringwald     if (side->pitch_present)
262*9a19cd78SMatthias Ringwald         lc3_ltpf_put_data(&bits, &side->ltpf);
263*9a19cd78SMatthias Ringwald 
264*9a19cd78SMatthias Ringwald     lc3_spec_encode(&bits,
265*9a19cd78SMatthias Ringwald         dt, sr, bw, nbytes, xq, &side->spec, xf);
266*9a19cd78SMatthias Ringwald 
267*9a19cd78SMatthias Ringwald     lc3_flush_bits(&bits);
268*9a19cd78SMatthias Ringwald }
269*9a19cd78SMatthias Ringwald 
270*9a19cd78SMatthias Ringwald /**
271*9a19cd78SMatthias Ringwald  * Return size needed for an encoder
272*9a19cd78SMatthias Ringwald  */
273*9a19cd78SMatthias Ringwald unsigned lc3_encoder_size(int dt_us, int sr_hz)
274*9a19cd78SMatthias Ringwald {
275*9a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT ||
276*9a19cd78SMatthias Ringwald         resolve_sr(sr_hz) >= LC3_NUM_SRATE)
277*9a19cd78SMatthias Ringwald         return 0;
278*9a19cd78SMatthias Ringwald 
279*9a19cd78SMatthias Ringwald     return sizeof(struct lc3_encoder) +
280*9a19cd78SMatthias Ringwald         LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) * sizeof(float);
281*9a19cd78SMatthias Ringwald }
282*9a19cd78SMatthias Ringwald 
283*9a19cd78SMatthias Ringwald /**
284*9a19cd78SMatthias Ringwald  * Setup encoder
285*9a19cd78SMatthias Ringwald  */
286*9a19cd78SMatthias Ringwald struct lc3_encoder *lc3_setup_encoder(
287*9a19cd78SMatthias Ringwald     int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
288*9a19cd78SMatthias Ringwald {
289*9a19cd78SMatthias Ringwald     if (sr_pcm_hz <= 0)
290*9a19cd78SMatthias Ringwald         sr_pcm_hz = sr_hz;
291*9a19cd78SMatthias Ringwald 
292*9a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
293*9a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
294*9a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
295*9a19cd78SMatthias Ringwald 
296*9a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
297*9a19cd78SMatthias Ringwald         return NULL;
298*9a19cd78SMatthias Ringwald 
299*9a19cd78SMatthias Ringwald     struct lc3_encoder *encoder = mem;
300*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
301*9a19cd78SMatthias Ringwald     int nd = LC3_ND(dt, sr_pcm);
302*9a19cd78SMatthias Ringwald 
303*9a19cd78SMatthias Ringwald     *encoder = (struct lc3_encoder){
304*9a19cd78SMatthias Ringwald         .dt = dt, .sr = sr,
305*9a19cd78SMatthias Ringwald         .sr_pcm = sr_pcm,
306*9a19cd78SMatthias Ringwald         .xs = encoder->s + nd,
307*9a19cd78SMatthias Ringwald         .xf = encoder->s + nd+ns,
308*9a19cd78SMatthias Ringwald     };
309*9a19cd78SMatthias Ringwald 
310*9a19cd78SMatthias Ringwald     memset(encoder->s, 0,
311*9a19cd78SMatthias Ringwald         LC3_ENCODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
312*9a19cd78SMatthias Ringwald 
313*9a19cd78SMatthias Ringwald     return encoder;
314*9a19cd78SMatthias Ringwald }
315*9a19cd78SMatthias Ringwald 
316*9a19cd78SMatthias Ringwald /**
317*9a19cd78SMatthias Ringwald  * Encode a frame
318*9a19cd78SMatthias Ringwald  */
319*9a19cd78SMatthias Ringwald int lc3_encode(struct lc3_encoder *encoder, enum lc3_pcm_format fmt,
320*9a19cd78SMatthias Ringwald     const void *pcm, int stride, int nbytes, void *out)
321*9a19cd78SMatthias Ringwald {
322*9a19cd78SMatthias Ringwald     static void (* const load[])(struct lc3_encoder *, const void *, int) = {
323*9a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S16] = load_s16,
324*9a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S24] = load_s24,
325*9a19cd78SMatthias Ringwald     };
326*9a19cd78SMatthias Ringwald 
327*9a19cd78SMatthias Ringwald     /* --- Check parameters --- */
328*9a19cd78SMatthias Ringwald 
329*9a19cd78SMatthias Ringwald     if (!encoder || nbytes < LC3_MIN_FRAME_BYTES
330*9a19cd78SMatthias Ringwald                  || nbytes > LC3_MAX_FRAME_BYTES)
331*9a19cd78SMatthias Ringwald         return -1;
332*9a19cd78SMatthias Ringwald 
333*9a19cd78SMatthias Ringwald     /* --- Processing --- */
334*9a19cd78SMatthias Ringwald 
335*9a19cd78SMatthias Ringwald     struct side_data side;
336*9a19cd78SMatthias Ringwald     int16_t xq[LC3_NE(encoder->dt, encoder->sr)];
337*9a19cd78SMatthias Ringwald 
338*9a19cd78SMatthias Ringwald     load[fmt](encoder, pcm, stride);
339*9a19cd78SMatthias Ringwald 
340*9a19cd78SMatthias Ringwald     analyze(encoder, nbytes, &side, xq);
341*9a19cd78SMatthias Ringwald 
342*9a19cd78SMatthias Ringwald     encode(encoder, &side, xq, nbytes, out);
343*9a19cd78SMatthias Ringwald 
344*9a19cd78SMatthias Ringwald     return 0;
345*9a19cd78SMatthias Ringwald }
346*9a19cd78SMatthias Ringwald 
347*9a19cd78SMatthias Ringwald 
348*9a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
349*9a19cd78SMatthias Ringwald  *  Decoder
350*9a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
351*9a19cd78SMatthias Ringwald 
352*9a19cd78SMatthias Ringwald /**
353*9a19cd78SMatthias Ringwald  * Output PCM Samples to signed 16 bits
354*9a19cd78SMatthias Ringwald  * decoder         Decoder state
355*9a19cd78SMatthias Ringwald  * pcm, stride     Output PCM samples, and count between two consecutives
356*9a19cd78SMatthias Ringwald  */
357*9a19cd78SMatthias Ringwald static void store_s16(
358*9a19cd78SMatthias Ringwald     struct lc3_decoder *decoder, void *_pcm, int stride)
359*9a19cd78SMatthias Ringwald {
360*9a19cd78SMatthias Ringwald     int16_t *pcm = _pcm;
361*9a19cd78SMatthias Ringwald 
362*9a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
363*9a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr_pcm;
364*9a19cd78SMatthias Ringwald     float *xs = decoder->xs;
365*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
366*9a19cd78SMatthias Ringwald 
367*9a19cd78SMatthias Ringwald     for ( ; ns > 0; ns--, xs++, pcm += stride) {
368*9a19cd78SMatthias Ringwald         int s = *xs >= 0 ? (int)(*xs + 0.5f) : (int)(*xs - 0.5f);
369*9a19cd78SMatthias Ringwald         *pcm = LC3_CLIP(s, INT16_MIN, INT16_MAX);
370*9a19cd78SMatthias Ringwald     }
371*9a19cd78SMatthias Ringwald }
372*9a19cd78SMatthias Ringwald 
373*9a19cd78SMatthias Ringwald /**
374*9a19cd78SMatthias Ringwald  * Output PCM Samples to signed 24 bits
375*9a19cd78SMatthias Ringwald  * decoder         Decoder state
376*9a19cd78SMatthias Ringwald  * pcm, stride     Output PCM samples, and count between two consecutives
377*9a19cd78SMatthias Ringwald  */
378*9a19cd78SMatthias Ringwald static void store_s24(
379*9a19cd78SMatthias Ringwald     struct lc3_decoder *decoder, void *_pcm, int stride)
380*9a19cd78SMatthias Ringwald {
381*9a19cd78SMatthias Ringwald     int32_t *pcm = _pcm;
382*9a19cd78SMatthias Ringwald     const int32_t int24_max =  (1 << 23) - 1;
383*9a19cd78SMatthias Ringwald     const int32_t int24_min = -(1 << 23);
384*9a19cd78SMatthias Ringwald 
385*9a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
386*9a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr_pcm;
387*9a19cd78SMatthias Ringwald     float *xs = decoder->xs;
388*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
389*9a19cd78SMatthias Ringwald 
390*9a19cd78SMatthias Ringwald     for ( ; ns > 0; ns--, xs++, pcm += stride) {
391*9a19cd78SMatthias Ringwald         int32_t s = *xs >= 0 ? (int32_t)(ldexpf(*xs, 8) + 0.5f)
392*9a19cd78SMatthias Ringwald                              : (int32_t)(ldexpf(*xs, 8) - 0.5f);
393*9a19cd78SMatthias Ringwald         *pcm = LC3_CLIP(s, int24_min, int24_max);
394*9a19cd78SMatthias Ringwald     }
395*9a19cd78SMatthias Ringwald }
396*9a19cd78SMatthias Ringwald 
397*9a19cd78SMatthias Ringwald /**
398*9a19cd78SMatthias Ringwald  * Decode bitstream
399*9a19cd78SMatthias Ringwald  * decoder         Decoder state
400*9a19cd78SMatthias Ringwald  * data, nbytes    Input bitstream buffer
401*9a19cd78SMatthias Ringwald  * side            Return the side data
402*9a19cd78SMatthias Ringwald  * return          0: Ok  < 0: Bitsream error detected
403*9a19cd78SMatthias Ringwald  */
404*9a19cd78SMatthias Ringwald static int decode(struct lc3_decoder *decoder,
405*9a19cd78SMatthias Ringwald     const void *data, int nbytes, struct side_data *side)
406*9a19cd78SMatthias Ringwald {
407*9a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
408*9a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr;
409*9a19cd78SMatthias Ringwald     float *xf = decoder->xs;
410*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
411*9a19cd78SMatthias Ringwald     int ne = LC3_NE(dt, sr);
412*9a19cd78SMatthias Ringwald 
413*9a19cd78SMatthias Ringwald     lc3_bits_t bits;
414*9a19cd78SMatthias Ringwald     int ret = 0;
415*9a19cd78SMatthias Ringwald 
416*9a19cd78SMatthias Ringwald     lc3_setup_bits(&bits, LC3_BITS_MODE_READ, (void *)data, nbytes);
417*9a19cd78SMatthias Ringwald 
418*9a19cd78SMatthias Ringwald     if ((ret = lc3_bwdet_get_bw(&bits, sr, &side->bw)) < 0)
419*9a19cd78SMatthias Ringwald         return ret;
420*9a19cd78SMatthias Ringwald 
421*9a19cd78SMatthias Ringwald     if ((ret = lc3_spec_get_side(&bits, dt, sr, &side->spec)) < 0)
422*9a19cd78SMatthias Ringwald         return ret;
423*9a19cd78SMatthias Ringwald 
424*9a19cd78SMatthias Ringwald     lc3_tns_get_data(&bits, dt, side->bw, nbytes, &side->tns);
425*9a19cd78SMatthias Ringwald 
426*9a19cd78SMatthias Ringwald     side->pitch_present = lc3_get_bit(&bits);
427*9a19cd78SMatthias Ringwald 
428*9a19cd78SMatthias Ringwald     if ((ret = lc3_sns_get_data(&bits, &side->sns)) < 0)
429*9a19cd78SMatthias Ringwald         return ret;
430*9a19cd78SMatthias Ringwald 
431*9a19cd78SMatthias Ringwald     if (side->pitch_present)
432*9a19cd78SMatthias Ringwald         lc3_ltpf_get_data(&bits, &side->ltpf);
433*9a19cd78SMatthias Ringwald 
434*9a19cd78SMatthias Ringwald     if ((ret = lc3_spec_decode(&bits, dt, sr,
435*9a19cd78SMatthias Ringwald                     side->bw, nbytes, &side->spec, xf)) < 0)
436*9a19cd78SMatthias Ringwald         return ret;
437*9a19cd78SMatthias Ringwald 
438*9a19cd78SMatthias Ringwald     memset(xf + ne, 0, (ns - ne) * sizeof(float));
439*9a19cd78SMatthias Ringwald 
440*9a19cd78SMatthias Ringwald     return lc3_check_bits(&bits);
441*9a19cd78SMatthias Ringwald }
442*9a19cd78SMatthias Ringwald 
443*9a19cd78SMatthias Ringwald /**
444*9a19cd78SMatthias Ringwald  * Frame synthesis
445*9a19cd78SMatthias Ringwald  * decoder         Decoder state
446*9a19cd78SMatthias Ringwald  * side            Frame data, NULL performs PLC
447*9a19cd78SMatthias Ringwald  * nbytes          Size in bytes of the frame
448*9a19cd78SMatthias Ringwald  */
449*9a19cd78SMatthias Ringwald static void synthesize(struct lc3_decoder *decoder,
450*9a19cd78SMatthias Ringwald     const struct side_data *side, int nbytes)
451*9a19cd78SMatthias Ringwald {
452*9a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
453*9a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr;
454*9a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = decoder->sr_pcm;
455*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
456*9a19cd78SMatthias Ringwald     int ne = LC3_NE(dt, sr);
457*9a19cd78SMatthias Ringwald     int nh = LC3_NH(sr_pcm);
458*9a19cd78SMatthias Ringwald 
459*9a19cd78SMatthias Ringwald     float *xf = decoder->xs;
460*9a19cd78SMatthias Ringwald     float *xg = decoder->xg;
461*9a19cd78SMatthias Ringwald     float *xd = decoder->xd;
462*9a19cd78SMatthias Ringwald     float *xs = xf;
463*9a19cd78SMatthias Ringwald 
464*9a19cd78SMatthias Ringwald     if (side) {
465*9a19cd78SMatthias Ringwald         enum lc3_bandwidth bw = side->bw;
466*9a19cd78SMatthias Ringwald 
467*9a19cd78SMatthias Ringwald         lc3_plc_suspend(&decoder->plc);
468*9a19cd78SMatthias Ringwald 
469*9a19cd78SMatthias Ringwald         lc3_tns_synthesize(dt, bw, &side->tns, xf);
470*9a19cd78SMatthias Ringwald 
471*9a19cd78SMatthias Ringwald         lc3_sns_synthesize(dt, sr, &side->sns, xf, xg);
472*9a19cd78SMatthias Ringwald 
473*9a19cd78SMatthias Ringwald         lc3_mdct_inverse(dt, sr_pcm, sr, xg, xd, xs);
474*9a19cd78SMatthias Ringwald 
475*9a19cd78SMatthias Ringwald     } else {
476*9a19cd78SMatthias Ringwald         lc3_plc_synthesize(dt, sr, &decoder->plc, xg, xf);
477*9a19cd78SMatthias Ringwald 
478*9a19cd78SMatthias Ringwald         memset(xf + ne, 0, (ns - ne) * sizeof(float));
479*9a19cd78SMatthias Ringwald 
480*9a19cd78SMatthias Ringwald         lc3_mdct_inverse(dt, sr_pcm, sr, xf, xd, xs);
481*9a19cd78SMatthias Ringwald     }
482*9a19cd78SMatthias Ringwald 
483*9a19cd78SMatthias Ringwald     lc3_ltpf_synthesize(dt, sr_pcm, nbytes, &decoder->ltpf,
484*9a19cd78SMatthias Ringwald         side && side->pitch_present ? &side->ltpf : NULL, xs);
485*9a19cd78SMatthias Ringwald 
486*9a19cd78SMatthias Ringwald     memmove(xs - nh, xs - nh+ns, nh * sizeof(*xs));
487*9a19cd78SMatthias Ringwald }
488*9a19cd78SMatthias Ringwald 
489*9a19cd78SMatthias Ringwald /**
490*9a19cd78SMatthias Ringwald  * Return size needed for a decoder
491*9a19cd78SMatthias Ringwald  */
492*9a19cd78SMatthias Ringwald unsigned lc3_decoder_size(int dt_us, int sr_hz)
493*9a19cd78SMatthias Ringwald {
494*9a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT ||
495*9a19cd78SMatthias Ringwald         resolve_sr(sr_hz) >= LC3_NUM_SRATE)
496*9a19cd78SMatthias Ringwald         return 0;
497*9a19cd78SMatthias Ringwald 
498*9a19cd78SMatthias Ringwald     return sizeof(struct lc3_decoder) +
499*9a19cd78SMatthias Ringwald         LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) * sizeof(float);
500*9a19cd78SMatthias Ringwald }
501*9a19cd78SMatthias Ringwald 
502*9a19cd78SMatthias Ringwald /**
503*9a19cd78SMatthias Ringwald  * Setup decoder
504*9a19cd78SMatthias Ringwald  */
505*9a19cd78SMatthias Ringwald struct lc3_decoder *lc3_setup_decoder(
506*9a19cd78SMatthias Ringwald     int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
507*9a19cd78SMatthias Ringwald {
508*9a19cd78SMatthias Ringwald     if (sr_pcm_hz <= 0)
509*9a19cd78SMatthias Ringwald         sr_pcm_hz = sr_hz;
510*9a19cd78SMatthias Ringwald 
511*9a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
512*9a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
513*9a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
514*9a19cd78SMatthias Ringwald 
515*9a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
516*9a19cd78SMatthias Ringwald         return NULL;
517*9a19cd78SMatthias Ringwald 
518*9a19cd78SMatthias Ringwald     struct lc3_decoder *decoder = mem;
519*9a19cd78SMatthias Ringwald     int nh = LC3_NH(sr_pcm);
520*9a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
521*9a19cd78SMatthias Ringwald     int nd = LC3_ND(dt, sr_pcm);
522*9a19cd78SMatthias Ringwald 
523*9a19cd78SMatthias Ringwald     *decoder = (struct lc3_decoder){
524*9a19cd78SMatthias Ringwald         .dt = dt, .sr = sr,
525*9a19cd78SMatthias Ringwald         .sr_pcm = sr_pcm,
526*9a19cd78SMatthias Ringwald         .xs = decoder->s + nh,
527*9a19cd78SMatthias Ringwald         .xd = decoder->s + nh+ns,
528*9a19cd78SMatthias Ringwald         .xg = decoder->s + nh+ns+nd,
529*9a19cd78SMatthias Ringwald     };
530*9a19cd78SMatthias Ringwald 
531*9a19cd78SMatthias Ringwald     lc3_plc_reset(&decoder->plc);
532*9a19cd78SMatthias Ringwald 
533*9a19cd78SMatthias Ringwald     memset(decoder->s, 0,
534*9a19cd78SMatthias Ringwald         LC3_DECODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
535*9a19cd78SMatthias Ringwald 
536*9a19cd78SMatthias Ringwald     return decoder;
537*9a19cd78SMatthias Ringwald }
538*9a19cd78SMatthias Ringwald 
539*9a19cd78SMatthias Ringwald /**
540*9a19cd78SMatthias Ringwald  * Decode a frame
541*9a19cd78SMatthias Ringwald  */
542*9a19cd78SMatthias Ringwald int lc3_decode(struct lc3_decoder *decoder, const void *in, int nbytes,
543*9a19cd78SMatthias Ringwald     enum lc3_pcm_format fmt, void *pcm, int stride)
544*9a19cd78SMatthias Ringwald {
545*9a19cd78SMatthias Ringwald     static void (* const store[])(struct lc3_decoder *, void *, int) = {
546*9a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S16] = store_s16,
547*9a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S24] = store_s24,
548*9a19cd78SMatthias Ringwald     };
549*9a19cd78SMatthias Ringwald 
550*9a19cd78SMatthias Ringwald     /* --- Check parameters --- */
551*9a19cd78SMatthias Ringwald 
552*9a19cd78SMatthias Ringwald     if (!decoder)
553*9a19cd78SMatthias Ringwald         return -1;
554*9a19cd78SMatthias Ringwald 
555*9a19cd78SMatthias Ringwald     if (in && (nbytes < LC3_MIN_FRAME_BYTES ||
556*9a19cd78SMatthias Ringwald                nbytes > LC3_MAX_FRAME_BYTES   ))
557*9a19cd78SMatthias Ringwald         return -1;
558*9a19cd78SMatthias Ringwald 
559*9a19cd78SMatthias Ringwald     /* --- Processing --- */
560*9a19cd78SMatthias Ringwald 
561*9a19cd78SMatthias Ringwald     struct side_data side;
562*9a19cd78SMatthias Ringwald 
563*9a19cd78SMatthias Ringwald     int ret = !in || (decode(decoder, in, nbytes, &side) < 0);
564*9a19cd78SMatthias Ringwald 
565*9a19cd78SMatthias Ringwald     synthesize(decoder, ret ? NULL : &side, nbytes);
566*9a19cd78SMatthias Ringwald 
567*9a19cd78SMatthias Ringwald     store[fmt](decoder, pcm, stride);
568*9a19cd78SMatthias Ringwald 
569*9a19cd78SMatthias Ringwald     return ret;
570*9a19cd78SMatthias Ringwald }
571