From 9cc6f2c59e41c0d5fa34f03950131a4eb81cc7ab Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Mon, 2 Apr 2012 22:27:13 +0000 Subject: [PATCH] Stop sending out RTCP if RTP is inactive This change prevents Asterisk from sending RTCP receiver reports during a remote bridge since it is no longer receiving media and should not be reporting anything. (related to ASTERISK-19366) ........ Merged revisions 360987 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 360993 from http://svn.asterisk.org/svn/asterisk/branches/10 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@360994 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_sip.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/channels/chan_sip.c b/channels/chan_sip.c index a9d767ecdd..f9fa5512e7 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -30402,16 +30402,48 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *i if (instance) { changed |= ast_rtp_instance_get_and_cmp_remote_address(instance, &p->redirip); + + if (p->rtp) { + /* Prevent audio RTCP reads */ + ast_channel_set_fd(chan, 1, -1); + /* Silence RTCP while audio RTP is inactive */ + ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 0); + } } else if (!ast_sockaddr_isnull(&p->redirip)) { memset(&p->redirip, 0, sizeof(p->redirip)); changed = 1; + + if (p->rtp) { + /* Enable RTCP since it will be inactive if we're coming back + * from a reinvite */ + ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 1); + /* Enable audio RTCP reads */ + ast_channel_set_fd(chan, 1, ast_rtp_instance_fd(p->rtp, 1)); + } } + if (vinstance) { changed |= ast_rtp_instance_get_and_cmp_remote_address(vinstance, &p->vredirip); + + if (p->vrtp) { + /* Prevent video RTCP reads */ + ast_channel_set_fd(chan, 3, -1); + /* Silence RTCP while video RTP is inactive */ + ast_rtp_instance_set_prop(p->vrtp, AST_RTP_PROPERTY_RTCP, 0); + } } else if (!ast_sockaddr_isnull(&p->vredirip)) { memset(&p->vredirip, 0, sizeof(p->vredirip)); changed = 1; + + if (p->vrtp) { + /* Enable RTCP since it will be inactive if we're coming back + * from a reinvite */ + ast_rtp_instance_set_prop(p->vrtp, AST_RTP_PROPERTY_RTCP, 1); + /* Enable video RTCP reads */ + ast_channel_set_fd(chan, 3, ast_rtp_instance_fd(p->vrtp, 1)); + } } + if (tinstance) { changed |= ast_rtp_instance_get_and_cmp_remote_address(tinstance, &p->tredirip); } else if (!ast_sockaddr_isnull(&p->tredirip)) {