Browse Source

g723.1: make postfilter write directly to output buffer

Signed-off-by: Mans Rullgard <mans@mansr.com>
tags/n1.0
Mans Rullgard 13 years ago
parent
commit
f645710cf3
1 changed files with 11 additions and 11 deletions
  1. +11
    -11
      libavcodec/g723_1.c

+ 11
- 11
libavcodec/g723_1.c View File

@@ -922,9 +922,11 @@ static void gain_scale(G723_1_Context *p, int16_t * buf, int energy)
* *
* @param p the context * @param p the context
* @param lpc quantized lpc coefficients * @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]; int16_t filter_coef[2][LPC_ORDER];
int filter_signal[LPC_ORDER + FRAME_LEN], *signal_ptr; 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; buf += LPC_ORDER;
signal_ptr = filter_signal + LPC_ORDER; signal_ptr = filter_signal + LPC_ORDER;
for (i = 0; i < SUBFRAMES; i++) { for (i = 0; i < SUBFRAMES; i++) {
int16_t temp_vector[SUBFRAME_LEN];
int temp; int temp;
int auto_corr[2]; int auto_corr[2];
int scale, energy; int scale, energy;


/* Normalize */ /* Normalize */
scale = scale_vector(temp_vector, buf, SUBFRAME_LEN);
scale = scale_vector(dst, buf, SUBFRAME_LEN);


/* Compute auto correlation coefficients */ /* 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 */ /* Compute reflection coefficient */
temp = auto_corr[1] >> 16; 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 */ /* Compensation filter */
for (j = 0; j < SUBFRAME_LEN; j++) { 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; (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 } else
energy = auto_corr[1] >> temp; energy = auto_corr[1] >> temp;


gain_scale(p, buf, energy);
gain_scale(p, dst, energy);


buf += SUBFRAME_LEN; buf += SUBFRAME_LEN;
signal_ptr += 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)); memcpy(p->synth_mem, p->audio + FRAME_LEN, LPC_ORDER * sizeof(*p->audio));


if (p->postfilter) { 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 } else { // if output is not postfiltered it should be scaled by 2
for (i = 0; i < FRAME_LEN; i++) for (i = 0; i < FRAME_LEN; i++)
out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1); out[i] = av_clip_int16(p->audio[LPC_ORDER + i] << 1);


Loading…
Cancel
Save