diff --git a/configure.ac b/configure.ac index 9c695a254..e2b5f16f7 100644 --- a/configure.ac +++ b/configure.ac @@ -277,6 +277,9 @@ if test x$enable_aac = xyes; then LIBS="$LIBS $MPD_LIBS $FAAD_LIBS" CPPFLAGS=$CFLAGS AC_CHECK_HEADER(faad.h,,enable_aac=no) + if test x$enable_aac = xyes; then + AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include ]) + fi if test x$enable_aac = xyes; then AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include ]) fi @@ -284,7 +287,68 @@ if test x$enable_aac = xyes; then AC_CHECK_LIB(faad,faacDecInit2,[MPD_LIBS="$MPD_LIBS $FAAD_LIBS";MPD_CFLAGS="$MPD_CFLAGS $FAAD_CFLAGS";MP4FF_SUBDIR="mp4ff";MP4FF_LIB="mp4ff/libmp4ff.la"],enable_aac=no) fi if test x$enable_aac = xyes; then - AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR],,,[#include ]) + AC_MSG_CHECKING(that FAAD2 uses buffer and bufferlen) + AC_COMPILE_IFELSE([ +#include + +int main() { + char buffer; + long bufferlen = 0; + faacDecHandle decoder; + faacDecFrameInfo frameInfo; + faacDecConfigurationPtr config; + unsigned char channels; + long sampleRate; + mp4AudioSpecificConfig mp4ASC; + + decoder = faacDecOpen(); + config = faacDecGetCurrentConfiguration(decoder); + config->outputFormat = FAAD_FMT_16BIT; + faacDecSetConfiguration(decoder,config); + AudioSpecificConfig(&buffer, bufferlen, &mp4ASC); + faacDecInit(decoder,&buffer,bufferlen,&sampleRate,&channels); + faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels); + faacDecDecode(decoder,&frameInfo,&buffer,bufferlen); + + return 0; +} +],[AC_MSG_RESULT(yes);AC_DEFINE(HAVE_FAAD_BUFLEN_FUNCS,1,[Define if FAAD2 uses buflen in function calls])],[AC_MSG_RESULT(no); + AC_MSG_CHECKING(that FAAD2 can even be used) + AC_COMPILE_IFELSE([ +#include + +int main() { + char buffer; + faacDecHandle decoder; + faacDecFrameInfo frameInfo; + faacDecConfigurationPtr config; + unsigned char channels; + long sampleRate; + long bufferlen = 0; + unsigned long dummy1_32; + unsigned char dummy2_8, dummy3_8, dummy4_8, dummy5_8, dummy6_8, + dummy7_8, dummy8_8; + + decoder = faacDecOpen(); + config = faacDecGetCurrentConfiguration(decoder); + config->outputFormat = FAAD_FMT_16BIT; + faacDecSetConfiguration(decoder,config); + AudioSpecificConfig(&buffer,&dummy1_32,&dummy2_8, + &dummy3_8,&dummy4_8,&dummy5_8, + &dummy6_8,&dummy7_8,&dummy8_8); + faacDecInit(decoder,&buffer,&sampleRate,&channels); + faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels); + faacDecDecode(decoder,&frameInfo,&buffer); + faacDecClose(decoder); + + return 0; +} +],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);enable_aac=no]) + ]) + fi + if test x$enable_aac = xyes; then + AC_CHECK_TYPES(mp4AudioSpecificConfig,,,[#include ]) + AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR,faacDecFrameInfo.samplerate],,,[#include ]) AC_DEFINE(HAVE_FAAD,1,[Define to use FAAD2 for AAC decoding]) else AC_MSG_WARN([faad2 lib needed for MP4/AAC support -- disabling MP4/AAC support]) diff --git a/src/aac_decode.c b/src/aac_decode.c index c4d8dcf4d..03f291fcc 100644 --- a/src/aac_decode.c +++ b/src/aac_decode.c @@ -210,6 +210,7 @@ float getAacFloatTotalTime(char * file) { unsigned long sampleRate; unsigned char channels; FILE * fp = fopen(file,"r"); + size_t bread; if(fp==NULL) return -1; @@ -223,12 +224,13 @@ float getAacFloatTotalTime(char * file) { faacDecSetConfiguration(decoder,config); fillAacBuffer(&b); - if(faacDecInit(decoder,b.buffer,b.bytesIntoBuffer, - &sampleRate,&channels) >= 0 && - sampleRate > 0 && channels > 0) - { - length = 0; - } +#ifdef HAVE_FAAD_BUFLEN_FUNCS + bread = faacDecInit(decoder,b.buffer,b.bytesIntoBuffer, + &sampleRate,&channels); +#else + bread = faacDecInit(decoder,b.buffer,&sampleRate,&channels); +#endif + if(bread >= 0 && sampleRate > 0 && channels > 0) length = 0; faacDecClose(decoder); } @@ -291,9 +293,14 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) { faacDecSetConfiguration(decoder,config); fillAacBuffer(&b); - if((bread = faacDecInit(decoder,b.buffer,b.bytesIntoBuffer, - &sampleRate,&channels)) < 0) - { + +#ifdef HAVE_FAAD_BUFLEN_FUNCS + bread = faacDecInit(decoder,b.buffer,b.bytesIntoBuffer, + &sampleRate,&channels); +#else + bread = faacDecInit(decoder,b.buffer,&sampleRate,&channels); +#endif + if(bread < 0) { ERROR("Error not a AAC stream.\n"); faacDecClose(decoder); fclose(b.infile); @@ -317,8 +324,12 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) { break; } +#ifdef HAVE_FAAD_BUFLEN_FUNCS sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer, b.bytesIntoBuffer); +#else + sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer); +#endif if(frameInfo.error > 0) { ERROR("error decoding AAC file: %s\n",dc->file); @@ -328,9 +339,13 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) { break; } +#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE + sampleRate = frameInfo.samplerate; +#endif + if(dc->start) { af->channels = frameInfo.channels; - af->sampleRate = frameInfo.samplerate; + af->sampleRate = sampleRate; dc->state = DECODE_STATE_DECODE; dc->start = 0; } @@ -341,10 +356,10 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) { if(sampleCount>0) { bitRate = frameInfo.bytesconsumed*8.0* - frameInfo.channels*frameInfo.samplerate/ + frameInfo.channels*sampleRate/ frameInfo.samples/1024+0.5; time+= (float)(frameInfo.samples)/frameInfo.channels/ - frameInfo.samplerate; + sampleRate; } sampleBufferLen = sampleCount*2; diff --git a/src/mp4_decode.c b/src/mp4_decode.c index 6ecce1853..a697a8b3d 100644 --- a/src/mp4_decode.c +++ b/src/mp4_decode.c @@ -44,12 +44,24 @@ int mp4_getAACTrack(mp4ff_t *infile) { for (i = 0; i < numTracks; i++) { unsigned char *buff = NULL; int buff_size = 0; +#ifdef HAVE_MP4AUDIOSPECIFICCONFIG mp4AudioSpecificConfig mp4ASC; +#else + unsigned long dummy1_32; + unsigned char dummy2_8, dummy3_8, dummy4_8, dummy5_8, dummy6_8, + dummy7_8, dummy8_8; +#endif mp4ff_get_decoder_config(infile, i, &buff, &buff_size); if (buff) { +#ifdef HAVE_MP4AUDIOSPECIFICCONFIG rc = AudioSpecificConfig(buff, buff_size, &mp4ASC); +#else + rc = AudioSpecificConfig(buff, &dummy1_32, &dummy2_8, + &dummy3_8, &dummy4_8, &dummy5_8, + &dummy6_8, &dummy7_8, &dummy8_8); +#endif free(buff); if (rc < 0) continue; return i; @@ -220,8 +232,12 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) { continue; } +#ifdef HAVE_FAAD_BUFLEN_FUNCS sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer, mp4BufferSize); +#else + sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer); +#endif if(mp4Buffer) free(mp4Buffer); if(frameInfo.error > 0) { @@ -234,9 +250,11 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) { if(dc->start) { channels = frameInfo.channels; +#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE scale = frameInfo.samplerate; +#endif + af->sampleRate = scale; af->channels = frameInfo.channels; - af->sampleRate = frameInfo.samplerate; dc->state = DECODE_STATE_DECODE; dc->start = 0; } diff --git a/src/mp4ff/mp4ff_int_types.h b/src/mp4ff/mp4ff_int_types.h index 8dbf7bc2e..88651a81c 100644 --- a/src/mp4ff/mp4ff_int_types.h +++ b/src/mp4ff/mp4ff_int_types.h @@ -15,9 +15,16 @@ typedef unsigned __int64 uint64_t; #else +#include "../../config.h" + +#ifdef HAVE_STDINT_H #include +#else +#ifdef HAVE_INTTYPES_H +#include +#endif +#endif #endif - #endif