|
|
|
@ -111,11 +111,11 @@ typedef struct { |
|
|
|
|
|
|
|
|
|
int16_t quant_energy[4]; ///< (5.10) past quantized energy
|
|
|
|
|
|
|
|
|
|
/// (1.14) pitch gain of previous subframe
|
|
|
|
|
int16_t gain_pitch; |
|
|
|
|
/// (1.14) pitch gain of current and five previous subframes
|
|
|
|
|
int16_t past_gain_pitch[6]; |
|
|
|
|
|
|
|
|
|
/// (14.1) gain code from previous subframe
|
|
|
|
|
int16_t gain_code; |
|
|
|
|
/// (14.1) gain code from current and previous subframe
|
|
|
|
|
int16_t past_gain_code[2]; |
|
|
|
|
|
|
|
|
|
int16_t was_periodic; ///< whether previous frame was declared as periodic or not (4.4)
|
|
|
|
|
uint16_t rand_value; ///< random number generator value (4.4.4)
|
|
|
|
@ -406,23 +406,26 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
|
ff_acelp_weighted_vector_sum(fc + pitch_delay_int, |
|
|
|
|
fc + pitch_delay_int, |
|
|
|
|
fc, 1 << 14, |
|
|
|
|
av_clip(ctx->gain_pitch, SHARP_MIN, SHARP_MAX), |
|
|
|
|
av_clip(ctx->past_gain_pitch[0], SHARP_MIN, SHARP_MAX), |
|
|
|
|
0, 14, |
|
|
|
|
SUBFRAME_SIZE - pitch_delay_int); |
|
|
|
|
|
|
|
|
|
memmove(ctx->past_gain_pitch+1, ctx->past_gain_pitch, 5 * sizeof(int16_t)); |
|
|
|
|
ctx->past_gain_code[1] = ctx->past_gain_code[0]; |
|
|
|
|
|
|
|
|
|
if (frame_erasure) { |
|
|
|
|
ctx->gain_pitch = (29491 * ctx->gain_pitch) >> 15; // 0.90 (0.15)
|
|
|
|
|
ctx->gain_code = ( 2007 * ctx->gain_code ) >> 11; // 0.98 (0.11)
|
|
|
|
|
ctx->past_gain_pitch[0] = (29491 * ctx->past_gain_pitch[0]) >> 15; // 0.90 (0.15)
|
|
|
|
|
ctx->past_gain_code[0] = ( 2007 * ctx->past_gain_code[0] ) >> 11; // 0.98 (0.11)
|
|
|
|
|
|
|
|
|
|
gain_corr_factor = 0; |
|
|
|
|
} else { |
|
|
|
|
ctx->gain_pitch = cb_gain_1st_8k[gc_1st_index][0] + |
|
|
|
|
cb_gain_2nd_8k[gc_2nd_index][0]; |
|
|
|
|
ctx->past_gain_pitch[0] = cb_gain_1st_8k[gc_1st_index][0] + |
|
|
|
|
cb_gain_2nd_8k[gc_2nd_index][0]; |
|
|
|
|
gain_corr_factor = cb_gain_1st_8k[gc_1st_index][1] + |
|
|
|
|
cb_gain_2nd_8k[gc_2nd_index][1]; |
|
|
|
|
|
|
|
|
|
/* Decode the fixed-codebook gain. */ |
|
|
|
|
ctx->gain_code = ff_acelp_decode_gain_code(&ctx->dsp, gain_corr_factor, |
|
|
|
|
ctx->past_gain_code[0] = ff_acelp_decode_gain_code(&ctx->dsp, gain_corr_factor, |
|
|
|
|
fc, MR_ENERGY, |
|
|
|
|
ctx->quant_energy, |
|
|
|
|
ma_prediction_coeff, |
|
|
|
@ -439,8 +442,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, |
|
|
|
|
|
|
|
|
|
ff_acelp_weighted_vector_sum(ctx->exc + i * SUBFRAME_SIZE, |
|
|
|
|
ctx->exc + i * SUBFRAME_SIZE, fc, |
|
|
|
|
(!ctx->was_periodic && frame_erasure) ? 0 : ctx->gain_pitch, |
|
|
|
|
( ctx->was_periodic && frame_erasure) ? 0 : ctx->gain_code, |
|
|
|
|
(!ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_pitch[0], |
|
|
|
|
( ctx->was_periodic && frame_erasure) ? 0 : ctx->past_gain_code[0], |
|
|
|
|
1 << 13, 14, SUBFRAME_SIZE); |
|
|
|
|
|
|
|
|
|
if (frame_erasure) |
|
|
|
|