diff --git a/libavcodec/utils.c b/libavcodec/utils.c index a46dda7e9c..0190e6652c 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -456,7 +456,7 @@ AVFrame *avcodec_alloc_frame(void){ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) { - int ret= -1; + int ret = 0; /* If there is a user-supplied mutex locking routine, call it. */ if (ff_lockmgr_cb) { @@ -467,11 +467,14 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) entangled_thread_counter++; if(entangled_thread_counter != 1){ av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n"); + ret = -1; goto end; } - if(avctx->codec || !codec) + if(avctx->codec || !codec) { + ret = AVERROR(EINVAL); goto end; + } if (codec->priv_data_size > 0) { if(!avctx->priv_data){ @@ -521,6 +524,7 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) if (avctx->codec_id != codec->id || (avctx->codec_type != codec->type && avctx->codec_type != AVMEDIA_TYPE_ATTACHMENT)) { av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n"); + ret = AVERROR(EINVAL); goto free_and_end; } avctx->frame_number = 0; @@ -535,6 +539,7 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) if (avctx->codec->max_lowres < avctx->lowres) { av_log(avctx, AV_LOG_ERROR, "The maximum value for lowres supported by the decoder is %d\n", avctx->codec->max_lowres); + ret = AVERROR(EINVAL); goto free_and_end; } if (avctx->codec->sample_fmts && avctx->codec->encode) { @@ -544,6 +549,7 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) break; if (avctx->codec->sample_fmts[i] == AV_SAMPLE_FMT_NONE) { av_log(avctx, AV_LOG_ERROR, "Specified sample_fmt is not supported.\n"); + ret = AVERROR(EINVAL); goto free_and_end; } } @@ -554,7 +560,6 @@ int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec) goto free_and_end; } } - ret=0; end: entangled_thread_counter--;