[asterisk-commits] oej: branch oej/pinefrog-1.4 r240721 - /team/oej/pinefrog-1.4/main/rtp.c
SVN commits to the Asterisk project
asterisk-commits at lists.digium.com
Sun Jan 17 14:04:43 CST 2010
Author: oej
Date: Sun Jan 17 14:04:41 2010
New Revision: 240721
URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=240721
Log:
At least we now have RTCP running in p2p rtp bridge mode.
I am not sure that all data is there either, but it's getting there.
Modified:
team/oej/pinefrog-1.4/main/rtp.c
Modified: team/oej/pinefrog-1.4/main/rtp.c
URL: http://svnview.digium.com/svn/asterisk/team/oej/pinefrog-1.4/main/rtp.c?view=diff&rev=240721&r1=240720&r2=240721
==============================================================================
--- team/oej/pinefrog-1.4/main/rtp.c (original)
+++ team/oej/pinefrog-1.4/main/rtp.c Sun Jan 17 14:04:41 2010
@@ -581,7 +581,7 @@
rtp->rtcp->schedid = ast_sched_add(rtp->sched, ast_rtcp_calc_interval(rtp), ast_rtcp_write, rtp);
ast_log(LOG_DEBUG, "-------- SCHEDULING RTCP reports!!!\n");
} else {
- //ast_log(LOG_DEBUG, "----- NOT SCHEDULING RTCP - RTCP %s RTCP address %s schedid %d\n",
+ // ast_log(LOG_DEBUG, "----- NOT SCHEDULING RTCP - RTCP %s RTCP address %s schedid %d\n",
//rtp->rtcp ? "yes" : "no",
//rtp->rtcp->them.sin_addr.s_addr ? "yes" : "no", rtp->rtcp->schedid);
}
@@ -1332,6 +1332,8 @@
int res = 0, payload = 0, bridged_payload = 0, mark;
struct rtpPayloadType rtpPT;
int reconstruct = ntohl(rtpheader[0]);
+ int header = 12;
+ int rate;
/* Get fields from packet */
payload = (reconstruct & 0x7f0000) >> 16;
@@ -1357,6 +1359,22 @@
mark = 1;
ast_set_flag(rtp, FLAG_P2P_SENT_MARK);
}
+#ifdef SKREP
+---SKREP
+ rate = rtp_get_rate(bridged_payload) / 1000;
+
+
+
+ ms = calc_txstamp(rtp, &f->delivery);
+ /* Default prediction */
+ if (f->frametype == AST_FRAME_VOICE) {
+ pred = rtp->lastts + f->samples;
+
+ /* Re-calculate last TS */
+ rtp->lastts = rtp->lastts + ms * rate;
+
+---
+#endif
/* Reconstruct part of the packet */
reconstruct &= 0xFF80FFFF;
@@ -1375,9 +1393,12 @@
ast_set_flag(bridged, FLAG_NAT_INACTIVE_NOWARN);
}
return 0;
- } else if (rtp_debug_test_addr(&bridged->them))
- ast_verbose("Sent RTP P2P packet to %s:%u (type %-2.2d, len %-6.6u)\n", ast_inet_ntoa(bridged->them.sin_addr), ntohs(bridged->them.sin_port), bridged_payload, len - hdrlen);
+ }
rtp->txcount++;
+ rtp->txoctetcount +=(res - hdrlen);
+ if (rtp_debug_test_addr(&bridged->them)) {
+ ast_verbose("Sent RTP P2P packet %d to %s:%u (type %-2.2d, len %-6.6u)\n", rtp->txcount, ast_inet_ntoa(bridged->them.sin_addr), ntohs(bridged->them.sin_port), bridged_payload, len - hdrlen);
+ }
//SKREP rtp->lasttxformat = rtpPT;
return 0;
@@ -1463,23 +1484,10 @@
ast_log(LOG_DEBUG, "RTP NAT: Got audio from other end. Now sending to address %s:%d\n", ast_inet_ntoa(rtp->them.sin_addr), ntohs(rtp->them.sin_port));
}
}
-
- /* If we are bridged to another RTP stream, send direct */
- if ((bridged = ast_rtp_get_bridged(rtp)) && !bridge_p2p_rtp_write(rtp, bridged, rtpheader, res, hdrlen))
- return &ast_null_frame;
-
- if (version != 2)
- return &ast_null_frame;
-
- payloadtype = (seqno & 0x7f0000) >> 16;
- padding = seqno & (1 << 29);
+ /* Stuff that is needed for RTCP - regardless of p2p bridge or not */
mark = seqno & (1 << 23);
- ext = seqno & (1 << 28);
- cc = (seqno & 0xF000000) >> 24;
- seqno &= 0xffff;
timestamp = ntohl(rtpheader[1]);
- ssrc = ntohl(rtpheader[2]);
-
+
if (!mark && rtp->rxssrc && rtp->rxssrc != ssrc) {
if (option_debug || rtpdebug)
ast_log(LOG_DEBUG, "Forcing Marker bit, because SSRC has changed\n");
@@ -1487,6 +1495,46 @@
}
rtp->rxssrc = ssrc;
+
+ if (rtp->themssrc==0)
+ rtp->themssrc = ntohl(rtpheader[2]); /* Record their SSRC to put in future RR */
+
+ if (version != 2)
+ return &ast_null_frame;
+
+ if (res < hdrlen) {
+ ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
+ return &ast_null_frame;
+ }
+ payloadtype = (seqno & 0x7f0000) >> 16;
+ padding = seqno & (1 << 29);
+ ext = seqno & (1 << 28);
+ cc = (seqno & 0xF000000) >> 24;
+ seqno &= 0xffff;
+ ssrc = ntohl(rtpheader[2]);
+
+ rtp->rxcount++; /* Only count reasonably valid packets, this'll make the rtcp stats more accurate */
+
+ if (rtp->rxcount==1) {
+ /* This is the first RTP packet successfully received from source */
+ rtp->seedrxseqno = seqno;
+ }
+
+ if ( (int)rtp->lastrxseqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */
+ rtp->cycles += RTP_SEQ_MOD;
+
+ rtp->lastrxseqno = seqno;
+
+ /* Schedule RTCP report transmissions if possible */
+ ast_rtcp_schedule(rtp);
+
+
+ /* If we are bridged to another RTP stream, send direct */
+ if ((bridged = ast_rtp_get_bridged(rtp)) && !bridge_p2p_rtp_write(rtp, bridged, rtpheader, res, hdrlen))
+ return &ast_null_frame;
+
+
+
if (padding) {
/* Remove padding bytes */
@@ -1504,28 +1552,8 @@
hdrlen += 4;
}
- if (res < hdrlen) {
- ast_log(LOG_WARNING, "RTP Read too short (%d, expecting %d)\n", res, hdrlen);
- return &ast_null_frame;
- }
-
- rtp->rxcount++; /* Only count reasonably valid packets, this'll make the rtcp stats more accurate */
-
- if (rtp->rxcount==1) {
- /* This is the first RTP packet successfully received from source */
- rtp->seedrxseqno = seqno;
- }
-
- /* Schedule RTCP report transmissions if possible */
- ast_rtcp_schedule(rtp);
-
- if ( (int)rtp->lastrxseqno - (int)seqno > 100) /* if so it would indicate that the sender cycled; allow for misordering */
- rtp->cycles += RTP_SEQ_MOD;
-
- rtp->lastrxseqno = seqno;
+
- if (rtp->themssrc==0)
- rtp->themssrc = ntohl(rtpheader[2]); /* Record their SSRC to put in future RR */
if (rtp_debug_test_addr(&sin))
ast_verbose("Got RTP packet from %s:%u (type %-2.2d, seq %-6.6u, ts %-6.6u, len %-6.6u)\n",
More information about the asterisk-commits
mailing list