aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRonald S. Bultje <rsbultje@gmail.com>2011-07-10 17:28:28 -0700
committerReinhard Tartler <siretart@tauware.de>2011-07-12 18:13:35 +0200
commit5e3578893a06644e226bcfefc726b60e2d75a890 (patch)
tree6f2b88345d1dc9b1d0b82adb155ddeecb00cbd7c
parentdc1b670a2c34a0e1c5c0ba9531dfc8f5a6746a0b (diff)
downloadffmpeg-5e3578893a06644e226bcfefc726b60e2d75a890.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). (cherry picked from commit 5eafc8b46644764f8aef1b7b2ecae53ee8034822)
-rw-r--r--libavcodec/pthread.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index 9fea9a0afc..e546c21ddd 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;
@@ -839,6 +840,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);
@@ -854,7 +856,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));
}