Encoder ELD auto configurator

* AAC-Encoder

   - Introduce ELD auto configurator to get predefined configuration at given
     bitrate and sampling rate. The configurator selects SBR on/off and if SBR
     enabled distinguishes between dualrate and downsampled SBR. In default
     configuration the ELD auto configurator is enabled.
     Modified file(s):
        libAACenc\include\aacenc_lib.h
        libAACenc\src\aacenc_lib.cpp

Bug 9428126

Change-Id: I01acc9c37e57c4154b3a818d496d538b7f8b227d
This commit is contained in:
Jean-Michel Trivi 2013-08-29 15:17:49 -07:00
parent dbf9680648
commit 9f455bea1c
2 changed files with 132 additions and 4 deletions

View File

@ -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. */

View File

@ -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