163 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			C
		
	
	
	
/******************************************************************************
 | 
						|
 *
 | 
						|
 *  Copyright 2022 Google LLC
 | 
						|
 *
 | 
						|
 *  Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 *  you may not use this file except in compliance with the License.
 | 
						|
 *  You may obtain a copy of the License at:
 | 
						|
 *
 | 
						|
 *  http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 *  Unless required by applicable law or agreed to in writing, software
 | 
						|
 *  distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 *  See the License for the specific language governing permissions and
 | 
						|
 *  limitations under the License.
 | 
						|
 *
 | 
						|
 ******************************************************************************/
 | 
						|
 | 
						|
#ifndef __LC3_PRIVATE_H
 | 
						|
#define __LC3_PRIVATE_H
 | 
						|
 | 
						|
#include <stdint.h>
 | 
						|
#include <stdbool.h>
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Return number of samples, delayed samples and
 | 
						|
 * encoded spectrum coefficients within a frame
 | 
						|
 * - For encoding, keep 1.25 ms of temporal winodw
 | 
						|
 * - For decoding, keep 18 ms of history, aligned on frames, and a frame
 | 
						|
 */
 | 
						|
 | 
						|
#define __LC3_NS(dt_us, sr_hz) \
 | 
						|
    ( (dt_us * sr_hz) / 1000 / 1000 )
 | 
						|
 | 
						|
#define __LC3_ND(dt_us, sr_hz) \
 | 
						|
    ( (dt_us) == 7500 ? 23 * __LC3_NS(dt_us, sr_hz) / 30 \
 | 
						|
                      :  5 * __LC3_NS(dt_us, sr_hz) /  8 )
 | 
						|
 | 
						|
#define __LC3_NT(sr_hz) \
 | 
						|
    ( (5 * sr_hz) / 4000 )
 | 
						|
 | 
						|
#define __LC3_NH(dt_us, sr_hz) \
 | 
						|
    ( ((3 - ((dt_us) >= 10000)) + 1) * __LC3_NS(dt_us, sr_hz) )
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Frame duration 7.5ms or 10ms
 | 
						|
 */
 | 
						|
 | 
						|
enum lc3_dt {
 | 
						|
    LC3_DT_7M5,
 | 
						|
    LC3_DT_10M,
 | 
						|
 | 
						|
    LC3_NUM_DT
 | 
						|
};
 | 
						|
 | 
						|
/**
 | 
						|
 * Sampling frequency
 | 
						|
 */
 | 
						|
 | 
						|
enum lc3_srate {
 | 
						|
    LC3_SRATE_8K,
 | 
						|
    LC3_SRATE_16K,
 | 
						|
    LC3_SRATE_24K,
 | 
						|
    LC3_SRATE_32K,
 | 
						|
    LC3_SRATE_48K,
 | 
						|
 | 
						|
    LC3_NUM_SRATE,
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Encoder state and memory
 | 
						|
 */
 | 
						|
 | 
						|
typedef struct lc3_attdet_analysis {
 | 
						|
    int32_t en1, an1;
 | 
						|
    int p_att;
 | 
						|
} lc3_attdet_analysis_t;
 | 
						|
 | 
						|
struct lc3_ltpf_hp50_state {
 | 
						|
    int64_t s1, s2;
 | 
						|
};
 | 
						|
 | 
						|
typedef struct lc3_ltpf_analysis {
 | 
						|
    bool active;
 | 
						|
    int pitch;
 | 
						|
    float nc[2];
 | 
						|
 | 
						|
    struct lc3_ltpf_hp50_state hp50;
 | 
						|
    int16_t x_12k8[384];
 | 
						|
    int16_t x_6k4[178];
 | 
						|
    int tc;
 | 
						|
} lc3_ltpf_analysis_t;
 | 
						|
 | 
						|
typedef struct lc3_spec_analysis {
 | 
						|
    float nbits_off;
 | 
						|
    int nbits_spare;
 | 
						|
} lc3_spec_analysis_t;
 | 
						|
 | 
						|
struct lc3_encoder {
 | 
						|
    enum lc3_dt dt;
 | 
						|
    enum lc3_srate sr, sr_pcm;
 | 
						|
 | 
						|
    lc3_attdet_analysis_t attdet;
 | 
						|
    lc3_ltpf_analysis_t ltpf;
 | 
						|
    lc3_spec_analysis_t spec;
 | 
						|
 | 
						|
    int16_t *xt;
 | 
						|
    float *xs, *xd, s[0];
 | 
						|
};
 | 
						|
 | 
						|
#define LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz) \
 | 
						|
    ( ( __LC3_NS(dt_us, sr_hz) + __LC3_NT(sr_hz) ) / 2 + \
 | 
						|
        __LC3_NS(dt_us, sr_hz) + __LC3_ND(dt_us, sr_hz) )
 | 
						|
 | 
						|
#define LC3_ENCODER_MEM_T(dt_us, sr_hz) \
 | 
						|
    struct { \
 | 
						|
        struct lc3_encoder __e; \
 | 
						|
        float __s[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)]; \
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
/**
 | 
						|
 * Decoder state and memory
 | 
						|
 */
 | 
						|
 | 
						|
typedef struct lc3_ltpf_synthesis {
 | 
						|
    bool active;
 | 
						|
    int pitch;
 | 
						|
    float c[2*12], x[12];
 | 
						|
} lc3_ltpf_synthesis_t;
 | 
						|
 | 
						|
typedef struct lc3_plc_state {
 | 
						|
    uint16_t seed;
 | 
						|
    int count;
 | 
						|
    float alpha;
 | 
						|
} lc3_plc_state_t;
 | 
						|
 | 
						|
struct lc3_decoder {
 | 
						|
    enum lc3_dt dt;
 | 
						|
    enum lc3_srate sr, sr_pcm;
 | 
						|
 | 
						|
    lc3_ltpf_synthesis_t ltpf;
 | 
						|
    lc3_plc_state_t plc;
 | 
						|
 | 
						|
    float *xh, *xs, *xd, *xg, s[0];
 | 
						|
};
 | 
						|
 | 
						|
#define LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) \
 | 
						|
    ( __LC3_NH(dt_us, sr_hz) + __LC3_ND(dt_us, sr_hz) + \
 | 
						|
      __LC3_NS(dt_us, sr_hz) )
 | 
						|
 | 
						|
#define LC3_DECODER_MEM_T(dt_us, sr_hz) \
 | 
						|
    struct { \
 | 
						|
        struct lc3_decoder __d; \
 | 
						|
        float __s[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)]; \
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
#endif /* __LC3_PRIVATE_H */
 |