1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

Make sure priv_data is freed and codec is set to NULL in case of failure of avcodec_open().

Originally committed as revision 20002 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Michael Niedermayer 2009-09-23 15:16:36 +00:00
parent aedc98b0a4
commit 2a9b5c9b42

View File

@ -475,23 +475,20 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
if (((avctx->coded_width || avctx->coded_height) if (((avctx->coded_width || avctx->coded_height)
&& avcodec_check_dimensions(avctx, avctx->coded_width, avctx->coded_height)) && avcodec_check_dimensions(avctx, avctx->coded_width, avctx->coded_height))
|| avctx->channels > SANE_NB_CHANNELS) { || avctx->channels > SANE_NB_CHANNELS) {
av_freep(&avctx->priv_data);
ret = AVERROR(EINVAL); ret = AVERROR(EINVAL);
goto end; goto free_and_end;
} }
avctx->codec = codec; avctx->codec = codec;
if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){ if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){
av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n"); av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n");
goto end; goto free_and_end;
} }
avctx->frame_number = 0; avctx->frame_number = 0;
if(avctx->codec->init){ if(avctx->codec->init){
ret = avctx->codec->init(avctx); ret = avctx->codec->init(avctx);
if (ret < 0) { if (ret < 0) {
av_freep(&avctx->priv_data); goto free_and_end;
avctx->codec= NULL;
goto end;
} }
} }
ret=0; ret=0;
@ -503,6 +500,10 @@ end:
(*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE); (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
} }
return ret; return ret;
free_and_end:
av_freep(&avctx->priv_data);
avctx->codec= NULL;
goto end;
} }
int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,