de265dec: use g_get_num_processors() if available
authorTim-Philipp Müller <tim@centricular.com>
Tue, 28 Apr 2015 15:06:47 +0000 (16:06 +0100)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 28 Apr 2015 15:08:31 +0000 (16:08 +0100)
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

index d52e8ce..a57bd5b 100644 (file)
 #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;
-
-    /* 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% */