#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
-#if defined(HAVE_SWRESAMPLE)
#include <libswresample/swresample.h>
-#elif defined(HAVE_AVRESAMPLE)
-#include <libavresample/avresample.h>
-#endif
#include <libavutil/opt.h>
// determine whether we use libavformat from ffmpeg or from libav
#else
AVPacket avPacket;
#endif
-#ifdef HAVE_AVRESAMPLE
- AVAudioResampleContext *avr;
-#elif defined(HAVE_SWRESAMPLE)
SwrContext *avr;
-#endif
smpl_t *output;
uint_t read_samples;
uint_t read_index;
// create or reset resampler to/from mono/multi-channel
if ( s->avr == NULL ) {
int err;
+ SwrContext *avr = swr_alloc();
int64_t input_layout = av_get_default_channel_layout(s->input_channels);
int64_t output_layout = av_get_default_channel_layout(s->input_channels);
-#ifdef HAVE_AVRESAMPLE
- AVAudioResampleContext *avr = avresample_alloc_context();
-#elif defined(HAVE_SWRESAMPLE)
- SwrContext *avr = swr_alloc();
-#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
av_opt_set_int(avr, "in_channel_layout", input_layout, 0);
av_opt_set_int(avr, "out_channel_layout", output_layout, 0);
#endif
// TODO: use planar?
//av_opt_set_int(avr, "out_sample_fmt", AV_SAMPLE_FMT_FLTP, 0);
-#ifdef HAVE_AVRESAMPLE
- if ( ( err = avresample_open(avr) ) < 0)
-#elif defined(HAVE_SWRESAMPLE)
if ( ( err = swr_init(avr) ) < 0)
-#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
{
char errorstr[256];
av_strerror (err, errorstr, sizeof(errorstr));
#else
AVPacket *avPacket = &s->avPacket;
#endif
-#ifdef HAVE_AVRESAMPLE
- AVAudioResampleContext *avr = s->avr;
-#elif defined(HAVE_SWRESAMPLE)
SwrContext *avr = s->avr;
-#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
int got_frame = 0;
-#ifdef HAVE_AVRESAMPLE
- int in_linesize = 0;
- int in_samples = avFrame->nb_samples;
- int out_linesize = 0;
- int max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE;
- int out_samples = 0;
-#elif defined(HAVE_SWRESAMPLE)
int in_samples = avFrame->nb_samples;
int max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE / avCodecCtx->channels;
int out_samples = 0;
-#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
smpl_t *output = s->output;
#ifndef FF_API_LAVF_AVCTX
int len = 0;
#warning "avutil < 53 is deprecated, crashes might occur on corrupt files"
#endif
-#ifdef HAVE_AVRESAMPLE
- in_linesize = 0;
- av_samples_get_buffer_size(&in_linesize, avCodecCtx->channels,
- avFrame->nb_samples, avCodecCtx->sample_fmt, 1);
- in_samples = avFrame->nb_samples;
- out_linesize = 0;
- max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE;
- out_samples = avresample_convert ( avr,
- (uint8_t **)&output, out_linesize, max_out_samples,
- (uint8_t **)avFrame->data, in_linesize, in_samples);
-#elif defined(HAVE_SWRESAMPLE)
in_samples = avFrame->nb_samples;
max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE / avCodecCtx->channels;
out_samples = swr_convert( avr,
(uint8_t **)&output, max_out_samples,
(const uint8_t **)avFrame->data, in_samples);
-#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
if (out_samples < 0) {
AUBIO_WRN("source_avcodec: error while resampling %s (%d)\n",
s->path, out_samples);
s->eof = 0;
s->read_index = 0;
s->read_samples = 0;
-#ifdef HAVE_AVRESAMPLE
- // reset the AVAudioResampleContext
- avresample_close(s->avr);
- avresample_open(s->avr);
-#elif defined(HAVE_SWRESAMPLE)
swr_close(s->avr);
swr_init(s->avr);
-#endif
return ret;
}
uint_t aubio_source_avcodec_close(aubio_source_avcodec_t * s) {
if (s->avr != NULL) {
-#ifdef HAVE_AVRESAMPLE
- avresample_close( s->avr );
- av_free ( s->avr );
-#elif defined(HAVE_SWRESAMPLE)
swr_close ( s->avr );
swr_free ( &s->avr );
-#endif
}
s->avr = NULL;
if (s->avCodecCtx != NULL) {