1*49fe348cSAndroid Build Coastguard Worker /****************************************************************************** 2*49fe348cSAndroid Build Coastguard Worker * 3*49fe348cSAndroid Build Coastguard Worker * Copyright 2022 Google LLC 4*49fe348cSAndroid Build Coastguard Worker * 5*49fe348cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 6*49fe348cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 7*49fe348cSAndroid Build Coastguard Worker * You may obtain a copy of the License at: 8*49fe348cSAndroid Build Coastguard Worker * 9*49fe348cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 10*49fe348cSAndroid Build Coastguard Worker * 11*49fe348cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 12*49fe348cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 13*49fe348cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*49fe348cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 15*49fe348cSAndroid Build Coastguard Worker * limitations under the License. 16*49fe348cSAndroid Build Coastguard Worker * 17*49fe348cSAndroid Build Coastguard Worker ******************************************************************************/ 18*49fe348cSAndroid Build Coastguard Worker 19*49fe348cSAndroid Build Coastguard Worker /** 20*49fe348cSAndroid Build Coastguard Worker * Low Complexity Communication Codec (LC3) 21*49fe348cSAndroid Build Coastguard Worker * 22*49fe348cSAndroid Build Coastguard Worker * This implementation conforms to : 23*49fe348cSAndroid Build Coastguard Worker * 24*49fe348cSAndroid Build Coastguard Worker * - Low Complexity Communication Codec (LC3) 25*49fe348cSAndroid Build Coastguard Worker * Bluetooth Specification v1.0 26*49fe348cSAndroid Build Coastguard Worker * 27*49fe348cSAndroid Build Coastguard Worker * - ETSI TS 103 634 v1.4.1 28*49fe348cSAndroid Build Coastguard Worker * Digital Enhanced Cordless Telecommunications (DECT) 29*49fe348cSAndroid Build Coastguard Worker * Low Complexity Communication Codec plus (LC3plus) 30*49fe348cSAndroid Build Coastguard Worker * 31*49fe348cSAndroid Build Coastguard Worker * LC3 and LC3 Plus are audio codecs designed for low-latency audio transport. 32*49fe348cSAndroid Build Coastguard Worker * 33*49fe348cSAndroid Build Coastguard Worker * - Unlike most other codecs, the LC3 codec is focused on audio streaming 34*49fe348cSAndroid Build Coastguard Worker * in constrained (on packet sizes and interval) tranport layer. 35*49fe348cSAndroid Build Coastguard Worker * In this way, the LC3 does not handle : 36*49fe348cSAndroid Build Coastguard Worker * VBR (Variable Bitrate), based on input signal complexity 37*49fe348cSAndroid Build Coastguard Worker * ABR (Adaptative Bitrate). It does not rely on any bit reservoir, 38*49fe348cSAndroid Build Coastguard Worker * a frame will be strictly encoded in the bytes budget given by 39*49fe348cSAndroid Build Coastguard Worker * the user (or transport layer). 40*49fe348cSAndroid Build Coastguard Worker * 41*49fe348cSAndroid Build Coastguard Worker * However, the bitrate (bytes budget for encoding a frame) can be 42*49fe348cSAndroid Build Coastguard Worker * freely changed at any time. But will not rely on signal complexity, 43*49fe348cSAndroid Build Coastguard Worker * it can follow a temporary bandwidth increase or reduction. 44*49fe348cSAndroid Build Coastguard Worker * 45*49fe348cSAndroid Build Coastguard Worker * - Unlike classic codecs, the LC3 codecs does not run on fixed amount 46*49fe348cSAndroid Build Coastguard Worker * of samples as input. It operates only on fixed frame duration, for 47*49fe348cSAndroid Build Coastguard Worker * any supported sample rates (8 to 48 KHz). Two frames duration are 48*49fe348cSAndroid Build Coastguard Worker * available 7.5ms and 10ms. 49*49fe348cSAndroid Build Coastguard Worker * 50*49fe348cSAndroid Build Coastguard Worker * 51*49fe348cSAndroid Build Coastguard Worker * --- LC3 Plus features --- 52*49fe348cSAndroid Build Coastguard Worker * 53*49fe348cSAndroid Build Coastguard Worker * In addition to LC3, following features of LC3 Plus are proposed: 54*49fe348cSAndroid Build Coastguard Worker * - Frame duration of 2.5 and 5ms. 55*49fe348cSAndroid Build Coastguard Worker * - High-Resolution mode, 48 KHz, and 96 kHz sampling rates. 56*49fe348cSAndroid Build Coastguard Worker * 57*49fe348cSAndroid Build Coastguard Worker * The distinction between LC3 and LC3 plus is made according to : 58*49fe348cSAndroid Build Coastguard Worker * 59*49fe348cSAndroid Build Coastguard Worker * Frame Duration | 2.5ms | 5ms | 7.5ms | 10 ms | 60*49fe348cSAndroid Build Coastguard Worker * ---------------- | ----- | ----- | ----- | ----- | 61*49fe348cSAndroid Build Coastguard Worker * LC3 | | | X | X | 62*49fe348cSAndroid Build Coastguard Worker * LC3 Plus | X | X | | X | 63*49fe348cSAndroid Build Coastguard Worker * 64*49fe348cSAndroid Build Coastguard Worker * The 10 ms frame duration is available in LC3 and LC3 plus standard. 65*49fe348cSAndroid Build Coastguard Worker * In this mode, the produced bitstream can be referenced either 66*49fe348cSAndroid Build Coastguard Worker * as LC3 or LC3 plus. 67*49fe348cSAndroid Build Coastguard Worker * 68*49fe348cSAndroid Build Coastguard Worker * The LC3 Plus high-resolution mode should be preferred at high bitrates 69*49fe348cSAndroid Build Coastguard Worker * and larger audio bandwidth. In this mode, the audio bandwidth is always 70*49fe348cSAndroid Build Coastguard Worker * up to the Nyquist frequency, compared to LC3 at 48 KHz, which limits 71*49fe348cSAndroid Build Coastguard Worker * the bandwidth to 20 KHz. 72*49fe348cSAndroid Build Coastguard Worker * 73*49fe348cSAndroid Build Coastguard Worker * 74*49fe348cSAndroid Build Coastguard Worker * --- Bit rate --- 75*49fe348cSAndroid Build Coastguard Worker * 76*49fe348cSAndroid Build Coastguard Worker * The proposed implementation accepts any frame sizes between 20 and 400 Bytes 77*49fe348cSAndroid Build Coastguard Worker * for non-high-resolution mode. Mind that the LC3 Plus standard defines 78*49fe348cSAndroid Build Coastguard Worker * smaller sizes for frame durations shorter than 10 ms and/or sampling rates 79*49fe348cSAndroid Build Coastguard Worker * less than 48 kHz. 80*49fe348cSAndroid Build Coastguard Worker * 81*49fe348cSAndroid Build Coastguard Worker * In High-Resolution mode, the frame sizes (and bitrates) are restricted 82*49fe348cSAndroid Build Coastguard Worker * as follows: 83*49fe348cSAndroid Build Coastguard Worker * 84*49fe348cSAndroid Build Coastguard Worker * HR Configuration | Frame sizes | Bitrate (kbps) | 85*49fe348cSAndroid Build Coastguard Worker * ------------------ | ------------- | -------------- | 86*49fe348cSAndroid Build Coastguard Worker * 10 ms - 48 KHz | 156 to 625 | 124.8 - 500 | 87*49fe348cSAndroid Build Coastguard Worker * 10 ms - 96 KHz | 187 to 625 | 149.6 - 500 | 88*49fe348cSAndroid Build Coastguard Worker * ------------------ | ------------- | -------------- | 89*49fe348cSAndroid Build Coastguard Worker * 5 ms - 48 KHz | 93 to 375 | 148.8 - 600 | 90*49fe348cSAndroid Build Coastguard Worker * 5 ms - 96 KHz | 109 to 375 | 174.4 - 600 | 91*49fe348cSAndroid Build Coastguard Worker * ------------------ | ------------- | -------------- | 92*49fe348cSAndroid Build Coastguard Worker * 2.5 ms - 48 KHz | 54 to 210 | 172.8 - 672 | 93*49fe348cSAndroid Build Coastguard Worker * 2.5 ms - 96 KHz | 62 to 210 | 198.4 - 672 | 94*49fe348cSAndroid Build Coastguard Worker * 95*49fe348cSAndroid Build Coastguard Worker * 96*49fe348cSAndroid Build Coastguard Worker * --- About 44.1 KHz sample rate --- 97*49fe348cSAndroid Build Coastguard Worker * 98*49fe348cSAndroid Build Coastguard Worker * The Bluetooth specification and the ETSI TS 103 634 standard references 99*49fe348cSAndroid Build Coastguard Worker * the 44.1 KHz sample rate, although there is no support in the core algorithm 100*49fe348cSAndroid Build Coastguard Worker * of the codec. 101*49fe348cSAndroid Build Coastguard Worker * We can summarize the 44.1 KHz support by "You can put any sample rate around 102*49fe348cSAndroid Build Coastguard Worker * the defined base sample rates." Please mind the following items : 103*49fe348cSAndroid Build Coastguard Worker * 104*49fe348cSAndroid Build Coastguard Worker * 1. The frame size will not be 2.5ms, 5ms, 7.5 ms or 10 ms, but is scaled 105*49fe348cSAndroid Build Coastguard Worker * by 'supported sample rate' / 'input sample rate' 106*49fe348cSAndroid Build Coastguard Worker * 107*49fe348cSAndroid Build Coastguard Worker * 2. The bandwidth will be hard limited (to 20 KHz) if you select 48 KHz. 108*49fe348cSAndroid Build Coastguard Worker * The encoded bandwidth will also be affected by the above inverse 109*49fe348cSAndroid Build Coastguard Worker * factor of 20 KHz. 110*49fe348cSAndroid Build Coastguard Worker * 111*49fe348cSAndroid Build Coastguard Worker * Applied to 44.1 KHz, we get : 112*49fe348cSAndroid Build Coastguard Worker * 113*49fe348cSAndroid Build Coastguard Worker * 1. About 8.16 ms frame duration, instead of 7.5 ms 114*49fe348cSAndroid Build Coastguard Worker * About 10.88 ms frame duration, instead of 10 ms 115*49fe348cSAndroid Build Coastguard Worker * 116*49fe348cSAndroid Build Coastguard Worker * 2. The bandwidth becomes limited to 18.375 KHz 117*49fe348cSAndroid Build Coastguard Worker * 118*49fe348cSAndroid Build Coastguard Worker * 119*49fe348cSAndroid Build Coastguard Worker * --- How to encode / decode --- 120*49fe348cSAndroid Build Coastguard Worker * 121*49fe348cSAndroid Build Coastguard Worker * An encoder / decoder context needs to be setup. This context keeps states 122*49fe348cSAndroid Build Coastguard Worker * on the current stream to proceed, and samples that overlapped across 123*49fe348cSAndroid Build Coastguard Worker * frames. 124*49fe348cSAndroid Build Coastguard Worker * 125*49fe348cSAndroid Build Coastguard Worker * You have two ways to setup the encoder / decoder : 126*49fe348cSAndroid Build Coastguard Worker * 127*49fe348cSAndroid Build Coastguard Worker * - Using static memory allocation (this module does not rely on 128*49fe348cSAndroid Build Coastguard Worker * any dynamic memory allocation). The types `lc3_xxcoder_mem_16k_t`, 129*49fe348cSAndroid Build Coastguard Worker * and `lc3_xxcoder_mem_48k_t` have size of the memory needed for 130*49fe348cSAndroid Build Coastguard Worker * encoding up to 16 KHz or 48 KHz. 131*49fe348cSAndroid Build Coastguard Worker * 132*49fe348cSAndroid Build Coastguard Worker * - Using dynamic memory allocation. The `lc3_xxcoder_size()` procedure 133*49fe348cSAndroid Build Coastguard Worker * returns the needed memory size, for a given configuration. The memory 134*49fe348cSAndroid Build Coastguard Worker * space must be aligned to a pointer size. As an example, you can setup 135*49fe348cSAndroid Build Coastguard Worker * encoder like this : 136*49fe348cSAndroid Build Coastguard Worker * 137*49fe348cSAndroid Build Coastguard Worker * | enc = lc3_setup_encoder(frame_us, sample rate, 138*49fe348cSAndroid Build Coastguard Worker * | malloc(lc3_encoder_size(frame_us, sample rate))); 139*49fe348cSAndroid Build Coastguard Worker * | ... 140*49fe348cSAndroid Build Coastguard Worker * | free(enc); 141*49fe348cSAndroid Build Coastguard Worker * 142*49fe348cSAndroid Build Coastguard Worker * Note : 143*49fe348cSAndroid Build Coastguard Worker * - A NULL memory adress as input, will return a NULL encoder context. 144*49fe348cSAndroid Build Coastguard Worker * - The returned encoder handle is set at the address of the allocated 145*49fe348cSAndroid Build Coastguard Worker * memory space, you can directly free the handle. 146*49fe348cSAndroid Build Coastguard Worker * 147*49fe348cSAndroid Build Coastguard Worker * Next, call the `lc3_encode()` encoding procedure, for each frames. 148*49fe348cSAndroid Build Coastguard Worker * To handle multichannel streams (Stereo or more), you can proceed with 149*49fe348cSAndroid Build Coastguard Worker * interleaved channels PCM stream like this : 150*49fe348cSAndroid Build Coastguard Worker * 151*49fe348cSAndroid Build Coastguard Worker * | for(int ich = 0; ich < nch: ich++) 152*49fe348cSAndroid Build Coastguard Worker * | lc3_encode(encoder[ich], pcm + ich, nch, ...); 153*49fe348cSAndroid Build Coastguard Worker * 154*49fe348cSAndroid Build Coastguard Worker * with `nch` as the number of channels in the PCM stream 155*49fe348cSAndroid Build Coastguard Worker * 156*49fe348cSAndroid Build Coastguard Worker * --- 157*49fe348cSAndroid Build Coastguard Worker * 158*49fe348cSAndroid Build Coastguard Worker * Antoine SOULIER, Tempow / Google LLC 159*49fe348cSAndroid Build Coastguard Worker * 160*49fe348cSAndroid Build Coastguard Worker */ 161*49fe348cSAndroid Build Coastguard Worker 162*49fe348cSAndroid Build Coastguard Worker #ifndef __LC3_H 163*49fe348cSAndroid Build Coastguard Worker #define __LC3_H 164*49fe348cSAndroid Build Coastguard Worker 165*49fe348cSAndroid Build Coastguard Worker #ifdef __cplusplus 166*49fe348cSAndroid Build Coastguard Worker extern "C" { 167*49fe348cSAndroid Build Coastguard Worker #endif 168*49fe348cSAndroid Build Coastguard Worker 169*49fe348cSAndroid Build Coastguard Worker #include <stdint.h> 170*49fe348cSAndroid Build Coastguard Worker #include <stdbool.h> 171*49fe348cSAndroid Build Coastguard Worker 172*49fe348cSAndroid Build Coastguard Worker #include "lc3_private.h" 173*49fe348cSAndroid Build Coastguard Worker 174*49fe348cSAndroid Build Coastguard Worker 175*49fe348cSAndroid Build Coastguard Worker /** 176*49fe348cSAndroid Build Coastguard Worker * Limitations 177*49fe348cSAndroid Build Coastguard Worker * - On the bitrate, in bps 178*49fe348cSAndroid Build Coastguard Worker * - On the size of the frames in bytes 179*49fe348cSAndroid Build Coastguard Worker * - On the number of samples by frames 180*49fe348cSAndroid Build Coastguard Worker */ 181*49fe348cSAndroid Build Coastguard Worker 182*49fe348cSAndroid Build Coastguard Worker #define LC3_MIN_BITRATE 16000 183*49fe348cSAndroid Build Coastguard Worker #define LC3_MAX_BITRATE 320000 184*49fe348cSAndroid Build Coastguard Worker #define LC3_HR_MAX_BITRATE 672000 185*49fe348cSAndroid Build Coastguard Worker 186*49fe348cSAndroid Build Coastguard Worker #define LC3_MIN_FRAME_BYTES 20 187*49fe348cSAndroid Build Coastguard Worker #define LC3_MAX_FRAME_BYTES 400 188*49fe348cSAndroid Build Coastguard Worker #define LC3_HR_MAX_FRAME_BYTES 625 189*49fe348cSAndroid Build Coastguard Worker 190*49fe348cSAndroid Build Coastguard Worker #define LC3_MIN_FRAME_SAMPLES LC3_NS( 2500, 8000) 191*49fe348cSAndroid Build Coastguard Worker #define LC3_MAX_FRAME_SAMPLES LC3_NS(10000, 48000) 192*49fe348cSAndroid Build Coastguard Worker #define LC3_HR_MAX_FRAME_SAMPLES LC3_NS(10000, 96000) 193*49fe348cSAndroid Build Coastguard Worker 194*49fe348cSAndroid Build Coastguard Worker 195*49fe348cSAndroid Build Coastguard Worker /** 196*49fe348cSAndroid Build Coastguard Worker * Parameters check 197*49fe348cSAndroid Build Coastguard Worker * LC3_CHECK_DT_US(us) True when frame duration in us is suitable 198*49fe348cSAndroid Build Coastguard Worker * LC3_CHECK_SR_HZ(sr) True when sample rate in Hz is suitable 199*49fe348cSAndroid Build Coastguard Worker * 200*49fe348cSAndroid Build Coastguard Worker * LC3_HR_CHECK_SR_HZ(hrmode, sr) 201*49fe348cSAndroid Build Coastguard Worker * True when sample rate in Hz is suitable, according to the 202*49fe348cSAndroid Build Coastguard Worker * selection of the high-resolution mode `hrmode`. 203*49fe348cSAndroid Build Coastguard Worker */ 204*49fe348cSAndroid Build Coastguard Worker 205*49fe348cSAndroid Build Coastguard Worker #define LC3_CHECK_DT_US(us) \ 206*49fe348cSAndroid Build Coastguard Worker ( ((us) == 2500) || ((us) == 5000) || \ 207*49fe348cSAndroid Build Coastguard Worker ((us) == 7500) || ((us) == 10000) ) 208*49fe348cSAndroid Build Coastguard Worker 209*49fe348cSAndroid Build Coastguard Worker #define LC3_CHECK_SR_HZ(sr) \ 210*49fe348cSAndroid Build Coastguard Worker ( ((sr) == 8000) || ((sr) == 16000) || ((sr) == 24000) || \ 211*49fe348cSAndroid Build Coastguard Worker ((sr) == 32000) || ((sr) == 48000) ) 212*49fe348cSAndroid Build Coastguard Worker 213*49fe348cSAndroid Build Coastguard Worker #define LC3_HR_CHECK_SR_HZ(hrmode, sr) \ 214*49fe348cSAndroid Build Coastguard Worker ( (hrmode) ? ((sr) == 48000) || ((sr) == 96000) : LC3_CHECK_SR_HZ(sr) ) 215*49fe348cSAndroid Build Coastguard Worker 216*49fe348cSAndroid Build Coastguard Worker 217*49fe348cSAndroid Build Coastguard Worker /** 218*49fe348cSAndroid Build Coastguard Worker * PCM Sample Format 219*49fe348cSAndroid Build Coastguard Worker * S16 Signed 16 bits, in 16 bits words (int16_t) 220*49fe348cSAndroid Build Coastguard Worker * S24 Signed 24 bits, using low three bytes of 32 bits words (int32_t). 221*49fe348cSAndroid Build Coastguard Worker * The high byte sign extends (bits 31..24 set to b23). 222*49fe348cSAndroid Build Coastguard Worker * S24_3LE Signed 24 bits packed in 3 bytes little endian 223*49fe348cSAndroid Build Coastguard Worker * FLOAT Floating point 32 bits (float type), in range -1 to 1 224*49fe348cSAndroid Build Coastguard Worker */ 225*49fe348cSAndroid Build Coastguard Worker 226*49fe348cSAndroid Build Coastguard Worker enum lc3_pcm_format { 227*49fe348cSAndroid Build Coastguard Worker LC3_PCM_FORMAT_S16, 228*49fe348cSAndroid Build Coastguard Worker LC3_PCM_FORMAT_S24, 229*49fe348cSAndroid Build Coastguard Worker LC3_PCM_FORMAT_S24_3LE, 230*49fe348cSAndroid Build Coastguard Worker LC3_PCM_FORMAT_FLOAT, 231*49fe348cSAndroid Build Coastguard Worker }; 232*49fe348cSAndroid Build Coastguard Worker 233*49fe348cSAndroid Build Coastguard Worker 234*49fe348cSAndroid Build Coastguard Worker /** 235*49fe348cSAndroid Build Coastguard Worker * Handle 236*49fe348cSAndroid Build Coastguard Worker */ 237*49fe348cSAndroid Build Coastguard Worker 238*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_encoder *lc3_encoder_t; 239*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_decoder *lc3_decoder_t; 240*49fe348cSAndroid Build Coastguard Worker 241*49fe348cSAndroid Build Coastguard Worker 242*49fe348cSAndroid Build Coastguard Worker /** 243*49fe348cSAndroid Build Coastguard Worker * Static memory of encoder/decoder contexts 244*49fe348cSAndroid Build Coastguard Worker * 245*49fe348cSAndroid Build Coastguard Worker * Propose types suitable for static memory allocation, supporting 246*49fe348cSAndroid Build Coastguard Worker * any frame duration, and maximum sample rates 16k and 48k respectively 247*49fe348cSAndroid Build Coastguard Worker * You can customize your type using the `LC3_ENCODER_MEM_T` or 248*49fe348cSAndroid Build Coastguard Worker * `LC3_DECODER_MEM_T` macro. 249*49fe348cSAndroid Build Coastguard Worker */ 250*49fe348cSAndroid Build Coastguard Worker 251*49fe348cSAndroid Build Coastguard Worker typedef LC3_ENCODER_MEM_T(10000, 16000) lc3_encoder_mem_16k_t; 252*49fe348cSAndroid Build Coastguard Worker typedef LC3_ENCODER_MEM_T(10000, 48000) lc3_encoder_mem_48k_t; 253*49fe348cSAndroid Build Coastguard Worker 254*49fe348cSAndroid Build Coastguard Worker typedef LC3_DECODER_MEM_T(10000, 16000) lc3_decoder_mem_16k_t; 255*49fe348cSAndroid Build Coastguard Worker typedef LC3_DECODER_MEM_T(10000, 48000) lc3_decoder_mem_48k_t; 256*49fe348cSAndroid Build Coastguard Worker 257*49fe348cSAndroid Build Coastguard Worker 258*49fe348cSAndroid Build Coastguard Worker /** 259*49fe348cSAndroid Build Coastguard Worker * Return the number of PCM samples in a frame 260*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 261*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 262*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 263*49fe348cSAndroid Build Coastguard Worker * return Number of PCM samples, -1 on bad parameters 264*49fe348cSAndroid Build Coastguard Worker */ 265*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_hr_frame_samples(bool hrmode, int dt_us, int sr_hz); 266*49fe348cSAndroid Build Coastguard Worker 267*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_frame_samples(int dt_us, int sr_hz); 268*49fe348cSAndroid Build Coastguard Worker 269*49fe348cSAndroid Build Coastguard Worker /** 270*49fe348cSAndroid Build Coastguard Worker * Return the size of frames, from bitrate 271*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 272*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 273*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 274*49fe348cSAndroid Build Coastguard Worker * bitrate Target bitrate in bit per second, 0 or `INT_MAX` returns 275*49fe348cSAndroid Build Coastguard Worker * respectively the minimum and maximum allowed size. 276*49fe348cSAndroid Build Coastguard Worker * return The floor size in bytes of the frames, -1 on bad parameters 277*49fe348cSAndroid Build Coastguard Worker */ 278*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_hr_frame_bytes( 279*49fe348cSAndroid Build Coastguard Worker bool hrmode, int dt_us, int sr_hz, int bitrate); 280*49fe348cSAndroid Build Coastguard Worker 281*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_frame_bytes(int dt_us, int bitrate); 282*49fe348cSAndroid Build Coastguard Worker 283*49fe348cSAndroid Build Coastguard Worker /** 284*49fe348cSAndroid Build Coastguard Worker * Return the size of frame blocks, from bitrate 285*49fe348cSAndroid Build Coastguard Worker * A frame block contains the frame data from all channels. 286*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 287*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 288*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 289*49fe348cSAndroid Build Coastguard Worker * nchannels The number of channels (or frames) in the block (<= 8) 290*49fe348cSAndroid Build Coastguard Worker * bitrate Target bitrate in bit per second, 0 or `INT_MAX` returns 291*49fe348cSAndroid Build Coastguard Worker * respectively the minimum and maximum allowed size. 292*49fe348cSAndroid Build Coastguard Worker * return The floor size in bytes of the frames, -1 on bad parameters 293*49fe348cSAndroid Build Coastguard Worker */ 294*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_hr_frame_block_bytes( 295*49fe348cSAndroid Build Coastguard Worker bool hrmode, int dt_us, int sr_hz, int nchannels, int bitrate); 296*49fe348cSAndroid Build Coastguard Worker 297*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_frame_block_bytes(int dt_us, int nframes, int bitrate); 298*49fe348cSAndroid Build Coastguard Worker 299*49fe348cSAndroid Build Coastguard Worker /** 300*49fe348cSAndroid Build Coastguard Worker * Resolve the bitrate, from the size of frames 301*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 302*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 303*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 304*49fe348cSAndroid Build Coastguard Worker * nbytes Size in bytes of the frames or frame blocks 305*49fe348cSAndroid Build Coastguard Worker * return The ceiled bitrate in bps, -1 on bad parameters 306*49fe348cSAndroid Build Coastguard Worker */ 307*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_hr_resolve_bitrate( 308*49fe348cSAndroid Build Coastguard Worker bool hrmode, int dt_us, int sr_hz, int nbytes); 309*49fe348cSAndroid Build Coastguard Worker 310*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_resolve_bitrate(int dt_us, int nbytes); 311*49fe348cSAndroid Build Coastguard Worker 312*49fe348cSAndroid Build Coastguard Worker /** 313*49fe348cSAndroid Build Coastguard Worker * Return algorithmic delay, as a number of samples 314*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 315*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 316*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 317*49fe348cSAndroid Build Coastguard Worker * return Number of algorithmic delay samples, -1 on bad parameters 318*49fe348cSAndroid Build Coastguard Worker */ 319*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_hr_delay_samples(bool hrmode, int dt_us, int sr_hz); 320*49fe348cSAndroid Build Coastguard Worker 321*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_delay_samples(int dt_us, int sr_hz); 322*49fe348cSAndroid Build Coastguard Worker 323*49fe348cSAndroid Build Coastguard Worker /** 324*49fe348cSAndroid Build Coastguard Worker * Return size needed for an encoder 325*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 326*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 327*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 328*49fe348cSAndroid Build Coastguard Worker * return Size of then encoder in bytes, 0 on bad parameters 329*49fe348cSAndroid Build Coastguard Worker * 330*49fe348cSAndroid Build Coastguard Worker * The `sr_hz` parameter is the sample rate of the PCM input stream, 331*49fe348cSAndroid Build Coastguard Worker * and will match `sr_pcm_hz` of `lc3_hr_setup_encoder()`. 332*49fe348cSAndroid Build Coastguard Worker */ 333*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT unsigned lc3_hr_encoder_size(bool hrmode, int dt_us, int sr_hz); 334*49fe348cSAndroid Build Coastguard Worker 335*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT unsigned lc3_encoder_size(int dt_us, int sr_hz); 336*49fe348cSAndroid Build Coastguard Worker 337*49fe348cSAndroid Build Coastguard Worker /** 338*49fe348cSAndroid Build Coastguard Worker * Setup encoder 339*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 340*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 341*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 342*49fe348cSAndroid Build Coastguard Worker * sr_pcm_hz Input sample rate, downsampling option of input, or 0 343*49fe348cSAndroid Build Coastguard Worker * mem Encoder memory space, aligned to pointer type 344*49fe348cSAndroid Build Coastguard Worker * return Encoder as an handle, NULL on bad parameters 345*49fe348cSAndroid Build Coastguard Worker * 346*49fe348cSAndroid Build Coastguard Worker * The `sr_pcm_hz` parameter is a downsampling option of PCM input, 347*49fe348cSAndroid Build Coastguard Worker * the value `0` fallback to the sample rate of the encoded stream `sr_hz`. 348*49fe348cSAndroid Build Coastguard Worker * When used, `sr_pcm_hz` is intended to be higher or equal to the encoder 349*49fe348cSAndroid Build Coastguard Worker * sample rate `sr_hz`. The size of the context needed, given by 350*49fe348cSAndroid Build Coastguard Worker * `lc3_hr_encoder_size()` will be set accordingly to `sr_pcm_hz`. 351*49fe348cSAndroid Build Coastguard Worker */ 352*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT lc3_encoder_t lc3_hr_setup_encoder( 353*49fe348cSAndroid Build Coastguard Worker bool hrmode, int dt_us, int sr_hz, int sr_pcm_hz, void *mem); 354*49fe348cSAndroid Build Coastguard Worker 355*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT lc3_encoder_t lc3_setup_encoder( 356*49fe348cSAndroid Build Coastguard Worker int dt_us, int sr_hz, int sr_pcm_hz, void *mem); 357*49fe348cSAndroid Build Coastguard Worker 358*49fe348cSAndroid Build Coastguard Worker /** 359*49fe348cSAndroid Build Coastguard Worker * Encode a frame 360*49fe348cSAndroid Build Coastguard Worker * encoder Handle of the encoder 361*49fe348cSAndroid Build Coastguard Worker * fmt PCM input format 362*49fe348cSAndroid Build Coastguard Worker * pcm, stride Input PCM samples, and count between two consecutives 363*49fe348cSAndroid Build Coastguard Worker * nbytes Target size, in bytes, of the frame 364*49fe348cSAndroid Build Coastguard Worker * out Output buffer of `nbytes` size 365*49fe348cSAndroid Build Coastguard Worker * return 0: On success -1: Wrong parameters 366*49fe348cSAndroid Build Coastguard Worker */ 367*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_encode( 368*49fe348cSAndroid Build Coastguard Worker lc3_encoder_t encoder, enum lc3_pcm_format fmt, 369*49fe348cSAndroid Build Coastguard Worker const void *pcm, int stride, int nbytes, void *out); 370*49fe348cSAndroid Build Coastguard Worker 371*49fe348cSAndroid Build Coastguard Worker /** 372*49fe348cSAndroid Build Coastguard Worker * Return size needed for an decoder 373*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 374*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 375*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 376*49fe348cSAndroid Build Coastguard Worker * return Size of then decoder in bytes, 0 on bad parameters 377*49fe348cSAndroid Build Coastguard Worker * 378*49fe348cSAndroid Build Coastguard Worker * The `sr_hz` parameter is the sample rate of the PCM output stream, 379*49fe348cSAndroid Build Coastguard Worker * and will match `sr_pcm_hz` of `lc3_hr_setup_decoder()`. 380*49fe348cSAndroid Build Coastguard Worker */ 381*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT unsigned lc3_hr_decoder_size(bool hrmode, int dt_us, int sr_hz); 382*49fe348cSAndroid Build Coastguard Worker 383*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT unsigned lc3_decoder_size(int dt_us, int sr_hz); 384*49fe348cSAndroid Build Coastguard Worker 385*49fe348cSAndroid Build Coastguard Worker /** 386*49fe348cSAndroid Build Coastguard Worker * Setup decoder 387*49fe348cSAndroid Build Coastguard Worker * hrmode Enable High-Resolution mode (48000 and 96000 sample rates) 388*49fe348cSAndroid Build Coastguard Worker * dt_us Frame duration in us, 2500, 5000, 7500 or 10000 389*49fe348cSAndroid Build Coastguard Worker * sr_hz Sample rate in Hz, 8000, 16000, 24000, 32000, 48000 or 96000 390*49fe348cSAndroid Build Coastguard Worker * sr_pcm_hz Output sample rate, upsampling option of output (or 0) 391*49fe348cSAndroid Build Coastguard Worker * mem Decoder memory space, aligned to pointer type 392*49fe348cSAndroid Build Coastguard Worker * return Decoder as an handle, NULL on bad parameters 393*49fe348cSAndroid Build Coastguard Worker * 394*49fe348cSAndroid Build Coastguard Worker * The `sr_pcm_hz` parameter is an upsampling option of PCM output, 395*49fe348cSAndroid Build Coastguard Worker * the value `0` fallback to the sample rate of the decoded stream `sr_hz`. 396*49fe348cSAndroid Build Coastguard Worker * When used, `sr_pcm_hz` is intended to be higher or equal to the decoder 397*49fe348cSAndroid Build Coastguard Worker * sample rate `sr_hz`. The size of the context needed, given by 398*49fe348cSAndroid Build Coastguard Worker * `lc3_hr_decoder_size()` will be set accordingly to `sr_pcm_hz`. 399*49fe348cSAndroid Build Coastguard Worker */ 400*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT lc3_decoder_t lc3_hr_setup_decoder( 401*49fe348cSAndroid Build Coastguard Worker bool hrmode, int dt_us, int sr_hz, int sr_pcm_hz, void *mem); 402*49fe348cSAndroid Build Coastguard Worker 403*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT lc3_decoder_t lc3_setup_decoder( 404*49fe348cSAndroid Build Coastguard Worker int dt_us, int sr_hz, int sr_pcm_hz, void *mem); 405*49fe348cSAndroid Build Coastguard Worker 406*49fe348cSAndroid Build Coastguard Worker /** 407*49fe348cSAndroid Build Coastguard Worker * Decode a frame 408*49fe348cSAndroid Build Coastguard Worker * decoder Handle of the decoder 409*49fe348cSAndroid Build Coastguard Worker * in, nbytes Input bitstream, and size in bytes, NULL performs PLC 410*49fe348cSAndroid Build Coastguard Worker * fmt PCM output format 411*49fe348cSAndroid Build Coastguard Worker * pcm, stride Output PCM samples, and count between two consecutives 412*49fe348cSAndroid Build Coastguard Worker * return 0: On success 1: PLC operated -1: Wrong parameters 413*49fe348cSAndroid Build Coastguard Worker */ 414*49fe348cSAndroid Build Coastguard Worker LC3_EXPORT int lc3_decode( 415*49fe348cSAndroid Build Coastguard Worker lc3_decoder_t decoder, const void *in, int nbytes, 416*49fe348cSAndroid Build Coastguard Worker enum lc3_pcm_format fmt, void *pcm, int stride); 417*49fe348cSAndroid Build Coastguard Worker 418*49fe348cSAndroid Build Coastguard Worker 419*49fe348cSAndroid Build Coastguard Worker #ifdef __cplusplus 420*49fe348cSAndroid Build Coastguard Worker } 421*49fe348cSAndroid Build Coastguard Worker #endif 422*49fe348cSAndroid Build Coastguard Worker 423*49fe348cSAndroid Build Coastguard Worker #endif /* __LC3_H */ 424