Ignore:
Timestamp:
Dec 5, 2018, 10:34:39 PM (5 years ago)
Author:
Paul Brossier <piem@piem.org>
Branches:
feature/cnn, feature/crepe, feature/pitchshift, feature/timestretch, fix/ffmpeg5, master
Children:
283a619a
Parents:
5b46bc3 (diff), f19db54 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' into feature/pitchshift

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/io/source_avcodec.c

    r5b46bc3 r633400d  
    1919*/
    2020
    21 
    22 #include "config.h"
     21#include "aubio_priv.h"
    2322
    2423#ifdef HAVE_LIBAV
     24
     25#include <libavcodec/avcodec.h>
     26#include <libavformat/avformat.h>
     27#if defined(HAVE_SWRESAMPLE)
     28#include <libswresample/swresample.h>
     29#elif defined(HAVE_AVRESAMPLE)
     30#include <libavresample/avresample.h>
     31#endif
     32#include <libavutil/opt.h>
     33#include <stdlib.h>
    2534
    2635// determine whether we use libavformat from ffmpeg or from libav
    2736#define FFMPEG_LIBAVFORMAT (LIBAVFORMAT_VERSION_MICRO > 99 )
    28 // max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 through 57.2.100
     37// max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 -> 57.2.100
    2938#define FFMPEG_LIBAVFORMAT_MAX_DUR2 FFMPEG_LIBAVFORMAT && ( \
    3039      (LIBAVFORMAT_VERSION_MAJOR == 55 && LIBAVFORMAT_VERSION_MINOR >= 43) \
     
    3342      )
    3443
    35 #include <libavcodec/avcodec.h>
    36 #include <libavformat/avformat.h>
    37 #include <libavresample/avresample.h>
    38 #include <libavutil/opt.h>
    39 #include <stdlib.h>
     44// backward compatibility with libavcodec55
     45#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(57,0,0)
     46#define HAVE_AUBIO_LIBAVCODEC_DEPRECATED 1
     47#endif
     48
     49#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
     50#warning "libavcodec < 56 is deprecated"
     51#define av_frame_alloc  avcodec_alloc_frame
     52#define av_frame_free avcodec_free_frame
     53#define av_packet_unref av_free_packet
     54#endif
    4055
    4156#include "aubio_priv.h"
     
    4459#include "source_avcodec.h"
    4560
     61#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56, 56, 0)
    4662#define AUBIO_AVCODEC_MAX_BUFFER_SIZE FF_MIN_BUFFER_SIZE
     63#else
     64#define AUBIO_AVCODEC_MAX_BUFFER_SIZE AV_INPUT_BUFFER_MIN_SIZE
     65#endif
    4766
    4867struct _aubio_source_avcodec_t {
     
    6079  AVCodecContext *avCodecCtx;
    6180  AVFrame *avFrame;
     81  AVPacket avPacket;
     82#ifdef HAVE_AVRESAMPLE
    6283  AVAudioResampleContext *avr;
    63   float *output;
     84#elif defined(HAVE_SWRESAMPLE)
     85  SwrContext *avr;
     86#endif
     87  smpl_t *output;
    6488  uint_t read_samples;
    6589  uint_t read_index;
    6690  sint_t selected_stream;
    6791  uint_t eof;
    68   uint_t multi;
    6992};
    7093
    71 // hack to create or re-create the context the first time _do or _do_multi is called
    72 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, uint_t multi);
    73 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, uint_t * read_samples);
     94// create or re-create the context when _do or _do_multi is called
     95void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s);
     96// actually read a frame
     97void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s,
     98    uint_t * read_samples);
    7499
    75100uint_t aubio_source_avcodec_has_network_url(aubio_source_avcodec_t *s);
     
    88113
    89114
    90 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, uint_t samplerate, uint_t hop_size) {
     115aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path,
     116    uint_t samplerate, uint_t hop_size) {
    91117  aubio_source_avcodec_t * s = AUBIO_NEW(aubio_source_avcodec_t);
     118  AVFormatContext *avFormatCtx = s->avFormatCtx;
     119  AVCodecContext *avCodecCtx = s->avCodecCtx;
     120  AVFrame *avFrame = s->avFrame;
     121  sint_t selected_stream = -1;
     122#if FF_API_LAVF_AVCTX
     123  AVCodecParameters *codecpar;
     124#endif
     125  AVCodec *codec;
     126  uint_t i;
    92127  int err;
    93128  if (path == NULL) {
     
    96131  }
    97132  if ((sint_t)samplerate < 0) {
    98     AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n", path, samplerate);
     133    AUBIO_ERR("source_avcodec: Can not open %s with samplerate %d\n",
     134        path, samplerate);
    99135    goto beach;
    100136  }
    101137  if ((sint_t)hop_size <= 0) {
    102     AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n", path, hop_size);
     138    AUBIO_ERR("source_avcodec: Can not open %s with hop_size %d\n",
     139        path, hop_size);
    103140    goto beach;
    104141  }
     
    111148  strncpy(s->path, path, strnlen(path, PATH_MAX) + 1);
    112149
     150#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58,0,0)
    113151  // register all formats and codecs
    114152  av_register_all();
     153#endif
    115154
    116155  if (aubio_source_avcodec_has_network_url(s)) {
     
    119158
    120159  // try opening the file and get some info about it
    121   AVFormatContext *avFormatCtx = s->avFormatCtx;
    122160  avFormatCtx = NULL;
    123161  if ( (err = avformat_open_input(&avFormatCtx, s->path, NULL, NULL) ) < 0 ) {
     
    139177    char errorstr[256];
    140178    av_strerror (err, errorstr, sizeof(errorstr));
    141     AUBIO_ERR("source_avcodec: Could not find stream information " "for %s (%s)\n", s->path,
    142         errorstr);
     179    AUBIO_ERR("source_avcodec: Could not find stream information "
     180        "for %s (%s)\n", s->path, errorstr);
    143181    goto beach;
    144182  }
     
    148186
    149187  // look for the first audio stream
    150   uint_t i;
    151   sint_t selected_stream = -1;
    152188  for (i = 0; i < avFormatCtx->nb_streams; i++) {
     189#if FF_API_LAVF_AVCTX
     190    if (avFormatCtx->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
     191#else
    153192    if (avFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
     193#endif
    154194      if (selected_stream == -1) {
    155195        selected_stream = i;
     
    167207  s->selected_stream = selected_stream;
    168208
    169   AVCodecContext *avCodecCtx = s->avCodecCtx;
     209#if FF_API_LAVF_AVCTX
     210  codecpar = avFormatCtx->streams[selected_stream]->codecpar;
     211  if (codecpar == NULL) {
     212    AUBIO_ERR("source_avcodec: Could not find decoder for %s", s->path);
     213    goto beach;
     214  }
     215  codec = avcodec_find_decoder(codecpar->codec_id);
     216
     217  /* Allocate a codec context for the decoder */
     218  avCodecCtx = avcodec_alloc_context3(codec);
     219  if (!avCodecCtx) {
     220    AUBIO_ERR("source_avcodec: Failed to allocate the %s codec context "
     221        "for path %s\n", av_get_media_type_string(AVMEDIA_TYPE_AUDIO),
     222        s->path);
     223    goto beach;
     224  }
     225#else
    170226  avCodecCtx = avFormatCtx->streams[selected_stream]->codec;
    171   AVCodec *codec = avcodec_find_decoder(avCodecCtx->codec_id);
     227  codec = avcodec_find_decoder(avCodecCtx->codec_id);
     228#endif
    172229  if (codec == NULL) {
    173230    AUBIO_ERR("source_avcodec: Could not find decoder for %s", s->path);
    174231    goto beach;
    175232  }
     233
     234#if FF_API_LAVF_AVCTX
     235  /* Copy codec parameters from input stream to output codec context */
     236  if ((err = avcodec_parameters_to_context(avCodecCtx, codecpar)) < 0) {
     237    AUBIO_ERR("source_avcodec: Failed to copy %s codec parameters to "
     238        "decoder context for %s\n",
     239        av_get_media_type_string(AVMEDIA_TYPE_AUDIO), s->path);
     240    goto beach;
     241  }
     242#endif
    176243
    177244  if ( ( err = avcodec_open2(avCodecCtx, codec, NULL) ) < 0) {
    178245    char errorstr[256];
    179246    av_strerror (err, errorstr, sizeof(errorstr));
    180     AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path, errorstr);
     247    AUBIO_ERR("source_avcodec: Could not load codec for %s (%s)\n", s->path,
     248        errorstr);
    181249    goto beach;
    182250  }
     
    199267  }
    200268
    201   AVFrame *avFrame = s->avFrame;
    202269  avFrame = av_frame_alloc();
    203270  if (!avFrame) {
     
    206273
    207274  /* allocate output for avr */
    208   s->output = (float *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE * sizeof(float));
     275  s->output = (smpl_t *)av_malloc(AUBIO_AVCODEC_MAX_BUFFER_SIZE
     276      * sizeof(smpl_t));
    209277
    210278  s->read_samples = 0;
     
    215283  s->avFrame = avFrame;
    216284
    217   // default to mono output
    218   aubio_source_avcodec_reset_resampler(s, 0);
     285  aubio_source_avcodec_reset_resampler(s);
     286
     287  if (s->avr == NULL) goto beach;
    219288
    220289  s->eof = 0;
    221   s->multi = 0;
    222290
    223291  //av_log_set_level(AV_LOG_QUIET);
     
    232300}
    233301
    234 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, uint_t multi) {
    235   if ( (multi != s->multi) || (s->avr == NULL) ) {
     302void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s)
     303{
     304  // create or reset resampler to/from mono/multi-channel
     305  if ( s->avr == NULL ) {
     306    int err;
    236307    int64_t input_layout = av_get_default_channel_layout(s->input_channels);
    237     uint_t output_channels = multi ? s->input_channels : 1;
    238     int64_t output_layout = av_get_default_channel_layout(output_channels);
    239     if (s->avr != NULL) {
    240       avresample_close( s->avr );
    241       av_free ( s->avr );
    242       s->avr = NULL;
    243     }
    244     AVAudioResampleContext *avr = s->avr;
    245     avr = avresample_alloc_context();
    246 
    247     av_opt_set_int(avr, "in_channel_layout",  input_layout,           0);
    248     av_opt_set_int(avr, "out_channel_layout", output_layout,          0);
    249     av_opt_set_int(avr, "in_sample_rate",     s->input_samplerate,    0);
    250     av_opt_set_int(avr, "out_sample_rate",    s->samplerate,          0);
     308    int64_t output_layout = av_get_default_channel_layout(s->input_channels);
     309#ifdef HAVE_AVRESAMPLE
     310    AVAudioResampleContext *avr = avresample_alloc_context();
     311#elif defined(HAVE_SWRESAMPLE)
     312    SwrContext *avr = swr_alloc();
     313#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
     314
     315    av_opt_set_int(avr, "in_channel_layout",  input_layout,              0);
     316    av_opt_set_int(avr, "out_channel_layout", output_layout,             0);
     317    av_opt_set_int(avr, "in_sample_rate",     s->input_samplerate,       0);
     318    av_opt_set_int(avr, "out_sample_rate",    s->samplerate,             0);
    251319    av_opt_set_int(avr, "in_sample_fmt",      s->avCodecCtx->sample_fmt, 0);
    252     av_opt_set_int(avr, "out_sample_fmt",     AV_SAMPLE_FMT_FLT,      0);
    253     int err;
    254     if ( ( err = avresample_open(avr) ) < 0) {
     320#if HAVE_AUBIO_DOUBLE
     321    av_opt_set_int(avr, "out_sample_fmt",     AV_SAMPLE_FMT_DBL,         0);
     322#else
     323    av_opt_set_int(avr, "out_sample_fmt",     AV_SAMPLE_FMT_FLT,         0);
     324#endif
     325    // TODO: use planar?
     326    //av_opt_set_int(avr, "out_sample_fmt",     AV_SAMPLE_FMT_FLTP,      0);
     327#ifdef HAVE_AVRESAMPLE
     328    if ( ( err = avresample_open(avr) ) < 0)
     329#elif defined(HAVE_SWRESAMPLE)
     330    if ( ( err = swr_init(avr) ) < 0)
     331#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
     332    {
    255333      char errorstr[256];
    256334      av_strerror (err, errorstr, sizeof(errorstr));
    257       AUBIO_ERR("source_avcodec: Could not open AVAudioResampleContext for %s (%s)\n",
    258           s->path, errorstr);
    259       //goto beach;
     335      AUBIO_ERR("source_avcodec: Could not open resampling context"
     336         " for %s (%s)\n", s->path, errorstr);
    260337      return;
    261338    }
    262339    s->avr = avr;
    263     s->multi = multi;
    264   }
    265 }
    266 
    267 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, uint_t * read_samples) {
     340  }
     341}
     342
     343void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s,
     344    uint_t * read_samples)
     345{
    268346  AVFormatContext *avFormatCtx = s->avFormatCtx;
    269347  AVCodecContext *avCodecCtx = s->avCodecCtx;
    270348  AVFrame *avFrame = s->avFrame;
    271   AVPacket avPacket;
     349  AVPacket avPacket = s->avPacket;
     350#ifdef HAVE_AVRESAMPLE
     351  AVAudioResampleContext *avr = s->avr;
     352#elif defined(HAVE_SWRESAMPLE)
     353  SwrContext *avr = s->avr;
     354#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
     355  int got_frame = 0;
     356#ifdef HAVE_AVRESAMPLE
     357  int in_linesize = 0;
     358  int in_samples = avFrame->nb_samples;
     359  int out_linesize = 0;
     360  int max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE;
     361  int out_samples = 0;
     362#elif defined(HAVE_SWRESAMPLE)
     363  int in_samples = avFrame->nb_samples;
     364  int max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE / avCodecCtx->channels;
     365  int out_samples = 0;
     366#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
     367  smpl_t *output = s->output;
     368#ifndef FF_API_LAVF_AVCTX
     369  int len = 0;
     370#else
     371  int ret = 0;
     372#endif
    272373  av_init_packet (&avPacket);
    273   AVAudioResampleContext *avr = s->avr;
    274   float *output = s->output;
    275374  *read_samples = 0;
    276375
     
    285384      char errorstr[256];
    286385      av_strerror (err, errorstr, sizeof(errorstr));
    287       AUBIO_ERR("Could not read frame in %s (%s)\n", s->path, errorstr);
     386      AUBIO_ERR("source_avcodec: could not read frame in %s (%s)\n",
     387          s->path, errorstr);
     388      s->eof = 1;
    288389      goto beach;
    289390    }
    290391  } while (avPacket.stream_index != s->selected_stream);
    291392
    292   int got_frame = 0;
    293   int len = avcodec_decode_audio4(avCodecCtx, avFrame, &got_frame, &avPacket);
     393#if FF_API_LAVF_AVCTX
     394  ret = avcodec_send_packet(avCodecCtx, &avPacket);
     395  if (ret < 0 && ret != AVERROR_EOF) {
     396    AUBIO_ERR("source_avcodec: error when sending packet for %s\n", s->path);
     397    goto beach;
     398  }
     399  ret = avcodec_receive_frame(avCodecCtx, avFrame);
     400  if (ret >= 0) {
     401    got_frame = 1;
     402  }
     403  if (ret < 0) {
     404    if (ret == AVERROR(EAGAIN)) {
     405      //AUBIO_WRN("source_avcodec: output is not available right now - "
     406      //    "user must try to send new input\n");
     407      goto beach;
     408    } else if (ret == AVERROR_EOF) {
     409      AUBIO_WRN("source_avcodec: the decoder has been fully flushed, "
     410          "and there will be no more output frames\n");
     411    } else {
     412      AUBIO_ERR("source_avcodec: decoding errors on %s\n", s->path);
     413      goto beach;
     414    }
     415  }
     416#else
     417  len = avcodec_decode_audio4(avCodecCtx, avFrame, &got_frame, &avPacket);
    294418
    295419  if (len < 0) {
    296     AUBIO_ERR("Error while decoding %s\n", s->path);
    297     goto beach;
    298   }
     420    AUBIO_ERR("source_avcodec: error while decoding %s\n", s->path);
     421    goto beach;
     422  }
     423#endif
    299424  if (got_frame == 0) {
    300     //AUBIO_ERR("Could not get frame for (%s)\n", s->path);
    301     goto beach;
    302   }
    303 
    304   int in_linesize = 0;
     425    AUBIO_WRN("source_avcodec: did not get a frame when reading %s\n",
     426        s->path);
     427    goto beach;
     428  }
     429
     430#if LIBAVUTIL_VERSION_MAJOR > 52
     431  if (avFrame->channels != (sint_t)s->input_channels) {
     432    AUBIO_WRN ("source_avcodec: trying to read from %d channel(s),"
     433        "but configured for %d; is '%s' corrupt?\n",
     434        avFrame->channels, s->input_channels, s->path);
     435    goto beach;
     436  }
     437#else
     438#warning "avutil < 53 is deprecated, crashes might occur on corrupt files"
     439#endif
     440
     441#ifdef HAVE_AVRESAMPLE
     442  in_linesize = 0;
    305443  av_samples_get_buffer_size(&in_linesize, avCodecCtx->channels,
    306444      avFrame->nb_samples, avCodecCtx->sample_fmt, 1);
    307   int in_samples = avFrame->nb_samples;
    308   int out_linesize = 0;
    309   int max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE;
    310   int out_samples = avresample_convert ( avr,
     445  in_samples = avFrame->nb_samples;
     446  out_linesize = 0;
     447  max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE;
     448  out_samples = avresample_convert ( avr,
    311449        (uint8_t **)&output, out_linesize, max_out_samples,
    312450        (uint8_t **)avFrame->data, in_linesize, in_samples);
     451#elif defined(HAVE_SWRESAMPLE)
     452  in_samples = avFrame->nb_samples;
     453  max_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE / avCodecCtx->channels;
     454  out_samples = swr_convert( avr,
     455      (uint8_t **)&output, max_out_samples,
     456      (const uint8_t **)avFrame->data, in_samples);
     457#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
    313458  if (out_samples <= 0) {
    314     //AUBIO_ERR("No sample found while converting frame (%s)\n", s->path);
     459    AUBIO_WRN("source_avcodec: no sample found while converting frame (%s)\n",
     460        s->path);
    315461    goto beach;
    316462  }
     
    322468  s->avCodecCtx = avCodecCtx;
    323469  s->avFrame = avFrame;
     470#if defined(HAVE_AVRESAMPLE) || defined(HAVE_SWRESAMPLE)
    324471  s->avr = avr;
     472#endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */
    325473  s->output = output;
    326474
     
    328476}
    329477
    330 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, uint_t * read){
    331   if (s->multi == 1) aubio_source_avcodec_reset_resampler(s, 0);
    332   uint_t i;
     478void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data,
     479    uint_t * read) {
     480  uint_t i, j;
    333481  uint_t end = 0;
    334482  uint_t total_wrote = 0;
     
    336484    end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote);
    337485    for (i = 0; i < end; i++) {
    338       read_data->data[i + total_wrote] = s->output[i + s->read_index];
     486      read_data->data[i + total_wrote] = 0.;
     487      for (j = 0; j < s->input_channels; j++) {
     488        read_data->data[i + total_wrote] +=
     489          s->output[(i + s->read_index) * s->input_channels + j];
     490      }
     491      read_data->data[i + total_wrote] *= 1./s->input_channels;
    339492    }
    340493    total_wrote += end;
     
    352505  }
    353506  if (total_wrote < s->hop_size) {
    354     for (i = end; i < s->hop_size; i++) {
     507    for (i = total_wrote; i < s->hop_size; i++) {
    355508      read_data->data[i] = 0.;
    356509    }
     
    359512}
    360513
    361 void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s, fmat_t * read_data, uint_t * read){
    362   if (s->multi == 0) aubio_source_avcodec_reset_resampler(s, 1);
     514void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s,
     515    fmat_t * read_data, uint_t * read) {
    363516  uint_t i,j;
    364517  uint_t end = 0;
     
    387540  if (total_wrote < s->hop_size) {
    388541    for (j = 0; j < read_data->height; j++) {
    389       for (i = end; i < s->hop_size; i++) {
     542      for (i = total_wrote; i < s->hop_size; i++) {
    390543        read_data->data[j][i] = 0.;
    391544      }
     
    404557
    405558uint_t aubio_source_avcodec_seek (aubio_source_avcodec_t * s, uint_t pos) {
    406   int64_t resampled_pos = (uint_t)ROUND(pos * (s->input_samplerate * 1. / s->samplerate));
     559  int64_t resampled_pos =
     560    (uint_t)ROUND(pos * (s->input_samplerate * 1. / s->samplerate));
    407561  int64_t min_ts = MAX(resampled_pos - 2000, 0);
    408562  int64_t max_ts = MIN(resampled_pos + 2000, INT64_MAX);
    409563  int seek_flags = AVSEEK_FLAG_FRAME | AVSEEK_FLAG_ANY;
    410   int ret = avformat_seek_file(s->avFormatCtx, s->selected_stream,
     564  int ret = AUBIO_FAIL;
     565  if (s->avFormatCtx != NULL && s->avr != NULL) {
     566    ret = AUBIO_OK;
     567  } else {
     568    AUBIO_ERR("source_avcodec: failed seeking in %s (file not opened?)",
     569        s->path);
     570    return ret;
     571  }
     572  if ((sint_t)pos < 0) {
     573    AUBIO_ERR("source_avcodec: could not seek %s at %d (seeking position"
     574       " should be >= 0)\n", s->path, pos);
     575    return AUBIO_FAIL;
     576  }
     577  ret = avformat_seek_file(s->avFormatCtx, s->selected_stream,
    411578      min_ts, resampled_pos, max_ts, seek_flags);
    412579  if (ret < 0) {
    413     AUBIO_ERR("Failed seeking to %d in file %s", pos, s->path);
     580    AUBIO_ERR("source_avcodec: failed seeking to %d in file %s",
     581        pos, s->path);
    414582  }
    415583  // reset read status
     
    417585  s->read_index = 0;
    418586  s->read_samples = 0;
     587#ifdef HAVE_AVRESAMPLE
    419588  // reset the AVAudioResampleContext
    420589  avresample_close(s->avr);
    421590  avresample_open(s->avr);
     591#elif defined(HAVE_SWRESAMPLE)
     592  swr_close(s->avr);
     593  swr_init(s->avr);
     594#endif
    422595  return ret;
    423596}
     
    433606uint_t aubio_source_avcodec_close(aubio_source_avcodec_t * s) {
    434607  if (s->avr != NULL) {
     608#ifdef HAVE_AVRESAMPLE
    435609    avresample_close( s->avr );
     610#elif defined(HAVE_SWRESAMPLE)
     611    swr_close ( s->avr );
     612#endif
    436613    av_free ( s->avr );
    437614  }
    438615  s->avr = NULL;
    439616  if (s->avCodecCtx != NULL) {
     617#ifndef HAVE_AUBIO_LIBAVCODEC_DEPRECATED
     618    avcodec_free_context( &s->avCodecCtx );
     619#else
    440620    avcodec_close ( s->avCodecCtx );
     621#endif
    441622  }
    442623  s->avCodecCtx = NULL;
    443624  if (s->avFormatCtx != NULL) {
    444     avformat_close_input ( &(s->avFormatCtx) );
    445   }
    446   s->avFormatCtx = NULL;
     625    avformat_close_input(&s->avFormatCtx);
     626    s->avFormatCtx = NULL;
     627  }
     628  av_packet_unref(&s->avPacket);
    447629  return AUBIO_OK;
    448630}
     
    458640    av_frame_free( &(s->avFrame) );
    459641  }
    460   if (s->path) AUBIO_FREE(s->path);
    461642  s->avFrame = NULL;
     643  if (s->path) {
     644    AUBIO_FREE(s->path);
     645  }
     646  s->path = NULL;
    462647  AUBIO_FREE(s);
    463648}
Note: See TracChangeset for help on using the changeset viewer.