mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-22 10:23:47 +00:00
plugins: fix display type selection and propagation.
If vaapisink is in the GStreamer pipeline, then we shall allocate a unique GstVaapiDisplay and propagate it upstream. i.e. subsequent queries from vaapidecode shall get a valid answer from vaapisink.
This commit is contained in:
parent
4e53b5fe4e
commit
cff117b54d
7 changed files with 68 additions and 17 deletions
|
@ -286,6 +286,13 @@ error_commit_buffer:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
gst_vaapidecode_ensure_display(GstVaapiDecode *decode)
|
||||||
|
{
|
||||||
|
return gst_vaapi_ensure_display(decode, GST_VAAPI_DISPLAY_TYPE_ANY,
|
||||||
|
&decode->display);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapidecode_create(GstVaapiDecode *decode, GstCaps *caps)
|
gst_vaapidecode_create(GstVaapiDecode *decode, GstCaps *caps)
|
||||||
{
|
{
|
||||||
|
@ -293,7 +300,7 @@ gst_vaapidecode_create(GstVaapiDecode *decode, GstCaps *caps)
|
||||||
GstStructure *structure;
|
GstStructure *structure;
|
||||||
int version;
|
int version;
|
||||||
|
|
||||||
if (!gst_vaapi_ensure_display(decode, &decode->display, NULL))
|
if (!gst_vaapidecode_ensure_display(decode))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
dpy = decode->display;
|
dpy = decode->display;
|
||||||
|
|
||||||
|
@ -526,7 +533,7 @@ gst_vaapidecode_ensure_allowed_caps(GstVaapiDecode *decode)
|
||||||
if (decode->allowed_caps)
|
if (decode->allowed_caps)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
if (!gst_vaapi_ensure_display(decode, &decode->display, NULL))
|
if (!gst_vaapidecode_ensure_display(decode))
|
||||||
goto error_no_display;
|
goto error_no_display;
|
||||||
|
|
||||||
decode_caps = gst_vaapi_display_get_decode_caps(decode->display);
|
decode_caps = gst_vaapi_display_get_decode_caps(decode->display);
|
||||||
|
|
|
@ -290,12 +290,19 @@ gst_vaapidownload_init(GstVaapiDownload *download)
|
||||||
gst_object_unref(srcpad);
|
gst_object_unref(srcpad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
gst_vaapidownload_ensure_display(GstVaapiDownload *download)
|
||||||
|
{
|
||||||
|
return gst_vaapi_ensure_display(download, GST_VAAPI_DISPLAY_TYPE_ANY,
|
||||||
|
&download->display);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapidownload_start(GstBaseTransform *trans)
|
gst_vaapidownload_start(GstBaseTransform *trans)
|
||||||
{
|
{
|
||||||
GstVaapiDownload * const download = GST_VAAPIDOWNLOAD(trans);
|
GstVaapiDownload * const download = GST_VAAPIDOWNLOAD(trans);
|
||||||
|
|
||||||
if (!gst_vaapi_ensure_display(download, &download->display, NULL))
|
if (!gst_vaapidownload_ensure_display(download))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -448,7 +455,7 @@ gst_vaapidownload_transform_caps(
|
||||||
if (direction == GST_PAD_SINK) {
|
if (direction == GST_PAD_SINK) {
|
||||||
if (!gst_structure_has_name(structure, GST_VAAPI_SURFACE_CAPS_NAME))
|
if (!gst_structure_has_name(structure, GST_VAAPI_SURFACE_CAPS_NAME))
|
||||||
return NULL;
|
return NULL;
|
||||||
if (!gst_vaapi_ensure_display(download, &download->display, NULL))
|
if (!gst_vaapidownload_ensure_display(download))
|
||||||
return NULL;
|
return NULL;
|
||||||
out_caps = gst_caps_from_string(gst_vaapidownload_yuv_caps_str);
|
out_caps = gst_caps_from_string(gst_vaapidownload_yuv_caps_str);
|
||||||
|
|
||||||
|
|
|
@ -66,12 +66,10 @@ static const DisplayMap g_display_map[] = {
|
||||||
gboolean
|
gboolean
|
||||||
gst_vaapi_ensure_display(
|
gst_vaapi_ensure_display(
|
||||||
gpointer element,
|
gpointer element,
|
||||||
GstVaapiDisplay **display_ptr,
|
GstVaapiDisplayType display_type,
|
||||||
GstVaapiDisplayType *display_type_ptr
|
GstVaapiDisplay **display_ptr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
GstVaapiDisplayType display_type =
|
|
||||||
display_type_ptr ? *display_type_ptr : GST_VAAPI_DISPLAY_TYPE_ANY;
|
|
||||||
GstVaapiDisplay *display;
|
GstVaapiDisplay *display;
|
||||||
GstVideoContext *context;
|
GstVideoContext *context;
|
||||||
const DisplayMap *m;
|
const DisplayMap *m;
|
||||||
|
@ -85,8 +83,14 @@ gst_vaapi_ensure_display(
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
context = GST_VIDEO_CONTEXT(element);
|
context = GST_VIDEO_CONTEXT(element);
|
||||||
|
g_return_val_if_fail(context != NULL, FALSE);
|
||||||
|
|
||||||
gst_video_context_prepare(context, display_types);
|
gst_video_context_prepare(context, display_types);
|
||||||
|
|
||||||
|
/* Neighbour found and it updated the display */
|
||||||
|
if (*display_ptr)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
/* If no neighboor, or application not interested, use system default */
|
/* If no neighboor, or application not interested, use system default */
|
||||||
for (m = g_display_map; m->type_str != NULL; m++) {
|
for (m = g_display_map; m->type_str != NULL; m++) {
|
||||||
if (display_type != GST_VAAPI_DISPLAY_TYPE_ANY &&
|
if (display_type != GST_VAAPI_DISPLAY_TYPE_ANY &&
|
||||||
|
@ -110,8 +114,6 @@ gst_vaapi_ensure_display(
|
||||||
|
|
||||||
if (display_ptr)
|
if (display_ptr)
|
||||||
*display_ptr = display;
|
*display_ptr = display;
|
||||||
if (display_type_ptr)
|
|
||||||
*display_type_ptr = display_type;
|
|
||||||
return display != NULL;
|
return display != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,8 +30,8 @@ G_GNUC_INTERNAL
|
||||||
gboolean
|
gboolean
|
||||||
gst_vaapi_ensure_display(
|
gst_vaapi_ensure_display(
|
||||||
gpointer element,
|
gpointer element,
|
||||||
GstVaapiDisplay **display,
|
GstVaapiDisplayType display_type,
|
||||||
GstVaapiDisplayType *display_type_ptr
|
GstVaapiDisplay **display
|
||||||
);
|
);
|
||||||
|
|
||||||
G_GNUC_INTERNAL
|
G_GNUC_INTERNAL
|
||||||
|
|
|
@ -199,10 +199,17 @@ gst_video_context_interface_init(GstVideoContextInterface *iface)
|
||||||
iface->set_context = gst_vaapipostproc_set_video_context;
|
iface->set_context = gst_vaapipostproc_set_video_context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
gst_vaapipostproc_ensure_display(GstVaapiPostproc *postproc)
|
||||||
|
{
|
||||||
|
return gst_vaapi_ensure_display(postproc, GST_VAAPI_DISPLAY_TYPE_ANY,
|
||||||
|
&postproc->display);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapipostproc_create(GstVaapiPostproc *postproc, GstCaps *caps)
|
gst_vaapipostproc_create(GstVaapiPostproc *postproc, GstCaps *caps)
|
||||||
{
|
{
|
||||||
if (!gst_vaapi_ensure_display(postproc, &postproc->display, NULL))
|
if (!gst_vaapipostproc_ensure_display(postproc))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
gst_caps_replace(&postproc->postproc_caps, caps);
|
gst_caps_replace(&postproc->postproc_caps, caps);
|
||||||
|
@ -231,7 +238,7 @@ gst_vaapipostproc_reset(GstVaapiPostproc *postproc, GstCaps *caps)
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapipostproc_start(GstVaapiPostproc *postproc)
|
gst_vaapipostproc_start(GstVaapiPostproc *postproc)
|
||||||
{
|
{
|
||||||
if (!gst_vaapi_ensure_display(postproc, &postproc->display, NULL))
|
if (!gst_vaapipostproc_ensure_display(postproc))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -260,10 +260,32 @@ configure_notify_event_pending(
|
||||||
return args.match;
|
return args.match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const gchar *
|
||||||
|
get_display_type_name(GstVaapiDisplayType display_type)
|
||||||
|
{
|
||||||
|
gpointer const klass = g_type_class_peek(GST_VAAPI_TYPE_DISPLAY_TYPE);
|
||||||
|
GEnumValue * const e = g_enum_get_value(klass, display_type);
|
||||||
|
|
||||||
|
if (e)
|
||||||
|
return e->value_name;
|
||||||
|
return "<unknown-type>";
|
||||||
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
gst_vaapisink_ensure_display(GstVaapiSink *sink)
|
gst_vaapisink_ensure_display(GstVaapiSink *sink)
|
||||||
{
|
{
|
||||||
return gst_vaapi_ensure_display(sink, &sink->display, &sink->display_type);
|
GstVaapiDisplayType display_type;
|
||||||
|
|
||||||
|
if (!gst_vaapi_ensure_display(sink, sink->display_type, &sink->display))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
display_type = gst_vaapi_display_get_display_type(sink->display);
|
||||||
|
if (display_type != sink->display_type) {
|
||||||
|
GST_INFO("created %s %p", get_display_type_name(display_type),
|
||||||
|
sink->display);
|
||||||
|
sink->display_type = display_type;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
|
@ -360,14 +360,20 @@ gst_vaapiupload_init(GstVaapiUpload *upload)
|
||||||
g_object_unref(srcpad);
|
g_object_unref(srcpad);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
gst_vaapiupload_ensure_display(GstVaapiUpload *upload)
|
||||||
|
{
|
||||||
|
return gst_vaapi_ensure_display(upload, GST_VAAPI_DISPLAY_TYPE_ANY,
|
||||||
|
&upload->display);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_vaapiupload_start(GstBaseTransform *trans)
|
gst_vaapiupload_start(GstBaseTransform *trans)
|
||||||
{
|
{
|
||||||
GstVaapiUpload * const upload = GST_VAAPIUPLOAD(trans);
|
GstVaapiUpload * const upload = GST_VAAPIUPLOAD(trans);
|
||||||
|
|
||||||
if (!gst_vaapi_ensure_display(upload, &upload->display, NULL))
|
if (!gst_vaapiupload_ensure_display(upload))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue