From fc3600f9e402828a63873da8791c64cf55cb6a41 Mon Sep 17 00:00:00 2001 From: kpfleming Date: Mon, 4 Apr 2005 02:13:40 +0000 Subject: fix breakage from slin endianness commit earlier today (sorry :-() git-svn-id: http://svn.digium.com/svn/asterisk/trunk@5375 f38db490-d61c-443f-a65b-d21fe96a405b --- channels/chan_phone.c | 2 +- channels/iax2-parser.c | 2 +- frame.c | 4 ++-- include/asterisk/frame.h | 2 +- rtp.c | 26 +++++++++++++++++++------- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/channels/chan_phone.c b/channels/chan_phone.c index 8e5bdb523..7208ea09e 100755 --- a/channels/chan_phone.c +++ b/channels/chan_phone.c @@ -559,7 +559,7 @@ static int phone_write_buf(struct phone_pvt *p, const char *buf, int len, int fr if (space < len) len = space; if (swap) - ast_memcpy_byteswap(p->obuf+p->obuflen, buf, len/2); + ast_swapcopy_samples(p->obuf+p->obuflen, buf, len/2); else memcpy(p->obuf + p->obuflen, buf, len); p->obuflen += len; diff --git a/channels/iax2-parser.c b/channels/iax2-parser.c index f83e7413f..61038c338 100755 --- a/channels/iax2-parser.c +++ b/channels/iax2-parser.c @@ -859,7 +859,7 @@ void iax_frame_wrap(struct iax_frame *fr, struct ast_frame *f) #if __BYTE_ORDER == __LITTLE_ENDIAN /* We need to byte-swap slinear samples from network byte order */ if (fr->af.subclass == AST_FORMAT_SLINEAR) { - ast_memcpy_byteswap(fr->af.data, f->data, fr->af.samples); + ast_swapcopy_samples(fr->af.data, f->data, fr->af.samples); } else #endif memcpy(fr->af.data, f->data, fr->af.datalen); diff --git a/frame.c b/frame.c index 6ae728e9c..8be142cbb 100755 --- a/frame.c +++ b/frame.c @@ -402,11 +402,11 @@ int ast_fr_fdhangup(int fd) return ast_fr_fdwrite(fd, &hangup); } -void ast_swapcopy_samples(void *dst, void *src, int samples) +void ast_swapcopy_samples(void *dst, const void *src, int samples) { int i; unsigned short *dst_s = dst; - unsigned short *src_s = src; + const unsigned short *src_s = src; for (i=0; i>8); diff --git a/include/asterisk/frame.h b/include/asterisk/frame.h index 88eb6d5c7..7be514610 100755 --- a/include/asterisk/frame.h +++ b/include/asterisk/frame.h @@ -301,7 +301,7 @@ int ast_fr_fdwrite(int fd, struct ast_frame *frame); */ int ast_fr_fdhangup(int fd); -void ast_swapcopy_samples(void *dst, void *src, int samples); +void ast_swapcopy_samples(void *dst, const void *src, int samples); /* Helpers for byteswapping native samples to/from little-endian and big-endian. */ diff --git a/rtp.c b/rtp.c index 22840eb3c..a81e5a7db 100755 --- a/rtp.c +++ b/rtp.c @@ -76,6 +76,7 @@ struct ast_rtp { unsigned char rawdata[8192 + AST_FRIENDLY_OFFSET]; unsigned int ssrc; unsigned int lastts; + unsigned int lastdigitts; unsigned int lastrxts; unsigned int lastividtimestamp; unsigned int lastovidtimestamp; @@ -1014,6 +1015,7 @@ void ast_rtp_reset(struct ast_rtp *rtp) memset(&rtp->txcore, 0, sizeof(rtp->txcore)); memset(&rtp->dtmfmute, 0, sizeof(rtp->dtmfmute)); rtp->lastts = 0; + rtp->lastdigitts = 0; rtp->lastrxts = 0; rtp->lastividtimestamp = 0; rtp->lastovidtimestamp = 0; @@ -1107,30 +1109,34 @@ int ast_rtp_senddigit(struct ast_rtp *rtp, char digit) /* Get a pointer to the header */ rtpheader = (unsigned int *)data; rtpheader[0] = htonl((2 << 30) | (1 << 23) | (payload << 16) | (rtp->seqno++)); - rtpheader[1] = htonl(rtp->lastts); + rtpheader[1] = htonl(rtp->lastdigitts); rtpheader[2] = htonl(rtp->ssrc); rtpheader[3] = htonl((digit << 24) | (0xa << 16) | (0)); 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) + 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 %d, ts %d, len %d)\n" - , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastts,res - hdrlen); + , ast_inet_ntoa(iabuf, sizeof(iabuf), rtp->them.sin_addr), ntohs(rtp->them.sin_port), payload, rtp->seqno, rtp->lastdigitts, res - hdrlen); } + /* Clear marker bit and increment seqno */ + rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno++)); + /* For the last three packets, set the duration and the end bit */ if (x == 2) { - /* Clear marker bit and increment seqno */ - rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno++)); /* Make duration 800 (100ms) */ rtpheader[3] |= htonl((800)); /* Set the End bit for the last 3 */ rtpheader[3] |= htonl((1 << 23)); - } else if ( x < 5) { - rtpheader[0] = htonl((2 << 30) | (payload << 16) | (rtp->seqno++)); } } + /* Increment the digit timestamp by 100ms, to ensure that digits + sent sequentially with no intervening non-digit packets do not + get sent with the same timestamp. + */ + rtp->lastdigitts += 800; return 0; } @@ -1256,6 +1262,12 @@ static int ast_rtp_raw_write(struct ast_rtp *rtp, struct ast_frame *f, int codec } } } + /* If the timestamp for non-digit packets has moved beyond the timestamp + for digits, update the digit timestamp. + */ + if (rtp->lastts > rtp->lastdigitts) + rtp->lastdigitts = rtp->lastts; + /* Get a pointer to the header */ rtpheader = (unsigned char *)(f->data - hdrlen); -- cgit v1.2.3