@@ -273,6 +273,215 @@ static const int8_t ac3_coupling_start_tab[6][3][19] = {
};
+#define FLT_OPTION_THRESHOLD 0.01
+
+static int validate_float_option(float v, const float *v_list, int v_list_size)
+{
+ int i;
+
+ for (i = 0; i < v_list_size; i++) {
+ if (v < (v_list[i] + FLT_OPTION_THRESHOLD) &&
+ v > (v_list[i] - FLT_OPTION_THRESHOLD))
+ break;
+ }
+ if (i == v_list_size)
+ return AVERROR(EINVAL);
+
+ return i;
+}
+
+
+static void validate_mix_level(void *log_ctx, const char *opt_name,
+ float *opt_param, const float *list,
+ int list_size, int default_value, int min_value,
+ int *ctx_param)
+{
+ int mixlev = validate_float_option(*opt_param, list, list_size);
+ if (mixlev < min_value) {
+ mixlev = default_value;
+ if (*opt_param >= 0.0) {
+ av_log(log_ctx, AV_LOG_WARNING, "requested %s is not valid. using "
+ "default value: %0.3f\n", opt_name, list[mixlev]);
+ }
+ }
+ *opt_param = list[mixlev];
+ *ctx_param = mixlev;
+}
+
+
+/**
+ * Validate metadata options as set by AVOption system.
+ * These values can optionally be changed per-frame.
+ *
+ * @param s AC-3 encoder private context
+ */
+int ff_ac3_validate_metadata(AC3EncodeContext *s)
+{
+ AVCodecContext *avctx = s->avctx;
+ AC3EncOptions *opt = &s->options;
+
+ 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 != AC3ENC_OPT_NONE) {
+ 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 &&
+ (opt->ltrt_surround_mix_level >= 0 || opt->loro_surround_mix_level >= 0)) {
+ opt->extended_bsi_1 = 1;
+ opt->eac3_mixing_metadata = 1;
+ }
+
+ 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 != AC3ENC_OPT_NONE || opt->original != AC3ENC_OPT_NONE)
+ opt->eac3_info_metadata = 1;
+ if (s->channel_mode == AC3_CHMODE_STEREO &&
+ (opt->dolby_headphone_mode != AC3ENC_OPT_NONE || opt->dolby_surround_mode != AC3ENC_OPT_NONE))
+ opt->eac3_info_metadata = 1;
+ if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE)
+ opt->eac3_info_metadata = 1;
+ if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE ||
+ opt->ad_converter_type != AC3ENC_OPT_NONE) {
+ opt->audio_production_info = 1;
+ opt->eac3_info_metadata = 1;
+ }
+ } else {
+ /* determine audio production info use */
+ if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE)
+ opt->audio_production_info = 1;
+
+ /* determine xbsi2 use */
+ if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE)
+ opt->extended_bsi_2 = 1;
+ if (s->channel_mode == AC3_CHMODE_STEREO && opt->dolby_headphone_mode != AC3ENC_OPT_NONE)
+ opt->extended_bsi_2 = 1;
+ if (opt->ad_converter_type != AC3ENC_OPT_NONE)
+ opt->extended_bsi_2 = 1;
+ }
+
+ /* 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 == AC3ENC_OPT_NONE)
+ opt->preferred_stereo_downmix = AC3ENC_OPT_NOT_INDICATED;
+ 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);
+ }
+ }
+
+ /* validate audio service type / channels combination */
+ if ((avctx->audio_service_type == AV_AUDIO_SERVICE_TYPE_KARAOKE &&
+ avctx->ch_layout.nb_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->ch_layout.nb_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 == AC3ENC_OPT_NONE)
+ opt->dolby_headphone_mode = AC3ENC_OPT_NOT_INDICATED;
+ /* default dolby surround ex mode */
+ if (opt->dolby_surround_ex_mode == AC3ENC_OPT_NONE)
+ opt->dolby_surround_ex_mode = AC3ENC_OPT_NOT_INDICATED;
+ /* default A/D converter type */
+ if (opt->ad_converter_type == AC3ENC_OPT_NONE)
+ opt->ad_converter_type = AC3ENC_OPT_ADCONV_STANDARD;
+ }
+
+ /* copyright & original defaults */
+ if (!s->eac3 || opt->eac3_info_metadata) {
+ /* default copyright */
+ if (opt->copyright == AC3ENC_OPT_NONE)
+ opt->copyright = AC3ENC_OPT_OFF;
+ /* default original */
+ if (opt->original == AC3ENC_OPT_NONE)
+ opt->original = AC3ENC_OPT_ON;
+ }
+
+ /* dolby surround mode default */
+ if (!s->eac3 || opt->eac3_info_metadata) {
+ if (opt->dolby_surround_mode == AC3ENC_OPT_NONE)
+ opt->dolby_surround_mode = AC3ENC_OPT_NOT_INDICATED;
+ }
+
+ /* validate audio production info */
+ if (opt->audio_production_info) {
+ if (opt->mixing_level == AC3ENC_OPT_NONE) {
+ 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 == AC3ENC_OPT_NONE)
+ opt->room_type = AC3ENC_OPT_NOT_INDICATED;
+ }
+
+ /* set bitstream id for alternate bitstream syntax */
+ if (!s->eac3 && (opt->extended_bsi_1 || opt->extended_bsi_2))
+ s->bitstream_id = 6;
+
+ return 0;
+}
+
/**
* Adjust the frame size to make the average bit rate match the target bit rate.
* This is only needed for 11025, 22050, and 44100 sample rates or any E-AC-3.
@@ -1930,217 +2139,6 @@ static void dprint_options(AC3EncodeContext *s)
#endif
}
-
-#define FLT_OPTION_THRESHOLD 0.01
-
-static int validate_float_option(float v, const float *v_list, int v_list_size)
-{
- int i;
-
- for (i = 0; i < v_list_size; i++) {
- if (v < (v_list[i] + FLT_OPTION_THRESHOLD) &&
- v > (v_list[i] - FLT_OPTION_THRESHOLD))
- break;
- }
- if (i == v_list_size)
- return AVERROR(EINVAL);
-
- return i;
-}
-
-
-static void validate_mix_level(void *log_ctx, const char *opt_name,
- float *opt_param, const float *list,
- int list_size, int default_value, int min_value,
- int *ctx_param)
-{
- int mixlev = validate_float_option(*opt_param, list, list_size);
- if (mixlev < min_value) {
- mixlev = default_value;
- if (*opt_param >= 0.0) {
- av_log(log_ctx, AV_LOG_WARNING, "requested %s is not valid. using "
- "default value: %0.3f\n", opt_name, list[mixlev]);
- }
- }
- *opt_param = list[mixlev];
- *ctx_param = mixlev;
-}
-
-
-/**
- * Validate metadata options as set by AVOption system.
- * These values can optionally be changed per-frame.
- *
- * @param s AC-3 encoder private context
- */
-int ff_ac3_validate_metadata(AC3EncodeContext *s)
-{
- AVCodecContext *avctx = s->avctx;
- AC3EncOptions *opt = &s->options;
-
- 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 != AC3ENC_OPT_NONE) {
- 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 &&
- (opt->ltrt_surround_mix_level >= 0 || opt->loro_surround_mix_level >= 0)) {
- opt->extended_bsi_1 = 1;
- opt->eac3_mixing_metadata = 1;
- }
-
- 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 != AC3ENC_OPT_NONE || opt->original != AC3ENC_OPT_NONE)
- opt->eac3_info_metadata = 1;
- if (s->channel_mode == AC3_CHMODE_STEREO &&
- (opt->dolby_headphone_mode != AC3ENC_OPT_NONE || opt->dolby_surround_mode != AC3ENC_OPT_NONE))
- opt->eac3_info_metadata = 1;
- if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE)
- opt->eac3_info_metadata = 1;
- if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE ||
- opt->ad_converter_type != AC3ENC_OPT_NONE) {
- opt->audio_production_info = 1;
- opt->eac3_info_metadata = 1;
- }
- } else {
- /* determine audio production info use */
- if (opt->mixing_level != AC3ENC_OPT_NONE || opt->room_type != AC3ENC_OPT_NONE)
- opt->audio_production_info = 1;
-
- /* determine xbsi2 use */
- if (s->channel_mode >= AC3_CHMODE_2F2R && opt->dolby_surround_ex_mode != AC3ENC_OPT_NONE)
- opt->extended_bsi_2 = 1;
- if (s->channel_mode == AC3_CHMODE_STEREO && opt->dolby_headphone_mode != AC3ENC_OPT_NONE)
- opt->extended_bsi_2 = 1;
- if (opt->ad_converter_type != AC3ENC_OPT_NONE)
- opt->extended_bsi_2 = 1;
- }
-
- /* 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 == AC3ENC_OPT_NONE)
- opt->preferred_stereo_downmix = AC3ENC_OPT_NOT_INDICATED;
- 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);
- }
- }
-
- /* validate audio service type / channels combination */
- if ((avctx->audio_service_type == AV_AUDIO_SERVICE_TYPE_KARAOKE &&
- avctx->ch_layout.nb_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->ch_layout.nb_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 == AC3ENC_OPT_NONE)
- opt->dolby_headphone_mode = AC3ENC_OPT_NOT_INDICATED;
- /* default dolby surround ex mode */
- if (opt->dolby_surround_ex_mode == AC3ENC_OPT_NONE)
- opt->dolby_surround_ex_mode = AC3ENC_OPT_NOT_INDICATED;
- /* default A/D converter type */
- if (opt->ad_converter_type == AC3ENC_OPT_NONE)
- opt->ad_converter_type = AC3ENC_OPT_ADCONV_STANDARD;
- }
-
- /* copyright & original defaults */
- if (!s->eac3 || opt->eac3_info_metadata) {
- /* default copyright */
- if (opt->copyright == AC3ENC_OPT_NONE)
- opt->copyright = AC3ENC_OPT_OFF;
- /* default original */
- if (opt->original == AC3ENC_OPT_NONE)
- opt->original = AC3ENC_OPT_ON;
- }
-
- /* dolby surround mode default */
- if (!s->eac3 || opt->eac3_info_metadata) {
- if (opt->dolby_surround_mode == AC3ENC_OPT_NONE)
- opt->dolby_surround_mode = AC3ENC_OPT_NOT_INDICATED;
- }
-
- /* validate audio production info */
- if (opt->audio_production_info) {
- if (opt->mixing_level == AC3ENC_OPT_NONE) {
- 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 == AC3ENC_OPT_NONE)
- opt->room_type = AC3ENC_OPT_NOT_INDICATED;
- }
-
- /* set bitstream id for alternate bitstream syntax */
- if (!s->eac3 && (opt->extended_bsi_1 || opt->extended_bsi_2))
- s->bitstream_id = 6;
-
- return 0;
-}
-
-
/**
* Finalize encoding and free any memory allocated by the encoder.
*
Will avoid a forward declaration in the next commit. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavcodec/ac3enc.c | 420 ++++++++++++++++++++++---------------------- 1 file changed, 209 insertions(+), 211 deletions(-)