xref: /aosp_15_r20/external/liblc3/include/lc3.h (revision 49fe348c0058011ee60b6957cdd9d52742df84bc)
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