From 54f049c355e57d92d78cf139898769139be7606d Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 10 Oct 2012 11:32:17 +0200 Subject: [PATCH] multiudpsink: don't error on send errors but only warn Don't error on send errors but simply post a warning, it's possible that the next packet will be fine. --- gst/udp/gstmultiudpsink.c | 53 ++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/gst/udp/gstmultiudpsink.c b/gst/udp/gstmultiudpsink.c index 6527d3e..352101c 100644 --- a/gst/udp/gstmultiudpsink.c +++ b/gst/udp/gstmultiudpsink.c @@ -498,11 +498,6 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer) g_mutex_lock (&sink->client_lock); GST_LOG_OBJECT (bsink, "about to send %" G_GSIZE_FORMAT " bytes", size); - if (size > UDP_MAX_SIZE) { - GST_WARNING_OBJECT (bsink, "Attempting to send a UDP packet larger than " - "maximum size (%" G_GSIZE_FORMAT " > %d)", size, UDP_MAX_SIZE); - } - no_clients = 0; num = 0; for (clients = sink->clients; clients; clients = g_list_next (clients)) { @@ -523,13 +518,29 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer) g_socket_send_message (sink->used_socket, client->addr, vec, n_mem, NULL, 0, 0, sink->cancellable, &err); - if (ret < 0) - goto send_error; - - num++; - client->bytes_sent += ret; - client->packets_sent++; - sink->bytes_served += ret; + if (G_UNLIKELY (ret < 0)) { + if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) + goto flushing; + + /* we continue after posting a warning, next packets might be ok + * again */ + if (size > UDP_MAX_SIZE) { + GST_ELEMENT_WARNING (sink, RESOURCE, WRITE, + ("Attempting to send a UDP packet larger than maximum size " + "(%" G_GSIZE_FORMAT " > %d)", size, UDP_MAX_SIZE), + ("Reason: %s", err ? err->message : "unknown reason")); + } else { + GST_ELEMENT_WARNING (sink, RESOURCE, WRITE, + ("Error sending UDP packet"), ("Reason: %s", + err ? err->message : "unknown reason")); + } + g_clear_error (&err); + } else { + num++; + client->bytes_sent += ret; + client->packets_sent++; + sink->bytes_served += ret; + } } } g_mutex_unlock (&sink->client_lock); @@ -552,23 +563,13 @@ no_data: { return GST_FLOW_OK; } -send_error: +flushing: { - GstFlowReturn res; - + GST_DEBUG ("we are flushing"); g_mutex_unlock (&sink->client_lock); - GST_DEBUG ("got send error %s", err->message); - - if (g_error_matches (err, G_IO_ERROR, G_IO_ERROR_CANCELLED)) - res = GST_FLOW_FLUSHING; - else { - res = GST_FLOW_ERROR; - GST_ELEMENT_ERROR (sink, RESOURCE, SETTINGS, (NULL), - ("Error sending UDP packet: %s", - err ? err->message : "unknown reason")); - } g_clear_error (&err); - return res; + + return GST_FLOW_FLUSHING; } } -- 2.7.4