Go to the documentation of this file.
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
94 uint8_t ac_index_bits[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;
371 ctx->gain_coeff = 16384;
373 for (k = 0; k <
MA_NP + 1; k++) {
374 ctx->past_quantizer_outputs[k] =
ctx->past_quantizer_output_buf[k];
375 for (
i = 1;
i < 11;
i++)
376 ctx->past_quantizer_outputs[k][
i - 1] = (18717 *
i) >> 3;
379 ctx->lsp[0] =
ctx->lsp_buf[0];
380 ctx->lsp[1] =
ctx->lsp_buf[1];
381 memcpy(
ctx->lsp[0],
lsp_init, 10 *
sizeof(int16_t));
388 ctx->rand_value = 21845;
391 for (
i = 0;
i < 4;
i++)
392 ctx->quant_energy[
i] = -14336;
404 int *got_frame_ptr,
AVPacket *avpkt)
406 const uint8_t *buf = avpkt->
data;
407 int buf_size = avpkt->
size;
418 uint8_t ma_predictor;
419 uint8_t quantizer_1st;
420 uint8_t quantizer_2nd_lo;
421 uint8_t quantizer_2nd_hi;
423 int pitch_delay_int[2];
428 int gain_before, gain_after;
454 out_frame = (int16_t*)
frame->data[
c];
474 ctx->ma_predictor_prev);
478 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
479 ctx->ma_predictor_prev = ma_predictor;
483 memmove(
ctx->past_quantizer_outputs + 1,
ctx->past_quantizer_outputs,
484 MA_NP *
sizeof(int16_t*));
485 ctx->past_quantizer_outputs[0] =
tmp;
493 for (
i = 0;
i < 2;
i++) {
494 int gain_corr_factor;
497 uint8_t pulses_signs;
499 uint8_t gc_1st_index;
500 uint8_t gc_2nd_index;
511 pitch_delay_3x = 3 *
ctx->pitch_delay_int_prev;
514 pitch_delay_3x = 3 *
ctx->pitch_delay_int_prev;
519 int pitch_delay_min =
av_clip(
ctx->pitch_delay_int_prev - 5,
530 pitch_delay_int[
i] = (pitch_delay_3x + 1) / 3;
541 pulses_signs =
ctx->rand_value;
546 switch (packet_type) {
550 fc_indexes, pulses_signs, 3, 3);
555 fc_indexes, pulses_signs, 1, 4);
569 fc + pitch_delay_int[
i],
575 memmove(
ctx->past_gain_pitch+1,
ctx->past_gain_pitch, 5 *
sizeof(int16_t));
576 ctx->past_gain_code[1] =
ctx->past_gain_code[0];
579 ctx->past_gain_pitch[0] = (29491 *
ctx->past_gain_pitch[0]) >> 15;
580 ctx->past_gain_code[0] = ( 2007 *
ctx->past_gain_code[0] ) >> 11;
582 gain_corr_factor = 0;
593 gain_corr_factor =
FFMAX(gain_corr_factor, 1024);
594 #ifndef G729_BITEXACT
595 gain_corr_factor >>= 1;
621 gain_corr_factor >>= 1;
622 ctx->past_gain_code[0] >>= 1;
632 (pitch_delay_3x % 3) << 1,
641 memcpy(synth,
ctx->syn_filter_data, 10 *
sizeof(int16_t));
654 ctx->exc_base[j] >>= 2;
691 gain_before +=
FFABS(synth[j+10]);
701 ctx->res_filter_data,
702 ctx->pos_filter_data,
709 gain_after +=
FFABS(synth[j+10]);
721 ctx->pitch_delay_int_prev = pitch_delay_int[
i];
724 memcpy(synth+8,
ctx->hpf_z, 2*
sizeof(int16_t));
733 ctx->was_periodic = is_periodic;
738 buf +=
format->block_size;
767 .
p.
name =
"acelp.kelvin",
int frame_size
Number of samples per channel in an audio frame.
#define G729_8K_BLOCK_SIZE
#define AV_LOG_WARNING
Something somehow does not look correct.
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)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
static uint16_t g729_prng(uint16_t value)
pseudo random number generator
static const int16_t lsp_init[10]
initial LSP coefficients belongs to virtual frame preceding the first frame of the stream
#define LSFQ_MIN
minimum quantized LSF value (3.2.4) 0.005 in Q13
static const G729FormatDescription format_g729d_6k4
const FFCodec ff_acelp_kelvin_decoder
const int16_t ff_acelp_interp_filter[61]
low-pass Finite Impulse Response filter coefficients.
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).
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.
int16_t was_periodic
whether previous frame was declared as periodic or not (4.4)
This structure describes decoded (raw) audio or video data.
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).
static int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay with 1/3 precision.
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.
av_cold void ff_audiodsp_init(AudioDSPContext *c)
G729ChannelContext * channel_context
#define MR_ENERGY
MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7....
#define fc(width, name, range_min, range_max)
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)
int nb_channels
Number of channels in this layout.
#define MA_NP
Moving Average (MA) prediction order.
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 av_cold int decode_close(AVCodecContext *avctx)
#define LSFQ_DIFF_MIN
minimum LSF distance (3.2.4) 0.0391 in Q13
static const G729FormatDescription format_g729_8k
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.
#define GC_1ST_IDX_BITS_8K
gain codebook (first stage) index, 8k mode (size in bits)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
AVCodec p
The public AVCodec.
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2, int order)
AVChannelLayout ch_layout
Audio channel layout.
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)
int16_t voice_decision
voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D
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.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
static int init_get_bits8(GetBitContext *s, const uint8_t *buffer, int byte_size)
Initialize GetBitContext.
#define FF_CODEC_DECODE_CB(func)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate. The lists are not just lists
#define VQ_2ND_BITS
second stage vector of quantizer (size in bits)
#define RES_PREV_DATA_SIZE
Amount of past residual signal data stored in buffer.
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
int(* init)(AVBSFContext *ctx)
static int decode_frame(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, AVPacket *avpkt)
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const uint8_t ff_fc_2pulses_9bits_track2_gray[32]
static const int16_t cb_ma_predictor_sum[2][10]
#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 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.
static const int16_t cb_ma_predictor_sum_inv[2][10]
#define DECISION_INTERMEDIATE
static unsigned int get_bits1(GetBitContext *s)
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)
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_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....
int16_t * exc
start of past excitation data in buffer
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.
const uint8_t ff_fc_4pulses_8bits_tracks_13[16]
#define GC_2ND_IDX_BITS_8K
gain codebook (second stage) index, 8k mode (size in bits)
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).
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....
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
static const int16_t cb_ma_predictor[2][MA_NP][10]
4th order Moving Average (MA) Predictor codebook (3.2.4 of G.729)
static const uint16_t ma_prediction_coeff[4]
MA prediction coefficients (3.9.1 of G.729, near Equation 69)
@ AV_CODEC_ID_ACELP_KELVIN
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define INTERPOL_LEN
interpolation filter length
enum AVSampleFormat sample_fmt
audio sample format
static av_cold int decoder_init(AVCodecContext *avctx)
static av_always_inline int diff(const struct color_info *a, const struct color_info *b, const int trans_thresh)
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
int16_t ht_prev_data
previous data for 4.2.3, equation 86
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.
uint16_t rand_value
random number generator value (4.4.4)
#define i(width, name, range_min, range_max)
const FFCodec ff_g729_decoder
#define LSFQ_MAX
maximum quantized LSF value (3.2.4) 3.135 in Q13
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
#define VQ_1ST_BITS
first stage vector of quantizer (size in bits)
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
const char * name
Name of the codec implementation.
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 SHARP_MIN
minimum gain pitch value (3.8, Equation 47) 0.2 in (1.14)
#define FFSWAP(type, a, b)
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame For filters that do not use the this method is called when a frame is wanted on an output For a it should directly call filter_frame on the corresponding output For a if there are queued frames already one of these frames should be pushed If the filter should request a frame on one of its repeatedly until at least one frame has been pushed Return or at least make progress towards producing a frame
main external API structure.
const uint8_t ff_fc_2pulses_9bits_track1_gray[16]
static void frame_erasure(EVRCContext *e, float *samples)
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.
int gain_coeff
(1.14) gain coefficient (4.2.4)
static int g729d_onset_decision(int past_onset, const int16_t *past_gain_code)
Makes decision about onset in current subframe.
static const int16_t phase_filter[3][40]
additional "phase" post-processing filter impulse response (D.6.2 of G.729)
int16_t onset
detected onset level (0-2)
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time,...
#define avpriv_request_sample(...)
This structure stores compressed data.
int ma_predictor_prev
switched MA predictor of LSP quantizer from last good frame
void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order)
Convert LSF to LSP.
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).
const uint8_t ff_fc_4pulses_8bits_track_4[32]
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define G729D_6K4_BLOCK_SIZE
#define SHARP_MAX
maximum gain pitch value (3.8, Equation 47) (EE) This does not comply with the specification.
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 GC_2ND_IDX_BITS_6K4
gain codebook (second stage) index, 6.4k mode (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....
#define GC_1ST_IDX_BITS_6K4
gain codebook (first stage) index, 6.4k mode (size in bits)
int pitch_delay_int_prev
integer part of previous subframe's pitch delay (4.1.3)