34 #if HAVE_SCHED_GETAFFINITY
40 #if HAVE_GETPROCESSAFFINITYMASK
45 #include <sys/param.h>
47 #include <sys/types.h>
48 #include <sys/param.h>
49 #include <sys/sysctl.h>
167 #define MAX_AUTO_THREADS 16
171 int ret, nb_cpus = 1;
172 #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
177 ret = sched_getaffinity(0,
sizeof(cpuset), &cpuset);
179 nb_cpus = CPU_COUNT(&cpuset);
181 #elif HAVE_GETPROCESSAFFINITYMASK
183 ret = GetProcessAffinityMask(GetCurrentProcess(), &proc_aff, &sys_aff);
185 nb_cpus = av_popcount64(proc_aff);
186 #elif HAVE_SYSCTL && defined(HW_NCPU)
187 int mib[2] = { CTL_HW, HW_NCPU };
188 size_t len =
sizeof(nb_cpus);
190 ret = sysctl(mib, 2, &nb_cpus, &len,
NULL, 0);
193 #elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
194 nb_cpus = sysconf(_SC_NPROC_ONLN);
195 #elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
196 nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
212 int last_execute = 0;
236 c->
func2(avctx, c->
args, our_job, self_id);
292 c->
rets = &dummy_ret;
325 if (thread_count <= 1) {
349 for (i=0; i<thread_count; i++) {
365 #define THREAD_SAFE_CALLBACKS(avctx) \
366 ((avctx)->thread_safe_callbacks || (!(avctx)->get_buffer && (avctx)->get_buffer2 == avcodec_default_get_buffer2))
384 while (p->
state == STATE_INPUT_READY && !fctx->
die)
387 if (fctx->
die)
break;
404 for (i = 0; i < MAX_BUFFERS; i++)
406 p->progress[i][0] = INT_MAX;
407 p->progress[i][1] = INT_MAX;
410 p->
state = STATE_INPUT_READY;
484 #define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
489 #if FF_API_GET_BUFFER
490 dst->get_buffer = src->get_buffer;
491 dst->release_buffer = src->release_buffer;
559 if (prev_thread->
state == STATE_SETTING_UP) {
561 while (prev_thread->
state == STATE_SETTING_UP)
584 p->
state = STATE_SETTING_UP;
597 p->
avctx->get_buffer ||
600 while (p->
state != STATE_SETUP_FINISHED && p->
state != STATE_INPUT_READY) {
603 while (p->
state == STATE_SETTING_UP)
607 case STATE_GET_BUFFER:
610 case STATE_GET_FORMAT:
618 p->
state = STATE_SETTING_UP;
632 AVFrame *picture,
int *got_picture_ptr,
671 p = &fctx->
threads[finished++];
673 if (p->
state != STATE_INPUT_READY) {
675 while (p->
state != STATE_INPUT_READY)
710 if (!progress || progress[field] >= n)
return;
728 if (!progress || progress[field] >= n)
return;
736 while (progress[field] < n)
746 if(p->
state == STATE_SETUP_FINISHED){
751 p->
state = STATE_SETUP_FINISHED;
761 for (i = 0; i < thread_count; i++) {
764 if (p->
state != STATE_INPUT_READY) {
766 while (p->
state != STATE_INPUT_READY)
791 for (i = 0; i < thread_count; i++) {
811 for (i = 0; i < thread_count; i++) {
856 if (thread_count <= 1) {
867 for (i = 0; i < thread_count; i++) {
893 err = codec->
init(copy);
981 if (p->
state != STATE_SETTING_UP &&
983 av_log(avctx,
AV_LOG_ERROR,
"get_buffer() cannot be called after ff_thread_finish_setup()\n");
995 progress[0] = progress[1] = -1;
1002 !avctx->get_buffer &&
1010 p->
state = STATE_GET_BUFFER;
1013 while (p->
state != STATE_SETTING_UP)
1039 if (p->
state != STATE_SETTING_UP) {
1040 av_log(avctx,
AV_LOG_ERROR,
"get_format() cannot be called after ff_thread_finish_setup()\n");
1045 p->
state = STATE_GET_FORMAT;
1048 while (p->
state != STATE_SETTING_UP)
1075 !avctx->get_buffer &&
1088 if (can_direct_free) {
1143 "Application has requested %d threads. Using a thread count greater than %d is not recommended.\n",