diff options
author | Ronald S. Bultje <rsbultje@gmail.com> | 2011-07-10 17:28:28 -0700 |
---|---|---|
committer | Ronald S. Bultje <rsbultje@gmail.com> | 2011-07-10 21:41:52 -0700 |
commit | 5eafc8b46644764f8aef1b7b2ecae53ee8034822 (patch) | |
tree | be0f9494d8426dd01d1b69281fd6f8124cf98de9 | |
parent | 58ef4ecff834f47f5a4c2a6bd4385b1999a30930 (diff) | |
download | ffmpeg-5eafc8b46644764f8aef1b7b2ecae53ee8034822.tar.gz |
mt: proper locking around release_buffer calls.
This fixes a crash when seeking in some webm files with many
threads (e.g. 8).
-rw-r--r-- | libavcodec/pthread.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 08ef4ba0c2..77e072d96a 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -408,9 +408,10 @@ static void release_delayed_buffers(PerThreadContext *p) FrameThreadContext *fctx = p->parent; while (p->num_released_buffers > 0) { - AVFrame *f = &p->released_buffers[--p->num_released_buffers]; + AVFrame *f; pthread_mutex_lock(&fctx->buffer_mutex); + f = &p->released_buffers[--p->num_released_buffers]; free_progress(f); f->thread_opaque = NULL; @@ -836,6 +837,7 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f) { PerThreadContext *p = avctx->thread_opaque; + FrameThreadContext *fctx; if (!(avctx->active_thread_type&FF_THREAD_FRAME)) { avctx->release_buffer(avctx, f); @@ -851,7 +853,10 @@ void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f) av_log(avctx, AV_LOG_DEBUG, "thread_release_buffer called on pic %p, %d buffers used\n", f, f->owner->internal_buffer_count); + fctx = p->parent; + pthread_mutex_lock(&fctx->buffer_mutex); p->released_buffers[p->num_released_buffers++] = *f; + pthread_mutex_unlock(&fctx->buffer_mutex); memset(f->data, 0, sizeof(f->data)); } |