summaryrefslogtreecommitdiff
path: root/res/res_rtp_asterisk.c
diff options
context:
space:
mode:
authorKinsey Moore <kmoore@digium.com>2011-10-14 20:51:19 +0000
committerKinsey Moore <kmoore@digium.com>2011-10-14 20:51:19 +0000
commit4b9546abdfb732758371e64976d65debe81fc067 (patch)
treee31fff60e060655098b472b0da47c3e520ba7766 /res/res_rtp_asterisk.c
parente77f1a6ae19d5a51b839d8419ae6b1203770f6cb (diff)
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) ........ ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@340972 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'res/res_rtp_asterisk.c')
-rw-r--r--res/res_rtp_asterisk.c89
1 files changed, 55 insertions, 34 deletions
diff --git a/res/res_rtp_asterisk.c b/res/res_rtp_asterisk.c
index 4621d2cc6..aaa31c319 100644
--- a/res/res_rtp_asterisk.c
+++ b/res/res_rtp_asterisk.c
@@ -2382,44 +2382,65 @@ static void ast_rtp_prop_set(struct ast_rtp_instance *instance, enum ast_rtp_pro
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);
- return;
- }
- if (!(rtp->rtcp = ast_calloc(1, sizeof(*rtp->rtcp)))) {
- return;
- }
+ 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;
- }
+ /* 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;
- }
+ /* 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;
+ ast_debug(1, "Setup RTCP on RTP instance '%p'\n", instance);
+ rtp->rtcp->schedid = -1;
- return;
+ return;
+ } 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;
+ }
}
return;