summaryrefslogtreecommitdiff
path: root/libavcodec/avcodec.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2021-03-16 20:01:52 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2021-03-20 01:55:41 +0100
commit746796ceb49b3dab88d3c05f26c2406eceadf4ed (patch)
tree513d03be0f91cfdefc0959f514d60031102f3e74 /libavcodec/avcodec.c
parente3156fa7c2b85e9b8d1dfe6a92b0920624c0e65c (diff)
avcodec/avcodec: Sanitize options before using them
This is how it is supposed to happen, yet when using frame threading, the codec's init function has been called before preinit. This can lead to crashes when e.g. using unsupported lowres values for decoders together with frame threading. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavcodec/avcodec.c')
-rw-r--r--libavcodec/avcodec.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 13fe3d4ebf..b3940b97e0 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -315,6 +315,13 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
avctx->time_base.den = avctx->sample_rate;
}
+ if (av_codec_is_encoder(avctx->codec))
+ ret = ff_encode_preinit(avctx);
+ else
+ ret = ff_decode_preinit(avctx);
+ if (ret < 0)
+ goto free_and_end;
+
if (!HAVE_THREADS)
av_log(avctx, AV_LOG_WARNING, "Warning: not compiled with thread support, using thread emulation\n");
@@ -336,13 +343,6 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
if (!HAVE_THREADS && !(codec->caps_internal & FF_CODEC_CAP_AUTO_THREADS))
avctx->thread_count = 1;
- if (av_codec_is_encoder(avctx->codec))
- ret = ff_encode_preinit(avctx);
- else
- ret = ff_decode_preinit(avctx);
- if (ret < 0)
- goto free_and_end;
-
if ( avctx->codec->init && (!(avctx->active_thread_type&FF_THREAD_FRAME)
|| avci->frame_thread_encoder)) {
ret = avctx->codec->init(avctx);