summaryrefslogtreecommitdiff
path: root/libavcodec/pthread.c
diff options
context:
space:
mode:
authorRoman Shaposhnik <roman@shaposhnik.org>2008-11-12 17:47:23 +0000
committerRoman Shaposhnik <roman@shaposhnik.org>2008-11-12 17:47:23 +0000
commit3a84713aaa5a0f83cbb3fdca62c83df609822c9c (patch)
treefb2e3a6047cc289f35bcb451bd82e85e5b2a18f1 /libavcodec/pthread.c
parent52ece4105788c533625600b887e6bc762a97508d (diff)
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.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/libavcodec/pthread.c b/libavcodec/pthread.c
index 702adb533d..71f2da630f 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);