gst/udp/gstmultiudpsink.*: Collect statistics; return them from get_stats.

Original commit message from CVS:
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render),
(gst_multiudpsink_add), (gst_multiudpsink_remove),
(gst_multiudpsink_get_stats):
* gst/udp/gstmultiudpsink.h:
Collect statistics; return them from get_stats.
This commit is contained in:
Michael Smith 2005-12-20 12:44:25 +00:00
parent 3ffe64515e
commit bdafee5925
3 changed files with 74 additions and 2 deletions

View file

@ -1,3 +1,11 @@
2005-12-20 Michael Smith <msmith@fluendo.com>
* gst/udp/gstmultiudpsink.c: (gst_multiudpsink_render),
(gst_multiudpsink_add), (gst_multiudpsink_remove),
(gst_multiudpsink_get_stats):
* gst/udp/gstmultiudpsink.h:
Collect statistics; return them from get_stats.
2005-12-19 Edward Hervey <edward@fluendo.com>
* gst/avi/gstavidemux.c: (gst_avi_demux_stream_scan):

View file

@ -226,10 +226,12 @@ gst_multiudpsink_render (GstBaseSink * bsink, GstBuffer * buffer)
if (errno != EINTR && errno != EAGAIN) {
goto send_error;
}
} else
} else {
client->bytes_sent += ret;
break;
}
}
}
g_mutex_unlock (sink->client_lock);
GST_LOG_OBJECT (sink, "sent %d bytes to %d clients", size, num);
@ -320,6 +322,7 @@ gst_multiudpsink_add (GstMultiUDPSink * sink, const gchar * host, gint port)
struct in_addr addr;
struct ip_mreq multi_addr;
GstUDPClient *client;
GTimeVal now;
GST_DEBUG_OBJECT (sink, "adding client on host %s, port %d", host, port);
client = g_new0 (GstUDPClient, 1);
@ -331,6 +334,9 @@ gst_multiudpsink_add (GstMultiUDPSink * sink, const gchar * host, gint port)
client->theiraddr.sin_family = AF_INET; /* host byte order */
client->theiraddr.sin_port = htons (port); /* short, network byte order */
g_get_current_time (&now);
client->connect_time = GST_TIMEVAL_TO_TIME (now);
/* if its an IP address */
if (inet_aton (host, &addr)) {
/* check if its a multicast address */
@ -407,9 +413,19 @@ gst_multiudpsink_remove (GstMultiUDPSink * sink, const gchar * host, gint port)
(GCompareFunc) client_compare);
if (find) {
GstUDPClient *client;
GTimeVal now;
client = (GstUDPClient *) find->data;
g_get_current_time (&now);
client->disconnect_time = GST_TIMEVAL_TO_TIME (now);
/* Unlock to emit signal before we delete the actual client */
g_mutex_unlock (sink->client_lock);
g_signal_emit (G_OBJECT (sink),
gst_multiudpsink_signals[SIGNAL_CLIENT_REMOVED], 0, host, port);
g_mutex_lock (sink->client_lock);
sink->clients = g_list_delete_link (sink->clients, find);
free_client (client);
@ -432,7 +448,50 @@ GValueArray *
gst_multiudpsink_get_stats (GstMultiUDPSink * sink, const gchar * host,
gint port)
{
return NULL;
GstUDPClient *client;
GValueArray *result = NULL;
GstUDPClient udpclient;
GList *find;
udpclient.host = (gchar *) host;
udpclient.port = port;
g_mutex_lock (sink->client_lock);
find = g_list_find_custom (sink->clients, &udpclient,
(GCompareFunc) client_compare);
if (find) {
client = (GstUDPClient *) find->data;
GValue value = { 0 };
/* Result is a value array of (bytes_sent, connect_time, disconnect_time) */
result = g_value_array_new (3);
g_value_init (&value, G_TYPE_UINT64);
g_value_set_uint64 (&value, client->bytes_sent);
result = g_value_array_append (result, &value);
g_value_unset (&value);
g_value_init (&value, G_TYPE_UINT64);
g_value_set_uint64 (&value, client->connect_time);
result = g_value_array_append (result, &value);
g_value_unset (&value);
g_value_init (&value, G_TYPE_UINT64);
g_value_set_uint64 (&value, client->disconnect_time);
result = g_value_array_append (result, &value);
g_value_unset (&value);
}
g_mutex_unlock (sink->client_lock);
/* Apparently (see comment in gstmultifdsink.c) returning NULL from here may
* confuse/break python bindings */
if (result == NULL)
result = g_value_array_new (0);
return result;
}
static GstStateChangeReturn

View file

@ -57,6 +57,11 @@ typedef struct {
gchar *host;
gint port;
/* Per-client stats */
guint64 bytes_sent;
guint64 connect_time;
guint64 disconnect_time;
} GstUDPClient;
/* sends udp packets to multiple host/port pairs.