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