34 #if HAVE_SCHED_GETAFFINITY
38 #if HAVE_GETPROCESSAFFINITYMASK
43 #include <sys/param.h>
45 #include <sys/types.h>
46 #include <sys/sysctl.h>
84 #define MAX_BUFFERS (32+1)
159 #define MAX_AUTO_THREADS 16
163 int ret, nb_cpus = 1;
164 #if HAVE_SCHED_GETAFFINITY && defined(CPU_COUNT)
169 ret = sched_getaffinity(0,
sizeof(cpuset), &cpuset);
171 nb_cpus = CPU_COUNT(&cpuset);
173 #elif HAVE_GETPROCESSAFFINITYMASK
174 DWORD_PTR proc_aff, sys_aff;
175 ret = GetProcessAffinityMask(GetCurrentProcess(), &proc_aff, &sys_aff);
177 nb_cpus = av_popcount64(proc_aff);
178 #elif HAVE_SYSCTL && defined(HW_NCPU)
179 int mib[2] = { CTL_HW, HW_NCPU };
180 size_t len =
sizeof(nb_cpus);
182 ret = sysctl(mib, 2, &nb_cpus, &len,
NULL, 0);
185 #elif HAVE_SYSCONF && defined(_SC_NPROC_ONLN)
186 nb_cpus = sysconf(_SC_NPROC_ONLN);
187 #elif HAVE_SYSCONF && defined(_SC_NPROCESSORS_ONLN)
188 nb_cpus = sysconf(_SC_NPROCESSORS_ONLN);
221 c->
func2(avctx, c->
args, our_job, self_id);
276 c->
rets = &dummy_ret;
308 if (thread_count <= 1) {
332 for (i=0; i<thread_count; i++) {
363 if (p->
state == STATE_INPUT_READY && !fctx->
die) {
365 while (p->
state == STATE_INPUT_READY && !fctx->
die)
370 if (fctx->
die)
break;
386 p->
state = STATE_INPUT_READY;
457 #define copy_fields(s, e) memcpy(&dst->s, &src->s, (char*)&dst->e - (char*)&dst->s);
535 if (prev_thread->
state == STATE_SETTING_UP) {
537 while (prev_thread->
state == STATE_SETTING_UP)
552 memcpy(buf, avpkt->
data, avpkt->
size);
555 p->
state = STATE_SETTING_UP;
567 while (p->
state != STATE_SETUP_FINISHED && p->
state != STATE_INPUT_READY) {
569 while (p->
state == STATE_SETTING_UP)
572 if (p->
state == STATE_GET_BUFFER) {
574 p->
state = STATE_SETTING_UP;
626 p = &fctx->
threads[finished++];
628 if (p->
state != STATE_INPUT_READY) {
630 while (p->
state != STATE_INPUT_READY)
665 if (!progress || progress[field] >= n)
return;
683 if (!progress || progress[field] >= n)
return;
691 while (progress[field] < n)
702 p->
state = STATE_SETUP_FINISHED;
712 for (i = 0; i < thread_count; i++) {
715 if (p->
state != STATE_INPUT_READY) {
717 while (p->
state != STATE_INPUT_READY)
737 for (i = 0; i < thread_count; i++) {
755 for (i = 0; i < thread_count; i++) {
798 if (thread_count <= 1) {
809 for (i = 0; i < thread_count; i++) {
835 err = codec->
init(copy);
905 if (i == MAX_BUFFERS) {
927 if (p->
state != STATE_SETTING_UP &&
929 av_log(avctx,
AV_LOG_ERROR,
"get_buffer() cannot be called after ff_thread_finish_setup()\n");
949 p->
state = STATE_GET_BUFFER;
953 while (p->
state != STATE_SETTING_UP)
995 memset(f->
data, 0,
sizeof(f->
data));
1027 "Application has requested %d threads. Using a thread count greater than %d is not recommended.\n",