summaryrefslogtreecommitdiffstats
path: root/gst
diff options
context:
space:
mode:
authorThijs Vermeir <thijsvermeir@gmail.com>2007-11-15 15:32:47 +0000
committerThijs Vermeir <thijsvermeir@gmail.com>2007-11-15 15:32:47 +0000
commit621a4e4792bbc0d5b3a338024a3ce6c4053177f3 (patch)
tree32a87945edbac07dc1a79aa33f4a028eaf590707 /gst
parent88f5ef13bf5e8203b88b21fd2392b639a0161665 (diff)
downloadgst-plugins-bad-621a4e4792bbc0d5b3a338024a3ce6c4053177f3.tar.gz
gst-plugins-bad-621a4e4792bbc0d5b3a338024a3ce6c4053177f3.tar.bz2
gst-plugins-bad-621a4e4792bbc0d5b3a338024a3ce6c4053177f3.zip
gst/librfb/gstrfbsrc.c: don't forget to handle the offset's
Original commit message from CVS: * gst/librfb/gstrfbsrc.c: don't forget to handle the offset's * gst/librfb/rfbdecoder.c: * gst/librfb/rfbdecoder.h: precalculate some many used values
Diffstat (limited to 'gst')
-rw-r--r--gst/librfb/gstrfbsrc.c16
-rw-r--r--gst/librfb/rfbdecoder.c46
-rw-r--r--gst/librfb/rfbdecoder.h4
3 files changed, 39 insertions, 27 deletions
diff --git a/gst/librfb/gstrfbsrc.c b/gst/librfb/gstrfbsrc.c
index 0f4af6c1..1106cbe4 100644
--- a/gst/librfb/gstrfbsrc.c
+++ b/gst/librfb/gstrfbsrc.c
@@ -337,14 +337,18 @@ gst_rfb_src_start (GstBaseSrc * bsrc)
decoder->prev_frame = g_malloc (bsrc->blocksize);
decoder->decoder_private = src;
+ /* calculate some many used values */
+ decoder->bytespp = decoder->bpp / 8;
+ decoder->line_size = decoder->rect_width * decoder->bytespp;
+
GST_DEBUG_OBJECT (src, "setting caps width to %d and height to %d",
- decoder->width, decoder->height);
+ decoder->rect_width, decoder->rect_height);
caps =
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SRC_PAD (bsrc)));
- gst_caps_set_simple (caps, "width", G_TYPE_INT, decoder->width, "height",
- G_TYPE_INT, decoder->height, "bpp", G_TYPE_INT, decoder->bpp, "depth",
- G_TYPE_INT, decoder->depth, "endianness", G_TYPE_INT,
+ gst_caps_set_simple (caps, "width", G_TYPE_INT, decoder->rect_width, "height",
+ G_TYPE_INT, decoder->rect_height, "bpp", G_TYPE_INT, decoder->bpp,
+ "depth", G_TYPE_INT, decoder->depth, "endianness", G_TYPE_INT,
(decoder->big_endian ? 1234 : 4321), NULL);
gst_pad_set_caps (GST_BASE_SRC_PAD (bsrc), caps);
gst_caps_unref (caps);
@@ -425,6 +429,10 @@ gst_rfb_src_event (GstBaseSrc * bsrc, GstEvent * event)
gst_structure_get_double (structure, "pointer_y", &y);
button = 0;
+ /* we need to take care of the offset's */
+ x += src->decoder->offset_x;
+ y += src->decoder->offset_y;
+
if (strcmp (event_type, "key-press") == 0) {
const gchar *key = gst_structure_get_string (structure, "key");
diff --git a/gst/librfb/rfbdecoder.c b/gst/librfb/rfbdecoder.c
index 1cc43b09..7be4c480 100644
--- a/gst/librfb/rfbdecoder.c
+++ b/gst/librfb/rfbdecoder.c
@@ -641,23 +641,22 @@ rfb_decoder_raw_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
{
gint size;
guint8 *frame, *buffer, *p;
- guint32 raw_line_size, line_size;
+ guint32 raw_line_size;
- size = rect_h * rect_w * decoder->bpp / 8;
+ raw_line_size = rect_w * decoder->bytespp;
+ size = rect_h * raw_line_size;
GST_DEBUG ("Reading %d bytes", size);
buffer = rfb_decoder_read (decoder, size);
- line_size = decoder->rect_width * decoder->bpp / 8;
- raw_line_size = rect_w * decoder->bpp / 8;
frame =
decoder->frame + (((start_y * decoder->rect_width) +
- start_x) * decoder->bpp / 8);
+ start_x) * decoder->bytespp);
p = buffer;
while (rect_h--) {
memcpy (frame, p, raw_line_size);
p += raw_line_size;
- frame += line_size;
+ frame += decoder->line_size;
}
g_free (buffer);
@@ -668,29 +667,30 @@ rfb_decoder_copyrect_encoding (RfbDecoder * decoder, gint start_x, gint start_y,
gint rect_w, gint rect_h)
{
guint16 src_x, src_y;
- guint32 src_offset;
- guint32 dst_offset;
- gint pos_y, max_y, line_width, copyrect_width;
+ gint line_width, copyrect_width;
guint8 *buffer;
+ guint8 *src, *dst;
buffer = rfb_decoder_read (decoder, 4);
- max_y = start_y + rect_h;
- src_x = RFB_GET_UINT16 (buffer);
- src_y = RFB_GET_UINT16 (buffer + 2);
+ /* don't forget the offset */
+ src_x = RFB_GET_UINT16 (buffer) - decoder->offset_x;
+ src_y = RFB_GET_UINT16 (buffer + 2) - decoder->offset_y;
GST_DEBUG ("Copyrect from %d %d", src_x, src_y);
- dst_offset =
- (((start_y - 1) * decoder->rect_width) + start_x) * decoder->bpp / 8;
- src_offset = (((src_y - 1) * decoder->rect_width) + src_x) * decoder->bpp / 8;
- line_width = decoder->rect_width * decoder->bpp / 8;
- copyrect_width = rect_w * decoder->bpp / 8;
-
- for (pos_y = start_y; pos_y < max_y; pos_y++) {
- dst_offset += line_width;
- src_offset += line_width;
- memcpy (decoder->frame + dst_offset, decoder->prev_frame + src_offset,
- copyrect_width);
+ copyrect_width = rect_w * decoder->bytespp;
+ line_width = decoder->line_size;
+ src =
+ decoder->prev_frame + ((src_y * decoder->rect_width) +
+ src_x) * decoder->bytespp;
+ dst =
+ decoder->frame + ((start_y * decoder->rect_width) +
+ start_x) * decoder->bytespp;
+
+ while (rect_h--) {
+ memcpy (dst, src, copyrect_width);
+ src += line_width;
+ dst += line_width;
}
g_free (buffer);
diff --git a/gst/librfb/rfbdecoder.h b/gst/librfb/rfbdecoder.h
index 8ec94bd2..dca8d192 100644
--- a/gst/librfb/rfbdecoder.h
+++ b/gst/librfb/rfbdecoder.h
@@ -69,6 +69,10 @@ struct _RfbDecoder
guint rect_height;
gint n_rects;
+
+ /* some many used values */
+ guint bytespp;
+ guint line_size;
};
#if 0