mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-01-01 00:28:18 +00:00
188 lines
4.0 KiB
C
188 lines
4.0 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>
|
|
|
|
|
|
/**
|
|
* Characteristics
|
|
*
|
|
* - The number of samples within a frame
|
|
*
|
|
* - The number of MDCT delayed samples, sum of half a frame and
|
|
* an ovelap of future by 1.25 ms (2.5ms, 5ms and 10ms frame durations)
|
|
* or 2 ms (7.5ms frame duration).
|
|
*
|
|
* - For decoding, keep 18 ms of history, aligned on a frame
|
|
*
|
|
* - For encoding, keep 1.25 ms of temporal previous samples
|
|
*/
|
|
|
|
#define LC3_NS(dt_us, sr_hz) \
|
|
( (dt_us) * (sr_hz) / 1000 / 1000 )
|
|
|
|
#define LC3_ND(dt_us, sr_hz) \
|
|
( LC3_NS(dt_us, sr_hz) / 2 + \
|
|
LC3_NS((dt_us) == 7500 ? 2000 : 1250, sr_hz) )
|
|
|
|
#define LC3_NH(dt_us, sr_hz) \
|
|
( (sr_hz) > 48000 ? 0 : ( LC3_NS(18000, sr_hz) + \
|
|
LC3_NS(dt_us, sr_hz) - (LC3_NS(18000, sr_hz) % LC3_NS(dt_us, sr_hz)) ) )
|
|
|
|
#define LC3_NT(sr_hz) \
|
|
( LC3_NS(1250, sr_hz) )
|
|
|
|
|
|
/**
|
|
* Frame duration
|
|
*/
|
|
|
|
enum lc3_dt {
|
|
LC3_DT_2M5 = 0,
|
|
LC3_DT_5M = 1,
|
|
LC3_DT_7M5 = 2,
|
|
LC3_DT_10M = 3,
|
|
|
|
LC3_NUM_DT
|
|
};
|
|
|
|
|
|
/**
|
|
* Sampling frequency and high-resolution mode
|
|
*/
|
|
|
|
enum lc3_srate {
|
|
LC3_SRATE_8K,
|
|
LC3_SRATE_16K,
|
|
LC3_SRATE_24K,
|
|
LC3_SRATE_32K,
|
|
LC3_SRATE_48K,
|
|
LC3_SRATE_48K_HR,
|
|
LC3_SRATE_96K_HR,
|
|
|
|
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;
|
|
|
|
int xt_off, xs_off, xd_off;
|
|
float x[1];
|
|
};
|
|
|
|
#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 __x[LC3_ENCODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \
|
|
}
|
|
|
|
|
|
/**
|
|
* 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;
|
|
|
|
int xh_off, xs_off, xd_off, xg_off;
|
|
float x[1];
|
|
};
|
|
|
|
#define LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz) \
|
|
( LC3_NH(dt_us, sr_hz) + LC3_NS(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 __x[LC3_DECODER_BUFFER_COUNT(dt_us, sr_hz)-1]; \
|
|
}
|
|
|
|
|
|
/**
|
|
* Change the visibility of interface functions
|
|
*/
|
|
|
|
#ifdef _WIN32
|
|
#define LC3_EXPORT __declspec(dllexport)
|
|
#else
|
|
#define LC3_EXPORT __attribute__((visibility ("default")))
|
|
#endif
|
|
|
|
|
|
#endif /* __LC3_PRIVATE_H */
|