aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--configure.ac31
-rw-r--r--src/decoder/aac_plugin.c28
-rw-r--r--src/decoder/mp4_plugin.c10
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);