int main (int argc, char *argv[]) { RfbDecoder *decoder; // int fd = 0; decoder = rfb_decoder_new (); rfb_decoder_connect_tcp (decoder, "127.0.0.1", 5901); // rfb_decoder_use_file_descriptor (decoder, fd); while (!decoder->inited) rfb_decoder_iterate (decoder); rfb_decoder_send_update_request (decoder, FALSE, 0, 0, 100, 100); while (1) { rfb_decoder_iterate (decoder); } return 0; }
static gboolean gst_rfb_src_negotiate (GstBaseSrc * bsrc) { GstRfbSrc *src = GST_RFB_SRC (bsrc); RfbDecoder *decoder; GstCaps *caps; GstVideoInfo vinfo; GstVideoFormat vformat; guint32 red_mask, green_mask, blue_mask; gchar *stream_id = NULL; GstEvent *stream_start = NULL; decoder = src->decoder; if (decoder->inited) return TRUE; GST_DEBUG_OBJECT (src, "connecting to host %s on port %d", src->host, src->port); if (!rfb_decoder_connect_tcp (decoder, src->host, src->port)) { if (decoder->error != NULL) { GST_ELEMENT_ERROR (src, RESOURCE, READ, ("Could not connect to VNC server %s on port %d: %s", src->host, src->port, decoder->error->message), (NULL)); } else { GST_ELEMENT_ERROR (src, RESOURCE, READ, ("Could not connect to VNC server %s on port %d", src->host, src->port), (NULL)); } return FALSE; } while (!decoder->inited) { if (!rfb_decoder_iterate (decoder)) { if (decoder->error != NULL) { GST_ELEMENT_ERROR (src, RESOURCE, READ, ("Failed to setup VNC connection to host %s on port %d: %s", src->host, src->port, decoder->error->message), (NULL)); } else { GST_ELEMENT_ERROR (src, RESOURCE, READ, ("Failed to setup VNC connection to host %s on port %d", src->host, src->port), (NULL)); } return FALSE; } } stream_id = gst_pad_create_stream_id_printf (GST_BASE_SRC_PAD (bsrc), GST_ELEMENT (src), "%s:%d", src->host, src->port); stream_start = gst_event_new_stream_start (stream_id); g_free (stream_id); gst_pad_push_event (GST_BASE_SRC_PAD (bsrc), stream_start); decoder->rect_width = (decoder->rect_width ? decoder->rect_width : decoder->width); decoder->rect_height = (decoder->rect_height ? decoder->rect_height : decoder->height); 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->rect_width, decoder->rect_height); red_mask = decoder->red_max << decoder->red_shift; green_mask = decoder->green_max << decoder->green_shift; blue_mask = decoder->blue_max << decoder->blue_shift; vformat = gst_video_format_from_masks (decoder->depth, decoder->bpp, decoder->big_endian ? G_BIG_ENDIAN : G_LITTLE_ENDIAN, red_mask, green_mask, blue_mask, 0); gst_video_info_init (&vinfo); gst_video_info_set_format (&vinfo, vformat, decoder->rect_width, decoder->rect_height); decoder->frame = g_malloc (vinfo.size); if (decoder->use_copyrect) decoder->prev_frame = g_malloc (vinfo.size); caps = gst_video_info_to_caps (&vinfo); gst_base_src_set_caps (bsrc, caps); gst_caps_unref (caps); return TRUE; }