[asterisk-commits] kmoore: trunk r340972 - in /trunk: ./ channels/chan_sip.c res/res_rtp_asterisk.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri Oct 14 15:51:23 CDT 2011


Author: kmoore
Date: Fri Oct 14 15:51:19 2011
New Revision: 340972

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=340972
Log:
Merged revisions 340971 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/branches/10

................
  r340971 | kmoore | 2011-10-14 15:50:37 -0500 (Fri, 14 Oct 2011) | 15 lines
  
  Merged revisions 340970 via svnmerge from 
  https://origsvn.digium.com/svn/asterisk/branches/1.8
  
  ........
    r340970 | kmoore | 2011-10-14 15:49:39 -0500 (Fri, 14 Oct 2011) | 8 lines
    
    Quiet RTCP Receiver Reports during fax transmission
    
    RTCP is now disabled for "inactive" RTP audio streams during SIP T.38 sessions.
    The ability to disable RTCP streams in res_rtp_asterisk was missing, so this
    code was added to support the bug fix.
    
    (closes issue ASTERISK-18400)
  ........
................

Modified:
    trunk/   (props changed)
    trunk/channels/chan_sip.c
    trunk/res/res_rtp_asterisk.c

Propchange: trunk/
------------------------------------------------------------------------------
Binary property 'branch-10-merged' - no diff available.

Modified: trunk/channels/chan_sip.c
URL: http://svnview.digium.com/svn/asterisk/trunk/channels/chan_sip.c?view=diff&rev=340972&r1=340971&r2=340972
==============================================================================
--- trunk/channels/chan_sip.c (original)
+++ trunk/channels/chan_sip.c Fri Oct 14 15:51:19 2011
@@ -9127,6 +9127,9 @@
 			}
 
 			ast_rtp_codecs_payloads_copy(&newaudiortp, ast_rtp_instance_get_codecs(p->rtp), p->rtp);
+			/* Ensure RTCP is enabled since it may be inactive
+			   if we're coming back from a T.38 session */
+			ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 1);
 
 			if (ast_test_flag(&p->flags[0], SIP_DTMF) == SIP_DTMF_AUTO) {
 				ast_clear_flag(&p->flags[0], SIP_DTMF);
@@ -9143,6 +9146,8 @@
 		} else if (udptlportno > 0) {
 			if (debug)
 				ast_verbose("Got T.38 Re-invite without audio. Keeping RTP active during T.38 session.\n");
+			/* Silence RTCP while audio RTP is inactive */
+			ast_rtp_instance_set_prop(p->rtp, AST_RTP_PROPERTY_RTCP, 0);
 		} else {
 			ast_rtp_instance_stop(p->rtp);
 			if (debug)

Modified: trunk/res/res_rtp_asterisk.c
URL: http://svnview.digium.com/svn/asterisk/trunk/res/res_rtp_asterisk.c?view=diff&rev=340972&r1=340971&r2=340972
==============================================================================
--- trunk/res/res_rtp_asterisk.c (original)
+++ trunk/res/res_rtp_asterisk.c Fri Oct 14 15:51:19 2011
@@ -2382,44 +2382,65 @@
 	struct ast_rtp *rtp = ast_rtp_instance_get_data(instance);
 
 	if (property == AST_RTP_PROPERTY_RTCP) {
-		if (rtp->rtcp) {
-			ast_debug(1, "Ignoring duplicate RTCP property on RTP instance '%p'\n", instance);
+		if (value) {
+			if (rtp->rtcp) {
+				ast_debug(1, "Ignoring duplicate RTCP property on RTP instance '%p'\n", instance);
+				return;
+			}
+			/* Setup RTCP to be activated on the next RTP write */
+			if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
+				return;
+			}
+
+			/* Grab the IP address and port we are going to use */
+			ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
+			ast_sockaddr_set_port(&rtp->rtcp->us,
+					      ast_sockaddr_port(&rtp->rtcp->us) + 1);
+
+			if ((rtp->rtcp->s =
+			     create_new_socket("RTCP",
+					       ast_sockaddr_is_ipv4(&rtp->rtcp->us) ?
+					       AF_INET :
+					       ast_sockaddr_is_ipv6(&rtp->rtcp->us) ?
+					       AF_INET6 : -1)) < 0) {
+				ast_debug(1, "Failed to create a new socket for RTCP on instance '%p'\n", instance);
+				ast_free(rtp->rtcp);
+				rtp->rtcp = NULL;
+				return;
+			}
+
+			/* Try to actually bind to the IP address and port we are going to use for RTCP, if this fails we have to bail out */
+			if (ast_bind(rtp->rtcp->s, &rtp->rtcp->us)) {
+				ast_debug(1, "Failed to setup RTCP on RTP instance '%p'\n", instance);
+				close(rtp->rtcp->s);
+				ast_free(rtp->rtcp);
+				rtp->rtcp = NULL;
+				return;
+			}
+
+			ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
+			rtp->rtcp->schedid = -1;
+
 			return;
-		}
-		if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
+		} else {
+			if (rtp->rtcp) {
+				if (rtp->rtcp->schedid > 0) {
+					if (!ast_sched_del(rtp->sched, rtp->rtcp->schedid)) {
+						/* Successfully cancelled scheduler entry. */
+						ao2_ref(instance, -1);
+					} else {
+						/* Unable to cancel scheduler entry */
+						ast_debug(1, "Failed to tear down RTCP on RTP instance '%p'\n", instance);
+						return;
+					}
+					rtp->rtcp->schedid = -1;
+				}
+				close(rtp->rtcp->s);
+				ast_free(rtp->rtcp);
+				rtp->rtcp = NULL;
+			}
 			return;
 		}
-
-		/* Grab the IP address and port we are going to use */
-		ast_rtp_instance_get_local_address(instance, &rtp->rtcp->us);
-		ast_sockaddr_set_port(&rtp->rtcp->us,
-				      ast_sockaddr_port(&rtp->rtcp->us) + 1);
-
-		if ((rtp->rtcp->s =
-		     create_new_socket("RTCP",
-				       ast_sockaddr_is_ipv4(&rtp->rtcp->us) ?
-				       AF_INET :
-				       ast_sockaddr_is_ipv6(&rtp->rtcp->us) ?
-				       AF_INET6 : -1)) < 0) {
-			ast_debug(1, "Failed to create a new socket for RTCP on instance '%p'\n", instance);
-			ast_free(rtp->rtcp);
-			rtp->rtcp = NULL;
-			return;
-		}
-
-		/* Try to actually bind to the IP address and port we are going to use for RTCP, if this fails we have to bail out */
-		if (ast_bind(rtp->rtcp->s, &rtp->rtcp->us)) {
-			ast_debug(1, "Failed to setup RTCP on RTP instance '%p'\n", instance);
-			close(rtp->rtcp->s);
-			ast_free(rtp->rtcp);
-			rtp->rtcp = NULL;
-			return;
-		}
-
-		ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
-		rtp->rtcp->schedid = -1;
-
-		return;
 	}
 
 	return;




More information about the asterisk-commits mailing list