3 * Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
25 * @author Michael Niedermayer <michaelni@gmx.at>
28 #include "libavutil/avassert.h"
32 * 0th order modified bessel function of the first kind.
34 static double bessel(double x
){
39 static const double inv
[100]={
40 1.0/( 1* 1), 1.0/( 2* 2), 1.0/( 3* 3), 1.0/( 4* 4), 1.0/( 5* 5), 1.0/( 6* 6), 1.0/( 7* 7), 1.0/( 8* 8), 1.0/( 9* 9), 1.0/(10*10),
41 1.0/(11*11), 1.0/(12*12), 1.0/(13*13), 1.0/(14*14), 1.0/(15*15), 1.0/(16*16), 1.0/(17*17), 1.0/(18*18), 1.0/(19*19), 1.0/(20*20),
42 1.0/(21*21), 1.0/(22*22), 1.0/(23*23), 1.0/(24*24), 1.0/(25*25), 1.0/(26*26), 1.0/(27*27), 1.0/(28*28), 1.0/(29*29), 1.0/(30*30),
43 1.0/(31*31), 1.0/(32*32), 1.0/(33*33), 1.0/(34*34), 1.0/(35*35), 1.0/(36*36), 1.0/(37*37), 1.0/(38*38), 1.0/(39*39), 1.0/(40*40),
44 1.0/(41*41), 1.0/(42*42), 1.0/(43*43), 1.0/(44*44), 1.0/(45*45), 1.0/(46*46), 1.0/(47*47), 1.0/(48*48), 1.0/(49*49), 1.0/(50*50),
45 1.0/(51*51), 1.0/(52*52), 1.0/(53*53), 1.0/(54*54), 1.0/(55*55), 1.0/(56*56), 1.0/(57*57), 1.0/(58*58), 1.0/(59*59), 1.0/(60*60),
46 1.0/(61*61), 1.0/(62*62), 1.0/(63*63), 1.0/(64*64), 1.0/(65*65), 1.0/(66*66), 1.0/(67*67), 1.0/(68*68), 1.0/(69*69), 1.0/(70*70),
47 1.0/(71*71), 1.0/(72*72), 1.0/(73*73), 1.0/(74*74), 1.0/(75*75), 1.0/(76*76), 1.0/(77*77), 1.0/(78*78), 1.0/(79*79), 1.0/(80*80),
48 1.0/(81*81), 1.0/(82*82), 1.0/(83*83), 1.0/(84*84), 1.0/(85*85), 1.0/(86*86), 1.0/(87*87), 1.0/(88*88), 1.0/(89*89), 1.0/(90*90),
49 1.0/(91*91), 1.0/(92*92), 1.0/(93*93), 1.0/(94*94), 1.0/(95*95), 1.0/(96*96), 1.0/(97*97), 1.0/(98*98), 1.0/(99*99), 1.0/(10000)
53 for(i
=0; v
!= lastv
; i
++){
63 * builds a polyphase filterbank.
64 * @param factor resampling factor
65 * @param scale wanted sum of coefficients for each filter
66 * @param filter_type filter type
67 * @param kaiser_beta kaiser window beta
68 * @return 0 on success, negative on error
70 static int build_filter(ResampleContext
*c
, void *filter
, double factor
, int tap_count
, int alloc
, int phase_count
, int scale
,
71 int filter_type
, int kaiser_beta
){
74 double *tab
= av_malloc_array(tap_count
, sizeof(*tab
));
75 const int center
= (tap_count
-1)/2;
78 return AVERROR(ENOMEM
);
80 /* if upsampling, only need to interpolate, no filter */
84 for(ph
=0;ph
<phase_count
;ph
++) {
86 for(i
=0;i
<tap_count
;i
++) {
87 x
= M_PI
* ((double)(i
- center
) - (double)ph
/ phase_count
) * factor
;
91 case SWR_FILTER_TYPE_CUBIC
:{
92 const float d
= -0.5; //first order derivative = -0.5
93 x
= fabs(((double)(i
- center
) - (double)ph
/ phase_count
) * factor
);
94 if(x
<1.0) y
= 1 - 3*x
*x
+ 2*x
*x
*x
+ d
*( -x
*x
+ x
*x
*x
);
95 else y
= d
*(-4 + 8*x
- 5*x
*x
+ x
*x
*x
);
97 case SWR_FILTER_TYPE_BLACKMAN_NUTTALL
:
98 w
= 2.0*x
/ (factor
*tap_count
) + M_PI
;
99 y
*= 0.3635819 - 0.4891775 * cos(w
) + 0.1365995 * cos(2*w
) - 0.0106411 * cos(3*w
);
101 case SWR_FILTER_TYPE_KAISER
:
102 w
= 2.0*x
/ (factor
*tap_count
*M_PI
);
103 y
*= bessel(kaiser_beta
*sqrt(FFMAX(1-w
*w
, 0)));
113 /* normalize so that an uniform color remains the same */
115 case AV_SAMPLE_FMT_S16P
:
116 for(i
=0;i
<tap_count
;i
++)
117 ((int16_t*)filter
)[ph
* alloc
+ i
] = av_clip(lrintf(tab
[i
] * scale
/ norm
), INT16_MIN
, INT16_MAX
);
119 case AV_SAMPLE_FMT_S32P
:
120 for(i
=0;i
<tap_count
;i
++)
121 ((int32_t*)filter
)[ph
* alloc
+ i
] = av_clipl_int32(llrint(tab
[i
] * scale
/ norm
));
123 case AV_SAMPLE_FMT_FLTP
:
124 for(i
=0;i
<tap_count
;i
++)
125 ((float*)filter
)[ph
* alloc
+ i
] = tab
[i
] * scale
/ norm
;
127 case AV_SAMPLE_FMT_DBLP
:
128 for(i
=0;i
<tap_count
;i
++)
129 ((double*)filter
)[ph
* alloc
+ i
] = tab
[i
] * scale
/ norm
;
137 double sine
[LEN
+ tap_count
];
138 double filtered
[LEN
];
139 double maxff
=-2, minff
=2, maxsf
=-2, minsf
=2;
140 for(i
=0; i
<LEN
; i
++){
141 double ss
=0, sf
=0, ff
=0;
142 for(j
=0; j
<LEN
+tap_count
; j
++)
143 sine
[j
]= cos(i
*j
*M_PI
/LEN
);
144 for(j
=0; j
<LEN
; j
++){
147 for(k
=0; k
<tap_count
; k
++)
148 sum
+= filter
[ph
* tap_count
+ k
] * sine
[k
+j
];
149 filtered
[j
]= sum
/ (1<<FILTER_SHIFT
);
150 ss
+= sine
[j
+ center
] * sine
[j
+ center
];
151 ff
+= filtered
[j
] * filtered
[j
];
152 sf
+= sine
[j
+ center
] * filtered
[j
];
157 maxff
= FFMAX(maxff
, ff
);
158 minff
= FFMIN(minff
, ff
);
159 maxsf
= FFMAX(maxsf
, sf
);
160 minsf
= FFMIN(minsf
, sf
);
162 av_log(NULL
, AV_LOG_ERROR
, "i:%4d ss:%f ff:%13.6e-%13.6e sf:%13.6e-%13.6e\n", i
, ss
, maxff
, minff
, maxsf
, minsf
);
174 static ResampleContext
*resample_init(ResampleContext
*c
, int out_rate
, int in_rate
, int filter_size
, int phase_shift
, int linear
,
175 double cutoff0
, enum AVSampleFormat format
, enum SwrFilterType filter_type
, int kaiser_beta
,
176 double precision
, int cheby
)
178 double cutoff
= cutoff0
? cutoff0
: 0.97;
179 double factor
= FFMIN(out_rate
* cutoff
/ in_rate
, 1.0);
180 int phase_count
= 1<<phase_shift
;
182 if (!c
|| c
->phase_shift
!= phase_shift
|| c
->linear
!=linear
|| c
->factor
!= factor
183 || c
->filter_length
!= FFMAX((int)ceil(filter_size
/factor
), 1) || c
->format
!= format
184 || c
->filter_type
!= filter_type
|| c
->kaiser_beta
!= kaiser_beta
) {
185 c
= av_mallocz(sizeof(*c
));
191 c
->felem_size
= av_get_bytes_per_sample(c
->format
);
194 case AV_SAMPLE_FMT_S16P
:
195 c
->filter_shift
= 15;
197 case AV_SAMPLE_FMT_S32P
:
198 c
->filter_shift
= 30;
200 case AV_SAMPLE_FMT_FLTP
:
201 case AV_SAMPLE_FMT_DBLP
:
205 av_log(NULL
, AV_LOG_ERROR
, "Unsupported sample format\n");
209 if (filter_size
/factor
> INT32_MAX
/256) {
210 av_log(NULL
, AV_LOG_ERROR
, "Filter length too large\n");
214 c
->phase_shift
= phase_shift
;
215 c
->phase_mask
= phase_count
- 1;
218 c
->filter_length
= FFMAX((int)ceil(filter_size
/factor
), 1);
219 c
->filter_alloc
= FFALIGN(c
->filter_length
, 8);
220 c
->filter_bank
= av_calloc(c
->filter_alloc
, (phase_count
+1)*c
->felem_size
);
221 c
->filter_type
= filter_type
;
222 c
->kaiser_beta
= kaiser_beta
;
225 if (build_filter(c
, (void*)c
->filter_bank
, factor
, c
->filter_length
, c
->filter_alloc
, phase_count
, 1<<c
->filter_shift
, filter_type
, kaiser_beta
))
227 memcpy(c
->filter_bank
+ (c
->filter_alloc
*phase_count
+1)*c
->felem_size
, c
->filter_bank
, (c
->filter_alloc
-1)*c
->felem_size
);
228 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
);
231 c
->compensation_distance
= 0;
232 if(!av_reduce(&c
->src_incr
, &c
->dst_incr
, out_rate
, in_rate
* (int64_t)phase_count
, INT32_MAX
/2))
234 c
->ideal_dst_incr
= c
->dst_incr
;
235 c
->dst_incr_div
= c
->dst_incr
/ c
->src_incr
;
236 c
->dst_incr_mod
= c
->dst_incr
% c
->src_incr
;
238 c
->index
= -phase_count
*((c
->filter_length
-1)/2);
241 swri_resample_dsp_init(c
);
245 av_freep(&c
->filter_bank
);
250 static void resample_free(ResampleContext
**c
){
253 av_freep(&(*c
)->filter_bank
);
257 static int set_compensation(ResampleContext
*c
, int sample_delta
, int compensation_distance
){
258 c
->compensation_distance
= compensation_distance
;
259 if (compensation_distance
)
260 c
->dst_incr
= c
->ideal_dst_incr
- c
->ideal_dst_incr
* (int64_t)sample_delta
/ compensation_distance
;
262 c
->dst_incr
= c
->ideal_dst_incr
;
264 c
->dst_incr_div
= c
->dst_incr
/ c
->src_incr
;
265 c
->dst_incr_mod
= c
->dst_incr
% c
->src_incr
;
270 static int swri_resample(ResampleContext
*c
,
271 uint8_t *dst
, const uint8_t *src
, int *consumed
,
272 int src_size
, int dst_size
, int update_ctx
)
274 if (c
->filter_length
== 1 && c
->phase_shift
== 0) {
277 int64_t index2
= (1LL<<32)*c
->frac
/c
->src_incr
+ (1LL<<32)*index
;
278 int64_t incr
= (1LL<<32) * c
->dst_incr
/ c
->src_incr
;
279 int new_size
= (src_size
* (int64_t)c
->src_incr
- frac
+ c
->dst_incr
- 1) / c
->dst_incr
;
281 dst_size
= FFMIN(dst_size
, new_size
);
282 c
->dsp
.resample_one(dst
, src
, dst_size
, index2
, incr
);
284 index
+= dst_size
* c
->dst_incr_div
;
285 index
+= (frac
+ dst_size
* (int64_t)c
->dst_incr_mod
) / c
->src_incr
;
286 av_assert2(index
>= 0);
289 c
->frac
= (frac
+ dst_size
* (int64_t)c
->dst_incr_mod
) % c
->src_incr
;
293 int64_t end_index
= (1LL + src_size
- c
->filter_length
) << c
->phase_shift
;
294 int64_t delta_frac
= (end_index
- c
->index
) * c
->src_incr
- c
->frac
;
295 int delta_n
= (delta_frac
+ c
->dst_incr
- 1) / c
->dst_incr
;
297 dst_size
= FFMIN(dst_size
, delta_n
);
299 *consumed
= c
->dsp
.resample(c
, dst
, src
, dst_size
, update_ctx
);
308 static int multiple_resample(ResampleContext
*c
, AudioData
*dst
, int dst_size
, AudioData
*src
, int src_size
, int *consumed
){
310 int av_unused mm_flags
= av_get_cpu_flags();
311 int need_emms
= c
->format
== AV_SAMPLE_FMT_S16P
&& ARCH_X86_32
&&
312 (mm_flags
& (AV_CPU_FLAG_MMX2
| AV_CPU_FLAG_SSE2
)) == AV_CPU_FLAG_MMX2
;
313 int64_t max_src_size
= (INT64_MAX
>> (c
->phase_shift
+1)) / c
->src_incr
;
315 if (c
->compensation_distance
)
316 dst_size
= FFMIN(dst_size
, c
->compensation_distance
);
317 src_size
= FFMIN(src_size
, max_src_size
);
319 for(i
=0; i
<dst
->ch_count
; i
++){
320 ret
= swri_resample(c
, dst
->ch
[i
], src
->ch
[i
],
321 consumed
, src_size
, dst_size
, i
+1==dst
->ch_count
);
326 if (c
->compensation_distance
) {
327 c
->compensation_distance
-= ret
;
328 if (!c
->compensation_distance
) {
329 c
->dst_incr
= c
->ideal_dst_incr
;
330 c
->dst_incr_div
= c
->dst_incr
/ c
->src_incr
;
331 c
->dst_incr_mod
= c
->dst_incr
% c
->src_incr
;
338 static int64_t get_delay(struct SwrContext
*s
, int64_t base
){
339 ResampleContext
*c
= s
->resample
;
340 int64_t num
= s
->in_buffer_count
- (c
->filter_length
-1)/2;
341 num
<<= c
->phase_shift
;
345 return av_rescale(num
, base
, s
->in_sample_rate
*(int64_t)c
->src_incr
<< c
->phase_shift
);
348 static int resample_flush(struct SwrContext
*s
) {
349 AudioData
*a
= &s
->in_buffer
;
351 if((ret
= swri_realloc_audio(a
, s
->in_buffer_index
+ 2*s
->in_buffer_count
)) < 0)
353 av_assert0(a
->planar
);
354 for(i
=0; i
<a
->ch_count
; i
++){
355 for(j
=0; j
<s
->in_buffer_count
; j
++){
356 memcpy(a
->ch
[i
] + (s
->in_buffer_index
+s
->in_buffer_count
+j
)*a
->bps
,
357 a
->ch
[i
] + (s
->in_buffer_index
+s
->in_buffer_count
-j
-1)*a
->bps
, a
->bps
);
360 s
->in_buffer_count
+= (s
->in_buffer_count
+1)/2;
364 // in fact the whole handle multiple ridiculously small buffers might need more thinking...
365 static int invert_initial_buffer(ResampleContext
*c
, AudioData
*dst
, const AudioData
*src
,
366 int in_count
, int *out_idx
, int *out_sz
)
368 int n
, ch
, num
= FFMIN(in_count
+ *out_sz
, c
->filter_length
+ 1), res
;
373 if ((res
= swri_realloc_audio(dst
, c
->filter_length
* 2 + 1)) < 0)
377 for (n
= *out_sz
; n
< num
; n
++) {
378 for (ch
= 0; ch
< src
->ch_count
; ch
++) {
379 memcpy(dst
->ch
[ch
] + ((c
->filter_length
+ n
) * c
->felem_size
),
380 src
->ch
[ch
] + ((n
- *out_sz
) * c
->felem_size
), c
->felem_size
);
384 // if not enough data is in, return and wait for more
385 if (num
< c
->filter_length
+ 1) {
387 *out_idx
= c
->filter_length
;
392 for (n
= 1; n
<= c
->filter_length
; n
++) {
393 for (ch
= 0; ch
< src
->ch_count
; ch
++) {
394 memcpy(dst
->ch
[ch
] + ((c
->filter_length
- n
) * c
->felem_size
),
395 dst
->ch
[ch
] + ((c
->filter_length
+ n
) * c
->felem_size
),
401 *out_idx
= c
->filter_length
+ (c
->index
>> c
->phase_shift
);
402 *out_sz
= FFMAX(*out_sz
+ c
->filter_length
,
403 1 + c
->filter_length
* 2) - *out_idx
;
404 c
->index
&= c
->phase_mask
;
406 return FFMAX(res
, 0);
409 struct Resampler
const swri_resampler
={
416 invert_initial_buffer
,