decoder/faad: use the newer NeAAC* API
Drop support for the old faacDec* API.
This commit is contained in:
parent
ae77406b8e
commit
3dd8beb380
65
m4/faad.m4
65
m4/faad.m4
|
@ -23,77 +23,36 @@ if test x$enable_aac = xyes; then
|
||||||
AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include <faad.h>])
|
AC_CHECK_DECL(FAAD2_VERSION,,enable_aac=no,[#include <faad.h>])
|
||||||
fi
|
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_LIB(faad,NeAACDecInit2,,enable_aac=no)
|
||||||
fi
|
fi
|
||||||
if test x$enable_aac = xyes; then
|
if test x$enable_aac = xyes; then
|
||||||
AC_CHECK_LIB(faad,faacDecInit2,,enable_aac=no)
|
|
||||||
if test x$enable_aac = xno; then
|
|
||||||
enable_aac=yes
|
|
||||||
AC_CHECK_LIB(faad,NeAACDecInit2,,enable_aac=no)
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test x$enable_aac = xyes; then
|
|
||||||
AC_MSG_CHECKING(that FAAD2 uses buffer and bufferlen)
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
|
||||||
#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_MSG_CHECKING(that FAAD2 can even be used)
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
|
||||||
#include <faad.h>
|
#include <faad.h>
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
char buffer;
|
char buffer;
|
||||||
faacDecHandle decoder;
|
NeAACDecHandle decoder;
|
||||||
faacDecFrameInfo frameInfo;
|
NeAACDecFrameInfo frameInfo;
|
||||||
faacDecConfigurationPtr config;
|
NeAACDecConfigurationPtr config;
|
||||||
unsigned char channels;
|
unsigned char channels;
|
||||||
long sampleRate;
|
long sampleRate;
|
||||||
long bufferlen = 0;
|
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();
|
decoder = NeAACDecOpen();
|
||||||
config = faacDecGetCurrentConfiguration(decoder);
|
config = NeAACDecGetCurrentConfiguration(decoder);
|
||||||
config->outputFormat = FAAD_FMT_16BIT;
|
config->outputFormat = FAAD_FMT_16BIT;
|
||||||
faacDecSetConfiguration(decoder,config);
|
NeAACDecSetConfiguration(decoder,config);
|
||||||
AudioSpecificConfig(&buffer,&dummy1_32,&dummy2_8,
|
NeAACDecInit(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||||
&dummy3_8,&dummy4_8,&dummy5_8,
|
NeAACDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
||||||
&dummy6_8,&dummy7_8,&dummy8_8);
|
NeAACDecDecode(decoder,&frameInfo,&buffer,bufferlen);
|
||||||
faacDecInit(decoder,&buffer,&sampleRate,&channels);
|
NeAACDecClose(decoder);
|
||||||
faacDecInit2(decoder,&buffer,bufferlen,&sampleRate,&channels);
|
|
||||||
faacDecDecode(decoder,&frameInfo,&buffer);
|
|
||||||
faacDecClose(decoder);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
])],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);enable_aac=no])
|
])],AC_MSG_RESULT(yes),[AC_MSG_RESULT(no);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,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])
|
||||||
|
@ -121,7 +80,7 @@ int main() {
|
||||||
unsigned char channels;
|
unsigned char channels;
|
||||||
uint32_t sample_rate;
|
uint32_t sample_rate;
|
||||||
|
|
||||||
faacDecInit2(NULL, NULL, 0, &sample_rate, &channels);
|
NeAACDecInit2(NULL, NULL, 0, &sample_rate, &channels);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
])],
|
])],
|
||||||
|
|
|
@ -23,16 +23,18 @@
|
||||||
#include "audio_check.h"
|
#include "audio_check.h"
|
||||||
#include "tag_handler.h"
|
#include "tag_handler.h"
|
||||||
|
|
||||||
#define AAC_MAX_CHANNELS 6
|
#include <neaacdec.h>
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <faad.h>
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
#undef G_LOG_DOMAIN
|
#undef G_LOG_DOMAIN
|
||||||
#define G_LOG_DOMAIN "faad"
|
#define G_LOG_DOMAIN "faad"
|
||||||
|
|
||||||
|
#define AAC_MAX_CHANNELS 6
|
||||||
|
|
||||||
static const unsigned adts_sample_rates[] =
|
static const unsigned adts_sample_rates[] =
|
||||||
{ 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
|
{ 96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,
|
||||||
16000, 12000, 11025, 8000, 7350, 0, 0, 0
|
16000, 12000, 11025, 8000, 7350, 0, 0, 0
|
||||||
|
@ -239,11 +241,11 @@ faad_song_duration(struct decoder_buffer *buffer, struct input_stream *is)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for faacDecInit() which works around some API
|
* Wrapper for NeAACDecInit() which works around some API
|
||||||
* inconsistencies in libfaad.
|
* inconsistencies in libfaad.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
faad_decoder_init(faacDecHandle decoder, struct decoder_buffer *buffer,
|
faad_decoder_init(NeAACDecHandle decoder, struct decoder_buffer *buffer,
|
||||||
struct audio_format *audio_format, GError **error_r)
|
struct audio_format *audio_format, GError **error_r)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
|
@ -271,10 +273,8 @@ faad_decoder_init(faacDecHandle decoder, struct decoder_buffer *buffer,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
nbytes = faacDecInit(decoder, u.out,
|
nbytes = NeAACDecInit(decoder, u.out,
|
||||||
#ifdef HAVE_FAAD_BUFLEN_FUNCS
|
|
||||||
length,
|
length,
|
||||||
#endif
|
|
||||||
sample_rate_p, &channels);
|
sample_rate_p, &channels);
|
||||||
if (nbytes < 0) {
|
if (nbytes < 0) {
|
||||||
g_set_error(error_r, faad_decoder_quark(), 0,
|
g_set_error(error_r, faad_decoder_quark(), 0,
|
||||||
|
@ -289,12 +289,12 @@ faad_decoder_init(faacDecHandle decoder, struct decoder_buffer *buffer,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper for faacDecDecode() which works around some API
|
* Wrapper for NeAACDecDecode() which works around some API
|
||||||
* inconsistencies in libfaad.
|
* inconsistencies in libfaad.
|
||||||
*/
|
*/
|
||||||
static const void *
|
static const void *
|
||||||
faad_decoder_decode(faacDecHandle decoder, struct decoder_buffer *buffer,
|
faad_decoder_decode(NeAACDecHandle decoder, struct decoder_buffer *buffer,
|
||||||
faacDecFrameInfo *frame_info)
|
NeAACDecFrameInfo *frame_info)
|
||||||
{
|
{
|
||||||
union {
|
union {
|
||||||
/* deconst hack for libfaad */
|
/* deconst hack for libfaad */
|
||||||
|
@ -302,20 +302,13 @@ faad_decoder_decode(faacDecHandle decoder, struct decoder_buffer *buffer,
|
||||||
void *out;
|
void *out;
|
||||||
} u;
|
} u;
|
||||||
size_t length;
|
size_t length;
|
||||||
void *result;
|
|
||||||
|
|
||||||
u.in = decoder_buffer_read(buffer, &length);
|
u.in = decoder_buffer_read(buffer, &length);
|
||||||
if (u.in == NULL)
|
if (u.in == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
result = faacDecDecode(decoder, frame_info,
|
return NeAACDecDecode(decoder, frame_info,
|
||||||
u.out
|
u.out, length);
|
||||||
#ifdef HAVE_FAAD_BUFLEN_FUNCS
|
|
||||||
, length
|
|
||||||
#endif
|
|
||||||
);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -328,8 +321,6 @@ faad_get_file_time_float(struct input_stream *is)
|
||||||
{
|
{
|
||||||
struct decoder_buffer *buffer;
|
struct decoder_buffer *buffer;
|
||||||
float length;
|
float length;
|
||||||
faacDecHandle decoder;
|
|
||||||
faacDecConfigurationPtr config;
|
|
||||||
|
|
||||||
buffer = decoder_buffer_new(NULL, is,
|
buffer = decoder_buffer_new(NULL, is,
|
||||||
FAAD_MIN_STREAMSIZE * AAC_MAX_CHANNELS);
|
FAAD_MIN_STREAMSIZE * AAC_MAX_CHANNELS);
|
||||||
|
@ -339,11 +330,12 @@ faad_get_file_time_float(struct input_stream *is)
|
||||||
bool ret;
|
bool ret;
|
||||||
struct audio_format audio_format;
|
struct audio_format audio_format;
|
||||||
|
|
||||||
decoder = faacDecOpen();
|
NeAACDecHandle decoder = NeAACDecOpen();
|
||||||
|
|
||||||
config = faacDecGetCurrentConfiguration(decoder);
|
NeAACDecConfigurationPtr config =
|
||||||
|
NeAACDecGetCurrentConfiguration(decoder);
|
||||||
config->outputFormat = FAAD_FMT_16BIT;
|
config->outputFormat = FAAD_FMT_16BIT;
|
||||||
faacDecSetConfiguration(decoder, config);
|
NeAACDecSetConfiguration(decoder, config);
|
||||||
|
|
||||||
decoder_buffer_fill(buffer);
|
decoder_buffer_fill(buffer);
|
||||||
|
|
||||||
|
@ -351,7 +343,7 @@ faad_get_file_time_float(struct input_stream *is)
|
||||||
if (ret)
|
if (ret)
|
||||||
length = 0;
|
length = 0;
|
||||||
|
|
||||||
faacDecClose(decoder);
|
NeAACDecClose(decoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
decoder_buffer_free(buffer);
|
decoder_buffer_free(buffer);
|
||||||
|
@ -381,9 +373,7 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
{
|
{
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
float total_time = 0;
|
float total_time = 0;
|
||||||
faacDecHandle decoder;
|
|
||||||
struct audio_format audio_format;
|
struct audio_format audio_format;
|
||||||
faacDecConfigurationPtr config;
|
|
||||||
bool ret;
|
bool ret;
|
||||||
uint16_t bit_rate = 0;
|
uint16_t bit_rate = 0;
|
||||||
struct decoder_buffer *buffer;
|
struct decoder_buffer *buffer;
|
||||||
|
@ -395,17 +385,14 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
|
|
||||||
/* create the libfaad decoder */
|
/* create the libfaad decoder */
|
||||||
|
|
||||||
decoder = faacDecOpen();
|
NeAACDecHandle decoder = NeAACDecOpen();
|
||||||
|
|
||||||
config = faacDecGetCurrentConfiguration(decoder);
|
NeAACDecConfigurationPtr config =
|
||||||
|
NeAACDecGetCurrentConfiguration(decoder);
|
||||||
config->outputFormat = FAAD_FMT_16BIT;
|
config->outputFormat = FAAD_FMT_16BIT;
|
||||||
#ifdef HAVE_FAACDECCONFIGURATION_DOWNMATRIX
|
|
||||||
config->downMatrix = 1;
|
config->downMatrix = 1;
|
||||||
#endif
|
|
||||||
#ifdef HAVE_FAACDECCONFIGURATION_DONTUPSAMPLEIMPLICITSBR
|
|
||||||
config->dontUpSampleImplicitSBR = 0;
|
config->dontUpSampleImplicitSBR = 0;
|
||||||
#endif
|
NeAACDecSetConfiguration(decoder, config);
|
||||||
faacDecSetConfiguration(decoder, config);
|
|
||||||
|
|
||||||
while (!decoder_buffer_is_full(buffer) &&
|
while (!decoder_buffer_is_full(buffer) &&
|
||||||
!input_stream_lock_eof(is) &&
|
!input_stream_lock_eof(is) &&
|
||||||
|
@ -420,7 +407,7 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
g_warning("%s", error->message);
|
g_warning("%s", error->message);
|
||||||
g_error_free(error);
|
g_error_free(error);
|
||||||
faacDecClose(decoder);
|
NeAACDecClose(decoder);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -433,7 +420,7 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
do {
|
do {
|
||||||
size_t frame_size;
|
size_t frame_size;
|
||||||
const void *decoded;
|
const void *decoded;
|
||||||
faacDecFrameInfo frame_info;
|
NeAACDecFrameInfo frame_info;
|
||||||
|
|
||||||
/* find the next frame */
|
/* find the next frame */
|
||||||
|
|
||||||
|
@ -448,7 +435,7 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
|
|
||||||
if (frame_info.error > 0) {
|
if (frame_info.error > 0) {
|
||||||
g_warning("error decoding AAC stream: %s\n",
|
g_warning("error decoding AAC stream: %s\n",
|
||||||
faacDecGetErrorMessage(frame_info.error));
|
NeAACDecGetErrorMessage(frame_info.error));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -458,14 +445,12 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_FAACDECFRAMEINFO_SAMPLERATE
|
|
||||||
if (frame_info.samplerate != audio_format.sample_rate) {
|
if (frame_info.samplerate != audio_format.sample_rate) {
|
||||||
g_warning("sample rate changed from %u to %lu",
|
g_warning("sample rate changed from %u to %lu",
|
||||||
audio_format.sample_rate,
|
audio_format.sample_rate,
|
||||||
(unsigned long)frame_info.samplerate);
|
(unsigned long)frame_info.samplerate);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
decoder_buffer_consume(buffer, frame_info.bytesconsumed);
|
decoder_buffer_consume(buffer, frame_info.bytesconsumed);
|
||||||
|
|
||||||
|
@ -486,7 +471,7 @@ faad_stream_decode(struct decoder *mpd_decoder, struct input_stream *is)
|
||||||
|
|
||||||
/* cleanup */
|
/* cleanup */
|
||||||
|
|
||||||
faacDecClose(decoder);
|
NeAACDecClose(decoder);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
|
|
Loading…
Reference in New Issue