X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fpthread.c;h=8006ae7479cb046f642393133d70afcb0c129950;hb=2f48dff4550e8224c7aae03525df273aaebce171;hp=482c8456afcb103760b07781120a70a4710f8cb2;hpb=3630a075132a8d059b16f92a291e523c1bc7ebc9;p=ffmpeg diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 482c8456afc..8006ae7479c 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -129,8 +129,8 @@ typedef struct PerThreadContext { /** * Array of progress values used by ff_thread_get_buffer(). */ - int progress[MAX_BUFFERS][2]; - uint8_t progress_used[MAX_BUFFERS]; + volatile int progress[MAX_BUFFERS][2]; + volatile uint8_t progress_used[MAX_BUFFERS]; AVFrame *requested_frame; ///< AVFrame the codec passed to get_buffer() } PerThreadContext; @@ -160,7 +160,7 @@ typedef struct FrameThreadContext { * limit the number of threads to 16 for automatic detection */ #define MAX_AUTO_THREADS 16 -static int get_logical_cpus(AVCodecContext *avctx) +int ff_get_logical_cpus(AVCodecContext *avctx) { int ret, nb_cpus = 1; #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT) @@ -303,7 +303,7 @@ static int thread_init(AVCodecContext *avctx) int thread_count = avctx->thread_count; if (!thread_count) { - int nb_cpus = get_logical_cpus(avctx); + int nb_cpus = ff_get_logical_cpus(avctx); // use number of cores + 1 as thread count if there is more than one if (nb_cpus > 1) thread_count = avctx->thread_count = FFMIN(nb_cpus + 1, MAX_AUTO_THREADS); @@ -500,7 +500,7 @@ static int update_context_from_user(AVCodecContext *dst, AVCodecContext *src) static void free_progress(AVFrame *f) { PerThreadContext *p = f->owner->thread_opaque; - int *progress = f->thread_opaque; + volatile int *progress = f->thread_opaque; p->progress_used[(progress - p->progress[0]) / 2] = 0; } @@ -666,7 +666,7 @@ int ff_thread_decode_frame(AVCodecContext *avctx, void ff_thread_report_progress(AVFrame *f, int n, int field) { PerThreadContext *p; - int *progress = f->thread_opaque; + volatile int *progress = f->thread_opaque; if (!progress || progress[field] >= n) return; @@ -684,7 +684,7 @@ void ff_thread_report_progress(AVFrame *f, int n, int field) void ff_thread_await_progress(AVFrame *f, int n, int field) { PerThreadContext *p; - int *progress = f->thread_opaque; + volatile int *progress = f->thread_opaque; if (!progress || progress[field] >= n) return; @@ -799,7 +799,7 @@ static int frame_thread_init(AVCodecContext *avctx) int i, err = 0; if (!thread_count) { - int nb_cpus = get_logical_cpus(avctx); + int nb_cpus = ff_get_logical_cpus(avctx); if ((avctx->debug & (FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE)) || avctx->debug_mv) nb_cpus = 1; // use number of cores + 1 as thread count if there is more than one @@ -886,8 +886,8 @@ error: void ff_thread_flush(AVCodecContext *avctx) { - FrameThreadContext *fctx = avctx->thread_opaque; int i; + FrameThreadContext *fctx = avctx->thread_opaque; if (!avctx->thread_opaque) return; @@ -911,7 +911,7 @@ void ff_thread_flush(AVCodecContext *avctx) } } -static int *allocate_progress(PerThreadContext *p) +static volatile int *allocate_progress(PerThreadContext *p) { int i; @@ -942,7 +942,8 @@ int ff_thread_can_start_frame(AVCodecContext *avctx) int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) { PerThreadContext *p = avctx->thread_opaque; - int *progress, err; + int err; + volatile int *progress; f->owner = avctx; @@ -961,7 +962,7 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) } pthread_mutex_lock(&p->parent->buffer_mutex); - f->thread_opaque = progress = allocate_progress(p); + f->thread_opaque = (int*)(progress = allocate_progress(p)); if (!progress) { pthread_mutex_unlock(&p->parent->buffer_mutex); @@ -975,9 +976,9 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f) avctx->get_buffer == avcodec_default_get_buffer) { err = avctx->get_buffer(avctx, f); } else { + pthread_mutex_lock(&p->progress_mutex); p->requested_frame = f; p->state = STATE_GET_BUFFER; - pthread_mutex_lock(&p->progress_mutex); pthread_cond_broadcast(&p->progress_cond); while (p->state != STATE_SETTING_UP)