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 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];
163 .fc_indexes_bits = 13,
172 .fc_indexes_bits = 9,
180 return 31821 * value + 13849;
193 int16_t ma_predictor,
194 int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
197 static const uint8_t min_distance[2]={10, 5};
198 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
200 for (i = 0; i < 5; i++) {
202 quantizer_output[i + 5] =
cb_lsp_1st[vq_1st][i + 5] + cb_lsp_2nd[vq_2nd_high][i + 5];
205 for (j = 0; j < 2; j++) {
206 for (i = 1; i < 10; i++) {
207 int diff = (quantizer_output[i - 1] - quantizer_output[i] + min_distance[j]) >> 1;
209 quantizer_output[i - 1] -=
diff;
210 quantizer_output[i ] +=
diff;
215 for (i = 0; i < 10; i++) {
217 for (j = 0; j <
MA_NP; j++)
218 sum += past_quantizer_outputs[j][i] *
cb_ma_predictor[ma_predictor][j][i];
234 int16_t* past_quantizer_outputs[
MA_NP + 1],
235 int ma_predictor_prev)
237 int16_t* quantizer_output = past_quantizer_outputs[
MA_NP];
240 for (i = 0; i < 10; i++) {
241 int tmp = lsfq[i] << 15;
243 for (k = 0; k <
MA_NP; k++)
244 tmp -= past_quantizer_outputs[k][i] *
cb_ma_predictor[ma_predictor_prev][k][i];
261 const int16_t* fc_cur,
271 for(i=0; i<subframe_size; i++)
274 out[i] -= (gain_code * fc_cur[i] + 0x2000) >> 14;
275 out[i] += (gain_code * fc_new[i] + 0x2000) >> 14;
288 if((past_gain_code[0] >> 1) > past_gain_code[1])
291 return FFMAX(past_onset-1, 0);
304 int i, low_gain_pitch_cnt, voice_decision;
306 if(past_gain_pitch[0] >= 14745)
308 else if (past_gain_pitch[0] <= 9830)
313 for(i=0, low_gain_pitch_cnt=0; i<6; i++)
314 if(past_gain_pitch[i] < 9830)
315 low_gain_pitch_cnt++;
317 if(low_gain_pitch_cnt > 2 && !onset)
320 if(!onset && voice_decision > prev_voice_decision + 1)
326 return voice_decision;
334 res += *v1++ * *v2++;
355 for (k = 0; k <
MA_NP + 1; k++) {
357 for (i = 1; i < 11; i++)
363 memcpy(ctx->
lsp[0],
lsp_init, 10 *
sizeof(int16_t));
386 int buf_size = avpkt->
size;
402 int pitch_delay_int[2];
407 int gain_before, gain_after;
414 out_frame = (int16_t*) frame->
data[0];
416 if (buf_size % 10 == 0) {
423 }
else if (buf_size == 8) {
432 for (i=0; i < buf_size; i++)
433 frame_erasure |= buf[i];
449 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
455 MA_NP *
sizeof(int16_t*));
464 for (i = 0; i < 2; i++) {
465 int gain_corr_factor;
499 pitch_delay_int[i] = (pitch_delay_3x + 1) / 3;
515 switch (packet_type) {
519 fc_indexes, pulses_signs, 3, 3);
524 fc_indexes, pulses_signs, 1, 4);
537 fc + pitch_delay_int[i],
541 SUBFRAME_SIZE - pitch_delay_int[i]);
550 gain_corr_factor = 0;
556 cb_gain_2nd_6k4[gc_2nd_index][1];
561 gain_corr_factor =
FFMAX(gain_corr_factor, 1024);
562 #ifndef G729_BITEXACT 563 gain_corr_factor >>= 1;
569 cb_gain_2nd_8k[gc_2nd_index][1];
589 gain_corr_factor >>= 1;
598 ctx->
exc + i * SUBFRAME_SIZE - pitch_delay_3x / 3,
600 (pitch_delay_3x % 3) << 1,
604 ctx->
exc + i * SUBFRAME_SIZE, fc,
607 1 << 13, 14, SUBFRAME_SIZE);
614 ctx->
exc + i * SUBFRAME_SIZE,
646 ctx->
exc + i * SUBFRAME_SIZE,
654 memcpy(ctx->
syn_filter_data, synth+SUBFRAME_SIZE, 10 *
sizeof(int16_t));
659 gain_before +=
FFABS(synth[j+10]);
677 gain_after +=
FFABS(synth[j+10]);
691 memcpy(synth+8, ctx->
hpf_z, 2*
sizeof(int16_t));
693 out_frame + i*SUBFRAME_SIZE,
697 memcpy(ctx->
hpf_z, synth+8+SUBFRAME_SIZE, 2*
sizeof(int16_t));
uint16_t rand_value
random number generator value (4.4.4)
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_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).
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
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 char * format[]
#define LSFQ_MIN
minimum quantized LSF value (3.2.4) 0.005 in Q13
This structure describes decoded (raw) audio or video data.
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)
void ff_acelp_lsf2lsp(int16_t *lsp, const int16_t *lsf, int lp_order)
Convert LSF to LSP.
int16_t res_filter_data[SUBFRAME_SIZE+10]
previous speech data for residual calculation filter
#define GC_2ND_IDX_BITS_8K
gain codebook (second stage) index, 8k mode (size in bits)
static const uint16_t ma_prediction_coeff[4]
MA prediction coefficients (3.9.1 of G.729, near Equation 69)
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
static av_cold int init(AVCodecContext *avctx)
const int16_t ff_acelp_interp_filter[61]
low-pass Finite Impulse Response filter coefficients.
#define MR_ENERGY
MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7...
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.
int hpf_f[2]
(14.14) high-pass filter data (past input)
const uint8_t ff_fc_2pulses_9bits_track1_gray[16]
int ff_acelp_decode_4bit_to_2nd_delay3(int ac_index, int pitch_delay_min)
Decode pitch delay with 1/3 precision.
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
Convenience header that includes libavutil's core.
static const G729FormatDescription format_g729_8k
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.
int16_t lsp_buf[2][10]
(0.15) LSP coefficients (previous and current frames) (3.2.5)
#define LSFQ_DIFF_MIN
minimum LSF distance (3.2.4) 0.0391 in Q13
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
int16_t past_quantizer_output_buf[MA_NP+1][10]
(2.13) LSP quantizer outputs
static int32_t scalarproduct_int16_c(const int16_t *v1, const int16_t *v2, int order)
int16_t * exc
start of past excitation data in buffer
enum AVSampleFormat sample_fmt
audio sample format
const uint8_t ff_fc_4pulses_8bits_track_4[32]
Track|Pulse| Positions 4 | 3 | 3, 8, 13, 18, 23, 28, 33, 38, 43, 48, 53, 58, 63, 68, 73, 78 | | 4, 9, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64, 69, 74, 79
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.
av_cold void ff_audiodsp_init(AudioDSPContext *c)
int16_t onset
detected onset level (0-2)
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.
int16_t past_gain_code[2]
(14.1) gain code from current and previous subframe
bitstream reader API header.
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.
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)
int16_t * past_quantizer_outputs[MA_NP+1]
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).
int16_t hpf_z[2]
high-pass filter data (past output)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int16_t ht_prev_data
previous data for 4.2.3, equation 86
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
int16_t lsfq[10]
(2.13) quantized LSF coefficients from previous frame
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define DECISION_INTERMEDIATE
const char * name
Name of the codec implementation.
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.6.2 of G.729 and 6.1.5 of AMR).
static av_cold int decoder_init(AVCodecContext *avctx)
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)
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...
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 uint16_t fc[]
#define GC_2ND_IDX_BITS_6K4
gain codebook (second stage) index, 6.4k mode (size in bits)
int16_t residual[SUBFRAME_SIZE+RES_PREV_DATA_SIZE]
residual signal buffer (used in long-term postfilter)
int pitch_delay_int_prev
integer part of previous subframe's pitch delay (4.1.3)
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
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.
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.2.5 and 3.2.6 of G.729)
static const int16_t cb_ma_predictor_sum_inv[2][10]
12 ...
int ma_predictor_prev
switched MA predictor of LSP quantizer from last good frame
int16_t * lsp[2]
pointers to lsp_buf
int frame_size
Number of samples per channel in an audio frame.
#define SHARP_MIN
minimum gain pitch value (3.8, Equation 47) 0.2 in (1.14)
Libavcodec external API header.
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.
static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
int32_t(* scalarproduct_int16)(const int16_t *v1, const int16_t *v2, int len)
Calculate scalar product of two vectors.
int16_t past_gain_pitch[6]
(1.14) pitch gain of current and five previous subframes
main external API structure.
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
int16_t quant_energy[4]
(5.10) past quantized energy
static unsigned int get_bits1(GetBitContext *s)
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)\", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
const uint8_t ff_fc_4pulses_8bits_tracks_13[16]
Track|Pulse| Positions 1 | 0 | 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75 2 | 1 | 1, 6, 11, 16, 21, 26, 31, 36, 41, 46, 51, 56, 61, 66, 71, 76 3 | 2 | 2, 7, 12, 17, 22, 27, 32, 37, 42, 47, 52, 57, 62, 67, 72, 77
#define AV_CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define INTERPOL_LEN
interpolation filter length
int16_t was_periodic
whether previous frame was declared as periodic or not (4.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 MA_NP
Moving Average (MA) prediction order.
const uint8_t ff_fc_2pulses_9bits_track2_gray[32]
Track|Pulse| Positions 2 | 1 | 0, 7, 14, 20, 27, 34, 1, 21 | | 2, 9, 15, 22, 29, 35, 6, 26 | | 4,10, 17, 24, 30, 37, 11, 31 | | 5,12, 19, 25, 32, 39, 16, 36
#define LSFQ_MAX
maximum quantized LSF value (3.2.4) 3.135 in Q13
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
#define SHARP_MAX
maximum gain pitch value (3.8, Equation 47) (EE) This does not comply with the specification.
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.
#define VQ_2ND_BITS
second stage vector of quantizer (size in bits)
#define GC_1ST_IDX_BITS_8K
gain codebook (first stage) index, 8k mode (size in bits)
common internal api header.
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)
int16_t syn_filter_data[10]
previous speech data for LP synthesis filter
static int g729d_onset_decision(int past_onset, const int16_t *past_gain_code)
Makes decision about onset in current subframe.
int16_t exc_base[2 *SUBFRAME_SIZE+PITCH_DELAY_MAX+INTERPOL_LEN]
past excitation signal buffer
#define VQ_1ST_BITS
first stage vector of quantizer (size in bits)
#define GC_1ST_IDX_BITS_6K4
gain codebook (first stage) index, 6.4k mode (size in bits)
static av_always_inline int diff(const uint32_t a, const uint32_t b)
int channels
number of audio channels
static const int16_t cb_ma_predictor_sum[2][10]
15 3 cb_ma_predictor_sum[j][i] = floor( 2 * (1...
static void frame_erasure(EVRCContext *e, float *samples)
static uint16_t g729_prng(uint16_t value)
pseudo random number generator
#define RES_PREV_DATA_SIZE
Amount of past residual signal data stored in buffer.
int16_t voice_decision
voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D
static const G729FormatDescription format_g729d_6k4
int16_t pos_filter_data[SUBFRAME_SIZE+10]
previous speech data for short-term postfilter
static const int16_t lsp_init[10]
initial LSP coefficients belongs to virtual frame preceding the first frame of the stream ...
int gain_coeff
(1.14) gain coefficient (4.2.4)
#define FFSWAP(type, a, b)
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 cb_lsp_1st[1<< VQ_1ST_BITS][10]
first stage LSP codebook (10-dimensional, with 128 entries (3.24 of G.729)
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
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 const int16_t phase_filter[3][40]
additional "phase" post-processing filter impulse response (D.6.2 of G.729)