mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 08:41:07 +00:00
sys/ximage/gstximagesrc.*: Fix use-damage property to actually work :)
Original commit message from CVS: 2006-07-09 Zaheer Abbas Merali <zaheerabbas at merali dot org> * sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get), (gst_ximage_src_set_property), (gst_ximage_src_get_property), (gst_ximage_src_get_caps), (gst_ximage_src_class_init), (gst_ximage_src_init): * sys/ximage/gstximagesrc.h: Fix use-damage property to actually work :) Add startx, starty, endx, endy properties so screencasts other than full screen ones can work.
This commit is contained in:
parent
e6c882b767
commit
e0855a0eb9
3 changed files with 249 additions and 50 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
||||||
|
2006-07-09 Zaheer Abbas Merali <zaheerabbas at merali dot org>
|
||||||
|
|
||||||
|
* sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get),
|
||||||
|
(gst_ximage_src_set_property), (gst_ximage_src_get_property),
|
||||||
|
(gst_ximage_src_get_caps), (gst_ximage_src_class_init),
|
||||||
|
(gst_ximage_src_init):
|
||||||
|
* sys/ximage/gstximagesrc.h:
|
||||||
|
Fix use-damage property to actually work :)
|
||||||
|
Add startx, starty, endx, endy properties so screencasts other than full
|
||||||
|
screen ones can work.
|
||||||
|
|
||||||
2006-07-08 Zaheer Abbas Merali <zaheerabbas at merali dot org>
|
2006-07-08 Zaheer Abbas Merali <zaheerabbas at merali dot org>
|
||||||
|
|
||||||
* sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get),
|
* sys/ximage/gstximagesrc.c: (gst_ximage_src_ximage_get),
|
||||||
|
|
|
@ -79,7 +79,11 @@ enum
|
||||||
PROP_DISPLAY_NAME,
|
PROP_DISPLAY_NAME,
|
||||||
PROP_SCREEN_NUM,
|
PROP_SCREEN_NUM,
|
||||||
PROP_SHOW_POINTER,
|
PROP_SHOW_POINTER,
|
||||||
PROP_USE_DAMAGE
|
PROP_USE_DAMAGE,
|
||||||
|
PROP_STARTX,
|
||||||
|
PROP_STARTY,
|
||||||
|
PROP_ENDX,
|
||||||
|
PROP_ENDY
|
||||||
};
|
};
|
||||||
|
|
||||||
GST_BOILERPLATE (GstXImageSrc, gst_ximage_src, GstPushSrc, GST_TYPE_PUSH_SRC);
|
GST_BOILERPLATE (GstXImageSrc, gst_ximage_src, GstPushSrc, GST_TYPE_PUSH_SRC);
|
||||||
|
@ -363,6 +367,7 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
|
|
||||||
xcontext = ximagesrc->xcontext;
|
xcontext = ximagesrc->xcontext;
|
||||||
|
|
||||||
|
|
||||||
caps = gst_caps_new_simple ("video/x-raw-rgb",
|
caps = gst_caps_new_simple ("video/x-raw-rgb",
|
||||||
"bpp", G_TYPE_INT, xcontext->bpp,
|
"bpp", G_TYPE_INT, xcontext->bpp,
|
||||||
"depth", G_TYPE_INT, xcontext->depth,
|
"depth", G_TYPE_INT, xcontext->depth,
|
||||||
|
@ -370,8 +375,8 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
"red_mask", G_TYPE_INT, xcontext->r_mask_output,
|
"red_mask", G_TYPE_INT, xcontext->r_mask_output,
|
||||||
"green_mask", G_TYPE_INT, xcontext->g_mask_output,
|
"green_mask", G_TYPE_INT, xcontext->g_mask_output,
|
||||||
"blue_mask", G_TYPE_INT, xcontext->b_mask_output,
|
"blue_mask", G_TYPE_INT, xcontext->b_mask_output,
|
||||||
"width", G_TYPE_INT, xcontext->width,
|
"width", G_TYPE_INT, ximagesrc->width,
|
||||||
"height", G_TYPE_INT, xcontext->height,
|
"height", G_TYPE_INT, ximagesrc->height,
|
||||||
"framerate", GST_TYPE_FRACTION, ximagesrc->fps_n, ximagesrc->fps_d,
|
"framerate", GST_TYPE_FRACTION, ximagesrc->fps_n, ximagesrc->fps_d,
|
||||||
"pixel-aspect-ratio", GST_TYPE_FRACTION,
|
"pixel-aspect-ratio", GST_TYPE_FRACTION,
|
||||||
gst_value_get_fraction_numerator (xcontext->par),
|
gst_value_get_fraction_numerator (xcontext->par),
|
||||||
|
@ -382,7 +387,6 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
}
|
}
|
||||||
|
|
||||||
g_return_val_if_fail (GST_IS_XIMAGE_SRC (ximagesrc), NULL);
|
g_return_val_if_fail (GST_IS_XIMAGE_SRC (ximagesrc), NULL);
|
||||||
|
|
||||||
#ifdef HAVE_XDAMAGE
|
#ifdef HAVE_XDAMAGE
|
||||||
if (ximagesrc->have_xdamage && ximagesrc->use_damage) {
|
if (ximagesrc->have_xdamage && ximagesrc->use_damage) {
|
||||||
XEvent ev;
|
XEvent ev;
|
||||||
|
@ -396,11 +400,11 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
|
|
||||||
#ifdef HAVE_XSHM
|
#ifdef HAVE_XSHM
|
||||||
if (ximagesrc->xcontext->use_xshm &&
|
if (ximagesrc->xcontext->use_xshm &&
|
||||||
dev->area.width == ximagesrc->width &&
|
dev->area.width == ximagesrc->xcontext->width &&
|
||||||
dev->area.height == ximagesrc->height) {
|
dev->area.height == ximagesrc->xcontext->height) {
|
||||||
GST_DEBUG_OBJECT (ximagesrc, "Entire screen was damaged");
|
GST_DEBUG_OBJECT (ximagesrc, "Entire screen was damaged");
|
||||||
XShmGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
XShmGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
ximage->ximage, 0, 0, AllPlanes);
|
ximage->ximage, ximagesrc->startx, ximagesrc->starty, AllPlanes);
|
||||||
/* No need to collect more events */
|
/* No need to collect more events */
|
||||||
while (XPending (ximagesrc->xcontext->disp)) {
|
while (XPending (ximagesrc->xcontext->disp)) {
|
||||||
XNextEvent (ximagesrc->xcontext->disp, &ev);
|
XNextEvent (ximagesrc->xcontext->disp, &ev);
|
||||||
|
@ -409,20 +413,57 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
GST_LOG_OBJECT (ximagesrc,
|
/* if we only want a small area, clip this damage region to
|
||||||
"Retrieving damaged sub-region @ %d,%d size %dx%d",
|
* area we want */
|
||||||
dev->area.x, dev->area.y, dev->area.width, dev->area.height);
|
if (ximagesrc->endx > ximagesrc->startx &&
|
||||||
|
ximagesrc->endy > ximagesrc->starty) {
|
||||||
|
/* see if damage area intersects */
|
||||||
|
if (dev->area.x + dev->area.width < ximagesrc->startx ||
|
||||||
|
dev->area.x > ximagesrc->endx) {
|
||||||
|
/* trivial reject */
|
||||||
|
} else if (dev->area.y + dev->area.height < ximagesrc->starty ||
|
||||||
|
dev->area.y > ximagesrc->endy) {
|
||||||
|
/* trivial reject */
|
||||||
|
} else {
|
||||||
|
/* find intersect region */
|
||||||
|
int startx, starty, width, height;
|
||||||
|
|
||||||
XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
startx = (dev->area.x < ximagesrc->startx) ? ximagesrc->startx :
|
||||||
dev->area.x, dev->area.y,
|
dev->area.x;
|
||||||
dev->area.width, dev->area.height,
|
starty = (dev->area.y < ximagesrc->starty) ? ximagesrc->starty :
|
||||||
AllPlanes, ZPixmap, ximage->ximage, dev->area.x, dev->area.y);
|
dev->area.y;
|
||||||
|
width = (dev->area.x + dev->area.width < ximagesrc->endx) ?
|
||||||
|
dev->area.x + dev->area.width - startx :
|
||||||
|
ximagesrc->endx - startx;
|
||||||
|
height = (dev->area.y + dev->area.height < ximagesrc->endy) ?
|
||||||
|
dev->area.y + dev->area.height - starty : ximagesrc->endy -
|
||||||
|
starty;
|
||||||
|
GST_LOG_OBJECT (ximagesrc,
|
||||||
|
"Retrieving damaged sub-region @ %d,%d size %dx%d as intersect region",
|
||||||
|
startx, starty, width, height);
|
||||||
|
XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
|
startx, starty, width, height, AllPlanes, ZPixmap,
|
||||||
|
ximage->ximage, startx - ximagesrc->startx,
|
||||||
|
starty - ximagesrc->starty);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
GST_LOG_OBJECT (ximagesrc,
|
||||||
|
"Retrieving damaged sub-region @ %d,%d size %dx%d",
|
||||||
|
dev->area.x, dev->area.y, dev->area.width, dev->area.height);
|
||||||
|
|
||||||
|
XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
|
dev->area.x, dev->area.y,
|
||||||
|
dev->area.width, dev->area.height,
|
||||||
|
AllPlanes, ZPixmap, ximage->ximage, dev->area.x, dev->area.y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} while (XPending (ximagesrc->xcontext->disp));
|
} while (XPending (ximagesrc->xcontext->disp));
|
||||||
XDamageSubtract (ximagesrc->xcontext->disp, ximagesrc->damage, None, None);
|
XDamageSubtract (ximagesrc->xcontext->disp, ximagesrc->damage, None, None);
|
||||||
#ifdef HAVE_XFIXES
|
#ifdef HAVE_XFIXES
|
||||||
/* re-get area where last mouse pointer was */
|
/* re-get area where last mouse pointer was but only if in our clipping
|
||||||
|
* bounds */
|
||||||
if (ximagesrc->cursor_image) {
|
if (ximagesrc->cursor_image) {
|
||||||
gint x, y, width, height;
|
gint x, y, width, height;
|
||||||
|
|
||||||
|
@ -436,24 +477,50 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
x = 0;
|
x = 0;
|
||||||
if (y < 0)
|
if (y < 0)
|
||||||
y = 0;
|
y = 0;
|
||||||
if (x + width > ximagesrc->width)
|
if (x + width > ximagesrc->xcontext->width)
|
||||||
width = ximagesrc->width - x;
|
width = ximagesrc->xcontext->width - x;
|
||||||
if (y + height > ximagesrc->height)
|
if (y + height > ximagesrc->xcontext->height)
|
||||||
height = ximagesrc->height - y;
|
height = ximagesrc->xcontext->height - y;
|
||||||
g_assert (x >= 0);
|
g_assert (x >= 0);
|
||||||
g_assert (y >= 0);
|
g_assert (y >= 0);
|
||||||
|
GST_DEBUG_OBJECT (ximagesrc,
|
||||||
|
"Cursor was at (%d,%d) width: %d, height: %d and our range is: (%d,%d) - (%d,%d)",
|
||||||
|
x, y, width, height, ximagesrc->startx, ximagesrc->starty,
|
||||||
|
ximagesrc->endx, ximagesrc->endy);
|
||||||
|
/* only get where cursor last was, if it is in our range */
|
||||||
|
if (ximagesrc->endx > ximagesrc->startx &&
|
||||||
|
ximagesrc->endy > ximagesrc->starty) {
|
||||||
|
/* check bounds */
|
||||||
|
if (x + width < ximagesrc->startx || x > ximagesrc->endx) {
|
||||||
|
/* trivial reject */
|
||||||
|
} else if (y + height < ximagesrc->starty || y > ximagesrc->endy) {
|
||||||
|
/* trivial reject */
|
||||||
|
} else {
|
||||||
|
/* find intersect region */
|
||||||
|
int startx, starty, iwidth, iheight;
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y);
|
startx = (x < ximagesrc->startx) ? ximagesrc->startx : x;
|
||||||
XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
starty = (y < ximagesrc->starty) ? ximagesrc->starty : y;
|
||||||
x, y, width, height, AllPlanes, ZPixmap, ximage->ximage, x, y);
|
iwidth = (x + width < ximagesrc->endx) ?
|
||||||
|
x + width - startx : ximagesrc->endx - startx;
|
||||||
|
iheight = (y + height < ximagesrc->endy) ?
|
||||||
|
y + height - starty : ximagesrc->endy - starty;
|
||||||
|
GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y);
|
||||||
|
XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
|
startx, starty, iwidth, iheight, AllPlanes, ZPixmap,
|
||||||
|
ximage->ximage, startx - ximagesrc->startx,
|
||||||
|
starty - ximagesrc->starty);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
GST_DEBUG_OBJECT (ximagesrc, "Removing cursor from %d,%d", x, y);
|
||||||
|
XGetSubImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
|
x, y, width, height, AllPlanes, ZPixmap, ximage->ximage, x, y);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
} else if (ximagesrc->have_xdamage && ximagesrc->damage) {
|
|
||||||
/* Free up XDamage we allocated earlier when we did not know whether
|
|
||||||
* we wanted to use damage or not */
|
|
||||||
XDamageDestroy (ximagesrc->xcontext->disp, ximagesrc->damage);
|
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -461,14 +528,15 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
if (ximagesrc->xcontext->use_xshm) {
|
if (ximagesrc->xcontext->use_xshm) {
|
||||||
GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XShm");
|
GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XShm");
|
||||||
XShmGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
XShmGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
ximage->ximage, 0, 0, AllPlanes);
|
ximage->ximage, ximagesrc->startx, ximagesrc->starty, AllPlanes);
|
||||||
|
|
||||||
} else
|
} else
|
||||||
#endif /* HAVE_XSHM */
|
#endif /* HAVE_XSHM */
|
||||||
{
|
{
|
||||||
GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XGetImage");
|
GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XGetImage");
|
||||||
ximage->ximage = XGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
ximage->ximage = XGetImage (ximagesrc->xcontext->disp, ximagesrc->xwindow,
|
||||||
0, 0, ximagesrc->width, ximagesrc->height, AllPlanes, ZPixmap);
|
ximagesrc->startx, ximagesrc->starty, ximagesrc->width,
|
||||||
|
ximagesrc->height, AllPlanes, ZPixmap);
|
||||||
}
|
}
|
||||||
#ifdef HAVE_XDAMAGE
|
#ifdef HAVE_XDAMAGE
|
||||||
}
|
}
|
||||||
|
@ -482,6 +550,9 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
ximagesrc->cursor_image = XFixesGetCursorImage (ximagesrc->xcontext->disp);
|
ximagesrc->cursor_image = XFixesGetCursorImage (ximagesrc->xcontext->disp);
|
||||||
if (ximagesrc->cursor_image != NULL) {
|
if (ximagesrc->cursor_image != NULL) {
|
||||||
int cx, cy, i, j, count;
|
int cx, cy, i, j, count;
|
||||||
|
int startx, starty, iwidth, iheight;
|
||||||
|
gboolean clipped = FALSE;
|
||||||
|
gboolean cursor_in_image = TRUE;
|
||||||
|
|
||||||
cx = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot;
|
cx = ximagesrc->cursor_image->x - ximagesrc->cursor_image->xhot;
|
||||||
if (cx < 0)
|
if (cx < 0)
|
||||||
|
@ -490,28 +561,64 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc)
|
||||||
if (cy < 0)
|
if (cy < 0)
|
||||||
cy = 0;
|
cy = 0;
|
||||||
count = ximagesrc->cursor_image->width * ximagesrc->cursor_image->height;
|
count = ximagesrc->cursor_image->width * ximagesrc->cursor_image->height;
|
||||||
for (i = 0; i < count; i++)
|
|
||||||
ximagesrc->cursor_image->pixels[i] =
|
|
||||||
GUINT_TO_LE (ximagesrc->cursor_image->pixels[i]);
|
|
||||||
|
|
||||||
/* copy those pixels across */
|
/* only get where cursor last was, if it is in our range */
|
||||||
for (j = cy;
|
if (ximagesrc->endx > ximagesrc->startx &&
|
||||||
j < cy + ximagesrc->cursor_image->height && j < ximagesrc->height;
|
ximagesrc->endy > ximagesrc->starty) {
|
||||||
j++) {
|
/* check bounds */
|
||||||
for (i = cx;
|
if (cx + ximagesrc->cursor_image->width < ximagesrc->startx ||
|
||||||
i < cx + ximagesrc->cursor_image->width && i < ximagesrc->width;
|
cx > ximagesrc->endx) {
|
||||||
i++) {
|
/* trivial reject */
|
||||||
guint8 *src, *dest;
|
cursor_in_image = FALSE;
|
||||||
|
} else if (cy + ximagesrc->cursor_image->height < ximagesrc->starty ||
|
||||||
|
cy > ximagesrc->endy) {
|
||||||
|
/* trivial reject */
|
||||||
|
cursor_in_image = FALSE;
|
||||||
|
} else {
|
||||||
|
/* find intersect region */
|
||||||
|
|
||||||
src =
|
startx = (cx < ximagesrc->startx) ? ximagesrc->startx : cx;
|
||||||
(guint8 *) & (ximagesrc->cursor_image->pixels[((j -
|
starty = (cy < ximagesrc->starty) ? ximagesrc->starty : cy;
|
||||||
cy) * ximagesrc->cursor_image->width + (i - cx))]);
|
iwidth = (cx + ximagesrc->cursor_image->width < ximagesrc->endx) ?
|
||||||
dest =
|
cx + ximagesrc->cursor_image->width - startx :
|
||||||
(guint8 *) & (ximage->ximage->data[(j * ximagesrc->width +
|
ximagesrc->endx - startx;
|
||||||
i) * (ximagesrc->xcontext->bpp / 8)]);
|
iheight = (cy + ximagesrc->cursor_image->height < ximagesrc->endy) ?
|
||||||
|
cy + ximagesrc->cursor_image->height - starty :
|
||||||
|
ximagesrc->endy - starty;
|
||||||
|
clipped = TRUE;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
startx = cx;
|
||||||
|
starty = cy;
|
||||||
|
iwidth = ximagesrc->cursor_image->width;
|
||||||
|
iheight = ximagesrc->cursor_image->height;
|
||||||
|
}
|
||||||
|
|
||||||
composite_pixel (ximagesrc->xcontext, (guint8 *) dest,
|
if (cursor_in_image) {
|
||||||
(guint8 *) src);
|
GST_DEBUG_OBJECT (ximagesrc, "Cursor is in image so trying to draw it");
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
ximagesrc->cursor_image->pixels[i] =
|
||||||
|
GUINT_TO_LE (ximagesrc->cursor_image->pixels[i]);
|
||||||
|
|
||||||
|
/* copy those pixels across */
|
||||||
|
for (j = starty;
|
||||||
|
j < starty + iheight && j - starty < ximagesrc->height; j++) {
|
||||||
|
for (i = startx;
|
||||||
|
i < startx + iwidth && i - startx < ximagesrc->width; i++) {
|
||||||
|
guint8 *src, *dest;
|
||||||
|
|
||||||
|
src =
|
||||||
|
(guint8 *) & (ximagesrc->cursor_image->pixels[((j -
|
||||||
|
cy) * ximagesrc->cursor_image->width + (i - cx))]);
|
||||||
|
dest =
|
||||||
|
(guint8 *) & (ximage->ximage->data[((j -
|
||||||
|
ximagesrc->starty) * ximagesrc->width + (i -
|
||||||
|
ximagesrc->startx)) * (ximagesrc->xcontext->bpp /
|
||||||
|
8)]);
|
||||||
|
|
||||||
|
composite_pixel (ximagesrc->xcontext, (guint8 *) dest,
|
||||||
|
(guint8 *) src);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -630,6 +737,18 @@ gst_ximage_src_set_property (GObject * object, guint prop_id,
|
||||||
case PROP_USE_DAMAGE:
|
case PROP_USE_DAMAGE:
|
||||||
src->use_damage = g_value_get_boolean (value);
|
src->use_damage = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_STARTX:
|
||||||
|
src->startx = g_value_get_uint (value);
|
||||||
|
break;
|
||||||
|
case PROP_STARTY:
|
||||||
|
src->starty = g_value_get_uint (value);
|
||||||
|
break;
|
||||||
|
case PROP_ENDX:
|
||||||
|
src->endx = g_value_get_uint (value);
|
||||||
|
break;
|
||||||
|
case PROP_ENDY:
|
||||||
|
src->endy = g_value_get_uint (value);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -657,6 +776,19 @@ gst_ximage_src_get_property (GObject * object, guint prop_id, GValue * value,
|
||||||
break;
|
break;
|
||||||
case PROP_USE_DAMAGE:
|
case PROP_USE_DAMAGE:
|
||||||
g_value_set_boolean (value, src->use_damage);
|
g_value_set_boolean (value, src->use_damage);
|
||||||
|
break;
|
||||||
|
case PROP_STARTX:
|
||||||
|
g_value_set_uint (value, src->startx);
|
||||||
|
break;
|
||||||
|
case PROP_STARTY:
|
||||||
|
g_value_set_uint (value, src->starty);
|
||||||
|
break;
|
||||||
|
case PROP_ENDX:
|
||||||
|
g_value_set_uint (value, src->endx);
|
||||||
|
break;
|
||||||
|
case PROP_ENDY:
|
||||||
|
g_value_set_uint (value, src->endy);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -713,6 +845,7 @@ gst_ximage_src_get_caps (GstBaseSrc * bs)
|
||||||
{
|
{
|
||||||
GstXImageSrc *s = GST_XIMAGE_SRC (bs);
|
GstXImageSrc *s = GST_XIMAGE_SRC (bs);
|
||||||
GstXContext *xcontext;
|
GstXContext *xcontext;
|
||||||
|
gint x, y, width, height;
|
||||||
|
|
||||||
if ((!s->xcontext) && (!gst_ximage_src_open_display (s, NULL)))
|
if ((!s->xcontext) && (!gst_ximage_src_open_display (s, NULL)))
|
||||||
return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC (s)->
|
return gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC (s)->
|
||||||
|
@ -724,6 +857,34 @@ gst_ximage_src_get_caps (GstBaseSrc * bs)
|
||||||
|
|
||||||
xcontext = s->xcontext;
|
xcontext = s->xcontext;
|
||||||
|
|
||||||
|
x = y = 0;
|
||||||
|
width = xcontext->width;
|
||||||
|
height = xcontext->height;
|
||||||
|
if (s->endx > s->startx && s->endy > s->starty) {
|
||||||
|
/* this means user has put in values */
|
||||||
|
if (s->startx < xcontext->width && s->endx < xcontext->width &&
|
||||||
|
s->starty < xcontext->height && s->endy < xcontext->height) {
|
||||||
|
/* values are fine */
|
||||||
|
x = s->startx;
|
||||||
|
y = s->starty;
|
||||||
|
s->width = width = s->endx - s->startx;
|
||||||
|
s->height = height = s->endy - s->starty;
|
||||||
|
} else {
|
||||||
|
GST_WARNING
|
||||||
|
("User put in co-ordinates overshooting the X resolution, setting to full screen");
|
||||||
|
s->startx = 0;
|
||||||
|
s->starty = 0;
|
||||||
|
s->endx = 0;
|
||||||
|
s->endy = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GST_WARNING ("User put in bogus co-ordinates, setting to full screen");
|
||||||
|
s->startx = 0;
|
||||||
|
s->starty = 0;
|
||||||
|
s->endx = 0;
|
||||||
|
s->endy = 0;
|
||||||
|
}
|
||||||
|
GST_DEBUG ("width = %d, height=%d", width, height);
|
||||||
return gst_caps_new_simple ("video/x-raw-rgb",
|
return gst_caps_new_simple ("video/x-raw-rgb",
|
||||||
"bpp", G_TYPE_INT, xcontext->bpp,
|
"bpp", G_TYPE_INT, xcontext->bpp,
|
||||||
"depth", G_TYPE_INT, xcontext->depth,
|
"depth", G_TYPE_INT, xcontext->depth,
|
||||||
|
@ -731,8 +892,8 @@ gst_ximage_src_get_caps (GstBaseSrc * bs)
|
||||||
"red_mask", G_TYPE_INT, xcontext->r_mask_output,
|
"red_mask", G_TYPE_INT, xcontext->r_mask_output,
|
||||||
"green_mask", G_TYPE_INT, xcontext->g_mask_output,
|
"green_mask", G_TYPE_INT, xcontext->g_mask_output,
|
||||||
"blue_mask", G_TYPE_INT, xcontext->b_mask_output,
|
"blue_mask", G_TYPE_INT, xcontext->b_mask_output,
|
||||||
"width", G_TYPE_INT, xcontext->width,
|
"width", G_TYPE_INT, width,
|
||||||
"height", G_TYPE_INT, xcontext->height,
|
"height", G_TYPE_INT, height,
|
||||||
"framerate", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1,
|
"framerate", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1,
|
||||||
"pixel-aspect-ratio", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1,
|
"pixel-aspect-ratio", GST_TYPE_FRACTION_RANGE, 1, G_MAXINT, G_MAXINT, 1,
|
||||||
NULL);
|
NULL);
|
||||||
|
@ -799,10 +960,26 @@ gst_ximage_src_class_init (GstXImageSrcClass * klass)
|
||||||
g_param_spec_boolean ("show_pointer", "Show Mouse Pointer",
|
g_param_spec_boolean ("show_pointer", "Show Mouse Pointer",
|
||||||
"Show mouse pointer (if XFixes extension enabled)", TRUE,
|
"Show mouse pointer (if XFixes extension enabled)", TRUE,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
g_object_class_install_property (gc, PROP_SHOW_POINTER,
|
g_object_class_install_property (gc, PROP_USE_DAMAGE,
|
||||||
g_param_spec_boolean ("use_damage", "Use XDamage",
|
g_param_spec_boolean ("use_damage", "Use XDamage",
|
||||||
"Use XDamage (if XDamage extension enabled)", TRUE,
|
"Use XDamage (if XDamage extension enabled)", TRUE,
|
||||||
G_PARAM_READWRITE));
|
G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gc, PROP_STARTX,
|
||||||
|
g_param_spec_uint ("startx", "Start X co-ordinate",
|
||||||
|
"X coordinate of top left corner of area to be recorded (0 for top left of screen)",
|
||||||
|
0, G_MAXINT, 0, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gc, PROP_STARTY,
|
||||||
|
g_param_spec_uint ("starty", "Start Y co-ordinate",
|
||||||
|
"Y coordinate of top left corner of area to be recorded (0 for top left of screen)",
|
||||||
|
0, G_MAXINT, 0, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gc, PROP_ENDX,
|
||||||
|
g_param_spec_uint ("endx", "End X",
|
||||||
|
"X coordinate of bottom right corner of area to be recorded (0 for bottom right of screen)",
|
||||||
|
0, G_MAXINT, 0, G_PARAM_READWRITE));
|
||||||
|
g_object_class_install_property (gc, PROP_ENDY,
|
||||||
|
g_param_spec_uint ("endy", "End Y",
|
||||||
|
"Y coordinate of bottom right corner of area to be recorded (0 for bottom right of screen)",
|
||||||
|
0, G_MAXINT, 0, G_PARAM_READWRITE));
|
||||||
|
|
||||||
parent_class = g_type_class_peek_parent (klass);
|
parent_class = g_type_class_peek_parent (klass);
|
||||||
|
|
||||||
|
@ -825,6 +1002,10 @@ gst_ximage_src_init (GstXImageSrc * ximagesrc, GstXImageSrcClass * klass)
|
||||||
ximagesrc->x_lock = g_mutex_new ();
|
ximagesrc->x_lock = g_mutex_new ();
|
||||||
ximagesrc->show_pointer = TRUE;
|
ximagesrc->show_pointer = TRUE;
|
||||||
ximagesrc->use_damage = TRUE;
|
ximagesrc->use_damage = TRUE;
|
||||||
|
ximagesrc->startx = 0;
|
||||||
|
ximagesrc->starty = 0;
|
||||||
|
ximagesrc->endx = 0;
|
||||||
|
ximagesrc->endy = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
|
|
@ -76,6 +76,13 @@ struct _GstXImageSrc
|
||||||
gboolean have_xdamage;
|
gboolean have_xdamage;
|
||||||
gboolean show_pointer;
|
gboolean show_pointer;
|
||||||
gboolean use_damage;
|
gboolean use_damage;
|
||||||
|
|
||||||
|
/* co-ordinates for start and end */
|
||||||
|
guint startx;
|
||||||
|
guint starty;
|
||||||
|
guint endx;
|
||||||
|
guint endy;
|
||||||
|
|
||||||
#ifdef HAVE_XFIXES
|
#ifdef HAVE_XFIXES
|
||||||
int fixes_event_base;
|
int fixes_event_base;
|
||||||
XFixesCursorImage *cursor_image;
|
XFixesCursorImage *cursor_image;
|
||||||
|
|
Loading…
Reference in a new issue