diff options
-rw-r--r-- | libAACenc/include/aacenc_lib.h | 32 | ||||
-rw-r--r-- | libAACenc/src/aacenc_lib.cpp | 104 |
2 files changed, 132 insertions, 4 deletions
diff --git a/libAACenc/include/aacenc_lib.h b/libAACenc/include/aacenc_lib.h index fcdaca5..f693bf5 100644 --- a/libAACenc/include/aacenc_lib.h +++ b/libAACenc/include/aacenc_lib.h @@ -342,6 +342,33 @@ increase which might be significant. If workload is not an issue in the applicat we recommended to activate this feature. \code aacEncoder_SetParam(hAacEncoder, AACENC_AFTERBURNER, 1); \endcode +\subsection encELD ELD Auto Configuration Mode +For ELD configuration a so called auto configurator is available which configures SBR and the SBR ratio by itself. +The configurator is used when the encoder parameter ::AACENC_SBR_MODE and ::AACENC_SBR_RATIO are not set explicitely. + +Based on sampling rate and chosen bitrate per channel a reasonable SBR configuration will be used. +\verbatim +------------------------------------------------------------ + Sampling Rate | Channel Bitrate | SBR | SBR Ratio +-----------------+-----------------+------+----------------- + ]min, 16] kHz | min - 27999 | on | downsampled SBR + | 28000 - max | off | --- +-----------------+-----------------+------+----------------- + ]16 - 24] kHz | min - 39999 | on | downsampled SBR + | 40000 - max | off | --- +-----------------+-----------------+------+----------------- + ]24 - 32] kHz | min - 27999 | on | dualrate SBR + | 28000 - 55999 | on | downsampled SBR + | 56000 - max | off | --- +-----------------+-----------------+------+----------------- + ]32 - 44.1] kHz | min - 63999 | on | dualrate SBR + | 64000 - max | off | --- +-----------------+-----------------+------+----------------- + ]44.1 - 48] kHz | min - 63999 | on | dualrate SBR + | 64000 - max | off | --- +------------------------------------------------------------ +\endverbatim + \section audiochCfg Audio Channel Configuration The MPEG standard refers often to the so-called Channel Configuration. This Channel Configuration is used for a fixed Channel @@ -881,8 +908,9 @@ typedef enum AACENC_SAMPLERATE = 0x0103, /*!< Audio input data sampling rate. Encoder supports following sampling rates: 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 */ - AACENC_SBR_MODE = 0x0104, /*!< Configure SBR independently of the chosen Audio Object Type ::AUDIO_OBJECT_TYPE:. - This parameter is only available for ELD. + AACENC_SBR_MODE = 0x0104, /*!< Configure SBR independently of the chosen Audio Object Type ::AUDIO_OBJECT_TYPE. + This parameter is for ELD audio object type only. + - -1: Use ELD SBR auto configurator (default). - 0: Disable Spectral Band Replication. - 1: Enable Spectral Band Replication. */ diff --git a/libAACenc/src/aacenc_lib.cpp b/libAACenc/src/aacenc_lib.cpp index 8d32f3d..056958b 100644 --- a/libAACenc/src/aacenc_lib.cpp +++ b/libAACenc/src/aacenc_lib.cpp @@ -98,7 +98,7 @@ amm-info@iis.fraunhofer.de /* Encoder library info */ #define AACENCODER_LIB_VL0 3 #define AACENCODER_LIB_VL1 4 -#define AACENCODER_LIB_VL2 10 +#define AACENCODER_LIB_VL2 11 #define AACENCODER_LIB_TITLE "AAC Encoder" #define AACENCODER_LIB_BUILD_DATE __DATE__ #define AACENCODER_LIB_BUILD_TIME __TIME__ @@ -235,7 +235,87 @@ struct AACENCODER } ; -//////////////////////////////////////////////////////////////////////////////////// +typedef struct +{ + ULONG samplingRate; /*!< Encoder output sampling rate. */ + ULONG bitrateRange; /*!< Lower bitrate range for config entry. */ + + UCHAR lowDelaySbr; /*!< 0: ELD sbr off, + 1: ELD sbr on */ + + UCHAR downsampledSbr; /*!< 0: ELD with dualrate sbr, + 1: ELD with downsampled sbr */ + +} ELD_SBR_CONFIGURATOR; + +/** + * \brief This table defines ELD/SBR default configurations. + */ +static const ELD_SBR_CONFIGURATOR eldSbrAutoConfigTab[] = +{ + { 48000, 0, 1, 0 }, + { 48000, 64001, 0, 0 }, + + { 44100, 0, 1, 0 }, + { 44100, 64001, 0, 0 }, + + { 32000, 0, 1, 0 }, + { 32000, 28000, 1, 1 }, + { 32000, 56000, 0, 0 }, + + { 24000, 0, 1, 1 }, + { 24000, 40000, 0, 0 }, + + { 16000, 0, 1, 1 }, + { 16000, 28000, 0, 0 } + +}; + +/* + * \brief Configure SBR for ELD configuration. + * + * This function finds default SBR configuration for ELD based on sampling rate and channel bitrate. + * Outputparameters are SBR on/off, and SBR ratio. + * + * \param samplingRate Audio signal sampling rate. + * \param channelMode Channel configuration to be used. + * \param totalBitrate Overall bitrate. + * \param eldSbr Pointer to eldSbr parameter, filled on return. + * \param eldSbrRatio Pointer to eldSbrRatio parameter, filled on return. + * + * \return - AACENC_OK, all fine. + * - AACENC_INVALID_CONFIG, on failure. + */ +static AACENC_ERROR eldSbrConfigurator( + const ULONG samplingRate, + const CHANNEL_MODE channelMode, + const ULONG totalBitrate, + UINT * const eldSbr, + UINT * const eldSbrRatio + ) +{ + AACENC_ERROR err = AACENC_OK; + int i, cfgIdx = -1; + const ULONG channelBitrate = totalBitrate / FDKaacEnc_GetChannelModeConfiguration(channelMode)->nChannelsEff; + + for (i=0; i<(sizeof(eldSbrAutoConfigTab)/sizeof(ELD_SBR_CONFIGURATOR)); i++) { + if ( (samplingRate <= eldSbrAutoConfigTab[i].samplingRate) + && (channelBitrate >= eldSbrAutoConfigTab[i].bitrateRange) ) + { + cfgIdx = i; + } + } + + if (cfgIdx != -1) { + *eldSbr = (eldSbrAutoConfigTab[cfgIdx].lowDelaySbr==0) ? 0 : 1; + *eldSbrRatio = (eldSbrAutoConfigTab[cfgIdx].downsampledSbr==0) ? 2 : 1; + } + else { + err = AACENC_INVALID_CONFIG; /* no default configuration for eld-sbr available. */ + } + + return err; +} static inline INT isSbrActive(const HANDLE_AACENC_CONFIG hAacConfig) { @@ -800,6 +880,26 @@ AACENC_ERROR FDKaacEnc_AdjustEncSettings(HANDLE_AACENCODER hAacEncoder, } /* Initialize SBR parameters */ + if ( (hAacConfig->audioObjectType==AOT_ER_AAC_ELD) + && (config->userSbrEnabled == (UCHAR)-1) && (config->userSbrRatio==0) ) + { + UINT eldSbr = 0; + UINT eldSbrRatio = 0; + + if ( AACENC_OK!=(err=eldSbrConfigurator( + hAacConfig->sampleRate, + hAacConfig->channelMode, + hAacConfig->bitRate, + &eldSbr, + &eldSbrRatio)) ) + { + return err; + } + + hAacConfig->syntaxFlags |= ((eldSbr) ? AC_SBR_PRESENT : 0); + hAacConfig->sbrRatio = eldSbrRatio; + } + else if ( (config->userSbrRatio==0) && (isSbrActive(hAacConfig)) ) { /* Automatic SBR ratio configuration * - downsampled SBR for ELD |