mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-23 16:50:47 +00:00
vaapisink: add support for "display-name" property.
Add a "display-name" property to vaapisink so that the end user could select the desired output. Keep "display-name" in-line with the existing "display" (GstVaapiDisplayXXX type). So, for X11 or GLX, the "display-name" is the usual display name as we know for XOpenDisplay(); for Wayland, the "display-name" is the name used for wl_display_connect(); and for DRM, the "display-name" is actually the DRI device name. https://bugzilla.gnome.org/show_bug.cgi?id=722247
This commit is contained in:
parent
b8040b35c1
commit
5ffa82b64c
4 changed files with 69 additions and 11 deletions
|
@ -54,6 +54,25 @@ implements_interface_init (GstImplementsInterfaceClass * iface)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* GstVideoContext interface */
|
/* GstVideoContext interface */
|
||||||
|
static void
|
||||||
|
plugin_set_display (GstVaapiPluginBase * plugin, GstVaapiDisplay * display)
|
||||||
|
{
|
||||||
|
const gchar *const display_name =
|
||||||
|
gst_vaapi_display_get_display_name (display);
|
||||||
|
|
||||||
|
if (plugin->display_name && g_strcmp0 (plugin->display_name, display_name)) {
|
||||||
|
GST_DEBUG_OBJECT (plugin, "incompatible display name '%s', requested '%s'",
|
||||||
|
display_name, plugin->display_name);
|
||||||
|
gst_vaapi_display_replace (&plugin->display, NULL);
|
||||||
|
} else {
|
||||||
|
GST_INFO_OBJECT (plugin, "set display %p", display);
|
||||||
|
gst_vaapi_display_replace (&plugin->display, display);
|
||||||
|
plugin->display_type = gst_vaapi_display_get_display_type (display);
|
||||||
|
gst_vaapi_plugin_base_set_display_name (plugin, display_name);
|
||||||
|
}
|
||||||
|
gst_vaapi_display_unref (display);
|
||||||
|
}
|
||||||
|
|
||||||
#if GST_CHECK_VERSION(1,1,0)
|
#if GST_CHECK_VERSION(1,1,0)
|
||||||
static void
|
static void
|
||||||
plugin_set_context (GstElement * element, GstContext * context)
|
plugin_set_context (GstElement * element, GstContext * context)
|
||||||
|
@ -61,12 +80,8 @@ plugin_set_context (GstElement * element, GstContext * context)
|
||||||
GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element);
|
GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element);
|
||||||
GstVaapiDisplay *display = NULL;
|
GstVaapiDisplay *display = NULL;
|
||||||
|
|
||||||
if (gst_vaapi_video_context_get_display (context, &display)) {
|
if (gst_vaapi_video_context_get_display (context, &display))
|
||||||
GST_INFO_OBJECT (element, "set display %p", display);
|
plugin_set_display (plugin, display);
|
||||||
gst_vaapi_display_replace (&plugin->display, display);
|
|
||||||
gst_vaapi_display_unref (display);
|
|
||||||
plugin->display_type = gst_vaapi_display_get_display_type (display);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static void
|
static void
|
||||||
|
@ -74,9 +89,10 @@ plugin_set_context (GstVideoContext * context, const gchar * type,
|
||||||
const GValue * value)
|
const GValue * value)
|
||||||
{
|
{
|
||||||
GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (context);
|
GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (context);
|
||||||
|
GstVaapiDisplay *display = NULL;
|
||||||
|
|
||||||
gst_vaapi_set_display (type, value, &plugin->display);
|
gst_vaapi_set_display (type, value, &display);
|
||||||
plugin->display_type = gst_vaapi_display_get_display_type (plugin->display);
|
plugin_set_display (plugin, display);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -212,6 +228,22 @@ gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
|
||||||
plugin->display_type_req = display_type;
|
plugin->display_type_req = display_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_plugin_base_set_display_name:
|
||||||
|
* @plugin: a #GstVaapiPluginBase
|
||||||
|
* @display_name: the new display name to match
|
||||||
|
*
|
||||||
|
* Sets the name of the display to look for. The change is effective
|
||||||
|
* at the next call to gst_vaapi_plugin_base_ensure_display().
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gst_vaapi_plugin_base_set_display_name (GstVaapiPluginBase * plugin,
|
||||||
|
const gchar * display_name)
|
||||||
|
{
|
||||||
|
g_free (plugin->display_name);
|
||||||
|
plugin->display_name = g_strdup (display_name);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_vaapi_plugin_base_ensure_display:
|
* gst_vaapi_plugin_base_ensure_display:
|
||||||
* @plugin: a #GstVaapiPluginBase
|
* @plugin: a #GstVaapiPluginBase
|
||||||
|
|
|
@ -93,6 +93,8 @@ typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
|
||||||
(GST_VAAPI_PLUGIN_BASE(plugin)->display)
|
(GST_VAAPI_PLUGIN_BASE(plugin)->display)
|
||||||
#define GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(plugin) \
|
#define GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(plugin) \
|
||||||
(GST_VAAPI_PLUGIN_BASE(plugin)->display_type)
|
(GST_VAAPI_PLUGIN_BASE(plugin)->display_type)
|
||||||
|
#define GST_VAAPI_PLUGIN_BASE_DISPLAY_NAME(plugin) \
|
||||||
|
(GST_VAAPI_PLUGIN_BASE(plugin)->display_name)
|
||||||
#define GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(plugin, new_display) \
|
#define GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(plugin, new_display) \
|
||||||
(gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
|
(gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
|
||||||
(new_display)))
|
(new_display)))
|
||||||
|
@ -137,6 +139,7 @@ struct _GstVaapiPluginBase
|
||||||
GstVaapiDisplay *display;
|
GstVaapiDisplay *display;
|
||||||
GstVaapiDisplayType display_type;
|
GstVaapiDisplayType display_type;
|
||||||
GstVaapiDisplayType display_type_req;
|
GstVaapiDisplayType display_type_req;
|
||||||
|
gchar *display_name;
|
||||||
|
|
||||||
GstVaapiUploader *uploader;
|
GstVaapiUploader *uploader;
|
||||||
gboolean uploader_used;
|
gboolean uploader_used;
|
||||||
|
@ -188,6 +191,11 @@ void
|
||||||
gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
|
gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
|
||||||
GstVaapiDisplayType display_type);
|
GstVaapiDisplayType display_type);
|
||||||
|
|
||||||
|
G_GNUC_INTERNAL
|
||||||
|
void
|
||||||
|
gst_vaapi_plugin_base_set_display_name (GstVaapiPluginBase * plugin,
|
||||||
|
const gchar * display_name);
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
gboolean
|
gboolean
|
||||||
gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin);
|
gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin);
|
||||||
|
|
|
@ -90,7 +90,8 @@ static const DisplayMap g_display_map[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstVaapiDisplay *
|
static GstVaapiDisplay *
|
||||||
gst_vaapi_create_display (GstVaapiDisplayType display_type)
|
gst_vaapi_create_display (GstVaapiDisplayType display_type,
|
||||||
|
const gchar * display_name)
|
||||||
{
|
{
|
||||||
GstVaapiDisplay *display = NULL;
|
GstVaapiDisplay *display = NULL;
|
||||||
const DisplayMap *m;
|
const DisplayMap *m;
|
||||||
|
@ -99,7 +100,7 @@ gst_vaapi_create_display (GstVaapiDisplayType display_type)
|
||||||
if (display_type != GST_VAAPI_DISPLAY_TYPE_ANY && display_type != m->type)
|
if (display_type != GST_VAAPI_DISPLAY_TYPE_ANY && display_type != m->type)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
display = m->create_display (NULL);
|
display = m->create_display (display_name);
|
||||||
if (display || display_type != GST_VAAPI_DISPLAY_TYPE_ANY)
|
if (display || display_type != GST_VAAPI_DISPLAY_TYPE_ANY)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -126,7 +127,7 @@ gst_vaapi_ensure_display (gpointer element, GstVaapiDisplayType type)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
/* If no neighboor, or application not interested, use system default */
|
/* If no neighboor, or application not interested, use system default */
|
||||||
display = gst_vaapi_create_display (type);
|
display = gst_vaapi_create_display (type, plugin->display_name);
|
||||||
if (!display)
|
if (!display)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
|
@ -128,6 +128,7 @@ enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
|
||||||
PROP_DISPLAY_TYPE,
|
PROP_DISPLAY_TYPE,
|
||||||
|
PROP_DISPLAY_NAME,
|
||||||
PROP_FULLSCREEN,
|
PROP_FULLSCREEN,
|
||||||
PROP_SYNCHRONOUS,
|
PROP_SYNCHRONOUS,
|
||||||
PROP_USE_GLX,
|
PROP_USE_GLX,
|
||||||
|
@ -1148,6 +1149,10 @@ gst_vaapisink_set_property(
|
||||||
gst_vaapi_plugin_base_set_display_type(GST_VAAPI_PLUGIN_BASE(sink),
|
gst_vaapi_plugin_base_set_display_type(GST_VAAPI_PLUGIN_BASE(sink),
|
||||||
g_value_get_enum(value));
|
g_value_get_enum(value));
|
||||||
break;
|
break;
|
||||||
|
case PROP_DISPLAY_NAME:
|
||||||
|
gst_vaapi_plugin_base_set_display_name(GST_VAAPI_PLUGIN_BASE(sink),
|
||||||
|
g_value_get_string(value));
|
||||||
|
break;
|
||||||
case PROP_FULLSCREEN:
|
case PROP_FULLSCREEN:
|
||||||
sink->fullscreen = g_value_get_boolean(value);
|
sink->fullscreen = g_value_get_boolean(value);
|
||||||
break;
|
break;
|
||||||
|
@ -1186,6 +1191,9 @@ gst_vaapisink_get_property(
|
||||||
case PROP_DISPLAY_TYPE:
|
case PROP_DISPLAY_TYPE:
|
||||||
g_value_set_enum(value, GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink));
|
g_value_set_enum(value, GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(sink));
|
||||||
break;
|
break;
|
||||||
|
case PROP_DISPLAY_NAME:
|
||||||
|
g_value_set_string(value, GST_VAAPI_PLUGIN_BASE_DISPLAY_NAME(sink));
|
||||||
|
break;
|
||||||
case PROP_FULLSCREEN:
|
case PROP_FULLSCREEN:
|
||||||
g_value_set_boolean(value, sink->fullscreen);
|
g_value_set_boolean(value, sink->fullscreen);
|
||||||
break;
|
break;
|
||||||
|
@ -1277,6 +1285,15 @@ gst_vaapisink_class_init(GstVaapiSinkClass *klass)
|
||||||
GST_VAAPI_DISPLAY_TYPE_ANY,
|
GST_VAAPI_DISPLAY_TYPE_ANY,
|
||||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class,
|
||||||
|
PROP_DISPLAY_NAME,
|
||||||
|
g_param_spec_string("display-name",
|
||||||
|
"display name",
|
||||||
|
"display name to use",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
#if USE_GLX
|
#if USE_GLX
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class,
|
(object_class,
|
||||||
|
|
Loading…
Reference in a new issue