Changeset 633400d for src/io/source_avcodec.c
- Timestamp:
- Dec 5, 2018, 10:34:39 PM (5 years ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/io/source_avcodec.c
r5b46bc3 r633400d 19 19 */ 20 20 21 22 #include "config.h" 21 #include "aubio_priv.h" 23 22 24 23 #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> 25 34 26 35 // determine whether we use libavformat from ffmpeg or from libav 27 36 #define FFMPEG_LIBAVFORMAT (LIBAVFORMAT_VERSION_MICRO > 99 ) 28 // max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 through57.2.10037 // max_analyze_duration2 was used from ffmpeg libavformat 55.43.100 -> 57.2.100 29 38 #define FFMPEG_LIBAVFORMAT_MAX_DUR2 FFMPEG_LIBAVFORMAT && ( \ 30 39 (LIBAVFORMAT_VERSION_MAJOR == 55 && LIBAVFORMAT_VERSION_MINOR >= 43) \ … … 33 42 ) 34 43 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 40 55 41 56 #include "aubio_priv.h" … … 44 59 #include "source_avcodec.h" 45 60 61 #if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(56, 56, 0) 46 62 #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 47 66 48 67 struct _aubio_source_avcodec_t { … … 60 79 AVCodecContext *avCodecCtx; 61 80 AVFrame *avFrame; 81 AVPacket avPacket; 82 #ifdef HAVE_AVRESAMPLE 62 83 AVAudioResampleContext *avr; 63 float *output; 84 #elif defined(HAVE_SWRESAMPLE) 85 SwrContext *avr; 86 #endif 87 smpl_t *output; 64 88 uint_t read_samples; 65 89 uint_t read_index; 66 90 sint_t selected_stream; 67 91 uint_t eof; 68 uint_t multi;69 92 }; 70 93 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 95 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s); 96 // actually read a frame 97 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, 98 uint_t * read_samples); 74 99 75 100 uint_t aubio_source_avcodec_has_network_url(aubio_source_avcodec_t *s); … … 88 113 89 114 90 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, uint_t samplerate, uint_t hop_size) { 115 aubio_source_avcodec_t * new_aubio_source_avcodec(const char_t * path, 116 uint_t samplerate, uint_t hop_size) { 91 117 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; 92 127 int err; 93 128 if (path == NULL) { … … 96 131 } 97 132 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); 99 135 goto beach; 100 136 } 101 137 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); 103 140 goto beach; 104 141 } … … 111 148 strncpy(s->path, path, strnlen(path, PATH_MAX) + 1); 112 149 150 #if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(58,0,0) 113 151 // register all formats and codecs 114 152 av_register_all(); 153 #endif 115 154 116 155 if (aubio_source_avcodec_has_network_url(s)) { … … 119 158 120 159 // try opening the file and get some info about it 121 AVFormatContext *avFormatCtx = s->avFormatCtx;122 160 avFormatCtx = NULL; 123 161 if ( (err = avformat_open_input(&avFormatCtx, s->path, NULL, NULL) ) < 0 ) { … … 139 177 char errorstr[256]; 140 178 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); 143 181 goto beach; 144 182 } … … 148 186 149 187 // look for the first audio stream 150 uint_t i;151 sint_t selected_stream = -1;152 188 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 153 192 if (avFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { 193 #endif 154 194 if (selected_stream == -1) { 155 195 selected_stream = i; … … 167 207 s->selected_stream = selected_stream; 168 208 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 170 226 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 172 229 if (codec == NULL) { 173 230 AUBIO_ERR("source_avcodec: Could not find decoder for %s", s->path); 174 231 goto beach; 175 232 } 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 176 243 177 244 if ( ( err = avcodec_open2(avCodecCtx, codec, NULL) ) < 0) { 178 245 char errorstr[256]; 179 246 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); 181 249 goto beach; 182 250 } … … 199 267 } 200 268 201 AVFrame *avFrame = s->avFrame;202 269 avFrame = av_frame_alloc(); 203 270 if (!avFrame) { … … 206 273 207 274 /* 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)); 209 277 210 278 s->read_samples = 0; … … 215 283 s->avFrame = avFrame; 216 284 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; 219 288 220 289 s->eof = 0; 221 s->multi = 0;222 290 223 291 //av_log_set_level(AV_LOG_QUIET); … … 232 300 } 233 301 234 void aubio_source_avcodec_reset_resampler(aubio_source_avcodec_t * s, uint_t multi) { 235 if ( (multi != s->multi) || (s->avr == NULL) ) { 302 void 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; 236 307 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); 251 319 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 { 255 333 char errorstr[256]; 256 334 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); 260 337 return; 261 338 } 262 339 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 343 void aubio_source_avcodec_readframe(aubio_source_avcodec_t *s, 344 uint_t * read_samples) 345 { 268 346 AVFormatContext *avFormatCtx = s->avFormatCtx; 269 347 AVCodecContext *avCodecCtx = s->avCodecCtx; 270 348 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 272 373 av_init_packet (&avPacket); 273 AVAudioResampleContext *avr = s->avr;274 float *output = s->output;275 374 *read_samples = 0; 276 375 … … 285 384 char errorstr[256]; 286 385 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; 288 389 goto beach; 289 390 } 290 391 } while (avPacket.stream_index != s->selected_stream); 291 392 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); 294 418 295 419 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 299 424 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; 305 443 av_samples_get_buffer_size(&in_linesize, avCodecCtx->channels, 306 444 avFrame->nb_samples, avCodecCtx->sample_fmt, 1); 307 in t in_samples = avFrame->nb_samples;308 intout_linesize = 0;309 intmax_out_samples = AUBIO_AVCODEC_MAX_BUFFER_SIZE;310 intout_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, 311 449 (uint8_t **)&output, out_linesize, max_out_samples, 312 450 (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 */ 313 458 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); 315 461 goto beach; 316 462 } … … 322 468 s->avCodecCtx = avCodecCtx; 323 469 s->avFrame = avFrame; 470 #if defined(HAVE_AVRESAMPLE) || defined(HAVE_SWRESAMPLE) 324 471 s->avr = avr; 472 #endif /* HAVE_AVRESAMPLE || HAVE_SWRESAMPLE */ 325 473 s->output = output; 326 474 … … 328 476 } 329 477 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 ;478 void aubio_source_avcodec_do(aubio_source_avcodec_t * s, fvec_t * read_data, 479 uint_t * read) { 480 uint_t i, j; 333 481 uint_t end = 0; 334 482 uint_t total_wrote = 0; … … 336 484 end = MIN(s->read_samples - s->read_index, s->hop_size - total_wrote); 337 485 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; 339 492 } 340 493 total_wrote += end; … … 352 505 } 353 506 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++) { 355 508 read_data->data[i] = 0.; 356 509 } … … 359 512 } 360 513 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);514 void aubio_source_avcodec_do_multi(aubio_source_avcodec_t * s, 515 fmat_t * read_data, uint_t * read) { 363 516 uint_t i,j; 364 517 uint_t end = 0; … … 387 540 if (total_wrote < s->hop_size) { 388 541 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++) { 390 543 read_data->data[j][i] = 0.; 391 544 } … … 404 557 405 558 uint_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)); 407 561 int64_t min_ts = MAX(resampled_pos - 2000, 0); 408 562 int64_t max_ts = MIN(resampled_pos + 2000, INT64_MAX); 409 563 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, 411 578 min_ts, resampled_pos, max_ts, seek_flags); 412 579 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); 414 582 } 415 583 // reset read status … … 417 585 s->read_index = 0; 418 586 s->read_samples = 0; 587 #ifdef HAVE_AVRESAMPLE 419 588 // reset the AVAudioResampleContext 420 589 avresample_close(s->avr); 421 590 avresample_open(s->avr); 591 #elif defined(HAVE_SWRESAMPLE) 592 swr_close(s->avr); 593 swr_init(s->avr); 594 #endif 422 595 return ret; 423 596 } … … 433 606 uint_t aubio_source_avcodec_close(aubio_source_avcodec_t * s) { 434 607 if (s->avr != NULL) { 608 #ifdef HAVE_AVRESAMPLE 435 609 avresample_close( s->avr ); 610 #elif defined(HAVE_SWRESAMPLE) 611 swr_close ( s->avr ); 612 #endif 436 613 av_free ( s->avr ); 437 614 } 438 615 s->avr = NULL; 439 616 if (s->avCodecCtx != NULL) { 617 #ifndef HAVE_AUBIO_LIBAVCODEC_DEPRECATED 618 avcodec_free_context( &s->avCodecCtx ); 619 #else 440 620 avcodec_close ( s->avCodecCtx ); 621 #endif 441 622 } 442 623 s->avCodecCtx = NULL; 443 624 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); 447 629 return AUBIO_OK; 448 630 } … … 458 640 av_frame_free( &(s->avFrame) ); 459 641 } 460 if (s->path) AUBIO_FREE(s->path);461 642 s->avFrame = NULL; 643 if (s->path) { 644 AUBIO_FREE(s->path); 645 } 646 s->path = NULL; 462 647 AUBIO_FREE(s); 463 648 }
Note: See TracChangeset
for help on using the changeset viewer.