GstVaapiWindowX11Private))
struct _GstVaapiWindowX11Private {
- GstVaapiDisplay *display;
Atom atom_NET_WM_STATE;
Atom atom_NET_WM_STATE_FULLSCREEN;
guint create_window : 1;
send_wmspec_change_state(GstVaapiWindowX11 *window, Atom state, gboolean add)
{
GstVaapiWindowX11Private * const priv = window->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
XClientMessageEvent xclient;
memset(&xclient, 0, sizeof(xclient));
static void
wait_event(GstVaapiWindow *window, int type)
{
- GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
- XEvent e;
- Bool got_event;
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
+ XEvent e;
+ Bool got_event;
for (;;) {
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
got_event = XCheckTypedWindowEvent(dpy, xid, type, &e);
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (got_event)
break;
g_usleep(10);
static gboolean
timed_wait_event(GstVaapiWindow *window, int type, guint64 end_time, XEvent *e)
{
- GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
- XEvent tmp_event;
- GTimeVal now;
- guint64 now_time;
- Bool got_event;
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
+ XEvent tmp_event;
+ GTimeVal now;
+ guint64 now_time;
+ Bool got_event;
if (!e)
e = &tmp_event;
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
got_event = XCheckTypedWindowEvent(dpy, xid, type, e);
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (got_event)
return TRUE;
do {
g_usleep(10);
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
got_event = XCheckTypedWindowEvent(dpy, xid, type, e);
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (got_event)
return TRUE;
g_get_current_time(&now);
gst_vaapi_window_x11_show(GstVaapiWindow *window)
{
GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
- XWindowAttributes wattr;
- gboolean has_errors;
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
+ XWindowAttributes wattr;
+ gboolean has_errors;
if (priv->is_mapped)
return TRUE;
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
x11_trap_errors();
if (!priv->create_window) {
XGetWindowAttributes(dpy, xid, &wattr);
}
XMapWindow(dpy, xid);
has_errors = x11_untrap_errors() != 0;
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (!has_errors) {
wait_event(window, MapNotify);
if (!priv->create_window &&
!(wattr.your_event_mask & StructureNotifyMask)) {
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
x11_trap_errors();
XSelectInput(dpy, xid, wattr.your_event_mask);
has_errors = x11_untrap_errors() != 0;
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
}
priv->is_mapped = TRUE;
gst_vaapi_window_x11_hide(GstVaapiWindow *window)
{
GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
- XWindowAttributes wattr;
- gboolean has_errors;
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
+ XWindowAttributes wattr;
+ gboolean has_errors;
if (!priv->is_mapped)
return TRUE;
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
x11_trap_errors();
if (!priv->create_window) {
XGetWindowAttributes(dpy, xid, &wattr);
}
XUnmapWindow(dpy, xid);
has_errors = x11_untrap_errors() != 0;
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (!has_errors) {
wait_event(window, UnmapNotify);
if (!priv->create_window &&
!(wattr.your_event_mask & StructureNotifyMask)) {
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
x11_trap_errors();
XSelectInput(dpy, xid, wattr.your_event_mask);
has_errors = x11_untrap_errors() != 0;
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
}
priv->is_mapped = FALSE;
}
gst_vaapi_window_x11_create(GstVaapiWindow *window, guint *width, guint *height)
{
GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- Window xid = GST_VAAPI_OBJECT_ID(window);
- XWindowAttributes wattr;
- Atom atoms[2];
- gboolean ok;
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ Window xid = GST_VAAPI_OBJECT_ID(window);
+ XWindowAttributes wattr;
+ Atom atoms[2];
+ gboolean ok;
static const char *atom_names[2] = {
"_NET_WM_STATE",
};
if (!priv->create_window && xid) {
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
XGetWindowAttributes(dpy, xid, &wattr);
priv->is_mapped = wattr.map_state == IsViewable;
ok = x11_get_geometry(dpy, xid, NULL, NULL, width, height);
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
return ok;
}
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
XInternAtoms(dpy, (char **)atom_names, G_N_ELEMENTS(atom_names), False, atoms);
priv->atom_NET_WM_STATE = atoms[0];
priv->atom_NET_WM_STATE_FULLSCREEN = atoms[1];
xid = x11_create_window(dpy, *width, *height);
if (xid)
XRaiseWindow(dpy, xid);
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
GST_DEBUG("xid %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS(xid));
GST_VAAPI_OBJECT_ID(window) = xid;
gst_vaapi_window_x11_destroy(GstVaapiWindow *window)
{
GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
if (xid) {
if (priv->create_window) {
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
XDestroyWindow(dpy, xid);
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
}
GST_VAAPI_OBJECT_ID(window) = None;
}
-
- if (priv->display) {
- g_object_unref(priv->display);
- priv->display = NULL;
- }
}
static gboolean
guint *pwidth,
guint *pheight)
{
- GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
return x11_get_geometry(dpy, xid, px, py, pwidth, pheight);
}
gst_vaapi_window_x11_set_fullscreen(GstVaapiWindow *window, gboolean fullscreen)
{
GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
- Display * const dpy = GST_VAAPI_DISPLAY_XDISPLAY(priv->display);
- const Window xid = GST_VAAPI_OBJECT_ID(window);
+ Display * const dpy = GST_VAAPI_OBJECT_XDISPLAY(window);
+ const Window xid = GST_VAAPI_OBJECT_ID(window);
XEvent e;
guint width, height;
gboolean has_errors;
GTimeVal now;
guint64 end_time;
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
x11_trap_errors();
if (fullscreen) {
if (!priv->is_mapped) {
}
XSync(dpy, False);
has_errors = x11_untrap_errors() != 0;
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (has_errors)
return FALSE;
end_time = DELAY + ((guint64)now.tv_sec * 1000000 + now.tv_usec);
while (timed_wait_event(window, ConfigureNotify, end_time, &e)) {
if (fullscreen) {
- gst_vaapi_display_get_size(priv->display, &width, &height);
+ gst_vaapi_display_get_size(
+ GST_VAAPI_OBJECT_DISPLAY(window),
+ &width,
+ &height
+ );
if (e.xconfigure.width == width && e.xconfigure.height == height)
return TRUE;
}
static gboolean
gst_vaapi_window_x11_resize(GstVaapiWindow *window, guint width, guint height)
{
- GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
gboolean has_errors;
if (!GST_VAAPI_OBJECT_ID(window))
return FALSE;
- GST_VAAPI_DISPLAY_LOCK(priv->display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
x11_trap_errors();
XResizeWindow(
- GST_VAAPI_DISPLAY_XDISPLAY(priv->display),
+ GST_VAAPI_OBJECT_XDISPLAY(window),
GST_VAAPI_OBJECT_ID(window),
width,
height
);
has_errors = x11_untrap_errors() != 0;
- GST_VAAPI_DISPLAY_UNLOCK(priv->display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
return !has_errors;
}
guint flags
)
{
- GstVaapiDisplay *display;
VASurfaceID surface_id;
VAStatus status;
- display = GST_VAAPI_OBJECT_DISPLAY(surface);
- if (!display)
- return FALSE;
-
surface_id = GST_VAAPI_OBJECT_ID(surface);
if (surface_id == VA_INVALID_ID)
return FALSE;
- GST_VAAPI_DISPLAY_LOCK(display);
+ GST_VAAPI_OBJECT_LOCK_DISPLAY(window);
status = vaPutSurface(
- GST_VAAPI_DISPLAY_VADISPLAY(display),
+ GST_VAAPI_OBJECT_VADISPLAY(window),
surface_id,
GST_VAAPI_OBJECT_ID(window),
src_rect->x,
NULL, 0,
get_PutSurface_flags_from_GstVaapiSurfaceRenderFlags(flags)
);
- GST_VAAPI_DISPLAY_UNLOCK(display);
+ GST_VAAPI_OBJECT_UNLOCK_DISPLAY(window);
if (!vaapi_check_status(status, "vaPutSurface()"))
return FALSE;
GstVaapiWindowX11 * const window = GST_VAAPI_WINDOW_X11(object);
GObjectClass *parent_class;
- window->priv->display =
- g_object_ref(gst_vaapi_window_get_display(GST_VAAPI_WINDOW(window)));
-
window->priv->create_window = GST_VAAPI_OBJECT_ID(object) == None;
parent_class = G_OBJECT_CLASS(gst_vaapi_window_x11_parent_class);
GstVaapiWindowX11Private *priv = GST_VAAPI_WINDOW_X11_GET_PRIVATE(window);
window->priv = priv;
- priv->display = NULL;
priv->create_window = TRUE;
priv->is_mapped = FALSE;
priv->fullscreen_on_map = FALSE;