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:
		
							
								
								
									
										66
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										66
									
								
								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 <faad.h>])
 | 
			
		||||
	fi
 | 
			
		||||
	if test x$enable_aac = xyes; then
 | 
			
		||||
		AC_CHECK_DECL(faacDecInit2,,enable_aac=no,[#include <faad.h>])
 | 
			
		||||
	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 <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])
 | 
			
		||||
	else
 | 
			
		||||
		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 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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
		}
 | 
			
		||||
 
 | 
			
		||||
@@ -15,9 +15,16 @@ typedef unsigned __int64 uint64_t;
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#include "../../config.h"
 | 
			
		||||
 | 
			
		||||
#ifdef HAVE_STDINT_H
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#else
 | 
			
		||||
#ifdef HAVE_INTTYPES_H
 | 
			
		||||
#include <inttypes.h>
 | 
			
		||||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user