Go to the documentation of this file.
53 #define LSFQ_MAX 25681
59 #define LSFQ_DIFF_MIN 321
62 #define INTERPOL_LEN 11
68 #define SHARP_MIN 3277
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
95 uint8_t ac_index_bits[2];
112 int16_t past_quantizer_output_buf[
MA_NP + 1][10];
113 int16_t* past_quantizer_outputs[
MA_NP + 1];
116 int16_t lsp_buf[2][10];
119 int16_t quant_energy[4];
122 int16_t syn_filter_data[10];
135 int16_t past_gain_pitch[6];
138 int16_t past_gain_code[2];
169 .fc_indexes_bits = 13,
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;
766 AV_CODEC_CAP_SUBFRAMES |
772 .
p.
name =
"acelp.kelvin",
782 AV_CODEC_CAP_SUBFRAMES |
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
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.
int(* init)(AVBSFContext *ctx)
#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 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)