aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2008-11-16 20:04:49 +0100
committerMax Kellermann <max@duempel.org>2008-11-16 20:04:49 +0100
commit9c4e97a61b59105c9b539faca272305bbb234c17 (patch)
treedb659e51b1fdf1893475d4fb4af4702bbb71a954
parentacfba02310a1b8159440dd71bdf7c7fefb7ef8fb (diff)
downloadmpd-9c4e97a61b59105c9b539faca272305bbb234c17.tar.gz
mpd-9c4e97a61b59105c9b539faca272305bbb234c17.tar.xz
mpd-9c4e97a61b59105c9b539faca272305bbb234c17.zip
aac: detect whether to pass "uint32_t*" to NeAACDecInit2()
neaacdec.h declares all arguments as "unsigned long", but internally expects uint32_t pointers. This triggers gcc warnings on 64 bit architectures. To avoid that, make configure.ac detect whether we're using Debian's corrected headers or the original libfaad headers. In any case, pass a pointer to an uint32_t, conditionally casted to "unsigned long*".
-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);