aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authortwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-09-30 18:58:49 +0000
committertwilson <twilson@f38db490-d61c-443f-a65b-d21fe96a405b>2009-09-30 18:58:49 +0000
commit25411e5ee985044deac61738e617d19bf891df61 (patch)
tree4adcfdf7a2538c95fccfe3522159eb0c75aa0bab /main
parentcc3947653d564b8cabc8cc6b3bd400421d3ff70e (diff)
Merged revisions 221266 via svnmerge from
https://origsvn.digium.com/svn/asterisk/trunk ................ r221266 | twilson | 2009-09-30 12:52:30 -0500 (Wed, 30 Sep 2009) | 32 lines Merged revisions 221086 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r221086 | twilson | 2009-09-30 09:49:11 -0500 (Wed, 30 Sep 2009) | 25 lines Change the SSRC by default when our media stream changes Be default, change SSRC when doing an audio stream changes Asterisk doesn't honor marker bit when reinvited to already-bridged RTP streams,resulting in far-end stack discarding packets with "old" timestamps that areactually part of a new stream. This patch sends AST_CONTROL_SRCUPDATE whenever there is a reinvite, unless the 'constantssrc' is set to true in sip.conf. The original issue reported to Digium support detailed the following situation: ITSP <-> Asterisk 1.4.26.2 <-> SIP-based Application Server Call comes in fromITSP, Asterisk dials the app server which sends a re-invite back toAsterisk--not to negotiate to send media directly to the ITSP, but to indicatethat it's changing the stream it's sending to Asterisk. The app servergenerates a new SSRC, sequence numbers, timestamps, and sets the marker bit on the new stream. Asterisk passes through the teimstamp of the new stream, butdoes not reset the SSRC, sequence numbers, or set the marker bit. When the timestamp on the new stream is older than the timestamp on the originalstream, the ITSP (which doesn't know there has been any change) discards the newframes because it thinks they are too old. This patch addresses this by changing the SSRC on a stream update unless constantssrc=true is set in sip.conf. Review: https://reviewboard.asterisk.org/r/374/ ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/branches/1.6.1@221302 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/rtp.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/main/rtp.c b/main/rtp.c
index dcd6807b2..de50a0397 100644
--- a/main/rtp.c
+++ b/main/rtp.c
@@ -181,6 +181,7 @@ struct ast_rtp {
struct sockaddr_in strict_rtp_address; /*!< Remote address information for strict RTP purposes */
int set_marker_bit:1; /*!< Whether to set the marker bit or not */
+ unsigned int constantssrc:1;
struct rtp_red *red;
};
@@ -2604,12 +2605,19 @@ int ast_rtp_setqos(struct ast_rtp *rtp, int type_of_service, int class_of_servic
return ast_netsock_set_qos(rtp->s, type_of_service, class_of_service, desc);
}
+void ast_rtp_set_constantssrc(struct ast_rtp *rtp)
+{
+ rtp->constantssrc = 1;
+}
+
void ast_rtp_new_source(struct ast_rtp *rtp)
{
if (rtp) {
rtp->set_marker_bit = 1;
+ if (!rtp->constantssrc) {
+ rtp->ssrc = ast_random();
+ }
}
- return;
}
void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them)