avcodec/g723_1enc: Fix undefined left-shifts of negative numbers

Affected the acodec-g723_1 FATE-test.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2022-09-28 19:23:38 +02:00
parent e47f3e366b
commit e95fdf7660
1 changed files with 35 additions and 36 deletions

View File

@ -126,7 +126,7 @@ static void highpass_filter(int16_t *buf, int16_t *fir, int *iir)
{ {
int i; int i;
for (i = 0; i < FRAME_LEN; i++) { for (i = 0; i < FRAME_LEN; i++) {
*iir = (buf[i] << 15) + ((-*fir) << 15) + MULL2(*iir, 0x7f00); *iir = (buf[i] - *fir) * (1 << 15) + MULL2(*iir, 0x7f00);
*fir = buf[i]; *fir = buf[i];
buf[i] = av_clipl_int32((int64_t)*iir + (1 << 15)) >> 16; buf[i] = av_clipl_int32((int64_t)*iir + (1 << 15)) >> 16;
} }
@ -166,7 +166,7 @@ static void comp_autocorr(int16_t *buf, int16_t *autocorr)
} else { } else {
for (i = 1; i <= LPC_ORDER; i++) { for (i = 1; i <= LPC_ORDER; i++) {
temp = ff_dot_product(vector, vector + i, LPC_FRAME - i); temp = ff_dot_product(vector, vector + i, LPC_FRAME - i);
temp = MULL2((temp << scale), binomial_window[i - 1]); temp = MULL2(temp * (1 << scale), binomial_window[i - 1]);
autocorr[i] = av_clipl_int32((int64_t) temp + (1 << 15)) >> 16; autocorr[i] = av_clipl_int32((int64_t) temp + (1 << 15)) >> 16;
} }
} }
@ -193,7 +193,7 @@ static void levinson_durbin(int16_t *lpc, int16_t *autocorr, int16_t error)
temp = 0; temp = 0;
for (j = 0; j < i; j++) for (j = 0; j < i; j++)
temp -= lpc[j] * autocorr[i - j - 1]; temp -= lpc[j] * autocorr[i - j - 1];
temp = ((autocorr[i] << 13) + temp) << 3; temp = (autocorr[i] * (1 << 13) + temp) * (1 << 3);
if (FFABS(temp) >= (error << 16)) if (FFABS(temp) >= (error << 16))
break; break;
@ -209,8 +209,8 @@ static void levinson_durbin(int16_t *lpc, int16_t *autocorr, int16_t error)
memcpy(vector, lpc, i * sizeof(int16_t)); memcpy(vector, lpc, i * sizeof(int16_t));
for (j = 0; j < i; j++) { for (j = 0; j < i; j++) {
temp = partial_corr * vector[i - j - 1] << 1; temp = partial_corr * vector[i - j - 1] * 2;
lpc[j] = av_clipl_int32((int64_t) (lpc[j] << 16) - temp + lpc[j] = av_clipl_int32((int64_t) (lpc[j] * (1 << 16)) - temp +
(1 << 15)) >> 16; (1 << 15)) >> 16;
} }
} }
@ -259,9 +259,9 @@ static void lpc2lsp(int16_t *lpc, int16_t *prev_lsp, int16_t *lsp)
/* Compute the remaining coefficients */ /* Compute the remaining coefficients */
for (i = 0; i < LPC_ORDER / 2; i++) { for (i = 0; i < LPC_ORDER / 2; i++) {
/* f1 */ /* f1 */
f[2 * i + 2] = -f[2 * i] - ((lsp[i] + lsp[LPC_ORDER - 1 - i]) << 12); f[2 * i + 2] = -f[2 * i] - (lsp[i] + lsp[LPC_ORDER - 1 - i]) * (1 << 12);
/* f2 */ /* f2 */
f[2 * i + 3] = f[2 * i + 1] - ((lsp[i] - lsp[LPC_ORDER - 1 - i]) << 12); f[2 * i + 3] = f[2 * i + 1] - (lsp[i] - lsp[LPC_ORDER - 1 - i]) * (1 << 12);
} }
/* Divide f1[5] and f2[5] by 2 for use in polynomial evaluation */ /* Divide f1[5] and f2[5] by 2 for use in polynomial evaluation */
@ -276,7 +276,7 @@ static void lpc2lsp(int16_t *lpc, int16_t *prev_lsp, int16_t *lsp)
shift = ff_g723_1_normalize_bits(max, 31); shift = ff_g723_1_normalize_bits(max, 31);
for (i = 0; i < LPC_ORDER + 2; i++) for (i = 0; i < LPC_ORDER + 2; i++)
f[i] = av_clipl_int32((int64_t) (f[i] << shift) + (1 << 15)) >> 16; f[i] = av_clipl_int32((int64_t) (f[i] * (1 << shift)) + (1 << 15)) >> 16;
/** /**
* Evaluate F1 and F2 at uniform intervals of pi/256 along the * Evaluate F1 and F2 at uniform intervals of pi/256 along the
@ -293,7 +293,7 @@ static void lpc2lsp(int16_t *lpc, int16_t *prev_lsp, int16_t *lsp)
temp = 0; temp = 0;
for (j = 0; j <= LPC_ORDER / 2; j++) for (j = 0; j <= LPC_ORDER / 2; j++)
temp += f[LPC_ORDER - 2 * j + p] * ff_g723_1_cos_tab[i * j % COS_TBL_SIZE]; temp += f[LPC_ORDER - 2 * j + p] * ff_g723_1_cos_tab[i * j % COS_TBL_SIZE];
cur_val = av_clipl_int32(temp << 1); cur_val = av_clipl_int32(temp * 2);
/* Check for sign change, indicating a zero crossing */ /* Check for sign change, indicating a zero crossing */
if ((cur_val ^ prev_val) < 0) { if ((cur_val ^ prev_val) < 0) {
@ -317,7 +317,7 @@ static void lpc2lsp(int16_t *lpc, int16_t *prev_lsp, int16_t *lsp)
for (j = 0; j <= LPC_ORDER / 2; j++) for (j = 0; j <= LPC_ORDER / 2; j++)
temp += f[LPC_ORDER - 2 * j + p] * temp += f[LPC_ORDER - 2 * j + p] *
ff_g723_1_cos_tab[i * j % COS_TBL_SIZE]; ff_g723_1_cos_tab[i * j % COS_TBL_SIZE];
cur_val = av_clipl_int32(temp << 1); cur_val = av_clipl_int32(temp * 2);
} }
prev_val = cur_val; prev_val = cur_val;
} }
@ -344,7 +344,7 @@ static void lpc2lsp(int16_t *lpc, int16_t *prev_lsp, int16_t *lsp)
temp[j] = (weight[j + (offset)] * ff_g723_1_lsp_band##num[i][j] + \ temp[j] = (weight[j + (offset)] * ff_g723_1_lsp_band##num[i][j] + \
(1 << 14)) >> 15; \ (1 << 14)) >> 15; \
} \ } \
error = ff_g723_1_dot_product(lsp + (offset), temp, size) << 1; \ error = ff_g723_1_dot_product(lsp + (offset), temp, size) * 2; \
error -= ff_g723_1_dot_product(ff_g723_1_lsp_band##num[i], temp, size); \ error -= ff_g723_1_dot_product(ff_g723_1_lsp_band##num[i], temp, size); \
if (error > max) { \ if (error > max) { \
max = error; \ max = error; \
@ -419,7 +419,7 @@ static void iir_filter(int16_t *fir_coef, int16_t *iir_coef,
iir_coef[n - 1] * dest[m - n]; iir_coef[n - 1] * dest[m - n];
} }
dest[m] = av_clipl_int32((src[m] << 16) + (filter << 3) + dest[m] = av_clipl_int32(src[m] * (1 << 16) + filter * (1 << 3) +
(1 << 15)) >> 16; (1 << 15)) >> 16;
} }
} }
@ -559,7 +559,7 @@ static void comp_harmonic_coeff(int16_t *buf, int16_t pitch_lag, HFParam *hf)
exp = ff_g723_1_normalize_bits(max, 31); exp = ff_g723_1_normalize_bits(max, 31);
for (i = 0; i < 15; i++) { for (i = 0; i < 15; i++) {
energy[i] = av_clipl_int32((int64_t)(energy[i] << exp) + energy[i] = av_clipl_int32((int64_t)(energy[i] * (1 << exp)) +
(1 << 15)) >> 16; (1 << 15)) >> 16;
} }
@ -613,8 +613,8 @@ static void harmonic_filter(HFParam *hf, const int16_t *src, int16_t *dest)
int i; int i;
for (i = 0; i < SUBFRAME_LEN; i++) { for (i = 0; i < SUBFRAME_LEN; i++) {
int64_t temp = hf->gain * src[i - hf->index] << 1; int64_t temp = hf->gain * src[i - hf->index] * 2;
dest[i] = av_clipl_int32((src[i] << 16) - temp + (1 << 15)) >> 16; dest[i] = av_clipl_int32(src[i] * (1 << 16) - temp + (1 << 15)) >> 16;
} }
} }
@ -622,8 +622,8 @@ static void harmonic_noise_sub(HFParam *hf, const int16_t *src, int16_t *dest)
{ {
int i; int i;
for (i = 0; i < SUBFRAME_LEN; i++) { for (i = 0; i < SUBFRAME_LEN; i++) {
int64_t temp = hf->gain * src[i - hf->index] << 1; int64_t temp = hf->gain * src[i - hf->index] * 2;
dest[i] = av_clipl_int32(((dest[i] - src[i]) << 16) + temp + dest[i] = av_clipl_int32((dest[i] - src[i]) * (1 << 16) + temp +
(1 << 15)) >> 16; (1 << 15)) >> 16;
} }
} }
@ -655,7 +655,7 @@ static void synth_percept_filter(int16_t *qnt_lpc, int16_t *perf_lpc,
for (j = 1; j <= LPC_ORDER; j++) for (j = 1; j <= LPC_ORDER; j++)
temp -= qnt_lpc[j - 1] * bptr_16[i - j]; temp -= qnt_lpc[j - 1] * bptr_16[i - j];
buf[i] = (src[i] << 15) + (temp << 3); buf[i] = src[i] * (1 << 15) + temp * (1 << 3);
bptr_16[i] = av_clipl_int32(buf[i] + (1 << 15)) >> 16; bptr_16[i] = av_clipl_int32(buf[i] + (1 << 15)) >> 16;
} }
@ -665,7 +665,7 @@ static void synth_percept_filter(int16_t *qnt_lpc, int16_t *perf_lpc,
fir -= perf_lpc[j - 1] * bptr_16[i - j]; fir -= perf_lpc[j - 1] * bptr_16[i - j];
iir += perf_lpc[j + LPC_ORDER - 1] * dest[i - j]; iir += perf_lpc[j + LPC_ORDER - 1] * dest[i - j];
} }
dest[i] = av_clipl_int32(((buf[i] + (fir << 3)) << scale) + (iir << 3) + dest[i] = av_clipl_int32((buf[i] + fir * (1 << 3)) * (1 << scale) + iir * (1 << 3) +
(1 << 15)) >> 16; (1 << 15)) >> 16;
} }
memcpy(perf_fir, buf_16 + SUBFRAME_LEN, sizeof(int16_t) * LPC_ORDER); memcpy(perf_fir, buf_16 + SUBFRAME_LEN, sizeof(int16_t) * LPC_ORDER);
@ -714,23 +714,22 @@ static void acb_search(G723_1_ChannelContext *p, int16_t *residual,
temp = 0; temp = 0;
for (k = 0; k <= j; k++) for (k = 0; k <= j; k++)
temp += residual[PITCH_ORDER - 1 + k] * impulse_resp[j - k]; temp += residual[PITCH_ORDER - 1 + k] * impulse_resp[j - k];
flt_buf[PITCH_ORDER - 1][j] = av_clipl_int32((temp << 1) + flt_buf[PITCH_ORDER - 1][j] = av_clipl_int32(temp * 2 + (1 << 15)) >> 16;
(1 << 15)) >> 16;
} }
for (j = PITCH_ORDER - 2; j >= 0; j--) { for (j = PITCH_ORDER - 2; j >= 0; j--) {
flt_buf[j][0] = ((residual[j] << 13) + (1 << 14)) >> 15; flt_buf[j][0] = (residual[j] + (1 << 1)) >> 2;
for (k = 1; k < SUBFRAME_LEN; k++) { for (k = 1; k < SUBFRAME_LEN; k++) {
temp = (flt_buf[j + 1][k - 1] << 15) + temp = flt_buf[j + 1][k - 1] * (1 << 15) +
residual[j] * impulse_resp[k]; residual[j] * impulse_resp[k];
flt_buf[j][k] = av_clipl_int32((temp << 1) + (1 << 15)) >> 16; flt_buf[j][k] = av_clipl_int32(temp * 2 + (1 << 15)) >> 16;
} }
} }
/* Compute crosscorrelation with the signal */ /* Compute crosscorrelation with the signal */
for (j = 0; j < PITCH_ORDER; j++) { for (j = 0; j < PITCH_ORDER; j++) {
temp = ff_dot_product(buf, flt_buf[j], SUBFRAME_LEN); temp = ff_dot_product(buf, flt_buf[j], SUBFRAME_LEN);
ccr_buf[count++] = av_clipl_int32(temp << 1); ccr_buf[count++] = av_clipl_int32(temp * 2);
} }
/* Compute energies */ /* Compute energies */
@ -742,7 +741,7 @@ static void acb_search(G723_1_ChannelContext *p, int16_t *residual,
for (j = 1; j < PITCH_ORDER; j++) { for (j = 1; j < PITCH_ORDER; j++) {
for (k = 0; k < j; k++) { for (k = 0; k < j; k++) {
temp = ff_dot_product(flt_buf[j], flt_buf[k], SUBFRAME_LEN); temp = ff_dot_product(flt_buf[j], flt_buf[k], SUBFRAME_LEN);
ccr_buf[count++] = av_clipl_int32(temp << 2); ccr_buf[count++] = av_clipl_int32(temp * (1 << 2));
} }
} }
} }
@ -755,7 +754,7 @@ static void acb_search(G723_1_ChannelContext *p, int16_t *residual,
temp = ff_g723_1_normalize_bits(max, 31); temp = ff_g723_1_normalize_bits(max, 31);
for (i = 0; i < 20 * iter; i++) for (i = 0; i < 20 * iter; i++)
ccr_buf[i] = av_clipl_int32((int64_t) (ccr_buf[i] << temp) + ccr_buf[i] = av_clipl_int32((int64_t) (ccr_buf[i] * (1 << temp)) +
(1 << 15)) >> 16; (1 << 15)) >> 16;
max = 0; max = 0;
@ -803,11 +802,11 @@ static void sub_acb_contrib(const int16_t *residual, const int16_t *impulse_resp
int i, j; int i, j;
/* Subtract adaptive CB contribution to obtain the residual */ /* Subtract adaptive CB contribution to obtain the residual */
for (i = 0; i < SUBFRAME_LEN; i++) { for (i = 0; i < SUBFRAME_LEN; i++) {
int64_t temp = buf[i] << 14; int64_t temp = buf[i] * (1 << 14);
for (j = 0; j <= i; j++) for (j = 0; j <= i; j++)
temp -= residual[j] * impulse_resp[i - j]; temp -= residual[j] * impulse_resp[i - j];
buf[i] = av_clipl_int32((temp << 2) + (1 << 15)) >> 16; buf[i] = av_clipl_int32(temp * (1 << 2) + (1 << 15)) >> 16;
} }
} }
@ -851,7 +850,7 @@ static void get_fcb_param(FCBParam *optim, int16_t *impulse_resp,
for (i = 1; i < SUBFRAME_LEN; i++) { for (i = 1; i < SUBFRAME_LEN; i++) {
temp = ff_g723_1_dot_product(temp_corr + i, temp_corr, temp = ff_g723_1_dot_product(temp_corr + i, temp_corr,
SUBFRAME_LEN - i); SUBFRAME_LEN - i);
impulse_corr[i] = av_clipl_int32((temp << scale) + (1 << 15)) >> 16; impulse_corr[i] = av_clipl_int32(temp * (1 << scale) + (1 << 15)) >> 16;
} }
/* Compute crosscorrelation of impulse response with residual signal */ /* Compute crosscorrelation of impulse response with residual signal */
@ -861,7 +860,7 @@ static void get_fcb_param(FCBParam *optim, int16_t *impulse_resp,
if (scale < 0) if (scale < 0)
ccr1[i] = temp >> -scale; ccr1[i] = temp >> -scale;
else else
ccr1[i] = av_clipl_int32(temp << scale); ccr1[i] = av_clipl_int32(temp * (1 << scale));
} }
/* Search loop */ /* Search loop */
@ -910,7 +909,7 @@ static void get_fcb_param(FCBParam *optim, int16_t *impulse_resp,
continue; continue;
temp = impulse_corr[FFABS(l - param.pulse_pos[k - 1])]; temp = impulse_corr[FFABS(l - param.pulse_pos[k - 1])];
temp = av_clipl_int32((int64_t) temp * temp = av_clipl_int32((int64_t) temp *
param.pulse_sign[k - 1] << 1); param.pulse_sign[k - 1] * 2);
ccr2[l] -= temp; ccr2[l] -= temp;
temp = FFABS(ccr2[l]); temp = FFABS(ccr2[l]);
if (temp > max) { if (temp > max) {
@ -934,17 +933,17 @@ static void get_fcb_param(FCBParam *optim, int16_t *impulse_resp,
temp = 0; temp = 0;
for (l = 0; l <= k; l++) { for (l = 0; l <= k; l++) {
int prod = av_clipl_int32((int64_t) temp_corr[l] * int prod = av_clipl_int32((int64_t) temp_corr[l] *
impulse_r[k - l] << 1); impulse_r[k - l] * 2);
temp = av_clipl_int32(temp + prod); temp = av_clipl_int32(temp + prod);
} }
temp_corr[k] = temp << 2 >> 16; temp_corr[k] = temp >> 14;
} }
/* Compute square of error */ /* Compute square of error */
err = 0; err = 0;
for (k = 0; k < SUBFRAME_LEN; k++) { for (k = 0; k < SUBFRAME_LEN; k++) {
int64_t prod; int64_t prod;
prod = av_clipl_int32((int64_t) buf[k] * temp_corr[k] << 1); prod = av_clipl_int32((int64_t) buf[k] * temp_corr[k] * 2);
err = av_clipl_int32(err - prod); err = av_clipl_int32(err - prod);
prod = av_clipl_int32((int64_t) temp_corr[k] * temp_corr[k]); prod = av_clipl_int32((int64_t) temp_corr[k] * temp_corr[k]);
err = av_clipl_int32(err + prod); err = av_clipl_int32(err + prod);
@ -1204,7 +1203,7 @@ static int g723_1_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
memmove(p->prev_excitation, p->prev_excitation + SUBFRAME_LEN, memmove(p->prev_excitation, p->prev_excitation + SUBFRAME_LEN,
sizeof(int16_t) * (PITCH_MAX - SUBFRAME_LEN)); sizeof(int16_t) * (PITCH_MAX - SUBFRAME_LEN));
for (j = 0; j < SUBFRAME_LEN; j++) for (j = 0; j < SUBFRAME_LEN; j++)
in[j] = av_clip_int16((in[j] << 1) + impulse_resp[j]); in[j] = av_clip_int16(in[j] * 2 + impulse_resp[j]);
memcpy(p->prev_excitation + PITCH_MAX - SUBFRAME_LEN, in, memcpy(p->prev_excitation + PITCH_MAX - SUBFRAME_LEN, in,
sizeof(int16_t) * SUBFRAME_LEN); sizeof(int16_t) * SUBFRAME_LEN);