[Asterisk-Dev] Explicit endianness support.
Mike Taht
mike.taht at gmail.com
Sat Mar 26 15:12:10 MST 2005
I've moved this to mantis
http://bugs.digium.com/bug_view_page.php?bug_id=0003867
I agree - severe performance hit - and not needed - fixing a symptom
of another problem.
On Sat, 26 Mar 2005 16:03:51 -0500, Steve Kann <stevek at stevek.com> wrote:
>
> On Mar 26, 2005, at 10:48 AM, Mike Taht wrote:
>
> > I went poking about for other endian issues in the code last night,
> > and found a big endian bug in iax2-parser.c. (tested, patch supplied
> > below) Also, rtp.c looks questionable at put_uint32 without something
> > similar. (patch not supplied, untested, my Xscale is at the office,
> > with no way to test rtp til monday)
> >
> > It's unclear to me if all this rigamarole on pulling in an endian
> > header is really necessessary... but if it is, it's needed for David's
> > patches as well.
> >
> > With this patch, a big endian Xscale can successfully negotiate codecs
> > with other iax2 boxes, without it, only the ulaw path works. Shall I
> > file a bug?
>
> This patch doesn't quite make sense to me. The whole get_uint32 and
> friends stuff needs to be set up on any platform where you cannot make
> unaligned memory access; The endian-ness doesn't matter.
>
> So, for example, your patch would unfairly penalize POWERPC, which can
> (at least for modern versions) do unaligned access just fine, but are
> also big-endian.
>
> -SteveK
>
>
> > Index: iax2-parser.c
> > ===================================================================
> > RCS file: /usr/cvsroot/asterisk/channels/iax2-parser.c,v
> > retrieving revision 1.38
> > diff -u -r1.38 iax2-parser.c
> > --- iax2-parser.c 17 Mar 2005 23:12:15 -0000 1.38
> > +++ iax2-parser.c 26 Mar 2005 15:39:06 -0000
> > @@ -21,6 +21,21 @@
> > #include <unistd.h>
> > #include <stdlib.h>
> > #include <stdio.h>
> > +#if defined( __OpenBSD__ )
> > +# include <machine/types.h>
> > +# include <sys/endian.h>
> > +#elif defined( __FreeBSD__ ) || defined( __NetBSD__ )
> > +# include <sys/types.h>
> > +# include <sys/endian.h>
> > +#elif defined( BSD ) && ( BSD >= 199103 ) || defined(__APPLE__)
> > +# include <machine/endian.h>
> > +#elif defined( __sparc__ ) && defined( SOLARIS )
> > +# define BIG_ENDIAN 4321
> > +# define BYTE_ORDER BIG_ENDIAN
> > +# define __BYTE_ORDER __BIG_ENDIAN
> > +#else
> > +# include <endian.h>
> > +#endif
> > #include "iax2.h"
> > #include "iax2-parser.h"
> > #include "iax2-provision.h"
> > @@ -30,13 +45,13 @@
> > static int iframes = 0;
> > static int oframes = 0;
> >
> > -#if defined(SOLARIS) && defined(__sparc__)
> > -static unsigned int get_uint32(unsigned char *p)
> > +#if __BYTE_ORDER == __BIG_ENDIAN
> > +static inline unsigned int get_uint32(unsigned char *p)
> > {
> > return (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
> > }
> >
> > -static unsigned short get_uint16(unsigned char *p)
> > +static inline unsigned short get_uint16(unsigned char *p)
> > {
> > return (p[0] << 8) | p[1] ;
> > }
> >
> >
> >
> > On Fri, 25 Mar 2005 11:40:16 +0000, David Woodhouse
> > <dwmw2 at infradead.org> wrote:
> >> Separate patch to make channels explicitly specify the endianness of
> >> the
> >> linear frames they produce or require.
> >>
> >> I haven't changed chan_nbs or chan_vpb because I'm not sure if the
> >> library we use for each works with native-endian samples or not.
> >>
> >> Comments or alternative solutions...?
> >>
> >> Index: rtp.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/rtp.c,v
> >> retrieving revision 1.114
> >> diff -u -r1.114 rtp.c
> >> --- rtp.c 17 Mar 2005 23:12:15 -0000 1.114
> >> +++ rtp.c 25 Mar 2005 11:38:28 -0000
> >> @@ -593,7 +593,8 @@
> >> case AST_FORMAT_ALAW:
> >> rtp->f.samples = rtp->f.datalen;
> >> break;
> >> - case AST_FORMAT_SLINEAR:
> >> + case AST_FORMAT_SLINEAR_LE:
> >> + case AST_FORMAT_SLINEAR_BE:
> >> rtp->f.samples = rtp->f.datalen / 2;
> >> break;
> >> case AST_FORMAT_GSM:
> >> @@ -654,7 +655,7 @@
> >> {{1, AST_FORMAT_ALAW}, "audio", "PCMA"},
> >> {{1, AST_FORMAT_G726}, "audio", "G726-32"},
> >> {{1, AST_FORMAT_ADPCM}, "audio", "DVI4"},
> >> - {{1, AST_FORMAT_SLINEAR}, "audio", "L16"},
> >> + {{1, AST_FORMAT_SLINEAR_BE}, "audio", "L16"},
> >> {{1, AST_FORMAT_LPC10}, "audio", "LPC"},
> >> {{1, AST_FORMAT_G729A}, "audio", "G729"},
> >> {{1, AST_FORMAT_SPEEX}, "audio", "speex"},
> >> @@ -681,8 +682,8 @@
> >> [6] = {1, AST_FORMAT_ADPCM}, /* 16 kHz */
> >> [7] = {1, AST_FORMAT_LPC10},
> >> [8] = {1, AST_FORMAT_ALAW},
> >> - [10] = {1, AST_FORMAT_SLINEAR}, /* 2 channels */
> >> - [11] = {1, AST_FORMAT_SLINEAR}, /* 1 channel */
> >> + [10] = {1, AST_FORMAT_SLINEAR_BE}, /* 2 channels */
> >> + [11] = {1, AST_FORMAT_SLINEAR_BE}, /* 1 channel */
> >> [13] = {0, AST_RTP_CN},
> >> [16] = {1, AST_FORMAT_ADPCM}, /* 11.025 kHz */
> >> [17] = {1, AST_FORMAT_ADPCM}, /* 22.050 kHz */
> >> @@ -1328,6 +1329,20 @@
> >>
> >> switch(subclass) {
> >> + case AST_FORMAT_SLINEAR_LE:
> >> + case AST_FORMAT_SLINEAR_BE:
> >> + if (!rtp->smoother) {
> >> + rtp->smoother = ast_smoother_new(640);
> >> + }
> >> + if (!rtp->smoother) {
> >> + ast_log(LOG_WARNING, "Unable to create
> >> smoother :(\n");
> >> + return -1;
> >> + }
> >> + ast_smoother_feed(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) {
> >> Index: channels/chan_iax2.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_iax2.c,v
> >> retrieving revision 1.259
> >> diff -u -r1.259 chan_iax2.c
> >> --- channels/chan_iax2.c 24 Mar 2005 05:02:49 -0000 1.259
> >> +++ channels/chan_iax2.c 25 Mar 2005 11:32:21 -0000
> >> @@ -153,7 +153,8 @@
> >> #define IAX_CAPABILITY_FULLBANDWIDTH 0xFFFF
> >> /* T1, maybe ISDN */
> >> #define IAX_CAPABILITY_MEDBANDWIDTH (IAX_CAPABILITY_FULLBANDWIDTH
> >> & \
> >> -
> >> ~AST_FORMAT_SLINEAR & \
> >> +
> >> ~AST_FORMAT_SLINEAR_LE & \
> >> +
> >> ~AST_FORMAT_SLINEAR_BE & \
> >>
> >> ~AST_FORMAT_ULAW & \
> >>
> >> ~AST_FORMAT_ALAW)
> >> /* A modem */
> >> @@ -870,7 +871,8 @@
> >> case AST_FORMAT_G729A:
> >> samples = 160 * (f->datalen / 20);
> >> break;
> >> - case AST_FORMAT_SLINEAR:
> >> + case AST_FORMAT_SLINEAR_LE:
> >> + case AST_FORMAT_SLINEAR_BE:
> >> samples = f->datalen / 2;
> >> break;
> >> case AST_FORMAT_LPC10:
> >> Index: channels/chan_modem.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_modem.c,v
> >> retrieving revision 1.38
> >> diff -u -r1.38 chan_modem.c
> >> --- channels/chan_modem.c 4 Mar 2005 06:47:24 -0000 1.38
> >> +++ channels/chan_modem.c 25 Mar 2005 11:32:21 -0000
> >> @@ -108,7 +108,7 @@
> >> static const struct ast_channel_tech modem_tech = {
> >> .type = type,
> >> .description = tdesc,
> >> - .capabilities = AST_FORMAT_SLINEAR,
> >> + .capabilities = AST_FORMAT_SLINEAR_LE,
> >> .requester = modem_request,
> >> .send_digit = modem_digit,
> >> .call = modem_call,
> >> Index: channels/chan_modem_aopen.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_modem_aopen.c,v
> >> retrieving revision 1.13
> >> diff -u -r1.13 chan_modem_aopen.c
> >> --- channels/chan_modem_aopen.c 24 Jun 2004 13:27:44 -0000 1.13
> >> +++ channels/chan_modem_aopen.c 25 Mar 2005 11:32:21 -0000
> >> @@ -316,7 +316,7 @@
> >> return f;
> >> /* If we get here, we have a complete voice frame */
> >> p->fr.frametype = AST_FRAME_VOICE;
> >> - p->fr.subclass = AST_FORMAT_SLINEAR;
> >> + p->fr.subclass = AST_FORMAT_SLINEAR_LE;
> >> p->fr.samples = 240;
> >> p->fr.data = p->obuf;
> >> p->fr.datalen = p->obuflen;
> >> @@ -436,7 +436,7 @@
> >> {
> >> "AOpen",
> >> aopen_idents,
> >> - AST_FORMAT_SLINEAR,
> >> + AST_FORMAT_SLINEAR_LE,
> >> 0, /* Not full duplex */
> >> aopen_incusecnt, /* incusecnt */
> >> aopen_decusecnt, /* decusecnt */
> >> Index: channels/chan_modem_bestdata.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_modem_bestdata.c,v
> >> retrieving revision 1.14
> >> diff -u -r1.14 chan_modem_bestdata.c
> >> --- channels/chan_modem_bestdata.c 25 Feb 2005 17:32:37 -0000
> >> 1.14
> >> +++ channels/chan_modem_bestdata.c 25 Mar 2005 11:32:21 -0000
> >> @@ -365,7 +365,7 @@
> >> if (f) return f;
> >> /* If we get here, we have a complete voice frame */
> >> p->fr.frametype = AST_FRAME_VOICE;
> >> - p->fr.subclass = AST_FORMAT_SLINEAR;
> >> + p->fr.subclass = AST_FORMAT_SLINEAR_LE;
> >> p->fr.samples = 240;
> >> p->fr.data = p->obuf;
> >> p->fr.datalen = p->obuflen;
> >> @@ -548,7 +548,7 @@
> >> {
> >> "BestData",
> >> bestdata_idents,
> >> - AST_FORMAT_SLINEAR,
> >> + AST_FORMAT_SLINEAR_LE,
> >> 0, /* Not full duplex */
> >> bestdata_incusecnt, /* incusecnt */
> >> bestdata_decusecnt, /* decusecnt */
> >> Index: channels/chan_modem_i4l.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_modem_i4l.c,v
> >> retrieving revision 1.23
> >> diff -u -r1.23 chan_modem_i4l.c
> >> --- channels/chan_modem_i4l.c 24 Jan 2005 21:43:35 -0000 1.23
> >> +++ channels/chan_modem_i4l.c 25 Mar 2005 11:32:21 -0000
> >> @@ -435,7 +436,7 @@
> >>
> >> /* If we get here, we have a complete voice frame */
> >> p->fr.frametype = AST_FRAME_VOICE;
> >> - p->fr.subclass = AST_FORMAT_SLINEAR;
> >> + p->fr.subclass = AST_FORMAT_SLINEAR_LE;
> >> p->fr.samples = 240;
> >> p->fr.data = p->obuf;
> >> p->fr.datalen = p->obuflen;
> >> @@ -475,8 +499,8 @@
> >> ast_log(LOG_WARNING, "Don't know how to handle %d
> >> type frames\n", f->frametype);
> >> return -1;
> >> }
> >> - if (f->subclass != AST_FORMAT_SLINEAR) {
> >> - ast_log(LOG_WARNING, "Don't know how to handle
> >> anything but signed linear frames\n");
> >> + if (f->subclass != AST_FORMAT_SLINEAR_LE) {
> >> + ast_log(LOG_WARNING, "Don't know how to handle
> >> anything but little-endian signed linear frames\n");
> >> return -1;
> >> }
> >> for (x=0;x<f->datalen/2;x++) {
> >> @@ -651,7 +675,7 @@
> >> {
> >> "i4l",
> >> i4l_idents,
> >> - AST_FORMAT_SLINEAR,
> >> + AST_FORMAT_SLINEAR_LE,
> >> 0, /* Not full duplex */
> >> i4l_incusecnt, /* incusecnt */
> >> i4l_decusecnt, /* decusecnt */
> >> Index: channels/chan_phone.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_phone.c,v
> >> retrieving revision 1.45
> >> diff -u -r1.45 chan_phone.c
> >> --- channels/chan_phone.c 4 Mar 2005 06:47:24 -0000 1.45
> >> +++ channels/chan_phone.c 25 Mar 2005 11:32:21 -0000
> >> @@ -77,7 +77,7 @@
> >>
> >> static int silencesupression = 0;
> >>
> >> -static int prefformat = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR |
> >> AST_FORMAT_ULAW;
> >> +static int prefformat = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE |
> >> AST_FORMAT_ULAW;
> >>
> >> AST_MUTEX_DEFINE_STATIC(usecnt_lock);
> >>
> >> @@ -144,7 +144,7 @@
> >> static const struct ast_channel_tech phone_tech = {
> >> .type = type,
> >> .description = tdesc,
> >> - .capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR |
> >> AST_FORMAT_ULAW,
> >> + .capabilities = AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE |
> >> AST_FORMAT_ULAW,
> >> .requester = phone_request,
> >> .send_digit = phone_digit,
> >> .call = phone_call,
> >> @@ -341,10 +341,10 @@
> >> return -1;
> >> }
> >> }
> >> - } else if (ast->rawreadformat == AST_FORMAT_SLINEAR) {
> >> + } else if (ast->rawreadformat == AST_FORMAT_SLINEAR_LE) {
> >> ioctl(p->fd, PHONE_REC_STOP);
> >> - if (p->lastinput != AST_FORMAT_SLINEAR) {
> >> - p->lastinput = AST_FORMAT_SLINEAR;
> >> + if (p->lastinput != AST_FORMAT_SLINEAR_LE) {
> >> + p->lastinput = AST_FORMAT_SLINEAR_LE;
> >> if (ioctl(p->fd, PHONE_REC_CODEC, LINEAR16)) {
> >> ast_log(LOG_WARNING, "Failed to set
> >> codec to signed linear 16\n");
> >> return -1;
> >> @@ -591,7 +591,7 @@
> >> return 0;
> >> }
> >> if (!(frame->subclass &
> >> - (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR |
> >> AST_FORMAT_ULAW)) &&
> >> + (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE |
> >> AST_FORMAT_ULAW)) &&
> >> p->mode != MODE_FXS) {
> >> ast_log(LOG_WARNING, "Cannot handle frames in %d
> >> format\n", frame->subclass);
> >> return -1;
> >> @@ -631,8 +631,8 @@
> >> return -1;
> >> }
> >> maxfr = 24;
> >> - } else if (frame->subclass == AST_FORMAT_SLINEAR) {
> >> - if (p->lastformat != AST_FORMAT_SLINEAR) {
> >> + } else if (frame->subclass == AST_FORMAT_SLINEAR_LE) {
> >> + if (p->lastformat != AST_FORMAT_SLINEAR_LE) {
> >> ioctl(p->fd, PHONE_PLAY_STOP);
> >> ioctl(p->fd, PHONE_REC_STOP);
> >> if (ioctl(p->fd, PHONE_PLAY_CODEC, LINEAR16))
> >> {
> >> @@ -643,8 +643,8 @@
> >> ast_log(LOG_WARNING, "Unable to set
> >> 16-bit linear mode\n");
> >> return -1;
> >> }
> >> - p->lastformat = AST_FORMAT_SLINEAR;
> >> - p->lastinput = AST_FORMAT_SLINEAR;
> >> + p->lastformat = AST_FORMAT_SLINEAR_LE;
> >> + p->lastinput = AST_FORMAT_SLINEAR_LE;
> >> codecset = 1;
> >> /* Reset output buffer */
> >> p->obuflen = 0;
> >> @@ -764,12 +764,12 @@
> >> tmp->nativeformats =
> >> tmp->rawreadformat =
> >> tmp->rawwriteformat =
> >> - AST_FORMAT_SLINEAR;
> >> + AST_FORMAT_SLINEAR_LE;
> >> else {
> >> tmp->nativeformats =
> >> tmp->rawreadformat =
> >> tmp->rawwriteformat =
> >> - prefformat & ~AST_FORMAT_SLINEAR;
> >> + prefformat & ~AST_FORMAT_SLINEAR_LE;
> >> }
> >> }
> >> else {
> >> @@ -1149,7 +1149,7 @@
> >> p = iflist;
> >> while(p) {
> >> if (p->mode == MODE_FXS ||
> >> - format & (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR
> >> | AST_FORMAT_ULAW)) {
> >> + format & (AST_FORMAT_G723_1 |
> >> AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW)) {
> >> size_t length = strlen(p->dev + 5);
> >> if (strncmp(name, p->dev + 5, length) == 0 &&
> >> !isalnum(name[length])) {
> >> @@ -1166,7 +1166,7 @@
> >> restart_monitor();
> >> if (tmp == NULL) {
> >> oldformat = format;
> >> - format &= (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR |
> >> AST_FORMAT_ULAW);
> >> + format &= (AST_FORMAT_G723_1 | AST_FORMAT_SLINEAR_LE
> >> | AST_FORMAT_ULAW);
> >> if (!format) {
> >> ast_log(LOG_NOTICE, "Asked to get a channel
> >> of unsupported format '%d'\n", oldformat);
> >> return NULL;
> >> @@ -1317,8 +1317,8 @@
> >> prefformat = AST_FORMAT_G723_1;
> >> } else if (!strcasecmp(v->value, "slinear")) {
> >> if (mode == MODE_FXS)
> >> - prefformat |= AST_FORMAT_SLINEAR;
> >> - else prefformat = AST_FORMAT_SLINEAR;
> >> + prefformat |=
> >> AST_FORMAT_SLINEAR_LE;
> >> + else prefformat =
> >> AST_FORMAT_SLINEAR_LE;
> >> } else if (!strcasecmp(v->value, "ulaw")) {
> >> prefformat = AST_FORMAT_ULAW;
> >> } else
> >> Index: channels/chan_zap.c
> >> ===================================================================
> >> RCS file: /usr/cvsroot/asterisk/channels/chan_zap.c,v
> >> retrieving revision 1.420
> >> diff -u -r1.420 chan_zap.c
> >> --- channels/chan_zap.c 23 Mar 2005 21:12:01 -0000 1.420
> >> +++ channels/chan_zap.c 25 Mar 2005 11:32:24 -0000
> >> @@ -630,7 +630,7 @@
> >> static const struct ast_channel_tech zap_tech = {
> >> .type = type,
> >> .description = tdesc,
> >> - .capabilities = AST_FORMAT_SLINEAR | AST_FORMAT_ULAW,
> >> + .capabilities = AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW,
> >> .requester = zt_request,
> >> .send_digit = zt_digit,
> >> .send_text = zt_sendtext,
> >> @@ -4119,7 +4119,7 @@
> >> return &p->subs[index].f;
> >> }
> >>
> >> - if (ast->rawreadformat == AST_FORMAT_SLINEAR) {
> >> + if (ast->rawreadformat == AST_FORMAT_SLINEAR_LE) {
> >> if (!p->subs[index].linear) {
> >> p->subs[index].linear = 1;
> >> res = zt_setlinear(p->subs[index].zfd,
> >> p->subs[index].linear);
> >> @@ -4380,7 +4380,7 @@
> >> ast_log(LOG_WARNING, "Don't know what to do
> >> with frame type '%d'\n", frame->frametype);
> >> return 0;
> >> }
> >> - if ((frame->subclass != AST_FORMAT_SLINEAR) &&
> >> + if ((frame->subclass != AST_FORMAT_SLINEAR_LE) &&
> >> (frame->subclass != AST_FORMAT_ULAW) &&
> >> (frame->subclass != AST_FORMAT_ALAW)) {
> >> ast_log(LOG_WARNING, "Cannot handle frames in %d
> >> format\n", frame->subclass);
> >> @@ -4409,7 +4409,7 @@
> >> return 0;
> >> }
> >>
> >> - if (frame->subclass == AST_FORMAT_SLINEAR) {
> >> + if (frame->subclass == AST_FORMAT_SLINEAR_LE) {
> >> if (!p->subs[index].linear) {
> >> p->subs[index].linear = 1;
> >> res = zt_setlinear(p->subs[index].zfd,
> >> p->subs[index].linear);
> >> @@ -4679,7 +4679,7 @@
> >> } while (x < 3);
> >> tmp->type = type;
> >> tmp->fds[0] = i->subs[index].zfd;
> >> - tmp->nativeformats = AST_FORMAT_SLINEAR | deflaw;
> >> + tmp->nativeformats = AST_FORMAT_SLINEAR_LE | deflaw;
> >> /* Start out assuming ulaw since it's smaller :) */
> >> tmp->rawreadformat = deflaw;
> >> tmp->readformat = deflaw;
> >> @@ -7059,7 +7059,7 @@
> >> end = ifend;
> >> /* We do signed linear */
> >> oldformat = format;
> >> - format &= (AST_FORMAT_SLINEAR | AST_FORMAT_ULAW);
> >> + format &= (AST_FORMAT_SLINEAR_LE | AST_FORMAT_ULAW);
> >> if (!format) {
> >> ast_log(LOG_NOTICE, "Asked to get a channel of
> >> unsupported format '%d'\n", oldformat);
> >> return NULL;
> >>
> >>
> >> --
> >> dwmw2
> >>
> >> _______________________________________________
> >> Asterisk-Dev mailing list
> >> Asterisk-Dev at lists.digium.com
> >> http://lists.digium.com/mailman/listinfo/asterisk-dev
> >> To UNSUBSCRIBE or update options visit:
> >> http://lists.digium.com/mailman/listinfo/asterisk-dev
> >>
> > _______________________________________________
> > Asterisk-Dev mailing list
> > Asterisk-Dev at lists.digium.com
> > http://lists.digium.com/mailman/listinfo/asterisk-dev
> > To UNSUBSCRIBE or update options visit:
> > http://lists.digium.com/mailman/listinfo/asterisk-dev
> >
>
>
More information about the asterisk-dev
mailing list