1 /*
2 * audio resampling
3 * Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at>
4 * bessel function: Copyright (c) 2006 Xiaogang Zhang
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23 /**
24 * @file
25 * audio resampling
26 * @author Michael Niedermayer <michaelni@gmx.at>
27 */
28
32
37 sum *= x;
39 }
40 return sum;
41 }
42
43 /**
44 * 0th order modified bessel function of the first kind.
45 * Algorithm taken from the Boost project, source:
46 * https://searchcode.com/codesearch/view/14918379/
47 * Use, modification and distribution are subject to the
48 * Boost Software License, Version 1.0 (see notice below).
49 * Boost Software License - Version 1.0 - August 17th, 2003
50 Permission is hereby granted, free of charge, to any person or organization
51 obtaining a copy of the software and accompanying documentation covered by
52 this license (the "Software") to use, reproduce, display, distribute,
53 execute, and transmit the Software, and to prepare derivative works of the
54 Software, and to permit third-parties to whom the Software is furnished to
55 do so, all subject to the following:
56
57 The copyright notices in the Software and this entire statement, including
58 the above license grant, this restriction and the following disclaimer,
59 must be included in all copies of the Software, in whole or in part, and
60 all derivative works of the Software, unless such copies or derivative
61 works are solely in the form of machine-executable object code generated by
62 a source language processor.
63
64 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
65 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
67 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
68 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
69 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
70 DEALINGS IN THE SOFTWARE.
71 */
72
74 // Modified Bessel function of the first kind of order zero
75 // minimax rational approximations on intervals, see
76 // Blair and Edwards, Chalk River Report AECL-4928, 1974
77 static const double p1[] = {
78 -2.2335582639474375249e+15,
79 -5.5050369673018427753e+14,
80 -3.2940087627407749166e+13,
81 -8.4925101247114157499e+11,
82 -1.1912746104985237192e+10,
83 -1.0313066708737980747e+08,
84 -5.9545626019847898221e+05,
85 -2.4125195876041896775e+03,
86 -7.0935347449210549190e+00,
87 -1.5453977791786851041e-02,
88 -2.5172644670688975051e-05,
89 -3.0517226450451067446e-08,
90 -2.6843448573468483278e-11,
91 -1.5982226675653184646e-14,
92 -5.2487866627945699800e-18,
93 };
94 static const double q1[] = {
95 -2.2335582639474375245e+15,
96 7.8858692566751002988e+12,
97 -1.2207067397808979846e+10,
98 1.0377081058062166144e+07,
99 -4.8527560179962773045e+03,
100 1.0,
101 };
102 static const double p2[] = {
103 -2.2210262233306573296e-04,
104 1.3067392038106924055e-02,
105 -4.4700805721174453923e-01,
106 5.5674518371240761397e+00,
107 -2.3517945679239481621e+01,
108 3.1611322818701131207e+01,
109 -9.6090021968656180000e+00,
110 };
111 static const double q2[] = {
112 -5.5194330231005480228e-04,
113 3.2547697594819615062e-02,
114 -1.1151759188741312645e+00,
115 1.3982595353892851542e+01,
116 -6.0228002066743340583e+01,
117 8.5539563258012929600e+01,
118 -3.1446690275135491500e+01,
119 1.0,
120 };
122 if (x == 0)
123 return 1.0;
125 if (x <= 15) {
126 y = x * x;
128 }
129 else {
130 y = 1 / x - 1.0 / 15;
134 }
135 }
136
137 /**
138 * builds a polyphase filterbank.
139 * @param factor resampling factor
140 * @param scale wanted sum of coefficients for each filter
141 * @param filter_type filter type
142 * @param kaiser_beta kaiser window beta
143 * @return 0 on success, negative on error
144 */
148 int ph_nb = phase_count % 2 ? phase_count : phase_count / 2 + 1;
149 double x, y,
w, t,
s;
152 const int center= (tap_count-1)/2;
153 double norm = 0;
155
156 if (!
tab || !sin_lut)
158
159 av_assert0(tap_count == 1 || tap_count % 2 == 0);
160
161 /* if upsampling, only need to interpolate, no filter */
164
166 for (ph = 0; ph < ph_nb; ph++)
167 sin_lut[ph] = sin(
M_PI * ph / phase_count) * (center & 1 ? 1 : -1);
168 }
169 for(ph = 0; ph < ph_nb; ph++) {
171 for(
i=0;
i<tap_count;
i++) {
172 x =
M_PI * ((double)(
i - center) - (double)ph / phase_count) *
factor;
173 if (x == 0) y = 1.0;
176 else
177 y = sin(x) / x;
178 switch(filter_type){
180 const float d= -0.5;
//first order derivative = -0.5
181 x =
fabs(((
double)(
i - center) - (
double)ph / phase_count) *
factor);
182 if(x<1.0) y= 1 - 3*x*x + 2*x*x*x +
d*( -x*x + x*x*x);
183 else y=
d*(-4 + 8*x - 5*x*x + x*x*x);
184 break;}
186 w = 2.0*x / (
factor*tap_count);
188 y *= 0.3635819 - 0.4891775 * t + 0.1365995 * (2*t*t-1) - 0.0106411 * (4*t*t*t - 3*t);
189 break;
193 break;
194 default:
196 }
197
200 if (!ph)
201 norm += y;
202 }
203
204 /* normalize so that an uniform color remains the same */
207 for(
i=0;
i<tap_count;
i++)
209 if (phase_count % 2) break;
210 for (
i = 0;
i < tap_count;
i++)
211 ((int16_t*)
filter)[(phase_count-ph) * alloc + tap_count-1-
i] = ((int16_t*)
filter)[ph * alloc +
i];
212 break;
214 for(
i=0;
i<tap_count;
i++)
216 if (phase_count % 2) break;
217 for (
i = 0;
i < tap_count;
i++)
219 break;
221 for(
i=0;
i<tap_count;
i++)
223 if (phase_count % 2) break;
224 for (
i = 0;
i < tap_count;
i++)
225 ((
float*)
filter)[(phase_count-ph) * alloc + tap_count-1-
i] = ((
float*)
filter)[ph * alloc +
i];
226 break;
228 for(
i=0;
i<tap_count;
i++)
230 if (phase_count % 2) break;
231 for (
i = 0;
i < tap_count;
i++)
232 ((
double*)
filter)[(phase_count-ph) * alloc + tap_count-1-
i] = ((
double*)
filter)[ph * alloc +
i];
233 break;
234 }
235 }
236 #if 0
237 {
238 #define LEN 1024
239 int j,k;
240 double sine[
LEN + tap_count];
241 double filtered[
LEN];
242 double maxff=-2, minff=2, maxsf=-2, minsf=2;
244 double ss=0, sf=0, ff=0;
245 for(j=0; j<
LEN+tap_count; j++)
247 for(j=0; j<
LEN; j++){
248 double sum=0;
249 ph=0;
250 for(k=0; k<tap_count; k++)
251 sum +=
filter[ph * tap_count + k] * sine[k+j];
252 filtered[j]= sum / (1<<FILTER_SHIFT);
253 ss+= sine[j + center] * sine[j + center];
254 ff+= filtered[j] * filtered[j];
255 sf+= sine[j + center] * filtered[j];
256 }
260 maxff=
FFMAX(maxff, ff);
261 minff=
FFMIN(minff, ff);
262 maxsf=
FFMAX(maxsf, sf);
263 minsf=
FFMIN(minsf, sf);
266 minff=minsf= 2;
267 maxff=maxsf= -2;
268 }
269 }
270 }
271 #endif
272
278 }
279
283 return;
286 }
287
290 double precision, int cheby, int exact_rational)
291 {
292 double cutoff = cutoff0? cutoff0 : 0.97;
293 double factor=
FFMIN(out_rate * cutoff / in_rate, 1.0);
294 int phase_count= 1<<phase_shift;
295 int phase_count_compensation = phase_count;
297
298 if (filter_length > 1)
299 filter_length =
FFALIGN(filter_length, 2);
300
301 if (exact_rational) {
302 int phase_count_exact, phase_count_exact_den;
303
304 av_reduce(&phase_count_exact, &phase_count_exact_den, out_rate, in_rate, INT_MAX);
305 if (phase_count_exact <= phase_count) {
306 phase_count_compensation = phase_count_exact * (phase_count / phase_count_exact);
307 phase_count = phase_count_exact;
308 }
309 }
310
311 if (!
c ||
c->phase_count != phase_count ||
c->linear!=
linear ||
c->factor !=
factor
312 ||
c->filter_length != filter_length ||
c->format !=
format
313 ||
c->filter_type != filter_type ||
c->kaiser_beta !=
kaiser_beta) {
318
320
322
325 c->filter_shift = 15;
326 break;
328 c->filter_shift = 30;
329 break;
333 break;
334 default:
337 }
338
339 if (filter_size/
factor > INT32_MAX/256) {
342 }
343
344 c->phase_count = phase_count;
347 c->filter_length = filter_length;
348 c->filter_alloc =
FFALIGN(
c->filter_length, 8);
349 c->filter_bank =
av_calloc(
c->filter_alloc, (phase_count+1)*
c->felem_size);
350 c->filter_type = filter_type;
352 c->phase_count_compensation = phase_count_compensation;
357 memcpy(
c->filter_bank + (
c->filter_alloc*phase_count+1)*
c->felem_size,
c->filter_bank, (
c->filter_alloc-1)*
c->felem_size);
358 memcpy(
c->filter_bank + (
c->filter_alloc*phase_count )*
c->felem_size,
c->filter_bank + (
c->filter_alloc - 1)*
c->felem_size,
c->felem_size);
359 }
360
361 c->compensation_distance= 0;
362 if(!
av_reduce(&
c->src_incr, &
c->dst_incr, out_rate, in_rate * (int64_t)phase_count, INT32_MAX/2))
364 while (
c->dst_incr < (1<<20) &&
c->src_incr < (1<<20)) {
367 }
368 c->ideal_dst_incr =
c->dst_incr;
369 c->dst_incr_div =
c->dst_incr /
c->src_incr;
370 c->dst_incr_mod =
c->dst_incr %
c->src_incr;
371
372 c->index= -phase_count*((
c->filter_length-1)/2);
374
376
382 }
383
385 {
386 uint8_t *new_filter_bank;
387 int new_src_incr, new_dst_incr;
388 int phase_count =
c->phase_count_compensation;
390
391 if (phase_count ==
c->phase_count)
392 return 0;
393
395
396 new_filter_bank =
av_calloc(
c->filter_alloc, (phase_count + 1) *
c->felem_size);
397 if (!new_filter_bank)
399
401 phase_count, 1 <<
c->filter_shift,
c->filter_type,
c->kaiser_beta);
405 }
406 memcpy(new_filter_bank + (
c->filter_alloc*phase_count+1)*
c->felem_size, new_filter_bank, (
c->filter_alloc-1)*
c->felem_size);
407 memcpy(new_filter_bank + (
c->filter_alloc*phase_count )*
c->felem_size, new_filter_bank + (
c->filter_alloc - 1)*
c->felem_size,
c->felem_size);
408
409 if (!
av_reduce(&new_src_incr, &new_dst_incr,
c->src_incr,
410 c->dst_incr * (int64_t)(phase_count/
c->phase_count), INT32_MAX/2))
411 {
414 }
415
416 c->src_incr = new_src_incr;
417 c->dst_incr = new_dst_incr;
418 while (
c->dst_incr < (1<<20) &&
c->src_incr < (1<<20)) {
421 }
422 c->ideal_dst_incr =
c->dst_incr;
423 c->dst_incr_div =
c->dst_incr /
c->src_incr;
424 c->dst_incr_mod =
c->dst_incr %
c->src_incr;
425 c->index *= phase_count /
c->phase_count;
426 c->phase_count = phase_count;
428 c->filter_bank = new_filter_bank;
429 return 0;
430 }
431
434
435 if (compensation_distance && sample_delta) {
439 }
440
441 c->compensation_distance= compensation_distance;
442 if (compensation_distance)
443 c->dst_incr =
c->ideal_dst_incr -
c->ideal_dst_incr * (int64_t)sample_delta / compensation_distance;
444 else
445 c->dst_incr =
c->ideal_dst_incr;
446
447 c->dst_incr_div =
c->dst_incr /
c->src_incr;
448 c->dst_incr_mod =
c->dst_incr %
c->src_incr;
449
450 return 0;
451 }
452
458 int64_t max_src_size = (INT64_MAX/2 /
c->phase_count) /
c->src_incr;
459
460 if (
c->compensation_distance)
461 dst_size =
FFMIN(dst_size,
c->compensation_distance);
462 src_size =
FFMIN(src_size, max_src_size);
463
464 *consumed = 0;
465
466 if (
c->filter_length == 1 &&
c->phase_count == 1) {
467 int64_t index2= (1LL<<32)*
c->frac/
c->src_incr + (1LL<<32)*
c->index;
468 int64_t incr= (1LL<<32) *
c->dst_incr /
c->src_incr;
469 int new_size = (src_size * (int64_t)
c->src_incr -
c->frac +
c->dst_incr - 1) /
c->dst_incr;
470
471 dst_size =
FFMAX(
FFMIN(dst_size, new_size), 0);
472 if (dst_size > 0) {
474 c->dsp.resample_one(dst->
ch[
i],
src->ch[
i], dst_size, index2, incr);
476 c->index += dst_size *
c->dst_incr_div;
477 c->index += (
c->frac + dst_size * (int64_t)
c->dst_incr_mod) /
c->src_incr;
479 *consumed =
c->index;
480 c->frac = (
c->frac + dst_size * (int64_t)
c->dst_incr_mod) %
c->src_incr;
482 }
483 }
484 }
485 } else {
486 int64_t end_index = (1LL + src_size -
c->filter_length) *
c->phase_count;
487 int64_t delta_frac = (end_index -
c->index) *
c->src_incr -
c->frac;
488 int delta_n = (delta_frac +
c->dst_incr - 1) /
c->dst_incr;
490 const void *
src,
int n,
int update_ctx);
491
492 dst_size =
FFMAX(
FFMIN(dst_size, delta_n), 0);
493 if (dst_size > 0) {
494 /* resample_linear and resample_common should have same behavior
495 * when frac and dst_incr_mod are zero */
496 resample_func = (
c->linear && (
c->frac ||
c->dst_incr_mod)) ?
497 c->dsp.resample_linear :
c->dsp.resample_common;
498 for (
i = 0;
i < dst->ch_count;
i++)
499 *consumed = resample_func(
c, dst->ch[
i],
src->ch[
i], dst_size,
i+1 == dst->ch_count);
500 }
501 }
502
503 if(need_emms)
504 emms_c();
505
506 if (
c->compensation_distance) {
507 c->compensation_distance -= dst_size;
508 if (!
c->compensation_distance) {
509 c->dst_incr =
c->ideal_dst_incr;
510 c->dst_incr_div =
c->dst_incr /
c->src_incr;
511 c->dst_incr_mod =
c->dst_incr %
c->src_incr;
512 }
513 }
514
515 return dst_size;
516 }
517
520 int64_t num =
s->in_buffer_count - (
c->filter_length-1)/2;
521 num *=
c->phase_count;
525 return av_rescale(num,
base,
s->in_sample_rate*(int64_t)
c->src_incr *
c->phase_count);
526 }
527
530 // The + 2 are added to allow implementations to be slightly inaccurate, they should not be needed currently.
531 // They also make it easier to proof that changes and optimizations do not
532 // break the upper bound.
533 int64_t num =
s->in_buffer_count + 2LL + in_samples;
534 num *=
c->phase_count;
537
538 if (
c->compensation_distance) {
539 if (num > INT_MAX)
541
542 num =
FFMAX(num, (num *
c->ideal_dst_incr - 1) /
c->dst_incr + 1);
543 }
544 return num;
545 }
546
551 int reflection = (
FFMIN(
s->in_buffer_count,
c->filter_length) + 1) / 2;
552
556 for(
i=0;
i<
a->ch_count;
i++){
557 for(j=0; j<reflection; j++){
558 memcpy(
a->ch[
i] + (
s->in_buffer_index+
s->in_buffer_count+j )*
a->bps,
559 a->ch[
i] + (
s->in_buffer_index+
s->in_buffer_count-j-1)*
a->bps,
a->bps);
560 }
561 }
562 s->in_buffer_count += reflection;
563 return 0;
564 }
565
566 // in fact the whole handle multiple ridiculously small buffers might need more thinking...
568 int in_count, int *out_idx, int *out_sz)
569 {
570 int n, ch, num =
FFMIN(in_count + *out_sz,
c->filter_length + 1), res;
571
573 return 0;
574
576 return res;
577
578 // copy
579 for (n = *out_sz; n < num; n++) {
580 for (ch = 0; ch <
src->ch_count; ch++) {
581 memcpy(dst->
ch[ch] + ((
c->filter_length + n) *
c->felem_size),
582 src->ch[ch] + ((n - *out_sz) *
c->felem_size),
c->felem_size);
583 }
584 }
585
586 // if not enough data is in, return and wait for more
588 *out_sz = num;
589 *out_idx =
c->filter_length;
590 return INT_MAX;
591 }
592
593 // else invert
594 for (n = 1; n <=
c->filter_length; n++) {
595 for (ch = 0; ch <
src->ch_count; ch++) {
596 memcpy(dst->
ch[ch] + ((
c->filter_length - n) *
c->felem_size),
597 dst->
ch[ch] + ((
c->filter_length + n) *
c->felem_size),
599 }
600 }
601
602 res = num - *out_sz;
603 *out_idx =
c->filter_length;
604 while (
c->index < 0) {
605 --*out_idx;
606 c->index +=
c->phase_count;
607 }
608 *out_sz =
FFMAX(*out_sz +
c->filter_length,
609 1 +
c->filter_length * 2) - *out_idx;
610
611 return FFMAX(res, 0);
612 }
613
623 };