@ -759,6 +759,30 @@ static void count_frame_bits(AC3EncodeContext *s)
/* header */
if ( s - > eac3 ) {
if ( opt - > eac3_mixing_metadata ) {
if ( s - > channel_mode > AC3_CHMODE_STEREO )
frame_bits + = 2 ;
if ( s - > has_center )
frame_bits + = 6 ;
if ( s - > has_surround )
frame_bits + = 6 ;
frame_bits + = s - > lfe_on ;
frame_bits + = 1 + 1 + 2 ;
if ( s - > channel_mode < AC3_CHMODE_STEREO )
frame_bits + + ;
frame_bits + + ;
}
if ( opt - > eac3_info_metadata ) {
frame_bits + = 3 + 1 + 1 ;
if ( s - > channel_mode = = AC3_CHMODE_STEREO )
frame_bits + = 2 + 2 ;
if ( s - > channel_mode > = AC3_CHMODE_2F2R )
frame_bits + = 2 ;
frame_bits + + ;
if ( opt - > audio_production_info )
frame_bits + = 5 + 2 + 1 ;
frame_bits + + ;
}
/* coupling */
if ( s - > channel_mode > AC3_CHMODE_MONO ) {
frame_bits + + ;
@ -1736,93 +1760,162 @@ int ff_ac3_validate_metadata(AC3EncodeContext *s)
AVCodecContext * avctx = s - > avctx ;
AC3EncOptions * opt = & s - > options ;
/* validate mixing levels */
if ( s - > has_center ) {
validate_mix_level ( avctx , " center_mix_level " , & opt - > center_mix_level ,
cmixlev_options , CMIXLEV_NUM_OPTIONS , 1 , 0 ,
& s - > center_mix_level ) ;
opt - > audio_production_info = 0 ;
opt - > extended_bsi_1 = 0 ;
opt - > extended_bsi_2 = 0 ;
opt - > eac3_mixing_metadata = 0 ;
opt - > eac3_info_metadata = 0 ;
/* determine mixing metadata / xbsi1 use */
if ( s - > channel_mode > AC3_CHMODE_STEREO & & opt - > preferred_stereo_downmix > = 0 ) {
opt - > extended_bsi_1 = 1 ;
opt - > eac3_mixing_metadata = 1 ;
}
if ( s - > has_center & &
( opt - > ltrt_center_mix_level > = 0 | | opt - > loro_center_mix_level > = 0 ) ) {
opt - > extended_bsi_1 = 1 ;
opt - > eac3_mixing_metadata = 1 ;
}
if ( s - > has_surround ) {
validate_mix_level ( avctx , " surround_mix_level " , & opt - > surround_mix_level ,
surmixlev_options , SURMIXLEV_NUM_OPTIONS , 1 , 0 ,
& s - > surround_mix_level ) ;
if ( s - > has_surround & &
( opt - > ltrt_surround_mix_level > = 0 | | opt - > loro_surround_mix_level > = 0 ) ) {
opt - > extended_bsi_1 = 1 ;
opt - > eac3_mixing_metadata = 1 ;
}
/* set audio production info flag */
if ( opt - > mixing_level > = 0 | | opt - > room_type > = 0 ) {
if ( opt - > mixing_level < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " mixing_level must be set if "
" room_type is set \n " ) ;
return AVERROR ( EINVAL ) ;
}
if ( opt - > mixing_level < 80 ) {
av_log ( avctx , AV_LOG_ERROR , " invalid mixing level. must be between "
" 80dB and 111dB \n " ) ;
return AVERROR ( EINVAL ) ;
if ( s - > eac3 ) {
/* determine info metadata use */
if ( avctx - > audio_service_type ! = AV_AUDIO_SERVICE_TYPE_MAIN )
opt - > eac3_info_metadata = 1 ;
if ( opt - > copyright > = 0 | | opt - > original > = 0 )
opt - > eac3_info_metadata = 1 ;
if ( s - > channel_mode = = AC3_CHMODE_STEREO & &
( opt - > dolby_headphone_mode > = 0 | | opt - > dolby_surround_mode > = 0 ) )
opt - > eac3_info_metadata = 1 ;
if ( s - > channel_mode > = AC3_CHMODE_2F2R & & opt - > dolby_surround_ex_mode > = 0 )
opt - > eac3_info_metadata = 1 ;
if ( opt - > mixing_level > = 0 | | opt - > room_type > = 0 | | opt - > ad_converter_type > = 0 ) {
opt - > audio_production_info = 1 ;
opt - > eac3_info_metadata = 1 ;
}
/* default room type */
if ( opt - > room_type < 0 )
opt - > room_type = 0 ;
opt - > audio_production_info = 1 ;
} else {
opt - > audio_production_info = 0 ;
/* determine audio production info use */
if ( opt - > mixing_level > = 0 | | opt - > room_type > = 0 )
opt - > audio_production_info = 1 ;
/* determine xbsi2 use */
if ( s - > channel_mode > = AC3_CHMODE_2F2R & & opt - > dolby_surround_ex_mode > = 0 )
opt - > extended_bsi_2 = 1 ;
if ( s - > channel_mode = = AC3_CHMODE_STEREO & & opt - > dolby_headphone_mode > = 0 )
opt - > extended_bsi_2 = 1 ;
if ( opt - > ad_converter_type > = 0 )
opt - > extended_bsi_2 = 1 ;
}
/* set extended bsi 1 flag */
if ( ( s - > has_center | | s - > has_surround ) & &
( opt - > preferred_stereo_downmix > = 0 | |
opt - > ltrt_center_mix_level > = 0 | |
opt - > ltrt_surround_mix_level > = 0 | |
opt - > loro_center_mix_level > = 0 | |
opt - > loro_surround_mix_level > = 0 ) ) {
/* validate AC-3 mixing levels */
if ( ! s - > eac3 ) {
if ( s - > has_center ) {
validate_mix_level ( avctx , " center_mix_level " , & opt - > center_mix_level ,
cmixlev_options , CMIXLEV_NUM_OPTIONS , 1 , 0 ,
& s - > center_mix_level ) ;
}
if ( s - > has_surround ) {
validate_mix_level ( avctx , " surround_mix_level " , & opt - > surround_mix_level ,
surmixlev_options , SURMIXLEV_NUM_OPTIONS , 1 , 0 ,
& s - > surround_mix_level ) ;
}
}
/* validate extended bsi 1 / mixing metadata */
if ( opt - > extended_bsi_1 | | opt - > eac3_mixing_metadata ) {
/* default preferred stereo downmix */
if ( opt - > preferred_stereo_downmix < 0 )
opt - > preferred_stereo_downmix = 0 ;
/* validate Lt/Rt center mix level */
validate_mix_level ( avctx , " ltrt_center_mix_level " ,
& opt - > ltrt_center_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 5 , 0 ,
& s - > ltrt_center_mix_level ) ;
/* validate Lt/Rt surround mix level */
validate_mix_level ( avctx , " ltrt_surround_mix_level " ,
& opt - > ltrt_surround_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 6 , 3 ,
& s - > ltrt_surround_mix_level ) ;
/* validate Lo/Ro center mix level */
validate_mix_level ( avctx , " loro_center_mix_level " ,
& opt - > loro_center_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 5 , 0 ,
& s - > loro_center_mix_level ) ;
/* validate Lo/Ro surround mix level */
validate_mix_level ( avctx , " loro_surround_mix_level " ,
& opt - > loro_surround_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 6 , 3 ,
& s - > loro_surround_mix_level ) ;
opt - > extended_bsi_1 = 1 ;
} else {
opt - > extended_bsi_1 = 0 ;
if ( ! s - > eac3 | | s - > has_center ) {
/* validate Lt/Rt center mix level */
validate_mix_level ( avctx , " ltrt_center_mix_level " ,
& opt - > ltrt_center_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 5 , 0 ,
& s - > ltrt_center_mix_level ) ;
/* validate Lo/Ro center mix level */
validate_mix_level ( avctx , " loro_center_mix_level " ,
& opt - > loro_center_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 5 , 0 ,
& s - > loro_center_mix_level ) ;
}
if ( ! s - > eac3 | | s - > has_surround ) {
/* validate Lt/Rt surround mix level */
validate_mix_level ( avctx , " ltrt_surround_mix_level " ,
& opt - > ltrt_surround_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 6 , 3 ,
& s - > ltrt_surround_mix_level ) ;
/* validate Lo/Ro surround mix level */
validate_mix_level ( avctx , " loro_surround_mix_level " ,
& opt - > loro_surround_mix_level , extmixlev_options ,
EXTMIXLEV_NUM_OPTIONS , 6 , 3 ,
& s - > loro_surround_mix_level ) ;
}
}
/* set extended bsi 2 flag */
if ( opt - > dolby_surround_ex_mode > = 0 | |
opt - > dolby_headphone_mode > = 0 | |
opt - > ad_converter_type > = 0 ) {
/* default dolby surround ex mode */
if ( opt - > dolby_surround_ex_mode < 0 )
opt - > dolby_surround_ex_mode = 0 ;
/* validate audio service type / channels combination */
if ( ( avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_KARAOKE & &
avctx - > channels = = 1 ) | |
( ( avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_COMMENTARY | |
avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_EMERGENCY | |
avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_VOICE_OVER )
& & avctx - > channels > 1 ) ) {
av_log ( avctx , AV_LOG_ERROR , " invalid audio service type for the "
" specified number of channels \n " ) ;
return AVERROR ( EINVAL ) ;
}
/* validate extended bsi 2 / info metadata */
if ( opt - > extended_bsi_2 | | opt - > eac3_info_metadata ) {
/* default dolby headphone mode */
if ( opt - > dolby_headphone_mode < 0 )
opt - > dolby_headphone_mode = 0 ;
/* default dolby surround ex mode */
if ( opt - > dolby_surround_ex_mode < 0 )
opt - > dolby_surround_ex_mode = 0 ;
/* default A/D converter type */
if ( opt - > ad_converter_type < 0 )
opt - > ad_converter_type = 0 ;
opt - > extended_bsi_2 = 1 ;
} else {
opt - > extended_bsi_2 = 0 ;
}
/* copyright & original defaults */
if ( ! s - > eac3 | | opt - > eac3_info_metadata ) {
/* default copyright */
if ( opt - > copyright < 0 )
opt - > copyright = 0 ;
/* default original */
if ( opt - > original < 0 )
opt - > original = 1 ;
}
/* dolby surround mode default */
if ( ! s - > eac3 | | opt - > eac3_info_metadata ) {
if ( opt - > dolby_surround_mode < 0 )
opt - > dolby_surround_mode = 0 ;
}
/* validate audio production info */
if ( opt - > audio_production_info ) {
if ( opt - > mixing_level < 0 ) {
av_log ( avctx , AV_LOG_ERROR , " mixing_level must be set if "
" room_type is set \n " ) ;
return AVERROR ( EINVAL ) ;
}
if ( opt - > mixing_level < 80 ) {
av_log ( avctx , AV_LOG_ERROR , " invalid mixing level. must be between "
" 80dB and 111dB \n " ) ;
return AVERROR ( EINVAL ) ;
}
/* default room type */
if ( opt - > room_type < 0 )
opt - > room_type = 0 ;
}
/* set bitstream id for alternate bitstream syntax */
if ( opt - > extended_bsi_1 | | opt - > extended_bsi_2 ) {
if ( ! s - > eac3 & & ( opt - > extended_bsi_1 | | opt - > extended_bsi_2 ) ) {
if ( s - > bitstream_id > 8 & & s - > bitstream_id < 11 ) {
static int warn_once = 1 ;
if ( warn_once ) {
@ -2041,23 +2134,9 @@ static av_cold int validate_options(AC3EncodeContext *s)
if ( s - > cutoff > ( s - > sample_rate > > 1 ) )
s - > cutoff = s - > sample_rate > > 1 ;
/* validate audio service type / channels combination */
if ( ( avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_KARAOKE & &
avctx - > channels = = 1 ) | |
( ( avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_COMMENTARY | |
avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_EMERGENCY | |
avctx - > audio_service_type = = AV_AUDIO_SERVICE_TYPE_VOICE_OVER )
& & avctx - > channels > 1 ) ) {
av_log ( avctx , AV_LOG_ERROR , " invalid audio service type for the "
" specified number of channels \n " ) ;
return AVERROR ( EINVAL ) ;
}
if ( ! s - > eac3 ) {
ret = ff_ac3_validate_metadata ( s ) ;
if ( ret )
return ret ;
}
ret = ff_ac3_validate_metadata ( s ) ;
if ( ret )
return ret ;
s - > rematrixing_enabled = s - > options . stereo_rematrixing & &
( s - > channel_mode = = AC3_CHMODE_STEREO ) ;