52 #define LSFQ_MAX 25681
58 #define LSFQ_DIFF_MIN 321
61 #define INTERPOL_LEN 11
67 #define SHARP_MIN 3277
76 #define SHARP_MAX 13017
81 #define MR_ENERGY 1018156
83 #define DECISION_NOISE 0
84 #define DECISION_INTERMEDIATE 1
85 #define DECISION_VOICE 2
111 int16_t past_quantizer_output_buf[
MA_NP + 1][10];
112 int16_t* past_quantizer_outputs[
MA_NP + 1];
115 int16_t lsp_buf[2][10];
118 int16_t quant_energy[4];
121 int16_t syn_filter_data[10];
134 int16_t past_gain_pitch[6];
137 int16_t past_gain_code[2];
168 .fc_indexes_bits = 13,
178 .fc_indexes_bits = 9,
187 return 31821 *
value + 13849;
200 int16_t ma_predictor,
201 int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
204 static const uint8_t min_distance[2]={10, 5};
205 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
207 for (
i = 0;
i < 5;
i++) {
212 for (j = 0; j < 2; j++) {
213 for (
i = 1;
i < 10;
i++) {
214 int diff = (quantizer_output[
i - 1] - quantizer_output[
i] + min_distance[j]) >> 1;
216 quantizer_output[
i - 1] -=
diff;
217 quantizer_output[
i ] +=
diff;
222 for (
i = 0;
i < 10;
i++) {
224 for (j = 0; j <
MA_NP; j++)
241 int16_t* past_quantizer_outputs[
MA_NP + 1],
242 int ma_predictor_prev)
244 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
247 for (
i = 0;
i < 10;
i++) {
248 int tmp = lsfq[
i] << 15;
250 for (k = 0; k <
MA_NP; k++)
268 const int16_t* fc_cur,
278 for (
i = 0;
i < subframe_size;
i++) {
280 out[
i] -= (gain_code * fc_cur[
i] + 0x2000) >> 14;
281 out[
i] += (gain_code * fc_new[
i] + 0x2000) >> 14;
294 if ((past_gain_code[0] >> 1) > past_gain_code[1])
297 return FFMAX(past_onset-1, 0);
310 int i, low_gain_pitch_cnt, voice_decision;
312 if (past_gain_pitch[0] >= 14745) {
314 }
else if (past_gain_pitch[0] <= 9830) {
320 for (
i = 0, low_gain_pitch_cnt = 0;
i < 6;
i++)
321 if (past_gain_pitch[
i] < 9830)
322 low_gain_pitch_cnt++;
324 if (low_gain_pitch_cnt > 2 && !onset)
327 if (!onset && voice_decision > prev_voice_decision + 1)
333 return voice_decision;
341 res += *v1++ * *v2++;
343 if (res > INT32_MAX)
return INT32_MAX;
344 else if (res < INT32_MIN)
return INT32_MIN;
370 ctx->gain_coeff = 16384;
372 for (k = 0; k <
MA_NP + 1; k++) {
373 ctx->past_quantizer_outputs[k] =
ctx->past_quantizer_output_buf[k];
374 for (
i = 1;
i < 11;
i++)
375 ctx->past_quantizer_outputs[k][
i - 1] = (18717 *
i) >> 3;
378 ctx->lsp[0] =
ctx->lsp_buf[0];
379 ctx->lsp[1] =
ctx->lsp_buf[1];
380 memcpy(
ctx->lsp[0],
lsp_init, 10 *
sizeof(int16_t));
387 ctx->rand_value = 21845;
390 for (
i = 0;
i < 4;
i++)
391 ctx->quant_energy[
i] = -14336;
406 int buf_size = avpkt->
size;
421 int pitch_delay_int[2];
426 int gain_before, gain_after;
455 if (*buf != ((avctx->
channels - 1 -
c) * 0x80 | 2))
473 ctx->ma_predictor_prev);
477 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
478 ctx->ma_predictor_prev = ma_predictor;
482 memmove(
ctx->past_quantizer_outputs + 1,
ctx->past_quantizer_outputs,
483 MA_NP *
sizeof(int16_t*));
484 ctx->past_quantizer_outputs[0] =
tmp;
492 for (
i = 0;
i < 2;
i++) {
493 int gain_corr_factor;
510 pitch_delay_3x = 3 *
ctx->pitch_delay_int_prev;
513 pitch_delay_3x = 3 *
ctx->pitch_delay_int_prev;
518 int pitch_delay_min =
av_clip(
ctx->pitch_delay_int_prev - 5,
529 pitch_delay_int[
i] = (pitch_delay_3x + 1) / 3;
540 pulses_signs =
ctx->rand_value;
545 switch (packet_type) {
549 fc_indexes, pulses_signs, 3, 3);
554 fc_indexes, pulses_signs, 1, 4);
568 fc + pitch_delay_int[
i],
574 memmove(
ctx->past_gain_pitch+1,
ctx->past_gain_pitch, 5 *
sizeof(int16_t));
575 ctx->past_gain_code[1] =
ctx->past_gain_code[0];
578 ctx->past_gain_pitch[0] = (29491 *
ctx->past_gain_pitch[0]) >> 15;
579 ctx->past_gain_code[0] = ( 2007 *
ctx->past_gain_code[0] ) >> 11;
581 gain_corr_factor = 0;
592 gain_corr_factor =
FFMAX(gain_corr_factor, 1024);
593 #ifndef G729_BITEXACT
594 gain_corr_factor >>= 1;
620 gain_corr_factor >>= 1;
621 ctx->past_gain_code[0] >>= 1;
631 (pitch_delay_3x % 3) << 1,
640 memcpy(synth,
ctx->syn_filter_data, 10 *
sizeof(int16_t));
653 ctx->exc_base[j] >>= 2;
690 gain_before +=
FFABS(synth[j+10]);
700 ctx->res_filter_data,
701 ctx->pos_filter_data,
708 gain_after +=
FFABS(synth[j+10]);
720 ctx->pitch_delay_int_prev = pitch_delay_int[
i];
723 memcpy(synth+8,
ctx->hpf_z, 2*
sizeof(int16_t));
732 ctx->was_periodic = is_periodic;
737 buf +=
format->block_size;
766 .
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[]
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
Libavcodec external API header.
static av_cold int init(AVCodecContext *avctx)
Convenience header that includes libavutil's core.
#define fc(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 FFSWAP(type, a, b)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static void frame_erasure(EVRCContext *e, float *samples)
#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.
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time,...
@ 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.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
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 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....
AVCodec ff_acelp_kelvin_decoder
static const G729FormatDescription format_g729d_6k4
#define SHARP_MAX
maximum gain pitch value (3.8, Equation 47) (EE) This does not comply with the specification.
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 int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
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
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
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
main external API structure.
enum AVSampleFormat sample_fmt
audio sample format
int channels
number of audio channels
int frame_size
Number of samples per channel in an audio frame.
const char * name
Name of the codec implementation.
This structure describes decoded (raw) audio or video data.
int nb_samples
number of audio samples (per channel) described by this frame
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
This structure stores compressed data.
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 ht_prev_data
previous data for 4.2.3, equation 86
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
int pitch_delay_int_prev
integer part of previous subframe's pitch delay (4.1.3)
int16_t onset
detected onset level (0-2)
int ma_predictor_prev
switched MA predictor of LSP quantizer from last good frame
G729ChannelContext * channel_context
#define avpriv_request_sample(...)
static av_always_inline int diff(const uint32_t a, const uint32_t b)