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 #ifndef __LC3_PRIVATE_H 20*49fe348cSAndroid Build Coastguard Worker #define __LC3_PRIVATE_H 21*49fe348cSAndroid Build Coastguard Worker 22*49fe348cSAndroid Build Coastguard Worker #include <stdint.h> 23*49fe348cSAndroid Build Coastguard Worker #include <stdbool.h> 24*49fe348cSAndroid Build Coastguard Worker 25*49fe348cSAndroid Build Coastguard Worker 26*49fe348cSAndroid Build Coastguard Worker /** 27*49fe348cSAndroid Build Coastguard Worker * Characteristics 28*49fe348cSAndroid Build Coastguard Worker * 29*49fe348cSAndroid Build Coastguard Worker * - The number of samples within a frame 30*49fe348cSAndroid Build Coastguard Worker * 31*49fe348cSAndroid Build Coastguard Worker * - The number of MDCT delayed samples, sum of half a frame and 32*49fe348cSAndroid Build Coastguard Worker * an ovelap of future by 1.25 ms (2.5ms, 5ms and 10ms frame durations) 33*49fe348cSAndroid Build Coastguard Worker * or 2 ms (7.5ms frame duration). 34*49fe348cSAndroid Build Coastguard Worker * 35*49fe348cSAndroid Build Coastguard Worker * - For decoding, keep 18 ms of history, aligned on a frame 36*49fe348cSAndroid Build Coastguard Worker * 37*49fe348cSAndroid Build Coastguard Worker * - For encoding, keep 1.25 ms of temporal previous samples 38*49fe348cSAndroid Build Coastguard Worker */ 39*49fe348cSAndroid Build Coastguard Worker 40*49fe348cSAndroid Build Coastguard Worker #define LC3_NS(dt_us, sr_hz) \ 41*49fe348cSAndroid Build Coastguard Worker ( (dt_us) * (sr_hz) / 1000 / 1000 ) 42*49fe348cSAndroid Build Coastguard Worker 43*49fe348cSAndroid Build Coastguard Worker #define LC3_ND(dt_us, sr_hz) \ 44*49fe348cSAndroid Build Coastguard Worker ( LC3_NS(dt_us, sr_hz) / 2 + \ 45*49fe348cSAndroid Build Coastguard Worker LC3_NS((dt_us) == 7500 ? 2000 : 1250, sr_hz) ) 46*49fe348cSAndroid Build Coastguard Worker 47*49fe348cSAndroid Build Coastguard Worker #define LC3_NH(dt_us, sr_hz) \ 48*49fe348cSAndroid Build Coastguard Worker ( (sr_hz) > 48000 ? 0 : ( LC3_NS(18000, sr_hz) + \ 49*49fe348cSAndroid Build Coastguard Worker LC3_NS(dt_us, sr_hz) - (LC3_NS(18000, sr_hz) % LC3_NS(dt_us, sr_hz)) ) ) 50*49fe348cSAndroid Build Coastguard Worker 51*49fe348cSAndroid Build Coastguard Worker #define LC3_NT(sr_hz) \ 52*49fe348cSAndroid Build Coastguard Worker ( LC3_NS(1250, sr_hz) ) 53*49fe348cSAndroid Build Coastguard Worker 54*49fe348cSAndroid Build Coastguard Worker 55*49fe348cSAndroid Build Coastguard Worker /** 56*49fe348cSAndroid Build Coastguard Worker * Frame duration 57*49fe348cSAndroid Build Coastguard Worker */ 58*49fe348cSAndroid Build Coastguard Worker 59*49fe348cSAndroid Build Coastguard Worker enum lc3_dt { 60*49fe348cSAndroid Build Coastguard Worker LC3_DT_2M5 = 0, 61*49fe348cSAndroid Build Coastguard Worker LC3_DT_5M = 1, 62*49fe348cSAndroid Build Coastguard Worker LC3_DT_7M5 = 2, 63*49fe348cSAndroid Build Coastguard Worker LC3_DT_10M = 3, 64*49fe348cSAndroid Build Coastguard Worker 65*49fe348cSAndroid Build Coastguard Worker LC3_NUM_DT 66*49fe348cSAndroid Build Coastguard Worker }; 67*49fe348cSAndroid Build Coastguard Worker 68*49fe348cSAndroid Build Coastguard Worker 69*49fe348cSAndroid Build Coastguard Worker /** 70*49fe348cSAndroid Build Coastguard Worker * Sampling frequency and high-resolution mode 71*49fe348cSAndroid Build Coastguard Worker */ 72*49fe348cSAndroid Build Coastguard Worker 73*49fe348cSAndroid Build Coastguard Worker enum lc3_srate { 74*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_8K, 75*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_16K, 76*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_24K, 77*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_32K, 78*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_48K, 79*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_48K_HR, 80*49fe348cSAndroid Build Coastguard Worker LC3_SRATE_96K_HR, 81*49fe348cSAndroid Build Coastguard Worker 82*49fe348cSAndroid Build Coastguard Worker LC3_NUM_SRATE 83*49fe348cSAndroid Build Coastguard Worker }; 84*49fe348cSAndroid Build Coastguard Worker 85*49fe348cSAndroid Build Coastguard Worker 86*49fe348cSAndroid Build Coastguard Worker /** 87*49fe348cSAndroid Build Coastguard Worker * Encoder state and memory 88*49fe348cSAndroid Build Coastguard Worker */ 89*49fe348cSAndroid Build Coastguard Worker 90*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_attdet_analysis { 91*49fe348cSAndroid Build Coastguard Worker int32_t en1, an1; 92*49fe348cSAndroid Build Coastguard Worker int p_att; 93*49fe348cSAndroid Build Coastguard Worker } lc3_attdet_analysis_t; 94*49fe348cSAndroid Build Coastguard Worker 95*49fe348cSAndroid Build Coastguard Worker struct lc3_ltpf_hp50_state { 96*49fe348cSAndroid Build Coastguard Worker int64_t s1, s2; 97*49fe348cSAndroid Build Coastguard Worker }; 98*49fe348cSAndroid Build Coastguard Worker 99*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_ltpf_analysis { 100*49fe348cSAndroid Build Coastguard Worker bool active; 101*49fe348cSAndroid Build Coastguard Worker int pitch; 102*49fe348cSAndroid Build Coastguard Worker float nc[2]; 103*49fe348cSAndroid Build Coastguard Worker 104*49fe348cSAndroid Build Coastguard Worker struct lc3_ltpf_hp50_state hp50; 105*49fe348cSAndroid Build Coastguard Worker int16_t x_12k8[384]; 106*49fe348cSAndroid Build Coastguard Worker int16_t x_6k4[178]; 107*49fe348cSAndroid Build Coastguard Worker int tc; 108*49fe348cSAndroid Build Coastguard Worker } lc3_ltpf_analysis_t; 109*49fe348cSAndroid Build Coastguard Worker 110*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_spec_analysis { 111*49fe348cSAndroid Build Coastguard Worker float nbits_off; 112*49fe348cSAndroid Build Coastguard Worker int nbits_spare; 113*49fe348cSAndroid Build Coastguard Worker } lc3_spec_analysis_t; 114*49fe348cSAndroid Build Coastguard Worker 115*49fe348cSAndroid Build Coastguard Worker struct lc3_encoder { 116*49fe348cSAndroid Build Coastguard Worker enum lc3_dt dt; 117*49fe348cSAndroid Build Coastguard Worker enum lc3_srate sr, sr_pcm; 118*49fe348cSAndroid Build Coastguard Worker 119*49fe348cSAndroid Build Coastguard Worker lc3_attdet_analysis_t attdet; 120*49fe348cSAndroid Build Coastguard Worker lc3_ltpf_analysis_t ltpf; 121*49fe348cSAndroid Build Coastguard Worker lc3_spec_analysis_t spec; 122*49fe348cSAndroid Build Coastguard Worker 123*49fe348cSAndroid Build Coastguard Worker int xt_off, xs_off, xd_off; 124*49fe348cSAndroid Build Coastguard Worker float x[1]; 125*49fe348cSAndroid Build Coastguard Worker }; 126*49fe348cSAndroid Build Coastguard Worker 127*49fe348cSAndroid Build Coastguard Worker #define LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) \ 128*49fe348cSAndroid Build Coastguard Worker ( ( LC3_NS(dt_us, sr_hz) + LC3_NT(sr_hz) ) / 2 + \ 129*49fe348cSAndroid Build Coastguard Worker LC3_NS(dt_us, sr_hz) + LC3_ND(dt_us, sr_hz) ) 130*49fe348cSAndroid Build Coastguard Worker 131*49fe348cSAndroid Build Coastguard Worker #define LC3_ENCODER_MEM_T(dt_us, sr_hz) \ 132*49fe348cSAndroid Build Coastguard Worker struct { \ 133*49fe348cSAndroid Build Coastguard Worker struct lc3_encoder __e; \ 134*49fe348cSAndroid Build Coastguard Worker float __x[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \ 135*49fe348cSAndroid Build Coastguard Worker } 136*49fe348cSAndroid Build Coastguard Worker 137*49fe348cSAndroid Build Coastguard Worker 138*49fe348cSAndroid Build Coastguard Worker /** 139*49fe348cSAndroid Build Coastguard Worker * Decoder state and memory 140*49fe348cSAndroid Build Coastguard Worker */ 141*49fe348cSAndroid Build Coastguard Worker 142*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_ltpf_synthesis { 143*49fe348cSAndroid Build Coastguard Worker bool active; 144*49fe348cSAndroid Build Coastguard Worker int pitch; 145*49fe348cSAndroid Build Coastguard Worker float c[2*12], x[12]; 146*49fe348cSAndroid Build Coastguard Worker } lc3_ltpf_synthesis_t; 147*49fe348cSAndroid Build Coastguard Worker 148*49fe348cSAndroid Build Coastguard Worker typedef struct lc3_plc_state { 149*49fe348cSAndroid Build Coastguard Worker uint16_t seed; 150*49fe348cSAndroid Build Coastguard Worker int count; 151*49fe348cSAndroid Build Coastguard Worker float alpha; 152*49fe348cSAndroid Build Coastguard Worker } lc3_plc_state_t; 153*49fe348cSAndroid Build Coastguard Worker 154*49fe348cSAndroid Build Coastguard Worker struct lc3_decoder { 155*49fe348cSAndroid Build Coastguard Worker enum lc3_dt dt; 156*49fe348cSAndroid Build Coastguard Worker enum lc3_srate sr, sr_pcm; 157*49fe348cSAndroid Build Coastguard Worker 158*49fe348cSAndroid Build Coastguard Worker lc3_ltpf_synthesis_t ltpf; 159*49fe348cSAndroid Build Coastguard Worker lc3_plc_state_t plc; 160*49fe348cSAndroid Build Coastguard Worker 161*49fe348cSAndroid Build Coastguard Worker int xh_off, xs_off, xd_off, xg_off; 162*49fe348cSAndroid Build Coastguard Worker float x[1]; 163*49fe348cSAndroid Build Coastguard Worker }; 164*49fe348cSAndroid Build Coastguard Worker 165*49fe348cSAndroid Build Coastguard Worker #define LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) \ 166*49fe348cSAndroid Build Coastguard Worker ( LC3_NH(dt_us, sr_hz) + LC3_NS(dt_us, sr_hz) + \ 167*49fe348cSAndroid Build Coastguard Worker LC3_ND(dt_us, sr_hz) + LC3_NS(dt_us, sr_hz) ) 168*49fe348cSAndroid Build Coastguard Worker 169*49fe348cSAndroid Build Coastguard Worker #define LC3_DECODER_MEM_T(dt_us, sr_hz) \ 170*49fe348cSAndroid Build Coastguard Worker struct { \ 171*49fe348cSAndroid Build Coastguard Worker struct lc3_decoder __d; \ 172*49fe348cSAndroid Build Coastguard Worker float __x[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \ 173*49fe348cSAndroid Build Coastguard Worker } 174*49fe348cSAndroid Build Coastguard Worker 175*49fe348cSAndroid Build Coastguard Worker 176*49fe348cSAndroid Build Coastguard Worker /** 177*49fe348cSAndroid Build Coastguard Worker * Change the visibility of interface functions 178*49fe348cSAndroid Build Coastguard Worker */ 179*49fe348cSAndroid Build Coastguard Worker 180*49fe348cSAndroid Build Coastguard Worker #ifdef _WIN32 181*49fe348cSAndroid Build Coastguard Worker #define LC3_EXPORT __declspec(dllexport) 182*49fe348cSAndroid Build Coastguard Worker #else 183*49fe348cSAndroid Build Coastguard Worker #define LC3_EXPORT __attribute__((visibility ("default"))) 184*49fe348cSAndroid Build Coastguard Worker #endif 185*49fe348cSAndroid Build Coastguard Worker 186*49fe348cSAndroid Build Coastguard Worker 187*49fe348cSAndroid Build Coastguard Worker #endif /* __LC3_PRIVATE_H */ 188