diff options
author | Roman Shaposhnik <roman@shaposhnik.org> | 2008-11-12 17:47:23 +0000 |
---|---|---|
committer | Roman Shaposhnik <roman@shaposhnik.org> | 2008-11-12 17:47:23 +0000 |
commit | 3a84713aaa5a0f83cbb3fdca62c83df609822c9c (patch) | |
tree | fb2e3a6047cc289f35bcb451bd82e85e5b2a18f1 /libavcodec/pthread.c | |
parent | 52ece4105788c533625600b887e6bc762a97508d (diff) | |
download | ffmpeg-streaming-3a84713aaa5a0f83cbb3fdca62c83df609822c9c.zip ffmpeg-streaming-3a84713aaa5a0f83cbb3fdca62c83df609822c9c.tar.gz |
Making it easier to send arbitrary structures as work orders to MT workers
Originally committed as revision 15804 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/pthread.c')
-rw-r--r-- | libavcodec/pthread.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c index 702adb5..71f2da6 100644 --- a/libavcodec/pthread.c +++ b/libavcodec/pthread.c @@ -30,10 +30,11 @@ typedef int (action_t)(AVCodecContext *c, void *arg); typedef struct ThreadContext { pthread_t *workers; action_t *func; - void **args; + void *args; int *rets; int rets_count; int job_count; + int job_size; pthread_cond_t last_job_cond; pthread_cond_t current_job_cond; @@ -67,7 +68,7 @@ static void* attribute_align_arg worker(void *v) } pthread_mutex_unlock(&c->current_job_lock); - c->rets[our_job%c->rets_count] = c->func(avctx, c->args[our_job]); + c->rets[our_job%c->rets_count] = c->func(avctx, (char*)c->args + our_job*c->job_size); pthread_mutex_lock(&c->current_job_lock); our_job = c->current_job++; @@ -100,7 +101,7 @@ void avcodec_thread_free(AVCodecContext *avctx) av_freep(&avctx->thread_opaque); } -int avcodec_thread_execute(AVCodecContext *avctx, action_t* func, void **arg, int *ret, int job_count) +int avcodec_thread_execute(AVCodecContext *avctx, action_t* func, void *arg, int *ret, int job_count, int job_size) { ThreadContext *c= avctx->thread_opaque; int dummy_ret; @@ -112,6 +113,7 @@ int avcodec_thread_execute(AVCodecContext *avctx, action_t* func, void **arg, in c->current_job = avctx->thread_count; c->job_count = job_count; + c->job_size = job_size; c->args = arg; c->func = func; if (ret) { @@ -147,6 +149,7 @@ int avcodec_thread_init(AVCodecContext *avctx, int thread_count) avctx->thread_count = thread_count; c->current_job = 0; c->job_count = 0; + c->job_size = 0; c->done = 0; pthread_cond_init(&c->current_job_cond, NULL); pthread_cond_init(&c->last_job_cond, NULL); |