@@ -58,7 +58,7 @@ void ff_celp_circ_addf(float *out, const float *in, | |||||
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, | int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, | ||||
const int16_t *in, int buffer_length, | const int16_t *in, int buffer_length, | ||||
int filter_length, int stop_on_overflow, | int filter_length, int stop_on_overflow, | ||||
int rounder) | |||||
int shift, int rounder) | |||||
{ | { | ||||
int i,n; | int i,n; | ||||
@@ -67,7 +67,7 @@ int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, | |||||
for (i = 1; i <= filter_length; i++) | for (i = 1; i <= filter_length; i++) | ||||
sum -= filter_coeffs[i-1] * out[n-i]; | sum -= filter_coeffs[i-1] * out[n-i]; | ||||
sum = (sum >> 12) + in[n]; | |||||
sum = ((sum >> 12) + in[n]) >> shift; | |||||
if (sum + 0x8000 > 0xFFFFU) { | if (sum + 0x8000 > 0xFFFFU) { | ||||
if (stop_on_overflow) | if (stop_on_overflow) | ||||
@@ -63,6 +63,7 @@ void ff_celp_circ_addf(float *out, const float *in, | |||||
* @param filter_length filter length (10 for 10th order LP filter) | * @param filter_length filter length (10 for 10th order LP filter) | ||||
* @param stop_on_overflow 1 - return immediately if overflow occurs | * @param stop_on_overflow 1 - return immediately if overflow occurs | ||||
* 0 - ignore overflows | * 0 - ignore overflows | ||||
* @param shift the result is shifted right by this value | |||||
* @param rounder the amount to add for rounding (usually 0x800 or 0xfff) | * @param rounder the amount to add for rounding (usually 0x800 or 0xfff) | ||||
* | * | ||||
* @return 1 if overflow occurred, 0 - otherwise | * @return 1 if overflow occurred, 0 - otherwise | ||||
@@ -75,7 +76,7 @@ void ff_celp_circ_addf(float *out, const float *in, | |||||
int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, | int ff_celp_lp_synthesis_filter(int16_t *out, const int16_t *filter_coeffs, | ||||
const int16_t *in, int buffer_length, | const int16_t *in, int buffer_length, | ||||
int filter_length, int stop_on_overflow, | int filter_length, int stop_on_overflow, | ||||
int rounder); | |||||
int shift, int rounder); | |||||
/** | /** | ||||
* LP synthesis filter. | * LP synthesis filter. | ||||
@@ -604,6 +604,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
SUBFRAME_SIZE, | SUBFRAME_SIZE, | ||||
10, | 10, | ||||
1, | 1, | ||||
0, | |||||
0x800)) | 0x800)) | ||||
/* Overflow occured, downscale excitation signal... */ | /* Overflow occured, downscale excitation signal... */ | ||||
for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++) | for (j = 0; j < 2 * SUBFRAME_SIZE + PITCH_DELAY_MAX + INTERPOL_LEN; j++) | ||||
@@ -625,6 +626,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
SUBFRAME_SIZE, | SUBFRAME_SIZE, | ||||
10, | 10, | ||||
0, | 0, | ||||
0, | |||||
0x800); | 0x800); | ||||
} else { | } else { | ||||
ff_celp_lp_synthesis_filter( | ff_celp_lp_synthesis_filter( | ||||
@@ -634,6 +636,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||||
SUBFRAME_SIZE, | SUBFRAME_SIZE, | ||||
10, | 10, | ||||
0, | 0, | ||||
0, | |||||
0x800); | 0x800); | ||||
} | } | ||||
/* Save data (without postfilter) for use in next subframe. */ | /* Save data (without postfilter) for use in next subframe. */ | ||||
@@ -433,7 +433,7 @@ static int16_t get_tilt_comp(DSPContext *dsp, int16_t *lp_gn, | |||||
lp_gn[10] = 4096; //1.0 in (3.12) | lp_gn[10] = 4096; //1.0 in (3.12) | ||||
/* Apply 1/A(z/FORMANT_PP_FACTOR_DEN) filter to hf. */ | /* Apply 1/A(z/FORMANT_PP_FACTOR_DEN) filter to hf. */ | ||||
ff_celp_lp_synthesis_filter(lp_gn + 11, lp_gd + 1, lp_gn + 11, 22, 10, 0, 0x800); | |||||
ff_celp_lp_synthesis_filter(lp_gn + 11, lp_gd + 1, lp_gn + 11, 22, 10, 0, 0, 0x800); | |||||
/* Now lp_gn (starting with 10) contains impulse response | /* Now lp_gn (starting with 10) contains impulse response | ||||
of A(z/FORMANT_PP_FACTOR_NUM)/A(z/FORMANT_PP_FACTOR_DEN) filter. */ | of A(z/FORMANT_PP_FACTOR_NUM)/A(z/FORMANT_PP_FACTOR_DEN) filter. */ | ||||
@@ -554,7 +554,7 @@ void ff_g729_postfilter(DSPContext *dsp, int16_t* ht_prev_data, int* voicing, | |||||
/* Apply second half of short-term postfilter: 1/A(z/FORMANT_PP_FACTOR_DEN) */ | /* Apply second half of short-term postfilter: 1/A(z/FORMANT_PP_FACTOR_DEN) */ | ||||
ff_celp_lp_synthesis_filter(pos_filter_data + 10, lp_gd + 1, | ff_celp_lp_synthesis_filter(pos_filter_data + 10, lp_gd + 1, | ||||
residual_filt_buf + 10, | residual_filt_buf + 10, | ||||
subframe_size, 10, 0, 0x800); | |||||
subframe_size, 10, 0, 0, 0x800); | |||||
memcpy(pos_filter_data, pos_filter_data + subframe_size, 10 * sizeof(int16_t)); | memcpy(pos_filter_data, pos_filter_data + subframe_size, 10 * sizeof(int16_t)); | ||||
*ht_prev_data = apply_tilt_comp(speech, pos_filter_data + 10, tilt_comp_coeff, | *ht_prev_data = apply_tilt_comp(speech, pos_filter_data + 10, tilt_comp_coeff, | ||||
@@ -1715,6 +1715,6 @@ void ff_subblock_synthesis(RA144Context *ractx, const uint16_t *lpc_coefs, | |||||
10*sizeof(*ractx->curr_sblock)); | 10*sizeof(*ractx->curr_sblock)); | ||||
if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs, | if (ff_celp_lp_synthesis_filter(ractx->curr_sblock + 10, lpc_coefs, | ||||
block, BLOCKSIZE, 10, 1, 0xfff)) | |||||
block, BLOCKSIZE, 10, 1, 0, 0xfff)) | |||||
memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock)); | memset(ractx->curr_sblock, 0, 50*sizeof(*ractx->curr_sblock)); | ||||
} | } |