swresample.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
3  *
4  * This file is part of libswresample
5  *
6  * libswresample is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * libswresample is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with libswresample; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 #include "libavutil/opt.h"
22 #include "swresample_internal.h"
23 #include "audioconvert.h"
24 #include "libavutil/avassert.h"
26 
27 #include <float.h>
28 
29 #define C30DB M_SQRT2
30 #define C15DB 1.189207115
31 #define C__0DB 1.0
32 #define C_15DB 0.840896415
33 #define C_30DB M_SQRT1_2
34 #define C_45DB 0.594603558
35 #define C_60DB 0.5
36 
37 #define ALIGN 32
38 
39 //TODO split options array out?
40 #define OFFSET(x) offsetof(SwrContext,x)
41 #define PARAM AV_OPT_FLAG_AUDIO_PARAM
42 
43 static const AVOption options[]={
44 {"ich" , "set input channel count" , OFFSET( in.ch_count ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_CH_MAX, PARAM},
45 {"in_channel_count" , "set input channel count" , OFFSET( in.ch_count ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_CH_MAX, PARAM},
46 {"och" , "set output channel count" , OFFSET(out.ch_count ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_CH_MAX, PARAM},
47 {"out_channel_count" , "set output channel count" , OFFSET(out.ch_count ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_CH_MAX, PARAM},
48 {"uch" , "set used channel count" , OFFSET(used_ch_count ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_CH_MAX, PARAM},
49 {"used_channel_count" , "set used channel count" , OFFSET(used_ch_count ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_CH_MAX, PARAM},
50 {"isr" , "set input sample rate" , OFFSET( in_sample_rate), AV_OPT_TYPE_INT , {.i64=0 }, 0 , INT_MAX , PARAM},
51 {"in_sample_rate" , "set input sample rate" , OFFSET( in_sample_rate), AV_OPT_TYPE_INT , {.i64=0 }, 0 , INT_MAX , PARAM},
52 {"osr" , "set output sample rate" , OFFSET(out_sample_rate), AV_OPT_TYPE_INT , {.i64=0 }, 0 , INT_MAX , PARAM},
53 {"out_sample_rate" , "set output sample rate" , OFFSET(out_sample_rate), AV_OPT_TYPE_INT , {.i64=0 }, 0 , INT_MAX , PARAM},
54 {"isf" , "set input sample format" , OFFSET( in_sample_fmt ), AV_OPT_TYPE_SAMPLE_FMT , {.i64=AV_SAMPLE_FMT_NONE}, -1 , AV_SAMPLE_FMT_NB-1, PARAM},
55 {"in_sample_fmt" , "set input sample format" , OFFSET( in_sample_fmt ), AV_OPT_TYPE_SAMPLE_FMT , {.i64=AV_SAMPLE_FMT_NONE}, -1 , AV_SAMPLE_FMT_NB-1, PARAM},
56 {"osf" , "set output sample format" , OFFSET(out_sample_fmt ), AV_OPT_TYPE_SAMPLE_FMT , {.i64=AV_SAMPLE_FMT_NONE}, -1 , AV_SAMPLE_FMT_NB-1, PARAM},
57 {"out_sample_fmt" , "set output sample format" , OFFSET(out_sample_fmt ), AV_OPT_TYPE_SAMPLE_FMT , {.i64=AV_SAMPLE_FMT_NONE}, -1 , AV_SAMPLE_FMT_NB-1, PARAM},
58 {"tsf" , "set internal sample format" , OFFSET(int_sample_fmt ), AV_OPT_TYPE_SAMPLE_FMT , {.i64=AV_SAMPLE_FMT_NONE}, -1 , AV_SAMPLE_FMT_NB-1, PARAM},
59 {"internal_sample_fmt" , "set internal sample format" , OFFSET(int_sample_fmt ), AV_OPT_TYPE_SAMPLE_FMT , {.i64=AV_SAMPLE_FMT_NONE}, -1 , AV_SAMPLE_FMT_NB-1, PARAM},
60 {"icl" , "set input channel layout" , OFFSET( in_ch_layout ), AV_OPT_TYPE_INT64, {.i64=0 }, 0 , INT64_MAX , PARAM, "channel_layout"},
61 {"in_channel_layout" , "set input channel layout" , OFFSET( in_ch_layout ), AV_OPT_TYPE_INT64, {.i64=0 }, 0 , INT64_MAX , PARAM, "channel_layout"},
62 {"ocl" , "set output channel layout" , OFFSET(out_ch_layout ), AV_OPT_TYPE_INT64, {.i64=0 }, 0 , INT64_MAX , PARAM, "channel_layout"},
63 {"out_channel_layout" , "set output channel layout" , OFFSET(out_ch_layout ), AV_OPT_TYPE_INT64, {.i64=0 }, 0 , INT64_MAX , PARAM, "channel_layout"},
64 {"clev" , "set center mix level" , OFFSET(clev ), AV_OPT_TYPE_FLOAT, {.dbl=C_30DB }, -32 , 32 , PARAM},
65 {"center_mix_level" , "set center mix level" , OFFSET(clev ), AV_OPT_TYPE_FLOAT, {.dbl=C_30DB }, -32 , 32 , PARAM},
66 {"slev" , "set surround mix level" , OFFSET(slev ), AV_OPT_TYPE_FLOAT, {.dbl=C_30DB }, -32 , 32 , PARAM},
67 {"surround_mix_level" , "set surround mix Level" , OFFSET(slev ), AV_OPT_TYPE_FLOAT, {.dbl=C_30DB }, -32 , 32 , PARAM},
68 {"lfe_mix_level" , "set LFE mix level" , OFFSET(lfe_mix_level ), AV_OPT_TYPE_FLOAT, {.dbl=0 }, -32 , 32 , PARAM},
69 {"rmvol" , "set rematrix volume" , OFFSET(rematrix_volume), AV_OPT_TYPE_FLOAT, {.dbl=1.0 }, -1000 , 1000 , PARAM},
70 {"rematrix_volume" , "set rematrix volume" , OFFSET(rematrix_volume), AV_OPT_TYPE_FLOAT, {.dbl=1.0 }, -1000 , 1000 , PARAM},
71 
72 {"flags" , "set flags" , OFFSET(flags ), AV_OPT_TYPE_FLAGS, {.i64=0 }, 0 , UINT_MAX , PARAM, "flags"},
73 {"swr_flags" , "set flags" , OFFSET(flags ), AV_OPT_TYPE_FLAGS, {.i64=0 }, 0 , UINT_MAX , PARAM, "flags"},
74 {"res" , "force resampling" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_FLAG_RESAMPLE }, INT_MIN, INT_MAX , PARAM, "flags"},
75 
76 {"dither_scale" , "set dither scale" , OFFSET(dither.scale ), AV_OPT_TYPE_FLOAT, {.dbl=1 }, 0 , INT_MAX , PARAM},
77 
78 {"dither_method" , "set dither method" , OFFSET(dither.method ), AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_DITHER_NB-1, PARAM, "dither_method"},
79 {"rectangular" , "select rectangular dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_RECTANGULAR}, INT_MIN, INT_MAX , PARAM, "dither_method"},
80 {"triangular" , "select triangular dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_TRIANGULAR }, INT_MIN, INT_MAX , PARAM, "dither_method"},
81 {"triangular_hp" , "select triangular dither with high pass" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_TRIANGULAR_HIGHPASS }, INT_MIN, INT_MAX, PARAM, "dither_method"},
82 {"lipshitz" , "select lipshitz noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_LIPSHITZ}, INT_MIN, INT_MAX, PARAM, "dither_method"},
83 {"shibata" , "select shibata noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_SHIBATA }, INT_MIN, INT_MAX, PARAM, "dither_method"},
84 {"low_shibata" , "select low shibata noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_LOW_SHIBATA }, INT_MIN, INT_MAX, PARAM, "dither_method"},
85 {"high_shibata" , "select high shibata noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_HIGH_SHIBATA }, INT_MIN, INT_MAX, PARAM, "dither_method"},
86 {"f_weighted" , "select f-weighted noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_F_WEIGHTED }, INT_MIN, INT_MAX, PARAM, "dither_method"},
87 {"modified_e_weighted" , "select modified-e-weighted noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_MODIFIED_E_WEIGHTED }, INT_MIN, INT_MAX, PARAM, "dither_method"},
88 {"improved_e_weighted" , "select improved-e-weighted noise shaping dither" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_DITHER_NS_IMPROVED_E_WEIGHTED }, INT_MIN, INT_MAX, PARAM, "dither_method"},
89 
90 {"filter_size" , "set swr resampling filter size", OFFSET(filter_size) , AV_OPT_TYPE_INT , {.i64=32 }, 0 , INT_MAX , PARAM },
91 {"phase_shift" , "set swr resampling phase shift", OFFSET(phase_shift) , AV_OPT_TYPE_INT , {.i64=10 }, 0 , 24 , PARAM },
92 {"linear_interp" , "enable linear interpolation" , OFFSET(linear_interp) , AV_OPT_TYPE_INT , {.i64=0 }, 0 , 1 , PARAM },
93 {"cutoff" , "set cutoff frequency ratio" , OFFSET(cutoff) , AV_OPT_TYPE_DOUBLE,{.dbl=0. }, 0 , 1 , PARAM },
94 
95 /* duplicate option in order to work with avconv */
96 {"resample_cutoff" , "set cutoff frequency ratio" , OFFSET(cutoff) , AV_OPT_TYPE_DOUBLE,{.dbl=0. }, 0 , 1 , PARAM },
97 
98 {"resampler" , "set resampling Engine" , OFFSET(engine) , AV_OPT_TYPE_INT , {.i64=0 }, 0 , SWR_ENGINE_NB-1, PARAM, "resampler"},
99 {"swr" , "select SW Resampler" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_ENGINE_SWR }, INT_MIN, INT_MAX , PARAM, "resampler"},
100 {"soxr" , "select SoX Resampler" , 0 , AV_OPT_TYPE_CONST, {.i64=SWR_ENGINE_SOXR }, INT_MIN, INT_MAX , PARAM, "resampler"},
101 {"precision" , "set soxr resampling precision (in bits)"
102  , OFFSET(precision) , AV_OPT_TYPE_DOUBLE,{.dbl=20.0 }, 15.0 , 33.0 , PARAM },
103 {"cheby" , "enable soxr Chebyshev passband & higher-precision irrational ratio approximation"
104  , OFFSET(cheby) , AV_OPT_TYPE_INT , {.i64=0 }, 0 , 1 , PARAM },
105 {"min_comp" , "set minimum difference between timestamps and audio data (in seconds) below which no timestamp compensation of either kind is applied"
106  , OFFSET(min_compensation),AV_OPT_TYPE_FLOAT ,{.dbl=FLT_MAX }, 0 , FLT_MAX , PARAM },
107 {"min_hard_comp" , "set minimum difference between timestamps and audio data (in seconds) to trigger padding/trimming the data."
108  , OFFSET(min_hard_compensation),AV_OPT_TYPE_FLOAT ,{.dbl=0.1 }, 0 , INT_MAX , PARAM },
109 {"comp_duration" , "set duration (in seconds) over which data is stretched/squeezed to make it match the timestamps."
110  , OFFSET(soft_compensation_duration),AV_OPT_TYPE_FLOAT ,{.dbl=1 }, 0 , INT_MAX , PARAM },
111 {"max_soft_comp" , "set maximum factor by which data is stretched/squeezed to make it match the timestamps."
112  , OFFSET(max_soft_compensation),AV_OPT_TYPE_FLOAT ,{.dbl=0 }, INT_MIN, INT_MAX , PARAM },
113 {"async" , "simplified 1 parameter audio timestamp matching, 0(disabled), 1(filling and trimming), >1(maximum stretch/squeeze in samples per second)"
114  , OFFSET(async) , AV_OPT_TYPE_FLOAT ,{.dbl=0 }, INT_MIN, INT_MAX , PARAM },
115 {"first_pts" , "Assume the first pts should be this value (in samples)."
116  , OFFSET(firstpts_in_samples), AV_OPT_TYPE_INT64 ,{.i64=AV_NOPTS_VALUE }, INT64_MIN,INT64_MAX, PARAM },
117 
118 { "matrix_encoding" , "set matrixed stereo encoding" , OFFSET(matrix_encoding), AV_OPT_TYPE_INT ,{.i64 = AV_MATRIX_ENCODING_NONE}, AV_MATRIX_ENCODING_NONE, AV_MATRIX_ENCODING_NB-1, PARAM, "matrix_encoding" },
119  { "none", "select none", 0, AV_OPT_TYPE_CONST, { .i64 = AV_MATRIX_ENCODING_NONE }, INT_MIN, INT_MAX, PARAM, "matrix_encoding" },
120  { "dolby", "select Dolby", 0, AV_OPT_TYPE_CONST, { .i64 = AV_MATRIX_ENCODING_DOLBY }, INT_MIN, INT_MAX, PARAM, "matrix_encoding" },
121  { "dplii", "select Dolby Pro Logic II", 0, AV_OPT_TYPE_CONST, { .i64 = AV_MATRIX_ENCODING_DPLII }, INT_MIN, INT_MAX, PARAM, "matrix_encoding" },
122 
123 { "filter_type" , "select swr filter type" , OFFSET(filter_type) , AV_OPT_TYPE_INT , { .i64 = SWR_FILTER_TYPE_KAISER }, SWR_FILTER_TYPE_CUBIC, SWR_FILTER_TYPE_KAISER, PARAM, "filter_type" },
124  { "cubic" , "select cubic" , 0 , AV_OPT_TYPE_CONST, { .i64 = SWR_FILTER_TYPE_CUBIC }, INT_MIN, INT_MAX, PARAM, "filter_type" },
125  { "blackman_nuttall", "select Blackman Nuttall Windowed Sinc", 0 , AV_OPT_TYPE_CONST, { .i64 = SWR_FILTER_TYPE_BLACKMAN_NUTTALL }, INT_MIN, INT_MAX, PARAM, "filter_type" },
126  { "kaiser" , "select Kaiser Windowed Sinc" , 0 , AV_OPT_TYPE_CONST, { .i64 = SWR_FILTER_TYPE_KAISER }, INT_MIN, INT_MAX, PARAM, "filter_type" },
127 
128 { "kaiser_beta" , "set swr Kaiser Window Beta" , OFFSET(kaiser_beta) , AV_OPT_TYPE_INT , {.i64=9 }, 2 , 16 , PARAM },
129 
130 { "output_sample_bits" , "" , OFFSET(dither.output_sample_bits) , AV_OPT_TYPE_INT , {.i64=0 }, 0 , 64 , 0 },
131 {0}
132 };
133 
134 static const char* context_to_name(void* ptr) {
135  return "SWR";
136 }
137 
138 static const AVClass av_class = {
139  .class_name = "SWResampler",
140  .item_name = context_to_name,
141  .option = options,
142  .version = LIBAVUTIL_VERSION_INT,
143  .log_level_offset_offset = OFFSET(log_level_offset),
144  .parent_log_context_offset = OFFSET(log_ctx),
145  .category = AV_CLASS_CATEGORY_SWRESAMPLER,
146 };
147 
148 unsigned swresample_version(void)
149 {
152 }
153 
154 const char *swresample_configuration(void)
155 {
156  return FFMPEG_CONFIGURATION;
157 }
158 
159 const char *swresample_license(void)
160 {
161 #define LICENSE_PREFIX "libswresample license: "
162  return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
163 }
164 
166  if(!s || s->in_convert) // s needs to be allocated but not initialized
167  return AVERROR(EINVAL);
169  return 0;
170 }
171 
172 const AVClass *swr_get_class(void)
173 {
174  return &av_class;
175 }
176 
178  SwrContext *s= av_mallocz(sizeof(SwrContext));
179  if(s){
180  s->av_class= &av_class;
182  }
183  return s;
184 }
185 
189  int log_offset, void *log_ctx){
190  if(!s) s= swr_alloc();
191  if(!s) return NULL;
192 
193  s->log_level_offset= log_offset;
194  s->log_ctx= log_ctx;
195 
196  av_opt_set_int(s, "ocl", out_ch_layout, 0);
197  av_opt_set_int(s, "osf", out_sample_fmt, 0);
198  av_opt_set_int(s, "osr", out_sample_rate, 0);
199  av_opt_set_int(s, "icl", in_ch_layout, 0);
200  av_opt_set_int(s, "isf", in_sample_fmt, 0);
201  av_opt_set_int(s, "isr", in_sample_rate, 0);
202  av_opt_set_int(s, "tsf", AV_SAMPLE_FMT_NONE, 0);
203  av_opt_set_int(s, "ich", av_get_channel_layout_nb_channels(s-> in_ch_layout), 0);
205  av_opt_set_int(s, "uch", 0, 0);
206  return s;
207 }
208 
210  a->fmt = fmt;
211  a->bps = av_get_bytes_per_sample(fmt);
213 }
214 
215 static void free_temp(AudioData *a){
216  av_free(a->data);
217  memset(a, 0, sizeof(*a));
218 }
219 
221  SwrContext *s= *ss;
222  if(s){
223  free_temp(&s->postin);
224  free_temp(&s->midbuf);
225  free_temp(&s->preout);
226  free_temp(&s->in_buffer);
227  free_temp(&s->silence);
228  free_temp(&s->drop_temp);
229  free_temp(&s->dither.noise);
230  free_temp(&s->dither.temp);
234  if (s->resampler)
235  s->resampler->free(&s->resample);
237  }
238 
239  av_freep(ss);
240 }
241 
243  int ret;
244  s->in_buffer_index= 0;
245  s->in_buffer_count= 0;
247  free_temp(&s->postin);
248  free_temp(&s->midbuf);
249  free_temp(&s->preout);
250  free_temp(&s->in_buffer);
251  free_temp(&s->silence);
252  free_temp(&s->drop_temp);
253  free_temp(&s->dither.noise);
254  free_temp(&s->dither.temp);
255  memset(s->in.ch, 0, sizeof(s->in.ch));
256  memset(s->out.ch, 0, sizeof(s->out.ch));
261 
262  s->flushed = 0;
263 
264  if(s-> in_sample_fmt >= AV_SAMPLE_FMT_NB){
265  av_log(s, AV_LOG_ERROR, "Requested input sample format %d is invalid\n", s->in_sample_fmt);
266  return AVERROR(EINVAL);
267  }
269  av_log(s, AV_LOG_ERROR, "Requested output sample format %d is invalid\n", s->out_sample_fmt);
270  return AVERROR(EINVAL);
271  }
272 
274  av_log(s, AV_LOG_WARNING, "Input channel layout 0x%"PRIx64" is invalid or unsupported.\n", s-> in_ch_layout);
275  s->in_ch_layout = 0;
276  }
277 
279  av_log(s, AV_LOG_WARNING, "Output channel layout 0x%"PRIx64" is invalid or unsupported.\n", s->out_ch_layout);
280  s->out_ch_layout = 0;
281  }
282 
283  switch(s->engine){
284 #if CONFIG_LIBSOXR
285  extern struct Resampler const soxr_resampler;
286  case SWR_ENGINE_SOXR: s->resampler = &soxr_resampler; break;
287 #endif
288  case SWR_ENGINE_SWR : s->resampler = &swri_resampler; break;
289  default:
290  av_log(s, AV_LOG_ERROR, "Requested resampling engine is unavailable\n");
291  return AVERROR(EINVAL);
292  }
293 
294  if(!s->used_ch_count)
295  s->used_ch_count= s->in.ch_count;
296 
297  if(s->used_ch_count && s-> in_ch_layout && s->used_ch_count != av_get_channel_layout_nb_channels(s-> in_ch_layout)){
298  av_log(s, AV_LOG_WARNING, "Input channel layout has a different number of channels than the number of used channels, ignoring layout\n");
299  s-> in_ch_layout= 0;
300  }
301 
302  if(!s-> in_ch_layout)
303  s-> in_ch_layout= av_get_default_channel_layout(s->used_ch_count);
304  if(!s->out_ch_layout)
306 
307  s->rematrix= s->out_ch_layout !=s->in_ch_layout || s->rematrix_volume!=1.0 ||
308  s->rematrix_custom;
309 
313  }else if( av_get_planar_sample_fmt(s-> in_sample_fmt) == AV_SAMPLE_FMT_S32P
315  && !s->rematrix
316  && s->engine != SWR_ENGINE_SOXR){
320  }else{
321  av_log(s, AV_LOG_DEBUG, "Using double precision mode\n");
323  }
324  }
325 
330  av_log(s, AV_LOG_ERROR, "Requested sample format %s is not supported internally, S16/S32/FLT/DBL is supported\n", av_get_sample_fmt_name(s->int_sample_fmt));
331  return AVERROR(EINVAL);
332  }
333 
334  set_audiodata_fmt(&s-> in, s-> in_sample_fmt);
336 
338  if (!s->async && s->min_compensation >= FLT_MAX/2)
339  s->async = 1;
340  s->firstpts =
342  } else
344 
345  if (s->async) {
346  if (s->min_compensation >= FLT_MAX/2)
347  s->min_compensation = 0.001;
348  if (s->async > 1.0001) {
349  s->max_soft_compensation = s->async / (double) s->in_sample_rate;
350  }
351  }
352 
355  }else
356  s->resampler->free(&s->resample);
361  && s->resample){
362  av_log(s, AV_LOG_ERROR, "Resampling only supported with internal s16/s32/flt/dbl\n");
363  return -1;
364  }
365 
366 #define RSC 1 //FIXME finetune
367  if(!s-> in.ch_count)
368  s-> in.ch_count= av_get_channel_layout_nb_channels(s-> in_ch_layout);
369  if(!s->used_ch_count)
370  s->used_ch_count= s->in.ch_count;
371  if(!s->out.ch_count)
373 
374  if(!s-> in.ch_count){
376  av_log(s, AV_LOG_ERROR, "Input channel count and layout are unset\n");
377  return -1;
378  }
379 
380  if ((!s->out_ch_layout || !s->in_ch_layout) && s->used_ch_count != s->out.ch_count && !s->rematrix_custom) {
381  char l1[1024], l2[1024];
382  av_get_channel_layout_string(l1, sizeof(l1), s-> in.ch_count, s-> in_ch_layout);
383  av_get_channel_layout_string(l2, sizeof(l2), s->out.ch_count, s->out_ch_layout);
384  av_log(s, AV_LOG_ERROR, "Rematrix is needed between %s and %s "
385  "but there is not enough information to do it\n", l1, l2);
386  return -1;
387  }
388 
391  s->resample_first= RSC*s->out.ch_count/s->in.ch_count - RSC < s->out_sample_rate/(float)s-> in_sample_rate - 1.0;
392 
393  s->in_buffer= s->in;
394  s->silence = s->in;
395  s->drop_temp= s->out;
396 
397  if(!s->resample && !s->rematrix && !s->channel_map && !s->dither.method){
399  s-> in_sample_fmt, s-> in.ch_count, NULL, 0);
400  return 0;
401  }
402 
404  s-> in_sample_fmt, s->used_ch_count, s->channel_map, 0);
406  s->int_sample_fmt, s->out.ch_count, NULL, 0);
407 
408  if (!s->in_convert || !s->out_convert)
409  return AVERROR(ENOMEM);
410 
411  s->postin= s->in;
412  s->preout= s->out;
413  s->midbuf= s->in;
414 
415  if(s->channel_map){
416  s->postin.ch_count=
418  if(s->resample)
420  }
421  if(!s->resample_first){
422  s->midbuf.ch_count= s->out.ch_count;
423  if(s->resample)
424  s->in_buffer.ch_count = s->out.ch_count;
425  }
426 
430 
431  if(s->resample){
433  }
434 
435  if ((ret = swri_dither_init(s, s->out_sample_fmt, s->int_sample_fmt)) < 0)
436  return ret;
437 
438  if(s->rematrix || s->dither.method)
439  return swri_rematrix_init(s);
440 
441  return 0;
442 }
443 
445  int i, countb;
446  AudioData old;
447 
448  if(count < 0 || count > INT_MAX/2/a->bps/a->ch_count)
449  return AVERROR(EINVAL);
450 
451  if(a->count >= count)
452  return 0;
453 
454  count*=2;
455 
456  countb= FFALIGN(count*a->bps, ALIGN);
457  old= *a;
458 
459  av_assert0(a->bps);
460  av_assert0(a->ch_count);
461 
462  a->data= av_mallocz(countb*a->ch_count);
463  if(!a->data)
464  return AVERROR(ENOMEM);
465  for(i=0; i<a->ch_count; i++){
466  a->ch[i]= a->data + i*(a->planar ? countb : a->bps);
467  if(a->planar) memcpy(a->ch[i], old.ch[i], a->count*a->bps);
468  }
469  if(!a->planar) memcpy(a->ch[0], old.ch[0], a->count*a->ch_count*a->bps);
470  av_free(old.data);
471  a->count= count;
472 
473  return 1;
474 }
475 
476 static void copy(AudioData *out, AudioData *in,
477  int count){
478  av_assert0(out->planar == in->planar);
479  av_assert0(out->bps == in->bps);
480  av_assert0(out->ch_count == in->ch_count);
481  if(out->planar){
482  int ch;
483  for(ch=0; ch<out->ch_count; ch++)
484  memcpy(out->ch[ch], in->ch[ch], count*out->bps);
485  }else
486  memcpy(out->ch[0], in->ch[0], count*out->ch_count*out->bps);
487 }
488 
489 static void fill_audiodata(AudioData *out, uint8_t *in_arg [SWR_CH_MAX]){
490  int i;
491  if(!in_arg){
492  memset(out->ch, 0, sizeof(out->ch));
493  }else if(out->planar){
494  for(i=0; i<out->ch_count; i++)
495  out->ch[i]= in_arg[i];
496  }else{
497  for(i=0; i<out->ch_count; i++)
498  out->ch[i]= in_arg[0] + i*out->bps;
499  }
500 }
501 
503  int i;
504  if(out->planar){
505  for(i=0; i<out->ch_count; i++)
506  in_arg[i]= out->ch[i];
507  }else{
508  in_arg[0]= out->ch[0];
509  }
510 }
511 
512 /**
513  *
514  * out may be equal in.
515  */
516 static void buf_set(AudioData *out, AudioData *in, int count){
517  int ch;
518  if(in->planar){
519  for(ch=0; ch<out->ch_count; ch++)
520  out->ch[ch]= in->ch[ch] + count*out->bps;
521  }else{
522  for(ch=out->ch_count-1; ch>=0; ch--)
523  out->ch[ch]= in->ch[0] + (ch + count*out->ch_count) * out->bps;
524  }
525 }
526 
527 /**
528  *
529  * @return number of samples output per channel
530  */
531 static int resample(SwrContext *s, AudioData *out_param, int out_count,
532  const AudioData * in_param, int in_count){
533  AudioData in, out, tmp;
534  int ret_sum=0;
535  int border=0;
536 
537  av_assert1(s->in_buffer.ch_count == in_param->ch_count);
538  av_assert1(s->in_buffer.planar == in_param->planar);
539  av_assert1(s->in_buffer.fmt == in_param->fmt);
540 
541  tmp=out=*out_param;
542  in = *in_param;
543 
544  do{
545  int ret, size, consumed;
547  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
548  ret= s->resampler->multiple_resample(s->resample, &out, out_count, &tmp, s->in_buffer_count, &consumed);
549  out_count -= ret;
550  ret_sum += ret;
551  buf_set(&out, &out, ret);
552  s->in_buffer_count -= consumed;
553  s->in_buffer_index += consumed;
554 
555  if(!in_count)
556  break;
557  if(s->in_buffer_count <= border){
558  buf_set(&in, &in, -s->in_buffer_count);
559  in_count += s->in_buffer_count;
560  s->in_buffer_count=0;
561  s->in_buffer_index=0;
562  border = 0;
563  }
564  }
565 
566  if((s->flushed || in_count) && !s->in_buffer_count){
567  s->in_buffer_index=0;
568  ret= s->resampler->multiple_resample(s->resample, &out, out_count, &in, in_count, &consumed);
569  out_count -= ret;
570  ret_sum += ret;
571  buf_set(&out, &out, ret);
572  in_count -= consumed;
573  buf_set(&in, &in, consumed);
574  }
575 
576  //TODO is this check sane considering the advanced copy avoidance below
577  size= s->in_buffer_index + s->in_buffer_count + in_count;
578  if( size > s->in_buffer.count
579  && s->in_buffer_count + in_count <= s->in_buffer_index){
580  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
581  copy(&s->in_buffer, &tmp, s->in_buffer_count);
582  s->in_buffer_index=0;
583  }else
584  if((ret=swri_realloc_audio(&s->in_buffer, size)) < 0)
585  return ret;
586 
587  if(in_count){
588  int count= in_count;
589  if(s->in_buffer_count && s->in_buffer_count+2 < count && out_count) count= s->in_buffer_count+2;
590 
591  buf_set(&tmp, &s->in_buffer, s->in_buffer_index + s->in_buffer_count);
592  copy(&tmp, &in, /*in_*/count);
593  s->in_buffer_count += count;
594  in_count -= count;
595  border += count;
596  buf_set(&in, &in, count);
598  if(s->in_buffer_count != count || in_count)
599  continue;
600  }
601  break;
602  }while(1);
603 
604  s->resample_in_constraint= !!out_count;
605 
606  return ret_sum;
607 }
608 
609 static int swr_convert_internal(struct SwrContext *s, AudioData *out, int out_count,
610  AudioData *in , int in_count){
611  AudioData *postin, *midbuf, *preout;
612  int ret/*, in_max*/;
613  AudioData preout_tmp, midbuf_tmp;
614 
615  if(s->full_convert){
616  av_assert0(!s->resample);
617  swri_audio_convert(s->full_convert, out, in, in_count);
618  return out_count;
619  }
620 
621 // in_max= out_count*(int64_t)s->in_sample_rate / s->out_sample_rate + resample_filter_taps;
622 // in_count= FFMIN(in_count, in_in + 2 - s->hist_buffer_count);
623 
624  if((ret=swri_realloc_audio(&s->postin, in_count))<0)
625  return ret;
626  if(s->resample_first){
628  if((ret=swri_realloc_audio(&s->midbuf, out_count))<0)
629  return ret;
630  }else{
632  if((ret=swri_realloc_audio(&s->midbuf, in_count))<0)
633  return ret;
634  }
635  if((ret=swri_realloc_audio(&s->preout, out_count))<0)
636  return ret;
637 
638  postin= &s->postin;
639 
640  midbuf_tmp= s->midbuf;
641  midbuf= &midbuf_tmp;
642  preout_tmp= s->preout;
643  preout= &preout_tmp;
644 
645  if(s->int_sample_fmt == s-> in_sample_fmt && s->in.planar && !s->channel_map)
646  postin= in;
647 
648  if(s->resample_first ? !s->resample : !s->rematrix)
649  midbuf= postin;
650 
651  if(s->resample_first ? !s->rematrix : !s->resample)
652  preout= midbuf;
653 
654  if(s->int_sample_fmt == s->out_sample_fmt && s->out.planar){
655  if(preout==in){
656  out_count= FFMIN(out_count, in_count); //TODO check at the end if this is needed or redundant
657  av_assert0(s->in.planar); //we only support planar internally so it has to be, we support copying non planar though
658  copy(out, in, out_count);
659  return out_count;
660  }
661  else if(preout==postin) preout= midbuf= postin= out;
662  else if(preout==midbuf) preout= midbuf= out;
663  else preout= out;
664  }
665 
666  if(in != postin){
667  swri_audio_convert(s->in_convert, postin, in, in_count);
668  }
669 
670  if(s->resample_first){
671  if(postin != midbuf)
672  out_count= resample(s, midbuf, out_count, postin, in_count);
673  if(midbuf != preout)
674  swri_rematrix(s, preout, midbuf, out_count, preout==out);
675  }else{
676  if(postin != midbuf)
677  swri_rematrix(s, midbuf, postin, in_count, midbuf==out);
678  if(midbuf != preout)
679  out_count= resample(s, preout, out_count, midbuf, in_count);
680  }
681 
682  if(preout != out && out_count){
683  AudioData *conv_src = preout;
684  if(s->dither.method){
685  int ch;
686  int dither_count= FFMAX(out_count, 1<<16);
687 
688  if (preout == in) {
689  conv_src = &s->dither.temp;
690  if((ret=swri_realloc_audio(&s->dither.temp, dither_count))<0)
691  return ret;
692  }
693 
694  if((ret=swri_realloc_audio(&s->dither.noise, dither_count))<0)
695  return ret;
696  if(ret)
697  for(ch=0; ch<s->dither.noise.ch_count; ch++)
698  swri_get_dither(s, s->dither.noise.ch[ch], s->dither.noise.count, 12345678913579<<ch, s->dither.noise.fmt);
699  av_assert0(s->dither.noise.ch_count == preout->ch_count);
700 
701  if(s->dither.noise_pos + out_count > s->dither.noise.count)
702  s->dither.noise_pos = 0;
703 
704  if (s->dither.method < SWR_DITHER_NS){
705  if (s->mix_2_1_simd) {
706  int len1= out_count&~15;
707  int off = len1 * preout->bps;
708 
709  if(len1)
710  for(ch=0; ch<preout->ch_count; ch++)
711  s->mix_2_1_simd(conv_src->ch[ch], preout->ch[ch], s->dither.noise.ch[ch] + s->dither.noise.bps * s->dither.noise_pos, s->native_one, 0, 0, len1);
712  if(out_count != len1)
713  for(ch=0; ch<preout->ch_count; ch++)
714  s->mix_2_1_f(conv_src->ch[ch] + off, preout->ch[ch] + off, s->dither.noise.ch[ch] + s->dither.noise.bps * s->dither.noise_pos + off + len1, s->native_one, 0, 0, out_count - len1);
715  } else {
716  for(ch=0; ch<preout->ch_count; ch++)
717  s->mix_2_1_f(conv_src->ch[ch], preout->ch[ch], s->dither.noise.ch[ch] + s->dither.noise.bps * s->dither.noise_pos, s->native_one, 0, 0, out_count);
718  }
719  } else {
720  switch(s->int_sample_fmt) {
721  case AV_SAMPLE_FMT_S16P :swri_noise_shaping_int16(s, conv_src, preout, &s->dither.noise, out_count); break;
722  case AV_SAMPLE_FMT_S32P :swri_noise_shaping_int32(s, conv_src, preout, &s->dither.noise, out_count); break;
723  case AV_SAMPLE_FMT_FLTP :swri_noise_shaping_float(s, conv_src, preout, &s->dither.noise, out_count); break;
724  case AV_SAMPLE_FMT_DBLP :swri_noise_shaping_double(s,conv_src, preout, &s->dither.noise, out_count); break;
725  }
726  }
727  s->dither.noise_pos += out_count;
728  }
729 //FIXME packed doesnt need more than 1 chan here!
730  swri_audio_convert(s->out_convert, out, conv_src, out_count);
731  }
732  return out_count;
733 }
734 
735 int swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count,
736  const uint8_t *in_arg [SWR_CH_MAX], int in_count){
737  AudioData * in= &s->in;
738  AudioData *out= &s->out;
739 
740  while(s->drop_output > 0){
741  int ret;
742  uint8_t *tmp_arg[SWR_CH_MAX];
743 #define MAX_DROP_STEP 16384
745  return ret;
746 
747  reversefill_audiodata(&s->drop_temp, tmp_arg);
748  s->drop_output *= -1; //FIXME find a less hackish solution
749  ret = swr_convert(s, tmp_arg, FFMIN(-s->drop_output, MAX_DROP_STEP), in_arg, in_count); //FIXME optimize but this is as good as never called so maybe it doesnt matter
750  s->drop_output *= -1;
751  in_count = 0;
752  if(ret>0) {
753  s->drop_output -= ret;
754  continue;
755  }
756 
757  if(s->drop_output || !out_arg)
758  return 0;
759  }
760 
761  if(!in_arg){
762  if(s->resample){
763  if (!s->flushed)
764  s->resampler->flush(s);
765  s->resample_in_constraint = 0;
766  s->flushed = 1;
767  }else if(!s->in_buffer_count){
768  return 0;
769  }
770  }else
771  fill_audiodata(in , (void*)in_arg);
772 
773  fill_audiodata(out, out_arg);
774 
775  if(s->resample){
776  int ret = swr_convert_internal(s, out, out_count, in, in_count);
777  if(ret>0 && !s->drop_output)
778  s->outpts += ret * (int64_t)s->in_sample_rate;
779  return ret;
780  }else{
781  AudioData tmp= *in;
782  int ret2=0;
783  int ret, size;
784  size = FFMIN(out_count, s->in_buffer_count);
785  if(size){
786  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
787  ret= swr_convert_internal(s, out, size, &tmp, size);
788  if(ret<0)
789  return ret;
790  ret2= ret;
791  s->in_buffer_count -= ret;
792  s->in_buffer_index += ret;
793  buf_set(out, out, ret);
794  out_count -= ret;
795  if(!s->in_buffer_count)
796  s->in_buffer_index = 0;
797  }
798 
799  if(in_count){
800  size= s->in_buffer_index + s->in_buffer_count + in_count - out_count;
801 
802  if(in_count > out_count) { //FIXME move after swr_convert_internal
803  if( size > s->in_buffer.count
804  && s->in_buffer_count + in_count - out_count <= s->in_buffer_index){
805  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
806  copy(&s->in_buffer, &tmp, s->in_buffer_count);
807  s->in_buffer_index=0;
808  }else
809  if((ret=swri_realloc_audio(&s->in_buffer, size)) < 0)
810  return ret;
811  }
812 
813  if(out_count){
814  size = FFMIN(in_count, out_count);
815  ret= swr_convert_internal(s, out, size, in, size);
816  if(ret<0)
817  return ret;
818  buf_set(in, in, ret);
819  in_count -= ret;
820  ret2 += ret;
821  }
822  if(in_count){
823  buf_set(&tmp, &s->in_buffer, s->in_buffer_index + s->in_buffer_count);
824  copy(&tmp, in, in_count);
825  s->in_buffer_count += in_count;
826  }
827  }
828  if(ret2>0 && !s->drop_output)
829  s->outpts += ret2 * (int64_t)s->in_sample_rate;
830  return ret2;
831  }
832 }
833 
834 int swr_drop_output(struct SwrContext *s, int count){
835  s->drop_output += count;
836 
837  if(s->drop_output <= 0)
838  return 0;
839 
840  av_log(s, AV_LOG_VERBOSE, "discarding %d audio samples\n", count);
841  return swr_convert(s, NULL, s->drop_output, NULL, 0);
842 }
843 
845  int ret, i;
846  uint8_t *tmp_arg[SWR_CH_MAX];
847 
848  if(count <= 0)
849  return 0;
850 
851 #define MAX_SILENCE_STEP 16384
852  while (count > MAX_SILENCE_STEP) {
853  if ((ret = swr_inject_silence(s, MAX_SILENCE_STEP)) < 0)
854  return ret;
855  count -= MAX_SILENCE_STEP;
856  }
857 
858  if((ret=swri_realloc_audio(&s->silence, count))<0)
859  return ret;
860 
861  if(s->silence.planar) for(i=0; i<s->silence.ch_count; i++) {
862  memset(s->silence.ch[i], s->silence.bps==1 ? 0x80 : 0, count*s->silence.bps);
863  } else
864  memset(s->silence.ch[0], s->silence.bps==1 ? 0x80 : 0, count*s->silence.bps*s->silence.ch_count);
865 
866  reversefill_audiodata(&s->silence, tmp_arg);
867  av_log(s, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", count);
868  ret = swr_convert(s, NULL, 0, (const uint8_t**)tmp_arg, count);
869  return ret;
870 }
871 
872 int64_t swr_get_delay(struct SwrContext *s, int64_t base){
873  if (s->resampler && s->resample){
874  return s->resampler->get_delay(s, base);
875  }else{
876  return (s->in_buffer_count*base + (s->in_sample_rate>>1))/ s->in_sample_rate;
877  }
878 }
879 
880 int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance){
881  int ret;
882 
883  if (!s || compensation_distance < 0)
884  return AVERROR(EINVAL);
885  if (!compensation_distance && sample_delta)
886  return AVERROR(EINVAL);
887  if (!s->resample) {
888  s->flags |= SWR_FLAG_RESAMPLE;
889  ret = swr_init(s);
890  if (ret < 0)
891  return ret;
892  }
893  if (!s->resampler->set_compensation){
894  return AVERROR(EINVAL);
895  }else{
896  return s->resampler->set_compensation(s->resample, sample_delta, compensation_distance);
897  }
898 }
899 
900 int64_t swr_next_pts(struct SwrContext *s, int64_t pts){
901  if(pts == INT64_MIN)
902  return s->outpts;
903 
904  if (s->firstpts == AV_NOPTS_VALUE)
905  s->outpts = s->firstpts = pts;
906 
907  if(s->min_compensation >= FLT_MAX) {
908  return (s->outpts = pts - swr_get_delay(s, s->in_sample_rate * (int64_t)s->out_sample_rate));
909  } else {
910  int64_t delta = pts - swr_get_delay(s, s->in_sample_rate * (int64_t)s->out_sample_rate) - s->outpts + s->drop_output*(int64_t)s->in_sample_rate;
911  double fdelta = delta /(double)(s->in_sample_rate * (int64_t)s->out_sample_rate);
912 
913  if(fabs(fdelta) > s->min_compensation) {
914  if(s->outpts == s->firstpts || fabs(fdelta) > s->min_hard_compensation){
915  int ret;
916  if(delta > 0) ret = swr_inject_silence(s, delta / s->out_sample_rate);
917  else ret = swr_drop_output (s, -delta / s-> in_sample_rate);
918  if(ret<0){
919  av_log(s, AV_LOG_ERROR, "Failed to compensate for timestamp delta of %f\n", fdelta);
920  }
923  double max_soft_compensation = s->max_soft_compensation / (s->max_soft_compensation < 0 ? -s->in_sample_rate : 1);
924  int comp = av_clipf(fdelta, -max_soft_compensation, max_soft_compensation) * duration ;
925  av_log(s, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n", fdelta, comp, duration);
926  swr_set_compensation(s, comp, duration);
927  }
928  }
929 
930  return s->outpts;
931  }
932 }
Number of sample formats. DO NOT USE if linking dynamically.
Definition: samplefmt.h:63
struct AudioConvert * in_convert
input conversion context
const AVClass * av_class
AVClass used for AVOption and av_log()
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
struct AudioConvert * full_convert
full conversion context (single conversion for input and output)
const char * s
Definition: avisynth_c.h:668
AudioData temp
temporary storage when writing into the input buffer isnt possible
#define RSC
int out_sample_rate
output sample rate
enum SwrFilterType filter_type
swr resampling filter type
int swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count, const uint8_t *in_arg[SWR_CH_MAX], int in_count)
Definition: swresample.c:735
SoX Resampler.
Definition: swresample.h:129
AVOption.
Definition: opt.h:251
enum AVSampleFormat int_sample_fmt
internal sample format (AV_SAMPLE_FMT_FLTP or AV_SAMPLE_FMT_S16P)
Audio buffer used for intermediate storage between conversion phases.
Definition: oss_audio.c:46
const char * fmt
Definition: avisynth_c.h:669
enum AVResampleDitherMethod method
multiple_resample_func multiple_resample
int count
number of samples
int ch_count
number of channels
void swri_audio_convert_free(AudioConvert **ctx)
Free audio sample format converter context.
float soft_compensation_duration
swr duration over which soft compensation is applied
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:154
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:942
int rematrix_custom
flag to indicate that a custom matrix has been defined
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy)
Definition: rematrix.c:393
int in_buffer_index
cached buffer position
int64_t swr_next_pts(struct SwrContext *s, int64_t pts)
Convert the next timestamp from input to output timestamps are in 1/(in_sample_rate * out_sample_rate...
Definition: swresample.c:900
AudioData in_buffer
cached audio data (convert and resample purpose)
int resample_in_constraint
1 if the input end was reach before the output end, 0 otherwise
struct ResampleContext * resample
resampling context
static void reversefill_audiodata(AudioData *out, uint8_t *in_arg[SWR_CH_MAX])
Definition: swresample.c:502
float async
swr simple 1 parameter async, similar to ffmpegs -async
const int * channel_map
channel index (or -1 if muted channel) map
#define FFMPEG_LICENSE
Definition: config.h:5
#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
int log_level_offset
logging level offset
struct Resampler const * resampler
resampler virtual function table
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance)
Activate resampling compensation.
Definition: swresample.c:880
av_cold int swri_rematrix_init(SwrContext *s)
Definition: rematrix.c:327
uint8_t
av_cold struct SwrContext * swr_alloc(void)
Allocate SwrContext.
Definition: swresample.c:177
#define av_cold
Definition: attributes.h:78
float max_soft_compensation
swr maximum soft compensation in seconds over soft_compensation_duration
AudioConvert * swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags)
Create an audio sample format converter context.
float delta
AVOptions.
enum AVSampleFormat fmt
sample format
void * log_ctx
parent logging context
AudioData out
converted output audio data
int swri_realloc_audio(AudioData *a, int count)
Definition: swresample.c:444
int phase_shift
log2 of the number of entries in the resampling polyphase filterbank
AudioData in
input audio data
enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt)
Get the planar alternative form of the given sample format.
Definition: samplefmt.c:82
float min_hard_compensation
swr minimum below which no silence inject / sample drop will happen
struct Resampler const swri_resampler
Kaiser Windowed Sinc.
Definition: swresample.h:137
signed 32 bits, planar
Definition: samplefmt.h:59
static int64_t duration
Definition: ffplay.c:294
enum AVSampleFormat out_sample_fmt
output sample format
#define LIBSWRESAMPLE_VERSION_MICRO
float, planar
Definition: samplefmt.h:60
int in_buffer_count
cached buffer length
AudioData postin
post-input audio data: used for rematrix/resample
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
#define LICENSE_PREFIX
float slev
surround mixing level
int output_sample_bits
the number of used output bits, needed to scale dither correctly
static int swr_convert_internal(struct SwrContext *s, AudioData *out, int out_count, AudioData *in, int in_count)
Definition: swresample.c:609
double cutoff
resampling cutoff frequency (swr: 6dB point; soxr: 0dB point).
static void buf_set(AudioData *out, AudioData *in, int count)
out may be equal in.
Definition: swresample.c:516
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
float clev
center mixing level
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
Definition: opt.c:394
simple assert() macros that are a bit more flexible than ISO C assert().
#define PARAM
Definition: swresample.c:41
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int64_t swr_get_delay(struct SwrContext *s, int64_t base)
Gets the delay the next input sample will experience relative to the next output sample.
Definition: swresample.c:872
mix_2_1_func_type * mix_2_1_simd
resample_flush_func flush
#define FFMAX(a, b)
Definition: common.h:56
not part of API/ABI
Definition: swresample.h:130
int size
int64_t firstpts
first PTS
AudioData preout
pre-output audio data: used for rematrix/resample
#define SWR_FLAG_RESAMPLE
Force resampling even if equal sample rate.
Definition: swresample.h:105
AudioData midbuf
intermediate audio data (postin/preout)
not part of API/ABI
Definition: swresample.h:123
#define LIBSWRESAMPLE_VERSION_INT
#define AV_LOG_VERBOSE
Definition: log.h:157
resample_free_func free
audio channel layout utility functions
int flags
miscellaneous flags such as SWR_FLAG_RESAMPLE
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
static const char * context_to_name(void *ptr)
Definition: swresample.c:134
#define FFMIN(a, b)
Definition: common.h:58
static void free_temp(AudioData *a)
Definition: swresample.c:215
#define OFFSET(x)
Definition: swresample.c:40
void swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat noise_fmt)
int swr_drop_output(struct SwrContext *s, int count)
Drops the specified number of output samples.
Definition: swresample.c:834
int drop_output
number of output samples to drop
int linear_interp
if 1 then the resampling FIR filter will be linearly interpolated
ret
Definition: avfilter.c:821
void swri_noise_shaping_int32(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
double precision
soxr resampling precision (in bits)
#define C_30DB
Definition: swresample.c:33
AudioData noise
noise used for dithering
int64_t out_ch_layout
output channel layout
struct SwrContext * swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)
Allocate SwrContext if needed and set/reset common parameters.
Definition: swresample.c:186
#define MAX_SILENCE_STEP
not part of API/ABI
Definition: swresample.h:115
enum AVMatrixEncoding matrix_encoding
matrixed stereo encoding
int in_sample_rate
input sample rate
int bps
bytes per sample
#define ALIGN
Definition: swresample.c:37
int rematrix
flag to indicate if rematrixing is needed (basically if input and output layouts mismatch) ...
const AVClass * swr_get_class(void)
Get the AVClass for swrContext.
Definition: swresample.c:172
set_compensation_func set_compensation
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
Definition: samplefmt.c:47
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
static void copy(AudioData *out, AudioData *in, int count)
Definition: swresample.c:476
void swri_noise_shaping_double(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:104
NULL
Definition: eval.c:55
int64_t outpts
output PTS
int filter_size
length of each FIR filter in the resampling filterbank relative to the cutoff frequency ...
uint8_t * data[AVRESAMPLE_MAX_CHANNELS]
data plane pointers
Definition: audio_data.h:37
av_cold void swr_free(SwrContext **ss)
Free the given SwrContext and set the pointer to NULL.
Definition: swresample.c:220
float min_compensation
swr minimum below which no compensation will happen
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define MAX_DROP_STEP
int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map)
Set a customized input channel mapping.
Definition: swresample.c:165
Describe the class of an AVClass context structure.
Definition: log.h:50
enum SwrEngine engine
struct DitherContext dither
void swri_noise_shaping_float(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition: samplefmt.c:118
synthesis window for stochastic i
static void fill_audiodata(AudioData *out, uint8_t *in_arg[SWR_CH_MAX])
Definition: swresample.c:489
const char * swresample_license(void)
Return the swr license.
Definition: swresample.c:159
static int resample(SwrContext *s, AudioData *out_param, int out_count, const AudioData *in_param, int in_count)
Definition: swresample.c:531
enum AVSampleFormat in_sample_fmt
input sample format
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
Audio format conversion routines.
static int flags
Definition: cpu.c:23
uint8_t * native_one
int flushed
1 if data is to be flushed and no further input is expected
static const AVClass av_class
Definition: swresample.c:138
SW Resampler.
Definition: swresample.h:128
int64_t in_ch_layout
input channel layout
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
#define SWR_CH_MAX
Maximum number of channels.
Definition: swresample.h:102
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt)
int cheby
soxr: if 1 then passband rolloff will be none (Chebyshev) & irrational ratio approximation precision ...
get_delay_func get_delay
float lfe_mix_level
LFE mixing level.
#define FFMPEG_CONFIGURATION
Definition: config.h:4
void swri_noise_shaping_int16(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len)
Convert between audio sample formats.
unsigned swresample_version(void)
Return the LIBSWRESAMPLE_VERSION_INT constant.
Definition: swresample.c:148
av_cold void swri_rematrix_free(SwrContext *s)
Definition: rematrix.c:387
struct AudioConvert * out_convert
output conversion context
float rematrix_volume
rematrixing volume coefficient
static void set_audiodata_fmt(AudioData *a, enum AVSampleFormat fmt)
Definition: swresample.c:209
int kaiser_beta
swr beta value for Kaiser window (only applicable if filter_type == AV_FILTER_TYPE_KAISER) ...
signed 16 bits, planar
Definition: samplefmt.h:58
mix_2_1_func_type * mix_2_1_f
int64_t firstpts_in_samples
swr first pts in samples
static void comp(unsigned char *dst, int dst_stride, unsigned char *src, int src_stride, int add)
Definition: eamad.c:71
void INT64 INT64 count
Definition: avisynth_c.h:594
int planar
1 if planar audio, 0 otherwise
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
AudioData drop_temp
temporary used to discard output
static const AVOption options[]
Definition: swresample.c:43
uint8_t * ch[SWR_CH_MAX]
samples buffer per channel
int used_ch_count
number of used input channels (mapped channel count if channel_map, otherwise in.ch_count) ...
resample_init_func init
const char * swresample_configuration(void)
Return the swr build-time configuration.
Definition: swresample.c:154
double, planar
Definition: samplefmt.h:61
int swr_inject_silence(struct SwrContext *s, int count)
Injects the specified number of silence samples.
Definition: swresample.c:844
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
AudioData silence
temporary with silence
int resample_first
1 if resampling must come first, 0 if rematrixing
av_cold int swr_init(struct SwrContext *s)
Initialize context after user parameters have been set.
Definition: swresample.c:242
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
struct Resampler const soxr_resampler
Definition: soxr_resample.c:90
int64_t av_get_default_channel_layout(int nb_channels)
Return default channel layout for a given number of channels.