fix and detect differences between faad2 1.1 and 2.0
git-svn-id: https://svn.musicpd.org/mpd/trunk@459 09075e82-0dd4-0310-85a5-a0d7c8717e4f
This commit is contained in:
parent
63a62a4514
commit
1de1bfe314
66
configure.ac
66
configure.ac
|
@ -277,6 +277,9 @@ if test x$enable_aac = xyes; then
|
||||||
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
|
LIBS="$LIBS $MPD_LIBS $FAAD_LIBS"
|
||||||
CPPFLAGS=$CFLAGS
|
CPPFLAGS=$CFLAGS
|
||||||
AC_CHECK_HEADER(faad.h,,enable_aac=no)
|
AC_CHECK_HEADER(faad.h,,enable_aac=no)
|
||||||
|
if test x$enable_aac = xyes; then
|
||||||
|
AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include <faad.h>])
|
||||||
|
fi
|
||||||
if test x$enable_aac = xyes; then
|
if test x$enable_aac = xyes; then
|
||||||
AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include <faad.h>])
|
AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include <faad.h>])
|
||||||
fi
|
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)
|
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
|
fi
|
||||||
if test x$enable_aac = xyes; then
|
if test x$enable_aac = xyes; then
|
||||||
AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR],,,[#include <faad.h>])
|
AC_MSG_CHECKING(that FAAD2 uses buffer and bufferlen)
|
||||||
|
AC_COMPILE_IFELSE([
|
||||||
|
#include <faad.h>
|
||||||
|
|
||||||
|
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 <faad.h>
|
||||||
|
|
||||||
|
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 <faad.h>])
|
||||||
|
AC_CHECK_MEMBERS([faacDecConfiguration.downMatrix,faacDecConfiguration.dontUpSampleImplicitSBR,faacDecFrameInfo.samplerate],,,[#include <faad.h>])
|
||||||
AC_DEFINE(HAVE_FAAD,1,[Define to use FAAD2 for AAC decoding])
|
AC_DEFINE(HAVE_FAAD,1,[Define to use FAAD2 for AAC decoding])
|
||||||
else
|
else
|
||||||
AC_MSG_WARN([faad2 lib needed for MP4/AAC support -- disabling MP4/AAC support])
|
AC_MSG_WARN([faad2 lib needed for MP4/AAC support -- disabling MP4/AAC support])
|
||||||
|
|
|
@ -210,6 +210,7 @@ float getAacFloatTotalTime(char * file) {
|
||||||
unsigned long sampleRate;
|
unsigned long sampleRate;
|
||||||
unsigned char channels;
|
unsigned char channels;
|
||||||
FILE * fp = fopen(file,"r");
|
FILE * fp = fopen(file,"r");
|
||||||
|
size_t bread;
|
||||||
|
|
||||||
if(fp==NULL) return -1;
|
if(fp==NULL) return -1;
|
||||||
|
|
||||||
|
@ -223,12 +224,13 @@ float getAacFloatTotalTime(char * file) {
|
||||||
faacDecSetConfiguration(decoder,config);
|
faacDecSetConfiguration(decoder,config);
|
||||||
|
|
||||||
fillAacBuffer(&b);
|
fillAacBuffer(&b);
|
||||||
if(faacDecInit(decoder,b.buffer,b.bytesIntoBuffer,
|
#ifdef HAVE_FAAD_BUFLEN_FUNCS
|
||||||
&sampleRate,&channels) >= 0 &&
|
bread = faacDecInit(decoder,b.buffer,b.bytesIntoBuffer,
|
||||||
sampleRate > 0 && channels > 0)
|
&sampleRate,&channels);
|
||||||
{
|
#else
|
||||||
length = 0;
|
bread = faacDecInit(decoder,b.buffer,&sampleRate,&channels);
|
||||||
}
|
#endif
|
||||||
|
if(bread >= 0 && sampleRate > 0 && channels > 0) length = 0;
|
||||||
|
|
||||||
faacDecClose(decoder);
|
faacDecClose(decoder);
|
||||||
}
|
}
|
||||||
|
@ -291,9 +293,14 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
|
||||||
faacDecSetConfiguration(decoder,config);
|
faacDecSetConfiguration(decoder,config);
|
||||||
|
|
||||||
fillAacBuffer(&b);
|
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");
|
ERROR("Error not a AAC stream.\n");
|
||||||
faacDecClose(decoder);
|
faacDecClose(decoder);
|
||||||
fclose(b.infile);
|
fclose(b.infile);
|
||||||
|
@ -317,8 +324,12 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_FAAD_BUFLEN_FUNCS
|
||||||
sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer,
|
sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer,
|
||||||
b.bytesIntoBuffer);
|
b.bytesIntoBuffer);
|
||||||
|
#else
|
||||||
|
sampleBuffer = faacDecDecode(decoder,&frameInfo,b.buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(frameInfo.error > 0) {
|
if(frameInfo.error > 0) {
|
||||||
ERROR("error decoding AAC file: %s\n",dc->file);
|
ERROR("error decoding AAC file: %s\n",dc->file);
|
||||||
|
@ -328,9 +339,13 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE
|
||||||
|
sampleRate = frameInfo.samplerate;
|
||||||
|
#endif
|
||||||
|
|
||||||
if(dc->start) {
|
if(dc->start) {
|
||||||
af->channels = frameInfo.channels;
|
af->channels = frameInfo.channels;
|
||||||
af->sampleRate = frameInfo.samplerate;
|
af->sampleRate = sampleRate;
|
||||||
dc->state = DECODE_STATE_DECODE;
|
dc->state = DECODE_STATE_DECODE;
|
||||||
dc->start = 0;
|
dc->start = 0;
|
||||||
}
|
}
|
||||||
|
@ -341,10 +356,10 @@ int aac_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
|
||||||
|
|
||||||
if(sampleCount>0) {
|
if(sampleCount>0) {
|
||||||
bitRate = frameInfo.bytesconsumed*8.0*
|
bitRate = frameInfo.bytesconsumed*8.0*
|
||||||
frameInfo.channels*frameInfo.samplerate/
|
frameInfo.channels*sampleRate/
|
||||||
frameInfo.samples/1024+0.5;
|
frameInfo.samples/1024+0.5;
|
||||||
time+= (float)(frameInfo.samples)/frameInfo.channels/
|
time+= (float)(frameInfo.samples)/frameInfo.channels/
|
||||||
frameInfo.samplerate;
|
sampleRate;
|
||||||
}
|
}
|
||||||
|
|
||||||
sampleBufferLen = sampleCount*2;
|
sampleBufferLen = sampleCount*2;
|
||||||
|
|
|
@ -44,12 +44,24 @@ int mp4_getAACTrack(mp4ff_t *infile) {
|
||||||
for (i = 0; i < numTracks; i++) {
|
for (i = 0; i < numTracks; i++) {
|
||||||
unsigned char *buff = NULL;
|
unsigned char *buff = NULL;
|
||||||
int buff_size = 0;
|
int buff_size = 0;
|
||||||
|
#ifdef HAVE_MP4AUDIOSPECIFICCONFIG
|
||||||
mp4AudioSpecificConfig mp4ASC;
|
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);
|
mp4ff_get_decoder_config(infile, i, &buff, &buff_size);
|
||||||
|
|
||||||
if (buff) {
|
if (buff) {
|
||||||
|
#ifdef HAVE_MP4AUDIOSPECIFICCONFIG
|
||||||
rc = AudioSpecificConfig(buff, buff_size, &mp4ASC);
|
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);
|
free(buff);
|
||||||
if (rc < 0) continue;
|
if (rc < 0) continue;
|
||||||
return i;
|
return i;
|
||||||
|
@ -220,8 +232,12 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_FAAD_BUFLEN_FUNCS
|
||||||
sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer,
|
sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer,
|
||||||
mp4BufferSize);
|
mp4BufferSize);
|
||||||
|
#else
|
||||||
|
sampleBuffer = faacDecDecode(decoder,&frameInfo,mp4Buffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
if(mp4Buffer) free(mp4Buffer);
|
if(mp4Buffer) free(mp4Buffer);
|
||||||
if(frameInfo.error > 0) {
|
if(frameInfo.error > 0) {
|
||||||
|
@ -234,9 +250,11 @@ int mp4_decode(Buffer * cb, AudioFormat * af, DecoderControl * dc) {
|
||||||
|
|
||||||
if(dc->start) {
|
if(dc->start) {
|
||||||
channels = frameInfo.channels;
|
channels = frameInfo.channels;
|
||||||
|
#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE
|
||||||
scale = frameInfo.samplerate;
|
scale = frameInfo.samplerate;
|
||||||
|
#endif
|
||||||
|
af->sampleRate = scale;
|
||||||
af->channels = frameInfo.channels;
|
af->channels = frameInfo.channels;
|
||||||
af->sampleRate = frameInfo.samplerate;
|
|
||||||
dc->state = DECODE_STATE_DECODE;
|
dc->state = DECODE_STATE_DECODE;
|
||||||
dc->start = 0;
|
dc->start = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,9 +15,16 @@ typedef unsigned __int64 uint64_t;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
#include "../../config.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_STDINT_H
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_INTTYPES_H
|
||||||
|
#include <inttypes.h>
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue