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