diff options
author | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-03-15 18:15:33 +0000 |
---|---|---|
committer | tilghman <tilghman@f38db490-d61c-443f-a65b-d21fe96a405b> | 2006-03-15 18:15:33 +0000 |
commit | f2b299b22ebf792120665fb0fe4c2442c2259a8f (patch) | |
tree | c769e7c3242d0b117aafe67b12263c41026ad637 /rtp.c | |
parent | 6e30fbbca6806d50a9d08a4d2a59ce0537d07fcd (diff) |
Merged revisions 13095 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2
........
r13095 | tilghman | 2006-03-15 12:07:06 -0600 (Wed, 15 Mar 2006) | 2 lines
Reverting patch from bug 6667
........
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@13096 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'rtp.c')
-rw-r--r-- | rtp.c | 57 |
1 files changed, 21 insertions, 36 deletions
@@ -1193,7 +1193,6 @@ int ast_rtp_senddigit(struct ast_rtp *rtp, char digit) int hdrlen = 12; int res; int x; - unsigned short duration = 0; int payload; char data[256]; char iabuf[INET_ADDRSTRLEN]; @@ -1226,8 +1225,7 @@ int ast_rtp_senddigit(struct ast_rtp *rtp, char digit) rtpheader[1] = htonl(rtp->lastdigitts); rtpheader[2] = htonl(rtp->ssrc); rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (0)); - - for (x = 0; x < 5; x++) { + for (x = 0; x < 6; x++) { if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) { res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &rtp->them, sizeof(rtp->them)); if (res < 0) @@ -1239,48 +1237,35 @@ int ast_rtp_senddigit(struct ast_rtp *rtp, char digit) ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen); } - - /* Sequence number must be incremented for every packet */ - rtp->seqno++; + /* Sequence number of last two end packets does not get incremented */ + if (x < 3) + rtp->seqno++; /* Clear marker bit and set seqno */ rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno)); - /* Increment duration for 160 (20ms) */ - duration += 160; - rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (duration)); - } - - /* Set the End bit */ - rtpheader[3] |= htonl((1 << 23)); - - /* Send last packet and repeat it 2 times */ - for (x = 0; x < 3; x++) { - if (rtp->them.sin_port && rtp->them.sin_addr.s_addr) { - res = sendto(rtp->s, (void *) rtpheader, hdrlen + 4, 0, (struct sockaddr *) &rtp->them, sizeof(rtp->them)); - if (res < 0) { - ast_log(LOG_ERROR, "RTP Transmission error to %s:%d: %s\n", - ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), - ntohs(rtp->them.sin_port), strerror(errno)); - } - if (rtp_debug_test_addr(&rtp->them)) { - ast_verbose("Sent RTP packet to %s:%d (type %d, seq %u, ts %u, len %u)\n", - ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), - ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen); - } + /* For the last three packets, set the duration and the end bit */ + if (x == 2) { +#if 0 + /* No, this is wrong... Do not increment lastdigitts, that's not according + to the RFC, as best we can determine */ + rtp->lastdigitts++; /* or else the SPA3000 will click instead of beeping... */ + rtpheader[1] = htonl(rtp->lastdigitts); +#endif + /* Make duration 800 (100ms) */ + rtpheader[3] |= htonl((800)); + /* Set the End bit */ + rtpheader[3] |= htonl((1 << 23)); } - - /* Sequence number must be incremented for every packet, even for retransmitted last two packets */ - rtp->seqno++; - /* Set seqno */ - rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno)); } - /* Increment the digit timestamp by 120ms, to ensure that digits sent sequentially with no intervening non-digit packets do not get sent with the same timestamp, and that sequential digits have some 'dead air' in between them */ - duration += 160; - rtp->lastdigitts += duration; + rtp->lastdigitts += 960; + /* Increment the sequence number to reflect the last packet + that was sent + */ + rtp->seqno++; return 0; } |