From: Mans Rullgard Date: Sat, 11 Aug 2012 21:26:38 +0000 (+0100) Subject: g723.1: make postfilter write directly to output buffer X-Git-Tag: v9_beta1~691 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f645710cf31f6268fbf279f4515e6012dcd11ac2;p=platform%2Fupstream%2Flibav.git g723.1: make postfilter write directly to output buffer Signed-off-by: Mans Rullgard --- diff --git a/libavcodec/g723_1.c b/libavcodec/g723_1.c index a2f7dee..c980ec2 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);