1*9a19cd78SMatthias Ringwald /****************************************************************************** 2*9a19cd78SMatthias Ringwald * 3*9a19cd78SMatthias Ringwald * Copyright 2015 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 #ifndef __LC3_PRIVATE_H 20*9a19cd78SMatthias Ringwald #define __LC3_PRIVATE_H 21*9a19cd78SMatthias Ringwald 22*9a19cd78SMatthias Ringwald #include <stdint.h> 23*9a19cd78SMatthias Ringwald #include <stdbool.h> 24*9a19cd78SMatthias Ringwald 25*9a19cd78SMatthias Ringwald 26*9a19cd78SMatthias Ringwald /** 27*9a19cd78SMatthias Ringwald * Return number of samples, delayed samples and 28*9a19cd78SMatthias Ringwald * encoded spectrum coefficients within a frame 29*9a19cd78SMatthias Ringwald * For decoding, add number of samples of 18 ms history 30*9a19cd78SMatthias Ringwald */ 31*9a19cd78SMatthias Ringwald 32*9a19cd78SMatthias Ringwald #define __LC3_NS(dt_us, sr_hz) \ 33*9a19cd78SMatthias Ringwald ((dt_us * sr_hz) / 1000 / 1000) 34*9a19cd78SMatthias Ringwald 35*9a19cd78SMatthias Ringwald #define __LC3_ND(dt_us, sr_hz) \ 36*9a19cd78SMatthias Ringwald ( (dt_us) == 7500 ? 23 * __LC3_NS(dt_us, sr_hz) / 30 \ 37*9a19cd78SMatthias Ringwald : 5 * __LC3_NS(dt_us, sr_hz) / 8 ) 38*9a19cd78SMatthias Ringwald 39*9a19cd78SMatthias Ringwald #define __LC3_NH(sr_hz) \ 40*9a19cd78SMatthias Ringwald ( (18 * sr_hz) / 1000 ) 41*9a19cd78SMatthias Ringwald 42*9a19cd78SMatthias Ringwald 43*9a19cd78SMatthias Ringwald /** 44*9a19cd78SMatthias Ringwald * Frame duration 7.5ms or 10ms 45*9a19cd78SMatthias Ringwald */ 46*9a19cd78SMatthias Ringwald 47*9a19cd78SMatthias Ringwald enum lc3_dt { 48*9a19cd78SMatthias Ringwald LC3_DT_7M5, 49*9a19cd78SMatthias Ringwald LC3_DT_10M, 50*9a19cd78SMatthias Ringwald 51*9a19cd78SMatthias Ringwald LC3_NUM_DT 52*9a19cd78SMatthias Ringwald }; 53*9a19cd78SMatthias Ringwald 54*9a19cd78SMatthias Ringwald /** 55*9a19cd78SMatthias Ringwald * Sampling frequency 56*9a19cd78SMatthias Ringwald */ 57*9a19cd78SMatthias Ringwald 58*9a19cd78SMatthias Ringwald enum lc3_srate { 59*9a19cd78SMatthias Ringwald LC3_SRATE_8K, 60*9a19cd78SMatthias Ringwald LC3_SRATE_16K, 61*9a19cd78SMatthias Ringwald LC3_SRATE_24K, 62*9a19cd78SMatthias Ringwald LC3_SRATE_32K, 63*9a19cd78SMatthias Ringwald LC3_SRATE_48K, 64*9a19cd78SMatthias Ringwald 65*9a19cd78SMatthias Ringwald LC3_NUM_SRATE, 66*9a19cd78SMatthias Ringwald }; 67*9a19cd78SMatthias Ringwald 68*9a19cd78SMatthias Ringwald 69*9a19cd78SMatthias Ringwald /** 70*9a19cd78SMatthias Ringwald * Encoder state and memory 71*9a19cd78SMatthias Ringwald */ 72*9a19cd78SMatthias Ringwald 73*9a19cd78SMatthias Ringwald typedef struct lc3_attdet_analysis { 74*9a19cd78SMatthias Ringwald float en1, an1; 75*9a19cd78SMatthias Ringwald int p_att; 76*9a19cd78SMatthias Ringwald } lc3_attdet_analysis_t; 77*9a19cd78SMatthias Ringwald 78*9a19cd78SMatthias Ringwald struct lc3_ltpf_hp50_state { 79*9a19cd78SMatthias Ringwald float s1, s2; 80*9a19cd78SMatthias Ringwald }; 81*9a19cd78SMatthias Ringwald 82*9a19cd78SMatthias Ringwald typedef struct lc3_ltpf_analysis { 83*9a19cd78SMatthias Ringwald bool active; 84*9a19cd78SMatthias Ringwald int pitch; 85*9a19cd78SMatthias Ringwald float nc[2]; 86*9a19cd78SMatthias Ringwald 87*9a19cd78SMatthias Ringwald struct lc3_ltpf_hp50_state hp50; 88*9a19cd78SMatthias Ringwald float x_12k8[384]; 89*9a19cd78SMatthias Ringwald float x_6k4[178]; 90*9a19cd78SMatthias Ringwald int tc; 91*9a19cd78SMatthias Ringwald } lc3_ltpf_analysis_t; 92*9a19cd78SMatthias Ringwald 93*9a19cd78SMatthias Ringwald typedef struct lc3_spec_analysis { 94*9a19cd78SMatthias Ringwald float nbits_off; 95*9a19cd78SMatthias Ringwald int nbits_spare; 96*9a19cd78SMatthias Ringwald } lc3_spec_analysis_t; 97*9a19cd78SMatthias Ringwald 98*9a19cd78SMatthias Ringwald struct lc3_encoder { 99*9a19cd78SMatthias Ringwald enum lc3_dt dt; 100*9a19cd78SMatthias Ringwald enum lc3_srate sr, sr_pcm; 101*9a19cd78SMatthias Ringwald 102*9a19cd78SMatthias Ringwald lc3_attdet_analysis_t attdet; 103*9a19cd78SMatthias Ringwald lc3_ltpf_analysis_t ltpf; 104*9a19cd78SMatthias Ringwald lc3_spec_analysis_t spec; 105*9a19cd78SMatthias Ringwald 106*9a19cd78SMatthias Ringwald float *xs, *xf, s[0]; 107*9a19cd78SMatthias Ringwald }; 108*9a19cd78SMatthias Ringwald 109*9a19cd78SMatthias Ringwald #define LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) \ 110*9a19cd78SMatthias Ringwald ( 2*__LC3_NS(dt_us, sr_hz) + __LC3_ND(dt_us, sr_hz) ) 111*9a19cd78SMatthias Ringwald 112*9a19cd78SMatthias Ringwald #define LC3_ENCODER_MEM_T(dt_us, sr_hz) \ 113*9a19cd78SMatthias Ringwald struct { \ 114*9a19cd78SMatthias Ringwald struct lc3_encoder __e; \ 115*9a19cd78SMatthias Ringwald float __s[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)]; \ 116*9a19cd78SMatthias Ringwald } 117*9a19cd78SMatthias Ringwald 118*9a19cd78SMatthias Ringwald 119*9a19cd78SMatthias Ringwald /** 120*9a19cd78SMatthias Ringwald * Decoder state and memory 121*9a19cd78SMatthias Ringwald */ 122*9a19cd78SMatthias Ringwald 123*9a19cd78SMatthias Ringwald typedef struct lc3_ltpf_synthesis { 124*9a19cd78SMatthias Ringwald bool active; 125*9a19cd78SMatthias Ringwald int pitch; 126*9a19cd78SMatthias Ringwald float c[12][2], x[12]; 127*9a19cd78SMatthias Ringwald } lc3_ltpf_synthesis_t; 128*9a19cd78SMatthias Ringwald 129*9a19cd78SMatthias Ringwald typedef struct lc3_plc_state { 130*9a19cd78SMatthias Ringwald uint16_t seed; 131*9a19cd78SMatthias Ringwald int count; 132*9a19cd78SMatthias Ringwald float alpha; 133*9a19cd78SMatthias Ringwald } lc3_plc_state_t; 134*9a19cd78SMatthias Ringwald 135*9a19cd78SMatthias Ringwald struct lc3_decoder { 136*9a19cd78SMatthias Ringwald enum lc3_dt dt; 137*9a19cd78SMatthias Ringwald enum lc3_srate sr, sr_pcm; 138*9a19cd78SMatthias Ringwald 139*9a19cd78SMatthias Ringwald lc3_ltpf_synthesis_t ltpf; 140*9a19cd78SMatthias Ringwald lc3_plc_state_t plc; 141*9a19cd78SMatthias Ringwald 142*9a19cd78SMatthias Ringwald float *xs, *xd, *xg, s[0]; 143*9a19cd78SMatthias Ringwald }; 144*9a19cd78SMatthias Ringwald 145*9a19cd78SMatthias Ringwald #define LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) \ 146*9a19cd78SMatthias Ringwald ( __LC3_NH(sr_hz) + __LC3_NS(dt_us, sr_hz) + \ 147*9a19cd78SMatthias Ringwald __LC3_ND(dt_us, sr_hz) + __LC3_NS(dt_us, sr_hz) ) 148*9a19cd78SMatthias Ringwald 149*9a19cd78SMatthias Ringwald #define LC3_DECODER_MEM_T(dt_us, sr_hz) \ 150*9a19cd78SMatthias Ringwald struct { \ 151*9a19cd78SMatthias Ringwald struct lc3_decoder __d; \ 152*9a19cd78SMatthias Ringwald float __s[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)]; \ 153*9a19cd78SMatthias Ringwald } 154*9a19cd78SMatthias Ringwald 155*9a19cd78SMatthias Ringwald 156*9a19cd78SMatthias Ringwald #endif /* __LC3_PRIVATE_H */ 157