mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-14 00:58:38 +02:00
Add a shift parameter to celp_lp_synthesis_filter for reuse by the G.723.1 decoder
This commit is contained in:
parent
ecf31a68fd
commit
bcc67dffa0
@ -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));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user