summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim-Philipp Müller <tim@centricular.net>2013-02-25 10:38:09 +0000
committerTim-Philipp Müller <tim@centricular.net>2013-02-25 10:43:04 +0000
commit879052472841d584e0aad21ac220131b586c1de5 (patch)
tree65fa359b0d7b2b94503f080099ea25c0ef21a3a9
parentbd08b806ffa4a4c2297b55db7c59a2572e79068e (diff)
avviddec: fix H.264 decoding errors by disabling multi-threaded decoding
Multi-threaded decoding does not work properly with the older libav 0.8 version included in this gst-libav series, so just disable multi-threaded decoding again entirely for now. (We could also switch from FF_THREAD_SLICE to FF_THREAD_FRAME, but that may have other side-effects and just disabling it seems safest for now). This works properly in git master with more recent libav 0.9.x versions. Adventurous users may still re-enable this functionality by setting the GST_AVVIDDEC_MAX_THREADS environment variable to 'auto' or the max. number of threads desired. https://bugzilla.gnome.org/show_bug.cgi?id=694230
-rw-r--r--ext/libav/gstavutils.c1
-rw-r--r--ext/libav/gstavviddec.c32
2 files changed, 25 insertions, 8 deletions
diff --git a/ext/libav/gstavutils.c b/ext/libav/gstavutils.c
index 8555d8d15b..f7a80f6c65 100644
--- a/ext/libav/gstavutils.c
+++ b/ext/libav/gstavutils.c
@@ -476,6 +476,7 @@ gst_ffmpeg_auto_max_threads (void)
if (n < 1)
n = 1;
+ GST_INFO ("threads: %d", n);
g_once_init_leave (&n_threads, n);
}
diff --git a/ext/libav/gstavviddec.c b/ext/libav/gstavviddec.c
index 669a75dc94..caf3e2e7fa 100644
--- a/ext/libav/gstavviddec.c
+++ b/ext/libav/gstavviddec.c
@@ -106,7 +106,7 @@ struct _GstFFMpegVidDecClass
#define DEFAULT_SKIPFRAME 0
#define DEFAULT_DIRECT_RENDERING TRUE
#define DEFAULT_DEBUG_MV FALSE
-#define DEFAULT_MAX_THREADS 0
+#define DEFAULT_MAX_THREADS 1
enum
{
@@ -470,14 +470,30 @@ gst_ffmpegviddec_set_format (GstVideoDecoder * decoder,
* supports it) */
ffmpegdec->context->debug_mv = ffmpegdec->debug_mv;
- if (ffmpegdec->max_threads == 0) {
- if (!(oclass->in_plugin->capabilities & CODEC_CAP_AUTO_THREADS))
- ffmpegdec->context->thread_count = gst_ffmpeg_auto_max_threads ();
- else
- ffmpegdec->context->thread_count = 0;
- } else
- ffmpegdec->context->thread_count = ffmpegdec->max_threads;
+ {
+ const gchar *env = g_getenv ("GST_AVVIDDEC_MAX_THREADS");
+ int max_threads = ffmpegdec->max_threads;
+
+ if (env != NULL) {
+ if (g_str_equal (env, "auto"))
+ max_threads = 0;
+ else
+ max_threads = MAX (atoi (env), 0);
+
+ if (max_threads != 1) {
+ GST_WARNING_OBJECT (ffmpegdec, "max threads forced to %d, this might "
+ "lead to decoding errors or artefacts", max_threads);
+ }
+ }
+ if (max_threads == 0) {
+ if (!(oclass->in_plugin->capabilities & CODEC_CAP_AUTO_THREADS))
+ ffmpegdec->context->thread_count = gst_ffmpeg_auto_max_threads ();
+ else
+ ffmpegdec->context->thread_count = 0;
+ } else
+ ffmpegdec->context->thread_count = max_threads;
+ }
ffmpegdec->context->thread_type = FF_THREAD_SLICE;
/* open codec - we don't select an output pix_fmt yet,