From ada7510fd7cbea1ed43523e04121fa1046e81378 Mon Sep 17 00:00:00 2001 From: Thijs Vermeir Date: Fri, 21 Sep 2007 14:55:19 +0000 Subject: gst/librfb/: Added offset-x, offset-y, width and height property for selecting a region from the screen Original commit message from CVS: * gst/librfb/gstrfbsrc.c: * gst/librfb/rfbdecoder.c: * gst/librfb/rfbdecoder.h: Added offset-x, offset-y, width and height property for selecting a region from the screen --- gst/librfb/gstrfbsrc.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- gst/librfb/rfbdecoder.c | 40 ++++++++++++++++++++++++++++++++++++++-- gst/librfb/rfbdecoder.h | 6 ++++++ 3 files changed, 88 insertions(+), 5 deletions(-) (limited to 'gst') diff --git a/gst/librfb/gstrfbsrc.c b/gst/librfb/gstrfbsrc.c index a4323815..b207030e 100644 --- a/gst/librfb/gstrfbsrc.c +++ b/gst/librfb/gstrfbsrc.c @@ -38,6 +38,10 @@ enum ARG_PORT, ARG_VERSION, ARG_PASSWORD, + ARG_OFFSET_X, + ARG_OFFSET_Y, + ARG_WIDTH, + ARG_HEIGHT, }; GST_DEBUG_CATEGORY_STATIC (rfbsrc_debug); @@ -122,6 +126,18 @@ gst_rfb_src_class_init (GstRfbSrcClass * klass) g_object_class_install_property (gobject_class, ARG_PASSWORD, g_param_spec_string ("password", "Password for authentication", "Password for authentication", "", G_PARAM_WRITABLE)); + g_object_class_install_property (gobject_class, ARG_OFFSET_X, + g_param_spec_int ("offset-x", "x offset for screen scrapping", + "x offset for screen scrapping", 0, 65535, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_OFFSET_Y, + g_param_spec_int ("offset-y", "y offset for screen scrapping", + "y offset for screen scrapping", 0, 65535, 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_WIDTH, + g_param_spec_int ("width", "width of screen", "width of screen", 0, 65535, + 0, G_PARAM_READWRITE)); + g_object_class_install_property (gobject_class, ARG_HEIGHT, + g_param_spec_int ("height", "height of screen", "height of screen", 0, + 65535, 0, G_PARAM_READWRITE)); gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_rfb_src_start); gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_rfb_src_stop); @@ -222,6 +238,18 @@ gst_rfb_src_set_property (GObject * object, guint prop_id, g_free (src->decoder->password); src->decoder->password = g_strdup (g_value_get_string (value)); break; + case ARG_OFFSET_X: + src->decoder->offset_x = g_value_get_int (value); + break; + case ARG_OFFSET_Y: + src->decoder->offset_y = g_value_get_int (value); + break; + case ARG_WIDTH: + src->decoder->rect_width = g_value_get_int (value); + break; + case ARG_HEIGHT: + src->decoder->rect_height = g_value_get_int (value); + break; default: break; } @@ -246,6 +274,18 @@ gst_rfb_src_get_property (GObject * object, guint prop_id, g_value_set_string (value, version); g_free (version); break; + case ARG_OFFSET_X: + g_value_set_int (value, src->decoder->offset_x); + break; + case ARG_OFFSET_Y: + g_value_set_int (value, src->decoder->offset_y); + break; + case ARG_WIDTH: + g_value_set_int (value, src->decoder->rect_width); + break; + case ARG_HEIGHT: + g_value_set_int (value, src->decoder->rect_height); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -270,7 +310,6 @@ gst_rfb_src_start (GstBaseSrc * bsrc) return FALSE; } - src->decoder = decoder; src->inter = FALSE; while (!decoder->inited) { @@ -322,8 +361,10 @@ gst_rfb_src_create (GstPushSrc * psrc, GstBuffer ** outbuf) gulong newsize; GstFlowReturn ret; - rfb_decoder_send_update_request (decoder, src->inter, 0, 0, - decoder->width, decoder->height); + rfb_decoder_send_update_request (decoder, src->inter, decoder->offset_x, + decoder->offset_y, + (decoder->rect_width ? decoder->rect_width : decoder->width), + (decoder->rect_height ? decoder->rect_height : decoder->height)); // src->inter = TRUE; src->go = TRUE; diff --git a/gst/librfb/rfbdecoder.c b/gst/librfb/rfbdecoder.c index 3d150dbe..4ea3910b 100644 --- a/gst/librfb/rfbdecoder.c +++ b/gst/librfb/rfbdecoder.c @@ -62,6 +62,11 @@ rfb_decoder_new (void) decoder->password = NULL; + decoder->offset_x = 0; + decoder->offset_y = 0; + decoder->rect_width = 0; + decoder->rect_height = 0; + return decoder; } @@ -453,6 +458,37 @@ rfb_decoder_state_wait_for_server_initialisation (RfbDecoder * decoder) decoder->state = rfb_decoder_state_normal; decoder->inited = TRUE; + /* check if we need cropping */ + + if (decoder->offset_x > 0) { + if (decoder->offset_x > decoder->width) { + GST_WARNING ("Trying to crop more than the width of the server"); + } else { + decoder->width -= decoder->offset_x; + } + } + if (decoder->offset_y > 0) { + if (decoder->offset_y > decoder->height) { + GST_WARNING ("Trying to crop more than the height of the server"); + } else { + decoder->height -= decoder->offset_y; + } + } + if (decoder->rect_width > 0) { + if (decoder->rect_width > decoder->width) { + GST_WARNING ("Trying to crop more than the width of the server"); + } else { + decoder->width = decoder->rect_width; + } + } + if (decoder->rect_height > 0) { + if (decoder->rect_height > decoder->height) { + GST_WARNING ("Trying to crop more than the height of the server"); + } else { + decoder->height = decoder->rect_height; + } + } + return TRUE; } @@ -547,8 +583,8 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder) buffer = rfb_decoder_read (decoder, 12); - x = RFB_GET_UINT16 (buffer + 0); - y = RFB_GET_UINT16 (buffer + 2); + x = RFB_GET_UINT16 (buffer + 0) - decoder->offset_x; + y = RFB_GET_UINT16 (buffer + 2) - decoder->offset_y; w = RFB_GET_UINT16 (buffer + 4); h = RFB_GET_UINT16 (buffer + 6); encoding = RFB_GET_UINT32 (buffer + 8); diff --git a/gst/librfb/rfbdecoder.h b/gst/librfb/rfbdecoder.h index 9d1778f6..d6fec5f6 100644 --- a/gst/librfb/rfbdecoder.h +++ b/gst/librfb/rfbdecoder.h @@ -63,6 +63,12 @@ struct _RfbDecoder gchar *name; + /* information if we don't want to update the whole screen */ + guint offset_x; + guint offset_y; + guint rect_width; + guint rect_height; + gint n_rects; }; -- cgit v1.2.1