#include "config.h"
#include "gstvaapiwindow.h"
+#include "gstvaapiobject_priv.h"
#define DEBUG 1
#include "gstvaapidebug.h"
-G_DEFINE_TYPE(GstVaapiWindow, gst_vaapi_window, G_TYPE_OBJECT);
+G_DEFINE_TYPE(GstVaapiWindow, gst_vaapi_window, GST_VAAPI_TYPE_OBJECT);
#define GST_VAAPI_WINDOW_GET_PRIVATE(obj) \
(G_TYPE_INSTANCE_GET_PRIVATE((obj), \
GstVaapiWindowPrivate))
struct _GstVaapiWindowPrivate {
- GstVaapiDisplay *display;
guint width;
guint height;
gboolean is_constructed : 1;
enum {
PROP_0,
- PROP_DISPLAY,
PROP_WIDTH,
PROP_HEIGHT,
PROP_FULLSCREEN
if (klass->get_geometry)
klass->get_geometry(window, NULL, NULL, &priv->width, &priv->height);
- gst_vaapi_display_get_size(priv->display, &display_width, &display_height);
+ gst_vaapi_display_get_size(
+ GST_VAAPI_OBJECT_GET_DISPLAY(window),
+ &display_width,
+ &display_height
+ );
priv->is_fullscreen_changed = FALSE;
priv->is_fullscreen = (priv->width == display_width &&
priv->height == display_height);
static void
gst_vaapi_window_destroy(GstVaapiWindow *window)
{
- GstVaapiWindowPrivate * const priv = window->priv;
-
GST_VAAPI_WINDOW_GET_CLASS(window)->destroy(window);
-
- if (priv->display) {
- g_object_unref(priv->display);
- priv->display = NULL;
- }
}
static gboolean
GstVaapiWindow * const window = GST_VAAPI_WINDOW(object);
switch (prop_id) {
- case PROP_DISPLAY:
- window->priv->display = g_object_ref(g_value_get_object(value));
- break;
case PROP_WIDTH:
gst_vaapi_window_set_width(window, g_value_get_uint(value));
break;
GstVaapiWindow * const window = GST_VAAPI_WINDOW(object);
switch (prop_id) {
- case PROP_DISPLAY:
- g_value_set_object(value, gst_vaapi_window_get_display(window));
- break;
case PROP_WIDTH:
g_value_set_uint(value, gst_vaapi_window_get_width(window));
break;
object_class->get_property = gst_vaapi_window_get_property;
object_class->constructed = gst_vaapi_window_constructed;
- /**
- * GstVaapiWindowX11:display:
- *
- * The #GstVaapiDisplay this window is bound to
- */
- g_object_class_install_property
- (object_class,
- PROP_DISPLAY,
- g_param_spec_object("display",
- "Display",
- "The GstVaapiDisplay this window is bound to",
- GST_VAAPI_TYPE_DISPLAY,
- G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
-
g_object_class_install_property
(object_class,
PROP_WIDTH,
GstVaapiWindowPrivate *priv = GST_VAAPI_WINDOW_GET_PRIVATE(window);
window->priv = priv;
- priv->display = NULL;
priv->width = 1;
priv->height = 1;
priv->is_constructed = FALSE;
{
g_return_val_if_fail(GST_VAAPI_IS_WINDOW(window), NULL);
- return window->priv->display;
+ return GST_VAAPI_OBJECT_GET_DISPLAY(window);
}
/**
struct _GstVaapiWindowX11Private {
GstVaapiDisplay *display;
- Window xid;
Atom atom_NET_WM_STATE;
Atom atom_NET_WM_STATE_FULLSCREEN;
guint create_window : 1;
guint fullscreen_on_map : 1;
};
-enum {
- PROP_0,
-
- PROP_XID,
-};
-
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
#define _NET_WM_STATE_ADD 1 /* add/set property */
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */
memset(&xclient, 0, sizeof(xclient));
xclient.type = ClientMessage;
- xclient.window = priv->xid;
+ xclient.window = GST_VAAPI_OBJECT_ID(window);
xclient.message_type = priv->atom_NET_WM_STATE;
xclient.format = 32;
{
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;
for (;;) {
GST_VAAPI_DISPLAY_LOCK(priv->display);
- got_event = XCheckTypedWindowEvent(dpy, priv->xid, type, &e);
+ got_event = XCheckTypedWindowEvent(dpy, xid, type, &e);
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
if (got_event)
break;
{
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;
e = &tmp_event;
GST_VAAPI_DISPLAY_LOCK(priv->display);
- got_event = XCheckTypedWindowEvent(dpy, priv->xid, type, e);
+ got_event = XCheckTypedWindowEvent(dpy, xid, type, e);
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
if (got_event)
return TRUE;
do {
g_usleep(10);
GST_VAAPI_DISPLAY_LOCK(priv->display);
- got_event = XCheckTypedWindowEvent(dpy, priv->xid, type, e);
+ got_event = XCheckTypedWindowEvent(dpy, xid, type, e);
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
if (got_event)
return TRUE;
{
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;
GST_VAAPI_DISPLAY_LOCK(priv->display);
x11_trap_errors();
if (!priv->create_window) {
- XGetWindowAttributes(dpy, priv->xid, &wattr);
+ XGetWindowAttributes(dpy, xid, &wattr);
if (!(wattr.your_event_mask & StructureNotifyMask))
- XSelectInput(dpy, priv->xid, StructureNotifyMask);
+ XSelectInput(dpy, xid, StructureNotifyMask);
}
- XMapWindow(dpy, priv->xid);
+ XMapWindow(dpy, xid);
has_errors = x11_untrap_errors() != 0;
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
!(wattr.your_event_mask & StructureNotifyMask)) {
GST_VAAPI_DISPLAY_LOCK(priv->display);
x11_trap_errors();
- XSelectInput(dpy, priv->xid, wattr.your_event_mask);
+ XSelectInput(dpy, xid, wattr.your_event_mask);
has_errors = x11_untrap_errors() != 0;
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
}
{
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;
GST_VAAPI_DISPLAY_LOCK(priv->display);
x11_trap_errors();
if (!priv->create_window) {
- XGetWindowAttributes(dpy, priv->xid, &wattr);
+ XGetWindowAttributes(dpy, xid, &wattr);
if (!(wattr.your_event_mask & StructureNotifyMask))
- XSelectInput(dpy, priv->xid, StructureNotifyMask);
+ XSelectInput(dpy, xid, StructureNotifyMask);
}
- XUnmapWindow(dpy, priv->xid);
+ XUnmapWindow(dpy, xid);
has_errors = x11_untrap_errors() != 0;
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
!(wattr.your_event_mask & StructureNotifyMask)) {
GST_VAAPI_DISPLAY_LOCK(priv->display);
x11_trap_errors();
- XSelectInput(dpy, priv->xid, wattr.your_event_mask);
+ XSelectInput(dpy, xid, wattr.your_event_mask);
has_errors = x11_untrap_errors() != 0;
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
}
{
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;
"_NET_WM_STATE_FULLSCREEN",
};
- if (!priv->create_window && priv->xid) {
+ if (!priv->create_window && xid) {
GST_VAAPI_DISPLAY_LOCK(priv->display);
- XGetWindowAttributes(dpy, priv->xid, &wattr);
+ XGetWindowAttributes(dpy, xid, &wattr);
priv->is_mapped = wattr.map_state == IsViewable;
- ok = x11_get_geometry(dpy, priv->xid, NULL, NULL, width, height);
+ ok = x11_get_geometry(dpy, xid, NULL, NULL, width, height);
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
return ok;
}
priv->atom_NET_WM_STATE = atoms[0];
priv->atom_NET_WM_STATE_FULLSCREEN = atoms[1];
- priv->xid = x11_create_window(dpy, *width, *height);
- if (priv->xid)
- XRaiseWindow(dpy, priv->xid);
+ xid = x11_create_window(dpy, *width, *height);
+ if (xid)
+ XRaiseWindow(dpy, xid);
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
- return priv->xid != None;
+
+ GST_DEBUG("xid %" GST_VAAPI_ID_FORMAT, GST_VAAPI_ID_ARGS(xid));
+ GST_VAAPI_OBJECT_ID(window) = xid;
+ return xid != None;
}
static void
{
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);
- if (priv->xid) {
+ if (xid) {
if (priv->create_window) {
GST_VAAPI_DISPLAY_LOCK(priv->display);
- XDestroyWindow(dpy, priv->xid);
+ XDestroyWindow(dpy, xid);
GST_VAAPI_DISPLAY_UNLOCK(priv->display);
}
- priv->xid = None;
+ GST_VAAPI_OBJECT_ID(window) = None;
}
if (priv->display) {
{
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);
- return x11_get_geometry(dpy, priv->xid, px, py, pwidth, pheight);
+ return x11_get_geometry(dpy, xid, px, py, pwidth, pheight);
}
static gboolean
{
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;
guint width, height;
gboolean has_errors;
XChangeProperty(
dpy,
- priv->xid,
+ xid,
priv->atom_NET_WM_STATE, XA_ATOM, 32,
PropModeReplace,
(unsigned char *)&priv->atom_NET_WM_STATE_FULLSCREEN, 1
XDeleteProperty(
dpy,
- priv->xid,
+ xid,
priv->atom_NET_WM_STATE
);
}
GstVaapiWindowX11Private * const priv = GST_VAAPI_WINDOW_X11(window)->priv;
gboolean has_errors;
- if (!priv->xid)
+ if (!GST_VAAPI_OBJECT_ID(window))
return FALSE;
GST_VAAPI_DISPLAY_LOCK(priv->display);
x11_trap_errors();
XResizeWindow(
GST_VAAPI_DISPLAY_XDISPLAY(priv->display),
- priv->xid,
+ GST_VAAPI_OBJECT_ID(window),
width,
height
);
status = vaPutSurface(
GST_VAAPI_DISPLAY_VADISPLAY(display),
surface_id,
- GST_VAAPI_WINDOW_X11(window)->priv->xid,
+ GST_VAAPI_OBJECT_ID(window),
src_rect->x,
src_rect->y,
src_rect->width,
}
static void
-gst_vaapi_window_x11_set_property(
- GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec
-)
-{
- GstVaapiWindowX11 * const window = GST_VAAPI_WINDOW_X11(object);
-
- switch (prop_id) {
- case PROP_XID:
- window->priv->xid = g_value_get_uint(value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_vaapi_window_x11_get_property(
- GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec
-)
-{
- GstVaapiWindowX11 * const window = GST_VAAPI_WINDOW_X11(object);
-
- switch (prop_id) {
- case PROP_XID:
- g_value_set_uint(value, gst_vaapi_window_x11_get_xid(window));
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
- break;
- }
-}
-
-static void
gst_vaapi_window_x11_constructed(GObject *object)
{
GstVaapiWindowX11 * const window = GST_VAAPI_WINDOW_X11(object);
window->priv->display =
g_object_ref(gst_vaapi_window_get_display(GST_VAAPI_WINDOW(window)));
- window->priv->create_window = window->priv->xid == None;
+ window->priv->create_window = GST_VAAPI_OBJECT_ID(object) == None;
parent_class = G_OBJECT_CLASS(gst_vaapi_window_x11_parent_class);
if (parent_class->constructed)
g_type_class_add_private(klass, sizeof(GstVaapiWindowX11Private));
object_class->finalize = gst_vaapi_window_x11_finalize;
- object_class->set_property = gst_vaapi_window_x11_set_property;
- object_class->get_property = gst_vaapi_window_x11_get_property;
object_class->constructed = gst_vaapi_window_x11_constructed;
window_class->create = gst_vaapi_window_x11_create;
window_class->set_fullscreen = gst_vaapi_window_x11_set_fullscreen;
window_class->resize = gst_vaapi_window_x11_resize;
window_class->render = gst_vaapi_window_x11_render;
-
- /**
- * GstVaapiWindowX11:xid:
- *
- * The underlying X11 #Window XID.
- */
- g_object_class_install_property
- (object_class,
- PROP_XID,
- g_param_spec_uint("xid",
- "X window id",
- "The underlying X11 window id",
- 0, G_MAXUINT32, 0,
- G_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
}
static void
window->priv = priv;
priv->display = NULL;
- priv->xid = None;
priv->create_window = TRUE;
priv->is_mapped = FALSE;
priv->fullscreen_on_map = FALSE;
return g_object_new(GST_VAAPI_TYPE_WINDOW_X11,
"display", display,
+ "id", (GstVaapiID)None,
"width", width,
"height", height,
NULL);
return g_object_new(GST_VAAPI_TYPE_WINDOW_X11,
"display", display,
- "xid", xid,
+ "id", (GstVaapiID)xid,
NULL);
}
{
g_return_val_if_fail(GST_VAAPI_WINDOW_X11(window), None);
- return window->priv->xid;
+ return GST_VAAPI_OBJECT_ID(window);
}