From 20bc2905bb24f39e1d9b4d580cdff1c4c86fb418 Mon Sep 17 00:00:00 2001 From: Zaheer Abbas Merali Date: Fri, 11 May 2007 10:31:27 +0000 Subject: sys/ximage/gstximagesrc.c (gst_ximage_src_start, gst_ximage_src_ximage_get): Original commit message from CVS: * sys/ximage/gstximagesrc.c (gst_ximage_src_start, gst_ximage_src_ximage_get): * sys/ximage/gstximagesrc.h (last_ximage): When using Damage actually keep the last frame, and not assume that the buffer we get already has the last frame on it. Copy the cursor over if we specify a non-zero start x and start y. --- sys/ximage/gstximagesrc.c | 56 ++++++++++++++++++++++++++++++++++++++++++----- sys/ximage/gstximagesrc.h | 1 + 2 files changed, 52 insertions(+), 5 deletions(-) (limited to 'sys/ximage') diff --git a/sys/ximage/gstximagesrc.c b/sys/ximage/gstximagesrc.c index bff49887..fd814c4a 100644 --- a/sys/ximage/gstximagesrc.c +++ b/sys/ximage/gstximagesrc.c @@ -205,7 +205,9 @@ gst_ximage_src_start (GstBaseSrc * basesrc) GstXImageSrc *s = GST_XIMAGE_SRC (basesrc); s->last_frame_no = -1; - +#ifdef HAVE_XDAMAGE + s->last_ximage = NULL; +#endif return gst_ximage_src_open_display (s, NULL); } @@ -400,6 +402,10 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) if (ximagesrc->have_xdamage && ximagesrc->use_damage) { XEvent ev; + /* have_frame is TRUE when either the entire screen has been + * grabbed or when the last image has been copied */ + gboolean have_frame = FALSE; + GST_DEBUG_OBJECT (ximagesrc, "Retrieving screen using XDamage"); do { @@ -418,6 +424,7 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) while (XPending (ximagesrc->xcontext->disp)) { XNextEvent (ximagesrc->xcontext->disp, &ev); } + have_frame = TRUE; break; } else #endif @@ -447,6 +454,16 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) height = (dev->area.y + dev->area.height < ximagesrc->endy) ? dev->area.y + dev->area.height - starty : ximagesrc->endy - starty; + if (!have_frame) { + GST_LOG_OBJECT (ximagesrc, + "Copying from last frame ximage->size: %d", + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), + GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + have_frame = TRUE; + } + GST_LOG_OBJECT (ximagesrc, "Retrieving damaged sub-region @ %d,%d size %dx%d as intersect region", startx, starty, width, height); @@ -456,6 +473,15 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) starty - ximagesrc->starty); } } else { + if (!have_frame) { + GST_LOG_OBJECT (ximagesrc, + "Copying from last frame ximage->size: %d", + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), + GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + have_frame = TRUE; + } GST_LOG_OBJECT (ximagesrc, "Retrieving damaged sub-region @ %d,%d size %dx%d", @@ -470,6 +496,15 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) } } while (XPending (ximagesrc->xcontext->disp)); XDamageSubtract (ximagesrc->xcontext->disp, ximagesrc->damage, None, None); + if (!have_frame) { + GST_LOG_OBJECT (ximagesrc, + "Copying from last frame ximage->size: %d", + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + memcpy (GST_BUFFER_DATA (GST_BUFFER (ximage)), + GST_BUFFER_DATA (GST_BUFFER (ximagesrc->last_ximage)), + GST_BUFFER_SIZE (GST_BUFFER (ximage))); + have_frame = TRUE; + } #ifdef HAVE_XFIXES /* re-get area where last mouse pointer was but only if in our clipping * bounds */ @@ -608,10 +643,11 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) 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 < ximagesrc->height; j++) { - for (i = startx; i < startx + iwidth && i < ximagesrc->width; i++) { + 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 = @@ -631,7 +667,17 @@ gst_ximage_src_ximage_get (GstXImageSrc * ximagesrc) } } #endif - +#ifdef HAVE_XDAMAGE + if (ximagesrc->have_xdamage && ximagesrc->use_damage) { + /* need to ref ximage to put in last_ximage */ + gst_buffer_ref (GST_BUFFER (ximage)); + if (ximagesrc->last_ximage) { + gst_buffer_unref (GST_BUFFER (ximagesrc->last_ximage)); + } + ximagesrc->last_ximage = ximage; + GST_LOG_OBJECT (ximagesrc, "reffing current buffer for last_ximage"); + } +#endif return ximage; } diff --git a/sys/ximage/gstximagesrc.h b/sys/ximage/gstximagesrc.h index c56870c2..f223d1e7 100644 --- a/sys/ximage/gstximagesrc.h +++ b/sys/ximage/gstximagesrc.h @@ -92,6 +92,7 @@ struct _GstXImageSrc int damage_event_base; XserverRegion damage_region; GC damage_copy_gc; + GstXImageSrcBuffer *last_ximage; #endif }; -- cgit