|
|
|
@ -38,11 +38,13 @@ |
|
|
|
|
|
|
|
|
|
typedef int (action_func)(AVCodecContext *c, void *arg); |
|
|
|
|
typedef int (action_func2)(AVCodecContext *c, void *arg, int jobnr, int threadnr); |
|
|
|
|
typedef int (main_func)(AVCodecContext *c); |
|
|
|
|
|
|
|
|
|
typedef struct SliceThreadContext { |
|
|
|
|
AVSliceThread *thread; |
|
|
|
|
action_func *func; |
|
|
|
|
action_func2 *func2; |
|
|
|
|
main_func *mainfunc; |
|
|
|
|
void *args; |
|
|
|
|
int *rets; |
|
|
|
|
int job_size; |
|
|
|
@ -54,6 +56,12 @@ typedef struct SliceThreadContext { |
|
|
|
|
pthread_mutex_t *progress_mutex; |
|
|
|
|
} SliceThreadContext; |
|
|
|
|
|
|
|
|
|
static void main_function(void *priv) { |
|
|
|
|
AVCodecContext *avctx = priv; |
|
|
|
|
SliceThreadContext *c = avctx->internal->thread_ctx; |
|
|
|
|
c->mainfunc(avctx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void worker_func(void *priv, int jobnr, int threadnr, int nb_jobs, int nb_threads) |
|
|
|
|
{ |
|
|
|
|
AVCodecContext *avctx = priv; |
|
|
|
@ -99,7 +107,7 @@ static int thread_execute(AVCodecContext *avctx, action_func* func, void *arg, i |
|
|
|
|
c->func = func; |
|
|
|
|
c->rets = ret; |
|
|
|
|
|
|
|
|
|
avpriv_slicethread_execute(c->thread, job_count, 0); |
|
|
|
|
avpriv_slicethread_execute(c->thread, job_count, !!c->mainfunc ); |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -110,10 +118,19 @@ static int thread_execute2(AVCodecContext *avctx, action_func2* func2, void *arg |
|
|
|
|
return thread_execute(avctx, NULL, arg, ret, job_count, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_slice_thread_execute_with_mainfunc(AVCodecContext *avctx, action_func2* func2, main_func *mainfunc, void *arg, int *ret, int job_count) |
|
|
|
|
{ |
|
|
|
|
SliceThreadContext *c = avctx->internal->thread_ctx; |
|
|
|
|
c->func2 = func2; |
|
|
|
|
c->mainfunc = mainfunc; |
|
|
|
|
return thread_execute(avctx, NULL, arg, ret, job_count, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
int ff_slice_thread_init(AVCodecContext *avctx) |
|
|
|
|
{ |
|
|
|
|
SliceThreadContext *c; |
|
|
|
|
int thread_count = avctx->thread_count; |
|
|
|
|
static void (*mainfunc)(void *); |
|
|
|
|
|
|
|
|
|
#if HAVE_W32THREADS |
|
|
|
|
w32thread_init(); |
|
|
|
@ -142,7 +159,8 @@ int ff_slice_thread_init(AVCodecContext *avctx) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avctx->internal->thread_ctx = c = av_mallocz(sizeof(*c)); |
|
|
|
|
if (!c || (thread_count = avpriv_slicethread_create(&c->thread, avctx, worker_func, NULL, thread_count)) <= 1) { |
|
|
|
|
mainfunc = avctx->codec->caps_internal & FF_CODEC_CAP_SLICE_THREAD_HAS_MF ? &main_function : NULL; |
|
|
|
|
if (!c || (thread_count = avpriv_slicethread_create(&c->thread, avctx, worker_func, mainfunc, thread_count)) <= 1) { |
|
|
|
|
if (c) |
|
|
|
|
avpriv_slicethread_free(&c->thread); |
|
|
|
|
av_freep(&avctx->internal->thread_ctx); |
|
|
|
|