/*
- * Copyright (c) 2004 Roman Shaposhnik.
+ * Copyright (c) 2004 Roman Shaposhnik
*
* Many thanks to Steven M. Schultz for providing clever ideas and
* to Michael Niedermayer <michaelni@gmx.at> for writing initial
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- *
*/
#include <pthread.h>
#include "avcodec.h"
-#include "common.h"
-typedef int (action_t)(AVCodecContext *c, void *arg);
+typedef int (action_func)(AVCodecContext *c, void *arg);
typedef struct ThreadContext {
pthread_t *workers;
- action_t *func;
- void **args;
+ action_func *func;
+ 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;
int done;
} ThreadContext;
-static void* worker(void *v)
+static void* attribute_align_arg worker(void *v)
{
AVCodecContext *avctx = v;
ThreadContext *c = avctx->thread_opaque;
}
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++;
pthread_cond_destroy(&c->current_job_cond);
pthread_cond_destroy(&c->last_job_cond);
av_free(c->workers);
- av_free(c);
+ 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_func* func, void *arg, int *ret, int job_count, int job_size)
{
ThreadContext *c= avctx->thread_opaque;
int dummy_ret;
c->current_job = avctx->thread_count;
c->job_count = job_count;
+ c->job_size = job_size;
c->args = arg;
c->func = func;
if (ret) {
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);