static void
set_multicast_socket_for_udpsink (GstElement * udpsink, GSocket * socket,
GSocketFamily family, const gchar * multicast_iface,
- const gchar * addr_str, gint port)
+ const gchar * addr_str, gint port, gint mcast_ttl)
{
set_socket_for_udpsink (udpsink, socket, family);
if (multicast_iface) {
+ GST_INFO ("setting multicast-iface %s", multicast_iface);
g_object_set (G_OBJECT (udpsink), "multicast-iface", multicast_iface, NULL);
}
+ if (mcast_ttl > 0) {
+ GST_INFO ("setting ttl-mc %d", mcast_ttl);
+ g_object_set (G_OBJECT (udpsink), "ttl-mc", mcast_ttl, NULL);
+ }
+
g_signal_emit_by_name (udpsink, "add", addr_str, port, NULL);
}
static gboolean
create_and_configure_udpsink (GstRTSPStream * stream, GstElement ** udpsink,
GSocket * socket_v4, GSocket * socket_v6, gboolean multicast,
- gboolean is_rtp)
+ gboolean is_rtp, gint mcast_ttl)
{
GstRTSPStreamPrivate *priv = stream->priv;
goto get_port_failed;
set_multicast_socket_for_udpsink (*udpsink, socket_v4,
G_SOCKET_FAMILY_IPV4, priv->multicast_iface,
- priv->mcast_addr_v4->address, port);
+ priv->mcast_addr_v4->address, port, mcast_ttl);
}
if (priv->mcast_addr_v6) {
goto get_port_failed;
set_multicast_socket_for_udpsink (*udpsink, socket_v6,
G_SOCKET_FAMILY_IPV6, priv->multicast_iface,
- priv->mcast_addr_v6->address, port);
+ priv->mcast_addr_v6->address, port, mcast_ttl);
}
}
GstPad *pad;
GstBin *bin;
gboolean is_tcp, is_udp, is_mcast;
+ gint mcast_ttl = 0;
gint i;
GST_DEBUG_OBJECT (stream, "create sender part");
is_udp = transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP;
is_mcast = transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST;
- GST_DEBUG_OBJECT (stream, "tcp: %d, udp: %d, mcast: %d", is_tcp, is_udp,
- is_mcast);
+ if (is_mcast)
+ mcast_ttl = transport->ttl;
+
+ GST_DEBUG_OBJECT (stream, "tcp: %d, udp: %d, mcast: %d (ttl: %d)", is_tcp,
+ is_udp, is_mcast, mcast_ttl);
if (is_udp && !priv->server_addr_v4 && !priv->server_addr_v6) {
GST_WARNING_OBJECT (stream, "no sockets assigned for UDP");
if (is_udp && !priv->udpsink[i]) {
/* we create only one pair of udpsinks for IPv4 and IPv6 */
create_and_configure_udpsink (stream, &priv->udpsink[i],
- priv->socket_v4[i], priv->socket_v6[i], FALSE, (i == 0));
+ priv->socket_v4[i], priv->socket_v6[i], FALSE, (i == 0), mcast_ttl);
plug_sink (stream, transport, i);
} else if (is_mcast && !priv->mcast_udpsink[i]) {
/* we create only one pair of mcast-udpsinks for IPv4 and IPv6 */
create_and_configure_udpsink (stream, &priv->mcast_udpsink[i],
- priv->mcast_socket_v4[i], priv->mcast_socket_v6[i], TRUE, (i == 0));
+ priv->mcast_socket_v4[i], priv->mcast_socket_v6[i], TRUE, (i == 0),
+ mcast_ttl);
plug_sink (stream, transport, i);
} else if (is_tcp && !priv->appsink[i]) {
/* make appsink */
if (!check_mcast_part_for_transport (stream, tr))
goto mcast_error;
priv->transports = g_list_prepend (priv->transports, trans);
+
+ if (tr->ttl > 0) {
+ GST_INFO ("setting ttl-mc %d", tr->ttl);
+ if (priv->udpsink[0])
+ g_object_set (G_OBJECT (priv->udpsink[0]), "ttl-mc", tr->ttl, NULL);
+ if (priv->udpsink[1])
+ g_object_set (G_OBJECT (priv->udpsink[1]), "ttl-mc", tr->ttl, NULL);
+ }
} else {
priv->transports = g_list_remove (priv->transports, trans);
}
{
gchar *dest;
gint min, max;
- guint ttl = 0;
dest = tr->destination;
if (tr->lower_transport == GST_RTSP_LOWER_TRANS_UDP_MCAST) {
min = tr->port.min;
max = tr->port.max;
- ttl = tr->ttl;
} else if (priv->client_side) {
/* In client side mode the 'destination' is the RTSP server, so send
* to those ports */
}
if (add) {
- if (ttl > 0) {
- GST_INFO ("setting ttl-mc %d", ttl);
- if (priv->udpsink[0])
- g_object_set (G_OBJECT (priv->udpsink[0]), "ttl-mc", ttl, NULL);
- g_object_set (G_OBJECT (priv->udpsink[1]), "ttl-mc", ttl, NULL);
- }
GST_INFO ("adding %s:%d-%d", dest, min, max);
if (priv->udpsink[0])
g_signal_emit_by_name (priv->udpsink[0], "add", dest, min, NULL);