aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
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-22 08:39:02 +0100
commit16af5236aea621ee88641903ce080f2977691013 (patch)
tree599d817e326933742a480a89aaf5a4fd61e1185b /libavcodec
parent2b114adcf4b46904e776d42a333db134e53dd6fc (diff)
downloadffmpeg-16af5236aea621ee88641903ce080f2977691013.tar.gz
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> (cherry picked from commit 746796ceb49b3dab88d3c05f26c2406eceadf4ed)
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/avcodec.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/libavcodec/avcodec.c b/libavcodec/avcodec.c
index 34ab793490..50d910b06a 100644
--- a/libavcodec/avcodec.c
+++ b/libavcodec/avcodec.c
@@ -318,6 +318,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");
@@ -339,13 +346,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);