From c22fa00c45822fe62a8a921e54f19c012680fc2b Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Thu, 17 Mar 2016 21:59:52 +0100 Subject: [PATCH] Combine aacdec and aac_common. With the server side switched to libmp4ff, only the aac decoder needs the public functions in aac_common. This patch moves this file into aacdec_filter.c, makes the functions static and removes the aac.h header file which only contained the prototypes of the previously public functions. Makefile.real, configure.ac and error.h need small adjustments due to the removal of aac_common.c. --- Makefile.real | 1 - aac.h | 14 ----- aac_afh.c | 2 +- aac_common.c | 132 ------------------------------------------------ aacdec_filter.c | 119 ++++++++++++++++++++++++++++++++++++++++++- configure.ac | 12 ++--- 6 files changed, 125 insertions(+), 155 deletions(-) delete mode 100644 aac.h delete mode 100644 aac_common.c diff --git a/Makefile.real b/Makefile.real index decae6ec..956d60c0 100644 --- a/Makefile.real +++ b/Makefile.real @@ -224,7 +224,6 @@ $(object_dir)/mp3dec_filter.o $(dep_dir)/mp3dec_filter.d \ : CPPFLAGS += $(mad_cppflags) $(object_dir)/aacdec_filter.o $(dep_dir)/aacdec_filter.d \ -$(object_dir)/aac_common.o $(dep_dir)/aac_common.d \ $(object_dir)/aac_afh.o $(dep_dir)/aac_afh.d \ : CPPFLAGS += $(faad_cppflags) diff --git a/aac.h b/aac.h deleted file mode 100644 index eeed2528..00000000 --- a/aac.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * Copyright (C) 2006 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ - -/** \file aac.h Exported symbols from aac_common.c. */ - -#include - -NeAACDecHandle aac_open(void); -int aac_find_esds(char *buf, size_t buflen, size_t *skip, - unsigned long *decoder_length); -ssize_t aac_find_entry_point(char *buf, size_t buflen, size_t *skip); diff --git a/aac_afh.c b/aac_afh.c index f70b811c..8550a8ac 100644 --- a/aac_afh.c +++ b/aac_afh.c @@ -11,6 +11,7 @@ /** \file aac_afh.c para_server's aac audio format handler. */ #include +#include #include "para.h" @@ -22,7 +23,6 @@ #include "portable_io.h" #include "afh.h" #include "string.h" -#include "aac.h" #include "fd.h" diff --git a/aac_common.c b/aac_common.c deleted file mode 100644 index 812c742c..00000000 --- a/aac_common.c +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Copyright (C) 2006 Andre Noll - * - * Licensed under the GPL v2. For licencing details see COPYING. - */ -/* - * based in parts on libfaad, Copyright (C) 2003-2005 M. Bakker, - * Ahead Software AG - */ - -/** \file aac_common.c Common functions of aac_afh and aadcec. */ - -#include "para.h" -#include "aac.h" -#include "error.h" -#include "portable_io.h" - -/** - * Get a new libfaad decoder handle. - * - * \return The handle returned by NeAACDecOpen(). - */ -NeAACDecHandle aac_open(void) -{ - NeAACDecHandle h = NeAACDecOpen(); - NeAACDecConfigurationPtr c = NeAACDecGetCurrentConfiguration(h); - - c->defObjectType = LC; - c->outputFormat = FAAD_FMT_16BIT; - c->downMatrix = 0; - NeAACDecSetConfiguration(h, c); - return h; -} - -static unsigned long aac_read_decoder_length(char *buf, int *description_len) -{ - uint8_t b; - uint8_t numBytes = 0; - unsigned long length = 0; - - do { - b = buf[numBytes]; - numBytes++; - length = (length << 7) | (b & 0x7F); - } while - ((b & 0x80) && numBytes < 4); - *description_len = numBytes; - return length; -} - -/** - * search for the position and the length of the decoder configuration - * - * \param buf buffer to seach - * \param buflen length of \a buf - * \param skip Upon succesful return, this contains the offset in \a buf where - * the decoder config starts. - * \param decoder_length result pointer that is filled in with the length of - * the decoder configuration on success. - * - * \return positive on success, negative on errors - */ -int aac_find_esds(char *buf, size_t buflen, size_t *skip, - unsigned long *decoder_length) -{ - size_t i; - - for (i = 0; i + 4 < buflen; i++) { - char *p = buf + i; - int description_len; - - if (p[0] != 'e' || p[1] != 's' || p[2] != 'd' || p[3] != 's') - continue; - i += 8; - p = buf + i; - PARA_INFO_LOG("found esds@%zu, next: %x\n", i, (unsigned)*p); - if (*p == 3) - i += 8; - else - i += 6; - p = buf + i; - PARA_INFO_LOG("next: %x\n", (unsigned)*p); - if (*p != 4) - continue; - i += 18; - p = buf + i; - PARA_INFO_LOG("next: %x\n", (unsigned)*p); - if (*p != 5) - continue; - i++; - p = buf + i; - *decoder_length = aac_read_decoder_length(p, &description_len); - PARA_INFO_LOG("decoder length: %lu\n", *decoder_length); - i += description_len; - *skip = i; - return 1; - } - return -E_ESDS; -} - -/** - * search for the first entry in the stco table - * - * \param buf buffer to seach - * \param buflen length of \a buf - * \param skip Upon succesful return, this contains the number - * of bytes to skip from the input buffer. - * - * \return the position of the first entry in the table on success, - * -E_STCO on errors. - */ -ssize_t aac_find_entry_point(char *buf, size_t buflen, size_t *skip) -{ - ssize_t ret; - size_t i; - - for (i = 0; i + 20 < buflen; i++) { - char *p = buf + i; - - if (p[0] != 's' || p[1] != 't' || p[2] != 'c' || p[3] != 'o') - continue; - PARA_INFO_LOG("found stco@%zu\n", i); - i += 12; - ret = read_u32_be(buf + i); /* first offset */ - i += 4; - PARA_INFO_LOG("entry point: %zd\n", ret); - *skip = i; - return ret; - } - PARA_WARNING_LOG("stco not found, buflen: %zu\n", buflen); - return -E_STCO; -} diff --git a/aacdec_filter.c b/aacdec_filter.c index 7a757e55..c9f81512 100644 --- a/aacdec_filter.c +++ b/aacdec_filter.c @@ -11,8 +11,10 @@ /** \file aacdec_filter.c paraslash's aac (m4a) decoder. */ #include +#include #include "para.h" +#include "portable_io.h" #include "list.h" #include "sched.h" #include "ggo.h" @@ -20,7 +22,6 @@ #include "filter.h" #include "error.h" #include "string.h" -#include "aac.h" /** Give up decoding after that many errors. */ #define MAX_ERRORS 20 @@ -54,6 +55,122 @@ struct private_aacdec_data { unsigned int sample_rate; }; +/* + * Get a new libfaad decoder handle. + * + * \return The handle returned by NeAACDecOpen(). + */ +static NeAACDecHandle aac_open(void) +{ + NeAACDecHandle h = NeAACDecOpen(); + NeAACDecConfigurationPtr c = NeAACDecGetCurrentConfiguration(h); + + c->defObjectType = LC; + c->outputFormat = FAAD_FMT_16BIT; + c->downMatrix = 0; + NeAACDecSetConfiguration(h, c); + return h; +} + +static unsigned long aac_read_decoder_length(char *buf, int *description_len) +{ + uint8_t b; + uint8_t numBytes = 0; + unsigned long length = 0; + + do { + b = buf[numBytes]; + numBytes++; + length = (length << 7) | (b & 0x7F); + } while + ((b & 0x80) && numBytes < 4); + *description_len = numBytes; + return length; +} + +/* + * Search for the position and the length of the decoder configuration. + * + * \param buf Buffer to seach. + * \param buflen Length of \a buf. + * \param skip Upon succesful return, this contains the offset in \a buf where + * the decoder config starts. + * \param decoder_length Result pointer that is filled in with the length of + * the decoder configuration on success. + * + * \return Standard. + */ +static int aac_find_esds(char *buf, size_t buflen, size_t *skip, + unsigned long *decoder_length) +{ + size_t i; + + for (i = 0; i + 4 < buflen; i++) { + char *p = buf + i; + int description_len; + + if (p[0] != 'e' || p[1] != 's' || p[2] != 'd' || p[3] != 's') + continue; + i += 8; + p = buf + i; + PARA_INFO_LOG("found esds@%zu, next: %x\n", i, *p); + if (*p == 3) + i += 8; + else + i += 6; + p = buf + i; + PARA_INFO_LOG("next: %x\n", *p); + if (*p != 4) + continue; + i += 18; + p = buf + i; + PARA_INFO_LOG("next: %x\n", *p); + if (*p != 5) + continue; + i++; + p = buf + i; + *decoder_length = aac_read_decoder_length(p, &description_len); + PARA_INFO_LOG("decoder length: %lu\n", *decoder_length); + i += description_len; + *skip = i; + return 1; + } + return -E_ESDS; +} + +/* + * Search for the first entry in the stco table. + * + * \param buf Buffer to seach. + * \param buflen Length of \a buf. + * \param skip Upon succesful return, this contains the number + * of bytes to skip from the input buffer. + * + * \return The position of the first entry in the table on success, + * -E_STCO on errors. + */ +static ssize_t aac_find_entry_point(char *buf, size_t buflen, size_t *skip) +{ + ssize_t ret; + size_t i; + + for (i = 0; i + 20 < buflen; i++) { + char *p = buf + i; + + if (p[0] != 's' || p[1] != 't' || p[2] != 'c' || p[3] != 'o') + continue; + PARA_INFO_LOG("found stco@%zu\n", i); + i += 12; + ret = read_u32_be(buf + i); /* first offset */ + i += 4; + PARA_INFO_LOG("entry point: %zd\n", ret); + *skip = i; + return ret; + } + PARA_WARNING_LOG("stco not found, buflen: %zu\n", buflen); + return -E_STCO; +} + static int aacdec_execute(struct btr_node *btrn, const char *cmd, char **result) { struct filter_node *fn = btr_context(btrn); diff --git a/configure.ac b/configure.ac index 0916d259..3489670c 100644 --- a/configure.ac +++ b/configure.ac @@ -435,7 +435,7 @@ if test -n "$CRYPTOLIB" && test $HAVE_OSL = yes; then NEED_OPUS_OBJECTS() && server_errlist_objs="$server_errlist_objs opus_afh opus_common" NEED_FLAC_OBJECTS && server_errlist_objs="$server_errlist_objs flac_afh" if test $HAVE_FAAD = yes; then - server_errlist_objs="$server_errlist_objs aac_afh aac_common" + server_errlist_objs="$server_errlist_objs aac_afh" fi server_objs="add_cmdline($server_cmdline_objs) $server_errlist_objs" AC_SUBST(server_objs, add_dot_o($server_objs)) @@ -559,7 +559,7 @@ if test -n "$CRYPTOLIB"; then audiod_audio_formats="$audiod_audio_formats flac" } if test $HAVE_FAAD = yes; then - audiod_errlist_objs="$audiod_errlist_objs aacdec_filter aac_common" + audiod_errlist_objs="$audiod_errlist_objs aacdec_filter" audiod_audio_formats="$audiod_audio_formats aac" fi if test $HAVE_MAD = yes; then @@ -720,7 +720,7 @@ NEED_FLAC_OBJECTS && { filters="$filters flacdec" } if test $HAVE_FAAD = yes; then - filter_errlist_objs="$filter_errlist_objs aacdec_filter aac_common" + filter_errlist_objs="$filter_errlist_objs aacdec_filter" filters="$filters aacdec" fi if test $HAVE_MAD = yes; then @@ -783,7 +783,7 @@ NEED_OPUS_OBJECTS && recv_errlist_objs="$recv_errlist_objs opus_afh opus_common" NEED_FLAC_OBJECTS && recv_errlist_objs="$recv_errlist_objs flac_afh" if test $HAVE_FAAD = yes; then - recv_errlist_objs="$recv_errlist_objs aac_afh aac_common" + recv_errlist_objs="$recv_errlist_objs aac_afh" fi recv_objs="add_cmdline($recv_cmdline_objs) $recv_errlist_objs" AC_SUBST(receivers, "http dccp udp afh") @@ -821,7 +821,7 @@ NEED_FLAC_OBJECTS && { audio_format_handlers="$audio_format_handlers flac" } if test $HAVE_FAAD = yes; then - afh_errlist_objs="$afh_errlist_objs aac_afh aac_common" + afh_errlist_objs="$afh_errlist_objs aac_afh" audio_format_handlers="$audio_format_handlers aac" fi @@ -895,7 +895,7 @@ NEED_FLAC_OBJECTS && { play_errlist_objs="$play_errlist_objs flacdec_filter flac_afh" } if test $HAVE_FAAD = yes; then - play_errlist_objs="$play_errlist_objs aac_afh aac_common aacdec_filter" + play_errlist_objs="$play_errlist_objs aac_afh aacdec_filter" fi if test $HAVE_MAD = yes; then play_cmdline_objs="$play_cmdline_objs mp3dec_filter" -- 2.30.2