From: Sebastian Dröge Date: Wed, 29 Apr 2015 13:52:27 +0000 (+0200) Subject: rtspsrc: Only enable retransmissions if there is retransmission info in the SDP X-Git-Tag: 1.19.3~509^2~3648 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=33693525b98ec4d7dae5e4d8ac922167ccb8b522;p=platform%2Fupstream%2Fgstreamer.git rtspsrc: Only enable retransmissions if there is retransmission info in the SDP Otherwise we're going to send early RTCP and NACKs in non-feedback sessions too, which will confuse servers. https://bugzilla.gnome.org/show_bug.cgi?id=748627 --- diff --git a/gst/rtsp/gstrtspsrc.c b/gst/rtsp/gstrtspsrc.c index ccd0103..a11e092 100644 --- a/gst/rtsp/gstrtspsrc.c +++ b/gst/rtsp/gstrtspsrc.c @@ -3200,6 +3200,7 @@ add_retransmission (GstRTSPSrc * src, GstRTSPTransport * transport) { GList *walk; guint signal_id; + gboolean do_retransmission = FALSE; if (transport->trans != GST_RTSP_TRANS_RTP) return; @@ -3218,6 +3219,7 @@ add_retransmission (GstRTSPSrc * src, GstRTSPTransport * transport) /* build the retransmission payload type map */ for (walk = src->streams; walk; walk = g_list_next (walk)) { GstRTSPStream *stream = (GstRTSPStream *) walk->data; + gboolean do_retransmission_stream = FALSE; int i; if (stream->rtx_pt_map) @@ -3241,21 +3243,37 @@ add_retransmission (GstRTSPSrc * src, GstRTSPTransport * transport) if (rtx_pt != 0) { gst_structure_set (stream->rtx_pt_map, stream_pt_s, G_TYPE_UINT, rtx_pt, NULL); + do_retransmission_stream = TRUE; } } } } - GST_DEBUG_OBJECT (src, "built retransmission payload map for stream " - "id %i: %" GST_PTR_FORMAT, stream->id, stream->rtx_pt_map); + if (do_retransmission_stream) { + GST_DEBUG_OBJECT (src, "built retransmission payload map for stream " + "id %i: %" GST_PTR_FORMAT, stream->id, stream->rtx_pt_map); + do_retransmission = TRUE; + } else { + GST_DEBUG_OBJECT (src, "no retransmission payload map for stream " + "id %i", stream->id); + gst_structure_free (stream->rtx_pt_map); + stream->rtx_pt_map = NULL; + } } - g_object_set (src->manager, "do-retransmission", TRUE, NULL); + if (do_retransmission) { + GST_DEBUG_OBJECT (src, "Enabling retransmissions"); + + g_object_set (src->manager, "do-retransmission", TRUE, NULL); - /* enable RFC4588 retransmission handling by setting rtprtxreceive - * as the "aux" element of rtpbin */ - g_signal_connect (src->manager, "request-aux-receiver", - (GCallback) request_aux_receiver, src); + /* enable RFC4588 retransmission handling by setting rtprtxreceive + * as the "aux" element of rtpbin */ + g_signal_connect (src->manager, "request-aux-receiver", + (GCallback) request_aux_receiver, src); + } else { + GST_DEBUG_OBJECT (src, + "Not enabling retransmissions as no stream had a retransmission payload map"); + } } /* try to get and configure a manager */