summaryrefslogtreecommitdiff
path: root/gst/videoconvert
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian@centricular.com>2017-02-20 21:38:17 +0200
committerSebastian Dröge <sebastian@centricular.com>2017-02-23 21:55:29 +0200
commit49ac382b47bfd481621a44155f9533d46a189a26 (patch)
treea34f7b31d8593c2841b0d0358c0fa9fc04377367 /gst/videoconvert
parentd15ad75cafe5b73a6c75d5c27f8582e3e5654a1d (diff)
downloadgstreamer-plugins-base-49ac382b47bfd481621a44155f9533d46a189a26.tar.gz
video-converter: Implement multi-threaded scaling/conversion
This adds a property to select the maximum number of threads to use for conversion and scaling. During processing, each plane is split into an equal number of consecutive lines that are then processed by each thread. During tests, this gave up to 1.8x speedup with 2 threads and up to 3.2x speedup with 4 threads when converting e.g. 1080p to 4k in v210. https://bugzilla.gnome.org/show_bug.cgi?id=778974
Diffstat (limited to 'gst/videoconvert')
-rw-r--r--gst/videoconvert/gstvideoconvert.c19
-rw-r--r--gst/videoconvert/gstvideoconvert.h1
2 files changed, 18 insertions, 2 deletions
diff --git a/gst/videoconvert/gstvideoconvert.c b/gst/videoconvert/gstvideoconvert.c
index b69cd072d..292c6c611 100644
--- a/gst/videoconvert/gstvideoconvert.c
+++ b/gst/videoconvert/gstvideoconvert.c
@@ -67,6 +67,7 @@ G_DEFINE_TYPE (GstVideoConvert, gst_video_convert, GST_TYPE_VIDEO_FILTER);
#define DEFAULT_PROP_MATRIX_MODE GST_VIDEO_MATRIX_MODE_FULL
#define DEFAULT_PROP_GAMMA_MODE GST_VIDEO_GAMMA_MODE_NONE
#define DEFAULT_PROP_PRIMARIES_MODE GST_VIDEO_PRIMARIES_MODE_NONE
+#define DEFAULT_PROP_N_THREADS 1
enum
{
@@ -79,7 +80,8 @@ enum
PROP_CHROMA_MODE,
PROP_MATRIX_MODE,
PROP_GAMMA_MODE,
- PROP_PRIMARIES_MODE
+ PROP_PRIMARIES_MODE,
+ PROP_N_THREADS
};
#define CSP_VIDEO_CAPS GST_VIDEO_CAPS_MAKE (GST_VIDEO_FORMATS_ALL) ";" \
@@ -464,7 +466,9 @@ gst_video_convert_set_info (GstVideoFilter * filter,
GST_VIDEO_CONVERTER_OPT_GAMMA_MODE,
GST_TYPE_VIDEO_GAMMA_MODE, space->gamma_mode,
GST_VIDEO_CONVERTER_OPT_PRIMARIES_MODE,
- GST_TYPE_VIDEO_PRIMARIES_MODE, space->primaries_mode, NULL));
+ GST_TYPE_VIDEO_PRIMARIES_MODE, space->primaries_mode,
+ GST_VIDEO_CONVERTER_OPT_THREADS, G_TYPE_UINT,
+ space->n_threads, NULL));
if (space->convert == NULL)
goto no_convert;
@@ -576,6 +580,10 @@ gst_video_convert_class_init (GstVideoConvertClass * klass)
"Primaries Conversion Mode", gst_video_primaries_mode_get_type (),
DEFAULT_PROP_PRIMARIES_MODE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_N_THREADS,
+ g_param_spec_uint ("n-threads", "Threads",
+ "Maximum number of threads to use", 0, G_MAXUINT,
+ DEFAULT_PROP_N_THREADS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
}
static void
@@ -590,6 +598,7 @@ gst_video_convert_init (GstVideoConvert * space)
space->matrix_mode = DEFAULT_PROP_MATRIX_MODE;
space->gamma_mode = DEFAULT_PROP_GAMMA_MODE;
space->primaries_mode = DEFAULT_PROP_PRIMARIES_MODE;
+ space->n_threads = DEFAULT_PROP_N_THREADS;
}
void
@@ -628,6 +637,9 @@ gst_video_convert_set_property (GObject * object, guint property_id,
case PROP_DITHER_QUANTIZATION:
csp->dither_quantization = g_value_get_uint (value);
break;
+ case PROP_N_THREADS:
+ csp->n_threads = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -670,6 +682,9 @@ gst_video_convert_get_property (GObject * object, guint property_id,
case PROP_DITHER_QUANTIZATION:
g_value_set_uint (value, csp->dither_quantization);
break;
+ case PROP_N_THREADS:
+ g_value_set_uint (value, csp->n_threads);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
diff --git a/gst/videoconvert/gstvideoconvert.h b/gst/videoconvert/gstvideoconvert.h
index 78678dfaf..a8a586387 100644
--- a/gst/videoconvert/gstvideoconvert.h
+++ b/gst/videoconvert/gstvideoconvert.h
@@ -56,6 +56,7 @@ struct _GstVideoConvert {
GstVideoGammaMode gamma_mode;
GstVideoPrimariesMode primaries_mode;
gdouble alpha_value;
+ gint n_threads;
};
struct _GstVideoConvertClass