fix compress filter for big endian machines
authorAndre Noll <maan@systemlinux.org>
Fri, 30 Mar 2007 15:14:04 +0000 (17:14 +0200)
committerAndre Noll <maan@systemlinux.org>
Fri, 30 Mar 2007 15:14:04 +0000 (17:14 +0200)
This was broken since day one as it depended on little-endianness. Fix
it by checking the byte sex in configure and let the decoders
produce host endian 16 bit audio output by using the new
write_int16_host_endian() inline function in filter.h

This allows to omit the ugly byte-swapping in osx_write we've had
before.

aacdec.c
configure.ac
filter.h
mp3dec.c
oggdec.c
osx_write.c

index 9ed1201..c860a3b 100644 (file)
--- a/aacdec.c
+++ b/aacdec.c
@@ -154,8 +154,8 @@ static ssize_t aacdec(char *input_buffer, size_t len, struct filter_node *fn)
                goto out;
        for (i = 0; i < padd->frame_info.samples; i++) {
                short *s = (short *)outbuffer;
-               fn->buf[fn->loaded++] = s[i] & 0xff;
-               fn->buf[fn->loaded++] = (s[i] >> 8) & 0xff;
+               write_int16_host_endian(fn->buf + fn->loaded, s);
+               fn->loaded += 2;
        }
 success:
        ret = consumed;
index aeb6f8d..316f95c 100644 (file)
@@ -15,6 +15,8 @@ AC_MSG_CHECKING(os type)
 OSTYPE="`$UNAMEPATH -s`"
 AC_MSG_RESULT("$OSTYPE")
 
+AC_C_BIGENDIAN()
+
 AC_PROG_CC
 AC_PROG_CPP
 AC_PROG_INSTALL
index 321d763..06d727f 100644 (file)
--- a/filter.h
+++ b/filter.h
@@ -299,6 +299,20 @@ void (*print_help)(void);
  */
 void *(*parse_config)(int argc, char **argv);
 };
+
+
+static inline void write_int16_host_endian(char *buf, int16_t val)
+{
+#ifndef BIGENDIAN
+       *buf = val >> 8;
+       *(buf + 1) = val & 0xff;
+#else
+       *buf = val & 0xff;
+       *(buf + 1) = val >> 8;
+#endif
+}
+
+
 /** \cond */
 extern struct filter filters[];
 #define DECLARE_EXTERN_FILTER_INIT(name) \
@@ -348,3 +362,5 @@ DECLARE_EXTERN_FILTER_INIT(oggdec);
        AACDEC_FILTER \
        OGGDEC_FILTER \
        { .name = NULL } };
+
+
index 401a03c..a1374b7 100644 (file)
--- a/mp3dec.c
+++ b/mp3dec.c
@@ -74,14 +74,13 @@ next_frame:
        mad_synth_frame(&pmd->synth, &pmd->frame);
 
        for (i = 0; i < pmd->synth.pcm.length; i++) {
-               /* output format: unsigned 16 bit little endian */
                signed short s = MAD_TO_SHORT(pmd->synth.pcm.samples[0][i]);
-               fn->buf[fn->loaded++] = s & 0xff;
-               fn->buf[fn->loaded++] = s >> 8;
+               write_int16_host_endian(fn->buf + fn->loaded, s);
+               fn->loaded += 2;
                if (MAD_NCHANNELS(&pmd->frame.header) == 2) { /* stereo */
                        s = MAD_TO_SHORT(pmd->synth.pcm.samples[1][i]);
-                       fn->buf[fn->loaded++] = s & 0xff;
-                       fn->buf[fn->loaded++] = s >> 8;
+                       write_int16_host_endian(fn->buf + fn->loaded, s);
+                       fn->loaded += 2;
                }
                if (fn->loaded != fn->bufsize) /* output buffer not full */
                        continue;
index 929e2ec..2ec13d8 100644 (file)
--- a/oggdec.c
+++ b/oggdec.c
 
 /** \cond some internal constants */
 #define BITS 16
+#ifdef BIGENDIAN
 #define ENDIAN 0
+#else
+#define ENDIAN 1
+#endif
 #define SIGN 1
 /** \endcond */
 
index 107746c..f13ec6e 100644 (file)
@@ -111,14 +111,8 @@ static void fill_buffer(struct osx_buffer *b, short *source, long size)
                b->size = size;
        }
        dest = b->buffer;
-       while (size--) {
-               char *tmp = (char *)source;
-               char c = *tmp;
-               *tmp = *(tmp + 1);
-               *(tmp + 1) = c;
-               /* *dest++ = ((*source++) + 32768) / 65536.0; */
+       while (size--)
                *dest++ = (*source++) / 32768.0;
-       }
        b->ptr = b->buffer;
        b->remaining = b->size;
 }