mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-10-03 17:22:29 +00:00
rfbsrc: Add a internal method to disconnect
This also removes the disconnected boolean hack.
This commit is contained in:
parent
ff5dc55c8a
commit
ba93b86011
3 changed files with 28 additions and 18 deletions
|
@ -516,10 +516,7 @@ gst_rfb_src_stop (GstBaseSrc * bsrc)
|
||||||
{
|
{
|
||||||
GstRfbSrc *src = GST_RFB_SRC (bsrc);
|
GstRfbSrc *src = GST_RFB_SRC (bsrc);
|
||||||
|
|
||||||
if (src->decoder->connection) {
|
rfb_decoder_disconnect (src->decoder);
|
||||||
g_object_unref (src->decoder->connection);
|
|
||||||
src->decoder->connection = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (src->decoder->frame) {
|
if (src->decoder->frame) {
|
||||||
g_free (src->decoder->frame);
|
g_free (src->decoder->frame);
|
||||||
|
|
|
@ -64,7 +64,6 @@ rfb_decoder_new (void)
|
||||||
decoder->rect_width = 0;
|
decoder->rect_width = 0;
|
||||||
decoder->rect_height = 0;
|
decoder->rect_height = 0;
|
||||||
decoder->shared_flag = TRUE;
|
decoder->shared_flag = TRUE;
|
||||||
decoder->disconnected = FALSE;
|
|
||||||
decoder->data = NULL;
|
decoder->data = NULL;
|
||||||
decoder->data_len = 0;
|
decoder->data_len = 0;
|
||||||
decoder->error = NULL;
|
decoder->error = NULL;
|
||||||
|
@ -79,16 +78,10 @@ rfb_decoder_free (RfbDecoder * decoder)
|
||||||
{
|
{
|
||||||
g_return_if_fail (decoder != NULL);
|
g_return_if_fail (decoder != NULL);
|
||||||
|
|
||||||
if (decoder->cancellable) {
|
rfb_decoder_disconnect (decoder);
|
||||||
g_cancellable_cancel (decoder->cancellable);
|
|
||||||
g_object_unref (decoder->cancellable);
|
|
||||||
decoder->cancellable = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_clear_object (&decoder->connection);
|
|
||||||
g_clear_object (&decoder->socket_client);
|
g_clear_object (&decoder->socket_client);
|
||||||
g_clear_error (&decoder->error);
|
g_clear_object (&decoder->cancellable);
|
||||||
g_free (decoder->data);
|
|
||||||
g_mutex_clear (&decoder->write_lock);
|
g_mutex_clear (&decoder->write_lock);
|
||||||
g_free (decoder);
|
g_free (decoder);
|
||||||
}
|
}
|
||||||
|
@ -105,6 +98,8 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port)
|
||||||
g_return_val_if_fail (decoder->connection == NULL, FALSE);
|
g_return_val_if_fail (decoder->connection == NULL, FALSE);
|
||||||
g_return_val_if_fail (host != NULL, FALSE);
|
g_return_val_if_fail (host != NULL, FALSE);
|
||||||
|
|
||||||
|
g_cancellable_reset (decoder->cancellable);
|
||||||
|
|
||||||
connection =
|
connection =
|
||||||
g_socket_client_connect_to_host (decoder->socket_client, host, port,
|
g_socket_client_connect_to_host (decoder->socket_client, host, port,
|
||||||
decoder->cancellable, &err);
|
decoder->cancellable, &err);
|
||||||
|
@ -113,7 +108,6 @@ rfb_decoder_connect_tcp (RfbDecoder * decoder, gchar * host, guint port)
|
||||||
goto connect_failed;
|
goto connect_failed;
|
||||||
|
|
||||||
decoder->connection = connection;
|
decoder->connection = connection;
|
||||||
decoder->disconnected = FALSE;
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
@ -134,6 +128,27 @@ connect_failed:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
rfb_decoder_disconnect (RfbDecoder * decoder)
|
||||||
|
{
|
||||||
|
GST_DEBUG ("Disconnecting from the rfb server");
|
||||||
|
|
||||||
|
g_return_if_fail (decoder);
|
||||||
|
g_return_if_fail (decoder->cancellable);
|
||||||
|
|
||||||
|
g_cancellable_cancel (decoder->cancellable);
|
||||||
|
|
||||||
|
/* Make sure threaded write a done first, this avoids race condition,
|
||||||
|
* specially when the decoder is freed */
|
||||||
|
g_mutex_lock (&decoder->write_lock);
|
||||||
|
|
||||||
|
g_clear_object (&decoder->connection);
|
||||||
|
g_clear_error (&decoder->error);
|
||||||
|
g_clear_pointer (&decoder->data, g_free);
|
||||||
|
|
||||||
|
g_mutex_unlock (&decoder->write_lock);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* rfb_decoder_iterate:
|
* rfb_decoder_iterate:
|
||||||
* @decoder: The rfb context
|
* @decoder: The rfb context
|
||||||
|
@ -205,7 +220,6 @@ recv_error:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_clear_error (&err);
|
g_clear_error (&err);
|
||||||
decoder->disconnected = TRUE;
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -761,7 +775,6 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder)
|
||||||
if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
|
if (((w * h) + (x * y)) > (decoder->width * decoder->height)) {
|
||||||
GST_ERROR ("Desktop resize is unsupported.");
|
GST_ERROR ("Desktop resize is unsupported.");
|
||||||
decoder->state = NULL;
|
decoder->state = NULL;
|
||||||
decoder->disconnected = TRUE;
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -786,7 +799,7 @@ rfb_decoder_state_framebuffer_update_rectangle (RfbDecoder * decoder)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
decoder->n_rects--;
|
decoder->n_rects--;
|
||||||
if (decoder->n_rects == 0 || decoder->disconnected) {
|
if (decoder->n_rects == 0) {
|
||||||
decoder->state = NULL;
|
decoder->state = NULL;
|
||||||
} else {
|
} else {
|
||||||
decoder->state = rfb_decoder_state_framebuffer_update_rectangle;
|
decoder->state = rfb_decoder_state_framebuffer_update_rectangle;
|
||||||
|
|
|
@ -56,7 +56,6 @@ struct _RfbDecoder
|
||||||
|
|
||||||
/* settable properties */
|
/* settable properties */
|
||||||
gboolean shared_flag;
|
gboolean shared_flag;
|
||||||
gboolean disconnected;
|
|
||||||
|
|
||||||
/* readable properties */
|
/* readable properties */
|
||||||
gboolean inited;
|
gboolean inited;
|
||||||
|
@ -103,6 +102,7 @@ RfbDecoder *rfb_decoder_new (void);
|
||||||
void rfb_decoder_free (RfbDecoder * decoder);
|
void rfb_decoder_free (RfbDecoder * decoder);
|
||||||
gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder,
|
gboolean rfb_decoder_connect_tcp (RfbDecoder * decoder,
|
||||||
gchar * host, guint port);
|
gchar * host, guint port);
|
||||||
|
void rfb_decoder_disconnect (RfbDecoder * decoder);
|
||||||
gboolean rfb_decoder_iterate (RfbDecoder * decoder);
|
gboolean rfb_decoder_iterate (RfbDecoder * decoder);
|
||||||
void rfb_decoder_send_update_request (RfbDecoder * decoder,
|
void rfb_decoder_send_update_request (RfbDecoder * decoder,
|
||||||
gboolean incremental, gint x, gint y, gint width, gint height);
|
gboolean incremental, gint x, gint y, gint width, gint height);
|
||||||
|
|
Loading…
Reference in a new issue