From 0dc617058203acae4db137621ee7ac388dd9eb30 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebastian=20Dr=C3=B6ge?= Date: Wed, 28 Feb 2018 21:12:43 +0200 Subject: [PATCH] rtsp-client: Place netaddress meta on packets received via TCP This allows us to later map signals from rtpbin/rtpsource back to the corresponding stream transport, and allows to do keep-alive based on RTCP packets in case of TCP media transport. https://bugzilla.gnome.org/show_bug.cgi?id=789646 --- gst/rtsp-server/rtsp-client.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/gst/rtsp-server/rtsp-client.c b/gst/rtsp-server/rtsp-client.c index 4b5d5a3..9df4c9b 100644 --- a/gst/rtsp-server/rtsp-client.c +++ b/gst/rtsp-server/rtsp-client.c @@ -3784,6 +3784,37 @@ handle_data (GstRTSPClient * client, GstRTSPMessage * message) trans = g_hash_table_lookup (priv->transports, GINT_TO_POINTER ((gint) channel)); if (trans) { + GSocketAddress *addr; + + /* Only create the socket address once for the transport, we don't really + * want to do that for every single packet. + * + * The netaddress meta is later used by the RTP stack to know where + * packets came from and allows us to match it again to a stream transport + * + * In theory we could use the remote socket address of the RTSP connection + * here, but this would fail with a custom configure_client_transport() + * implementation. + */ + if (!(addr = + g_object_get_data (G_OBJECT (trans), "rtsp-client.remote-addr"))) { + const GstRTSPTransport *tr; + GInetAddress *iaddr; + + tr = gst_rtsp_stream_transport_get_transport (trans); + iaddr = g_inet_address_new_from_string (tr->destination); + if (iaddr) { + addr = g_inet_socket_address_new (iaddr, tr->client_port.min); + g_object_unref (iaddr); + g_object_set_data_full (G_OBJECT (trans), "rtsp-client.remote-addr", + addr, (GDestroyNotify) g_object_unref); + } + } + + if (addr) { + gst_buffer_add_net_address_meta (buffer, addr); + } + /* dispatch to the stream based on the channel number */ GST_LOG_OBJECT (client, "%u bytes of data on channel %u", size, channel); gst_rtsp_stream_transport_recv_data (trans, channel, buffer); -- 2.7.4