annotate ffmpeg/libavcodec/g729dec.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * G.729, G729 Annex D decoders
yading@10 3 * Copyright (c) 2008 Vladimir Voroshilov
yading@10 4 *
yading@10 5 * This file is part of FFmpeg.
yading@10 6 *
yading@10 7 * FFmpeg is free software; you can redistribute it and/or
yading@10 8 * modify it under the terms of the GNU Lesser General Public
yading@10 9 * License as published by the Free Software Foundation; either
yading@10 10 * version 2.1 of the License, or (at your option) any later version.
yading@10 11 *
yading@10 12 * FFmpeg is distributed in the hope that it will be useful,
yading@10 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 15 * Lesser General Public License for more details.
yading@10 16 *
yading@10 17 * You should have received a copy of the GNU Lesser General Public
yading@10 18 * License along with FFmpeg; if not, write to the Free Software
yading@10 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 20 */
yading@10 21
yading@10 22 #include <inttypes.h>
yading@10 23 #include <string.h>
yading@10 24
yading@10 25 #include "avcodec.h"
yading@10 26 #include "libavutil/avutil.h"
yading@10 27 #include "get_bits.h"
yading@10 28 #include "dsputil.h"
yading@10 29 #include "internal.h"
yading@10 30
yading@10 31
yading@10 32 #include "g729.h"
yading@10 33 #include "lsp.h"
yading@10 34 #include "celp_math.h"
yading@10 35 #include "celp_filters.h"
yading@10 36 #include "acelp_filters.h"
yading@10 37 #include "acelp_pitch_delay.h"
yading@10 38 #include "acelp_vectors.h"
yading@10 39 #include "g729data.h"
yading@10 40 #include "g729postfilter.h"
yading@10 41
yading@10 42 /**
yading@10 43 * minimum quantized LSF value (3.2.4)
yading@10 44 * 0.005 in Q13
yading@10 45 */
yading@10 46 #define LSFQ_MIN 40
yading@10 47
yading@10 48 /**
yading@10 49 * maximum quantized LSF value (3.2.4)
yading@10 50 * 3.135 in Q13
yading@10 51 */
yading@10 52 #define LSFQ_MAX 25681
yading@10 53
yading@10 54 /**
yading@10 55 * minimum LSF distance (3.2.4)
yading@10 56 * 0.0391 in Q13
yading@10 57 */
yading@10 58 #define LSFQ_DIFF_MIN 321
yading@10 59
yading@10 60 /// interpolation filter length
yading@10 61 #define INTERPOL_LEN 11
yading@10 62
yading@10 63 /**
yading@10 64 * minimum gain pitch value (3.8, Equation 47)
yading@10 65 * 0.2 in (1.14)
yading@10 66 */
yading@10 67 #define SHARP_MIN 3277
yading@10 68
yading@10 69 /**
yading@10 70 * maximum gain pitch value (3.8, Equation 47)
yading@10 71 * (EE) This does not comply with the specification.
yading@10 72 * Specification says about 0.8, which should be
yading@10 73 * 13107 in (1.14), but reference C code uses
yading@10 74 * 13017 (equals to 0.7945) instead of it.
yading@10 75 */
yading@10 76 #define SHARP_MAX 13017
yading@10 77
yading@10 78 /**
yading@10 79 * MR_ENERGY (mean removed energy) = mean_energy + 10 * log10(2^26 * subframe_size) in (7.13)
yading@10 80 */
yading@10 81 #define MR_ENERGY 1018156
yading@10 82
yading@10 83 #define DECISION_NOISE 0
yading@10 84 #define DECISION_INTERMEDIATE 1
yading@10 85 #define DECISION_VOICE 2
yading@10 86
yading@10 87 typedef enum {
yading@10 88 FORMAT_G729_8K = 0,
yading@10 89 FORMAT_G729D_6K4,
yading@10 90 FORMAT_COUNT,
yading@10 91 } G729Formats;
yading@10 92
yading@10 93 typedef struct {
yading@10 94 uint8_t ac_index_bits[2]; ///< adaptive codebook index for second subframe (size in bits)
yading@10 95 uint8_t parity_bit; ///< parity bit for pitch delay
yading@10 96 uint8_t gc_1st_index_bits; ///< gain codebook (first stage) index (size in bits)
yading@10 97 uint8_t gc_2nd_index_bits; ///< gain codebook (second stage) index (size in bits)
yading@10 98 uint8_t fc_signs_bits; ///< number of pulses in fixed-codebook vector
yading@10 99 uint8_t fc_indexes_bits; ///< size (in bits) of fixed-codebook index entry
yading@10 100 } G729FormatDescription;
yading@10 101
yading@10 102 typedef struct {
yading@10 103 DSPContext dsp;
yading@10 104
yading@10 105 /// past excitation signal buffer
yading@10 106 int16_t exc_base[2*SUBFRAME_SIZE+PITCH_DELAY_MAX+INTERPOL_LEN];
yading@10 107
yading@10 108 int16_t* exc; ///< start of past excitation data in buffer
yading@10 109 int pitch_delay_int_prev; ///< integer part of previous subframe's pitch delay (4.1.3)
yading@10 110
yading@10 111 /// (2.13) LSP quantizer outputs
yading@10 112 int16_t past_quantizer_output_buf[MA_NP + 1][10];
yading@10 113 int16_t* past_quantizer_outputs[MA_NP + 1];
yading@10 114
yading@10 115 int16_t lsfq[10]; ///< (2.13) quantized LSF coefficients from previous frame
yading@10 116 int16_t lsp_buf[2][10]; ///< (0.15) LSP coefficients (previous and current frames) (3.2.5)
yading@10 117 int16_t *lsp[2]; ///< pointers to lsp_buf
yading@10 118
yading@10 119 int16_t quant_energy[4]; ///< (5.10) past quantized energy
yading@10 120
yading@10 121 /// previous speech data for LP synthesis filter
yading@10 122 int16_t syn_filter_data[10];
yading@10 123
yading@10 124
yading@10 125 /// residual signal buffer (used in long-term postfilter)
yading@10 126 int16_t residual[SUBFRAME_SIZE + RES_PREV_DATA_SIZE];
yading@10 127
yading@10 128 /// previous speech data for residual calculation filter
yading@10 129 int16_t res_filter_data[SUBFRAME_SIZE+10];
yading@10 130
yading@10 131 /// previous speech data for short-term postfilter
yading@10 132 int16_t pos_filter_data[SUBFRAME_SIZE+10];
yading@10 133
yading@10 134 /// (1.14) pitch gain of current and five previous subframes
yading@10 135 int16_t past_gain_pitch[6];
yading@10 136
yading@10 137 /// (14.1) gain code from current and previous subframe
yading@10 138 int16_t past_gain_code[2];
yading@10 139
yading@10 140 /// voice decision on previous subframe (0-noise, 1-intermediate, 2-voice), G.729D
yading@10 141 int16_t voice_decision;
yading@10 142
yading@10 143 int16_t onset; ///< detected onset level (0-2)
yading@10 144 int16_t was_periodic; ///< whether previous frame was declared as periodic or not (4.4)
yading@10 145 int16_t ht_prev_data; ///< previous data for 4.2.3, equation 86
yading@10 146 int gain_coeff; ///< (1.14) gain coefficient (4.2.4)
yading@10 147 uint16_t rand_value; ///< random number generator value (4.4.4)
yading@10 148 int ma_predictor_prev; ///< switched MA predictor of LSP quantizer from last good frame
yading@10 149
yading@10 150 /// (14.14) high-pass filter data (past input)
yading@10 151 int hpf_f[2];
yading@10 152
yading@10 153 /// high-pass filter data (past output)
yading@10 154 int16_t hpf_z[2];
yading@10 155 } G729Context;
yading@10 156
yading@10 157 static const G729FormatDescription format_g729_8k = {
yading@10 158 .ac_index_bits = {8,5},
yading@10 159 .parity_bit = 1,
yading@10 160 .gc_1st_index_bits = GC_1ST_IDX_BITS_8K,
yading@10 161 .gc_2nd_index_bits = GC_2ND_IDX_BITS_8K,
yading@10 162 .fc_signs_bits = 4,
yading@10 163 .fc_indexes_bits = 13,
yading@10 164 };
yading@10 165
yading@10 166 static const G729FormatDescription format_g729d_6k4 = {
yading@10 167 .ac_index_bits = {8,4},
yading@10 168 .parity_bit = 0,
yading@10 169 .gc_1st_index_bits = GC_1ST_IDX_BITS_6K4,
yading@10 170 .gc_2nd_index_bits = GC_2ND_IDX_BITS_6K4,
yading@10 171 .fc_signs_bits = 2,
yading@10 172 .fc_indexes_bits = 9,
yading@10 173 };
yading@10 174
yading@10 175 /**
yading@10 176 * @brief pseudo random number generator
yading@10 177 */
yading@10 178 static inline uint16_t g729_prng(uint16_t value)
yading@10 179 {
yading@10 180 return 31821 * value + 13849;
yading@10 181 }
yading@10 182
yading@10 183 /**
yading@10 184 * Get parity bit of bit 2..7
yading@10 185 */
yading@10 186 static inline int get_parity(uint8_t value)
yading@10 187 {
yading@10 188 return (0x6996966996696996ULL >> (value >> 2)) & 1;
yading@10 189 }
yading@10 190
yading@10 191 /**
yading@10 192 * Decodes LSF (Line Spectral Frequencies) from L0-L3 (3.2.4).
yading@10 193 * @param[out] lsfq (2.13) quantized LSF coefficients
yading@10 194 * @param[in,out] past_quantizer_outputs (2.13) quantizer outputs from previous frames
yading@10 195 * @param ma_predictor switched MA predictor of LSP quantizer
yading@10 196 * @param vq_1st first stage vector of quantizer
yading@10 197 * @param vq_2nd_low second stage lower vector of LSP quantizer
yading@10 198 * @param vq_2nd_high second stage higher vector of LSP quantizer
yading@10 199 */
yading@10 200 static void lsf_decode(int16_t* lsfq, int16_t* past_quantizer_outputs[MA_NP + 1],
yading@10 201 int16_t ma_predictor,
yading@10 202 int16_t vq_1st, int16_t vq_2nd_low, int16_t vq_2nd_high)
yading@10 203 {
yading@10 204 int i,j;
yading@10 205 static const uint8_t min_distance[2]={10, 5}; //(2.13)
yading@10 206 int16_t* quantizer_output = past_quantizer_outputs[MA_NP];
yading@10 207
yading@10 208 for (i = 0; i < 5; i++) {
yading@10 209 quantizer_output[i] = cb_lsp_1st[vq_1st][i ] + cb_lsp_2nd[vq_2nd_low ][i ];
yading@10 210 quantizer_output[i + 5] = cb_lsp_1st[vq_1st][i + 5] + cb_lsp_2nd[vq_2nd_high][i + 5];
yading@10 211 }
yading@10 212
yading@10 213 for (j = 0; j < 2; j++) {
yading@10 214 for (i = 1; i < 10; i++) {
yading@10 215 int diff = (quantizer_output[i - 1] - quantizer_output[i] + min_distance[j]) >> 1;
yading@10 216 if (diff > 0) {
yading@10 217 quantizer_output[i - 1] -= diff;
yading@10 218 quantizer_output[i ] += diff;
yading@10 219 }
yading@10 220 }
yading@10 221 }
yading@10 222
yading@10 223 for (i = 0; i < 10; i++) {
yading@10 224 int sum = quantizer_output[i] * cb_ma_predictor_sum[ma_predictor][i];
yading@10 225 for (j = 0; j < MA_NP; j++)
yading@10 226 sum += past_quantizer_outputs[j][i] * cb_ma_predictor[ma_predictor][j][i];
yading@10 227
yading@10 228 lsfq[i] = sum >> 15;
yading@10 229 }
yading@10 230
yading@10 231 ff_acelp_reorder_lsf(lsfq, LSFQ_DIFF_MIN, LSFQ_MIN, LSFQ_MAX, 10);
yading@10 232 }
yading@10 233
yading@10 234 /**
yading@10 235 * Restores past LSP quantizer output using LSF from previous frame
yading@10 236 * @param[in,out] lsfq (2.13) quantized LSF coefficients
yading@10 237 * @param[in,out] past_quantizer_outputs (2.13) quantizer outputs from previous frames
yading@10 238 * @param ma_predictor_prev MA predictor from previous frame
yading@10 239 * @param lsfq_prev (2.13) quantized LSF coefficients from previous frame
yading@10 240 */
yading@10 241 static void lsf_restore_from_previous(int16_t* lsfq,
yading@10 242 int16_t* past_quantizer_outputs[MA_NP + 1],
yading@10 243 int ma_predictor_prev)
yading@10 244 {
yading@10 245 int16_t* quantizer_output = past_quantizer_outputs[MA_NP];
yading@10 246 int i,k;
yading@10 247
yading@10 248 for (i = 0; i < 10; i++) {
yading@10 249 int tmp = lsfq[i] << 15;
yading@10 250
yading@10 251 for (k = 0; k < MA_NP; k++)
yading@10 252 tmp -= past_quantizer_outputs[k][i] * cb_ma_predictor[ma_predictor_prev][k][i];
yading@10 253
yading@10 254 quantizer_output[i] = ((tmp >> 15) * cb_ma_predictor_sum_inv[ma_predictor_prev][i]) >> 12;
yading@10 255 }
yading@10 256 }
yading@10 257
yading@10 258 /**
yading@10 259 * Constructs new excitation signal and applies phase filter to it
yading@10 260 * @param[out] out constructed speech signal
yading@10 261 * @param in original excitation signal
yading@10 262 * @param fc_cur (2.13) original fixed-codebook vector
yading@10 263 * @param gain_code (14.1) gain code
yading@10 264 * @param subframe_size length of the subframe
yading@10 265 */
yading@10 266 static void g729d_get_new_exc(
yading@10 267 int16_t* out,
yading@10 268 const int16_t* in,
yading@10 269 const int16_t* fc_cur,
yading@10 270 int dstate,
yading@10 271 int gain_code,
yading@10 272 int subframe_size)
yading@10 273 {
yading@10 274 int i;
yading@10 275 int16_t fc_new[SUBFRAME_SIZE];
yading@10 276
yading@10 277 ff_celp_convolve_circ(fc_new, fc_cur, phase_filter[dstate], subframe_size);
yading@10 278
yading@10 279 for(i=0; i<subframe_size; i++)
yading@10 280 {
yading@10 281 out[i] = in[i];
yading@10 282 out[i] -= (gain_code * fc_cur[i] + 0x2000) >> 14;
yading@10 283 out[i] += (gain_code * fc_new[i] + 0x2000) >> 14;
yading@10 284 }
yading@10 285 }
yading@10 286
yading@10 287 /**
yading@10 288 * Makes decision about onset in current subframe
yading@10 289 * @param past_onset decision result of previous subframe
yading@10 290 * @param past_gain_code gain code of current and previous subframe
yading@10 291 *
yading@10 292 * @return onset decision result for current subframe
yading@10 293 */
yading@10 294 static int g729d_onset_decision(int past_onset, const int16_t* past_gain_code)
yading@10 295 {
yading@10 296 if((past_gain_code[0] >> 1) > past_gain_code[1])
yading@10 297 return 2;
yading@10 298 else
yading@10 299 return FFMAX(past_onset-1, 0);
yading@10 300 }
yading@10 301
yading@10 302 /**
yading@10 303 * Makes decision about voice presence in current subframe
yading@10 304 * @param onset onset level
yading@10 305 * @param prev_voice_decision voice decision result from previous subframe
yading@10 306 * @param past_gain_pitch pitch gain of current and previous subframes
yading@10 307 *
yading@10 308 * @return voice decision result for current subframe
yading@10 309 */
yading@10 310 static int16_t g729d_voice_decision(int onset, int prev_voice_decision, const int16_t* past_gain_pitch)
yading@10 311 {
yading@10 312 int i, low_gain_pitch_cnt, voice_decision;
yading@10 313
yading@10 314 if(past_gain_pitch[0] >= 14745) // 0.9
yading@10 315 voice_decision = DECISION_VOICE;
yading@10 316 else if (past_gain_pitch[0] <= 9830) // 0.6
yading@10 317 voice_decision = DECISION_NOISE;
yading@10 318 else
yading@10 319 voice_decision = DECISION_INTERMEDIATE;
yading@10 320
yading@10 321 for(i=0, low_gain_pitch_cnt=0; i<6; i++)
yading@10 322 if(past_gain_pitch[i] < 9830)
yading@10 323 low_gain_pitch_cnt++;
yading@10 324
yading@10 325 if(low_gain_pitch_cnt > 2 && !onset)
yading@10 326 voice_decision = DECISION_NOISE;
yading@10 327
yading@10 328 if(!onset && voice_decision > prev_voice_decision + 1)
yading@10 329 voice_decision--;
yading@10 330
yading@10 331 if(onset && voice_decision < DECISION_VOICE)
yading@10 332 voice_decision++;
yading@10 333
yading@10 334 return voice_decision;
yading@10 335 }
yading@10 336
yading@10 337 static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2, int order)
yading@10 338 {
yading@10 339 int res = 0;
yading@10 340
yading@10 341 while (order--)
yading@10 342 res += *v1++ * *v2++;
yading@10 343
yading@10 344 return res;
yading@10 345 }
yading@10 346
yading@10 347 static av_cold int decoder_init(AVCodecContext * avctx)
yading@10 348 {
yading@10 349 G729Context* ctx = avctx->priv_data;
yading@10 350 int i,k;
yading@10 351
yading@10 352 if (avctx->channels != 1) {
yading@10 353 av_log(avctx, AV_LOG_ERROR, "Only mono sound is supported (requested channels: %d).\n", avctx->channels);
yading@10 354 return AVERROR(EINVAL);
yading@10 355 }
yading@10 356 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
yading@10 357
yading@10 358 /* Both 8kbit/s and 6.4kbit/s modes uses two subframes per frame. */
yading@10 359 avctx->frame_size = SUBFRAME_SIZE << 1;
yading@10 360
yading@10 361 ctx->gain_coeff = 16384; // 1.0 in (1.14)
yading@10 362
yading@10 363 for (k = 0; k < MA_NP + 1; k++) {
yading@10 364 ctx->past_quantizer_outputs[k] = ctx->past_quantizer_output_buf[k];
yading@10 365 for (i = 1; i < 11; i++)
yading@10 366 ctx->past_quantizer_outputs[k][i - 1] = (18717 * i) >> 3;
yading@10 367 }
yading@10 368
yading@10 369 ctx->lsp[0] = ctx->lsp_buf[0];
yading@10 370 ctx->lsp[1] = ctx->lsp_buf[1];
yading@10 371 memcpy(ctx->lsp[0], lsp_init, 10 * sizeof(int16_t));
yading@10 372
yading@10 373 ctx->exc = &ctx->exc_base[PITCH_DELAY_MAX+INTERPOL_LEN];
yading@10 374
yading@10 375 ctx->pitch_delay_int_prev = PITCH_DELAY_MIN;
yading@10 376
yading@10 377 /* random seed initialization */
yading@10 378 ctx->rand_value = 21845;
yading@10 379
yading@10 380 /* quantized prediction error */
yading@10 381 for(i=0; i<4; i++)
yading@10 382 ctx->quant_energy[i] = -14336; // -14 in (5.10)
yading@10 383
yading@10 384 ff_dsputil_init(&ctx->dsp, avctx);
yading@10 385 ctx->dsp.scalarproduct_int16 = scalarproduct_int16_c;
yading@10 386
yading@10 387 return 0;
yading@10 388 }
yading@10 389
yading@10 390 static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr,
yading@10 391 AVPacket *avpkt)
yading@10 392 {
yading@10 393 const uint8_t *buf = avpkt->data;
yading@10 394 int buf_size = avpkt->size;
yading@10 395 int16_t *out_frame;
yading@10 396 GetBitContext gb;
yading@10 397 const G729FormatDescription *format;
yading@10 398 int frame_erasure = 0; ///< frame erasure detected during decoding
yading@10 399 int bad_pitch = 0; ///< parity check failed
yading@10 400 int i;
yading@10 401 int16_t *tmp;
yading@10 402 G729Formats packet_type;
yading@10 403 G729Context *ctx = avctx->priv_data;
yading@10 404 int16_t lp[2][11]; // (3.12)
yading@10 405 uint8_t ma_predictor; ///< switched MA predictor of LSP quantizer
yading@10 406 uint8_t quantizer_1st; ///< first stage vector of quantizer
yading@10 407 uint8_t quantizer_2nd_lo; ///< second stage lower vector of quantizer (size in bits)
yading@10 408 uint8_t quantizer_2nd_hi; ///< second stage higher vector of quantizer (size in bits)
yading@10 409
yading@10 410 int pitch_delay_int[2]; // pitch delay, integer part
yading@10 411 int pitch_delay_3x; // pitch delay, multiplied by 3
yading@10 412 int16_t fc[SUBFRAME_SIZE]; // fixed-codebook vector
yading@10 413 int16_t synth[SUBFRAME_SIZE+10]; // fixed-codebook vector
yading@10 414 int j, ret;
yading@10 415 int gain_before, gain_after;
yading@10 416 int is_periodic = 0; // whether one of the subframes is declared as periodic or not
yading@10 417 AVFrame *frame = data;
yading@10 418
yading@10 419 frame->nb_samples = SUBFRAME_SIZE<<1;
yading@10 420 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
yading@10 421 return ret;
yading@10 422 out_frame = (int16_t*) frame->data[0];
yading@10 423
yading@10 424 if (buf_size == 10) {
yading@10 425 packet_type = FORMAT_G729_8K;
yading@10 426 format = &format_g729_8k;
yading@10 427 //Reset voice decision
yading@10 428 ctx->onset = 0;
yading@10 429 ctx->voice_decision = DECISION_VOICE;
yading@10 430 av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729 @ 8kbit/s");
yading@10 431 } else if (buf_size == 8) {
yading@10 432 packet_type = FORMAT_G729D_6K4;
yading@10 433 format = &format_g729d_6k4;
yading@10 434 av_log(avctx, AV_LOG_DEBUG, "Packet type: %s\n", "G.729D @ 6.4kbit/s");
yading@10 435 } else {
yading@10 436 av_log(avctx, AV_LOG_ERROR, "Packet size %d is unknown.\n", buf_size);
yading@10 437 return AVERROR_INVALIDDATA;
yading@10 438 }
yading@10 439
yading@10 440 for (i=0; i < buf_size; i++)
yading@10 441 frame_erasure |= buf[i];
yading@10 442 frame_erasure = !frame_erasure;
yading@10 443
yading@10 444 init_get_bits(&gb, buf, 8*buf_size);
yading@10 445
yading@10 446 ma_predictor = get_bits(&gb, 1);
yading@10 447 quantizer_1st = get_bits(&gb, VQ_1ST_BITS);
yading@10 448 quantizer_2nd_lo = get_bits(&gb, VQ_2ND_BITS);
yading@10 449 quantizer_2nd_hi = get_bits(&gb, VQ_2ND_BITS);
yading@10 450
yading@10 451 if(frame_erasure)
yading@10 452 lsf_restore_from_previous(ctx->lsfq, ctx->past_quantizer_outputs,
yading@10 453 ctx->ma_predictor_prev);
yading@10 454 else {
yading@10 455 lsf_decode(ctx->lsfq, ctx->past_quantizer_outputs,
yading@10 456 ma_predictor,
yading@10 457 quantizer_1st, quantizer_2nd_lo, quantizer_2nd_hi);
yading@10 458 ctx->ma_predictor_prev = ma_predictor;
yading@10 459 }
yading@10 460
yading@10 461 tmp = ctx->past_quantizer_outputs[MA_NP];
yading@10 462 memmove(ctx->past_quantizer_outputs + 1, ctx->past_quantizer_outputs,
yading@10 463 MA_NP * sizeof(int16_t*));
yading@10 464 ctx->past_quantizer_outputs[0] = tmp;
yading@10 465
yading@10 466 ff_acelp_lsf2lsp(ctx->lsp[1], ctx->lsfq, 10);
yading@10 467
yading@10 468 ff_acelp_lp_decode(&lp[0][0], &lp[1][0], ctx->lsp[1], ctx->lsp[0], 10);
yading@10 469
yading@10 470 FFSWAP(int16_t*, ctx->lsp[1], ctx->lsp[0]);
yading@10 471
yading@10 472 for (i = 0; i < 2; i++) {
yading@10 473 int gain_corr_factor;
yading@10 474
yading@10 475 uint8_t ac_index; ///< adaptive codebook index
yading@10 476 uint8_t pulses_signs; ///< fixed-codebook vector pulse signs
yading@10 477 int fc_indexes; ///< fixed-codebook indexes
yading@10 478 uint8_t gc_1st_index; ///< gain codebook (first stage) index
yading@10 479 uint8_t gc_2nd_index; ///< gain codebook (second stage) index
yading@10 480
yading@10 481 ac_index = get_bits(&gb, format->ac_index_bits[i]);
yading@10 482 if(!i && format->parity_bit)
yading@10 483 bad_pitch = get_parity(ac_index) == get_bits1(&gb);
yading@10 484 fc_indexes = get_bits(&gb, format->fc_indexes_bits);
yading@10 485 pulses_signs = get_bits(&gb, format->fc_signs_bits);
yading@10 486 gc_1st_index = get_bits(&gb, format->gc_1st_index_bits);
yading@10 487 gc_2nd_index = get_bits(&gb, format->gc_2nd_index_bits);
yading@10 488
yading@10 489 if (frame_erasure)
yading@10 490 pitch_delay_3x = 3 * ctx->pitch_delay_int_prev;
yading@10 491 else if(!i) {
yading@10 492 if (bad_pitch)
yading@10 493 pitch_delay_3x = 3 * ctx->pitch_delay_int_prev;
yading@10 494 else
yading@10 495 pitch_delay_3x = ff_acelp_decode_8bit_to_1st_delay3(ac_index);
yading@10 496 } else {
yading@10 497 int pitch_delay_min = av_clip(ctx->pitch_delay_int_prev - 5,
yading@10 498 PITCH_DELAY_MIN, PITCH_DELAY_MAX - 9);
yading@10 499
yading@10 500 if(packet_type == FORMAT_G729D_6K4)
yading@10 501 pitch_delay_3x = ff_acelp_decode_4bit_to_2nd_delay3(ac_index, pitch_delay_min);
yading@10 502 else
yading@10 503 pitch_delay_3x = ff_acelp_decode_5_6_bit_to_2nd_delay3(ac_index, pitch_delay_min);
yading@10 504 }
yading@10 505
yading@10 506 /* Round pitch delay to nearest (used everywhere except ff_acelp_interpolate). */
yading@10 507 pitch_delay_int[i] = (pitch_delay_3x + 1) / 3;
yading@10 508 if (pitch_delay_int[i] > PITCH_DELAY_MAX) {
yading@10 509 av_log(avctx, AV_LOG_WARNING, "pitch_delay_int %d is too large\n", pitch_delay_int[i]);
yading@10 510 pitch_delay_int[i] = PITCH_DELAY_MAX;
yading@10 511 }
yading@10 512
yading@10 513 if (frame_erasure) {
yading@10 514 ctx->rand_value = g729_prng(ctx->rand_value);
yading@10 515 fc_indexes = ctx->rand_value & ((1 << format->fc_indexes_bits) - 1);
yading@10 516
yading@10 517 ctx->rand_value = g729_prng(ctx->rand_value);
yading@10 518 pulses_signs = ctx->rand_value;
yading@10 519 }
yading@10 520
yading@10 521
yading@10 522 memset(fc, 0, sizeof(int16_t) * SUBFRAME_SIZE);
yading@10 523 switch (packet_type) {
yading@10 524 case FORMAT_G729_8K:
yading@10 525 ff_acelp_fc_pulse_per_track(fc, ff_fc_4pulses_8bits_tracks_13,
yading@10 526 ff_fc_4pulses_8bits_track_4,
yading@10 527 fc_indexes, pulses_signs, 3, 3);
yading@10 528 break;
yading@10 529 case FORMAT_G729D_6K4:
yading@10 530 ff_acelp_fc_pulse_per_track(fc, ff_fc_2pulses_9bits_track1_gray,
yading@10 531 ff_fc_2pulses_9bits_track2_gray,
yading@10 532 fc_indexes, pulses_signs, 1, 4);
yading@10 533 break;
yading@10 534 }
yading@10 535
yading@10 536 /*
yading@10 537 This filter enhances harmonic components of the fixed-codebook vector to
yading@10 538 improve the quality of the reconstructed speech.
yading@10 539
yading@10 540 / fc_v[i], i < pitch_delay
yading@10 541 fc_v[i] = <
yading@10 542 \ fc_v[i] + gain_pitch * fc_v[i-pitch_delay], i >= pitch_delay
yading@10 543 */
yading@10 544 ff_acelp_weighted_vector_sum(fc + pitch_delay_int[i],
yading@10 545 fc + pitch_delay_int[i],
yading@10 546 fc, 1 << 14,
yading@10 547 av_clip(ctx->past_gain_pitch[0], SHARP_MIN, SHARP_MAX),
yading@10 548 0, 14,
yading@10 549 SUBFRAME_SIZE - pitch_delay_int[i]);
yading@10 550
yading@10 551 memmove(ctx->past_gain_pitch+1, ctx->past_gain_pitch, 5 * sizeof(int16_t));
yading@10 552 ctx->past_gain_code[1] = ctx->past_gain_code[0];
yading@10 553
yading@10 554 if (frame_erasure) {
yading@10 555 ctx->past_gain_pitch[0] = (29491 * ctx->past_gain_pitch[0]) >> 15; // 0.90 (0.15)
yading@10 556 ctx->past_gain_code[0] = ( 2007 * ctx->past_gain_code[0] ) >> 11; // 0.98 (0.11)
yading@10 557
yading@10 558 gain_corr_factor = 0;
yading@10 559 } else {
yading@10 560 if (packet_type == FORMAT_G729D_6K4) {
yading@10 561 ctx->past_gain_pitch[0] = cb_gain_1st_6k4[gc_1st_index][0] +
yading@10 562 cb_gain_2nd_6k4[gc_2nd_index][0];
yading@10 563 gain_corr_factor = cb_gain_1st_6k4[gc_1st_index][1] +
yading@10 564 cb_gain_2nd_6k4[gc_2nd_index][1];
yading@10 565
yading@10 566 /* Without check below overflow can occur in ff_acelp_update_past_gain.
yading@10 567 It is not issue for G.729, because gain_corr_factor in it's case is always
yading@10 568 greater than 1024, while in G.729D it can be even zero. */
yading@10 569 gain_corr_factor = FFMAX(gain_corr_factor, 1024);
yading@10 570 #ifndef G729_BITEXACT
yading@10 571 gain_corr_factor >>= 1;
yading@10 572 #endif
yading@10 573 } else {
yading@10 574 ctx->past_gain_pitch[0] = cb_gain_1st_8k[gc_1st_index][0] +
yading@10 575 cb_gain_2nd_8k[gc_2nd_index][0];
yading@10 576 gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] +
yading@10 577 cb_gain_2nd_8k[gc_2nd_index][1];
yading@10 578 }
yading@10 579
yading@10 580 /* Decode the fixed-codebook gain. */
yading@10 581 ctx->past_gain_code[0] = ff_acelp_decode_gain_code(&ctx->dsp, gain_corr_factor,
yading@10 582 fc, MR_ENERGY,
yading@10 583 ctx->quant_energy,
yading@10 584 ma_prediction_coeff,
yading@10 585 SUBFRAME_SIZE, 4);
yading@10 586 #ifdef G729_BITEXACT
yading@10 587 /*
yading@10 588 This correction required to get bit-exact result with
yading@10 589 reference code, because gain_corr_factor in G.729D is
yading@10 590 two times larger than in original G.729.
yading@10 591
yading@10 592 If bit-exact result is not issue then gain_corr_factor
yading@10 593 can be simpler divided by 2 before call to g729_get_gain_code
yading@10 594 instead of using correction below.
yading@10 595 */
yading@10 596 if (packet_type == FORMAT_G729D_6K4) {
yading@10 597 gain_corr_factor >>= 1;
yading@10 598 ctx->past_gain_code[0] >>= 1;
yading@10 599 }
yading@10 600 #endif
yading@10 601 }
yading@10 602 ff_acelp_update_past_gain(ctx->quant_energy, gain_corr_factor, 2, frame_erasure);
yading@10 603
yading@10 604 /* Routine requires rounding to lowest. */
yading@10 605 ff_acelp_interpolate(ctx->exc + i * SUBFRAME_SIZE,
yading@10 606 ctx->exc + i * SUBFRAME_SIZE - pitch_delay_3x / 3,
yading@10 607 ff_acelp_interp_filter, 6,
yading@10 608 (pitch_delay_3x % 3) << 1,
yading@10 609 10, SUBFRAME_SIZE);
yading@10 610
yading@10 611 ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE,
yading@10 612 ctx->exc + i * SUBFRAME_SIZE, fc,
yading@10 613 (!ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_pitch[0],
yading@10 614 ( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0],
yading@10 615 1 << 13, 14, SUBFRAME_SIZE);
yading@10 616
yading@10 617 memcpy(synth, ctx->syn_filter_data, 10 * sizeof(int16_t));
yading@10 618
yading@10 619 if (ff_celp_lp_synthesis_filter(
yading@10 620 synth+10,
yading@10 621 &lp[i][1],
yading@10 622 ctx->exc + i * SUBFRAME_SIZE,
yading@10 623 SUBFRAME_SIZE,
yading@10 624 10,
yading@10 625 1,
yading@10 626 0,
yading@10 627 0x800))
yading@10 628 /* Overflow occurred, downscale excitation signal... */
yading@10 629 for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++)
yading@10 630 ctx->exc_base[j] >>= 2;
yading@10 631
yading@10 632 /* ... and make synthesis again. */
yading@10 633 if (packet_type == FORMAT_G729D_6K4) {
yading@10 634 int16_t exc_new[SUBFRAME_SIZE];
yading@10 635
yading@10 636 ctx->onset = g729d_onset_decision(ctx->onset, ctx->past_gain_code);
yading@10 637 ctx->voice_decision = g729d_voice_decision(ctx->onset, ctx->voice_decision, ctx->past_gain_pitch);
yading@10 638
yading@10 639 g729d_get_new_exc(exc_new, ctx->exc + i * SUBFRAME_SIZE, fc, ctx->voice_decision, ctx->past_gain_code[0], SUBFRAME_SIZE);
yading@10 640
yading@10 641 ff_celp_lp_synthesis_filter(
yading@10 642 synth+10,
yading@10 643 &lp[i][1],
yading@10 644 exc_new,
yading@10 645 SUBFRAME_SIZE,
yading@10 646 10,
yading@10 647 0,
yading@10 648 0,
yading@10 649 0x800);
yading@10 650 } else {
yading@10 651 ff_celp_lp_synthesis_filter(
yading@10 652 synth+10,
yading@10 653 &lp[i][1],
yading@10 654 ctx->exc + i * SUBFRAME_SIZE,
yading@10 655 SUBFRAME_SIZE,
yading@10 656 10,
yading@10 657 0,
yading@10 658 0,
yading@10 659 0x800);
yading@10 660 }
yading@10 661 /* Save data (without postfilter) for use in next subframe. */
yading@10 662 memcpy(ctx->syn_filter_data, synth+SUBFRAME_SIZE, 10 * sizeof(int16_t));
yading@10 663
yading@10 664 /* Calculate gain of unfiltered signal for use in AGC. */
yading@10 665 gain_before = 0;
yading@10 666 for (j = 0; j < SUBFRAME_SIZE; j++)
yading@10 667 gain_before += FFABS(synth[j+10]);
yading@10 668
yading@10 669 /* Call postfilter and also update voicing decision for use in next frame. */
yading@10 670 ff_g729_postfilter(
yading@10 671 &ctx->dsp,
yading@10 672 &ctx->ht_prev_data,
yading@10 673 &is_periodic,
yading@10 674 &lp[i][0],
yading@10 675 pitch_delay_int[0],
yading@10 676 ctx->residual,
yading@10 677 ctx->res_filter_data,
yading@10 678 ctx->pos_filter_data,
yading@10 679 synth+10,
yading@10 680 SUBFRAME_SIZE);
yading@10 681
yading@10 682 /* Calculate gain of filtered signal for use in AGC. */
yading@10 683 gain_after = 0;
yading@10 684 for(j=0; j<SUBFRAME_SIZE; j++)
yading@10 685 gain_after += FFABS(synth[j+10]);
yading@10 686
yading@10 687 ctx->gain_coeff = ff_g729_adaptive_gain_control(
yading@10 688 gain_before,
yading@10 689 gain_after,
yading@10 690 synth+10,
yading@10 691 SUBFRAME_SIZE,
yading@10 692 ctx->gain_coeff);
yading@10 693
yading@10 694 if (frame_erasure)
yading@10 695 ctx->pitch_delay_int_prev = FFMIN(ctx->pitch_delay_int_prev + 1, PITCH_DELAY_MAX);
yading@10 696 else
yading@10 697 ctx->pitch_delay_int_prev = pitch_delay_int[i];
yading@10 698
yading@10 699 memcpy(synth+8, ctx->hpf_z, 2*sizeof(int16_t));
yading@10 700 ff_acelp_high_pass_filter(
yading@10 701 out_frame + i*SUBFRAME_SIZE,
yading@10 702 ctx->hpf_f,
yading@10 703 synth+10,
yading@10 704 SUBFRAME_SIZE);
yading@10 705 memcpy(ctx->hpf_z, synth+8+SUBFRAME_SIZE, 2*sizeof(int16_t));
yading@10 706 }
yading@10 707
yading@10 708 ctx->was_periodic = is_periodic;
yading@10 709
yading@10 710 /* Save signal for use in next frame. */
yading@10 711 memmove(ctx->exc_base, ctx->exc_base + 2 * SUBFRAME_SIZE, (PITCH_DELAY_MAX+INTERPOL_LEN)*sizeof(int16_t));
yading@10 712
yading@10 713 *got_frame_ptr = 1;
yading@10 714 return buf_size;
yading@10 715 }
yading@10 716
yading@10 717 AVCodec ff_g729_decoder = {
yading@10 718 .name = "g729",
yading@10 719 .type = AVMEDIA_TYPE_AUDIO,
yading@10 720 .id = AV_CODEC_ID_G729,
yading@10 721 .priv_data_size = sizeof(G729Context),
yading@10 722 .init = decoder_init,
yading@10 723 .decode = decode_frame,
yading@10 724 .capabilities = CODEC_CAP_DR1,
yading@10 725 .long_name = NULL_IF_CONFIG_SMALL("G.729"),
yading@10 726 };