From a900866570f18cb35716952e5b9e441c9851f351 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 20 Aug 2010 15:58:39 +0200 Subject: [PATCH] media: use multiudpsink send-duplicates when we can If we have a new enough multiudpsink with the send-duplicates property, use this instead of doing our own filtering. Our custom filtering code should eventually be removed when we can depend on a released -good. --- gst/rtsp-server/rtsp-media.c | 85 ++++++++++++++++++++++++------------ gst/rtsp-server/rtsp-media.h | 4 ++ 2 files changed, 60 insertions(+), 29 deletions(-) diff --git a/gst/rtsp-server/rtsp-media.c b/gst/rtsp-server/rtsp-media.c index a9d1413a60..c2dc996a60 100644 --- a/gst/rtsp-server/rtsp-media.c +++ b/gst/rtsp-server/rtsp-media.c @@ -737,6 +737,16 @@ again: if (!udpsink1) goto no_udp_protocol; + if (g_object_class_find_property (G_OBJECT_GET_CLASS (udpsink0), "send-duplicates")) { + g_object_set (G_OBJECT (udpsink0), "send-duplicates", FALSE, NULL); + g_object_set (G_OBJECT (udpsink1), "send-duplicates", FALSE, NULL); + stream->filter_duplicates = FALSE; + } + else { + GST_WARNING ("multiudpsink version found without send-duplicates property"); + stream->filter_duplicates = TRUE; + } + g_object_get (G_OBJECT (udpsrc1), "sock", &sockfd, NULL); g_object_set (G_OBJECT (udpsink1), "sockfd", sockfd, NULL); g_object_set (G_OBJECT (udpsink1), "closefd", FALSE, NULL); @@ -1571,29 +1581,37 @@ static void add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream, gchar *dest, gint min, gint max) { - RTSPDestination fdest; + gboolean do_add = TRUE; RTSPDestination *ndest; - GList *find; - fdest.dest = dest; - fdest.min = min; - fdest.max = max; + if (stream->filter_duplicates) { + RTSPDestination fdest; + GList *find; - /* first see if we already added this destination */ - find = g_list_find_custom (stream->destinations, &fdest, (GCompareFunc) dest_compare); - if (find) { - ndest = (RTSPDestination *) find->data; + fdest.dest = dest; + fdest.min = min; + fdest.max = max; - GST_INFO ("already streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); - ndest->count++; - } else { + /* first see if we already added this destination */ + find = g_list_find_custom (stream->destinations, &fdest, (GCompareFunc) dest_compare); + if (find) { + ndest = (RTSPDestination *) find->data; + + GST_INFO ("already streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); + ndest->count++; + do_add = FALSE; + } + } + + if (do_add) { GST_INFO ("adding %s:%d-%d", dest, min, max); - g_signal_emit_by_name (stream->udpsink[0], "add", dest, min, NULL); g_signal_emit_by_name (stream->udpsink[1], "add", dest, max, NULL); - ndest = create_destination (dest, min, max); - stream->destinations = g_list_prepend (stream->destinations, ndest); + if (stream->filter_duplicates) { + ndest = create_destination (dest, min, max); + stream->destinations = g_list_prepend (stream->destinations, ndest); + } } } @@ -1601,29 +1619,38 @@ static void remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream, gchar *dest, gint min, gint max) { - RTSPDestination fdest; + gboolean do_remove = TRUE; RTSPDestination *ndest; GList *find; - fdest.dest = dest; - fdest.min = min; - fdest.max = max; + if (stream->filter_duplicates) { + RTSPDestination fdest; - /* first see if we already added this destination */ - find = g_list_find_custom (stream->destinations, &fdest, (GCompareFunc) dest_compare); - if (!find) - return; + fdest.dest = dest; + fdest.min = min; + fdest.max = max; - ndest = (RTSPDestination *) find->data; - if (--ndest->count == 0) { + /* first see if we already added this destination */ + find = g_list_find_custom (stream->destinations, &fdest, (GCompareFunc) dest_compare); + if (!find) + return; + + ndest = (RTSPDestination *) find->data; + if (--ndest->count > 0) { + do_remove = FALSE; + GST_INFO ("still streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); + } + } + + if (do_remove) { GST_INFO ("removing %s:%d-%d", dest, min, max); g_signal_emit_by_name (stream->udpsink[0], "remove", dest, min, NULL); g_signal_emit_by_name (stream->udpsink[1], "remove", dest, max, NULL); - stream->destinations = g_list_delete_link (stream->destinations, find); - free_destination (ndest); - } else { - GST_INFO ("still streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); + if (stream->filter_duplicates) { + stream->destinations = g_list_delete_link (stream->destinations, find); + free_destination (ndest); + } } } diff --git a/gst/rtsp-server/rtsp-media.h b/gst/rtsp-server/rtsp-media.h index d3c94db69a..0dea08abb0 100644 --- a/gst/rtsp-server/rtsp-media.h +++ b/gst/rtsp-server/rtsp-media.h @@ -137,6 +137,10 @@ struct _GstRTSPMediaStream { /* transports we stream to */ GList *transports; + + /* to filter out duplicate destinations in case multiudpsink is too old to do + * this for us */ + gboolean filter_duplicates; GList *destinations; };