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.
This commit is contained in:
Wim Taymans 2010-08-20 15:58:39 +02:00
parent c89d17ca26
commit a900866570
2 changed files with 60 additions and 29 deletions

View file

@ -737,6 +737,16 @@ again:
if (!udpsink1) if (!udpsink1)
goto no_udp_protocol; 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_get (G_OBJECT (udpsrc1), "sock", &sockfd, NULL);
g_object_set (G_OBJECT (udpsink1), "sockfd", sockfd, NULL); g_object_set (G_OBJECT (udpsink1), "sockfd", sockfd, NULL);
g_object_set (G_OBJECT (udpsink1), "closefd", FALSE, NULL); g_object_set (G_OBJECT (udpsink1), "closefd", FALSE, NULL);
@ -1571,8 +1581,11 @@ static void
add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream, add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
gchar *dest, gint min, gint max) gchar *dest, gint min, gint max)
{ {
RTSPDestination fdest; gboolean do_add = TRUE;
RTSPDestination *ndest; RTSPDestination *ndest;
if (stream->filter_duplicates) {
RTSPDestination fdest;
GList *find; GList *find;
fdest.dest = dest; fdest.dest = dest;
@ -1586,25 +1599,33 @@ add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
GST_INFO ("already streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); GST_INFO ("already streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count);
ndest->count++; ndest->count++;
} else { do_add = FALSE;
GST_INFO ("adding %s:%d-%d", dest, min, max); }
}
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[0], "add", dest, min, NULL);
g_signal_emit_by_name (stream->udpsink[1], "add", dest, max, NULL); g_signal_emit_by_name (stream->udpsink[1], "add", dest, max, NULL);
if (stream->filter_duplicates) {
ndest = create_destination (dest, min, max); ndest = create_destination (dest, min, max);
stream->destinations = g_list_prepend (stream->destinations, ndest); stream->destinations = g_list_prepend (stream->destinations, ndest);
} }
} }
}
static void static void
remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream, remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
gchar *dest, gint min, gint max) gchar *dest, gint min, gint max)
{ {
RTSPDestination fdest; gboolean do_remove = TRUE;
RTSPDestination *ndest; RTSPDestination *ndest;
GList *find; GList *find;
if (stream->filter_duplicates) {
RTSPDestination fdest;
fdest.dest = dest; fdest.dest = dest;
fdest.min = min; fdest.min = min;
fdest.max = max; fdest.max = max;
@ -1615,15 +1636,21 @@ remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
return; return;
ndest = (RTSPDestination *) find->data; ndest = (RTSPDestination *) find->data;
if (--ndest->count == 0) { 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); 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[0], "remove", dest, min, NULL);
g_signal_emit_by_name (stream->udpsink[1], "remove", dest, max, NULL); g_signal_emit_by_name (stream->udpsink[1], "remove", dest, max, NULL);
if (stream->filter_duplicates) {
stream->destinations = g_list_delete_link (stream->destinations, find); stream->destinations = g_list_delete_link (stream->destinations, find);
free_destination (ndest); free_destination (ndest);
} else { }
GST_INFO ("still streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count);
} }
} }

View file

@ -137,6 +137,10 @@ struct _GstRTSPMediaStream {
/* transports we stream to */ /* transports we stream to */
GList *transports; GList *transports;
/* to filter out duplicate destinations in case multiudpsink is too old to do
* this for us */
gboolean filter_duplicates;
GList *destinations; GList *destinations;
}; };