From f9b6e3e48d2544a448e305f7aa43fe7310ecb1d0 Mon Sep 17 00:00:00 2001 From: Andreas Rheinhardt Date: Thu, 14 Sep 2023 18:30:07 +0200 Subject: [PATCH] avcodec/pthread_frame: Only set PerThreadContext* when frame-threading Otherwise the thread_ctx pointer might be NULL or point to a SliceThreadContext. Signed-off-by: Andreas Rheinhardt --- libavcodec/pthread_frame.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 4973d64550..b53fb54906 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -644,10 +644,12 @@ void ff_thread_await_progress(const ThreadFrame *f, int n, int field) } void ff_thread_finish_setup(AVCodecContext *avctx) { - PerThreadContext *p = avctx->internal->thread_ctx; + PerThreadContext *p; if (!(avctx->active_thread_type&FF_THREAD_FRAME)) return; + p = avctx->internal->thread_ctx; + p->hwaccel_threadsafe = avctx->hwaccel && (ffhwaccel(avctx->hwaccel)->caps_internal & HWACCEL_CAP_THREAD_SAFE); @@ -956,11 +958,12 @@ void ff_thread_flush(AVCodecContext *avctx) int ff_thread_can_start_frame(AVCodecContext *avctx) { - PerThreadContext *p = avctx->internal->thread_ctx; - - if ((avctx->active_thread_type&FF_THREAD_FRAME) && atomic_load(&p->state) != STATE_SETTING_UP && + if ((avctx->active_thread_type & FF_THREAD_FRAME) && ffcodec(avctx->codec)->update_thread_context) { - return 0; + PerThreadContext *p = avctx->internal->thread_ctx; + + if (atomic_load(&p->state) != STATE_SETTING_UP) + return 0; } return 1;