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