2 * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
4 * This file is part of libswresample
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.
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.
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
21 #include "libavutil/mem.h"
22 #include "libavutil/opt.h"
23 #include "swresample_internal.h"
24 #include "audioconvert.h"
25 #include "libavutil/avassert.h"
26 #include "libavutil/channel_layout.h"
27 #include "libavutil/internal.h"
33 int swr_set_channel_mapping(struct SwrContext
*s
, const int *channel_map
){
34 if(!s
|| s
->in_convert
) // s needs to be allocated but not initialized
35 return AVERROR(EINVAL
);
36 s
->channel_map
= channel_map
;
40 int swr_alloc_set_opts2(struct SwrContext
**ps
,
41 const AVChannelLayout
*out_ch_layout
, enum AVSampleFormat out_sample_fmt
, int out_sample_rate
,
42 const AVChannelLayout
*in_ch_layout
, enum AVSampleFormat in_sample_fmt
, int in_sample_rate
,
43 int log_offset
, void *log_ctx
) {
44 struct SwrContext
*s
= *ps
;
47 if (!s
) s
= swr_alloc();
48 if (!s
) return AVERROR(ENOMEM
);
52 s
->log_level_offset
= log_offset
;
55 if ((ret
= av_opt_set_chlayout(s
, "ochl", out_ch_layout
, 0)) < 0)
58 if ((ret
= av_opt_set_int(s
, "osf", out_sample_fmt
, 0)) < 0)
61 if ((ret
= av_opt_set_int(s
, "osr", out_sample_rate
, 0)) < 0)
64 if ((ret
= av_opt_set_chlayout(s
, "ichl", in_ch_layout
, 0)) < 0)
67 if ((ret
= av_opt_set_int(s
, "isf", in_sample_fmt
, 0)) < 0)
70 if ((ret
= av_opt_set_int(s
, "isr", in_sample_rate
, 0)) < 0)
73 av_opt_set_int(s
, "uch", 0, 0);
77 av_log(s
, AV_LOG_ERROR
, "Failed to set option\n");
82 static void set_audiodata_fmt(AudioData
*a
, enum AVSampleFormat fmt
){
84 a
->bps
= av_get_bytes_per_sample(fmt
);
85 a
->planar
= av_sample_fmt_is_planar(fmt
);
90 static void free_temp(AudioData
*a
){
92 memset(a
, 0, sizeof(*a
));
95 static void clear_context(SwrContext
*s
){
96 s
->in_buffer_index
= 0;
97 s
->in_buffer_count
= 0;
98 s
->resample_in_constraint
= 0;
99 memset(s
->in
.ch
, 0, sizeof(s
->in
.ch
));
100 memset(s
->out
.ch
, 0, sizeof(s
->out
.ch
));
101 free_temp(&s
->postin
);
102 free_temp(&s
->midbuf
);
103 free_temp(&s
->preout
);
104 free_temp(&s
->in_buffer
);
105 free_temp(&s
->silence
);
106 free_temp(&s
->drop_temp
);
107 free_temp(&s
->dither
.noise
);
108 free_temp(&s
->dither
.temp
);
109 av_channel_layout_uninit(&s
->in_ch_layout
);
110 av_channel_layout_uninit(&s
->out_ch_layout
);
111 av_channel_layout_uninit(&s
->used_ch_layout
);
112 swri_audio_convert_free(&s
-> in_convert
);
113 swri_audio_convert_free(&s
->out_convert
);
114 swri_audio_convert_free(&s
->full_convert
);
115 swri_rematrix_free(s
);
117 s
->delayed_samples_fixup
= 0;
121 av_cold
void swr_free(SwrContext
**ss
){
125 av_channel_layout_uninit(&s
->user_in_chlayout
);
126 av_channel_layout_uninit(&s
->user_out_chlayout
);
127 av_channel_layout_uninit(&s
->user_used_chlayout
);
130 s
->resampler
->free(&s
->resample
);
136 av_cold
void swr_close(SwrContext
*s
){
140 av_cold
int swr_init(struct SwrContext
*s
){
142 char l1
[1024], l2
[1024];
146 if((unsigned) s
-> in_sample_fmt
>= AV_SAMPLE_FMT_NB
){
147 av_log(s
, AV_LOG_ERROR
, "Requested input sample format %d is invalid\n", s
->in_sample_fmt
);
148 return AVERROR(EINVAL
);
150 if((unsigned) s
->out_sample_fmt
>= AV_SAMPLE_FMT_NB
){
151 av_log(s
, AV_LOG_ERROR
, "Requested output sample format %d is invalid\n", s
->out_sample_fmt
);
152 return AVERROR(EINVAL
);
155 if(s
-> in_sample_rate
<= 0){
156 av_log(s
, AV_LOG_ERROR
, "Requested input sample rate %d is invalid\n", s
->in_sample_rate
);
157 return AVERROR(EINVAL
);
159 if(s
->out_sample_rate
<= 0){
160 av_log(s
, AV_LOG_ERROR
, "Requested output sample rate %d is invalid\n", s
->out_sample_rate
);
161 return AVERROR(EINVAL
);
164 s
->out
.ch_count
= s
-> user_out_chlayout
.nb_channels
;
165 s
-> in
.ch_count
= s
-> user_in_chlayout
.nb_channels
;
167 if (!(ret
= av_channel_layout_check(&s
->user_in_chlayout
)) || s
->user_in_chlayout
.nb_channels
> SWR_CH_MAX
) {
169 av_channel_layout_describe(&s
->user_in_chlayout
, l1
, sizeof(l1
));
170 av_log(s
, AV_LOG_WARNING
, "Input channel layout \"%s\" is invalid or unsupported.\n", ret
? l1
: "");
171 return AVERROR(EINVAL
);
174 if (!(ret
= av_channel_layout_check(&s
->user_out_chlayout
)) || s
->user_out_chlayout
.nb_channels
> SWR_CH_MAX
) {
176 av_channel_layout_describe(&s
->user_out_chlayout
, l2
, sizeof(l2
));
177 av_log(s
, AV_LOG_WARNING
, "Output channel layout \"%s\" is invalid or unsupported.\n", ret
? l2
: "");
178 return AVERROR(EINVAL
);
181 ret
= av_channel_layout_copy(&s
->in_ch_layout
, &s
->user_in_chlayout
);
182 ret
|= av_channel_layout_copy(&s
->out_ch_layout
, &s
->user_out_chlayout
);
183 ret
|= av_channel_layout_copy(&s
->used_ch_layout
, &s
->user_used_chlayout
);
187 s
->int_sample_fmt
= s
->user_int_sample_fmt
;
189 s
->dither
.method
= s
->user_dither_method
;
193 case SWR_ENGINE_SOXR
: s
->resampler
= &swri_soxr_resampler
; break;
195 case SWR_ENGINE_SWR
: s
->resampler
= &swri_resampler
; break;
197 av_log(s
, AV_LOG_ERROR
, "Requested resampling engine is unavailable\n");
198 return AVERROR(EINVAL
);
201 if (!av_channel_layout_check(&s
->used_ch_layout
))
202 av_channel_layout_default(&s
->used_ch_layout
, s
->in
.ch_count
);
204 if (s
->used_ch_layout
.nb_channels
!= s
->in_ch_layout
.nb_channels
)
205 av_channel_layout_uninit(&s
->in_ch_layout
);
207 if (s
->used_ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
)
208 av_channel_layout_default(&s
->used_ch_layout
, s
->used_ch_layout
.nb_channels
);
209 if (s
->in_ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
) {
210 ret
= av_channel_layout_copy(&s
->in_ch_layout
, &s
->used_ch_layout
);
214 if (s
->out_ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
)
215 av_channel_layout_default(&s
->out_ch_layout
, s
->out
.ch_count
);
217 s
->rematrix
= av_channel_layout_compare(&s
->out_ch_layout
, &s
->in_ch_layout
) ||
218 s
->rematrix_volume
!=1.0 ||
221 if(s
->int_sample_fmt
== AV_SAMPLE_FMT_NONE
){
222 // 16bit or less to 16bit or less with the same sample rate
223 if( av_get_bytes_per_sample(s
-> in_sample_fmt
) <= 2
224 && av_get_bytes_per_sample(s
->out_sample_fmt
) <= 2
225 && s
->out_sample_rate
==s
->in_sample_rate
) {
226 s
->int_sample_fmt
= AV_SAMPLE_FMT_S16P
;
227 // 8 -> 8, 16->8, 8->16bit
228 } else if( av_get_bytes_per_sample(s
-> in_sample_fmt
)
229 +av_get_bytes_per_sample(s
->out_sample_fmt
) <= 3 ) {
230 s
->int_sample_fmt
= AV_SAMPLE_FMT_S16P
;
231 }else if( av_get_bytes_per_sample(s
-> in_sample_fmt
) <= 2
233 && s
->out_sample_rate
==s
->in_sample_rate
234 && !(s
->flags
& SWR_FLAG_RESAMPLE
)){
235 s
->int_sample_fmt
= AV_SAMPLE_FMT_S16P
;
236 }else if( av_get_planar_sample_fmt(s
-> in_sample_fmt
) == AV_SAMPLE_FMT_S32P
237 && av_get_planar_sample_fmt(s
->out_sample_fmt
) == AV_SAMPLE_FMT_S32P
239 && s
->out_sample_rate
== s
->in_sample_rate
240 && !(s
->flags
& SWR_FLAG_RESAMPLE
)
241 && s
->engine
!= SWR_ENGINE_SOXR
){
242 s
->int_sample_fmt
= AV_SAMPLE_FMT_S32P
;
243 }else if(av_get_bytes_per_sample(s
->in_sample_fmt
) <= 4){
244 s
->int_sample_fmt
= AV_SAMPLE_FMT_FLTP
;
246 s
->int_sample_fmt
= AV_SAMPLE_FMT_DBLP
;
249 av_log(s
, AV_LOG_DEBUG
, "Using %s internally between filters\n", av_get_sample_fmt_name(s
->int_sample_fmt
));
251 if( s
->int_sample_fmt
!= AV_SAMPLE_FMT_S16P
252 &&s
->int_sample_fmt
!= AV_SAMPLE_FMT_S32P
253 &&s
->int_sample_fmt
!= AV_SAMPLE_FMT_S64P
254 &&s
->int_sample_fmt
!= AV_SAMPLE_FMT_FLTP
255 &&s
->int_sample_fmt
!= AV_SAMPLE_FMT_DBLP
){
256 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
));
257 return AVERROR(EINVAL
);
260 set_audiodata_fmt(&s
-> in
, s
-> in_sample_fmt
);
261 set_audiodata_fmt(&s
->out
, s
->out_sample_fmt
);
263 if (s
->firstpts_in_samples
!= AV_NOPTS_VALUE
) {
264 if (!s
->async
&& s
->min_compensation
>= FLT_MAX
/2)
266 if (s
->firstpts
== AV_NOPTS_VALUE
)
268 s
->outpts
= s
->firstpts_in_samples
* s
->out_sample_rate
;
270 s
->firstpts
= AV_NOPTS_VALUE
;
273 if (s
->min_compensation
>= FLT_MAX
/2)
274 s
->min_compensation
= 0.001;
275 if (s
->async
> 1.0001) {
276 s
->max_soft_compensation
= s
->async
/ (double) s
->in_sample_rate
;
280 if (s
->out_sample_rate
!=s
->in_sample_rate
|| (s
->flags
& SWR_FLAG_RESAMPLE
)){
281 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
);
283 av_log(s
, AV_LOG_ERROR
, "Failed to initialize resampler\n");
284 return AVERROR(ENOMEM
);
287 s
->resampler
->free(&s
->resample
);
288 if( s
->int_sample_fmt
!= AV_SAMPLE_FMT_S16P
289 && s
->int_sample_fmt
!= AV_SAMPLE_FMT_S32P
290 && s
->int_sample_fmt
!= AV_SAMPLE_FMT_FLTP
291 && s
->int_sample_fmt
!= AV_SAMPLE_FMT_DBLP
293 av_log(s
, AV_LOG_ERROR
, "Resampling only supported with internal s16p/s32p/fltp/dblp\n");
294 ret
= AVERROR(EINVAL
);
298 #define RSC 1 //FIXME finetune
300 s
-> in
.ch_count
= s
->in_ch_layout
.nb_channels
;
301 if (!av_channel_layout_check(&s
->used_ch_layout
))
302 av_channel_layout_default(&s
->used_ch_layout
, s
->in
.ch_count
);
304 s
->out
.ch_count
= s
->out_ch_layout
.nb_channels
;
306 if(!s
-> in
.ch_count
){
307 av_assert0(s
->in_ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
);
308 av_log(s
, AV_LOG_ERROR
, "Input channel count and layout are unset\n");
309 ret
= AVERROR(EINVAL
);
313 av_channel_layout_describe(&s
->out_ch_layout
, l2
, sizeof(l2
));
314 av_channel_layout_describe(&s
->in_ch_layout
, l1
, sizeof(l1
));
315 if (s
->in_ch_layout
.order
!= AV_CHANNEL_ORDER_UNSPEC
&& s
->used_ch_layout
.nb_channels
!= s
->in_ch_layout
.nb_channels
) {
316 av_log(s
, AV_LOG_ERROR
, "Input channel layout %s mismatches specified channel count %d\n", l1
, s
->used_ch_layout
.nb_channels
);
317 ret
= AVERROR(EINVAL
);
321 if (( s
->out_ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
322 || s
-> in_ch_layout
.order
== AV_CHANNEL_ORDER_UNSPEC
) && s
->used_ch_layout
.nb_channels
!= s
->out
.ch_count
&& !s
->rematrix_custom
) {
323 av_log(s
, AV_LOG_ERROR
, "Rematrix is needed between %s and %s "
324 "but there is not enough information to do it\n", l1
, l2
);
325 ret
= AVERROR(EINVAL
);
329 av_assert0(s
->used_ch_layout
.nb_channels
);
330 av_assert0(s
->out
.ch_count
);
331 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;
335 s
->drop_temp
= s
->out
;
337 if ((ret
= swri_dither_init(s
, s
->out_sample_fmt
, s
->int_sample_fmt
)) < 0)
340 if(!s
->resample
&& !s
->rematrix
&& !s
->channel_map
&& !s
->dither
.method
){
341 s
->full_convert
= swri_audio_convert_alloc(s
->out_sample_fmt
,
342 s
-> in_sample_fmt
, s
-> in
.ch_count
, NULL
, 0);
346 s
->in_convert
= swri_audio_convert_alloc(s
->int_sample_fmt
,
347 s
-> in_sample_fmt
, s
->used_ch_layout
.nb_channels
, s
->channel_map
, 0);
348 s
->out_convert
= swri_audio_convert_alloc(s
->out_sample_fmt
,
349 s
->int_sample_fmt
, s
->out
.ch_count
, NULL
, 0);
351 if (!s
->in_convert
|| !s
->out_convert
) {
352 ret
= AVERROR(ENOMEM
);
362 s
->midbuf
.ch_count
= s
->used_ch_layout
.nb_channels
;
364 s
->in_buffer
.ch_count
= s
->used_ch_layout
.nb_channels
;
366 if(!s
->resample_first
){
367 s
->midbuf
.ch_count
= s
->out
.ch_count
;
369 s
->in_buffer
.ch_count
= s
->out
.ch_count
;
372 set_audiodata_fmt(&s
->postin
, s
->int_sample_fmt
);
373 set_audiodata_fmt(&s
->midbuf
, s
->int_sample_fmt
);
374 set_audiodata_fmt(&s
->preout
, s
->int_sample_fmt
);
377 set_audiodata_fmt(&s
->in_buffer
, s
->int_sample_fmt
);
380 av_assert0(!s
->preout
.count
);
381 s
->dither
.noise
= s
->preout
;
382 s
->dither
.temp
= s
->preout
;
383 if (s
->dither
.method
> SWR_DITHER_NS
) {
384 s
->dither
.noise
.bps
= 4;
385 s
->dither
.noise
.fmt
= AV_SAMPLE_FMT_FLTP
;
386 s
->dither
.noise_scale
= 1;
389 if(s
->rematrix
|| s
->dither
.method
) {
390 ret
= swri_rematrix_init(s
);
402 int swri_realloc_audio(AudioData
*a
, int count
){
406 if(count
< 0 || count
> INT_MAX
/2/a
->bps
/a
->ch_count
)
407 return AVERROR(EINVAL
);
409 if(a
->count
>= count
)
414 countb
= FFALIGN(count
*a
->bps
, ALIGN
);
418 av_assert0(a
->ch_count
);
420 a
->data
= av_calloc(countb
, a
->ch_count
);
422 return AVERROR(ENOMEM
);
423 for(i
=0; i
<a
->ch_count
; i
++){
424 a
->ch
[i
]= a
->data
+ i
*(a
->planar
? countb
: a
->bps
);
425 if(a
->count
&& a
->planar
) memcpy(a
->ch
[i
], old
.ch
[i
], a
->count
*a
->bps
);
427 if(a
->count
&& !a
->planar
) memcpy(a
->ch
[0], old
.ch
[0], a
->count
*a
->ch_count
*a
->bps
);
434 static void copy(AudioData
*out
, AudioData
*in
,
436 av_assert0(out
->planar
== in
->planar
);
437 av_assert0(out
->bps
== in
->bps
);
438 av_assert0(out
->ch_count
== in
->ch_count
);
441 for(ch
=0; ch
<out
->ch_count
; ch
++)
442 memcpy(out
->ch
[ch
], in
->ch
[ch
], count
*out
->bps
);
444 memcpy(out
->ch
[0], in
->ch
[0], count
*out
->ch_count
*out
->bps
);
447 static void fill_audiodata(AudioData
*out
, uint8_t *const in_arg
[SWR_CH_MAX
])
451 memset(out
->ch
, 0, sizeof(out
->ch
));
452 }else if(out
->planar
){
453 for(i
=0; i
<out
->ch_count
; i
++)
454 out
->ch
[i
]= in_arg
[i
];
456 for(i
=0; i
<out
->ch_count
; i
++)
457 out
->ch
[i
]= in_arg
[0] + i
*out
->bps
;
461 static void reversefill_audiodata(AudioData
*out
, uint8_t *in_arg
[SWR_CH_MAX
]){
464 for(i
=0; i
<out
->ch_count
; i
++)
465 in_arg
[i
]= out
->ch
[i
];
467 in_arg
[0]= out
->ch
[0];
473 * out may be equal in.
475 static void buf_set(AudioData
*out
, AudioData
*in
, int count
){
478 for(ch
=0; ch
<out
->ch_count
; ch
++)
479 out
->ch
[ch
]= in
->ch
[ch
] + count
*out
->bps
;
481 for(ch
=out
->ch_count
-1; ch
>=0; ch
--)
482 out
->ch
[ch
]= in
->ch
[0] + (ch
+ count
*out
->ch_count
) * out
->bps
;
488 * @return number of samples output per channel
490 static int resample(SwrContext
*s
, AudioData
*out_param
, int out_count
,
491 const AudioData
* in_param
, int in_count
){
492 AudioData in
, out
, tmp
;
495 int padless
= ARCH_X86
&& s
->engine
== SWR_ENGINE_SWR
? 7 : 0;
497 av_assert1(s
->in_buffer
.ch_count
== in_param
->ch_count
);
498 av_assert1(s
->in_buffer
.planar
== in_param
->planar
);
499 av_assert1(s
->in_buffer
.fmt
== in_param
->fmt
);
504 border
= s
->resampler
->invert_initial_buffer(s
->resample
, &s
->in_buffer
,
505 &in
, in_count
, &s
->in_buffer_index
, &s
->in_buffer_count
);
506 if (border
== INT_MAX
) {
508 } else if (border
< 0) {
511 buf_set(&in
, &in
, border
);
513 s
->resample_in_constraint
= 0;
517 int ret
, size
, consumed
;
518 if(!s
->resample_in_constraint
&& s
->in_buffer_count
){
519 buf_set(&tmp
, &s
->in_buffer
, s
->in_buffer_index
);
520 ret
= s
->resampler
->multiple_resample(s
->resample
, &out
, out_count
, &tmp
, s
->in_buffer_count
, &consumed
);
523 buf_set(&out
, &out
, ret
);
524 s
->in_buffer_count
-= consumed
;
525 s
->in_buffer_index
+= consumed
;
529 if(s
->in_buffer_count
<= border
){
530 buf_set(&in
, &in
, -s
->in_buffer_count
);
531 in_count
+= s
->in_buffer_count
;
532 s
->in_buffer_count
=0;
533 s
->in_buffer_index
=0;
538 if((s
->flushed
|| in_count
> padless
) && !s
->in_buffer_count
){
539 s
->in_buffer_index
=0;
540 ret
= s
->resampler
->multiple_resample(s
->resample
, &out
, out_count
, &in
, FFMAX(in_count
-padless
, 0), &consumed
);
543 buf_set(&out
, &out
, ret
);
544 in_count
-= consumed
;
545 buf_set(&in
, &in
, consumed
);
548 //TODO is this check sane considering the advanced copy avoidance below
549 size
= s
->in_buffer_index
+ s
->in_buffer_count
+ in_count
;
550 if( size
> s
->in_buffer
.count
551 && s
->in_buffer_count
+ in_count
<= s
->in_buffer_index
){
552 buf_set(&tmp
, &s
->in_buffer
, s
->in_buffer_index
);
553 copy(&s
->in_buffer
, &tmp
, s
->in_buffer_count
);
554 s
->in_buffer_index
=0;
556 if((ret
=swri_realloc_audio(&s
->in_buffer
, size
)) < 0)
561 if(s
->in_buffer_count
&& s
->in_buffer_count
+2 < count
&& out_count
) count
= s
->in_buffer_count
+2;
563 buf_set(&tmp
, &s
->in_buffer
, s
->in_buffer_index
+ s
->in_buffer_count
);
564 copy(&tmp
, &in
, /*in_*/count
);
565 s
->in_buffer_count
+= count
;
568 buf_set(&in
, &in
, count
);
569 s
->resample_in_constraint
= 0;
570 if(s
->in_buffer_count
!= count
|| in_count
)
580 s
->resample_in_constraint
= !!out_count
;
585 static int swr_convert_internal(struct SwrContext
*s
, AudioData
*out
, int out_count
,
586 AudioData
*in
, int in_count
){
587 AudioData
*postin
, *midbuf
, *preout
;
589 AudioData preout_tmp
, midbuf_tmp
;
592 av_assert0(!s
->resample
);
593 swri_audio_convert(s
->full_convert
, out
, in
, in_count
);
597 // in_max= out_count*(int64_t)s->in_sample_rate / s->out_sample_rate + resample_filter_taps;
598 // in_count= FFMIN(in_count, in_in + 2 - s->hist_buffer_count);
600 if((ret
=swri_realloc_audio(&s
->postin
, in_count
))<0)
602 if(s
->resample_first
){
603 av_assert0(s
->midbuf
.ch_count
== s
->used_ch_layout
.nb_channels
);
604 if((ret
=swri_realloc_audio(&s
->midbuf
, out_count
))<0)
607 av_assert0(s
->midbuf
.ch_count
== s
->out
.ch_count
);
608 if((ret
=swri_realloc_audio(&s
->midbuf
, in_count
))<0)
611 if((ret
=swri_realloc_audio(&s
->preout
, out_count
))<0)
616 midbuf_tmp
= s
->midbuf
;
618 preout_tmp
= s
->preout
;
621 if(s
->int_sample_fmt
== s
-> in_sample_fmt
&& s
->in
.planar
&& !s
->channel_map
)
624 if(s
->resample_first
? !s
->resample
: !s
->rematrix
)
627 if(s
->resample_first
? !s
->rematrix
: !s
->resample
)
630 if(s
->int_sample_fmt
== s
->out_sample_fmt
&& s
->out
.planar
631 && !(s
->out_sample_fmt
==AV_SAMPLE_FMT_S32P
&& (s
->dither
.output_sample_bits
&31))){
633 out_count
= FFMIN(out_count
, in_count
); //TODO check at the end if this is needed or redundant
634 av_assert0(s
->in
.planar
); //we only support planar internally so it has to be, we support copying non planar though
635 copy(out
, in
, out_count
);
638 else if(preout
==postin
) preout
= midbuf
= postin
= out
;
639 else if(preout
==midbuf
) preout
= midbuf
= out
;
644 swri_audio_convert(s
->in_convert
, postin
, in
, in_count
);
647 if(s
->resample_first
){
649 if ((out_count
= resample(s
, midbuf
, out_count
, postin
, in_count
)) < 0)
652 swri_rematrix(s
, preout
, midbuf
, out_count
, preout
==out
);
655 swri_rematrix(s
, midbuf
, postin
, in_count
, midbuf
==out
);
657 if ((out_count
= resample(s
, preout
, out_count
, midbuf
, in_count
)) < 0)
661 if(preout
!= out
&& out_count
){
662 AudioData
*conv_src
= preout
;
663 if(s
->dither
.method
){
665 int dither_count
= FFMAX(out_count
, 1<<16);
668 conv_src
= &s
->dither
.temp
;
669 if((ret
=swri_realloc_audio(&s
->dither
.temp
, dither_count
))<0)
673 if((ret
=swri_realloc_audio(&s
->dither
.noise
, dither_count
))<0)
676 for(ch
=0; ch
<s
->dither
.noise
.ch_count
; ch
++)
677 if((ret
=swri_get_dither(s
, s
->dither
.noise
.ch
[ch
], s
->dither
.noise
.count
, (12345678913579ULL*ch
+ 3141592) % 2718281828U, s
->dither
.noise
.fmt
))<0)
679 av_assert0(s
->dither
.noise
.ch_count
== preout
->ch_count
);
681 if(s
->dither
.noise_pos
+ out_count
> s
->dither
.noise
.count
)
682 s
->dither
.noise_pos
= 0;
684 if (s
->dither
.method
< SWR_DITHER_NS
){
685 if (s
->mix_2_1_simd
) {
686 int len1
= out_count
&~15;
687 int off
= len1
* preout
->bps
;
690 for(ch
=0; ch
<preout
->ch_count
; ch
++)
691 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
);
692 if(out_count
!= len1
)
693 for(ch
=0; ch
<preout
->ch_count
; ch
++)
694 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
);
696 for(ch
=0; ch
<preout
->ch_count
; ch
++)
697 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
);
700 switch(s
->int_sample_fmt
) {
701 case AV_SAMPLE_FMT_S16P
:swri_noise_shaping_int16(s
, conv_src
, preout
, &s
->dither
.noise
, out_count
); break;
702 case AV_SAMPLE_FMT_S32P
:swri_noise_shaping_int32(s
, conv_src
, preout
, &s
->dither
.noise
, out_count
); break;
703 case AV_SAMPLE_FMT_FLTP
:swri_noise_shaping_float(s
, conv_src
, preout
, &s
->dither
.noise
, out_count
); break;
704 case AV_SAMPLE_FMT_DBLP
:swri_noise_shaping_double(s
,conv_src
, preout
, &s
->dither
.noise
, out_count
); break;
707 s
->dither
.noise_pos
+= out_count
;
709 //FIXME packed doesn't need more than 1 chan here!
710 swri_audio_convert(s
->out_convert
, out
, conv_src
, out_count
);
715 int swr_is_initialized(struct SwrContext
*s
) {
716 return !!s
->in_buffer
.ch_count
;
719 int attribute_align_arg
swr_convert(struct SwrContext
*s
,
720 uint8_t * const *out_arg
, int out_count
,
721 const uint8_t * const *in_arg
, int in_count
)
723 AudioData
* in
= &s
->in
;
724 AudioData
*out
= &s
->out
;
725 int av_unused max_output
;
727 if (!swr_is_initialized(s
)) {
728 av_log(s
, AV_LOG_ERROR
, "Context has not been initialized\n");
729 return AVERROR(EINVAL
);
731 #if defined(ASSERT_LEVEL) && ASSERT_LEVEL >1
732 max_output
= swr_get_out_samples(s
, in_count
);
735 while(s
->drop_output
> 0){
737 uint8_t *tmp_arg
[SWR_CH_MAX
];
738 #define MAX_DROP_STEP 16384
739 if((ret
=swri_realloc_audio(&s
->drop_temp
, FFMIN(s
->drop_output
, MAX_DROP_STEP
)))<0)
742 reversefill_audiodata(&s
->drop_temp
, tmp_arg
);
743 s
->drop_output
*= -1; //FIXME find a less hackish solution
744 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
745 s
->drop_output
*= -1;
748 s
->drop_output
-= ret
;
749 if (!s
->drop_output
&& !out_arg
)
754 av_assert0(s
->drop_output
);
761 s
->resampler
->flush(s
);
762 s
->resample_in_constraint
= 0;
764 }else if(!s
->in_buffer_count
){
768 fill_audiodata(in
, (void*)in_arg
);
770 fill_audiodata(out
, out_arg
);
773 int ret
= swr_convert_internal(s
, out
, out_count
, in
, in_count
);
774 if(ret
>0 && !s
->drop_output
)
775 s
->outpts
+= ret
* (int64_t)s
->in_sample_rate
;
777 av_assert2(max_output
< 0 || ret
<= max_output
);
784 size
= FFMIN(out_count
, s
->in_buffer_count
);
786 buf_set(&tmp
, &s
->in_buffer
, s
->in_buffer_index
);
787 ret
= swr_convert_internal(s
, out
, size
, &tmp
, size
);
791 s
->in_buffer_count
-= ret
;
792 s
->in_buffer_index
+= ret
;
793 buf_set(out
, out
, ret
);
795 if(!s
->in_buffer_count
)
796 s
->in_buffer_index
= 0;
800 size
= s
->in_buffer_index
+ s
->in_buffer_count
+ in_count
- out_count
;
802 if(in_count
> out_count
) { //FIXME move after swr_convert_internal
803 if( size
> s
->in_buffer
.count
804 && s
->in_buffer_count
+ in_count
- out_count
<= s
->in_buffer_index
){
805 buf_set(&tmp
, &s
->in_buffer
, s
->in_buffer_index
);
806 copy(&s
->in_buffer
, &tmp
, s
->in_buffer_count
);
807 s
->in_buffer_index
=0;
809 if((ret
=swri_realloc_audio(&s
->in_buffer
, size
)) < 0)
814 size
= FFMIN(in_count
, out_count
);
815 ret
= swr_convert_internal(s
, out
, size
, in
, size
);
818 buf_set(in
, in
, ret
);
823 buf_set(&tmp
, &s
->in_buffer
, s
->in_buffer_index
+ s
->in_buffer_count
);
824 copy(&tmp
, in
, in_count
);
825 s
->in_buffer_count
+= in_count
;
828 if(ret2
>0 && !s
->drop_output
)
829 s
->outpts
+= ret2
* (int64_t)s
->in_sample_rate
;
830 av_assert2(max_output
< 0 || ret2
< 0 || ret2
<= max_output
);
835 int swr_drop_output(struct SwrContext
*s
, int count
){
836 const uint8_t *tmp_arg
[SWR_CH_MAX
];
837 s
->drop_output
+= count
;
839 if(s
->drop_output
<= 0)
842 av_log(s
, AV_LOG_VERBOSE
, "discarding %d audio samples\n", count
);
843 return swr_convert(s
, NULL
, s
->drop_output
, tmp_arg
, 0);
846 int swr_inject_silence(struct SwrContext
*s
, int count
){
848 uint8_t *tmp_arg
[SWR_CH_MAX
];
853 #define MAX_SILENCE_STEP 16384
854 while (count
> MAX_SILENCE_STEP
) {
855 if ((ret
= swr_inject_silence(s
, MAX_SILENCE_STEP
)) < 0)
857 count
-= MAX_SILENCE_STEP
;
860 if((ret
=swri_realloc_audio(&s
->silence
, count
))<0)
863 if(s
->silence
.planar
) for(i
=0; i
<s
->silence
.ch_count
; i
++) {
864 memset(s
->silence
.ch
[i
], s
->silence
.bps
==1 ? 0x80 : 0, count
*s
->silence
.bps
);
866 memset(s
->silence
.ch
[0], s
->silence
.bps
==1 ? 0x80 : 0, count
*s
->silence
.bps
*s
->silence
.ch_count
);
868 reversefill_audiodata(&s
->silence
, tmp_arg
);
869 av_log(s
, AV_LOG_VERBOSE
, "adding %d audio samples of silence\n", count
);
870 ret
= swr_convert(s
, NULL
, 0, (const uint8_t**)tmp_arg
, count
);
874 int64_t swr_get_delay(struct SwrContext
*s
, int64_t base
){
875 if (s
->resampler
&& s
->resample
){
876 return s
->resampler
->get_delay(s
, base
);
878 return (s
->in_buffer_count
*base
+ (s
->in_sample_rate
>>1))/ s
->in_sample_rate
;
882 int swr_get_out_samples(struct SwrContext
*s
, int in_samples
)
887 return AVERROR(EINVAL
);
889 if (s
->resampler
&& s
->resample
) {
890 if (!s
->resampler
->get_out_samples
)
891 return AVERROR(ENOSYS
);
892 out_samples
= s
->resampler
->get_out_samples(s
, in_samples
);
894 out_samples
= s
->in_buffer_count
+ in_samples
;
895 av_assert0(s
->out_sample_rate
== s
->in_sample_rate
);
898 if (out_samples
> INT_MAX
)
899 return AVERROR(EINVAL
);
904 int swr_set_compensation(struct SwrContext
*s
, int sample_delta
, int compensation_distance
){
907 if (!s
|| compensation_distance
< 0)
908 return AVERROR(EINVAL
);
909 if (!compensation_distance
&& sample_delta
)
910 return AVERROR(EINVAL
);
912 s
->flags
|= SWR_FLAG_RESAMPLE
;
917 if (!s
->resampler
->set_compensation
){
918 return AVERROR(EINVAL
);
920 return s
->resampler
->set_compensation(s
->resample
, sample_delta
, compensation_distance
);
924 int64_t swr_next_pts(struct SwrContext
*s
, int64_t pts
){
928 if (s
->firstpts
== AV_NOPTS_VALUE
)
929 s
->outpts
= s
->firstpts
= pts
;
931 if(s
->min_compensation
>= FLT_MAX
) {
932 return (s
->outpts
= pts
- swr_get_delay(s
, s
->in_sample_rate
* (int64_t)s
->out_sample_rate
));
934 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
;
935 double fdelta
= delta
/(double)(s
->in_sample_rate
* (int64_t)s
->out_sample_rate
);
937 if(fabs(fdelta
) > s
->min_compensation
) {
938 if(s
->outpts
== s
->firstpts
|| fabs(fdelta
) > s
->min_hard_compensation
){
940 if(delta
> 0) ret
= swr_inject_silence(s
, delta
/ s
->out_sample_rate
);
941 else ret
= swr_drop_output (s
, -delta
/ s
-> in_sample_rate
);
943 av_log(s
, AV_LOG_ERROR
, "Failed to compensate for timestamp delta of %f\n", fdelta
);
945 } else if(s
->soft_compensation_duration
&& s
->max_soft_compensation
) {
946 int duration
= s
->out_sample_rate
* s
->soft_compensation_duration
;
947 double max_soft_compensation
= s
->max_soft_compensation
/ (s
->max_soft_compensation
< 0 ? -s
->in_sample_rate
: 1);
948 int comp
= av_clipf(fdelta
, -max_soft_compensation
, max_soft_compensation
) * duration
;
949 av_log(s
, AV_LOG_VERBOSE
, "compensating audio timestamp drift:%f compensation:%d in:%d\n", fdelta
, comp
, duration
);
950 swr_set_compensation(s
, comp
, duration
);