From c754b8526b32cffe397308567127313bf993c86d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Tue, 28 Apr 2015 16:06:47 +0100 Subject: 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 --- ext/libde265/libde265-dec.c | 84 ++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 36 deletions(-) (limited to 'ext/libde265') diff --git a/ext/libde265/libde265-dec.c b/ext/libde265/libde265-dec.c index d52e8ce25..a57bd5bf7 100644 --- a/ext/libde265/libde265-dec.c +++ b/ext/libde265/libde265-dec.c @@ -36,17 +36,62 @@ #include "config.h" #endif -#include #include #include + +#include "libde265-dec.h" + +#if !GLIB_CHECK_VERSION(2, 36, 0) +#include #ifdef HAVE_UNISTD_H #include #endif #ifdef G_OS_WIN32 #include #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; - - /* This *never* fails, but doesn't take CPU affinity into account */ - GetSystemInfo (&sysinfo); - threads = (int) sysinfo.dwNumberOfProcessors; + threads = g_get_num_processors (); - /* 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% */ -- cgit v1.2.1