diff options
-rw-r--r-- | configure.ac | 31 | ||||
-rw-r--r-- | src/decoder/aac_plugin.c | 28 | ||||
-rw-r--r-- | src/decoder/mp4_plugin.c | 10 |
3 files changed, 62 insertions, 7 deletions
diff --git a/configure.ac b/configure.ac index 007658ab8..944c1c153 100644 --- a/configure.ac +++ b/configure.ac @@ -623,6 +623,37 @@ fi AM_CONDITIONAL(HAVE_FAAD, test x$enable_aac = xyes) if test x$enable_aac = xyes; then + oldcflags=$CFLAGS + oldlibs=$LIBS + oldcppflags=$CPPFLAGS + CFLAGS="$CFLAGS $MPD_CFLAGS $FAAD_CFLAGS -Werror" + LIBS="$LIBS $MPD_LIBS $FAAD_LIBS" + CPPFLAGS=$CFLAGS + + AC_MSG_CHECKING(for broken libfaad headers) + AC_COMPILE_IFELSE([ +#include <faad.h> +#include <stddef.h> +#include <stdint.h> + +int main() { + unsigned char channels; + uint32_t sample_rate; + + faacDecInit2(NULL, NULL, 0, &sample_rate, &channels); + return 0; +} + ], + [AC_MSG_RESULT(correct)], + [AC_MSG_RESULT(broken); + AC_DEFINE(HAVE_FAAD_LONG, 1, [Define if faad.h uses the broken "unsigned long" pointers])]) + + CFLAGS=$oldcflags + LIBS=$oldlibs + CPPFLAGS=$oldcppflags +fi + +if test x$enable_aac = xyes; then enable_mp4=yes MP4FF_LIBS="-lmp4ff" diff --git a/src/decoder/aac_plugin.c b/src/decoder/aac_plugin.c index 76f5480e7..95b19735a 100644 --- a/src/decoder/aac_plugin.c +++ b/src/decoder/aac_plugin.c @@ -251,7 +251,15 @@ static float getAacFloatTotalTime(const char *file) float length; faacDecHandle decoder; faacDecConfigurationPtr config; - unsigned long sample_rate; + uint32_t sample_rate; +#ifdef HAVE_FAAD_LONG + /* neaacdec.h declares all arguments as "unsigned long", but + internally expects uint32_t pointers. To avoid gcc + warnings, use this workaround. */ + unsigned long *sample_rate_r = (unsigned long*)&sample_rate; +#else + uint32_t *sample_rate_r = &sample_rate; +#endif unsigned char channels; struct input_stream inStream; long bread; @@ -272,9 +280,9 @@ static float getAacFloatTotalTime(const char *file) fillAacBuffer(&b); #ifdef HAVE_FAAD_BUFLEN_FUNCS bread = faacDecInit(decoder, b.buffer, b.bytesIntoBuffer, - &sample_rate, &channels); + sample_rate_r, &channels); #else - bread = faacDecInit(decoder, b.buffer, &sample_rate, &channels); + bread = faacDecInit(decoder, b.buffer, sample_rate_r, &channels); #endif if (bread >= 0 && sample_rate > 0 && channels > 0) length = 0; @@ -307,7 +315,15 @@ aac_stream_decode(struct decoder *mpd_decoder, struct input_stream *inStream) faacDecFrameInfo frameInfo; faacDecConfigurationPtr config; long bread; - unsigned long sample_rate; + uint32_t sample_rate; +#ifdef HAVE_FAAD_LONG + /* neaacdec.h declares all arguments as "unsigned long", but + internally expects uint32_t pointers. To avoid gcc + warnings, use this workaround. */ + unsigned long *sample_rate_r = (unsigned long*)&sample_rate; +#else + uint32_t *sample_rate_r = &sample_rate; +#endif unsigned char channels; unsigned int sampleCount; char *sampleBuffer; @@ -343,9 +359,9 @@ aac_stream_decode(struct decoder *mpd_decoder, struct input_stream *inStream) #ifdef HAVE_FAAD_BUFLEN_FUNCS bread = faacDecInit(decoder, b.buffer, b.bytesIntoBuffer, - &sample_rate, &channels); + sample_rate_r, &channels); #else - bread = faacDecInit(decoder, b.buffer, &sample_rate, &channels); + bread = faacDecInit(decoder, b.buffer, sample_rate_r, &channels); #endif if (bread < 0) { ERROR("Error not a AAC stream.\n"); diff --git a/src/decoder/mp4_plugin.c b/src/decoder/mp4_plugin.c index 2736d3059..f97ffe50a 100644 --- a/src/decoder/mp4_plugin.c +++ b/src/decoder/mp4_plugin.c @@ -112,6 +112,14 @@ mp4_decode(struct decoder *mpd_decoder, struct input_stream *input_stream) unsigned char *mp4_buffer; unsigned int mp4_buffer_size; uint32_t sample_rate; +#ifdef HAVE_FAAD_LONG + /* neaacdec.h declares all arguments as "unsigned long", but + internally expects uint32_t pointers. To avoid gcc + warnings, use this workaround. */ + unsigned long *sample_rate_r = (unsigned long*)&sample_rate; +#else + uint32_t *sample_rate_r = &sample_rate; +#endif unsigned char channels; long sample_id; long num_samples; @@ -160,7 +168,7 @@ mp4_decode(struct decoder *mpd_decoder, struct input_stream *input_stream) mp4ff_get_decoder_config(mp4fh, track, &mp4_buffer, &mp4_buffer_size); if (faacDecInit2(decoder, mp4_buffer, mp4_buffer_size, - &sample_rate, &channels) < 0) { + sample_rate_r, &channels) < 0) { g_warning("Not an AAC stream.\n"); faacDecClose(decoder); mp4ff_close(mp4fh); |