Commit d069d152 authored by Rafaël Carré's avatar Rafaël Carré

fdkaac: reduce context size

parent e2263e68
...@@ -135,15 +135,10 @@ struct encoder_sys_t ...@@ -135,15 +135,10 @@ struct encoder_sys_t
{ {
double d_compression_ratio; double d_compression_ratio;
mtime_t i_pts_last; mtime_t i_pts_last;
int i_aot; /* This stores the aac profile chosen */
int i_vbr; /* cbr or vbr-quality value chosen */
int i_signaling; /* Library feature for backwards compatibility */
int i_encoderdelay; /* Samples delay introduced by the profile */ int i_encoderdelay; /* Samples delay introduced by the profile */
int i_frame_size; int i_frame_size;
int i_maxoutputsize; /* Maximum buffer size for encoded output */ int i_maxoutputsize; /* Maximum buffer size for encoded output */
HANDLE_AACENCODER handle; HANDLE_AACENCODER handle;
bool b_afterburner; /* Library feature for additional quality */
bool b_eld_sbr; /* Spectral band replication option for ELD profile */
}; };
static const char *aac_get_errorstring(AACENC_ERROR erraac) static const char *aac_get_errorstring(AACENC_ERROR erraac)
...@@ -232,25 +227,24 @@ static int OpenEncoder( vlc_object_t *p_this ) ...@@ -232,25 +227,24 @@ static int OpenEncoder( vlc_object_t *p_this )
config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg ); config_ChainParse( p_enc, ENC_CFG_PREFIX, ppsz_enc_options, p_enc->p_cfg );
int i_aot; /* This stores the aac profile chosen */
if ( p_enc->fmt_out.i_codec == VLC_FOURCC( 'l', 'a', 'a', 'c' ) ) if ( p_enc->fmt_out.i_codec == VLC_FOURCC( 'l', 'a', 'a', 'c' ) )
p_sys->i_aot = PROFILE_AAC_LC; i_aot = PROFILE_AAC_LC;
else if ( p_enc->fmt_out.i_codec == VLC_FOURCC( 'h', 'a', 'a', 'c' ) ) else if ( p_enc->fmt_out.i_codec == VLC_FOURCC( 'h', 'a', 'a', 'c' ) )
p_sys->i_aot = PROFILE_AAC_HE; i_aot = PROFILE_AAC_HE;
else if ( p_enc->fmt_out.i_codec == VLC_FOURCC( 's', 'a', 'a', 'c' ) ) else if ( p_enc->fmt_out.i_codec == VLC_FOURCC( 's', 'a', 'a', 'c' ) )
p_sys->i_aot = PROFILE_AAC_HE_v2; i_aot = PROFILE_AAC_HE_v2;
else else
p_sys->i_aot = var_InheritInteger( p_enc, ENC_CFG_PREFIX "profile" ); i_aot = var_InheritInteger( p_enc, ENC_CFG_PREFIX "profile" );
p_sys->b_eld_sbr = var_InheritBool( p_enc, ENC_CFG_PREFIX "sbr" ); bool b_eld_sbr = var_InheritBool( p_enc, ENC_CFG_PREFIX "sbr" );
p_sys->i_vbr = var_InheritInteger( p_enc, ENC_CFG_PREFIX "vbr" ); int i_vbr = var_InheritInteger( p_enc, ENC_CFG_PREFIX "vbr" );
p_sys->b_afterburner = var_InheritBool( p_enc, ENC_CFG_PREFIX "afterburner" );
p_sys->i_signaling = var_InheritInteger( p_enc, ENC_CFG_PREFIX "signaling" );
p_sys->i_pts_last = 0; p_sys->i_pts_last = 0;
if ((p_sys->i_aot == PROFILE_AAC_HE || p_sys->i_aot == PROFILE_AAC_HE_v2) && p_sys->i_vbr > 3) if ((i_aot == PROFILE_AAC_HE || i_aot == PROFILE_AAC_HE_v2) && i_vbr > 3)
{ {
msg_Warn(p_enc, "Maximum VBR quality for this profile is 3, setting vbr=3"); msg_Warn(p_enc, "Maximum VBR quality for this profile is 3, setting vbr=3");
p_sys->i_vbr = 3; i_vbr = 3;
} }
AACENC_ERROR erraac; AACENC_ERROR erraac;
if ((erraac = aacEncOpen(&p_sys->handle, 0, p_enc->fmt_in.audio.i_channels)) != AACENC_OK) { if ((erraac = aacEncOpen(&p_sys->handle, 0, p_enc->fmt_in.audio.i_channels)) != AACENC_OK) {
...@@ -258,21 +252,21 @@ static int OpenEncoder( vlc_object_t *p_this ) ...@@ -258,21 +252,21 @@ static int OpenEncoder( vlc_object_t *p_this )
free( p_sys ); free( p_sys );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
if ( p_sys->i_aot == PROFILE_AAC_HE_v2 && p_enc->fmt_in.audio.i_channels != 2 ) if ( i_aot == PROFILE_AAC_HE_v2 && p_enc->fmt_in.audio.i_channels != 2 )
{ {
msg_Err(p_enc, "The HE-AAC-v2 profile can only be used with stereo sources"); msg_Err(p_enc, "The HE-AAC-v2 profile can only be used with stereo sources");
goto error; goto error;
} }
if ( p_sys->i_aot == PROFILE_AAC_ELD && p_enc->fmt_in.audio.i_channels != 2 ) if ( i_aot == PROFILE_AAC_ELD && p_enc->fmt_in.audio.i_channels != 2 )
{ {
msg_Err(p_enc, "The ELD-AAC profile can only be used with stereo sources"); msg_Err(p_enc, "The ELD-AAC profile can only be used with stereo sources");
goto error; goto error;
} }
if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_AOT, p_sys->i_aot)) != AACENC_OK) { if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_AOT, i_aot)) != AACENC_OK) {
msg_Err(p_enc, "Unable to set the Profile %i: %s", p_sys->i_aot, aac_get_errorstring(erraac)); msg_Err(p_enc, "Unable to set the Profile %i: %s", i_aot, aac_get_errorstring(erraac));
goto error; goto error;
} }
if (p_sys->i_aot == PROFILE_AAC_ELD && p_sys->b_eld_sbr) { if (i_aot == PROFILE_AAC_ELD && b_eld_sbr) {
if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_SBR_MODE, 1)) != AACENC_OK) { if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_SBR_MODE, 1)) != AACENC_OK) {
msg_Err(p_enc, "Unable to set SBR mode for ELD: %s", aac_get_errorstring(erraac)); msg_Err(p_enc, "Unable to set SBR mode for ELD: %s", aac_get_errorstring(erraac));
goto error; goto error;
...@@ -292,23 +286,23 @@ static int OpenEncoder( vlc_object_t *p_this ) ...@@ -292,23 +286,23 @@ static int OpenEncoder( vlc_object_t *p_this )
msg_Err(p_enc, "Unable to set the sound channel order: %s", aac_get_errorstring(erraac)); msg_Err(p_enc, "Unable to set the sound channel order: %s", aac_get_errorstring(erraac));
goto error; goto error;
} }
if (p_sys->i_vbr != 0) { if (i_vbr != 0) {
if ((erraac = aacEncoder_SetParam(p_sys->handle, if ((erraac = aacEncoder_SetParam(p_sys->handle,
AACENC_BITRATEMODE, p_sys->i_vbr)) != AACENC_OK) { AACENC_BITRATEMODE, i_vbr)) != AACENC_OK) {
msg_Err(p_enc, "Unable to set the VBR bitrate mode: %s", aac_get_errorstring(erraac)); msg_Err(p_enc, "Unable to set the VBR bitrate mode: %s", aac_get_errorstring(erraac));
goto error; goto error;
} }
} else { } else {
int i_bitrate; int i_bitrate;
if (p_enc->fmt_out.i_bitrate == 0) { if (p_enc->fmt_out.i_bitrate == 0) {
if (p_sys->i_aot == PROFILE_AAC_HE_v2) { if (i_aot == PROFILE_AAC_HE_v2) {
sce = 1; sce = 1;
cpe = 0; cpe = 0;
} }
i_bitrate = (96*sce + 128*cpe) * p_enc->fmt_out.audio.i_rate / 44; i_bitrate = (96*sce + 128*cpe) * p_enc->fmt_out.audio.i_rate / 44;
if (p_sys->i_aot == PROFILE_AAC_HE || if (i_aot == PROFILE_AAC_HE ||
p_sys->i_aot == PROFILE_AAC_HE_v2 || i_aot == PROFILE_AAC_HE_v2 ||
p_sys->b_eld_sbr) b_eld_sbr)
i_bitrate /= 2; i_bitrate /= 2;
p_enc->fmt_out.i_bitrate = i_bitrate; p_enc->fmt_out.i_bitrate = i_bitrate;
msg_Info(p_enc, "Setting optimal bitrate of %i", i_bitrate); msg_Info(p_enc, "Setting optimal bitrate of %i", i_bitrate);
...@@ -329,14 +323,15 @@ static int OpenEncoder( vlc_object_t *p_this ) ...@@ -329,14 +323,15 @@ static int OpenEncoder( vlc_object_t *p_this )
goto error; goto error;
} }
if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_SIGNALING_MODE, if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_SIGNALING_MODE,
(int)p_sys->i_signaling)) != AACENC_OK) { (int)var_InheritInteger( p_enc, ENC_CFG_PREFIX "signaling" ))) != AACENC_OK) {
/* use explicit backward compatible =1 */ /* use explicit backward compatible =1 */
/* use explicit hierarchical signaling =2 */ /* use explicit hierarchical signaling =2 */
msg_Err(p_enc, "Unable to set signaling mode: %s", aac_get_errorstring(erraac)); msg_Err(p_enc, "Unable to set signaling mode: %s", aac_get_errorstring(erraac));
goto error; goto error;
} }
if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_AFTERBURNER, if ((erraac = aacEncoder_SetParam(p_sys->handle, AACENC_AFTERBURNER,
(int)p_sys->b_afterburner)) != AACENC_OK) { !!var_InheritBool( p_enc, ENC_CFG_PREFIX "afterburner"))) !=
AACENC_OK) {
msg_Err(p_enc, "Unable to set the afterburner mode: %s", aac_get_errorstring(erraac)); msg_Err(p_enc, "Unable to set the afterburner mode: %s", aac_get_errorstring(erraac));
goto error; goto error;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment