de265dec: use g_get_num_processors() if available

And provide home-made fallback for older GLib versions,
so that we can later find these and remove them when
we bump the GLib requirement (which is certainly going
to happen before 2.0).

https://bugzilla.gnome.org/show_bug.cgi?id=748495
This commit is contained in:
Tim-Philipp Müller 2015-04-28 16:06:47 +01:00
parent f0a9c246a3
commit c754b8526b

View file

@ -36,17 +36,62 @@
#include "config.h"
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "libde265-dec.h"
#if !GLIB_CHECK_VERSION(2, 36, 0)
#include <stdio.h>
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef G_OS_WIN32
#include <windows.h>
#endif
#define g_get_num_processors gst_g_get_num_processors
static guint
gst_g_get_num_processors (void)
{
guint threads = 0;
#include "libde265-dec.h"
#if defined(_SC_NPROC_ONLN)
threads = sysconf (_SC_NPROC_ONLN);
#elif defined(_SC_NPROCESSORS_ONLN)
threads = sysconf (_SC_NPROCESSORS_ONLN);
#elif defined(G_OS_WIN32)
{
SYSTEM_INFO sysinfo;
DWORD_PTR process_cpus;
DWORD_PTR system_cpus;
/* This *never* fails, but doesn't take CPU affinity into account */
GetSystemInfo (&sysinfo);
threads = (int) sysinfo.dwNumberOfProcessors;
/* This *can* fail, but produces correct results if affinity mask is used,
* unlike the simpler code above.
*/
if (GetProcessAffinityMask (GetCurrentProcess (),
&process_cpus, &system_cpus)) {
unsigned int count;
for (count = 0; process_cpus != 0; process_cpus >>= 1)
if (process_cpus & 1)
count++;
}
}
#else
#warning "Don't know how to get number of CPU cores, will use the default thread count"
threads = DEFAULT_THREAD_COUNT;
#endif
if (threads > 0)
return threads;
return 1;
}
#endif /* !GLIB_CHECK_VERSION(2, 36, 0) */
/* use two decoder threads if no information about
* available CPU cores can be retrieved */
@ -377,41 +422,8 @@ gst_libde265_dec_start (GstVideoDecoder * decoder)
return FALSE;
}
if (threads == 0) {
#if defined(_SC_NPROC_ONLN)
threads = sysconf (_SC_NPROC_ONLN);
#elif defined(_SC_NPROCESSORS_ONLN)
threads = sysconf (_SC_NPROCESSORS_ONLN);
#elif defined(G_OS_WIN32)
/* FIXME 2.0, use g_get_num_processors() */
SYSTEM_INFO sysinfo;
DWORD_PTR process_cpus;
DWORD_PTR system_cpus;
threads = g_get_num_processors ();
/* This *never* fails, but doesn't take CPU affinity into account */
GetSystemInfo (&sysinfo);
threads = (int) sysinfo.dwNumberOfProcessors;
/* This *can* fail, but produces correct results if affinity mask is used,
* unlike the simpler code above.
*/
if (GetProcessAffinityMask (GetCurrentProcess (),
&process_cpus, &system_cpus)) {
unsigned int count;
for (count = 0; process_cpus != 0; process_cpus >>= 1)
if (process_cpus & 1)
count++;
if (count > 0)
threads = (int) count;
}
#else
#warning "Don't know how to get number of CPU cores, will use the default thread count"
threads = DEFAULT_THREAD_COUNT;
#endif
if (threads <= 0) {
threads = DEFAULT_THREAD_COUNT;
}
/* NOTE: We start more threads than cores for now, as some threads
* might get blocked while waiting for dependent data. Having more
* threads increases decoding speed by about 10% */