avcodec/vp9: Do not destroy uninitialized mutexes/conditions

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.

Reported-by: Steve Lhomme <robux4@ycbcr.xyz>
Reviewed-by: Steve Lhomme <robux4@ycbcr.xyz>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
Andreas Rheinhardt 2021-09-02 12:08:10 +02:00
parent 0172deccc4
commit bd95f2f599

View File

@ -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)