mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-06 12:36:58 +00:00
add comments, fix typos, and add note on default values (bug #4284)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5696 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
;
|
;
|
||||||
; RTP start and RTP end configure start and end addresses
|
; RTP start and RTP end configure start and end addresses
|
||||||
;
|
;
|
||||||
|
; Defaults are rtpstart=5000 and rtpend=31000
|
||||||
|
;
|
||||||
rtpstart=10000
|
rtpstart=10000
|
||||||
rtpend=20000
|
rtpend=20000
|
||||||
;
|
;
|
||||||
|
47
rtp.c
47
rtp.c
@@ -212,6 +212,9 @@ static struct ast_frame *process_cisco_dtmf(struct ast_rtp *rtp, unsigned char *
|
|||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* process_rfc2833: Process RTP DTMF and events according to RFC 2833:
|
||||||
|
"RTP Payload for DTMF Digits, Telephony Tones and Telephony Signals"
|
||||||
|
*/
|
||||||
static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
|
static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *data, int len)
|
||||||
{
|
{
|
||||||
unsigned int event;
|
unsigned int event;
|
||||||
@@ -226,9 +229,8 @@ static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *dat
|
|||||||
event_end >>= 24;
|
event_end >>= 24;
|
||||||
duration = ntohl(*((unsigned int *)(data)));
|
duration = ntohl(*((unsigned int *)(data)));
|
||||||
duration &= 0xFFFF;
|
duration &= 0xFFFF;
|
||||||
#if 0
|
if (rtpdebug)
|
||||||
printf("Event: %08x (len = %d)\n", event, len);
|
ast_log(LOG_DEBUG, "- RTP 2833 Event: %08x (len = %d)\n", event, len);
|
||||||
#endif
|
|
||||||
if (event < 10) {
|
if (event < 10) {
|
||||||
resp = '0' + event;
|
resp = '0' + event;
|
||||||
} else if (event < 11) {
|
} else if (event < 11) {
|
||||||
@@ -237,23 +239,19 @@ static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *dat
|
|||||||
resp = '#';
|
resp = '#';
|
||||||
} else if (event < 16) {
|
} else if (event < 16) {
|
||||||
resp = 'A' + (event - 12);
|
resp = 'A' + (event - 12);
|
||||||
} else if (event < 17) {
|
} else if (event < 17) { /* Event 16: Hook flash */
|
||||||
resp = 'X';
|
resp = 'X';
|
||||||
}
|
}
|
||||||
if (rtp->resp && (rtp->resp != resp)) {
|
if (rtp->resp && (rtp->resp != resp)) {
|
||||||
f = send_dtmf(rtp);
|
f = send_dtmf(rtp);
|
||||||
}
|
} else if(event_end & 0x80) {
|
||||||
else if(event_end & 0x80)
|
|
||||||
{
|
|
||||||
if (rtp->resp) {
|
if (rtp->resp) {
|
||||||
f = send_dtmf(rtp);
|
f = send_dtmf(rtp);
|
||||||
rtp->resp = 0;
|
rtp->resp = 0;
|
||||||
}
|
}
|
||||||
resp = 0;
|
resp = 0;
|
||||||
duration = 0;
|
duration = 0;
|
||||||
}
|
} else if(rtp->dtmfduration && (duration < rtp->dtmfduration)) {
|
||||||
else if(rtp->dtmfduration && (duration < rtp->dtmfduration))
|
|
||||||
{
|
|
||||||
f = send_dtmf(rtp);
|
f = send_dtmf(rtp);
|
||||||
}
|
}
|
||||||
if (!(event_end & 0x80))
|
if (!(event_end & 0x80))
|
||||||
@@ -263,17 +261,20 @@ static struct ast_frame *process_rfc2833(struct ast_rtp *rtp, unsigned char *dat
|
|||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*--- process_rfc3389: Process Comfort Noice RTP.
|
||||||
|
This is incomplete at the moment.
|
||||||
|
*/
|
||||||
static struct ast_frame *process_rfc3389(struct ast_rtp *rtp, unsigned char *data, int len)
|
static struct ast_frame *process_rfc3389(struct ast_rtp *rtp, unsigned char *data, int len)
|
||||||
{
|
{
|
||||||
struct ast_frame *f = NULL;
|
struct ast_frame *f = NULL;
|
||||||
/* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
|
/* Convert comfort noise into audio with various codecs. Unfortunately this doesn't
|
||||||
totally help us out becuase we don't have an engine to keep it going and we are not
|
totally help us out becuase we don't have an engine to keep it going and we are not
|
||||||
guaranteed to have it every 20ms or anything */
|
guaranteed to have it every 20ms or anything */
|
||||||
#if 1
|
if (rtpdebug)
|
||||||
printf("RFC3389: %d bytes, level %d...\n", len, rtp->lastrxformat);
|
ast_log(LOG_DEBUG, "- RTP 3389 Comfort noice event: Level %d (len = %d)\n", rtp->lastrxformat, len);
|
||||||
#endif
|
|
||||||
if (!(rtp->flags & FLAG_3389_WARNING)) {
|
if (!(rtp->flags & FLAG_3389_WARNING)) {
|
||||||
ast_log(LOG_NOTICE, "RFC3389 support incomplete. Turn off on client if possible\n");
|
char iabuf[INET_ADDRSTRLEN];
|
||||||
|
ast_log(LOG_NOTICE, "Comfort noice support incomplete in Asterisk (RFC 3389). Please turn off on client if possible. Client IP: %s\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr));
|
||||||
rtp->flags |= FLAG_3389_WARNING;
|
rtp->flags |= FLAG_3389_WARNING;
|
||||||
}
|
}
|
||||||
/* Must have at least one byte */
|
/* Must have at least one byte */
|
||||||
@@ -902,7 +903,7 @@ struct ast_rtp *ast_rtp_new_with_bindaddr(struct sched_context *sched, struct io
|
|||||||
if (x > rtpend)
|
if (x > rtpend)
|
||||||
x = (rtpstart + 1) & ~1;
|
x = (rtpstart + 1) & ~1;
|
||||||
if (x == startplace) {
|
if (x == startplace) {
|
||||||
ast_log(LOG_ERROR, "No RTP ports remaining\n");
|
ast_log(LOG_ERROR, "No RTP ports remaining. Can't setup media stream for this call.\n");
|
||||||
close(rtp->s);
|
close(rtp->s);
|
||||||
if (rtp->rtcp) {
|
if (rtp->rtcp) {
|
||||||
close(rtp->rtcp->s);
|
close(rtp->rtcp->s);
|
||||||
@@ -1413,6 +1414,9 @@ static struct ast_rtp_protocol *get_proto(struct ast_channel *chan)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ast_rtp_bridge: Bridge calls. If possible and allowed, initiate
|
||||||
|
re-invite so the peers exchange media directly outside
|
||||||
|
of Asterisk. */
|
||||||
int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
|
int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, struct ast_frame **fo, struct ast_channel **rc)
|
||||||
{
|
{
|
||||||
struct ast_frame *f;
|
struct ast_frame *f;
|
||||||
@@ -1485,14 +1489,16 @@ int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, st
|
|||||||
else
|
else
|
||||||
codec1 = 0;
|
codec1 = 0;
|
||||||
if (pr0->get_codec && pr1->get_codec) {
|
if (pr0->get_codec && pr1->get_codec) {
|
||||||
/* Hey, we can't do reinvite if both parties speak diffrent codecs */
|
/* Hey, we can't do reinvite if both parties speak different codecs */
|
||||||
if (!(codec0 & codec1)) {
|
if (!(codec0 & codec1)) {
|
||||||
ast_log(LOG_WARNING, "codec0 = %d is not codec1 = %d, cannot native bridge.\n",codec0,codec1);
|
if (option_debug)
|
||||||
|
ast_log(LOG_DEBUG, "Channel codec0 = %d is not codec1 = %d, cannot native bridge in RTP.\n", codec0, codec1);
|
||||||
ast_mutex_unlock(&c0->lock);
|
ast_mutex_unlock(&c0->lock);
|
||||||
ast_mutex_unlock(&c1->lock);
|
ast_mutex_unlock(&c1->lock);
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/* Ok, we should be able to redirect the media. Start with one channel */
|
||||||
if (pr0->set_rtp_peer(c0, p1, vp1, codec1))
|
if (pr0->set_rtp_peer(c0, p1, vp1, codec1))
|
||||||
ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
|
ast_log(LOG_WARNING, "Channel '%s' failed to talk to '%s'\n", c0->name, c1->name);
|
||||||
else {
|
else {
|
||||||
@@ -1501,6 +1507,7 @@ int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, st
|
|||||||
if (vp1)
|
if (vp1)
|
||||||
ast_rtp_get_peer(vp1, &vac1);
|
ast_rtp_get_peer(vp1, &vac1);
|
||||||
}
|
}
|
||||||
|
/* Then test the other channel */
|
||||||
if (pr1->set_rtp_peer(c1, p0, vp0, codec0))
|
if (pr1->set_rtp_peer(c1, p0, vp0, codec0))
|
||||||
ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
|
ast_log(LOG_WARNING, "Channel '%s' failed to talk back to '%s'\n", c1->name, c0->name);
|
||||||
else {
|
else {
|
||||||
@@ -1577,7 +1584,7 @@ int ast_rtp_bridge(struct ast_channel *c0, struct ast_channel *c1, int flags, st
|
|||||||
if (!who) {
|
if (!who) {
|
||||||
if (option_debug)
|
if (option_debug)
|
||||||
ast_log(LOG_DEBUG, "Ooh, empty read...\n");
|
ast_log(LOG_DEBUG, "Ooh, empty read...\n");
|
||||||
/* check for hagnup / whentohangup */
|
/* check for hangup / whentohangup */
|
||||||
if (ast_check_hangup(c0) || ast_check_hangup(c1))
|
if (ast_check_hangup(c0) || ast_check_hangup(c1))
|
||||||
break;
|
break;
|
||||||
continue;
|
continue;
|
||||||
@@ -1729,7 +1736,7 @@ void ast_rtp_reload(void)
|
|||||||
ast_config_destroy(cfg);
|
ast_config_destroy(cfg);
|
||||||
}
|
}
|
||||||
if (rtpstart >= rtpend) {
|
if (rtpstart >= rtpend) {
|
||||||
ast_log(LOG_WARNING, "Unreasonable values for RTP start in rtp.conf/end\n");
|
ast_log(LOG_WARNING, "Unreasonable values for RTP start/end port in rtp.conf\n");
|
||||||
rtpstart = 5000;
|
rtpstart = 5000;
|
||||||
rtpend = 31000;
|
rtpend = 31000;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user