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

Modified Files:
      Tag: v1-0
        ChangeLog frame.c rtp.c 
Log Message:
handle AST_FORMAT_SLINEAR endianness properly on big-endian systems (bug #3865)


Index: ChangeLog
===================================================================
RCS file: /usr/cvsroot/asterisk/ChangeLog,v
retrieving revision 1.74.2.39
retrieving revision 1.74.2.40
diff -u -d -r1.74.2.39 -r1.74.2.40
--- ChangeLog   5 Apr 2005 06:58:02 -0000       1.74.2.39
+++ ChangeLog   5 Apr 2005 07:10:06 -0000       1.74.2.40
@@ -27,6 +27,8 @@
        a new line, it would not be processed
     -- Fixed the logger so that color escape sequences wouldn't be sent to the 
logs
     -- Fixed a logic error when setting the "rtpchecksums" option
+    -- A lot of changes were made to correctly handle signed linear format on
+       big endian machines
 
 Asterisk 1.0.7
 

Index: frame.c
===================================================================
RCS file: /usr/cvsroot/asterisk/frame.c,v
retrieving revision 1.36.2.4
retrieving revision 1.36.2.5
diff -u -d -r1.36.2.4 -r1.36.2.5
--- frame.c     28 Jan 2005 01:18:25 -0000      1.36.2.4
+++ frame.c     5 Apr 2005 07:10:06 -0000       1.36.2.5
@@ -83,7 +83,7 @@
        s->flags = flags;
 }
 
-int ast_smoother_feed(struct ast_smoother *s, struct ast_frame *f)
+int __ast_smoother_feed(struct ast_smoother *s, struct ast_frame *f, int swap)
 {
        if (f->frametype != AST_FRAME_VOICE) {
                ast_log(LOG_WARNING, "Huh?  Can't smooth a non-voice frame!\n");
@@ -129,7 +129,10 @@
                        return 0;
                }
        }
-       memcpy(s->data + s->len, f->data, f->datalen);
+       if (swap)
+               ast_memcpy_byteswap(s->data+s->len, f->data, f->samples);
+       else
+               memcpy(s->data + s->len, f->data, f->datalen);
        /* If either side is empty, reset the delivery time */
        if (!s->len || (!f->delivery.tv_sec && !f->delivery.tv_usec) ||
                        (!s->delivery.tv_sec && !s->delivery.tv_usec))
@@ -399,6 +402,16 @@
        return ast_fr_fdwrite(fd, &hangup);
 }
 
+void ast_memcpy_byteswap(void *dst, void *src, int samples)
+{
+       int i;
+       unsigned short *dst_s = dst;
+       unsigned short *src_s = src;
+
+       for (i=0; i<samples; i++)
+               dst_s[i] = (src_s[i]<<8)|(src_s[i]>>8);
+}
+
 static struct ast_format_list AST_FORMAT_LIST[] = {
        { 1, AST_FORMAT_G723_1 , "g723" , "G.723.1"},
        { 1, AST_FORMAT_GSM, "gsm" , "GSM"},

Index: rtp.c
===================================================================
RCS file: /usr/cvsroot/asterisk/rtp.c,v
retrieving revision 1.92.2.9
retrieving revision 1.92.2.10
diff -u -d -r1.92.2.9 -r1.92.2.10
--- rtp.c       5 Apr 2005 06:53:14 -0000       1.92.2.9
+++ rtp.c       5 Apr 2005 07:10:06 -0000       1.92.2.10
@@ -547,6 +547,7 @@
                        break;
                case AST_FORMAT_SLINEAR:
                        rtp->f.samples = rtp->f.datalen / 2;
+                       ast_frame_byteswap_be(&rtp->f);
                        break;
                case AST_FORMAT_GSM:
                        rtp->f.samples = 160 * (rtp->f.datalen / 33);
@@ -1196,6 +1197,19 @@
 
 
        switch(subclass) {
+       case AST_FORMAT_SLINEAR:
+               if (!rtp->smoother) {
+                       rtp->smoother = ast_smoother_new(320);
+               }
+               if (!rtp->smoother) {
+                       ast_log(LOG_WARNING, "Unable to create smoother :(\n");
+                       return -1;
+               }
+               ast_smoother_feed_be(rtp->smoother, _f);
+               
+               while((f = ast_smoother_read(rtp->smoother)))
+                       ast_rtp_raw_write(rtp, f, codec);
+               break;
        case AST_FORMAT_ULAW:
        case AST_FORMAT_ALAW:
                if (!rtp->smoother) {

_______________________________________________
Asterisk-Cvs mailing list
[email protected]
http://lists.digium.com/mailman/listinfo/asterisk-cvs

Reply via email to