Mercurial > libavcodec.hg
comparison utils.c @ 10255:b81ec4ac8f96 libavcodec
Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().
author | michael |
---|---|
date | Wed, 23 Sep 2009 15:16:36 +0000 |
parents | bd1c4a438c7f |
children | 294c444866f7 |
comparison
equal
deleted
inserted
replaced
10254:b9f5f8b8f073 | 10255:b81ec4ac8f96 |
---|---|
473 | 473 |
474 #define SANE_NB_CHANNELS 128U | 474 #define SANE_NB_CHANNELS 128U |
475 if (((avctx->coded_width || avctx->coded_height) | 475 if (((avctx->coded_width || avctx->coded_height) |
476 && avcodec_check_dimensions(avctx, avctx->coded_width, avctx->coded_height)) | 476 && avcodec_check_dimensions(avctx, avctx->coded_width, avctx->coded_height)) |
477 || avctx->channels > SANE_NB_CHANNELS) { | 477 || avctx->channels > SANE_NB_CHANNELS) { |
478 av_freep(&avctx->priv_data); | |
479 ret = AVERROR(EINVAL); | 478 ret = AVERROR(EINVAL); |
480 goto end; | 479 goto free_and_end; |
481 } | 480 } |
482 | 481 |
483 avctx->codec = codec; | 482 avctx->codec = codec; |
484 if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){ | 483 if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){ |
485 av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n"); | 484 av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n"); |
486 goto end; | 485 goto free_and_end; |
487 } | 486 } |
488 avctx->frame_number = 0; | 487 avctx->frame_number = 0; |
489 if(avctx->codec->init){ | 488 if(avctx->codec->init){ |
490 ret = avctx->codec->init(avctx); | 489 ret = avctx->codec->init(avctx); |
491 if (ret < 0) { | 490 if (ret < 0) { |
492 av_freep(&avctx->priv_data); | 491 goto free_and_end; |
493 avctx->codec= NULL; | |
494 goto end; | |
495 } | 492 } |
496 } | 493 } |
497 ret=0; | 494 ret=0; |
498 end: | 495 end: |
499 entangled_thread_counter--; | 496 entangled_thread_counter--; |
501 /* Release any user-supplied mutex. */ | 498 /* Release any user-supplied mutex. */ |
502 if (ff_lockmgr_cb) { | 499 if (ff_lockmgr_cb) { |
503 (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); | 500 (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); |
504 } | 501 } |
505 return ret; | 502 return ret; |
503 free_and_end: | |
504 av_freep(&avctx->priv_data); | |
505 avctx->codec= NULL; | |
506 goto end; | |
506 } | 507 } |
507 | 508 |
508 int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, | 509 int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
509 const short *samples) | 510 const short *samples) |
510 { | 511 { |