From 203bfcadc14507f4d01f99099efec8ee976556b1 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Wed, 4 Apr 2007 10:22:10 +0200 Subject: [PATCH 1/1] fix compress filter for big endian systems This time for real. It's almost the same patch as the one just reverted, but this one is tested on both ppc and x86. --- NEWS | 1 + aacdec.c | 4 ++-- configure.ac | 2 ++ filter.h | 16 ++++++++++++++++ mp3dec.c | 9 ++++----- oggdec.c | 4 ++++ osx_write.c | 8 +------- 7 files changed, 30 insertions(+), 14 deletions(-) diff --git a/NEWS b/NEWS index 9277d1cf..59c847b5 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,7 @@ of other improvements/changes/bugfixes also made it into the release. to start only after a few seconds. - fix osx_writer hangs - simplified dccp code (thanks to Gerrit Renker) + - the compress filter works also on big endian systems (ppc) ----------------------------------------- 0.2.15 (2007-02-16) "inductive resonance" diff --git a/aacdec.c b/aacdec.c index 9ed12012..89781c52 100644 --- 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[i]); + fn->loaded += 2; } success: ret = consumed; diff --git a/configure.ac b/configure.ac index aeb6f8d4..316f95c7 100644 --- a/configure.ac +++ b/configure.ac @@ -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 diff --git a/filter.h b/filter.h index 321d763c..456a50de 100644 --- 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) +{ +#ifdef WORDS_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 } }; + + diff --git a/mp3dec.c b/mp3dec.c index 401a03c5..a1374b73 100644 --- 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; diff --git a/oggdec.c b/oggdec.c index 929e2ecc..82ac9b43 100644 --- a/oggdec.c +++ b/oggdec.c @@ -31,7 +31,11 @@ /** \cond some internal constants */ #define BITS 16 +#ifdef WORDS_BIGENDIAN +#define ENDIAN 1 +#else #define ENDIAN 0 +#endif #define SIGN 1 /** \endcond */ diff --git a/osx_write.c b/osx_write.c index 107746c7..f13ec6e1 100644 --- a/osx_write.c +++ b/osx_write.c @@ -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; } -- 2.39.2