diff options
author | Mans Rullgard <mans@mansr.com> | 2012-08-11 22:26:38 +0100 |
---|---|---|
committer | Mans Rullgard <mans@mansr.com> | 2012-08-13 01:03:25 +0100 |
commit | f645710cf31f6268fbf279f4515e6012dcd11ac2 (patch) | |
tree | 1d6ebf286c805be2a408e6a9aa68153d71e396d8 | |
parent | 1953264331ec653bff2e3d85391b91c0ea5299ae (diff) | |
download | ffmpeg-f645710cf31f6268fbf279f4515e6012dcd11ac2.tar.gz |
g723.1: make postfilter write directly to output buffer
Signed-off-by: Mans Rullgard <mans@mansr.com>
-rw-r--r-- | libavcodec/g723_1.c | 22 |
1 files changed, 11 insertions, 11 deletions
diff --git a/libavcodec/g723_1.c b/libavcodec/g723_1.c index a2f7dee4f4..c980ec2f50 100644 --- a/libavcodec/g723_1.c +++ b/libavcodec/g723_1.c @@ -922,9 +922,11 @@ static void gain_scale(G723_1_Context *p, int16_t * buf, int energy) * * @param p the context * @param lpc quantized lpc coefficients - * @param buf output buffer + * @param buf input buffer + * @param dst output buffer */ -static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf) +static void formant_postfilter(G723_1_Context *p, int16_t *lpc, + int16_t *buf, int16_t *dst) { int16_t filter_coef[2][LPC_ORDER]; int filter_signal[LPC_ORDER + FRAME_LEN], *signal_ptr; @@ -952,18 +954,16 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf) buf += LPC_ORDER; signal_ptr = filter_signal + LPC_ORDER; for (i = 0; i < SUBFRAMES; i++) { - int16_t temp_vector[SUBFRAME_LEN]; int temp; int auto_corr[2]; int scale, energy; /* Normalize */ - scale = scale_vector(temp_vector, buf, SUBFRAME_LEN); + scale = scale_vector(dst, buf, SUBFRAME_LEN); /* Compute auto correlation coefficients */ - auto_corr[0] = dot_product(temp_vector, temp_vector + 1, - SUBFRAME_LEN - 1); - auto_corr[1] = dot_product(temp_vector, temp_vector, SUBFRAME_LEN); + auto_corr[0] = dot_product(dst, dst + 1, SUBFRAME_LEN - 1); + auto_corr[1] = dot_product(dst, dst, SUBFRAME_LEN); /* Compute reflection coefficient */ temp = auto_corr[1] >> 16; @@ -975,7 +975,7 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf) /* Compensation filter */ for (j = 0; j < SUBFRAME_LEN; j++) { - buf[j] = av_sat_dadd32(signal_ptr[j], + dst[j] = av_sat_dadd32(signal_ptr[j], (signal_ptr[j - 1] >> 16) * temp) >> 16; } @@ -986,10 +986,11 @@ static void formant_postfilter(G723_1_Context *p, int16_t *lpc, int16_t *buf) } else energy = auto_corr[1] >> temp; - gain_scale(p, buf, energy); + gain_scale(p, dst, energy); buf += SUBFRAME_LEN; signal_ptr += SUBFRAME_LEN; + dst += SUBFRAME_LEN; } } @@ -1136,8 +1137,7 @@ static int g723_1_decode_frame(AVCodecContext *avctx, void *data, memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio)); if (p->postfilter) { - formant_postfilter(p, lpc, p->audio); - memcpy(p->frame.data[0], p->audio + LPC_ORDER, FRAME_LEN * 2); + formant_postfilter(p, lpc, p->audio, out); } else { // if output is not postfiltered it should be scaled by 2 for (i = 0; i < FRAME_LEN; i++) out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1); |