59#define LSFQ_DIFF_MIN 321
62#define INTERPOL_LEN 11
77#define SHARP_MAX 13017
82#define MR_ENERGY 1018156
84#define DECISION_NOISE 0
85#define DECISION_INTERMEDIATE 1
86#define DECISION_VOICE 2
164 .ac_index_bits = {8,5},
169 .fc_indexes_bits = 13,
174 .ac_index_bits = {8,4},
179 .fc_indexes_bits = 9,
188 return 31821 *
value + 13849;
201 int16_t ma_predictor,
202 int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
205 static const uint8_t min_distance[2]={10, 5};
206 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
208 for (
i = 0;
i < 5;
i++) {
213 for (j = 0; j < 2; j++) {
214 for (
i = 1;
i < 10;
i++) {
215 int diff = (quantizer_output[
i - 1] - quantizer_output[
i] + min_distance[j]) >> 1;
217 quantizer_output[
i - 1] -=
diff;
218 quantizer_output[
i ] +=
diff;
223 for (
i = 0;
i < 10;
i++) {
225 for (j = 0; j <
MA_NP; j++)
242 int16_t* past_quantizer_outputs[
MA_NP + 1],
243 int ma_predictor_prev)
245 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
248 for (
i = 0;
i < 10;
i++) {
249 int tmp = lsfq[
i] << 15;
251 for (k = 0; k <
MA_NP; k++)
269 const int16_t* fc_cur,
279 for (
i = 0;
i < subframe_size;
i++) {
281 out[
i] -= (gain_code * fc_cur[
i] + 0x2000) >> 14;
282 out[
i] += (gain_code * fc_new[
i] + 0x2000) >> 14;
295 if ((past_gain_code[0] >> 1) > past_gain_code[1])
298 return FFMAX(past_onset-1, 0);
311 int i, low_gain_pitch_cnt, voice_decision;
313 if (past_gain_pitch[0] >= 14745) {
315 }
else if (past_gain_pitch[0] <= 9830) {
321 for (
i = 0, low_gain_pitch_cnt = 0;
i < 6;
i++)
322 if (past_gain_pitch[
i] < 9830)
323 low_gain_pitch_cnt++;
325 if (low_gain_pitch_cnt > 2 && !onset)
328 if (!onset && voice_decision > prev_voice_decision + 1)
334 return voice_decision;
342 res += *v1++ * *v2++;
344 if (res > INT32_MAX)
return INT32_MAX;
345 else if (res < INT32_MIN)
return INT32_MIN;
372 ctx->gain_coeff = 16384;
374 for (k = 0; k <
MA_NP + 1; k++) {
375 ctx->past_quantizer_outputs[k] =
ctx->past_quantizer_output_buf[k];
376 for (
i = 1;
i < 11;
i++)
377 ctx->past_quantizer_outputs[k][
i - 1] = (18717 *
i) >> 3;
380 ctx->lsp[0] =
ctx->lsp_buf[0];
381 ctx->lsp[1] =
ctx->lsp_buf[1];
382 memcpy(
ctx->lsp[0],
lsp_init, 10 *
sizeof(int16_t));
389 ctx->rand_value = 21845;
392 for (
i = 0;
i < 4;
i++)
393 ctx->quant_energy[
i] = -14336;
405 int *got_frame_ptr,
AVPacket *avpkt)
407 const uint8_t *buf = avpkt->
data;
408 int buf_size = avpkt->
size;
419 uint8_t ma_predictor;
420 uint8_t quantizer_1st;
421 uint8_t quantizer_2nd_lo;
422 uint8_t quantizer_2nd_hi;
424 int pitch_delay_int[2];
429 int gain_before, gain_after;
455 out_frame = (int16_t*)
frame->data[
c];
475 ctx->ma_predictor_prev);
479 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
480 ctx->ma_predictor_prev = ma_predictor;
484 memmove(
ctx->past_quantizer_outputs + 1,
ctx->past_quantizer_outputs,
485 MA_NP *
sizeof(int16_t*));
486 ctx->past_quantizer_outputs[0] =
tmp;
494 for (
i = 0;
i < 2;
i++) {
495 int gain_corr_factor;
498 uint8_t pulses_signs;
500 uint8_t gc_1st_index;
501 uint8_t gc_2nd_index;
512 pitch_delay_3x = 3 *
ctx->pitch_delay_int_prev;
515 pitch_delay_3x = 3 *
ctx->pitch_delay_int_prev;
520 int pitch_delay_min =
av_clip(
ctx->pitch_delay_int_prev - 5,
531 pitch_delay_int[
i] = (pitch_delay_3x + 1) / 3;
542 pulses_signs =
ctx->rand_value;
547 switch (packet_type) {
551 fc_indexes, pulses_signs, 3, 3);
556 fc_indexes, pulses_signs, 1, 4);
570 fc + pitch_delay_int[
i],
576 memmove(
ctx->past_gain_pitch+1,
ctx->past_gain_pitch, 5 *
sizeof(int16_t));
577 ctx->past_gain_code[1] =
ctx->past_gain_code[0];
580 ctx->past_gain_pitch[0] = (29491 *
ctx->past_gain_pitch[0]) >> 15;
581 ctx->past_gain_code[0] = ( 2007 *
ctx->past_gain_code[0] ) >> 11;
583 gain_corr_factor = 0;
594 gain_corr_factor =
FFMAX(gain_corr_factor, 1024);
595 #ifndef G729_BITEXACT
596 gain_corr_factor >>= 1;
622 gain_corr_factor >>= 1;
623 ctx->past_gain_code[0] >>= 1;
633 (pitch_delay_3x % 3) << 1,
642 memcpy(synth,
ctx->syn_filter_data, 10 *
sizeof(int16_t));
655 ctx->exc_base[j] >>= 2;
692 gain_before +=
FFABS(synth[j+10]);
702 ctx->res_filter_data,
703 ctx->pos_filter_data,
710 gain_after +=
FFABS(synth[j+10]);
722 ctx->pitch_delay_int_prev = pitch_delay_int[
i];
725 memcpy(synth+8,
ctx->hpf_z, 2*
sizeof(int16_t));
734 ctx->was_periodic = is_periodic;
739 buf +=
format->block_size;
768 .p.name =
"acelp.kelvin",
const int16_t ff_acelp_interp_filter[61]
low-pass Finite Impulse Response filter coefficients.
void ff_acelp_high_pass_filter(int16_t *out, int hpf_f[2], const int16_t *in, int length)
high-pass filtering and upscaling (4.2.5 of G.729).
void ff_acelp_interpolate(int16_t *out, const int16_t *in, const int16_t *filter_coeffs, int precision, int frac_pos, int filter_length, int length)
Generic FIR interpolation routine.
void ff_acelp_update_past_gain(int16_t *quant_energy, int gain_corr_factor, int log2_ma_pred_order, int erasure)
Update past quantized energies.
int16_t ff_acelp_decode_gain_code(AudioDSPContext *adsp, int gain_corr_factor, const int16_t *fc_v, int mr_energy, const int16_t *quant_energy, const int16_t *ma_prediction_coeff, int subframe_size, int ma_pred_order)
Decode the adaptive codebook gain and add correction (4.1.5 and 3.9.1 of G.729).
static int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay with 1/3 precision.
static int ff_acelp_decode_8bit_to_1st_delay3(int ac_index)
Decode pitch delay of the first subframe encoded by 8 bits with 1/3 resolution.
static int ff_acelp_decode_5_6_bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay of the second subframe encoded by 5 or 6 bits with 1/3 precision.
const uint8_t ff_fc_2pulses_9bits_track1_gray[16]
const uint8_t ff_fc_4pulses_8bits_tracks_13[16]
const uint8_t ff_fc_2pulses_9bits_track2_gray[32]
void ff_acelp_fc_pulse_per_track(int16_t *fc_v, const uint8_t *tab1, const uint8_t *tab2, int pulse_indexes, int pulse_signs, int pulse_count, int bits)
Decode fixed-codebook vector (3.8 and D.5.8 of G.729, 5.7.1 of AMR).
const uint8_t ff_fc_4pulses_8bits_track_4[32]
void ff_acelp_weighted_vector_sum(int16_t *out, const int16_t *in_a, const int16_t *in_b, int16_t weight_coeff_a, int16_t weight_coeff_b, int16_t rounder, int shift, int length)
weighted sum of two vectors with rounding.
static const char *const format[]
const FFCodec ff_acelp_kelvin_decoder
const FFCodec ff_g729_decoder
#define SHARP_MAX
Maximum sharpening factor.
Libavcodec external API header.
Convenience header that includes libavutil's core.
#define i(width, name, range_min, range_max)
void ff_celp_convolve_circ(int16_t *fc_out, const int16_t *fc_in, const int16_t *filter, int len)
Circularly convolve fixed vector with a phase dispersion impulse response filter (D....
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, const int16_t *in, int buffer_length, int filter_length, int stop_on_overflow, int shift, int rounder)
LP synthesis filter.
#define FF_CODEC_DECODE_CB(func)
#define CODEC_LONG_NAME(str)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
static const uint16_t fc[]
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int(* init)(AVBSFContext *ctx)
static void frame_erasure(EVRCContext *e, float *samples)
static int decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond)
#define G729_8K_BLOCK_SIZE
#define G729D_6K4_BLOCK_SIZE
static const int16_t cb_gain_2nd_8k[1<< GC_2ND_IDX_BITS_8K][2]
gain codebook (second stage), 8k mode (3.9.2 of G.729)
static const int16_t lsp_init[10]
initial LSP coefficients belongs to virtual frame preceding the first frame of the stream
#define GC_1ST_IDX_BITS_6K4
gain codebook (first stage) index, 6.4k mode (size in bits)
static const int16_t cb_lsp_1st[1<< VQ_1ST_BITS][10]
first stage LSP codebook (10-dimensional, with 128 entries (3.24 of G.729)
static const int16_t cb_gain_1st_6k4[1<< GC_1ST_IDX_BITS_6K4][2]
gain codebook (first stage), 6.4k mode (D.3.9.2 of G.729)
#define GC_1ST_IDX_BITS_8K
gain codebook (first stage) index, 8k mode (size in bits)
static const int16_t cb_ma_predictor[2][MA_NP][10]
4th order Moving Average (MA) Predictor codebook (3.2.4 of G.729)
#define GC_2ND_IDX_BITS_6K4
gain codebook (second stage) index, 6.4k mode (size in bits)
#define VQ_1ST_BITS
first stage vector of quantizer (size in bits)
static const int16_t cb_lsp_2nd[1<< VQ_2ND_BITS][10]
second stage LSP codebook, high and low parts (both 5-dimensional, with 32 entries (3....
static const int16_t cb_ma_predictor_sum_inv[2][10]
static const int16_t cb_ma_predictor_sum[2][10]
static const uint16_t ma_prediction_coeff[4]
MA prediction coefficients (3.9.1 of G.729, near Equation 69)
static const int16_t cb_gain_2nd_6k4[1<< GC_2ND_IDX_BITS_6K4][2]
gain codebook (second stage), 6.4k mode (D.3.9.2 of G.729)
#define MA_NP
Moving Average (MA) prediction order.
static const int16_t cb_gain_1st_8k[1<< GC_1ST_IDX_BITS_8K][2]
gain codebook (first stage), 8k mode (3.9.2 of G.729)
#define VQ_2ND_BITS
second stage vector of quantizer (size in bits)
#define GC_2ND_IDX_BITS_8K
gain codebook (second stage) index, 8k mode (size in bits)
static const int16_t phase_filter[3][40]
additional "phase" post-processing filter impulse response (D.6.2 of G.729)
int16_t ff_g729_adaptive_gain_control(int gain_before, int gain_after, int16_t *speech, int subframe_size, int16_t gain_prev)
Adaptive gain control (4.2.4)
void ff_g729_postfilter(AudioDSPContext *adsp, int16_t *ht_prev_data, int *voicing, const int16_t *lp_filter_coeffs, int pitch_delay_int, int16_t *residual, int16_t *res_filter_data, int16_t *pos_filter_data, int16_t *speech, int subframe_size)
Signal postfiltering (4.2)
#define RES_PREV_DATA_SIZE
Amount of past residual signal data stored in buffer.
bitstream reader API header.
static unsigned int get_bits1(GetBitContext *s)
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
@ AV_CODEC_ID_ACELP_KELVIN
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
static int decode_frame(AVCodecContext *avctx, AVFrame *picture, int *got_frame, AVPacket *avpkt)
static av_cold int decode_close(AVCodecContext *avctx)
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2, int order)
av_cold void ff_audiodsp_init(AudioDSPContext *c)
static void g729d_get_new_exc(int16_t *out, const int16_t *in, const int16_t *fc_cur, int dstate, int gain_code, int subframe_size)
Constructs new excitation signal and applies phase filter to it.
static uint16_t g729_prng(uint16_t value)
pseudo random number generator
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2, int order)
static const G729FormatDescription format_g729_8k
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
static av_cold int decode_close(AVCodecContext *avctx)
static int g729d_onset_decision(int past_onset, const int16_t *past_gain_code)
Makes decision about onset in current subframe.
#define SHARP_MIN
minimum gain pitch value (3.8, Equation 47) 0.2 in (1.14)
#define DECISION_INTERMEDIATE
static void lsf_restore_from_previous(int16_t *lsfq, int16_t *past_quantizer_outputs[MA_NP+1], int ma_predictor_prev)
Restores past LSP quantizer output using LSF from previous frame.
#define MR_ENERGY
MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7....
static const G729FormatDescription format_g729d_6k4
static void lsf_decode(int16_t *lsfq, int16_t *past_quantizer_outputs[MA_NP+1], int16_t ma_predictor, int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
Decodes LSF (Line Spectral Frequencies) from L0-L3 (3.2.4).
static av_cold int decoder_init(AVCodecContext *avctx)
#define LSFQ_MIN
minimum quantized LSF value (3.2.4) 0.005 in Q13
#define INTERPOL_LEN
interpolation filter length
#define LSFQ_DIFF_MIN
minimum LSF distance (3.2.4) 0.0391 in Q13
static int16_t g729d_voice_decision(int onset, int prev_voice_decision, const int16_t *past_gain_pitch)
Makes decision about voice presence in current subframe.
#define LSFQ_MAX
maximum quantized LSF value (3.2.4) 3.135 in Q13
void ff_acelp_lp_decode(int16_t *lp_1st, int16_t *lp_2nd, const int16_t *lsp_2nd, const int16_t *lsp_prev, int lp_order)
Interpolate LSP for the first subframe and convert LSP -> LP for both subframes (3....
void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order)
Convert LSF to LSP.
void ff_acelp_reorder_lsf(int16_t *lsfq, int lsfq_min_distance, int lsfq_min, int lsfq_max, int lp_order)
(I.F) means fixed-point value with F fractional and I integer bits
#define FFSWAP(type, a, b)
Memory handling functions.
int nb_channels
Number of channels in this layout.
main external API structure.
AVChannelLayout ch_layout
Audio channel layout.
enum AVSampleFormat sample_fmt
audio sample format
int frame_size
Number of samples per channel in an audio frame.
This structure describes decoded (raw) audio or video data.
This structure stores compressed data.
int16_t past_quantizer_output_buf[MA_NP+1][10]
(2.13) LSP quantizer outputs
int16_t syn_filter_data[10]
previous speech data for LP synthesis filter
int16_t was_periodic
whether previous frame was declared as periodic or not (4.4)
uint16_t rand_value
random number generator value (4.4.4)
int16_t res_filter_data[SUBFRAME_SIZE+10]
previous speech data for residual calculation filter
int16_t lsfq[10]
(2.13) quantized LSF coefficients from previous frame
int16_t lsp_buf[2][10]
(0.15) LSP coefficients (previous and current frames) (3.2.5)
int16_t ht_prev_data
previous data for 4.2.3, equation 86
int16_t * lsp[2]
pointers to lsp_buf
int gain_coeff
(1.14) gain coefficient (4.2.4)
int16_t voice_decision
voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D
int16_t * exc
start of past excitation data in buffer
int16_t pos_filter_data[SUBFRAME_SIZE+10]
previous speech data for short-term postfilter
int16_t hpf_z[2]
high-pass filter data (past output)
int hpf_f[2]
(14.14) high-pass filter data (past input)
int16_t past_gain_code[2]
(14.1) gain code from current and previous subframe
int pitch_delay_int_prev
integer part of previous subframe's pitch delay (4.1.3)
int16_t * past_quantizer_outputs[MA_NP+1]
int16_t onset
detected onset level (0-2)
int16_t residual[SUBFRAME_SIZE+RES_PREV_DATA_SIZE]
residual signal buffer (used in long-term postfilter)
int16_t exc_base[2 *SUBFRAME_SIZE+PITCH_DELAY_MAX+INTERPOL_LEN]
past excitation signal buffer
int16_t past_gain_pitch[6]
(1.14) pitch gain of current and five previous subframes
int ma_predictor_prev
switched MA predictor of LSP quantizer from last good frame
int16_t quant_energy[4]
(5.10) past quantized energy
G729ChannelContext * channel_context
#define avpriv_request_sample(...)
static AVFormatContext * ctx
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)