mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-03 21:12:26 +00:00
Ensure VA display is created prior to initializing the window from a specific XID. Also move code down.
This commit is contained in:
parent
73df3d41b9
commit
d16dda6b61
1 changed files with 58 additions and 44 deletions
|
@ -121,6 +121,9 @@ gst_vaapi_video_sink_iface_init(GstVaapiVideoSinkInterface *iface)
|
||||||
|
|
||||||
/* GstXOverlay interface */
|
/* GstXOverlay interface */
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_vaapisink_ensure_window_xid(GstVaapiSink *sink, XID xid);
|
||||||
|
|
||||||
static GstFlowReturn
|
static GstFlowReturn
|
||||||
gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer);
|
gst_vaapisink_show_frame(GstBaseSink *base_sink, GstBuffer *buffer);
|
||||||
|
|
||||||
|
@ -131,38 +134,8 @@ static void
|
||||||
gst_vaapisink_xoverlay_set_xid(GstXOverlay *overlay, XID xid)
|
gst_vaapisink_xoverlay_set_xid(GstXOverlay *overlay, XID xid)
|
||||||
{
|
{
|
||||||
GstVaapiSink * const sink = GST_VAAPISINK(overlay);
|
GstVaapiSink * const sink = GST_VAAPISINK(overlay);
|
||||||
XWindowAttributes wattr;
|
|
||||||
|
|
||||||
gst_vaapi_display_lock(sink->display);
|
gst_vaapisink_ensure_window_xid(sink, xid);
|
||||||
XGetWindowAttributes(
|
|
||||||
gst_vaapi_display_x11_get_display(GST_VAAPI_DISPLAY_X11(sink->display)),
|
|
||||||
xid,
|
|
||||||
&wattr
|
|
||||||
);
|
|
||||||
gst_vaapi_display_unlock(sink->display);
|
|
||||||
|
|
||||||
if (wattr.width != sink->window_width ||
|
|
||||||
wattr.height != sink->window_height) {
|
|
||||||
update_display_rect(sink, wattr.width, wattr.height);
|
|
||||||
sink->window_width = wattr.width;
|
|
||||||
sink->window_height = wattr.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sink->window &&
|
|
||||||
gst_vaapi_window_x11_get_xid(GST_VAAPI_WINDOW_X11(sink->window)) == xid)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (sink->window) {
|
|
||||||
g_object_unref(sink->window);
|
|
||||||
sink->window = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if USE_VAAPISINK_GLX
|
|
||||||
if (sink->use_glx)
|
|
||||||
sink->window = gst_vaapi_window_glx_new_with_xid(sink->display, xid);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
sink->window = gst_vaapi_window_x11_new_with_xid(sink->display, xid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -212,6 +185,23 @@ gst_vaapisink_destroy(GstVaapiSink *sink)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline gboolean
|
||||||
|
gst_vaapisink_ensure_display(GstVaapiSink *sink)
|
||||||
|
{
|
||||||
|
if (!sink->display) {
|
||||||
|
#if USE_VAAPISINK_GLX
|
||||||
|
if (sink->use_glx)
|
||||||
|
sink->display = gst_vaapi_display_glx_new(sink->display_name);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
sink->display = gst_vaapi_display_x11_new(sink->display_name);
|
||||||
|
if (!sink->display || !gst_vaapi_display_get_display(sink->display))
|
||||||
|
return FALSE;
|
||||||
|
g_object_set(sink, "synchronous", sink->synchronous, NULL);
|
||||||
|
}
|
||||||
|
return sink->display != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static inline gboolean
|
||||||
gst_vaapisink_ensure_window(GstVaapiSink *sink, guint width, guint height)
|
gst_vaapisink_ensure_window(GstVaapiSink *sink, guint width, guint height)
|
||||||
{
|
{
|
||||||
|
@ -233,21 +223,45 @@ gst_vaapisink_ensure_window(GstVaapiSink *sink, guint width, guint height)
|
||||||
return sink->window != NULL;
|
return sink->window != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline gboolean
|
static gboolean
|
||||||
gst_vaapisink_ensure_display(GstVaapiSink *sink)
|
gst_vaapisink_ensure_window_xid(GstVaapiSink *sink, XID xid)
|
||||||
{
|
{
|
||||||
if (!sink->display) {
|
XWindowAttributes wattr;
|
||||||
|
|
||||||
|
if (!gst_vaapisink_ensure_display(sink))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
gst_vaapi_display_lock(sink->display);
|
||||||
|
XGetWindowAttributes(
|
||||||
|
gst_vaapi_display_x11_get_display(GST_VAAPI_DISPLAY_X11(sink->display)),
|
||||||
|
xid,
|
||||||
|
&wattr
|
||||||
|
);
|
||||||
|
gst_vaapi_display_unlock(sink->display);
|
||||||
|
|
||||||
|
if (wattr.width != sink->window_width ||
|
||||||
|
wattr.height != sink->window_height) {
|
||||||
|
update_display_rect(sink, wattr.width, wattr.height);
|
||||||
|
sink->window_width = wattr.width;
|
||||||
|
sink->window_height = wattr.height;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sink->window &&
|
||||||
|
gst_vaapi_window_x11_get_xid(GST_VAAPI_WINDOW_X11(sink->window)) == xid)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
if (sink->window) {
|
||||||
|
g_object_unref(sink->window);
|
||||||
|
sink->window = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#if USE_VAAPISINK_GLX
|
#if USE_VAAPISINK_GLX
|
||||||
if (sink->use_glx)
|
if (sink->use_glx)
|
||||||
sink->display = gst_vaapi_display_glx_new(sink->display_name);
|
sink->window = gst_vaapi_window_glx_new_with_xid(sink->display, xid);
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
sink->display = gst_vaapi_display_x11_new(sink->display_name);
|
sink->window = gst_vaapi_window_x11_new_with_xid(sink->display, xid);
|
||||||
if (!sink->display || !gst_vaapi_display_get_display(sink->display))
|
return sink->window != NULL;
|
||||||
return FALSE;
|
|
||||||
g_object_set(sink, "synchronous", sink->synchronous, NULL);
|
|
||||||
}
|
|
||||||
return sink->display != NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
Loading…
Reference in a new issue