aboutsummaryrefslogtreecommitdiffstats
path: root/main/rtp.c
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-19 17:09:20 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2007-06-19 17:09:20 +0000
commit9728b05eb110085698b71a90e1c37c4d34ec054f (patch)
tree908795a4c7fb0c0927dc3a84c2f2801560df512f /main/rtp.c
parentea48d89dcd496a1897e2574f058a00a6b8fe2775 (diff)
Merged revisions 70003 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ................ r70003 | file | 2007-06-19 13:07:40 -0400 (Tue, 19 Jun 2007) | 10 lines Merged revisions 69992 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.2 ........ r69992 | file | 2007-06-19 13:00:58 -0400 (Tue, 19 Jun 2007) | 2 lines Handle the CC field in the RTP header. (issue #9384 reported by DoodleHu) ........ ................ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@70006 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/rtp.c')
-rw-r--r--main/rtp.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/main/rtp.c b/main/rtp.c
index c3d29fb56..11561e254 100644
--- a/main/rtp.c
+++ b/main/rtp.c
@@ -1119,18 +1119,13 @@ static void calc_rxstamp(struct timeval *tv, struct ast_rtp *rtp, unsigned int t
/*! \brief Perform a Packet2Packet RTP write */
static int bridge_p2p_rtp_write(struct ast_rtp *rtp, struct ast_rtp *bridged, unsigned int *rtpheader, int len, int hdrlen)
{
- int res = 0, payload = 0, bridged_payload = 0, version, padding, mark, ext;
+ int res = 0, payload = 0, bridged_payload = 0, mark;
struct rtpPayloadType rtpPT;
- unsigned int seqno;
-
+ int reconstruct = ntohl(rtpheader[0]);
+
/* Get fields from packet */
- seqno = ntohl(rtpheader[0]);
- version = (seqno & 0xC0000000) >> 30;
- payload = (seqno & 0x7f0000) >> 16;
- padding = seqno & (1 << 29);
- mark = (seqno & 0x800000) >> 23;
- ext = seqno & (1 << 28);
- seqno &= 0xffff;
+ payload = (reconstruct & 0x7f0000) >> 16;
+ mark = (((reconstruct & 0x800000) >> 23) != 0);
/* Check what the payload value should be */
rtpPT = ast_rtp_lookup_pt(rtp, payload);
@@ -1149,7 +1144,10 @@ static int bridge_p2p_rtp_write(struct ast_rtp *rtp, struct ast_rtp *bridged, un
}
/* Reconstruct part of the packet */
- rtpheader[0] = htonl((version << 30) | (mark << 23) | (bridged_payload << 16) | (seqno));
+ reconstruct &= 0xFF80FFFF;
+ reconstruct |= (bridged_payload << 16);
+ reconstruct |= (mark << 23);
+ rtpheader[0] = htonl(reconstruct);
/* Send the packet back out */
res = sendto(bridged->s, (void *)rtpheader, len, 0, (struct sockaddr *)&bridged->them, sizeof(bridged->them));
@@ -1181,6 +1179,7 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
int padding;
int mark;
int ext;
+ int cc;
unsigned int ssrc;
unsigned int timestamp;
unsigned int *rtpheader;
@@ -1259,6 +1258,7 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
padding = seqno & (1 << 29);
mark = seqno & (1 << 23);
ext = seqno & (1 << 28);
+ cc = (seqno & 0xF000000) >> 24;
seqno &= 0xffff;
timestamp = ntohl(rtpheader[1]);
ssrc = ntohl(rtpheader[2]);
@@ -1276,10 +1276,15 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp)
res -= rtp->rawdata[AST_FRIENDLY_OFFSET + res - 1];
}
+ if (cc) {
+ /* CSRC fields present */
+ hdrlen += cc*4;
+ }
+
if (ext) {
/* RTP Extension present */
+ hdrlen += (ntohl(rtpheader[hdrlen/4]) & 0xffff) << 2;
hdrlen += 4;
- hdrlen += (ntohl(rtpheader[3]) & 0xffff) << 2;
if (option_debug) {
int profile;
profile = (ntohl(rtpheader[3]) & 0xffff0000) >> 16;