fix breakage from slin endianness commit earlier today (sorry :-()
authorKevin P. Fleming <kpfleming@digium.com>
Mon, 4 Apr 2005 02:13:40 +0000 (02:13 +0000)
committerKevin P. Fleming <kpfleming@digium.com>
Mon, 4 Apr 2005 02:13:40 +0000 (02:13 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@5375 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_phone.c
channels/iax2-parser.c
frame.c
include/asterisk/frame.h
rtp.c

index 8e5bdb5..7208ea0 100755 (executable)
@@ -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;
index f83e741..61038c3 100755 (executable)
@@ -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 6ae728e..8be142c 100755 (executable)
--- 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<samples; i++)
                dst_s[i] = (src_s[i]<<8) | (src_s[i]>>8);
index 88eb6d5..7be5146 100755 (executable)
@@ -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 22840eb..a81e5a7 100755 (executable)
--- 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);