diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-10-19 21:07:10 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2004-10-19 21:07:10 +0000 |
commit | a79e9dbb300ae43706fc2ed4ab4a48202f385d2b (patch) | |
tree | 9808b35a1b7da0ccc83c89a6fcf29fe16a0b2a98 /rtp.c | |
parent | b75d2252b6b59bdab54c0be68f4c9136610a913c (diff) |
Send empty frames when missing frames arrive (hope this doesn't break anything)
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@4035 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'rtp.c')
-rwxr-xr-x | rtp.c | 18 |
1 files changed, 18 insertions, 0 deletions
@@ -91,6 +91,7 @@ struct ast_rtp { 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 @@ struct ast_frame *ast_rtcp_read(struct ast_rtp *rtp) 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 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp) int hdrlen = 12; int mark; int ext; + int x; char iabuf[INET_ADDRSTRLEN]; unsigned int timestamp; unsigned int *rtpheader; @@ -439,6 +442,7 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp) 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 @@ struct ast_frame *ast_rtp_read(struct ast_rtp *rtp) 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 @@ void ast_rtp_set_peer(struct ast_rtp *rtp, struct sockaddr_in *them) 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) |