libswresample/resample.c
Go to the documentation of this file.
1 /*
2  * audio resampling
3  * Copyright (c) 2004-2012 Michael Niedermayer <michaelni@gmx.at>
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 /**
23  * @file
24  * audio resampling
25  * @author Michael Niedermayer <michaelni@gmx.at>
26  */
27 
28 #include "libavutil/log.h"
29 #include "libavutil/avassert.h"
30 #include "swresample_internal.h"
31 
32 
33 typedef struct ResampleContext {
34  const AVClass *av_class;
36  int filter_length;
38  int ideal_dst_incr;
39  int dst_incr;
40  int index;
41  int frac;
42  int src_incr;
44  int phase_shift;
45  int phase_mask;
46  int linear;
48  int kaiser_beta;
49  double factor;
54 
55 /**
56  * 0th order modified bessel function of the first kind.
57  */
58 static double bessel(double x){
59  double v=1;
60  double lastv=0;
61  double t=1;
62  int i;
63  static const double inv[100]={
64  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),
65  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),
66  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),
67  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),
68  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),
69  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),
70  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),
71  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),
72  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),
73  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)
74  };
75 
76  x= x*x/4;
77  for(i=0; v != lastv; i++){
78  lastv=v;
79  t *= x*inv[i];
80  v += t;
81  av_assert2(i<99);
82  }
83  return v;
84 }
85 
86 /**
87  * builds a polyphase filterbank.
88  * @param factor resampling factor
89  * @param scale wanted sum of coefficients for each filter
90  * @param filter_type filter type
91  * @param kaiser_beta kaiser window beta
92  * @return 0 on success, negative on error
93  */
94 static int build_filter(ResampleContext *c, void *filter, double factor, int tap_count, int alloc, int phase_count, int scale,
95  int filter_type, int kaiser_beta){
96  int ph, i;
97  double x, y, w;
98  double *tab = av_malloc(tap_count * sizeof(*tab));
99  const int center= (tap_count-1)/2;
100 
101  if (!tab)
102  return AVERROR(ENOMEM);
103 
104  /* if upsampling, only need to interpolate, no filter */
105  if (factor > 1.0)
106  factor = 1.0;
107 
108  for(ph=0;ph<phase_count;ph++) {
109  double norm = 0;
110  for(i=0;i<tap_count;i++) {
111  x = M_PI * ((double)(i - center) - (double)ph / phase_count) * factor;
112  if (x == 0) y = 1.0;
113  else y = sin(x) / x;
114  switch(filter_type){
115  case SWR_FILTER_TYPE_CUBIC:{
116  const float d= -0.5; //first order derivative = -0.5
117  x = fabs(((double)(i - center) - (double)ph / phase_count) * factor);
118  if(x<1.0) y= 1 - 3*x*x + 2*x*x*x + d*( -x*x + x*x*x);
119  else y= d*(-4 + 8*x - 5*x*x + x*x*x);
120  break;}
122  w = 2.0*x / (factor*tap_count) + M_PI;
123  y *= 0.3635819 - 0.4891775 * cos(w) + 0.1365995 * cos(2*w) - 0.0106411 * cos(3*w);
124  break;
126  w = 2.0*x / (factor*tap_count*M_PI);
127  y *= bessel(kaiser_beta*sqrt(FFMAX(1-w*w, 0)));
128  break;
129  default:
130  av_assert0(0);
131  }
132 
133  tab[i] = y;
134  norm += y;
135  }
136 
137  /* normalize so that an uniform color remains the same */
138  switch(c->format){
139  case AV_SAMPLE_FMT_S16P:
140  for(i=0;i<tap_count;i++)
141  ((int16_t*)filter)[ph * alloc + i] = av_clip(lrintf(tab[i] * scale / norm), INT16_MIN, INT16_MAX);
142  break;
143  case AV_SAMPLE_FMT_S32P:
144  for(i=0;i<tap_count;i++)
145  ((int32_t*)filter)[ph * alloc + i] = av_clipl_int32(llrint(tab[i] * scale / norm));
146  break;
147  case AV_SAMPLE_FMT_FLTP:
148  for(i=0;i<tap_count;i++)
149  ((float*)filter)[ph * alloc + i] = tab[i] * scale / norm;
150  break;
151  case AV_SAMPLE_FMT_DBLP:
152  for(i=0;i<tap_count;i++)
153  ((double*)filter)[ph * alloc + i] = tab[i] * scale / norm;
154  break;
155  }
156  }
157 #if 0
158  {
159 #define LEN 1024
160  int j,k;
161  double sine[LEN + tap_count];
162  double filtered[LEN];
163  double maxff=-2, minff=2, maxsf=-2, minsf=2;
164  for(i=0; i<LEN; i++){
165  double ss=0, sf=0, ff=0;
166  for(j=0; j<LEN+tap_count; j++)
167  sine[j]= cos(i*j*M_PI/LEN);
168  for(j=0; j<LEN; j++){
169  double sum=0;
170  ph=0;
171  for(k=0; k<tap_count; k++)
172  sum += filter[ph * tap_count + k] * sine[k+j];
173  filtered[j]= sum / (1<<FILTER_SHIFT);
174  ss+= sine[j + center] * sine[j + center];
175  ff+= filtered[j] * filtered[j];
176  sf+= sine[j + center] * filtered[j];
177  }
178  ss= sqrt(2*ss/LEN);
179  ff= sqrt(2*ff/LEN);
180  sf= 2*sf/LEN;
181  maxff= FFMAX(maxff, ff);
182  minff= FFMIN(minff, ff);
183  maxsf= FFMAX(maxsf, sf);
184  minsf= FFMIN(minsf, sf);
185  if(i%11==0){
186  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);
187  minff=minsf= 2;
188  maxff=maxsf= -2;
189  }
190  }
191  }
192 #endif
193 
194  av_free(tab);
195  return 0;
196 }
197 
198 static ResampleContext *resample_init(ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear,
199  double cutoff0, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta,
200  double precision, int cheby){
201  double cutoff = cutoff0? cutoff0 : 0.97;
202  double factor= FFMIN(out_rate * cutoff / in_rate, 1.0);
203  int phase_count= 1<<phase_shift;
204 
205  if (!c || c->phase_shift != phase_shift || c->linear!=linear || c->factor != factor
206  || c->filter_length != FFMAX((int)ceil(filter_size/factor), 1) || c->format != format
207  || c->filter_type != filter_type || c->kaiser_beta != kaiser_beta) {
208  c = av_mallocz(sizeof(*c));
209  if (!c)
210  return NULL;
211 
212  c->format= format;
213 
215 
216  switch(c->format){
217  case AV_SAMPLE_FMT_S16P:
218  c->filter_shift = 15;
219  break;
220  case AV_SAMPLE_FMT_S32P:
221  c->filter_shift = 30;
222  break;
223  case AV_SAMPLE_FMT_FLTP:
224  case AV_SAMPLE_FMT_DBLP:
225  c->filter_shift = 0;
226  break;
227  default:
228  av_log(NULL, AV_LOG_ERROR, "Unsupported sample format\n");
229  av_assert0(0);
230  }
231 
233  c->phase_mask = phase_count - 1;
234  c->linear = linear;
235  c->factor = factor;
236  c->filter_length = FFMAX((int)ceil(filter_size/factor), 1);
237  c->filter_alloc = FFALIGN(c->filter_length, 8);
238  c->filter_bank = av_calloc(c->filter_alloc, (phase_count+1)*c->felem_size);
241  if (!c->filter_bank)
242  goto error;
243  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))
244  goto error;
245  memcpy(c->filter_bank + (c->filter_alloc*phase_count+1)*c->felem_size, c->filter_bank, (c->filter_alloc-1)*c->felem_size);
246  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);
247  }
248 
249  c->compensation_distance= 0;
250  if(!av_reduce(&c->src_incr, &c->dst_incr, out_rate, in_rate * (int64_t)phase_count, INT32_MAX/2))
251  goto error;
252  c->ideal_dst_incr= c->dst_incr;
253 
254  c->index= -phase_count*((c->filter_length-1)/2);
255  c->frac= 0;
256 
257  return c;
258 error:
259  av_free(c->filter_bank);
260  av_free(c);
261  return NULL;
262 }
263 
265  if(!*c)
266  return;
267  av_freep(&(*c)->filter_bank);
268  av_freep(c);
269 }
270 
271 static int set_compensation(ResampleContext *c, int sample_delta, int compensation_distance){
273  if (compensation_distance)
274  c->dst_incr = c->ideal_dst_incr - c->ideal_dst_incr * (int64_t)sample_delta / compensation_distance;
275  else
276  c->dst_incr = c->ideal_dst_incr;
277  return 0;
278 }
279 
280 #define TEMPLATE_RESAMPLE_S16
281 #include "resample_template.c"
282 #undef TEMPLATE_RESAMPLE_S16
283 
284 #define TEMPLATE_RESAMPLE_S32
285 #include "resample_template.c"
286 #undef TEMPLATE_RESAMPLE_S32
287 
288 #define TEMPLATE_RESAMPLE_FLT
289 #include "resample_template.c"
290 #undef TEMPLATE_RESAMPLE_FLT
291 
292 #define TEMPLATE_RESAMPLE_DBL
293 #include "resample_template.c"
294 #undef TEMPLATE_RESAMPLE_DBL
295 
296 // XXX FIXME the whole C loop should be written in asm so this x86 specific code here isnt needed
297 #if HAVE_MMXEXT_INLINE
298 
299 #include "x86/resample_mmx.h"
300 
301 #define TEMPLATE_RESAMPLE_S16_MMX2
302 #include "resample_template.c"
303 #undef TEMPLATE_RESAMPLE_S16_MMX2
304 
305 #if HAVE_SSSE3_INLINE
306 #define TEMPLATE_RESAMPLE_S16_SSSE3
307 #include "resample_template.c"
308 #undef TEMPLATE_RESAMPLE_S16_SSSE3
309 #endif
310 
311 #endif // HAVE_MMXEXT_INLINE
312 
313 static int multiple_resample(ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed){
314  int i, ret= -1;
315  int av_unused mm_flags = av_get_cpu_flags();
316  int need_emms= 0;
317 
318  for(i=0; i<dst->ch_count; i++){
319 #if HAVE_MMXEXT_INLINE
320 #if HAVE_SSSE3_INLINE
321  if(c->format == AV_SAMPLE_FMT_S16P && (mm_flags&AV_CPU_FLAG_SSSE3)) ret= swri_resample_int16_ssse3(c, (int16_t*)dst->ch[i], (const int16_t*)src->ch[i], consumed, src_size, dst_size, i+1==dst->ch_count);
322  else
323 #endif
324  if(c->format == AV_SAMPLE_FMT_S16P && (mm_flags&AV_CPU_FLAG_MMX2 )){
325  ret= swri_resample_int16_mmx2 (c, (int16_t*)dst->ch[i], (const int16_t*)src->ch[i], consumed, src_size, dst_size, i+1==dst->ch_count);
326  need_emms= 1;
327  } else
328 #endif
329  if(c->format == AV_SAMPLE_FMT_S16P) ret= swri_resample_int16(c, (int16_t*)dst->ch[i], (const int16_t*)src->ch[i], consumed, src_size, dst_size, i+1==dst->ch_count);
330  else if(c->format == AV_SAMPLE_FMT_S32P) ret= swri_resample_int32(c, (int32_t*)dst->ch[i], (const int32_t*)src->ch[i], consumed, src_size, dst_size, i+1==dst->ch_count);
331  else if(c->format == AV_SAMPLE_FMT_FLTP) ret= swri_resample_float(c, (float *)dst->ch[i], (const float *)src->ch[i], consumed, src_size, dst_size, i+1==dst->ch_count);
332  else if(c->format == AV_SAMPLE_FMT_DBLP) ret= swri_resample_double(c,(double *)dst->ch[i], (const double *)src->ch[i], consumed, src_size, dst_size, i+1==dst->ch_count);
333  }
334  if(need_emms)
335  emms_c();
336  return ret;
337 }
338 
339 static int64_t get_delay(struct SwrContext *s, int64_t base){
340  ResampleContext *c = s->resample;
341  int64_t num = s->in_buffer_count - (c->filter_length-1)/2;
342  num <<= c->phase_shift;
343  num -= c->index;
344  num *= c->src_incr;
345  num -= c->frac;
346  return av_rescale(num, base, s->in_sample_rate*(int64_t)c->src_incr << c->phase_shift);
347 }
348 
349 static int resample_flush(struct SwrContext *s) {
350  AudioData *a= &s->in_buffer;
351  int i, j, ret;
352  if((ret = swri_realloc_audio(a, s->in_buffer_index + 2*s->in_buffer_count)) < 0)
353  return ret;
354  av_assert0(a->planar);
355  for(i=0; i<a->ch_count; i++){
356  for(j=0; j<s->in_buffer_count; j++){
357  memcpy(a->ch[i] + (s->in_buffer_index+s->in_buffer_count+j )*a->bps,
358  a->ch[i] + (s->in_buffer_index+s->in_buffer_count-j-1)*a->bps, a->bps);
359  }
360  }
361  s->in_buffer_count += (s->in_buffer_count+1)/2;
362  return 0;
363 }
364 
365 struct Resampler const swri_resampler={
371  get_delay,
372 };
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
float v
const char * s
Definition: avisynth_c.h:668
static int multiple_resample(ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed)
Audio buffer used for intermediate storage between conversion phases.
Definition: oss_audio.c:46
int ch_count
number of channels
int swri_resample_float(struct ResampleContext *c, float *dst, const float *src, int *consumed, int src_size, int dst_size, int update_ctx)
audio resampling
SwrFilterType
Resampling Filter Types.
Definition: swresample.h:134
#define AV_CPU_FLAG_MMX2
SSE integer functions or AMD MMX ext.
Definition: cpu.h:31
int in_buffer_index
cached buffer position
AudioData in_buffer
cached audio data (convert and resample purpose)
struct ResampleContext * resample
resampling context
output residual component w
#define FFALIGN(x, a)
Definition: common.h:63
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
set threshold d
int swri_resample_int16_mmx2(struct ResampleContext *c, int16_t *dst, const int16_t *src, int *consumed, int src_size, int dst_size, int update_ctx)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
enum AVSampleFormat format
uint8_t
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:63
static void resample_free(ResampleContext **c)
#define emms_c()
static double bessel(double x)
0th order modified bessel function of the first kind.
int swri_realloc_audio(AudioData *a, int count)
Definition: swresample.c:444
the mask is usually to keep the same permissions Filters should remove permissions on reference they give to output whenever necessary It can be automatically done by setting the rej_perms field on the output pad Here are a few guidelines corresponding to common then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
int swri_resample_double(struct ResampleContext *c, double *dst, const double *src, int *consumed, int src_size, int dst_size, int update_ctx)
static int set_compensation(ResampleContext *c, int sample_delta, int compensation_distance)
enum AVResampleFilterType filter_type
struct Resampler const swri_resampler
#define lrintf(x)
Definition: libm_mips.h:70
integer sqrt
Definition: avutil.txt:2
Kaiser Windowed Sinc.
Definition: swresample.h:137
signed 32 bits, planar
Definition: samplefmt.h:59
float, planar
Definition: samplefmt.h:60
int in_buffer_count
cached buffer length
Discrete Time axis x
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
Blackman Nuttall Windowed Sinc.
Definition: swresample.h:136
static int resample_flush(struct SwrContext *s)
#define AV_CPU_FLAG_SSSE3
Conroe SSSE3 functions.
Definition: cpu.h:39
struct ResampleContext ResampleContext
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
#define FFMAX(a, b)
Definition: common.h:56
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
Definition: rational.c:36
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
Definition: mathematics.c:118
#define LEN
#define FFMIN(a, b)
Definition: common.h:58
ret
Definition: avfilter.c:821
static int64_t get_delay(struct SwrContext *s, int64_t base)
t
Definition: genspecsines3.m:6
int32_t
int in_sample_rate
input sample rate
static int build_filter(ResampleContext *c, void *filter, double factor, int tap_count, int alloc, int phase_count, int scale, int filter_type, int kaiser_beta)
builds a polyphase filterbank.
int bps
bytes per sample
static ResampleContext * resample_init(ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff0, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:104
for k
NULL
Definition: eval.c:55
AVS_Value src
Definition: avisynth_c.h:523
int swri_resample_int32(struct ResampleContext *c, int32_t *dst, const int32_t *src, int *consumed, int src_size, int dst_size, int update_ctx)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
const AVClass * av_class
#define llrint(x)
Definition: libm.h:112
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
synthesis window for stochastic i
int av_get_cpu_flags(void)
Return the flags which specify extensions supported by the CPU.
Definition: cpu.c:30
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
void * av_calloc(size_t nmemb, size_t size)
Allocate a block of nmemb * size bytes with alignment suitable for all memory accesses (including vec...
Definition: mem.c:213
static double c[64]
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
Same thing on a dB scale
function y
Definition: D.m:1
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
static const struct twinvq_data tab
signed 16 bits, planar
Definition: samplefmt.h:58
int planar
1 if planar audio, 0 otherwise
#define M_PI
Definition: mathematics.h:46
int swri_resample_int16_ssse3(struct ResampleContext *c, int16_t *dst, const int16_t *src, int *consumed, int src_size, int dst_size, int update_ctx)
uint8_t * ch[SWR_CH_MAX]
samples buffer per channel
int swri_resample_int16(struct ResampleContext *c, int16_t *dst, const int16_t *src, int *consumed, int src_size, int dst_size, int update_ctx)
double, planar
Definition: samplefmt.h:61
#define av_unused
Definition: attributes.h:114