yading@10: /* yading@10: * G.729, G729 Annex D decoders yading@10: * Copyright (c) 2008 Vladimir Voroshilov yading@10: * yading@10: * This file is part of FFmpeg. yading@10: * yading@10: * FFmpeg is free software; you can redistribute it and/or yading@10: * modify it under the terms of the GNU Lesser General Public yading@10: * License as published by the Free Software Foundation; either yading@10: * version 2.1 of the License, or (at your option) any later version. yading@10: * yading@10: * FFmpeg is distributed in the hope that it will be useful, yading@10: * but WITHOUT ANY WARRANTY; without even the implied warranty of yading@10: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU yading@10: * Lesser General Public License for more details. yading@10: * yading@10: * You should have received a copy of the GNU Lesser General Public yading@10: * License along with FFmpeg; if not, write to the Free Software yading@10: * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA yading@10: */ yading@10: yading@10: #include yading@10: #include yading@10: yading@10: #include "avcodec.h" yading@10: #include "libavutil/avutil.h" yading@10: #include "get_bits.h" yading@10: #include "dsputil.h" yading@10: #include "internal.h" yading@10: yading@10: yading@10: #include "g729.h" yading@10: #include "lsp.h" yading@10: #include "celp_math.h" yading@10: #include "celp_filters.h" yading@10: #include "acelp_filters.h" yading@10: #include "acelp_pitch_delay.h" yading@10: #include "acelp_vectors.h" yading@10: #include "g729data.h" yading@10: #include "g729postfilter.h" yading@10: yading@10: /** yading@10: * minimum quantized LSF value (3.2.4) yading@10: * 0.005 in Q13 yading@10: */ yading@10: #define LSFQ_MIN 40 yading@10: yading@10: /** yading@10: * maximum quantized LSF value (3.2.4) yading@10: * 3.135 in Q13 yading@10: */ yading@10: #define LSFQ_MAX 25681 yading@10: yading@10: /** yading@10: * minimum LSF distance (3.2.4) yading@10: * 0.0391 in Q13 yading@10: */ yading@10: #define LSFQ_DIFF_MIN 321 yading@10: yading@10: /// interpolation filter length yading@10: #define INTERPOL_LEN 11 yading@10: yading@10: /** yading@10: * minimum gain pitch value (3.8, Equation 47) yading@10: * 0.2 in (1.14) yading@10: */ yading@10: #define SHARP_MIN 3277 yading@10: yading@10: /** yading@10: * maximum gain pitch value (3.8, Equation 47) yading@10: * (EE) This does not comply with the specification. yading@10: * Specification says about 0.8, which should be yading@10: * 13107 in (1.14), but reference C code uses yading@10: * 13017 (equals to 0.7945) instead of it. yading@10: */ yading@10: #define SHARP_MAX 13017 yading@10: yading@10: /** yading@10: * MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7.13) yading@10: */ yading@10: #define MR_ENERGY 1018156 yading@10: yading@10: #define DECISION_NOISE 0 yading@10: #define DECISION_INTERMEDIATE 1 yading@10: #define DECISION_VOICE 2 yading@10: yading@10: typedef enum { yading@10: FORMAT_G729_8K = 0, yading@10: FORMAT_G729D_6K4, yading@10: FORMAT_COUNT, yading@10: } G729Formats; yading@10: yading@10: typedef struct { yading@10: uint8_t ac_index_bits[2]; ///< adaptive codebook index for second subframe (size in bits) yading@10: uint8_t parity_bit; ///< parity bit for pitch delay yading@10: uint8_t gc_1st_index_bits; ///< gain codebook (first stage) index (size in bits) yading@10: uint8_t gc_2nd_index_bits; ///< gain codebook (second stage) index (size in bits) yading@10: uint8_t fc_signs_bits; ///< number of pulses in fixed-codebook vector yading@10: uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry yading@10: } G729FormatDescription; yading@10: yading@10: typedef struct { yading@10: DSPContext dsp; yading@10: yading@10: /// past excitation signal buffer yading@10: int16_t exc_base[2*SUBFRAME_SIZE+PITCH_DELAY_MAX+INTERPOL_LEN]; yading@10: yading@10: int16_t* exc; ///< start of past excitation data in buffer yading@10: int pitch_delay_int_prev; ///< integer part of previous subframe's pitch delay (4.1.3) yading@10: yading@10: /// (2.13) LSP quantizer outputs yading@10: int16_t past_quantizer_output_buf[MA_NP + 1][10]; yading@10: int16_t* past_quantizer_outputs[MA_NP + 1]; yading@10: yading@10: int16_t lsfq[10]; ///< (2.13) quantized LSF coefficients from previous frame yading@10: int16_t lsp_buf[2][10]; ///< (0.15) LSP coefficients (previous and current frames) (3.2.5) yading@10: int16_t *lsp[2]; ///< pointers to lsp_buf yading@10: yading@10: int16_t quant_energy[4]; ///< (5.10) past quantized energy yading@10: yading@10: /// previous speech data for LP synthesis filter yading@10: int16_t syn_filter_data[10]; yading@10: yading@10: yading@10: /// residual signal buffer (used in long-term postfilter) yading@10: int16_t residual[SUBFRAME_SIZE + RES_PREV_DATA_SIZE]; yading@10: yading@10: /// previous speech data for residual calculation filter yading@10: int16_t res_filter_data[SUBFRAME_SIZE+10]; yading@10: yading@10: /// previous speech data for short-term postfilter yading@10: int16_t pos_filter_data[SUBFRAME_SIZE+10]; yading@10: yading@10: /// (1.14) pitch gain of current and five previous subframes yading@10: int16_t past_gain_pitch[6]; yading@10: yading@10: /// (14.1) gain code from current and previous subframe yading@10: int16_t past_gain_code[2]; yading@10: yading@10: /// voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D yading@10: int16_t voice_decision; yading@10: yading@10: int16_t onset; ///< detected onset level (0-2) yading@10: int16_t was_periodic; ///< whether previous frame was declared as periodic or not (4.4) yading@10: int16_t ht_prev_data; ///< previous data for 4.2.3, equation 86 yading@10: int gain_coeff; ///< (1.14) gain coefficient (4.2.4) yading@10: uint16_t rand_value; ///< random number generator value (4.4.4) yading@10: int ma_predictor_prev; ///< switched MA predictor of LSP quantizer from last good frame yading@10: yading@10: /// (14.14) high-pass filter data (past input) yading@10: int hpf_f[2]; yading@10: yading@10: /// high-pass filter data (past output) yading@10: int16_t hpf_z[2]; yading@10: } G729Context; yading@10: yading@10: static const G729FormatDescription format_g729_8k = { yading@10: .ac_index_bits = {8,5}, yading@10: .parity_bit = 1, yading@10: .gc_1st_index_bits = GC_1ST_IDX_BITS_8K, yading@10: .gc_2nd_index_bits = GC_2ND_IDX_BITS_8K, yading@10: .fc_signs_bits = 4, yading@10: .fc_indexes_bits = 13, yading@10: }; yading@10: yading@10: static const G729FormatDescription format_g729d_6k4 = { yading@10: .ac_index_bits = {8,4}, yading@10: .parity_bit = 0, yading@10: .gc_1st_index_bits = GC_1ST_IDX_BITS_6K4, yading@10: .gc_2nd_index_bits = GC_2ND_IDX_BITS_6K4, yading@10: .fc_signs_bits = 2, yading@10: .fc_indexes_bits = 9, yading@10: }; yading@10: yading@10: /** yading@10: * @brief pseudo random number generator yading@10: */ yading@10: static inline uint16_t g729_prng(uint16_t value) yading@10: { yading@10: return 31821 * value + 13849; yading@10: } yading@10: yading@10: /** yading@10: * Get parity bit of bit 2..7 yading@10: */ yading@10: static inline int get_parity(uint8_t value) yading@10: { yading@10: return (0x6996966996696996ULL >> (value >> 2)) & 1; yading@10: } yading@10: yading@10: /** yading@10: * Decodes LSF (Line Spectral Frequencies) from L0-L3 (3.2.4). yading@10: * @param[out] lsfq (2.13) quantized LSF coefficients yading@10: * @param[in,out] past_quantizer_outputs (2.13) quantizer outputs from previous frames yading@10: * @param ma_predictor switched MA predictor of LSP quantizer yading@10: * @param vq_1st first stage vector of quantizer yading@10: * @param vq_2nd_low second stage lower vector of LSP quantizer yading@10: * @param vq_2nd_high second stage higher vector of LSP quantizer yading@10: */ yading@10: static void lsf_decode(int16_t* lsfq, int16_t* past_quantizer_outputs[MA_NP + 1], yading@10: int16_t ma_predictor, yading@10: int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high) yading@10: { yading@10: int i,j; yading@10: static const uint8_t min_distance[2]={10, 5}; //(2.13) yading@10: int16_t* quantizer_output = past_quantizer_outputs[MA_NP]; yading@10: yading@10: for (i = 0; i < 5; i++) { yading@10: quantizer_output[i] = cb_lsp_1st[vq_1st][i ] + cb_lsp_2nd[vq_2nd_low ][i ]; yading@10: quantizer_output[i + 5] = cb_lsp_1st[vq_1st][i + 5] + cb_lsp_2nd[vq_2nd_high][i + 5]; yading@10: } yading@10: yading@10: for (j = 0; j < 2; j++) { yading@10: for (i = 1; i < 10; i++) { yading@10: int diff = (quantizer_output[i - 1] - quantizer_output[i] + min_distance[j]) >> 1; yading@10: if (diff > 0) { yading@10: quantizer_output[i - 1] -= diff; yading@10: quantizer_output[i ] += diff; yading@10: } yading@10: } yading@10: } yading@10: yading@10: for (i = 0; i < 10; i++) { yading@10: int sum = quantizer_output[i] * cb_ma_predictor_sum[ma_predictor][i]; yading@10: for (j = 0; j < MA_NP; j++) yading@10: sum += past_quantizer_outputs[j][i] * cb_ma_predictor[ma_predictor][j][i]; yading@10: yading@10: lsfq[i] = sum >> 15; yading@10: } yading@10: yading@10: ff_acelp_reorder_lsf(lsfq, LSFQ_DIFF_MIN, LSFQ_MIN, LSFQ_MAX, 10); yading@10: } yading@10: yading@10: /** yading@10: * Restores past LSP quantizer output using LSF from previous frame yading@10: * @param[in,out] lsfq (2.13) quantized LSF coefficients yading@10: * @param[in,out] past_quantizer_outputs (2.13) quantizer outputs from previous frames yading@10: * @param ma_predictor_prev MA predictor from previous frame yading@10: * @param lsfq_prev (2.13) quantized LSF coefficients from previous frame yading@10: */ yading@10: static void lsf_restore_from_previous(int16_t* lsfq, yading@10: int16_t* past_quantizer_outputs[MA_NP + 1], yading@10: int ma_predictor_prev) yading@10: { yading@10: int16_t* quantizer_output = past_quantizer_outputs[MA_NP]; yading@10: int i,k; yading@10: yading@10: for (i = 0; i < 10; i++) { yading@10: int tmp = lsfq[i] << 15; yading@10: yading@10: for (k = 0; k < MA_NP; k++) yading@10: tmp -= past_quantizer_outputs[k][i] * cb_ma_predictor[ma_predictor_prev][k][i]; yading@10: yading@10: quantizer_output[i] = ((tmp >> 15) * cb_ma_predictor_sum_inv[ma_predictor_prev][i]) >> 12; yading@10: } yading@10: } yading@10: yading@10: /** yading@10: * Constructs new excitation signal and applies phase filter to it yading@10: * @param[out] out constructed speech signal yading@10: * @param in original excitation signal yading@10: * @param fc_cur (2.13) original fixed-codebook vector yading@10: * @param gain_code (14.1) gain code yading@10: * @param subframe_size length of the subframe yading@10: */ yading@10: static void g729d_get_new_exc( yading@10: int16_t* out, yading@10: const int16_t* in, yading@10: const int16_t* fc_cur, yading@10: int dstate, yading@10: int gain_code, yading@10: int subframe_size) yading@10: { yading@10: int i; yading@10: int16_t fc_new[SUBFRAME_SIZE]; yading@10: yading@10: ff_celp_convolve_circ(fc_new, fc_cur, phase_filter[dstate], subframe_size); yading@10: yading@10: for(i=0; i> 14; yading@10: out[i] += (gain_code * fc_new[i] + 0x2000) >> 14; yading@10: } yading@10: } yading@10: yading@10: /** yading@10: * Makes decision about onset in current subframe yading@10: * @param past_onset decision result of previous subframe yading@10: * @param past_gain_code gain code of current and previous subframe yading@10: * yading@10: * @return onset decision result for current subframe yading@10: */ yading@10: static int g729d_onset_decision(int past_onset, const int16_t* past_gain_code) yading@10: { yading@10: if((past_gain_code[0] >> 1) > past_gain_code[1]) yading@10: return 2; yading@10: else yading@10: return FFMAX(past_onset-1, 0); yading@10: } yading@10: yading@10: /** yading@10: * Makes decision about voice presence in current subframe yading@10: * @param onset onset level yading@10: * @param prev_voice_decision voice decision result from previous subframe yading@10: * @param past_gain_pitch pitch gain of current and previous subframes yading@10: * yading@10: * @return voice decision result for current subframe yading@10: */ yading@10: static int16_t g729d_voice_decision(int onset, int prev_voice_decision, const int16_t* past_gain_pitch) yading@10: { yading@10: int i, low_gain_pitch_cnt, voice_decision; yading@10: yading@10: if(past_gain_pitch[0] >= 14745) // 0.9 yading@10: voice_decision = DECISION_VOICE; yading@10: else if (past_gain_pitch[0] <= 9830) // 0.6 yading@10: voice_decision = DECISION_NOISE; yading@10: else yading@10: voice_decision = DECISION_INTERMEDIATE; yading@10: yading@10: for(i=0, low_gain_pitch_cnt=0; i<6; i++) yading@10: if(past_gain_pitch[i] < 9830) yading@10: low_gain_pitch_cnt++; yading@10: yading@10: if(low_gain_pitch_cnt > 2 && !onset) yading@10: voice_decision = DECISION_NOISE; yading@10: yading@10: if(!onset && voice_decision > prev_voice_decision + 1) yading@10: voice_decision--; yading@10: yading@10: if(onset && voice_decision < DECISION_VOICE) yading@10: voice_decision++; yading@10: yading@10: return voice_decision; yading@10: } yading@10: yading@10: static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2, int order) yading@10: { yading@10: int res = 0; yading@10: yading@10: while (order--) yading@10: res += *v1++ * *v2++; yading@10: yading@10: return res; yading@10: } yading@10: yading@10: static av_cold int decoder_init(AVCodecContext * avctx) yading@10: { yading@10: G729Context* ctx = avctx->priv_data; yading@10: int i,k; yading@10: yading@10: if (avctx->channels != 1) { yading@10: av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels); yading@10: return AVERROR(EINVAL); yading@10: } yading@10: avctx->sample_fmt = AV_SAMPLE_FMT_S16; yading@10: yading@10: /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */ yading@10: avctx->frame_size = SUBFRAME_SIZE << 1; yading@10: yading@10: ctx->gain_coeff = 16384; // 1.0 in (1.14) yading@10: yading@10: for (k = 0; k < MA_NP + 1; k++) { yading@10: ctx->past_quantizer_outputs[k] = ctx->past_quantizer_output_buf[k]; yading@10: for (i = 1; i < 11; i++) yading@10: ctx->past_quantizer_outputs[k][i - 1] = (18717 * i) >> 3; yading@10: } yading@10: yading@10: ctx->lsp[0] = ctx->lsp_buf[0]; yading@10: ctx->lsp[1] = ctx->lsp_buf[1]; yading@10: memcpy(ctx->lsp[0], lsp_init, 10 * sizeof(int16_t)); yading@10: yading@10: ctx->exc = &ctx->exc_base[PITCH_DELAY_MAX+INTERPOL_LEN]; yading@10: yading@10: ctx->pitch_delay_int_prev = PITCH_DELAY_MIN; yading@10: yading@10: /* random seed initialization */ yading@10: ctx->rand_value = 21845; yading@10: yading@10: /* quantized prediction error */ yading@10: for(i=0; i<4; i++) yading@10: ctx->quant_energy[i] = -14336; // -14 in (5.10) yading@10: yading@10: ff_dsputil_init(&ctx->dsp, avctx); yading@10: ctx->dsp.scalarproduct_int16 = scalarproduct_int16_c; yading@10: yading@10: return 0; yading@10: } yading@10: yading@10: static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, yading@10: AVPacket *avpkt) yading@10: { yading@10: const uint8_t *buf = avpkt->data; yading@10: int buf_size = avpkt->size; yading@10: int16_t *out_frame; yading@10: GetBitContext gb; yading@10: const G729FormatDescription *format; yading@10: int frame_erasure = 0; ///< frame erasure detected during decoding yading@10: int bad_pitch = 0; ///< parity check failed yading@10: int i; yading@10: int16_t *tmp; yading@10: G729Formats packet_type; yading@10: G729Context *ctx = avctx->priv_data; yading@10: int16_t lp[2][11]; // (3.12) yading@10: uint8_t ma_predictor; ///< switched MA predictor of LSP quantizer yading@10: uint8_t quantizer_1st; ///< first stage vector of quantizer yading@10: uint8_t quantizer_2nd_lo; ///< second stage lower vector of quantizer (size in bits) yading@10: uint8_t quantizer_2nd_hi; ///< second stage higher vector of quantizer (size in bits) yading@10: yading@10: int pitch_delay_int[2]; // pitch delay, integer part yading@10: int pitch_delay_3x; // pitch delay, multiplied by 3 yading@10: int16_t fc[SUBFRAME_SIZE]; // fixed-codebook vector yading@10: int16_t synth[SUBFRAME_SIZE+10]; // fixed-codebook vector yading@10: int j, ret; yading@10: int gain_before, gain_after; yading@10: int is_periodic = 0; // whether one of the subframes is declared as periodic or not yading@10: AVFrame *frame = data; yading@10: yading@10: frame->nb_samples = SUBFRAME_SIZE<<1; yading@10: if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) yading@10: return ret; yading@10: out_frame = (int16_t*) frame->data[0]; yading@10: yading@10: if (buf_size == 10) { yading@10: packet_type = FORMAT_G729_8K; yading@10: format = &format_g729_8k; yading@10: //Reset voice decision yading@10: ctx->onset = 0; yading@10: ctx->voice_decision = DECISION_VOICE; yading@10: av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729 @ 8kbit/s"); yading@10: } else if (buf_size == 8) { yading@10: packet_type = FORMAT_G729D_6K4; yading@10: format = &format_g729d_6k4; yading@10: av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729D @ 6.4kbit/s"); yading@10: } else { yading@10: av_log(avctx, AV_LOG_ERROR, "Packet size %d is unknown.\n", buf_size); yading@10: return AVERROR_INVALIDDATA; yading@10: } yading@10: yading@10: for (i=0; i < buf_size; i++) yading@10: frame_erasure |= buf[i]; yading@10: frame_erasure = !frame_erasure; yading@10: yading@10: init_get_bits(&gb, buf, 8*buf_size); yading@10: yading@10: ma_predictor = get_bits(&gb, 1); yading@10: quantizer_1st = get_bits(&gb, VQ_1ST_BITS); yading@10: quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS); yading@10: quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS); yading@10: yading@10: if(frame_erasure) yading@10: lsf_restore_from_previous(ctx->lsfq, ctx->past_quantizer_outputs, yading@10: ctx->ma_predictor_prev); yading@10: else { yading@10: lsf_decode(ctx->lsfq, ctx->past_quantizer_outputs, yading@10: ma_predictor, yading@10: quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi); yading@10: ctx->ma_predictor_prev = ma_predictor; yading@10: } yading@10: yading@10: tmp = ctx->past_quantizer_outputs[MA_NP]; yading@10: memmove(ctx->past_quantizer_outputs + 1, ctx->past_quantizer_outputs, yading@10: MA_NP * sizeof(int16_t*)); yading@10: ctx->past_quantizer_outputs[0] = tmp; yading@10: yading@10: ff_acelp_lsf2lsp(ctx->lsp[1], ctx->lsfq, 10); yading@10: yading@10: ff_acelp_lp_decode(&lp[0][0], &lp[1][0], ctx->lsp[1], ctx->lsp[0], 10); yading@10: yading@10: FFSWAP(int16_t*, ctx->lsp[1], ctx->lsp[0]); yading@10: yading@10: for (i = 0; i < 2; i++) { yading@10: int gain_corr_factor; yading@10: yading@10: uint8_t ac_index; ///< adaptive codebook index yading@10: uint8_t pulses_signs; ///< fixed-codebook vector pulse signs yading@10: int fc_indexes; ///< fixed-codebook indexes yading@10: uint8_t gc_1st_index; ///< gain codebook (first stage) index yading@10: uint8_t gc_2nd_index; ///< gain codebook (second stage) index yading@10: yading@10: ac_index = get_bits(&gb, format->ac_index_bits[i]); yading@10: if(!i && format->parity_bit) yading@10: bad_pitch = get_parity(ac_index) == get_bits1(&gb); yading@10: fc_indexes = get_bits(&gb, format->fc_indexes_bits); yading@10: pulses_signs = get_bits(&gb, format->fc_signs_bits); yading@10: gc_1st_index = get_bits(&gb, format->gc_1st_index_bits); yading@10: gc_2nd_index = get_bits(&gb, format->gc_2nd_index_bits); yading@10: yading@10: if (frame_erasure) yading@10: pitch_delay_3x = 3 * ctx->pitch_delay_int_prev; yading@10: else if(!i) { yading@10: if (bad_pitch) yading@10: pitch_delay_3x = 3 * ctx->pitch_delay_int_prev; yading@10: else yading@10: pitch_delay_3x = ff_acelp_decode_8bit_to_1st_delay3(ac_index); yading@10: } else { yading@10: int pitch_delay_min = av_clip(ctx->pitch_delay_int_prev - 5, yading@10: PITCH_DELAY_MIN, PITCH_DELAY_MAX - 9); yading@10: yading@10: if(packet_type == FORMAT_G729D_6K4) yading@10: pitch_delay_3x = ff_acelp_decode_4bit_to_2nd_delay3(ac_index, pitch_delay_min); yading@10: else yading@10: pitch_delay_3x = ff_acelp_decode_5_6_bit_to_2nd_delay3(ac_index, pitch_delay_min); yading@10: } yading@10: yading@10: /* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */ yading@10: pitch_delay_int[i] = (pitch_delay_3x + 1) / 3; yading@10: if (pitch_delay_int[i] > PITCH_DELAY_MAX) { yading@10: av_log(avctx, AV_LOG_WARNING, "pitch_delay_int %d is too large\n", pitch_delay_int[i]); yading@10: pitch_delay_int[i] = PITCH_DELAY_MAX; yading@10: } yading@10: yading@10: if (frame_erasure) { yading@10: ctx->rand_value = g729_prng(ctx->rand_value); yading@10: fc_indexes = ctx->rand_value & ((1 << format->fc_indexes_bits) - 1); yading@10: yading@10: ctx->rand_value = g729_prng(ctx->rand_value); yading@10: pulses_signs = ctx->rand_value; yading@10: } yading@10: yading@10: yading@10: memset(fc, 0, sizeof(int16_t) * SUBFRAME_SIZE); yading@10: switch (packet_type) { yading@10: case FORMAT_G729_8K: yading@10: ff_acelp_fc_pulse_per_track(fc, ff_fc_4pulses_8bits_tracks_13, yading@10: ff_fc_4pulses_8bits_track_4, yading@10: fc_indexes, pulses_signs, 3, 3); yading@10: break; yading@10: case FORMAT_G729D_6K4: yading@10: ff_acelp_fc_pulse_per_track(fc, ff_fc_2pulses_9bits_track1_gray, yading@10: ff_fc_2pulses_9bits_track2_gray, yading@10: fc_indexes, pulses_signs, 1, 4); yading@10: break; yading@10: } yading@10: yading@10: /* yading@10: This filter enhances harmonic components of the fixed-codebook vector to yading@10: improve the quality of the reconstructed speech. yading@10: yading@10: / fc_v[i], i < pitch_delay yading@10: fc_v[i] = < yading@10: \ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay yading@10: */ yading@10: ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i], yading@10: fc + pitch_delay_int[i], yading@10: fc, 1 << 14, yading@10: av_clip(ctx->past_gain_pitch[0], SHARP_MIN, SHARP_MAX), yading@10: 0, 14, yading@10: SUBFRAME_SIZE - pitch_delay_int[i]); yading@10: yading@10: memmove(ctx->past_gain_pitch+1, ctx->past_gain_pitch, 5 * sizeof(int16_t)); yading@10: ctx->past_gain_code[1] = ctx->past_gain_code[0]; yading@10: yading@10: if (frame_erasure) { yading@10: ctx->past_gain_pitch[0] = (29491 * ctx->past_gain_pitch[0]) >> 15; // 0.90 (0.15) yading@10: ctx->past_gain_code[0] = ( 2007 * ctx->past_gain_code[0] ) >> 11; // 0.98 (0.11) yading@10: yading@10: gain_corr_factor = 0; yading@10: } else { yading@10: if (packet_type == FORMAT_G729D_6K4) { yading@10: ctx->past_gain_pitch[0] = cb_gain_1st_6k4[gc_1st_index][0] + yading@10: cb_gain_2nd_6k4[gc_2nd_index][0]; yading@10: gain_corr_factor = cb_gain_1st_6k4[gc_1st_index][1] + yading@10: cb_gain_2nd_6k4[gc_2nd_index][1]; yading@10: yading@10: /* Without check below overflow can occur in ff_acelp_update_past_gain. yading@10: It is not issue for G.729, because gain_corr_factor in it's case is always yading@10: greater than 1024, while in G.729D it can be even zero. */ yading@10: gain_corr_factor = FFMAX(gain_corr_factor, 1024); yading@10: #ifndef G729_BITEXACT yading@10: gain_corr_factor >>= 1; yading@10: #endif yading@10: } else { yading@10: ctx->past_gain_pitch[0] = cb_gain_1st_8k[gc_1st_index][0] + yading@10: cb_gain_2nd_8k[gc_2nd_index][0]; yading@10: gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] + yading@10: cb_gain_2nd_8k[gc_2nd_index][1]; yading@10: } yading@10: yading@10: /* Decode the fixed-codebook gain. */ yading@10: ctx->past_gain_code[0] = ff_acelp_decode_gain_code(&ctx->dsp, gain_corr_factor, yading@10: fc, MR_ENERGY, yading@10: ctx->quant_energy, yading@10: ma_prediction_coeff, yading@10: SUBFRAME_SIZE, 4); yading@10: #ifdef G729_BITEXACT yading@10: /* yading@10: This correction required to get bit-exact result with yading@10: reference code, because gain_corr_factor in G.729D is yading@10: two times larger than in original G.729. yading@10: yading@10: If bit-exact result is not issue then gain_corr_factor yading@10: can be simpler divided by 2 before call to g729_get_gain_code yading@10: instead of using correction below. yading@10: */ yading@10: if (packet_type == FORMAT_G729D_6K4) { yading@10: gain_corr_factor >>= 1; yading@10: ctx->past_gain_code[0] >>= 1; yading@10: } yading@10: #endif yading@10: } yading@10: ff_acelp_update_past_gain(ctx->quant_energy, gain_corr_factor, 2, frame_erasure); yading@10: yading@10: /* Routine requires rounding to lowest. */ yading@10: ff_acelp_interpolate(ctx->exc + i * SUBFRAME_SIZE, yading@10: ctx->exc + i * SUBFRAME_SIZE - pitch_delay_3x / 3, yading@10: ff_acelp_interp_filter, 6, yading@10: (pitch_delay_3x % 3) << 1, yading@10: 10, SUBFRAME_SIZE); yading@10: yading@10: ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE, yading@10: ctx->exc + i * SUBFRAME_SIZE, fc, yading@10: (!ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_pitch[0], yading@10: ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0], yading@10: 1 << 13, 14, SUBFRAME_SIZE); yading@10: yading@10: memcpy(synth, ctx->syn_filter_data, 10 * sizeof(int16_t)); yading@10: yading@10: if (ff_celp_lp_synthesis_filter( yading@10: synth+10, yading@10: &lp[i][1], yading@10: ctx->exc + i * SUBFRAME_SIZE, yading@10: SUBFRAME_SIZE, yading@10: 10, yading@10: 1, yading@10: 0, yading@10: 0x800)) yading@10: /* Overflow occurred, downscale excitation signal... */ yading@10: for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++) yading@10: ctx->exc_base[j] >>= 2; yading@10: yading@10: /* ... and make synthesis again. */ yading@10: if (packet_type == FORMAT_G729D_6K4) { yading@10: int16_t exc_new[SUBFRAME_SIZE]; yading@10: yading@10: ctx->onset = g729d_onset_decision(ctx->onset, ctx->past_gain_code); yading@10: ctx->voice_decision = g729d_voice_decision(ctx->onset, ctx->voice_decision, ctx->past_gain_pitch); yading@10: yading@10: g729d_get_new_exc(exc_new, ctx->exc + i * SUBFRAME_SIZE, fc, ctx->voice_decision, ctx->past_gain_code[0], SUBFRAME_SIZE); yading@10: yading@10: ff_celp_lp_synthesis_filter( yading@10: synth+10, yading@10: &lp[i][1], yading@10: exc_new, yading@10: SUBFRAME_SIZE, yading@10: 10, yading@10: 0, yading@10: 0, yading@10: 0x800); yading@10: } else { yading@10: ff_celp_lp_synthesis_filter( yading@10: synth+10, yading@10: &lp[i][1], yading@10: ctx->exc + i * SUBFRAME_SIZE, yading@10: SUBFRAME_SIZE, yading@10: 10, yading@10: 0, yading@10: 0, yading@10: 0x800); yading@10: } yading@10: /* Save data (without postfilter) for use in next subframe. */ yading@10: memcpy(ctx->syn_filter_data, synth+SUBFRAME_SIZE, 10 * sizeof(int16_t)); yading@10: yading@10: /* Calculate gain of unfiltered signal for use in AGC. */ yading@10: gain_before = 0; yading@10: for (j = 0; j < SUBFRAME_SIZE; j++) yading@10: gain_before += FFABS(synth[j+10]); yading@10: yading@10: /* Call postfilter and also update voicing decision for use in next frame. */ yading@10: ff_g729_postfilter( yading@10: &ctx->dsp, yading@10: &ctx->ht_prev_data, yading@10: &is_periodic, yading@10: &lp[i][0], yading@10: pitch_delay_int[0], yading@10: ctx->residual, yading@10: ctx->res_filter_data, yading@10: ctx->pos_filter_data, yading@10: synth+10, yading@10: SUBFRAME_SIZE); yading@10: yading@10: /* Calculate gain of filtered signal for use in AGC. */ yading@10: gain_after = 0; yading@10: for(j=0; jgain_coeff = ff_g729_adaptive_gain_control( yading@10: gain_before, yading@10: gain_after, yading@10: synth+10, yading@10: SUBFRAME_SIZE, yading@10: ctx->gain_coeff); yading@10: yading@10: if (frame_erasure) yading@10: ctx->pitch_delay_int_prev = FFMIN(ctx->pitch_delay_int_prev + 1, PITCH_DELAY_MAX); yading@10: else yading@10: ctx->pitch_delay_int_prev = pitch_delay_int[i]; yading@10: yading@10: memcpy(synth+8, ctx->hpf_z, 2*sizeof(int16_t)); yading@10: ff_acelp_high_pass_filter( yading@10: out_frame + i*SUBFRAME_SIZE, yading@10: ctx->hpf_f, yading@10: synth+10, yading@10: SUBFRAME_SIZE); yading@10: memcpy(ctx->hpf_z, synth+8+SUBFRAME_SIZE, 2*sizeof(int16_t)); yading@10: } yading@10: yading@10: ctx->was_periodic = is_periodic; yading@10: yading@10: /* Save signal for use in next frame. */ yading@10: memmove(ctx->exc_base, ctx->exc_base + 2 * SUBFRAME_SIZE, (PITCH_DELAY_MAX+INTERPOL_LEN)*sizeof(int16_t)); yading@10: yading@10: *got_frame_ptr = 1; yading@10: return buf_size; yading@10: } yading@10: yading@10: AVCodec ff_g729_decoder = { yading@10: .name = "g729", yading@10: .type = AVMEDIA_TYPE_AUDIO, yading@10: .id = AV_CODEC_ID_G729, yading@10: .priv_data_size = sizeof(G729Context), yading@10: .init = decoder_init, yading@10: .decode = decode_frame, yading@10: .capabilities = CODEC_CAP_DR1, yading@10: .long_name = NULL_IF_CONFIG_SMALL("G.729"), yading@10: };