From: Andre Noll Date: Wed, 4 Apr 2007 08:22:10 +0000 (+0200) Subject: fix compress filter for big endian systems X-Git-Tag: v0.2.16~4 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=203bfcadc14507f4d01f99099efec8ee976556b1;hp=4afedc13b9eadd60c1b5c542ba14ee73efc5a4d5 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. --- 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; }