aboutsummaryrefslogtreecommitdiff
path: root/libavcodec/g723_1.c
diff options
context:
space:
mode:
authorMans Rullgard2012-08-11 22:26:38 +0100
committerMans Rullgard2012-08-13 01:03:25 +0100
commitf645710cf31f6268fbf279f4515e6012dcd11ac2 (patch)
tree1d6ebf286c805be2a408e6a9aa68153d71e396d8 /libavcodec/g723_1.c
parent1953264331ec653bff2e3d85391b91c0ea5299ae (diff)
g723.1: make postfilter write directly to output buffer
Signed-off-by: Mans Rullgard <mans@mansr.com>
Diffstat (limited to 'libavcodec/g723_1.c')
-rw-r--r--libavcodec/g723_1.c22
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);