[FFmpeg-devel] [PATCH 01/13] avcodec/vp9: Do not destroy uninitialized mutexes/conditions
Steve Lhomme
robux4 at ycbcr.xyz
Fri Sep 3 09:42:33 EEST 2021
On 2021-09-02 17:34, Andreas Rheinhardt wrote:
> Also do not destroy and reinitialize mutexes and conditions when
> certain input parameters change. Given that the decoder did not
> create these variables at all during init, uninitialized mutexes
> and conditions are destroyed before the very first initialization.
> This is undefined behaviour and certain threading implementations
> like pthreadGC2 crash when it is attempted.
>
> Fix this by initializing these objects once during init and freeing
> them in close.
Works for me.
> Reported-by: Steve Lhomme <robux4 at ycbcr.xyz>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
> libavcodec/vp9.c | 18 +++++++++++++-----
> 1 file changed, 13 insertions(+), 5 deletions(-)
>
> diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c
> index 874005a5ae..5c20a7ec5d 100644
> --- a/libavcodec/vp9.c
> +++ b/libavcodec/vp9.c
> @@ -43,8 +43,6 @@ static void vp9_free_entries(AVCodecContext *avctx) {
> VP9Context *s = avctx->priv_data;
>
> if (avctx->active_thread_type & FF_THREAD_SLICE) {
> - pthread_mutex_destroy(&s->progress_mutex);
> - pthread_cond_destroy(&s->progress_cond);
> av_freep(&s->entries);
> }
> }
> @@ -66,9 +64,6 @@ static int vp9_alloc_entries(AVCodecContext *avctx, int n) {
>
> for (i = 0; i < n; i++)
> atomic_init(&s->entries[i], 0);
> -
> - pthread_mutex_init(&s->progress_mutex, NULL);
> - pthread_cond_init(&s->progress_cond, NULL);
> }
> return 0;
> }
> @@ -1252,6 +1247,12 @@ static av_cold int vp9_decode_free(AVCodecContext *avctx)
>
> free_buffers(s);
> vp9_free_entries(avctx);
> +#if HAVE_THREADS
> + if (avctx->active_thread_type & FF_THREAD_SLICE) {
> + pthread_mutex_destroy(&s->progress_mutex);
> + pthread_cond_destroy(&s->progress_cond);
> + }
> +#endif
> av_freep(&s->td);
> return 0;
> }
> @@ -1797,6 +1798,13 @@ static av_cold int vp9_decode_init(AVCodecContext *avctx)
> s->last_bpp = 0;
> s->s.h.filter.sharpness = -1;
>
> +#if HAVE_THREADS
> + if (avctx->active_thread_type & FF_THREAD_SLICE) {
> + pthread_mutex_init(&s->progress_mutex, NULL);
> + pthread_cond_init(&s->progress_cond, NULL);
> + }
> +#endif
> +
> for (int i = 0; i < 3; i++) {
> s->s.frames[i].tf.f = av_frame_alloc();
> if (!s->s.frames[i].tf.f)
> --
> 2.30.2
>
More information about the ffmpeg-devel
mailing list