mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-22 10:23:47 +00:00
plugins: check type of display obtained from neighbours.
Fix display creation code to check that any display obtained from a neighbour actually has the type we expect. Note: if display type is set to "any", we can then accept any VA display type.
This commit is contained in:
parent
6f2dfb71e6
commit
fad3f538bc
4 changed files with 36 additions and 10 deletions
|
@ -176,6 +176,34 @@ gst_vaapi_display_type_get_type(void)
|
||||||
return g_type;
|
return g_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* gst_vaapi_display_type_is_compatible:
|
||||||
|
* @type1: the #GstVaapiDisplayType to test
|
||||||
|
* @type2: the reference #GstVaapiDisplayType
|
||||||
|
*
|
||||||
|
* Compares whether #GstVaapiDisplay @type1 is compatible with @type2.
|
||||||
|
* That is, if @type2 is in "any" category, or derived from @type1.
|
||||||
|
*
|
||||||
|
* Returns: %TRUE if @type1 is compatible with @type2, %FALSE otherwise.
|
||||||
|
*/
|
||||||
|
gboolean
|
||||||
|
gst_vaapi_display_type_is_compatible(GstVaapiDisplayType type1,
|
||||||
|
GstVaapiDisplayType type2)
|
||||||
|
{
|
||||||
|
if (type1 == type2)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
switch (type1) {
|
||||||
|
case GST_VAAPI_DISPLAY_TYPE_GLX:
|
||||||
|
if (type2 == GST_VAAPI_DISPLAY_TYPE_X11)
|
||||||
|
return TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return type2 == GST_VAAPI_DISPLAY_TYPE_ANY;
|
||||||
|
}
|
||||||
|
|
||||||
/* Append GstVideoFormat to formats array */
|
/* Append GstVideoFormat to formats array */
|
||||||
static inline void
|
static inline void
|
||||||
append_format(GArray *formats, GstVideoFormat format, guint flags)
|
append_format(GArray *formats, GstVideoFormat format, guint flags)
|
||||||
|
|
|
@ -61,6 +61,10 @@ typedef enum {
|
||||||
GType
|
GType
|
||||||
gst_vaapi_display_type_get_type(void) G_GNUC_CONST;
|
gst_vaapi_display_type_get_type(void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
gst_vaapi_display_type_is_compatible(GstVaapiDisplayType type1,
|
||||||
|
GstVaapiDisplayType type2);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GstVaapiDisplayInfo:
|
* GstVaapiDisplayInfo:
|
||||||
*
|
*
|
||||||
|
|
|
@ -101,14 +101,6 @@ gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
|
||||||
plugin->display_type_req = display_type;
|
plugin->display_type_req = display_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Checks wether display type 1 is compatible with display type 2 */
|
|
||||||
static gboolean
|
|
||||||
display_type_is_compatible (GstVaapiDisplayType type1,
|
|
||||||
GstVaapiDisplayType type2)
|
|
||||||
{
|
|
||||||
return (type1 == type2 || type2 == GST_VAAPI_DISPLAY_TYPE_ANY);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gst_vaapi_plugin_base_ensure_display:
|
* gst_vaapi_plugin_base_ensure_display:
|
||||||
* @plugin: a #GstVaapiPluginBase
|
* @plugin: a #GstVaapiPluginBase
|
||||||
|
@ -122,7 +114,8 @@ display_type_is_compatible (GstVaapiDisplayType type1,
|
||||||
gboolean
|
gboolean
|
||||||
gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin)
|
gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin)
|
||||||
{
|
{
|
||||||
if (plugin->display && display_type_is_compatible (plugin->display_type,
|
if (plugin->display
|
||||||
|
&& gst_vaapi_display_type_is_compatible (plugin->display_type,
|
||||||
plugin->display_type_req))
|
plugin->display_type_req))
|
||||||
return TRUE;
|
return TRUE;
|
||||||
gst_vaapi_display_replace (&plugin->display, NULL);
|
gst_vaapi_display_replace (&plugin->display, NULL);
|
||||||
|
|
|
@ -121,7 +121,8 @@ gst_vaapi_ensure_display(gpointer element, GstVaapiDisplayType type)
|
||||||
gst_vaapi_video_context_prepare(context, display_types);
|
gst_vaapi_video_context_prepare(context, display_types);
|
||||||
|
|
||||||
/* Neighbour found and it updated the display */
|
/* Neighbour found and it updated the display */
|
||||||
if (plugin->display)
|
if (plugin->display && gst_vaapi_display_type_is_compatible(
|
||||||
|
plugin->display_type, 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 */
|
||||||
|
|
Loading…
Reference in a new issue