66 static void *speex_alloc(
int size) {
return calloc(size,1);}
67 static void *speex_realloc(
void *ptr,
int size) {
return realloc(ptr, size);}
68 static void speex_free(
void *ptr) {free(ptr);}
76 #include "speex/speex_resampler.h"
78 #include "os_support.h"
85 #define M_PI 3.14159265358979323846
88 #define IMAX(a,b) ((a) > (b) ? (a) : (b))
89 #define IMIN(a,b) ((a) < (b) ? (a) : (b))
96 #define UINT32_MAX 4294967295U
99 #if defined(__SSE__) && !defined(FIXED_POINT)
100 #include "resample_sse.h"
104 #include "resample_neon.h"
109 #define FIXED_STACK_ALLOC 8192
111 #define FIXED_STACK_ALLOC 1024
149 0.99859849, 1.00000000, 0.99859849, 0.99440475, 0.98745105, 0.97779076,
150 0.96549770, 0.95066529, 0.93340547, 0.91384741, 0.89213598, 0.86843014,
151 0.84290116, 0.81573067, 0.78710866, 0.75723148, 0.72629970, 0.69451601,
152 0.66208321, 0.62920216, 0.59606986, 0.56287762, 0.52980938, 0.49704014,
153 0.46473455, 0.43304576, 0.40211431, 0.37206735, 0.34301800, 0.31506490,
154 0.28829195, 0.26276832, 0.23854851, 0.21567274, 0.19416736, 0.17404546,
155 0.15530766, 0.13794294, 0.12192957, 0.10723616, 0.09382272, 0.08164178,
156 0.07063950, 0.06075685, 0.05193064, 0.04409466, 0.03718069, 0.03111947,
157 0.02584161, 0.02127838, 0.01736250, 0.01402878, 0.01121463, 0.00886058,
158 0.00691064, 0.00531256, 0.00401805, 0.00298291, 0.00216702, 0.00153438,
159 0.00105297, 0.00069463, 0.00043489, 0.00025272, 0.00013031, 0.0000527734,
160 0.00001000, 0.00000000};
171 0.99537781, 1.00000000, 0.99537781, 0.98162644, 0.95908712, 0.92831446,
172 0.89005583, 0.84522401, 0.79486424, 0.74011713, 0.68217934, 0.62226347,
173 0.56155915, 0.50119680, 0.44221549, 0.38553619, 0.33194107, 0.28205962,
174 0.23636152, 0.19515633, 0.15859932, 0.12670280, 0.09935205, 0.07632451,
175 0.05731132, 0.04193980, 0.02979584, 0.02044510, 0.01345224, 0.00839739,
176 0.00488951, 0.00257636, 0.00115101, 0.00035515, 0.00000000, 0.00000000};
179 0.99635258, 1.00000000, 0.99635258, 0.98548012, 0.96759014, 0.94302200,
180 0.91223751, 0.87580811, 0.83439927, 0.78875245, 0.73966538, 0.68797126,
181 0.63451750, 0.58014482, 0.52566725, 0.47185369, 0.41941150, 0.36897272,
182 0.32108304, 0.27619388, 0.23465776, 0.19672670, 0.16255380, 0.13219758,
183 0.10562887, 0.08273982, 0.06335451, 0.04724088, 0.03412321, 0.02369490,
184 0.01563093, 0.00959968, 0.00527363, 0.00233883, 0.00050000, 0.00000000};
187 0.99733006, 1.00000000, 0.99733006, 0.98935595, 0.97618418, 0.95799003,
188 0.93501423, 0.90755855, 0.87598009, 0.84068475, 0.80211977, 0.76076565,
189 0.71712752, 0.67172623, 0.62508937, 0.57774224, 0.53019925, 0.48295561,
190 0.43647969, 0.39120616, 0.34752997, 0.30580127, 0.26632152, 0.22934058,
191 0.19505503, 0.16360756, 0.13508755, 0.10953262, 0.08693120, 0.06722600,
192 0.05031820, 0.03607231, 0.02432151, 0.01487334, 0.00752000, 0.00000000};
200 #define KAISER12 (&kaiser12_funcdef)
202 #define KAISER10 (&kaiser10_funcdef)
204 #define KAISER8 (&kaiser8_funcdef)
206 #define KAISER6 (&kaiser6_funcdef)
227 { 8, 4, 0.830f, 0.860f,
KAISER6 },
228 { 16, 4, 0.850f, 0.880f,
KAISER6 },
229 { 32, 4, 0.882f, 0.910f,
KAISER6 },
230 { 48, 8, 0.895f, 0.917f,
KAISER8 },
231 { 64, 8, 0.921f, 0.940f,
KAISER8 },
232 { 80, 16, 0.922f, 0.940f,
KAISER10},
233 { 96, 16, 0.940f, 0.945f,
KAISER10},
234 {128, 16, 0.950f, 0.950f,
KAISER10},
235 {160, 16, 0.960f, 0.960f,
KAISER10},
236 {192, 32, 0.968f, 0.968f,
KAISER12},
237 {256, 32, 0.975f, 0.975f,
KAISER12},
249 interp[3] = -0.1666666667*frac + 0.1666666667*(frac*frac*frac);
250 interp[2] = frac + 0.5*(frac*frac) - 0.5*(frac*frac*frac);
252 interp[0] = -0.3333333333*frac + 0.5*(frac*frac) - 0.1666666667*(frac*frac*frac);
254 interp[1] = 1.f-interp[3]-interp[2]-interp[0];
257 return interp[0]*func->
table[ind] + interp[1]*func->
table[ind+1] + interp[2]*func->
table[ind+2] + interp[3]*func->
table[ind+3];
278 float xx = x * cutoff;
281 else if (fabs(x) > .5f*N)
291 float xx = x * cutoff;
294 else if (fabs(x) > .5*N)
313 interp[2] =
Q15_ONE-interp[0]-interp[1]-interp[3];
322 interp[0] = -0.16667f*frac + 0.16667f*frac*frac*frac;
323 interp[1] = frac + 0.5f*frac*frac - 0.5f*frac*frac*frac;
325 interp[3] = -0.33333f*frac + 0.5f*frac*frac - 0.16667f*frac*frac*frac;
327 interp[2] = 1.-interp[0]-interp[1]-interp[3];
336 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
341 const spx_uint32_t den_rate = st->
den_rate;
344 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
346 const spx_word16_t *sinct = & sinc_table[samp_frac_num*N];
349 #ifndef OVERRIDE_INNER_PRODUCT_SINGLE
352 for(j=0;j<N;j++) sum +=
MULT16_16(sinct[j], iptr[j]);
371 out[out_stride * out_sample++] = sum;
372 last_sample += int_advance;
373 samp_frac_num += frac_advance;
374 if (samp_frac_num >= den_rate)
376 samp_frac_num -= den_rate;
394 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
399 const spx_uint32_t den_rate = st->
den_rate;
402 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
404 const spx_word16_t *sinct = & sinc_table[samp_frac_num*N];
407 #ifndef OVERRIDE_INNER_PRODUCT_DOUBLE
409 double accum[4] = {0,0,0,0};
412 accum[0] += sinct[j]*iptr[j];
413 accum[1] += sinct[j+1]*iptr[j+1];
414 accum[2] += sinct[j+2]*iptr[j+2];
415 accum[3] += sinct[j+3]*iptr[j+3];
417 sum = accum[0] + accum[1] + accum[2] + accum[3];
419 sum = inner_product_double(sinct, iptr, N);
422 out[out_stride * out_sample++] =
PSHR32(sum, 15);
423 last_sample += int_advance;
424 samp_frac_num += frac_advance;
425 if (samp_frac_num >= den_rate)
427 samp_frac_num -= den_rate;
443 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
447 const spx_uint32_t den_rate = st->
den_rate;
450 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
463 #ifndef OVERRIDE_INTERPOLATE_PRODUCT_SINGLE
483 out[out_stride * out_sample++] = sum;
484 last_sample += int_advance;
485 samp_frac_num += frac_advance;
486 if (samp_frac_num >= den_rate)
488 samp_frac_num -= den_rate;
506 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
510 const spx_uint32_t den_rate = st->
den_rate;
513 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
526 #ifndef OVERRIDE_INTERPOLATE_PRODUCT_DOUBLE
528 double accum[4] = {0,0,0,0};
531 const double curr_in=iptr[j];
545 out[out_stride * out_sample++] =
PSHR32(sum,15);
546 last_sample += int_advance;
547 samp_frac_num += frac_advance;
548 if (samp_frac_num >= den_rate)
550 samp_frac_num -= den_rate;
569 spx_uint32_t samp_frac_num = st->
samp_frac_num[channel_index];
573 const spx_uint32_t den_rate = st->
den_rate;
576 while (!(last_sample >= (spx_int32_t)*in_len || out_sample >= (spx_int32_t)*out_len))
578 out[out_stride * out_sample++] = 0;
579 last_sample += int_advance;
580 samp_frac_num += frac_advance;
581 if (samp_frac_num >= den_rate)
583 samp_frac_num -= den_rate;
593 static int multiply_frac(spx_uint32_t *result, spx_uint32_t value, spx_uint32_t num, spx_uint32_t den)
595 spx_uint32_t major = value / den;
596 spx_uint32_t remain = value % den;
599 || major * num >
UINT32_MAX - remain * num / den)
601 *result = remain * num / den + major * num;
607 spx_uint32_t old_length = st->
filt_len;
610 spx_uint32_t min_sinc_table_length;
611 spx_uint32_t min_alloc_size;
641 #ifdef RESAMPLE_FULL_SINC_TABLE
727 }
else if (st->
filt_len > old_length)
735 spx_uint32_t olen = old_length;
752 for (j=0;j<olen-1;j++)
766 }
else if (st->
filt_len < old_length)
804 if (nb_channels == 0 || ratio_num == 0 || ratio_den == 0 || quality > 10 || quality < 0)
838 if (!(st->
last_sample = (spx_int32_t*)speex_alloc(nb_channels*
sizeof(spx_int32_t))))
840 if (!(st->
magic_samples = (spx_uint32_t*)speex_alloc(nb_channels*
sizeof(spx_uint32_t))))
842 if (!(st->
samp_frac_num = (spx_uint32_t*)speex_alloc(nb_channels*
sizeof(spx_uint32_t))))
889 out_sample = st->
resampler_ptr(st, channel_index, mem, in_len, out, out_len);
891 if (st->
last_sample[channel_index] < (spx_int32_t)*in_len)
893 *out_len = out_sample;
899 mem[j] = mem[j+ilen];
918 mem[N-1+i]=mem[N-1+i+tmp_in_len];
931 spx_uint32_t ilen = *in_len;
932 spx_uint32_t olen = *out_len;
934 const int filt_offs = st->
filt_len - 1;
941 while (ilen && olen) {
942 spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
943 spx_uint32_t ochunk = olen;
946 for(j=0;j<ichunk;++j)
947 x[j+filt_offs]=in[j*istride];
949 for(j=0;j<ichunk;++j)
957 in += ichunk * istride;
974 spx_uint32_t ilen = *in_len;
975 spx_uint32_t olen = *out_len;
988 while (ilen && olen) {
990 spx_uint32_t ichunk = (ilen > xlen) ? xlen : ilen;
991 spx_uint32_t ochunk = (olen > ylen) ? ylen : olen;
992 spx_uint32_t omagic = 0;
1001 for(j=0;j<ichunk;++j)
1005 x[j+st->
filt_len-1]=in[j*istride_save];
1008 for(j=0;j<ichunk;++j)
1018 for (j=0;j<ochunk+omagic;++j)
1020 out[j*ostride_save] = ystack[j];
1022 out[j*ostride_save] =
WORD2INT(ystack[j]);
1027 out += (ochunk+omagic) * ostride_save;
1029 in += ichunk * istride_save;
1041 int istride_save, ostride_save;
1042 spx_uint32_t bak_out_len = *out_len;
1043 spx_uint32_t bak_in_len = *in_len;
1049 *out_len = bak_out_len;
1050 *in_len = bak_in_len;
1064 int istride_save, ostride_save;
1065 spx_uint32_t bak_out_len = *out_len;
1066 spx_uint32_t bak_in_len = *in_len;
1072 *out_len = bak_out_len;
1073 *in_len = bak_in_len;
1095 static inline spx_uint32_t
compute_gcd(spx_uint32_t a, spx_uint32_t b)
1099 spx_uint32_t temp = a;
1110 spx_uint32_t old_den;
1113 if (ratio_num == 0 || ratio_den == 0)
1155 if (quality > 10 || quality < 0)
1229 return "Memory allocation failed.";
1231 return "Bad resampler state.";
1233 return "Invalid argument.";
1235 return "Input and output buffers overlap.";
1237 return "Unknown error. Bad error code or strange version mismatch.";