34 #if HAVE_SCHED_GETAFFINITY
38 #if HAVE_GETPROCESSAFFINITYMASK
43 #include <sys/param.h>
45 #include <sys/types.h>
46 #include <sys/sysctl.h>
85 #define MAX_BUFFERS (32+1)
160 #define MAX_AUTO_THREADS 16
164 int ret, nb_cpus = 1;
165 #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
170 ret = sched_getaffinity(0,
sizeof(cpuset), &cpuset);
172 nb_cpus = CPU_COUNT(&cpuset);
174 #elif HAVE_GETPROCESSAFFINITYMASK
175 DWORD_PTR proc_aff, sys_aff;
176 ret = GetProcessAffinityMask(GetCurrentProcess(), &proc_aff, &sys_aff);
178 nb_cpus = av_popcount64(proc_aff);
179 #elif HAVE_SYSCTL && defined(HW_NCPU)
180 int mib[2] = { CTL_HW, HW_NCPU };
181 size_t len =
sizeof(nb_cpus);
183 ret = sysctl(mib, 2, &nb_cpus, &len,
NULL, 0);
186 #elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
187 nb_cpus = sysconf(_SC_NPROC_ONLN);
188 #elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
189 nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
200 unsigned last_execute = 0;
225 c->
func2(avctx, c->
args, our_job, self_id);
281 c->
rets = &dummy_ret;
314 if (thread_count <= 1) {
338 for (i=0; i<thread_count; i++) {
369 if (p->
state == STATE_INPUT_READY && !fctx->
die) {
371 while (p->
state == STATE_INPUT_READY && !fctx->
die)
376 if (fctx->
die)
break;
392 p->
state = STATE_INPUT_READY;
463 #define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
541 if (prev_thread->
state == STATE_SETTING_UP) {
543 while (prev_thread->
state == STATE_SETTING_UP)
558 memcpy(buf, avpkt->
data, avpkt->
size);
561 p->
state = STATE_SETTING_UP;
573 while (p->
state != STATE_SETUP_FINISHED && p->
state != STATE_INPUT_READY) {
575 while (p->
state == STATE_SETTING_UP)
578 if (p->
state == STATE_GET_BUFFER) {
580 p->
state = STATE_SETTING_UP;
632 p = &fctx->
threads[finished++];
634 if (p->
state != STATE_INPUT_READY) {
636 while (p->
state != STATE_INPUT_READY)
671 if (!progress || progress[field] >= n)
return;
689 if (!progress || progress[field] >= n)
return;
697 while (progress[field] < n)
708 p->
state = STATE_SETUP_FINISHED;
718 for (i = 0; i < thread_count; i++) {
721 if (p->
state != STATE_INPUT_READY) {
723 while (p->
state != STATE_INPUT_READY)
743 for (i = 0; i < thread_count; i++) {
761 for (i = 0; i < thread_count; i++) {
804 if (thread_count <= 1) {
815 for (i = 0; i < thread_count; i++) {
841 err = codec->
init(copy);
911 if (i == MAX_BUFFERS) {
933 if (p->
state != STATE_SETTING_UP &&
935 av_log(avctx,
AV_LOG_ERROR,
"get_buffer() cannot be called after ff_thread_finish_setup()\n");
955 p->
state = STATE_GET_BUFFER;
959 while (p->
state != STATE_SETTING_UP)
1001 memset(f->
data, 0,
sizeof(f->
data));
1033 "Application has requested %d threads. Using a thread count greater than %d is not recommended.\n",