#include "avcodec.h"
#include "celp_filters.h"
+#include "libavutil/common.h"
void ff_celp_convolve_circ(int16_t* fc_out, const int16_t* fc_in,
const int16_t* filter, int len)
int i,n;
for (n = 0; n < buffer_length; n++) {
- int sum = rounder;
+ int sum = -rounder, sum1;
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]) >> shift;
+ sum1 = ((-sum >> 12) + in[n]) >> shift;
+ sum = av_clip_int16(sum1);
+
+ if (stop_on_overflow && sum != sum1)
+ return 1;
- if (sum + 0x8000 > 0xFFFFU) {
- if (stop_on_overflow)
- return 1;
- sum = (sum >> 31) ^ 32767;
- }
out[n] = sum;
}