xref: /btstack/3rd-party/lc3-google/src/lc3.c (revision 4930cef6e21e6da2d7571b9259c7f0fb8bed3d01)
19a19cd78SMatthias Ringwald /******************************************************************************
29a19cd78SMatthias Ringwald  *
3*4930cef6SMatthias Ringwald  *  Copyright 2022 Google LLC
49a19cd78SMatthias Ringwald  *
59a19cd78SMatthias Ringwald  *  Licensed under the Apache License, Version 2.0 (the "License");
69a19cd78SMatthias Ringwald  *  you may not use this file except in compliance with the License.
79a19cd78SMatthias Ringwald  *  You may obtain a copy of the License at:
89a19cd78SMatthias Ringwald  *
99a19cd78SMatthias Ringwald  *  http://www.apache.org/licenses/LICENSE-2.0
109a19cd78SMatthias Ringwald  *
119a19cd78SMatthias Ringwald  *  Unless required by applicable law or agreed to in writing, software
129a19cd78SMatthias Ringwald  *  distributed under the License is distributed on an "AS IS" BASIS,
139a19cd78SMatthias Ringwald  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149a19cd78SMatthias Ringwald  *  See the License for the specific language governing permissions and
159a19cd78SMatthias Ringwald  *  limitations under the License.
169a19cd78SMatthias Ringwald  *
179a19cd78SMatthias Ringwald  ******************************************************************************/
189a19cd78SMatthias Ringwald 
199a19cd78SMatthias Ringwald #include <lc3.h>
209a19cd78SMatthias Ringwald 
219a19cd78SMatthias Ringwald #include "common.h"
229a19cd78SMatthias Ringwald #include "bits.h"
239a19cd78SMatthias Ringwald 
249a19cd78SMatthias Ringwald #include "attdet.h"
259a19cd78SMatthias Ringwald #include "bwdet.h"
269a19cd78SMatthias Ringwald #include "ltpf.h"
279a19cd78SMatthias Ringwald #include "mdct.h"
289a19cd78SMatthias Ringwald #include "energy.h"
299a19cd78SMatthias Ringwald #include "sns.h"
309a19cd78SMatthias Ringwald #include "tns.h"
319a19cd78SMatthias Ringwald #include "spec.h"
329a19cd78SMatthias Ringwald #include "plc.h"
339a19cd78SMatthias Ringwald 
349a19cd78SMatthias Ringwald 
359a19cd78SMatthias Ringwald /**
369a19cd78SMatthias Ringwald  * Frame side data
379a19cd78SMatthias Ringwald  */
389a19cd78SMatthias Ringwald 
399a19cd78SMatthias Ringwald struct side_data {
409a19cd78SMatthias Ringwald     enum lc3_bandwidth bw;
419a19cd78SMatthias Ringwald     bool pitch_present;
429a19cd78SMatthias Ringwald     lc3_ltpf_data_t ltpf;
439a19cd78SMatthias Ringwald     lc3_sns_data_t sns;
449a19cd78SMatthias Ringwald     lc3_tns_data_t tns;
459a19cd78SMatthias Ringwald     lc3_spec_side_t spec;
469a19cd78SMatthias Ringwald };
479a19cd78SMatthias Ringwald 
489a19cd78SMatthias Ringwald 
499a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
509a19cd78SMatthias Ringwald  *  General
519a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
529a19cd78SMatthias Ringwald 
539a19cd78SMatthias Ringwald /**
549a19cd78SMatthias Ringwald  * Resolve frame duration in us
559a19cd78SMatthias Ringwald  * us              Frame duration in us
569a19cd78SMatthias Ringwald  * return          Frame duration identifier, or LC3_NUM_DT
579a19cd78SMatthias Ringwald  */
589a19cd78SMatthias Ringwald static enum lc3_dt resolve_dt(int us)
599a19cd78SMatthias Ringwald {
609a19cd78SMatthias Ringwald     return us ==  7500 ? LC3_DT_7M5 :
619a19cd78SMatthias Ringwald            us == 10000 ? LC3_DT_10M : LC3_NUM_DT;
629a19cd78SMatthias Ringwald }
639a19cd78SMatthias Ringwald 
649a19cd78SMatthias Ringwald /**
659a19cd78SMatthias Ringwald  * Resolve samplerate in Hz
669a19cd78SMatthias Ringwald  * hz              Samplerate in Hz
679a19cd78SMatthias Ringwald  * return          Sample rate identifier, or LC3_NUM_SRATE
689a19cd78SMatthias Ringwald  */
699a19cd78SMatthias Ringwald static enum lc3_srate resolve_sr(int hz)
709a19cd78SMatthias Ringwald {
719a19cd78SMatthias Ringwald     return hz ==  8000 ? LC3_SRATE_8K  : hz == 16000 ? LC3_SRATE_16K :
729a19cd78SMatthias Ringwald            hz == 24000 ? LC3_SRATE_24K : hz == 32000 ? LC3_SRATE_32K :
739a19cd78SMatthias Ringwald            hz == 48000 ? LC3_SRATE_48K : LC3_NUM_SRATE;
749a19cd78SMatthias Ringwald }
759a19cd78SMatthias Ringwald 
769a19cd78SMatthias Ringwald /**
779a19cd78SMatthias Ringwald  * Return the number of PCM samples in a frame
789a19cd78SMatthias Ringwald  */
799a19cd78SMatthias Ringwald int lc3_frame_samples(int dt_us, int sr_hz)
809a19cd78SMatthias Ringwald {
819a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
829a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
839a19cd78SMatthias Ringwald 
849a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
859a19cd78SMatthias Ringwald         return -1;
869a19cd78SMatthias Ringwald 
879a19cd78SMatthias Ringwald     return LC3_NS(dt, sr);
889a19cd78SMatthias Ringwald }
899a19cd78SMatthias Ringwald 
909a19cd78SMatthias Ringwald /**
919a19cd78SMatthias Ringwald  * Return the size of frames, from bitrate
929a19cd78SMatthias Ringwald  */
939a19cd78SMatthias Ringwald int lc3_frame_bytes(int dt_us, int bitrate)
949a19cd78SMatthias Ringwald {
959a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT)
969a19cd78SMatthias Ringwald         return -1;
979a19cd78SMatthias Ringwald 
989a19cd78SMatthias Ringwald     if (bitrate < LC3_MIN_BITRATE)
999a19cd78SMatthias Ringwald         return LC3_MIN_FRAME_BYTES;
1009a19cd78SMatthias Ringwald 
1019a19cd78SMatthias Ringwald     if (bitrate > LC3_MAX_BITRATE)
1029a19cd78SMatthias Ringwald         return LC3_MAX_FRAME_BYTES;
1039a19cd78SMatthias Ringwald 
1049a19cd78SMatthias Ringwald     int nbytes = ((unsigned)bitrate * dt_us) / (1000*1000*8);
1059a19cd78SMatthias Ringwald 
1069a19cd78SMatthias Ringwald     return LC3_CLIP(nbytes, LC3_MIN_FRAME_BYTES, LC3_MAX_FRAME_BYTES);
1079a19cd78SMatthias Ringwald }
1089a19cd78SMatthias Ringwald 
1099a19cd78SMatthias Ringwald /**
1109a19cd78SMatthias Ringwald  * Resolve the bitrate, from the size of frames
1119a19cd78SMatthias Ringwald  */
1129a19cd78SMatthias Ringwald int lc3_resolve_bitrate(int dt_us, int nbytes)
1139a19cd78SMatthias Ringwald {
1149a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT)
1159a19cd78SMatthias Ringwald         return -1;
1169a19cd78SMatthias Ringwald 
1179a19cd78SMatthias Ringwald     if (nbytes < LC3_MIN_FRAME_BYTES)
1189a19cd78SMatthias Ringwald         return LC3_MIN_BITRATE;
1199a19cd78SMatthias Ringwald 
1209a19cd78SMatthias Ringwald     if (nbytes > LC3_MAX_FRAME_BYTES)
1219a19cd78SMatthias Ringwald         return LC3_MAX_BITRATE;
1229a19cd78SMatthias Ringwald 
1239a19cd78SMatthias Ringwald     int bitrate = ((unsigned)nbytes * (1000*1000*8) + dt_us/2) / dt_us;
1249a19cd78SMatthias Ringwald 
1259a19cd78SMatthias Ringwald     return LC3_CLIP(bitrate, LC3_MIN_BITRATE, LC3_MAX_BITRATE);
1269a19cd78SMatthias Ringwald }
1279a19cd78SMatthias Ringwald 
1289a19cd78SMatthias Ringwald /**
1299a19cd78SMatthias Ringwald  * Return algorithmic delay, as a number of samples
1309a19cd78SMatthias Ringwald  */
1319a19cd78SMatthias Ringwald int lc3_delay_samples(int dt_us, int sr_hz)
1329a19cd78SMatthias Ringwald {
1339a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
1349a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
1359a19cd78SMatthias Ringwald 
1369a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr >= LC3_NUM_SRATE)
1379a19cd78SMatthias Ringwald         return -1;
1389a19cd78SMatthias Ringwald 
1399a19cd78SMatthias Ringwald     return (dt == LC3_DT_7M5 ? 8 : 5) * (LC3_SRATE_KHZ(sr) / 2);
1409a19cd78SMatthias Ringwald }
1419a19cd78SMatthias Ringwald 
1429a19cd78SMatthias Ringwald 
1439a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
1449a19cd78SMatthias Ringwald  *  Encoder
1459a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
1469a19cd78SMatthias Ringwald 
1479a19cd78SMatthias Ringwald /**
1489a19cd78SMatthias Ringwald  * Input PCM Samples from signed 16 bits
1499a19cd78SMatthias Ringwald  * encoder         Encoder state
1509a19cd78SMatthias Ringwald  * pcm, stride     Input PCM samples, and count between two consecutives
1519a19cd78SMatthias Ringwald  */
1529a19cd78SMatthias Ringwald static void load_s16(
1539a19cd78SMatthias Ringwald     struct lc3_encoder *encoder, const void *_pcm, int stride)
1549a19cd78SMatthias Ringwald {
1559a19cd78SMatthias Ringwald     const int16_t *pcm = _pcm;
1569a19cd78SMatthias Ringwald 
1579a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
1589a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr_pcm;
159*4930cef6SMatthias Ringwald 
160*4930cef6SMatthias Ringwald     int16_t *xt = encoder->xt;
1619a19cd78SMatthias Ringwald     float *xs = encoder->xs;
1629a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
1639a19cd78SMatthias Ringwald 
164*4930cef6SMatthias Ringwald     for (int i = 0; i < ns; i++) {
165*4930cef6SMatthias Ringwald         int16_t in = pcm[i*stride];
166*4930cef6SMatthias Ringwald         xt[i] = in, xs[i] = in;
167*4930cef6SMatthias Ringwald     }
1689a19cd78SMatthias Ringwald }
1699a19cd78SMatthias Ringwald 
1709a19cd78SMatthias Ringwald /**
1719a19cd78SMatthias Ringwald  * Input PCM Samples from signed 24 bits
1729a19cd78SMatthias Ringwald  * encoder         Encoder state
1739a19cd78SMatthias Ringwald  * pcm, stride     Input PCM samples, and count between two consecutives
1749a19cd78SMatthias Ringwald  */
1759a19cd78SMatthias Ringwald static void load_s24(
1769a19cd78SMatthias Ringwald     struct lc3_encoder *encoder, const void *_pcm, int stride)
1779a19cd78SMatthias Ringwald {
1789a19cd78SMatthias Ringwald     const int32_t *pcm = _pcm;
1799a19cd78SMatthias Ringwald 
1809a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
1819a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr_pcm;
182*4930cef6SMatthias Ringwald 
183*4930cef6SMatthias Ringwald     int16_t *xt = encoder->xt;
1849a19cd78SMatthias Ringwald     float *xs = encoder->xs;
1859a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
1869a19cd78SMatthias Ringwald 
187*4930cef6SMatthias Ringwald     for (int i = 0; i < ns; i++) {
188*4930cef6SMatthias Ringwald         int32_t in = pcm[i*stride];
189*4930cef6SMatthias Ringwald 
190*4930cef6SMatthias Ringwald         xt[i] = in >> 8;
191*4930cef6SMatthias Ringwald         xs[i] = ldexpf(in, -8);
192*4930cef6SMatthias Ringwald     }
1939a19cd78SMatthias Ringwald }
1949a19cd78SMatthias Ringwald 
1959a19cd78SMatthias Ringwald /**
1969a19cd78SMatthias Ringwald  * Frame Analysis
1979a19cd78SMatthias Ringwald  * encoder         Encoder state
1989a19cd78SMatthias Ringwald  * nbytes          Size in bytes of the frame
1999a19cd78SMatthias Ringwald  * side, xq        Return frame data
2009a19cd78SMatthias Ringwald  */
2019a19cd78SMatthias Ringwald static void analyze(struct lc3_encoder *encoder,
202*4930cef6SMatthias Ringwald     int nbytes, struct side_data *side, uint16_t *xq)
2039a19cd78SMatthias Ringwald {
2049a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
2059a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr;
2069a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = encoder->sr_pcm;
2079a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
208*4930cef6SMatthias Ringwald     int nt = LC3_NT(sr_pcm);
2099a19cd78SMatthias Ringwald 
210*4930cef6SMatthias Ringwald     int16_t *xt = encoder->xt;
2119a19cd78SMatthias Ringwald     float *xs = encoder->xs;
212*4930cef6SMatthias Ringwald     float *xd = encoder->xd;
213*4930cef6SMatthias Ringwald     float *xf = xs;
2149a19cd78SMatthias Ringwald 
2159a19cd78SMatthias Ringwald     /* --- Temporal --- */
2169a19cd78SMatthias Ringwald 
217*4930cef6SMatthias Ringwald     bool att = lc3_attdet_run(dt, sr_pcm, nbytes, &encoder->attdet, xt);
2189a19cd78SMatthias Ringwald 
2199a19cd78SMatthias Ringwald     side->pitch_present =
220*4930cef6SMatthias Ringwald         lc3_ltpf_analyse(dt, sr_pcm, &encoder->ltpf, xt, &side->ltpf);
221*4930cef6SMatthias Ringwald 
222*4930cef6SMatthias Ringwald     memmove(xt - nt, xt + (ns-nt), nt * sizeof(*xt));
2239a19cd78SMatthias Ringwald 
2249a19cd78SMatthias Ringwald     /* --- Spectral --- */
2259a19cd78SMatthias Ringwald 
2269a19cd78SMatthias Ringwald     float e[LC3_NUM_BANDS];
2279a19cd78SMatthias Ringwald 
228*4930cef6SMatthias Ringwald     lc3_mdct_forward(dt, sr_pcm, sr, xs, xd, xf);
2299a19cd78SMatthias Ringwald 
2309a19cd78SMatthias Ringwald     bool nn_flag = lc3_energy_compute(dt, sr, xf, e);
2319a19cd78SMatthias Ringwald     if (nn_flag)
2329a19cd78SMatthias Ringwald         lc3_ltpf_disable(&side->ltpf);
2339a19cd78SMatthias Ringwald 
2349a19cd78SMatthias Ringwald     side->bw = lc3_bwdet_run(dt, sr, e);
2359a19cd78SMatthias Ringwald 
2369a19cd78SMatthias Ringwald     lc3_sns_analyze(dt, sr, e, att, &side->sns, xf, xf);
2379a19cd78SMatthias Ringwald 
2389a19cd78SMatthias Ringwald     lc3_tns_analyze(dt, side->bw, nn_flag, nbytes, &side->tns, xf);
2399a19cd78SMatthias Ringwald 
2409a19cd78SMatthias Ringwald     lc3_spec_analyze(dt, sr,
2419a19cd78SMatthias Ringwald         nbytes, side->pitch_present, &side->tns,
2429a19cd78SMatthias Ringwald         &encoder->spec, xf, xq, &side->spec);
2439a19cd78SMatthias Ringwald }
2449a19cd78SMatthias Ringwald 
2459a19cd78SMatthias Ringwald /**
2469a19cd78SMatthias Ringwald  * Encode bitstream
2479a19cd78SMatthias Ringwald  * encoder         Encoder state
2489a19cd78SMatthias Ringwald  * side, xq        The frame data
2499a19cd78SMatthias Ringwald  * nbytes          Target size of the frame (20 to 400)
2509a19cd78SMatthias Ringwald  * buffer          Output bitstream buffer of `nbytes` size
2519a19cd78SMatthias Ringwald  */
2529a19cd78SMatthias Ringwald static void encode(struct lc3_encoder *encoder,
253*4930cef6SMatthias Ringwald     const struct side_data *side, uint16_t *xq, int nbytes, void *buffer)
2549a19cd78SMatthias Ringwald {
2559a19cd78SMatthias Ringwald     enum lc3_dt dt = encoder->dt;
2569a19cd78SMatthias Ringwald     enum lc3_srate sr = encoder->sr;
2579a19cd78SMatthias Ringwald     enum lc3_bandwidth bw = side->bw;
258*4930cef6SMatthias Ringwald     float *xf = encoder->xs;
2599a19cd78SMatthias Ringwald 
2609a19cd78SMatthias Ringwald     lc3_bits_t bits;
2619a19cd78SMatthias Ringwald 
2629a19cd78SMatthias Ringwald     lc3_setup_bits(&bits, LC3_BITS_MODE_WRITE, buffer, nbytes);
2639a19cd78SMatthias Ringwald 
2649a19cd78SMatthias Ringwald     lc3_bwdet_put_bw(&bits, sr, bw);
2659a19cd78SMatthias Ringwald 
2669a19cd78SMatthias Ringwald     lc3_spec_put_side(&bits, dt, sr, &side->spec);
2679a19cd78SMatthias Ringwald 
2689a19cd78SMatthias Ringwald     lc3_tns_put_data(&bits, &side->tns);
2699a19cd78SMatthias Ringwald 
2709a19cd78SMatthias Ringwald     lc3_put_bit(&bits, side->pitch_present);
2719a19cd78SMatthias Ringwald 
2729a19cd78SMatthias Ringwald     lc3_sns_put_data(&bits, &side->sns);
2739a19cd78SMatthias Ringwald 
2749a19cd78SMatthias Ringwald     if (side->pitch_present)
2759a19cd78SMatthias Ringwald         lc3_ltpf_put_data(&bits, &side->ltpf);
2769a19cd78SMatthias Ringwald 
2779a19cd78SMatthias Ringwald     lc3_spec_encode(&bits,
2789a19cd78SMatthias Ringwald         dt, sr, bw, nbytes, xq, &side->spec, xf);
2799a19cd78SMatthias Ringwald 
2809a19cd78SMatthias Ringwald     lc3_flush_bits(&bits);
2819a19cd78SMatthias Ringwald }
2829a19cd78SMatthias Ringwald 
2839a19cd78SMatthias Ringwald /**
2849a19cd78SMatthias Ringwald  * Return size needed for an encoder
2859a19cd78SMatthias Ringwald  */
2869a19cd78SMatthias Ringwald unsigned lc3_encoder_size(int dt_us, int sr_hz)
2879a19cd78SMatthias Ringwald {
2889a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT ||
2899a19cd78SMatthias Ringwald         resolve_sr(sr_hz) >= LC3_NUM_SRATE)
2909a19cd78SMatthias Ringwald         return 0;
2919a19cd78SMatthias Ringwald 
2929a19cd78SMatthias Ringwald     return sizeof(struct lc3_encoder) +
2939a19cd78SMatthias Ringwald         LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) * sizeof(float);
2949a19cd78SMatthias Ringwald }
2959a19cd78SMatthias Ringwald 
2969a19cd78SMatthias Ringwald /**
2979a19cd78SMatthias Ringwald  * Setup encoder
2989a19cd78SMatthias Ringwald  */
2999a19cd78SMatthias Ringwald struct lc3_encoder *lc3_setup_encoder(
3009a19cd78SMatthias Ringwald     int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
3019a19cd78SMatthias Ringwald {
3029a19cd78SMatthias Ringwald     if (sr_pcm_hz <= 0)
3039a19cd78SMatthias Ringwald         sr_pcm_hz = sr_hz;
3049a19cd78SMatthias Ringwald 
3059a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
3069a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
3079a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
3089a19cd78SMatthias Ringwald 
3099a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
3109a19cd78SMatthias Ringwald         return NULL;
3119a19cd78SMatthias Ringwald 
3129a19cd78SMatthias Ringwald     struct lc3_encoder *encoder = mem;
3139a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
314*4930cef6SMatthias Ringwald     int nt = LC3_NT(sr_pcm);
3159a19cd78SMatthias Ringwald 
3169a19cd78SMatthias Ringwald     *encoder = (struct lc3_encoder){
3179a19cd78SMatthias Ringwald         .dt = dt, .sr = sr,
3189a19cd78SMatthias Ringwald         .sr_pcm = sr_pcm,
319*4930cef6SMatthias Ringwald 
320*4930cef6SMatthias Ringwald         .xt = (int16_t *)encoder->s + nt,
321*4930cef6SMatthias Ringwald         .xs = encoder->s + (nt+ns)/2,
322*4930cef6SMatthias Ringwald         .xd = encoder->s + (nt+ns)/2 + ns,
3239a19cd78SMatthias Ringwald     };
3249a19cd78SMatthias Ringwald 
3259a19cd78SMatthias Ringwald     memset(encoder->s, 0,
3269a19cd78SMatthias Ringwald         LC3_ENCODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
3279a19cd78SMatthias Ringwald 
3289a19cd78SMatthias Ringwald     return encoder;
3299a19cd78SMatthias Ringwald }
3309a19cd78SMatthias Ringwald 
3319a19cd78SMatthias Ringwald /**
3329a19cd78SMatthias Ringwald  * Encode a frame
3339a19cd78SMatthias Ringwald  */
3349a19cd78SMatthias Ringwald int lc3_encode(struct lc3_encoder *encoder, enum lc3_pcm_format fmt,
3359a19cd78SMatthias Ringwald     const void *pcm, int stride, int nbytes, void *out)
3369a19cd78SMatthias Ringwald {
3379a19cd78SMatthias Ringwald     static void (* const load[])(struct lc3_encoder *, const void *, int) = {
3389a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S16] = load_s16,
3399a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S24] = load_s24,
3409a19cd78SMatthias Ringwald     };
3419a19cd78SMatthias Ringwald 
3429a19cd78SMatthias Ringwald     /* --- Check parameters --- */
3439a19cd78SMatthias Ringwald 
3449a19cd78SMatthias Ringwald     if (!encoder || nbytes < LC3_MIN_FRAME_BYTES
3459a19cd78SMatthias Ringwald                  || nbytes > LC3_MAX_FRAME_BYTES)
3469a19cd78SMatthias Ringwald         return -1;
3479a19cd78SMatthias Ringwald 
3489a19cd78SMatthias Ringwald     /* --- Processing --- */
3499a19cd78SMatthias Ringwald 
3509a19cd78SMatthias Ringwald     struct side_data side;
351*4930cef6SMatthias Ringwald     uint16_t xq[LC3_NE(encoder->dt, encoder->sr)];
3529a19cd78SMatthias Ringwald 
3539a19cd78SMatthias Ringwald     load[fmt](encoder, pcm, stride);
3549a19cd78SMatthias Ringwald 
3559a19cd78SMatthias Ringwald     analyze(encoder, nbytes, &side, xq);
3569a19cd78SMatthias Ringwald 
3579a19cd78SMatthias Ringwald     encode(encoder, &side, xq, nbytes, out);
3589a19cd78SMatthias Ringwald 
3599a19cd78SMatthias Ringwald     return 0;
3609a19cd78SMatthias Ringwald }
3619a19cd78SMatthias Ringwald 
3629a19cd78SMatthias Ringwald 
3639a19cd78SMatthias Ringwald /* ----------------------------------------------------------------------------
3649a19cd78SMatthias Ringwald  *  Decoder
3659a19cd78SMatthias Ringwald  * -------------------------------------------------------------------------- */
3669a19cd78SMatthias Ringwald 
3679a19cd78SMatthias Ringwald /**
3689a19cd78SMatthias Ringwald  * Output PCM Samples to signed 16 bits
3699a19cd78SMatthias Ringwald  * decoder         Decoder state
3709a19cd78SMatthias Ringwald  * pcm, stride     Output PCM samples, and count between two consecutives
3719a19cd78SMatthias Ringwald  */
3729a19cd78SMatthias Ringwald static void store_s16(
3739a19cd78SMatthias Ringwald     struct lc3_decoder *decoder, void *_pcm, int stride)
3749a19cd78SMatthias Ringwald {
3759a19cd78SMatthias Ringwald     int16_t *pcm = _pcm;
3769a19cd78SMatthias Ringwald 
3779a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
3789a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr_pcm;
379*4930cef6SMatthias Ringwald 
3809a19cd78SMatthias Ringwald     float *xs = decoder->xs;
3819a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
3829a19cd78SMatthias Ringwald 
3839a19cd78SMatthias Ringwald     for ( ; ns > 0; ns--, xs++, pcm += stride) {
384*4930cef6SMatthias Ringwald         int32_t s = *xs >= 0 ? (int)(*xs + 0.5f) : (int)(*xs - 0.5f);
385*4930cef6SMatthias Ringwald         *pcm = LC3_SAT16(s);
3869a19cd78SMatthias Ringwald     }
3879a19cd78SMatthias Ringwald }
3889a19cd78SMatthias Ringwald 
3899a19cd78SMatthias Ringwald /**
3909a19cd78SMatthias Ringwald  * Output PCM Samples to signed 24 bits
3919a19cd78SMatthias Ringwald  * decoder         Decoder state
3929a19cd78SMatthias Ringwald  * pcm, stride     Output PCM samples, and count between two consecutives
3939a19cd78SMatthias Ringwald  */
3949a19cd78SMatthias Ringwald static void store_s24(
3959a19cd78SMatthias Ringwald     struct lc3_decoder *decoder, void *_pcm, int stride)
3969a19cd78SMatthias Ringwald {
3979a19cd78SMatthias Ringwald     int32_t *pcm = _pcm;
3989a19cd78SMatthias Ringwald 
3999a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
4009a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr_pcm;
401*4930cef6SMatthias Ringwald 
4029a19cd78SMatthias Ringwald     float *xs = decoder->xs;
4039a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
4049a19cd78SMatthias Ringwald 
4059a19cd78SMatthias Ringwald     for ( ; ns > 0; ns--, xs++, pcm += stride) {
4069a19cd78SMatthias Ringwald         int32_t s = *xs >= 0 ? (int32_t)(ldexpf(*xs, 8) + 0.5f)
4079a19cd78SMatthias Ringwald                              : (int32_t)(ldexpf(*xs, 8) - 0.5f);
408*4930cef6SMatthias Ringwald         *pcm = LC3_SAT24(s);
4099a19cd78SMatthias Ringwald     }
4109a19cd78SMatthias Ringwald }
4119a19cd78SMatthias Ringwald 
4129a19cd78SMatthias Ringwald /**
4139a19cd78SMatthias Ringwald  * Decode bitstream
4149a19cd78SMatthias Ringwald  * decoder         Decoder state
4159a19cd78SMatthias Ringwald  * data, nbytes    Input bitstream buffer
4169a19cd78SMatthias Ringwald  * side            Return the side data
4179a19cd78SMatthias Ringwald  * return          0: Ok  < 0: Bitsream error detected
4189a19cd78SMatthias Ringwald  */
4199a19cd78SMatthias Ringwald static int decode(struct lc3_decoder *decoder,
4209a19cd78SMatthias Ringwald     const void *data, int nbytes, struct side_data *side)
4219a19cd78SMatthias Ringwald {
4229a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
4239a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr;
424*4930cef6SMatthias Ringwald 
4259a19cd78SMatthias Ringwald     float *xf = decoder->xs;
4269a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr);
4279a19cd78SMatthias Ringwald     int ne = LC3_NE(dt, sr);
4289a19cd78SMatthias Ringwald 
4299a19cd78SMatthias Ringwald     lc3_bits_t bits;
4309a19cd78SMatthias Ringwald     int ret = 0;
4319a19cd78SMatthias Ringwald 
4329a19cd78SMatthias Ringwald     lc3_setup_bits(&bits, LC3_BITS_MODE_READ, (void *)data, nbytes);
4339a19cd78SMatthias Ringwald 
4349a19cd78SMatthias Ringwald     if ((ret = lc3_bwdet_get_bw(&bits, sr, &side->bw)) < 0)
4359a19cd78SMatthias Ringwald         return ret;
4369a19cd78SMatthias Ringwald 
4379a19cd78SMatthias Ringwald     if ((ret = lc3_spec_get_side(&bits, dt, sr, &side->spec)) < 0)
4389a19cd78SMatthias Ringwald         return ret;
4399a19cd78SMatthias Ringwald 
4409a19cd78SMatthias Ringwald     lc3_tns_get_data(&bits, dt, side->bw, nbytes, &side->tns);
4419a19cd78SMatthias Ringwald 
4429a19cd78SMatthias Ringwald     side->pitch_present = lc3_get_bit(&bits);
4439a19cd78SMatthias Ringwald 
4449a19cd78SMatthias Ringwald     if ((ret = lc3_sns_get_data(&bits, &side->sns)) < 0)
4459a19cd78SMatthias Ringwald         return ret;
4469a19cd78SMatthias Ringwald 
4479a19cd78SMatthias Ringwald     if (side->pitch_present)
4489a19cd78SMatthias Ringwald         lc3_ltpf_get_data(&bits, &side->ltpf);
4499a19cd78SMatthias Ringwald 
4509a19cd78SMatthias Ringwald     if ((ret = lc3_spec_decode(&bits, dt, sr,
4519a19cd78SMatthias Ringwald                     side->bw, nbytes, &side->spec, xf)) < 0)
4529a19cd78SMatthias Ringwald         return ret;
4539a19cd78SMatthias Ringwald 
4549a19cd78SMatthias Ringwald     memset(xf + ne, 0, (ns - ne) * sizeof(float));
4559a19cd78SMatthias Ringwald 
4569a19cd78SMatthias Ringwald     return lc3_check_bits(&bits);
4579a19cd78SMatthias Ringwald }
4589a19cd78SMatthias Ringwald 
4599a19cd78SMatthias Ringwald /**
4609a19cd78SMatthias Ringwald  * Frame synthesis
4619a19cd78SMatthias Ringwald  * decoder         Decoder state
4629a19cd78SMatthias Ringwald  * side            Frame data, NULL performs PLC
4639a19cd78SMatthias Ringwald  * nbytes          Size in bytes of the frame
4649a19cd78SMatthias Ringwald  */
4659a19cd78SMatthias Ringwald static void synthesize(struct lc3_decoder *decoder,
4669a19cd78SMatthias Ringwald     const struct side_data *side, int nbytes)
4679a19cd78SMatthias Ringwald {
4689a19cd78SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
4699a19cd78SMatthias Ringwald     enum lc3_srate sr = decoder->sr;
4709a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = decoder->sr_pcm;
4719a19cd78SMatthias Ringwald 
4729a19cd78SMatthias Ringwald     float *xf = decoder->xs;
473*4930cef6SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
474*4930cef6SMatthias Ringwald     int ne = LC3_NE(dt, sr);
475*4930cef6SMatthias Ringwald 
4769a19cd78SMatthias Ringwald     float *xg = decoder->xg;
4779a19cd78SMatthias Ringwald     float *xd = decoder->xd;
4789a19cd78SMatthias Ringwald     float *xs = xf;
4799a19cd78SMatthias Ringwald 
4809a19cd78SMatthias Ringwald     if (side) {
4819a19cd78SMatthias Ringwald         enum lc3_bandwidth bw = side->bw;
4829a19cd78SMatthias Ringwald 
4839a19cd78SMatthias Ringwald         lc3_plc_suspend(&decoder->plc);
4849a19cd78SMatthias Ringwald 
4859a19cd78SMatthias Ringwald         lc3_tns_synthesize(dt, bw, &side->tns, xf);
4869a19cd78SMatthias Ringwald 
4879a19cd78SMatthias Ringwald         lc3_sns_synthesize(dt, sr, &side->sns, xf, xg);
4889a19cd78SMatthias Ringwald 
4899a19cd78SMatthias Ringwald         lc3_mdct_inverse(dt, sr_pcm, sr, xg, xd, xs);
4909a19cd78SMatthias Ringwald 
4919a19cd78SMatthias Ringwald     } else {
4929a19cd78SMatthias Ringwald         lc3_plc_synthesize(dt, sr, &decoder->plc, xg, xf);
4939a19cd78SMatthias Ringwald 
4949a19cd78SMatthias Ringwald         memset(xf + ne, 0, (ns - ne) * sizeof(float));
4959a19cd78SMatthias Ringwald 
4969a19cd78SMatthias Ringwald         lc3_mdct_inverse(dt, sr_pcm, sr, xf, xd, xs);
4979a19cd78SMatthias Ringwald     }
4989a19cd78SMatthias Ringwald 
4999a19cd78SMatthias Ringwald     lc3_ltpf_synthesize(dt, sr_pcm, nbytes, &decoder->ltpf,
500*4930cef6SMatthias Ringwald         side && side->pitch_present ? &side->ltpf : NULL, decoder->xh, xs);
501*4930cef6SMatthias Ringwald }
5029a19cd78SMatthias Ringwald 
503*4930cef6SMatthias Ringwald /**
504*4930cef6SMatthias Ringwald  * Update decoder state on decoding completion
505*4930cef6SMatthias Ringwald  * decoder         Decoder state
506*4930cef6SMatthias Ringwald  */
507*4930cef6SMatthias Ringwald static void complete(struct lc3_decoder *decoder)
508*4930cef6SMatthias Ringwald {
509*4930cef6SMatthias Ringwald     enum lc3_dt dt = decoder->dt;
510*4930cef6SMatthias Ringwald     enum lc3_srate sr_pcm = decoder->sr_pcm;
511*4930cef6SMatthias Ringwald     int nh = LC3_NH(dt, sr_pcm);
512*4930cef6SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
513*4930cef6SMatthias Ringwald 
514*4930cef6SMatthias Ringwald     decoder->xs = decoder->xs - decoder->xh < nh - ns ?
515*4930cef6SMatthias Ringwald         decoder->xs + ns : decoder->xh;
5169a19cd78SMatthias Ringwald }
5179a19cd78SMatthias Ringwald 
5189a19cd78SMatthias Ringwald /**
5199a19cd78SMatthias Ringwald  * Return size needed for a decoder
5209a19cd78SMatthias Ringwald  */
5219a19cd78SMatthias Ringwald unsigned lc3_decoder_size(int dt_us, int sr_hz)
5229a19cd78SMatthias Ringwald {
5239a19cd78SMatthias Ringwald     if (resolve_dt(dt_us) >= LC3_NUM_DT ||
5249a19cd78SMatthias Ringwald         resolve_sr(sr_hz) >= LC3_NUM_SRATE)
5259a19cd78SMatthias Ringwald         return 0;
5269a19cd78SMatthias Ringwald 
5279a19cd78SMatthias Ringwald     return sizeof(struct lc3_decoder) +
5289a19cd78SMatthias Ringwald         LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) * sizeof(float);
5299a19cd78SMatthias Ringwald }
5309a19cd78SMatthias Ringwald 
5319a19cd78SMatthias Ringwald /**
5329a19cd78SMatthias Ringwald  * Setup decoder
5339a19cd78SMatthias Ringwald  */
5349a19cd78SMatthias Ringwald struct lc3_decoder *lc3_setup_decoder(
5359a19cd78SMatthias Ringwald     int dt_us, int sr_hz, int sr_pcm_hz, void *mem)
5369a19cd78SMatthias Ringwald {
5379a19cd78SMatthias Ringwald     if (sr_pcm_hz <= 0)
5389a19cd78SMatthias Ringwald         sr_pcm_hz = sr_hz;
5399a19cd78SMatthias Ringwald 
5409a19cd78SMatthias Ringwald     enum lc3_dt dt = resolve_dt(dt_us);
5419a19cd78SMatthias Ringwald     enum lc3_srate sr = resolve_sr(sr_hz);
5429a19cd78SMatthias Ringwald     enum lc3_srate sr_pcm = resolve_sr(sr_pcm_hz);
5439a19cd78SMatthias Ringwald 
5449a19cd78SMatthias Ringwald     if (dt >= LC3_NUM_DT || sr_pcm >= LC3_NUM_SRATE || sr > sr_pcm || !mem)
5459a19cd78SMatthias Ringwald         return NULL;
5469a19cd78SMatthias Ringwald 
5479a19cd78SMatthias Ringwald     struct lc3_decoder *decoder = mem;
548*4930cef6SMatthias Ringwald     int nh = LC3_NH(dt, sr_pcm);
5499a19cd78SMatthias Ringwald     int ns = LC3_NS(dt, sr_pcm);
5509a19cd78SMatthias Ringwald     int nd = LC3_ND(dt, sr_pcm);
5519a19cd78SMatthias Ringwald 
5529a19cd78SMatthias Ringwald     *decoder = (struct lc3_decoder){
5539a19cd78SMatthias Ringwald         .dt = dt, .sr = sr,
5549a19cd78SMatthias Ringwald         .sr_pcm = sr_pcm,
555*4930cef6SMatthias Ringwald 
556*4930cef6SMatthias Ringwald         .xh = decoder->s,
557*4930cef6SMatthias Ringwald         .xs = decoder->s + nh-ns,
558*4930cef6SMatthias Ringwald         .xd = decoder->s + nh,
559*4930cef6SMatthias Ringwald         .xg = decoder->s + nh+nd,
5609a19cd78SMatthias Ringwald     };
5619a19cd78SMatthias Ringwald 
5629a19cd78SMatthias Ringwald     lc3_plc_reset(&decoder->plc);
5639a19cd78SMatthias Ringwald 
5649a19cd78SMatthias Ringwald     memset(decoder->s, 0,
5659a19cd78SMatthias Ringwald         LC3_DECODER_BUFFER_COUNT(dt_us, sr_pcm_hz) * sizeof(float));
5669a19cd78SMatthias Ringwald 
5679a19cd78SMatthias Ringwald     return decoder;
5689a19cd78SMatthias Ringwald }
5699a19cd78SMatthias Ringwald 
5709a19cd78SMatthias Ringwald /**
5719a19cd78SMatthias Ringwald  * Decode a frame
5729a19cd78SMatthias Ringwald  */
5739a19cd78SMatthias Ringwald int lc3_decode(struct lc3_decoder *decoder, const void *in, int nbytes,
5749a19cd78SMatthias Ringwald     enum lc3_pcm_format fmt, void *pcm, int stride)
5759a19cd78SMatthias Ringwald {
5769a19cd78SMatthias Ringwald     static void (* const store[])(struct lc3_decoder *, void *, int) = {
5779a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S16] = store_s16,
5789a19cd78SMatthias Ringwald         [LC3_PCM_FORMAT_S24] = store_s24,
5799a19cd78SMatthias Ringwald     };
5809a19cd78SMatthias Ringwald 
5819a19cd78SMatthias Ringwald     /* --- Check parameters --- */
5829a19cd78SMatthias Ringwald 
5839a19cd78SMatthias Ringwald     if (!decoder)
5849a19cd78SMatthias Ringwald         return -1;
5859a19cd78SMatthias Ringwald 
5869a19cd78SMatthias Ringwald     if (in && (nbytes < LC3_MIN_FRAME_BYTES ||
5879a19cd78SMatthias Ringwald                nbytes > LC3_MAX_FRAME_BYTES   ))
5889a19cd78SMatthias Ringwald         return -1;
5899a19cd78SMatthias Ringwald 
5909a19cd78SMatthias Ringwald     /* --- Processing --- */
5919a19cd78SMatthias Ringwald 
5929a19cd78SMatthias Ringwald     struct side_data side;
5939a19cd78SMatthias Ringwald 
5949a19cd78SMatthias Ringwald     int ret = !in || (decode(decoder, in, nbytes, &side) < 0);
5959a19cd78SMatthias Ringwald 
5969a19cd78SMatthias Ringwald     synthesize(decoder, ret ? NULL : &side, nbytes);
5979a19cd78SMatthias Ringwald 
5989a19cd78SMatthias Ringwald     store[fmt](decoder, pcm, stride);
5999a19cd78SMatthias Ringwald 
600*4930cef6SMatthias Ringwald     complete(decoder);
601*4930cef6SMatthias Ringwald 
6029a19cd78SMatthias Ringwald     return ret;
6039a19cd78SMatthias Ringwald }
604