summaryrefslogtreecommitdiffstats
path: root/libhb/work.c
diff options
context:
space:
mode:
Diffstat (limited to 'libhb/work.c')
-rw-r--r--libhb/work.c115
1 files changed, 35 insertions, 80 deletions
diff --git a/libhb/work.c b/libhb/work.c
index b7dda2736..7fdcab867 100644
--- a/libhb/work.c
+++ b/libhb/work.c
@@ -559,100 +559,55 @@ static void do_job( hb_job_t * job, int cpu_count )
}
int requested_mixdown = 0;
+ int best_mixdown = 0;
int requested_mixdown_index = 0;
for( i = 0; i < hb_list_count( title->list_audio ); i++ )
{
audio = hb_list_item( title->list_audio, i );
- if( audio->config.out.codec != audio->config.in.codec )
- {
- /* sense-check the current mixdown options */
+ best_mixdown = hb_get_best_mixdown( audio->config.out.codec,
+ audio->config.in.channel_layout );
- /* log the requested mixdown */
- for (j = 0; j < hb_audio_mixdowns_count; j++) {
- if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) {
- requested_mixdown = audio->config.out.mixdown;
- requested_mixdown_index = j;
- }
- }
+ /* sense-check the current mixdown options */
- /* sense-check the requested mixdown */
-
- if( audio->config.out.mixdown == 0 &&
- audio->config.out.codec != HB_ACODEC_AC3_PASS &&
- audio->config.out.codec != HB_ACODEC_DCA_PASS )
- {
- /*
- * Mixdown wasn't specified and this is not pass-through,
- * set a default mixdown of stereo.
- */
- audio->config.out.mixdown = HB_AMIXDOWN_STEREO;
+ /* log the requested mixdown */
+ for (j = 0; j < hb_audio_mixdowns_count; j++) {
+ if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) {
+ requested_mixdown = audio->config.out.mixdown;
+ requested_mixdown_index = j;
}
+ }
- // Here we try to sanitize the audio input to output mapping.
- // Constraints are:
- // 1. only the AC3 & DCA decoder libraries currently support mixdown
- // 2. the lame encoder library only supports stereo.
- // So if the encoder is lame we need the output to be stereo (or multichannel
- // matrixed into stereo like dpl). If the decoder is not AC3 or DCA the
- // encoder has to handle the input format since we can't do a mixdown.
- switch (audio->config.in.channel_layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
- {
- // stereo input or something not handled below
- default:
- case HB_INPUT_CH_LAYOUT_STEREO:
- // mono gets mixed up to stereo & more than stereo gets mixed down
- if ( audio->config.out.mixdown > HB_AMIXDOWN_STEREO )
- {
- audio->config.out.mixdown = HB_AMIXDOWN_STEREO;
- }
- break;
-
- // mono input
- case HB_INPUT_CH_LAYOUT_MONO:
- // everything else passes through
- audio->config.out.mixdown = HB_AMIXDOWN_MONO;
- break;
-
- // dolby (DPL1 aka Dolby Surround = 4.0 matrix-encoded) input
- // the A52 flags don't allow for a way to distinguish between DPL1 and
- // DPL2 on a DVD so we always assume a DPL1 source for A52_DOLBY.
- case HB_INPUT_CH_LAYOUT_DOLBY:
- if ( audio->config.out.mixdown > HB_AMIXDOWN_DOLBY )
- {
- audio->config.out.mixdown = HB_AMIXDOWN_DOLBY;
- }
- break;
-
- // 4 channel discrete
- case HB_INPUT_CH_LAYOUT_2F2R:
- case HB_INPUT_CH_LAYOUT_3F1R:
- if ( audio->config.out.mixdown > HB_AMIXDOWN_DOLBY )
- {
- audio->config.out.mixdown = HB_AMIXDOWN_DOLBY;
- }
- break;
+ /* sense-check the requested mixdown */
+ if( audio->config.out.mixdown == 0 &&
+ audio->config.out.codec != HB_ACODEC_AC3_PASS &&
+ audio->config.out.codec != HB_ACODEC_DCA_PASS )
+ {
+ /*
+ * Mixdown wasn't specified and this is not pass-through,
+ * set a default mixdown
+ */
+ audio->config.out.mixdown = best_mixdown;
+ }
- // 5 or 6 channel discrete
- case HB_INPUT_CH_LAYOUT_3F2R:
- if ( ! ( audio->config.in.channel_layout &
- HB_INPUT_CH_LAYOUT_HAS_LFE ) )
- {
- // we don't do 5 channel discrete so mixdown to DPLII
- audio->config.out.mixdown = HB_AMIXDOWN_DOLBYPLII;
- }
- break;
+ if ( !( audio->config.out.codec & HB_ACODEC_PASS_FLAG ) )
+ {
+ if ( audio->config.out.mixdown > best_mixdown )
+ {
+ audio->config.out.mixdown = best_mixdown;
}
+ }
+ if ( audio->config.out.mixdown != requested_mixdown )
+ {
/* log the output mixdown */
- for (j = 0; j < hb_audio_mixdowns_count; j++) {
- if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) {
- if ( audio->config.out.mixdown != requested_mixdown )
- {
- hb_log("work: sanitizing track %i mixdown %s to %s", i, hb_audio_mixdowns[requested_mixdown_index].human_readable_name, hb_audio_mixdowns[j].human_readable_name);
- }
- break;
+ for (j = 0; j < hb_audio_mixdowns_count; j++)
+ {
+ if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown)
+ {
+ hb_log("work: sanitizing track %i mixdown %s to %s", i, hb_audio_mixdowns[requested_mixdown_index].human_readable_name, hb_audio_mixdowns[j].human_readable_name);
+ break;
}
}
}