]> git.sesse.net Git - ffmpeg/commitdiff
pthread: fixed thread initialization issues related to thread-safe buffer allocator
authorAnatoliy Wasserman <anatoliy.wasserman@yandex.ru>
Wed, 7 Dec 2011 22:14:49 +0000 (14:14 -0800)
committerMichael Niedermayer <michaelni@gmx.at>
Thu, 8 Dec 2011 01:01:21 +0000 (02:01 +0100)
Signed-off-by: Anatoliy Wasserman <anatoliy.wasserman@yandex.ru>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/libopenjpegdec.c
libavcodec/pthread.c

index baa516b66bb107ed36b90db3d8dcf7649ffd0e58..ca3ef5f8422d8827743adc1a0feae76423518122 100644 (file)
@@ -241,8 +241,6 @@ static int libopenjpeg_decode_frame(AVCodecContext *avctx,
         return -1;
     }
 
-    ff_thread_finish_setup(avctx);
-
     ctx->dec_params.cp_limit_decoding = NO_LIMITATION;
     ctx->dec_params.cp_reduce = avctx->lowres;
     // Tie decoder with decoding parameters
index 8aac89fa24509008687dd6c271a0cafec13e0f1e..2154163c106c034492f67277980fbe7ee01af9fe 100644 (file)
@@ -301,7 +301,7 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
 
         if (fctx->die) break;
 
-        if (!codec->update_thread_context && avctx->thread_safe_callbacks)
+        if (!codec->update_thread_context && (avctx->thread_safe_callbacks || avctx->get_buffer == avcodec_default_get_buffer))
             ff_thread_finish_setup(avctx);
 
         pthread_mutex_lock(&p->mutex);
@@ -403,6 +403,7 @@ static void update_context_from_user(AVCodecContext *dst, AVCodecContext *src)
 
     dst->frame_number     = src->frame_number;
     dst->reordered_opaque = src->reordered_opaque;
+    dst->thread_safe_callbacks = src->thread_safe_callbacks;
 #undef copy_fields
 }
 
@@ -828,7 +829,8 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f)
     }
 
     if (p->state != STATE_SETTING_UP &&
-        (avctx->codec->update_thread_context || !avctx->thread_safe_callbacks)) {
+        (avctx->codec->update_thread_context || (!avctx->thread_safe_callbacks &&
+                avctx->get_buffer != avcodec_default_get_buffer))) {
         av_log(avctx, AV_LOG_ERROR, "get_buffer() cannot be called after ff_thread_finish_setup()\n");
         return -1;
     }