summaryrefslogtreecommitdiff
path: root/server/gstreamer-encoder.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/gstreamer-encoder.c')
-rw-r--r--server/gstreamer-encoder.c41
1 files changed, 40 insertions, 1 deletions
diff --git a/server/gstreamer-encoder.c b/server/gstreamer-encoder.c
index d08de35a..40882f69 100644
--- a/server/gstreamer-encoder.c
+++ b/server/gstreamer-encoder.c
@@ -861,13 +861,50 @@ static const gchar* get_gst_codec_name(const SpiceGstEncoder *encoder)
}
}
+/* At this time, only the following formats are supported by x264enc. */
+static const char valid_formats[][10] = {
+ { "Y444" },
+ { "Y42B" },
+ { "I420" },
+ { "YV12" },
+ { "NV12" },
+ { "GRAY8" },
+ { "Y444_10LE" },
+ { "I422_10LE" },
+ { "I420_10LE" },
+};
+
+static gpointer get_pref_format_once(gpointer data)
+{
+ const gchar *pref_format = getenv("SPICE_CONVERTER_PREFERRED_FORMAT");
+ int i;
+
+ if (pref_format) {
+ for (i = 0; i < G_N_ELEMENTS(valid_formats); i++) {
+ if (strcmp(valid_formats[i], pref_format) == 0) {
+ return g_strdup_printf("videoconvert ! video/x-raw,format=%s",
+ pref_format);
+ }
+ }
+ }
+ return g_strdup("videoconvert");
+}
+
+static gchar *get_gst_converter(void)
+{
+ static GOnce gst_once = G_ONCE_INIT;
+
+ g_once(&gst_once, get_pref_format_once, NULL);
+ return g_strdup(gst_once.retval);
+}
+
static gboolean create_pipeline(SpiceGstEncoder *encoder)
{
- const gchar *converter = "videoconvert";
const gchar* gstenc_name = get_gst_codec_name(encoder);
if (!gstenc_name) {
return FALSE;
}
+ gchar* converter = get_gst_converter();
gchar* gstenc_opts;
switch (encoder->base.codec_type)
{
@@ -910,6 +947,7 @@ static gboolean create_pipeline(SpiceGstEncoder *encoder)
default:
/* gstreamer_encoder_new() should have rejected this codec type */
spice_warning("unsupported codec type %d", encoder->base.codec_type);
+ g_free(converter);
return FALSE;
}
@@ -919,6 +957,7 @@ static gboolean create_pipeline(SpiceGstEncoder *encoder)
converter, gstenc_name, gstenc_opts);
spice_debug("GStreamer pipeline: %s", desc);
encoder->pipeline = gst_parse_launch_full(desc, NULL, GST_PARSE_FLAG_FATAL_ERRORS, &err);
+ g_free(converter);
g_free(gstenc_opts);
g_free(desc);
if (!encoder->pipeline || err) {