FFmpeg
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/mem.h"
22 #include "libavutil/opt.h"
23 #include "swresample_internal.h"
24 #include "audioconvert.h"
25 #include "libavutil/avassert.h"
27 #include "libavutil/internal.h"
28 
29 #include <float.h>
30 
31 #define ALIGN 32
32 
33 int swri_check_chlayout(struct SwrContext *s, const AVChannelLayout *chl, const char *name) {
34  char l1[1024];
35  int ret;
36 
37  if (!(ret = av_channel_layout_check(chl)) || chl->nb_channels > SWR_CH_MAX) {
38  if (ret)
39  av_channel_layout_describe(chl, l1, sizeof(l1));
40  av_log(s, AV_LOG_WARNING, "%s channel layout \"%s\" is invalid or unsupported.\n", name, ret ? l1 : "");
41  return AVERROR(EINVAL);
42  }
43 
44  return 0;
45 }
46 
48  if(!s || s->in_convert) // s needs to be allocated but not initialized
49  return AVERROR(EINVAL);
50  s->channel_map = channel_map;
51  return 0;
52 }
53 
55  const AVChannelLayout *out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate,
56  const AVChannelLayout *in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate,
57  int log_offset, void *log_ctx) {
58  struct SwrContext *s = *ps;
59  int ret;
60 
61  if (!s) s = swr_alloc();
62  if (!s) return AVERROR(ENOMEM);
63 
64  *ps = s;
65 
66  s->log_level_offset = log_offset;
67  s->log_ctx = log_ctx;
68 
69  if ((ret = av_opt_set_chlayout(s, "ochl", out_ch_layout, 0)) < 0)
70  goto fail;
71  if ((ret = swri_check_chlayout(s, out_ch_layout, "ochl")) < 0)
72  goto fail;
73 
74  if ((ret = av_opt_set_int(s, "osf", out_sample_fmt, 0)) < 0)
75  goto fail;
76 
77  if ((ret = av_opt_set_int(s, "osr", out_sample_rate, 0)) < 0)
78  goto fail;
79 
80  if ((ret = av_opt_set_chlayout(s, "ichl", in_ch_layout, 0)) < 0)
81  goto fail;
82  if ((ret = swri_check_chlayout(s, in_ch_layout, "ichl")) < 0)
83  goto fail;
84 
85  if ((ret = av_opt_set_int(s, "isf", in_sample_fmt, 0)) < 0)
86  goto fail;
87 
88  if ((ret = av_opt_set_int(s, "isr", in_sample_rate, 0)) < 0)
89  goto fail;
90 
91  return 0;
92 fail:
93  av_log(s, AV_LOG_ERROR, "Failed to set option\n");
94  swr_free(ps);
95  return ret;
96 }
97 
98 static void set_audiodata_fmt(AudioData *a, enum AVSampleFormat fmt){
99  a->fmt = fmt;
100  a->bps = av_get_bytes_per_sample(fmt);
101  a->planar= av_sample_fmt_is_planar(fmt);
102  if (a->ch_count == 1)
103  a->planar = 1;
104 }
105 
106 static void free_temp(AudioData *a){
107  av_free(a->data);
108  memset(a, 0, sizeof(*a));
109 }
110 
111 static void clear_context(SwrContext *s){
112  s->in_buffer_index= 0;
113  s->in_buffer_count= 0;
114  s->resample_in_constraint= 0;
115  memset(s->in.ch, 0, sizeof(s->in.ch));
116  memset(s->out.ch, 0, sizeof(s->out.ch));
117  free_temp(&s->postin);
118  free_temp(&s->midbuf);
119  free_temp(&s->preout);
120  free_temp(&s->in_buffer);
121  free_temp(&s->silence);
122  free_temp(&s->drop_temp);
123  free_temp(&s->dither.noise);
124  free_temp(&s->dither.temp);
125  av_channel_layout_uninit(&s->in_ch_layout);
126  av_channel_layout_uninit(&s->out_ch_layout);
127  av_channel_layout_uninit(&s->used_ch_layout);
129  swri_audio_convert_free(&s->out_convert);
130  swri_audio_convert_free(&s->full_convert);
132 
133  s->delayed_samples_fixup = 0;
134  s->flushed = 0;
135 }
136 
138  SwrContext *s= *ss;
139  if(s){
140  clear_context(s);
141  av_channel_layout_uninit(&s->user_in_chlayout);
142  av_channel_layout_uninit(&s->user_out_chlayout);
143  av_channel_layout_uninit(&s->user_used_chlayout);
144 
145  if (s->resampler)
146  s->resampler->free(&s->resample);
147  }
148 
149  av_freep(ss);
150 }
151 
153  clear_context(s);
154 }
155 
157  int ret;
158  char l1[1024], l2[1024];
159 
160  clear_context(s);
161 
162  if((unsigned) s-> in_sample_fmt >= AV_SAMPLE_FMT_NB){
163  av_log(s, AV_LOG_ERROR, "Requested input sample format %d is invalid\n", s->in_sample_fmt);
164  return AVERROR(EINVAL);
165  }
166  if((unsigned) s->out_sample_fmt >= AV_SAMPLE_FMT_NB){
167  av_log(s, AV_LOG_ERROR, "Requested output sample format %d is invalid\n", s->out_sample_fmt);
168  return AVERROR(EINVAL);
169  }
170 
171  if(s-> in_sample_rate <= 0){
172  av_log(s, AV_LOG_ERROR, "Requested input sample rate %d is invalid\n", s->in_sample_rate);
173  return AVERROR(EINVAL);
174  }
175  if(s->out_sample_rate <= 0){
176  av_log(s, AV_LOG_ERROR, "Requested output sample rate %d is invalid\n", s->out_sample_rate);
177  return AVERROR(EINVAL);
178  }
179 
180  s->out.ch_count = s-> user_out_chlayout.nb_channels;
182 
183  if (swri_check_chlayout(s, &s->user_in_chlayout , "input") ||
184  swri_check_chlayout(s, &s->user_out_chlayout, "output"))
185  return AVERROR(EINVAL);
186 
187  ret = av_channel_layout_copy(&s->in_ch_layout, &s->user_in_chlayout);
188  ret |= av_channel_layout_copy(&s->out_ch_layout, &s->user_out_chlayout);
189  ret |= av_channel_layout_copy(&s->used_ch_layout, &s->user_used_chlayout);
190  if (ret < 0)
191  return ret;
192 
193  s->int_sample_fmt= s->user_int_sample_fmt;
194 
195  s->dither.method = s->user_dither_method;
196 
197  switch(s->engine){
198 #if CONFIG_LIBSOXR
199  case SWR_ENGINE_SOXR: s->resampler = &swri_soxr_resampler; break;
200 #endif
201  case SWR_ENGINE_SWR : s->resampler = &swri_resampler; break;
202  default:
203  av_log(s, AV_LOG_ERROR, "Requested resampling engine is unavailable\n");
204  return AVERROR(EINVAL);
205  }
206 
207  if (!av_channel_layout_check(&s->used_ch_layout))
208  av_channel_layout_default(&s->used_ch_layout, s->in.ch_count);
209 
210  if (s->used_ch_layout.nb_channels != s->in_ch_layout.nb_channels)
211  av_channel_layout_uninit(&s->in_ch_layout);
212 
213  if (s->used_ch_layout.order == AV_CHANNEL_ORDER_UNSPEC)
214  av_channel_layout_default(&s->used_ch_layout, s->used_ch_layout.nb_channels);
215  if (s->in_ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) {
216  ret = av_channel_layout_copy(&s->in_ch_layout, &s->used_ch_layout);
217  if (ret < 0)
218  return ret;
219  }
220  if (s->out_ch_layout.order == AV_CHANNEL_ORDER_UNSPEC)
221  av_channel_layout_default(&s->out_ch_layout, s->out.ch_count);
222 
223  s->rematrix = av_channel_layout_compare(&s->out_ch_layout, &s->in_ch_layout) ||
224  s->rematrix_volume!=1.0 ||
225  s->rematrix_custom;
226 
227  if(s->int_sample_fmt == AV_SAMPLE_FMT_NONE){
228  // 16bit or less to 16bit or less with the same sample rate
230  && av_get_bytes_per_sample(s->out_sample_fmt) <= 2
231  && s->out_sample_rate==s->in_sample_rate) {
232  s->int_sample_fmt= AV_SAMPLE_FMT_S16P;
233  // 8 -> 8, 16->8, 8->16bit
235  +av_get_bytes_per_sample(s->out_sample_fmt) <= 3 ) {
236  s->int_sample_fmt= AV_SAMPLE_FMT_S16P;
237  }else if( av_get_bytes_per_sample(s-> in_sample_fmt) <= 2
238  && !s->rematrix
239  && s->out_sample_rate==s->in_sample_rate
240  && !(s->flags & SWR_FLAG_RESAMPLE)){
241  s->int_sample_fmt= AV_SAMPLE_FMT_S16P;
243  && av_get_planar_sample_fmt(s->out_sample_fmt) == AV_SAMPLE_FMT_S32P
244  && !s->rematrix
245  && s->out_sample_rate == s->in_sample_rate
246  && !(s->flags & SWR_FLAG_RESAMPLE)
247  && s->engine != SWR_ENGINE_SOXR){
248  s->int_sample_fmt= AV_SAMPLE_FMT_S32P;
249  }else if(av_get_bytes_per_sample(s->in_sample_fmt) <= 4){
250  s->int_sample_fmt= AV_SAMPLE_FMT_FLTP;
251  }else{
252  s->int_sample_fmt= AV_SAMPLE_FMT_DBLP;
253  }
254  }
255  av_log(s, AV_LOG_DEBUG, "Using %s internally between filters\n", av_get_sample_fmt_name(s->int_sample_fmt));
256 
257  if( s->int_sample_fmt != AV_SAMPLE_FMT_S16P
258  &&s->int_sample_fmt != AV_SAMPLE_FMT_S32P
259  &&s->int_sample_fmt != AV_SAMPLE_FMT_S64P
260  &&s->int_sample_fmt != AV_SAMPLE_FMT_FLTP
261  &&s->int_sample_fmt != AV_SAMPLE_FMT_DBLP){
262  av_log(s, AV_LOG_ERROR, "Requested sample format %s is not supported internally, s16p/s32p/s64p/fltp/dblp are supported\n", av_get_sample_fmt_name(s->int_sample_fmt));
263  return AVERROR(EINVAL);
264  }
265 
267  set_audiodata_fmt(&s->out, s->out_sample_fmt);
268 
269  if (s->firstpts_in_samples != AV_NOPTS_VALUE) {
270  if (!s->async && s->min_compensation >= FLT_MAX/2)
271  s->async = 1;
272  if (s->firstpts == AV_NOPTS_VALUE)
273  s->firstpts =
274  s->outpts = s->firstpts_in_samples * s->out_sample_rate;
275  } else
276  s->firstpts = AV_NOPTS_VALUE;
277 
278  if (s->async) {
279  if (s->min_compensation >= FLT_MAX/2)
280  s->min_compensation = 0.001;
281  if (s->async > 1.0001) {
282  s->max_soft_compensation = s->async / (double) s->in_sample_rate;
283  }
284  }
285 
286  if (s->out_sample_rate!=s->in_sample_rate || (s->flags & SWR_FLAG_RESAMPLE)){
287  s->resample = s->resampler->init(s->resample, s->out_sample_rate, s->in_sample_rate, s->filter_size, s->phase_shift, s->linear_interp, s->cutoff, s->int_sample_fmt, s->filter_type, s->kaiser_beta, s->precision, s->cheby, s->exact_rational);
288  if (!s->resample) {
289  av_log(s, AV_LOG_ERROR, "Failed to initialize resampler\n");
290  return AVERROR(ENOMEM);
291  }
292  }else
293  s->resampler->free(&s->resample);
294  if( s->int_sample_fmt != AV_SAMPLE_FMT_S16P
295  && s->int_sample_fmt != AV_SAMPLE_FMT_S32P
296  && s->int_sample_fmt != AV_SAMPLE_FMT_FLTP
297  && s->int_sample_fmt != AV_SAMPLE_FMT_DBLP
298  && s->resample){
299  av_log(s, AV_LOG_ERROR, "Resampling only supported with internal s16p/s32p/fltp/dblp\n");
300  ret = AVERROR(EINVAL);
301  goto fail;
302  }
303 
304 #define RSC 1 //FIXME finetune
305  if(!s-> in.ch_count)
306  s-> in.ch_count = s->in_ch_layout.nb_channels;
307  if (!av_channel_layout_check(&s->used_ch_layout))
308  av_channel_layout_default(&s->used_ch_layout, s->in.ch_count);
309  if(!s->out.ch_count)
310  s->out.ch_count = s->out_ch_layout.nb_channels;
311 
312  if(!s-> in.ch_count){
313  av_assert0(s->in_ch_layout.order == AV_CHANNEL_ORDER_UNSPEC);
314  av_log(s, AV_LOG_ERROR, "Input channel count and layout are unset\n");
315  ret = AVERROR(EINVAL);
316  goto fail;
317  }
318 
319  av_channel_layout_describe(&s->out_ch_layout, l2, sizeof(l2));
320  av_channel_layout_describe(&s->in_ch_layout, l1, sizeof(l1));
321  if (s->in_ch_layout.order != AV_CHANNEL_ORDER_UNSPEC && s->used_ch_layout.nb_channels != s->in_ch_layout.nb_channels) {
322  av_log(s, AV_LOG_ERROR, "Input channel layout %s mismatches specified channel count %d\n", l1, s->used_ch_layout.nb_channels);
323  ret = AVERROR(EINVAL);
324  goto fail;
325  }
326 
327  if (( s->out_ch_layout.order == AV_CHANNEL_ORDER_UNSPEC
328  || s-> in_ch_layout.order == AV_CHANNEL_ORDER_UNSPEC) && s->used_ch_layout.nb_channels != s->out.ch_count && !s->rematrix_custom) {
329  av_log(s, AV_LOG_ERROR, "Rematrix is needed between %s and %s "
330  "but there is not enough information to do it\n", l1, l2);
331  ret = AVERROR(EINVAL);
332  goto fail;
333  }
334 
335 av_assert0(s->used_ch_layout.nb_channels);
336 av_assert0(s->out.ch_count);
337  s->resample_first= RSC*s->out.ch_count/s->used_ch_layout.nb_channels - RSC < s->out_sample_rate/(float)s-> in_sample_rate - 1.0;
338 
339  s->in_buffer= s->in;
340  s->silence = s->in;
341  s->drop_temp= s->out;
342 
343  if ((ret = swri_dither_init(s, s->out_sample_fmt, s->int_sample_fmt)) < 0)
344  goto fail;
345 
346  if(!s->resample && !s->rematrix && !s->channel_map && !s->dither.method){
347  s->full_convert = swri_audio_convert_alloc(s->out_sample_fmt,
348  s-> in_sample_fmt, s-> in.ch_count, NULL, 0);
349  return 0;
350  }
351 
352  s->in_convert = swri_audio_convert_alloc(s->int_sample_fmt,
353  s-> in_sample_fmt, s->used_ch_layout.nb_channels, s->channel_map, 0);
354  s->out_convert= swri_audio_convert_alloc(s->out_sample_fmt,
355  s->int_sample_fmt, s->out.ch_count, NULL, 0);
356 
357  if (!s->in_convert || !s->out_convert) {
358  ret = AVERROR(ENOMEM);
359  goto fail;
360  }
361 
362  s->postin= s->in;
363  s->preout= s->out;
364  s->midbuf= s->in;
365 
366  if(s->channel_map){
367  s->postin.ch_count=
368  s->midbuf.ch_count= s->used_ch_layout.nb_channels;
369  if(s->resample)
370  s->in_buffer.ch_count= s->used_ch_layout.nb_channels;
371  }
372  if(!s->resample_first){
373  s->midbuf.ch_count= s->out.ch_count;
374  if(s->resample)
375  s->in_buffer.ch_count = s->out.ch_count;
376  }
377 
378  set_audiodata_fmt(&s->postin, s->int_sample_fmt);
379  set_audiodata_fmt(&s->midbuf, s->int_sample_fmt);
380  set_audiodata_fmt(&s->preout, s->int_sample_fmt);
381 
382  if(s->resample){
383  set_audiodata_fmt(&s->in_buffer, s->int_sample_fmt);
384  }
385 
386  av_assert0(!s->preout.count);
387  s->dither.noise = s->preout;
388  s->dither.temp = s->preout;
389  if (s->dither.method > SWR_DITHER_NS) {
390  s->dither.noise.bps = 4;
391  s->dither.noise.fmt = AV_SAMPLE_FMT_FLTP;
392  s->dither.noise_scale = 1;
393  }
394 
395  if(s->rematrix || s->dither.method) {
397  if (ret < 0)
398  goto fail;
399  }
400 
401  return 0;
402 fail:
403  swr_close(s);
404  return ret;
405 
406 }
407 
408 int swri_realloc_audio(AudioData *a, int count){
409  int i, countb;
410  AudioData old;
411 
412  if(count < 0 || count > INT_MAX/2/a->bps/a->ch_count)
413  return AVERROR(EINVAL);
414 
415  if(a->count >= count)
416  return 0;
417 
418  count*=2;
419 
420  countb= FFALIGN(count*a->bps, ALIGN);
421  old= *a;
422 
423  av_assert0(a->bps);
424  av_assert0(a->ch_count);
425 
426  a->data = av_calloc(countb, a->ch_count);
427  if(!a->data)
428  return AVERROR(ENOMEM);
429  for(i=0; i<a->ch_count; i++){
430  a->ch[i]= a->data + i*(a->planar ? countb : a->bps);
431  if(a->count && a->planar) memcpy(a->ch[i], old.ch[i], a->count*a->bps);
432  }
433  if(a->count && !a->planar) memcpy(a->ch[0], old.ch[0], a->count*a->ch_count*a->bps);
434  av_freep(&old.data);
435  a->count= count;
436 
437  return 1;
438 }
439 
440 static void copy(AudioData *out, AudioData *in,
441  int count){
442  av_assert0(out->planar == in->planar);
443  av_assert0(out->bps == in->bps);
444  av_assert0(out->ch_count == in->ch_count);
445  if(out->planar){
446  int ch;
447  for(ch=0; ch<out->ch_count; ch++)
448  memcpy(out->ch[ch], in->ch[ch], count*out->bps);
449  }else
450  memcpy(out->ch[0], in->ch[0], count*out->ch_count*out->bps);
451 }
452 
453 static void fill_audiodata(AudioData *out, uint8_t *const in_arg [SWR_CH_MAX])
454 {
455  int i;
456  if(!in_arg){
457  memset(out->ch, 0, sizeof(out->ch));
458  }else if(out->planar){
459  for(i=0; i<out->ch_count; i++)
460  out->ch[i]= in_arg[i];
461  }else{
462  for(i=0; i<out->ch_count; i++)
463  out->ch[i]= in_arg[0] + i*out->bps;
464  }
465 }
466 
467 static void reversefill_audiodata(AudioData *out, uint8_t *in_arg [SWR_CH_MAX]){
468  int i;
469  if(out->planar){
470  for(i=0; i<out->ch_count; i++)
471  in_arg[i]= out->ch[i];
472  }else{
473  in_arg[0]= out->ch[0];
474  }
475 }
476 
477 /**
478  *
479  * out may be equal in.
480  */
481 static void buf_set(AudioData *out, AudioData *in, int count){
482  int ch;
483  if(in->planar){
484  for(ch=0; ch<out->ch_count; ch++)
485  out->ch[ch]= in->ch[ch] + count*out->bps;
486  }else{
487  for(ch=out->ch_count-1; ch>=0; ch--)
488  out->ch[ch]= in->ch[0] + (ch + count*out->ch_count) * out->bps;
489  }
490 }
491 
492 /**
493  *
494  * @return number of samples output per channel
495  */
496 static int resample(SwrContext *s, AudioData *out_param, int out_count,
497  const AudioData * in_param, int in_count){
498  AudioData in, out, tmp;
499  int ret_sum=0;
500  int border=0;
501  int padless = ARCH_X86 && s->engine == SWR_ENGINE_SWR ? 7 : 0;
502 
503  av_assert1(s->in_buffer.ch_count == in_param->ch_count);
504  av_assert1(s->in_buffer.planar == in_param->planar);
505  av_assert1(s->in_buffer.fmt == in_param->fmt);
506 
507  tmp=out=*out_param;
508  in = *in_param;
509 
510  border = s->resampler->invert_initial_buffer(s->resample, &s->in_buffer,
511  &in, in_count, &s->in_buffer_index, &s->in_buffer_count);
512  if (border == INT_MAX) {
513  return 0;
514  } else if (border < 0) {
515  return border;
516  } else if (border) {
517  buf_set(&in, &in, border);
518  in_count -= border;
519  s->resample_in_constraint = 0;
520  }
521 
522  do{
523  int ret, size, consumed;
524  if(!s->resample_in_constraint && s->in_buffer_count){
525  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
526  ret= s->resampler->multiple_resample(s->resample, &out, out_count, &tmp, s->in_buffer_count, &consumed);
527  out_count -= ret;
528  ret_sum += ret;
529  buf_set(&out, &out, ret);
530  s->in_buffer_count -= consumed;
531  s->in_buffer_index += consumed;
532 
533  if(!in_count)
534  break;
535  if(s->in_buffer_count <= border){
536  buf_set(&in, &in, -s->in_buffer_count);
537  in_count += s->in_buffer_count;
538  s->in_buffer_count=0;
539  s->in_buffer_index=0;
540  border = 0;
541  }
542  }
543 
544  if((s->flushed || in_count > padless) && !s->in_buffer_count){
545  s->in_buffer_index=0;
546  ret= s->resampler->multiple_resample(s->resample, &out, out_count, &in, FFMAX(in_count-padless, 0), &consumed);
547  out_count -= ret;
548  ret_sum += ret;
549  buf_set(&out, &out, ret);
550  in_count -= consumed;
551  buf_set(&in, &in, consumed);
552  }
553 
554  //TODO is this check sane considering the advanced copy avoidance below
555  size= s->in_buffer_index + s->in_buffer_count + in_count;
556  if( size > s->in_buffer.count
557  && s->in_buffer_count + in_count <= s->in_buffer_index){
558  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
559  copy(&s->in_buffer, &tmp, s->in_buffer_count);
560  s->in_buffer_index=0;
561  }else
562  if((ret=swri_realloc_audio(&s->in_buffer, size)) < 0)
563  return ret;
564 
565  if(in_count){
566  int count= in_count;
567  if(s->in_buffer_count && s->in_buffer_count+2 < count && out_count) count= s->in_buffer_count+2;
568 
569  buf_set(&tmp, &s->in_buffer, s->in_buffer_index + s->in_buffer_count);
570  copy(&tmp, &in, /*in_*/count);
571  s->in_buffer_count += count;
572  in_count -= count;
573  border += count;
574  buf_set(&in, &in, count);
575  s->resample_in_constraint= 0;
576  if(s->in_buffer_count != count || in_count)
577  continue;
578  if (padless) {
579  padless = 0;
580  continue;
581  }
582  }
583  break;
584  }while(1);
585 
586  s->resample_in_constraint= !!out_count;
587 
588  return ret_sum;
589 }
590 
591 static int swr_convert_internal(struct SwrContext *s, AudioData *out, int out_count,
592  AudioData *in , int in_count){
594  int ret/*, in_max*/;
595  AudioData preout_tmp, midbuf_tmp;
596 
597  if(s->full_convert){
598  av_assert0(!s->resample);
599  swri_audio_convert(s->full_convert, out, in, in_count);
600  return out_count;
601  }
602 
603 // in_max= out_count*(int64_t)s->in_sample_rate / s->out_sample_rate + resample_filter_taps;
604 // in_count= FFMIN(in_count, in_in + 2 - s->hist_buffer_count);
605 
606  if((ret=swri_realloc_audio(&s->postin, in_count))<0)
607  return ret;
608  if(s->resample_first){
609  av_assert0(s->midbuf.ch_count == s->used_ch_layout.nb_channels);
610  if((ret=swri_realloc_audio(&s->midbuf, out_count))<0)
611  return ret;
612  }else{
613  av_assert0(s->midbuf.ch_count == s->out.ch_count);
614  if((ret=swri_realloc_audio(&s->midbuf, in_count))<0)
615  return ret;
616  }
617  if((ret=swri_realloc_audio(&s->preout, out_count))<0)
618  return ret;
619 
620  postin= &s->postin;
621 
622  midbuf_tmp= s->midbuf;
623  midbuf= &midbuf_tmp;
624  preout_tmp= s->preout;
625  preout= &preout_tmp;
626 
627  if(s->int_sample_fmt == s-> in_sample_fmt && s->in.planar && !s->channel_map)
628  postin= in;
629 
630  if(s->resample_first ? !s->resample : !s->rematrix)
631  midbuf= postin;
632 
633  if(s->resample_first ? !s->rematrix : !s->resample)
634  preout= midbuf;
635 
636  if(s->int_sample_fmt == s->out_sample_fmt && s->out.planar
637  && !(s->out_sample_fmt==AV_SAMPLE_FMT_S32P && (s->dither.output_sample_bits&31))){
638  if(preout==in){
639  out_count= FFMIN(out_count, in_count); //TODO check at the end if this is needed or redundant
640  av_assert0(s->in.planar); //we only support planar internally so it has to be, we support copying non planar though
641  copy(out, in, out_count);
642  return out_count;
643  }
644  else if(preout==postin) preout= midbuf= postin= out;
645  else if(preout==midbuf) preout= midbuf= out;
646  else preout= out;
647  }
648 
649  if(in != postin){
650  swri_audio_convert(s->in_convert, postin, in, in_count);
651  }
652 
653  if(s->resample_first){
654  if(postin != midbuf)
655  if ((out_count = resample(s, midbuf, out_count, postin, in_count)) < 0)
656  return out_count;
657  if(midbuf != preout)
658  swri_rematrix(s, preout, midbuf, out_count, preout==out);
659  }else{
660  if(postin != midbuf)
661  swri_rematrix(s, midbuf, postin, in_count, midbuf==out);
662  if(midbuf != preout)
663  if ((out_count = resample(s, preout, out_count, midbuf, in_count)) < 0)
664  return out_count;
665  }
666 
667  if(preout != out && out_count){
668  AudioData *conv_src = preout;
669  if(s->dither.method){
670  int ch;
671  int dither_count= FFMAX(out_count, 1<<16);
672 
673  if (preout == in) {
674  conv_src = &s->dither.temp;
675  if((ret=swri_realloc_audio(&s->dither.temp, dither_count))<0)
676  return ret;
677  }
678 
679  if((ret=swri_realloc_audio(&s->dither.noise, dither_count))<0)
680  return ret;
681  if(ret)
682  for(ch=0; ch<s->dither.noise.ch_count; ch++)
683  if((ret=swri_get_dither(s, s->dither.noise.ch[ch], s->dither.noise.count, (12345678913579ULL*ch + 3141592) % 2718281828U, s->dither.noise.fmt))<0)
684  return ret;
685  av_assert0(s->dither.noise.ch_count == preout->ch_count);
686 
687  if(s->dither.noise_pos + out_count > s->dither.noise.count)
688  s->dither.noise_pos = 0;
689 
690  if (s->dither.method < SWR_DITHER_NS){
691  if (s->mix_2_1_simd) {
692  int len1= out_count&~15;
693  int off = len1 * preout->bps;
694 
695  if(len1)
696  for(ch=0; ch<preout->ch_count; ch++)
697  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_simd_one, 0, 0, len1);
698  if(out_count != len1)
699  for(ch=0; ch<preout->ch_count; ch++)
700  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, &s->native_one, 0, 0, out_count - len1);
701  } else {
702  for(ch=0; ch<preout->ch_count; ch++)
703  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);
704  }
705  } else {
706  switch(s->int_sample_fmt) {
707  case AV_SAMPLE_FMT_S16P :swri_noise_shaping_int16(s, conv_src, preout, &s->dither.noise, out_count); break;
708  case AV_SAMPLE_FMT_S32P :swri_noise_shaping_int32(s, conv_src, preout, &s->dither.noise, out_count); break;
709  case AV_SAMPLE_FMT_FLTP :swri_noise_shaping_float(s, conv_src, preout, &s->dither.noise, out_count); break;
710  case AV_SAMPLE_FMT_DBLP :swri_noise_shaping_double(s,conv_src, preout, &s->dither.noise, out_count); break;
711  }
712  }
713  s->dither.noise_pos += out_count;
714  }
715 //FIXME packed doesn't need more than 1 chan here!
716  swri_audio_convert(s->out_convert, out, conv_src, out_count);
717  }
718  return out_count;
719 }
720 
722  return !!s->in_buffer.ch_count;
723 }
724 
726  uint8_t * const *out_arg, int out_count,
727  const uint8_t * const *in_arg, int in_count)
728 {
729  AudioData * in= &s->in;
730  AudioData *out= &s->out;
731 
732  if (!swr_is_initialized(s)) {
733  av_log(s, AV_LOG_ERROR, "Context has not been initialized\n");
734  return AVERROR(EINVAL);
735  }
736 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL >1
737  int max_output = swr_get_out_samples(s, in_count);
738 #endif
739 
740  while(s->drop_output > 0){
741  int ret;
742  uint8_t *tmp_arg[SWR_CH_MAX];
743 #define MAX_DROP_STEP 16384
744  if((ret=swri_realloc_audio(&s->drop_temp, FFMIN(s->drop_output, MAX_DROP_STEP)))<0)
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 doesn't matter
750  s->drop_output *= -1;
751  in_count = 0;
752  if(ret>0) {
753  s->drop_output -= ret;
754  if (!s->drop_output && !out_arg)
755  return 0;
756  continue;
757  }
758 
759  av_assert0(s->drop_output);
760  return 0;
761  }
762 
763  if(!in_arg){
764  if(s->resample){
765  if (!s->flushed)
766  s->resampler->flush(s);
767  s->resample_in_constraint = 0;
768  s->flushed = 1;
769  }else if(!s->in_buffer_count){
770  return 0;
771  }
772  }else
773  fill_audiodata(in , (void*)in_arg);
774 
775  fill_audiodata(out, out_arg);
776 
777  if(s->resample){
778  int ret = swr_convert_internal(s, out, out_count, in, in_count);
779  if(ret>0 && !s->drop_output)
780  s->outpts += ret * (int64_t)s->in_sample_rate;
781 
782  av_assert2(max_output < 0 || ret <= max_output);
783 
784  return ret;
785  }else{
786  AudioData tmp= *in;
787  int ret2=0;
788  int ret, size;
789  size = FFMIN(out_count, s->in_buffer_count);
790  if(size){
791  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
793  if(ret<0)
794  return ret;
795  ret2= ret;
796  s->in_buffer_count -= ret;
797  s->in_buffer_index += ret;
798  buf_set(out, out, ret);
799  out_count -= ret;
800  if(!s->in_buffer_count)
801  s->in_buffer_index = 0;
802  }
803 
804  if(in_count){
805  size= s->in_buffer_index + s->in_buffer_count + in_count - out_count;
806 
807  if(in_count > out_count) { //FIXME move after swr_convert_internal
808  if( size > s->in_buffer.count
809  && s->in_buffer_count + in_count - out_count <= s->in_buffer_index){
810  buf_set(&tmp, &s->in_buffer, s->in_buffer_index);
811  copy(&s->in_buffer, &tmp, s->in_buffer_count);
812  s->in_buffer_index=0;
813  }else
814  if((ret=swri_realloc_audio(&s->in_buffer, size)) < 0)
815  return ret;
816  }
817 
818  if(out_count){
819  size = FFMIN(in_count, out_count);
821  if(ret<0)
822  return ret;
823  buf_set(in, in, ret);
824  in_count -= ret;
825  ret2 += ret;
826  }
827  if(in_count){
828  buf_set(&tmp, &s->in_buffer, s->in_buffer_index + s->in_buffer_count);
829  copy(&tmp, in, in_count);
830  s->in_buffer_count += in_count;
831  }
832  }
833  if(ret2>0 && !s->drop_output)
834  s->outpts += ret2 * (int64_t)s->in_sample_rate;
835  av_assert2(max_output < 0 || ret2 < 0 || ret2 <= max_output);
836  return ret2;
837  }
838 }
839 
840 int swr_drop_output(struct SwrContext *s, int count){
841  const uint8_t *tmp_arg[SWR_CH_MAX];
842  s->drop_output += count;
843 
844  if(s->drop_output <= 0)
845  return 0;
846 
847  av_log(s, AV_LOG_VERBOSE, "discarding %d audio samples\n", count);
848  return swr_convert(s, NULL, s->drop_output, tmp_arg, 0);
849 }
850 
851 int swr_inject_silence(struct SwrContext *s, int count){
852  int ret, i;
853  uint8_t *tmp_arg[SWR_CH_MAX];
854 
855  if(count <= 0)
856  return 0;
857 
858 #define MAX_SILENCE_STEP 16384
859  while (count > MAX_SILENCE_STEP) {
861  return ret;
862  count -= MAX_SILENCE_STEP;
863  }
864 
865  if((ret=swri_realloc_audio(&s->silence, count))<0)
866  return ret;
867 
868  if(s->silence.planar) for(i=0; i<s->silence.ch_count; i++) {
869  memset(s->silence.ch[i], s->silence.bps==1 ? 0x80 : 0, count*s->silence.bps);
870  } else
871  memset(s->silence.ch[0], s->silence.bps==1 ? 0x80 : 0, count*s->silence.bps*s->silence.ch_count);
872 
873  reversefill_audiodata(&s->silence, tmp_arg);
874  av_log(s, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", count);
875  ret = swr_convert(s, NULL, 0, (const uint8_t**)tmp_arg, count);
876  return ret;
877 }
878 
880  if (s->resampler && s->resample){
881  return s->resampler->get_delay(s, base);
882  }else{
883  return (s->in_buffer_count*base + (s->in_sample_rate>>1))/ s->in_sample_rate;
884  }
885 }
886 
887 int swr_get_out_samples(struct SwrContext *s, int in_samples)
888 {
889  int64_t out_samples;
890 
891  if (in_samples < 0)
892  return AVERROR(EINVAL);
893 
894  if (s->resampler && s->resample) {
895  if (!s->resampler->get_out_samples)
896  return AVERROR(ENOSYS);
897  out_samples = s->resampler->get_out_samples(s, in_samples);
898  } else {
899  out_samples = s->in_buffer_count + in_samples;
900  av_assert0(s->out_sample_rate == s->in_sample_rate);
901  }
902 
903  if (out_samples > INT_MAX)
904  return AVERROR(EINVAL);
905 
906  return out_samples;
907 }
908 
909 int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance){
910  int ret;
911 
912  if (!s || compensation_distance < 0)
913  return AVERROR(EINVAL);
914  if (!compensation_distance && sample_delta)
915  return AVERROR(EINVAL);
916  if (!s->resample) {
917  s->flags |= SWR_FLAG_RESAMPLE;
918  ret = swr_init(s);
919  if (ret < 0)
920  return ret;
921  }
922  if (!s->resampler->set_compensation){
923  return AVERROR(EINVAL);
924  }else{
925  return s->resampler->set_compensation(s->resample, sample_delta, compensation_distance);
926  }
927 }
928 
930  if(pts == INT64_MIN)
931  return s->outpts;
932 
933  if (s->firstpts == AV_NOPTS_VALUE)
934  s->outpts = s->firstpts = pts;
935 
936  if(s->min_compensation >= FLT_MAX) {
937  return (s->outpts = pts - swr_get_delay(s, s->in_sample_rate * (int64_t)s->out_sample_rate));
938  } else {
939  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;
940  double fdelta = delta /(double)(s->in_sample_rate * (int64_t)s->out_sample_rate);
941 
942  if(fabs(fdelta) > s->min_compensation) {
943  if(s->outpts == s->firstpts || fabs(fdelta) > s->min_hard_compensation){
944  int ret;
945  if(delta > 0) ret = swr_inject_silence(s, delta / s->out_sample_rate);
946  else ret = swr_drop_output (s, -delta / s-> in_sample_rate);
947  if(ret<0){
948  av_log(s, AV_LOG_ERROR, "Failed to compensate for timestamp delta of %f\n", fdelta);
949  }
950  } else if(s->soft_compensation_duration && s->max_soft_compensation) {
951  int duration = s->out_sample_rate * s->soft_compensation_duration;
952  double max_soft_compensation = s->max_soft_compensation / (s->max_soft_compensation < 0 ? -s->in_sample_rate : 1);
954  av_log(s, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n", fdelta, comp, duration);
956  }
957  }
958 
959  return s->outpts;
960  }
961 }
AV_SAMPLE_FMT_FLTP
@ AV_SAMPLE_FMT_FLTP
float, planar
Definition: samplefmt.h:66
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
name
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default minimum maximum flags name is the option name
Definition: writing_filters.txt:88
swr_convert_internal
static int swr_convert_internal(struct SwrContext *s, AudioData *out, int out_count, AudioData *in, int in_count)
Definition: swresample.c:591
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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. Frame references ownership and permissions
opt.h
swri_resampler
const struct Resampler swri_resampler
Definition: resample.c:504
swri_noise_shaping_int16
void swri_noise_shaping_int16(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
out
static FILE * out
Definition: movenc.c:55
SwrContext::in_sample_rate
int in_sample_rate
input sample rate
Definition: swresample_internal.h:105
free_temp
static void free_temp(AudioData *a)
Definition: swresample.c:106
comp
static void comp(unsigned char *dst, ptrdiff_t dst_stride, unsigned char *src, ptrdiff_t src_stride, int add)
Definition: eamad.c:79
swr_set_compensation
int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance)
Activate resampling compensation ("soft" compensation).
Definition: swresample.c:909
int64_t
long long int64_t
Definition: coverity.c:34
AudioData::bps
int bps
bytes per sample
Definition: swresample_internal.h:49
SwrContext::out_sample_rate
int out_sample_rate
output sample rate
Definition: swresample_internal.h:106
AV_SAMPLE_FMT_S32P
@ AV_SAMPLE_FMT_S32P
signed 32 bits, planar
Definition: samplefmt.h:65
SwrContext::out_ch_layout
AVChannelLayout out_ch_layout
output channel layout
Definition: swresample_internal.h:104
SwrContext::user_in_chlayout
AVChannelLayout user_in_chlayout
User set input channel layout.
Definition: swresample_internal.h:118
AV_LOG_VERBOSE
#define AV_LOG_VERBOSE
Detailed information.
Definition: log.h:226
base
uint8_t base
Definition: vp3data.h:128
float.h
swr_set_channel_mapping
int swr_set_channel_mapping(struct SwrContext *s, const int *channel_map)
Set a customized input channel mapping.
Definition: swresample.c:47
AVChannelLayout::order
enum AVChannelOrder order
Channel order used in this layout.
Definition: channel_layout.h:324
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
copy
static void copy(AudioData *out, AudioData *in, int count)
Definition: swresample.c:440
AVChannelLayout::nb_channels
int nb_channels
Number of channels in this layout.
Definition: channel_layout.h:329
SwrContext::in_buffer_index
int in_buffer_index
cached buffer position
Definition: swresample_internal.h:154
swri_noise_shaping_float
void swri_noise_shaping_float(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
SWR_ENGINE_SOXR
@ SWR_ENGINE_SOXR
SoX Resampler.
Definition: swresample.h:168
buf_set
static void buf_set(AudioData *out, AudioData *in, int count)
out may be equal in.
Definition: swresample.c:481
AudioData
Definition: swresample_internal.h:45
SwrContext::out_sample_fmt
enum AVSampleFormat out_sample_fmt
output sample format
Definition: swresample_internal.h:101
fail
#define fail()
Definition: checkasm.h:218
swri_realloc_audio
int swri_realloc_audio(AudioData *a, int count)
Definition: swresample.c:408
MAX_SILENCE_STEP
#define MAX_SILENCE_STEP
swr_is_initialized
int swr_is_initialized(struct SwrContext *s)
Check whether an swr context has been initialized or not.
Definition: swresample.c:721
fill_audiodata
static void fill_audiodata(AudioData *out, uint8_t *const in_arg[SWR_CH_MAX])
Definition: swresample.c:453
AV_SAMPLE_FMT_S64P
@ AV_SAMPLE_FMT_S64P
signed 64 bits, planar
Definition: samplefmt.h:69
pts
static int64_t pts
Definition: transcode_aac.c:644
ss
#define ss(width, name, subs,...)
Definition: cbs_vp9.c:202
swr_next_pts
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:929
swr_convert
int attribute_align_arg swr_convert(struct SwrContext *s, uint8_t *const *out_arg, int out_count, const uint8_t *const *in_arg, int in_count)
Convert audio.
Definition: swresample.c:725
swr_get_delay
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:879
av_get_planar_sample_fmt
enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt)
Get the planar alternative form of the given sample format.
Definition: samplefmt.c:86
SwrContext::postin
AudioData postin
post-input audio data: used for rematrix/resample
Definition: swresample_internal.h:147
avassert.h
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
av_cold
#define av_cold
Definition: attributes.h:106
swr_inject_silence
int swr_inject_silence(struct SwrContext *s, int count)
Injects the specified number of silence samples.
Definition: swresample.c:851
swr_init
av_cold int swr_init(struct SwrContext *s)
Initialize context after user parameters have been set.
Definition: swresample.c:156
av_channel_layout_describe
int av_channel_layout_describe(const AVChannelLayout *channel_layout, char *buf, size_t buf_size)
Get a human-readable string describing the channel layout properties.
Definition: channel_layout.c:653
float
float
Definition: af_crystalizer.c:122
s
#define s(width, name)
Definition: cbs_vp9.c:198
SwrContext::user_out_chlayout
AVChannelLayout user_out_chlayout
User set output channel layout.
Definition: swresample_internal.h:119
AV_CHANNEL_ORDER_UNSPEC
@ AV_CHANNEL_ORDER_UNSPEC
Only the channel count is specified, without any further information about the channel order.
Definition: channel_layout.h:119
swr_alloc
av_cold struct SwrContext * swr_alloc(void)
Allocate SwrContext.
Definition: options.c:148
av_assert0
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:42
av_sample_fmt_is_planar
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition: samplefmt.c:114
swri_rematrix
int swri_rematrix(SwrContext *s, AudioData *out, AudioData *in, int len, int mustcopy)
Definition: rematrix.c:570
SWR_DITHER_NS
@ SWR_DITHER_NS
not part of API/ABI
Definition: swresample.h:154
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
AudioData::planar
int planar
1 if planar audio, 0 otherwise
Definition: swresample_internal.h:51
SwrContext::in_convert
struct AudioConvert * in_convert
input conversion context
Definition: swresample_internal.h:163
channel_map
static const uint8_t channel_map[8][8]
Definition: atrac3plusdec.c:52
swri_audio_convert
int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len)
Convert between audio sample formats.
av_get_sample_fmt_name
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:51
SwrContext
The libswresample context.
Definition: swresample_internal.h:95
AudioData::data
uint8_t * data
samples buffer
Definition: swresample_internal.h:47
AudioData::ch
uint8_t * ch[SWR_CH_MAX]
samples buffer per channel
Definition: swresample_internal.h:46
tmp
static uint8_t tmp[40]
Definition: aes_ctr.c:52
if
if(ret)
Definition: filter_design.txt:179
SwrContext::in_ch_layout
AVChannelLayout in_ch_layout
input channel layout
Definition: swresample_internal.h:103
swri_noise_shaping_int32
void swri_noise_shaping_int32(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
SwrContext::midbuf
AudioData midbuf
intermediate audio data (postin/preout)
Definition: swresample_internal.h:148
fabs
static __device__ float fabs(float a)
Definition: cuda_runtime.h:182
NULL
#define NULL
Definition: coverity.c:32
reversefill_audiodata
static void reversefill_audiodata(AudioData *out, uint8_t *in_arg[SWR_CH_MAX])
Definition: swresample.c:467
SwrContext::log_ctx
void * log_ctx
parent logging context
Definition: swresample_internal.h:98
double
double
Definition: af_crystalizer.c:132
av_clipf
av_clipf
Definition: af_crystalizer.c:122
resample
static int resample(SwrContext *s, AudioData *out_param, int out_count, const AudioData *in_param, int in_count)
Definition: swresample.c:496
ALIGN
#define ALIGN
Definition: swresample.c:31
av_opt_set_int
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
Definition: opt.c:880
AudioData::ch_count
int ch_count
number of channels
Definition: swresample_internal.h:48
attribute_align_arg
#define attribute_align_arg
Definition: internal.h:50
swr_alloc_set_opts2
int swr_alloc_set_opts2(struct SwrContext **ps, const AVChannelLayout *out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, const AVChannelLayout *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:54
AV_SAMPLE_FMT_NB
@ AV_SAMPLE_FMT_NB
Number of sample formats. DO NOT USE if linking dynamically.
Definition: samplefmt.h:71
swri_soxr_resampler
const struct Resampler swri_soxr_resampler
Definition: soxr_resample.c:126
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition: channel_layout.h:319
SwrContext::preout
AudioData preout
pre-output audio data: used for rematrix/resample
Definition: swresample_internal.h:149
av_opt_set_chlayout
int av_opt_set_chlayout(void *obj, const char *name, const AVChannelLayout *channel_layout, int search_flags)
Definition: opt.c:1000
SWR_FLAG_RESAMPLE
#define SWR_FLAG_RESAMPLE
Force resampling even if equal sample rate.
Definition: swresample.h:143
swr_drop_output
int swr_drop_output(struct SwrContext *s, int count)
Drops the specified number of output samples.
Definition: swresample.c:840
AV_SAMPLE_FMT_NONE
@ AV_SAMPLE_FMT_NONE
Definition: samplefmt.h:56
size
int size
Definition: twinvq_data.h:10344
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:247
swr_free
av_cold void swr_free(SwrContext **ss)
Free the given SwrContext and set the pointer to NULL.
Definition: swresample.c:137
swri_rematrix_free
av_cold void swri_rematrix_free(SwrContext *s)
Definition: rematrix.c:565
SWR_ENGINE_SWR
@ SWR_ENGINE_SWR
SW Resampler.
Definition: swresample.h:167
a
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
Definition: undefined.txt:41
swresample_internal.h
swri_audio_convert_alloc
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.
AV_SAMPLE_FMT_S16P
@ AV_SAMPLE_FMT_S16P
signed 16 bits, planar
Definition: samplefmt.h:64
av_channel_layout_compare
int av_channel_layout_compare(const AVChannelLayout *chl, const AVChannelLayout *chl1)
Check whether two channel layouts are semantically the same, i.e.
Definition: channel_layout.c:809
av_channel_layout_default
void av_channel_layout_default(AVChannelLayout *ch_layout, int nb_channels)
Get the default channel layout for a given number of channels.
Definition: channel_layout.c:839
av_assert2
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:68
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
av_get_bytes_per_sample
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:108
internal.h
swri_get_dither
int swri_get_dither(SwrContext *s, void *dst, int len, unsigned seed, enum AVSampleFormat noise_fmt)
Definition: dither.c:27
av_assert1
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:58
AVSampleFormat
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:55
SwrContext::max_soft_compensation
float max_soft_compensation
swr maximum soft compensation in seconds over soft_compensation_duration
Definition: swresample_internal.h:138
delta
float delta
Definition: vorbis_enc_data.h:430
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
swri_dither_init
av_cold int swri_dither_init(SwrContext *s, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt)
Definition: dither.c:80
swri_noise_shaping_double
void swri_noise_shaping_double(SwrContext *s, AudioData *dsts, const AudioData *srcs, const AudioData *noises, int count)
swri_check_chlayout
int swri_check_chlayout(struct SwrContext *s, const AVChannelLayout *chl, const char *name)
Definition: swresample.c:33
clear_context
static void clear_context(SwrContext *s)
Definition: swresample.c:111
av_calloc
void * av_calloc(size_t nmemb, size_t size)
Definition: mem.c:264
ret
ret
Definition: filter_design.txt:187
RSC
#define RSC
SwrContext::in_sample_fmt
enum AVSampleFormat in_sample_fmt
input sample format
Definition: swresample_internal.h:99
set_audiodata_fmt
static void set_audiodata_fmt(AudioData *a, enum AVSampleFormat fmt)
Definition: swresample.c:98
av_channel_layout_check
int av_channel_layout_check(const AVChannelLayout *channel_layout)
Check whether a channel layout is valid, i.e.
Definition: channel_layout.c:783
U
#define U(x)
Definition: vpx_arith.h:37
AudioData::fmt
enum AVSampleFormat fmt
sample format
Definition: swresample_internal.h:52
channel_layout.h
MAX_DROP_STEP
#define MAX_DROP_STEP
av_channel_layout_uninit
void av_channel_layout_uninit(AVChannelLayout *channel_layout)
Free any allocated data in the channel layout and reset the channel count to 0.
Definition: channel_layout.c:442
swri_audio_convert_free
void swri_audio_convert_free(AudioConvert **ctx)
Free audio sample format converter context.
AV_SAMPLE_FMT_DBLP
@ AV_SAMPLE_FMT_DBLP
double, planar
Definition: samplefmt.h:67
swri_rematrix_init
av_cold int swri_rematrix_init(SwrContext *s)
Definition: rematrix.c:457
av_channel_layout_copy
int av_channel_layout_copy(AVChannelLayout *dst, const AVChannelLayout *src)
Make a copy of a channel layout.
Definition: channel_layout.c:449
swr_get_out_samples
int swr_get_out_samples(struct SwrContext *s, int in_samples)
Find an upper bound on the number of samples that the next swr_convert call will output,...
Definition: swresample.c:887
mem.h
av_free
#define av_free(p)
Definition: tableprint_vlc.h:34
FFALIGN
#define FFALIGN(x, a)
Definition: macros.h:78
SwrContext::in
AudioData in
input audio data
Definition: swresample_internal.h:146
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
swr_close
av_cold void swr_close(SwrContext *s)
Closes the context so that swr_is_initialized() returns 0.
Definition: swresample.c:152
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
SWR_CH_MAX
#define SWR_CH_MAX
Definition: swresample.c:33
duration
static int64_t duration
Definition: ffplay.c:329
audioconvert.h