[Asterisk-cvs] asterisk rtp.c,1.92,1.93

markster at lists.digium.com markster at lists.digium.com
Tue Oct 19 17:02:49 CDT 2004


Update of /usr/cvsroot/asterisk
In directory mongoose.digium.com:/tmp/cvs-serv8059

Modified Files:
	rtp.c 
Log Message:
Send empty frames when missing frames arrive (hope this doesn't break anything)


Index: rtp.c
===================================================================
RCS file: /usr/cvsroot/asterisk/rtp.c,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- rtp.c	18 Sep 2004 13:56:28 -0000	1.92
+++ rtp.c	19 Oct 2004 21:07:10 -0000	1.93
@@ -91,6 +91,7 @@
 	struct ast_smoother *smoother;
 	int *ioid;
 	unsigned short seqno;
+	unsigned short rxseqno;
 	struct sched_context *sched;
 	struct io_context *io;
 	void *data;
@@ -361,6 +362,7 @@
 		if ((rtp->rtcp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
 		    (rtp->rtcp->them.sin_port != sin.sin_port)) {
 			memcpy(&rtp->them, &sin, sizeof(rtp->them));
+			rtp->rxseqno = 0;
 			ast_log(LOG_DEBUG, "RTP NAT: Using address %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->rtcp->them.sin_addr), ntohs(rtp->rtcp->them.sin_port));
 		}
 	}
@@ -401,6 +403,7 @@
 	int hdrlen = 12;
 	int mark;
 	int ext;
+	int x;
 	char iabuf[INET_ADDRSTRLEN];
 	unsigned int timestamp;
 	unsigned int *rtpheader;
@@ -439,6 +442,7 @@
 		if ((rtp->them.sin_addr.s_addr != sin.sin_addr.s_addr) ||
 		    (rtp->them.sin_port != sin.sin_port)) {
 			memcpy(&rtp->them, &sin, sizeof(rtp->them));
+			rtp->rxseqno = 0;
 			ast_log(LOG_DEBUG, "RTP NAT: Using address %s:%d\n", ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port));
 		}
 	}
@@ -500,6 +504,19 @@
 	if (!rtp->lastrxts)
 		rtp->lastrxts = timestamp;
 
+	if (rtp->rxseqno) {
+		for (x=rtp->rxseqno + 1; x < seqno; x++) {
+			/* Queue empty frames */
+			rtp->f.mallocd = 0;
+			rtp->f.datalen = 0;
+			rtp->f.data = NULL;
+			rtp->f.offset = 0;
+			rtp->f.samples = 0;
+			rtp->f.src = "RTPMissedFrame";
+		}
+	}
+	rtp->rxseqno = seqno;
+
 	if (rtp->dtmfcount) {
 #if 0
 		printf("dtmfcount was %d\n", rtp->dtmfcount);
@@ -908,6 +925,7 @@
 		rtp->rtcp->them.sin_port = htons(ntohs(them->sin_port) + 1);
 		rtp->rtcp->them.sin_addr = them->sin_addr;
 	}
+	rtp->rxseqno = 0;
 }
 
 void ast_rtp_get_peer(struct ast_rtp *rtp, struct sockaddr_in *them)




More information about the svn-commits mailing list