[FFmpeg-devel] [PATCH 31/92] Vulkan patchset part 1 - common code changes

Anton Khirnov anton at khirnov.net
Mon Apr 17 12:25:18 EEST 2023


Quoting Lynne (2023-03-14 07:33:43)
> From 6e2dfc44e50798264eb16bc2dcabfdbf2fbac2d7 Mon Sep 17 00:00:00 2001
> From: Lynne <dev at lynne.ee>
> Date: Thu, 15 Dec 2022 01:06:52 +0100
> Subject: [PATCH 24/92] hwconfig: add a new HWACCEL_CAP_THREAD_SAFE for
>  threadsafe hwaccels
> 
> Vulkan is fully threadsafe and stateless, so we can benefit from this.
> ---
>  libavcodec/hwconfig.h      | 1 +
>  libavcodec/pthread_frame.c | 2 +-
>  2 files changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h
> index 721424912c..e6b78f0160 100644
> --- a/libavcodec/hwconfig.h
> +++ b/libavcodec/hwconfig.h
> @@ -24,6 +24,7 @@
>  
>  
>  #define HWACCEL_CAP_ASYNC_SAFE      (1 << 0)
> +#define HWACCEL_CAP_THREAD_SAFE     (1 << 1)
>  
>  
>  typedef struct AVCodecHWConfigInternal {
> diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
> index 74864e19c5..c096287233 100644
> --- a/libavcodec/pthread_frame.c
> +++ b/libavcodec/pthread_frame.c
> @@ -204,7 +204,7 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
>  
>          /* if the previous thread uses hwaccel then we take the lock to ensure
>           * the threads don't run concurrently */
> -        if (avctx->hwaccel) {
> +        if (avctx->hwaccel && !(avctx->hwaccel->caps_internal & HWACCEL_CAP_THREAD_SAFE)) {

A major problem here is that hwaccel_priv_data exists in only a single
instance shared across all the worker threads. If you want frame-threaded
hwaccels, you'll need to add some mechanism for synchronizing it between
threads.

I really wonder how does your code survive all the races involved.

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list