From 2bc23997973f353e037b44a1bfde38685a6ff0bd Mon Sep 17 00:00:00 2001 From: Uoti Urpala Date: Mon, 20 Dec 2010 05:53:28 +0200 Subject: vd_ffmpeg: set thread count to number of cores on machine by default Make "-lavdopts threads=0" mean an autodetected number of threads, and make that the default value of the option. Also increase the upper limit of the option from 8 to 16. Add new file osdep/numcores.c which tries to determine the number of cores available on the machine. numcores.c is based (heavily modified) on public domain numcpus.c by Philip Willoughby , downloaded from http://csgsoft.doc.ic.ac.uk/numcpus/ --- DOCS/man/en/mplayer.1 | 8 ++++-- Makefile | 1 + defaultopts.c | 1 - libmpcodecs/vd_ffmpeg.c | 15 ++++++++++- osdep/numcores.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ osdep/numcores.h | 1 + 6 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 osdep/numcores.c create mode 100644 osdep/numcores.h diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1 index ed23d1f1d2..be9d8cf3e1 100644 --- a/DOCS/man/en/mplayer.1 +++ b/DOCS/man/en/mplayer.1 @@ -4909,8 +4909,12 @@ This degrades quality a lot of in almost all cases Skips decoding of frames completely. Big speedup, but jerky motion and sometimes bad artifacts (see skiploopfilter for available skip values). -.IPs "threads=<1\-8> (MPEG-1/2 and H.264 only)" -number of threads to use for decoding (default: 1) +.IPs "threads=<0\-16>" +Number of threads to use for decoding. +Whether threading is actually supported depends on codec. +0 means autodetect number of cores on the machine and use that, up to the +maximum of 16. +(default: 0) .IPs vismv= Visualize motion vectors. .RSss diff --git a/Makefile b/Makefile index 7a6a4b0ff0..da2033392b 100644 --- a/Makefile +++ b/Makefile @@ -505,6 +505,7 @@ SRCS_COMMON = asxparser.c \ libvo/osd.c \ libvo/sub.c \ osdep/findfiles.c \ + osdep/numcores.c \ osdep/$(GETCH) \ osdep/$(TIMER) \ stream/open.c \ diff --git a/defaultopts.c b/defaultopts.c index aabe0effe1..abdd5e16f3 100644 --- a/defaultopts.c +++ b/defaultopts.c @@ -50,7 +50,6 @@ void set_default_mplayer_options(struct MPOpts *opts) .workaround_bugs = 1, // autodetect .error_resilience = 2, .error_concealment = 3, - .threads = 1, }, .input = { .config_file = "input.conf", diff --git a/libmpcodecs/vd_ffmpeg.c b/libmpcodecs/vd_ffmpeg.c index d493143a34..6cb296729c 100644 --- a/libmpcodecs/vd_ffmpeg.c +++ b/libmpcodecs/vd_ffmpeg.c @@ -37,6 +37,7 @@ #include "img_format.h" #include "libmpdemux/stheader.h" #include "codec-cfg.h" +#include "osdep/numcores.h" #include "vd_ffmpeg.h" static const vd_info_t info = { @@ -105,7 +106,7 @@ const m_option_t lavc_decode_opts_conf[]={ OPT_STRING("skiploopfilter", lavc_param.skip_loop_filter_str, 0), OPT_STRING("skipidct", lavc_param.skip_idct_str, 0), OPT_STRING("skipframe", lavc_param.skip_frame_str, 0), - OPT_INTRANGE("threads", lavc_param.threads, 0, 1, 8), + OPT_INTRANGE("threads", lavc_param.threads, 0, 0, 16), OPT_FLAG_CONSTANTS("bitexact", lavc_param.bitexact, 0, 0, CODEC_FLAG_BITEXACT), OPT_STRING("o", lavc_param.avopt, 0), {NULL, NULL, 0, 0, 0, 0, NULL} @@ -222,11 +223,23 @@ static int init(sh_video_t *sh){ avctx->slice_flags = SLICE_FLAG_CODED_ORDER|SLICE_FLAG_ALLOW_FIELD; } + if (lavc_param->threads == 0) { + int threads = default_thread_count(); + if (threads < 1) { + mp_msg(MSGT_DECVIDEO, MSGL_WARN, "[VD_FFMPEG] Could not determine " + "thread count to use, defaulting to 1.\n"); + threads = 1; + } + threads = FFMIN(threads, 16); + lavc_param->threads = threads; + } /* Our get_buffer and draw_horiz_band callbacks are not safe to call * from other threads. */ if (lavc_param->threads > 1) { ctx->do_dr1 = false; ctx->do_slices = false; + mp_tmsg(MSGT_DECVIDEO, MSGL_INFO, "Asking decoder to use " + "%d threads if supported.\n", lavc_param->threads); } if(ctx->do_dr1){ diff --git a/osdep/numcores.c b/osdep/numcores.c new file mode 100644 index 0000000000..86a327e041 --- /dev/null +++ b/osdep/numcores.c @@ -0,0 +1,66 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include +#include +#include +#include +#include + +#include "numcores.h" + +#ifdef _SC_NPROCESSORS_ONLN +#define SCNAME _SC_NPROCESSORS_ONLN +#elif defined _SC_NPROC_ONLN +#define SCNAME _SC_NPROC_ONLN +#elif defined _SC_CRAY_NCPU +#define SCNAME _SC_CRAY_NCPU +#endif + +#ifdef _WIN32 + +#define WIN32_LEAN_AND_MEAN +#include +int default_thread_count(void) +{ + SYSTEM_INFO info; + GetSystemInfo(&info); + int count = info.dwNumberOfProcessors; + if (count > 0) + return count; + return -1; +} + +#elif defined SCNAME + +int default_thread_count(void) +{ + long nprocs = sysconf(SCNAME); + if (nprocs < 1) + return -1; + return nprocs; +} + +#else + +int default_thread_count(void) +{ + return -2; +} + +#endif diff --git a/osdep/numcores.h b/osdep/numcores.h new file mode 100644 index 0000000000..b999d9e275 --- /dev/null +++ b/osdep/numcores.h @@ -0,0 +1 @@ +int default_thread_count(void); -- cgit v1.2.3