diff options
Diffstat (limited to 'libhb/work.c')
-rw-r--r-- | libhb/work.c | 241 |
1 files changed, 122 insertions, 119 deletions
diff --git a/libhb/work.c b/libhb/work.c index cf801e48b..043a7c196 100644 --- a/libhb/work.c +++ b/libhb/work.c @@ -158,7 +158,7 @@ static void do_job( hb_job_t * job, int cpu_count ) so they fit into the user's specified dimensions. */ hb_set_anamorphic_size(job, &job->width, &job->height, &job->pixel_aspect_width, &job->pixel_aspect_height); } - + if( job->pixel_ratio && job->vcodec == HB_VCODEC_FFMPEG) { /* Just to make working with ffmpeg even more fun, @@ -172,7 +172,7 @@ static void do_job( hb_job_t * job, int cpu_count ) job->pixel_aspect_height >>= 1; } } - + /* Keep width and height within these boundaries, but ignore for "loose" anamorphic encodes, for which this stuff is covered in the pixel_ratio @@ -202,7 +202,7 @@ static void do_job( hb_job_t * job, int cpu_count ) if ( job->vfr ) { job->vrate_base = title->rate_base; - + int detelecine_present = 0; if ( job->filters ) { @@ -429,151 +429,154 @@ static void do_job( hb_job_t * job, int cpu_count ) hb_log( " + %x, %s", audio->id, audio->config.lang.description ); - /* sense-check the current mixdown options */ + if( audio->config.out.codec != audio->config.in.codec ) + { + /* sense-check the current mixdown options */ - /* log the requested mixdown */ - for (j = 0; j < hb_audio_mixdowns_count; j++) { - if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) { - hb_log( " + Requested mixdown: %s (%s)", hb_audio_mixdowns[j].human_readable_name, hb_audio_mixdowns[j].internal_name ); - break; - } - } + /* log the requested mixdown */ + for (j = 0; j < hb_audio_mixdowns_count; j++) { + if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) { + hb_log( " + Requested mixdown: %s (%s)", hb_audio_mixdowns[j].human_readable_name, hb_audio_mixdowns[j].internal_name ); + break; + } + } - /* sense-check the requested mixdown */ + /* sense-check the requested mixdown */ - if( audio->config.out.mixdown == 0 && - audio->config.out.codec != HB_ACODEC_AC3 ) - { - /* - * Mixdown wasn't specified and this is not pass-through, - * set a default mixdown of stereo. - */ - audio->config.out.mixdown = HB_AMIXDOWN_STEREO; - } + if( audio->config.out.mixdown == 0 && + audio->config.out.codec != HB_ACODEC_AC3 ) + { + /* + * Mixdown wasn't specified and this is not pass-through, + * set a default mixdown of stereo. + */ + audio->config.out.mixdown = HB_AMIXDOWN_STEREO; + } - // 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. + // 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. #define CAN_MIXDOWN(a) ( a->config.in.codec & (HB_ACODEC_AC3|HB_ACODEC_DCA) ) #define STEREO_ONLY(a) ( a->config.out.codec & HB_ACODEC_LAME ) - 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 ( STEREO_ONLY( audio ) || - audio->config.out.mixdown > HB_AMIXDOWN_STEREO) - { - audio->config.out.mixdown = HB_AMIXDOWN_STEREO; - } - break; + 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 ( STEREO_ONLY( audio ) || + audio->config.out.mixdown > HB_AMIXDOWN_STEREO) + { + audio->config.out.mixdown = HB_AMIXDOWN_STEREO; + } + break; - // mono input - case HB_INPUT_CH_LAYOUT_MONO: - if ( STEREO_ONLY( audio ) ) - { - if ( !CAN_MIXDOWN( audio ) ) + // mono input + case HB_INPUT_CH_LAYOUT_MONO: + if ( STEREO_ONLY( audio ) ) { - // XXX we're hosed - we can't mix up & lame can't handle - // the input format. The user shouldn't be able to make - // this choice. It's too late to do anything about it now - // so complain in the log & let things abort in lame. - hb_log( "ERROR - can't use lame mp3 audio output with " - "mono audio stream %x - output will be messed up", - audio->id ); + if ( !CAN_MIXDOWN( audio ) ) + { + // XXX we're hosed - we can't mix up & lame can't handle + // the input format. The user shouldn't be able to make + // this choice. It's too late to do anything about it now + // so complain in the log & let things abort in lame. + hb_log( "ERROR - can't use lame mp3 audio output with " + "mono audio stream %x - output will be messed up", + audio->id ); + } + audio->config.out.mixdown = HB_AMIXDOWN_STEREO; } - audio->config.out.mixdown = HB_AMIXDOWN_STEREO; - } - else - { - // 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 ( STEREO_ONLY( audio ) || !CAN_MIXDOWN( audio ) || - audio->config.out.mixdown > HB_AMIXDOWN_DOLBY ) - { - audio->config.out.mixdown = HB_AMIXDOWN_DOLBY; - } - break; + else + { + // everything else passes through + audio->config.out.mixdown = HB_AMIXDOWN_MONO; + } + break; - // 4 channel discrete - case HB_INPUT_CH_LAYOUT_2F2R: - case HB_INPUT_CH_LAYOUT_3F1R: - if ( CAN_MIXDOWN( audio ) ) - { - if ( STEREO_ONLY( audio ) || + // 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 ( STEREO_ONLY( audio ) || !CAN_MIXDOWN( audio ) || audio->config.out.mixdown > HB_AMIXDOWN_DOLBY ) { audio->config.out.mixdown = HB_AMIXDOWN_DOLBY; } - } - else - { - // XXX we can't mixdown & don't have any way to specify - // 4 channel discrete output so we're hosed. - hb_log( "ERROR - can't handle 4 channel discrete audio stream " - "%x - output will be messed up", audio->id ); - } - break; + break; - // 5 or 6 channel discrete - case HB_INPUT_CH_LAYOUT_3F2R: - if ( CAN_MIXDOWN( audio ) ) - { - if ( STEREO_ONLY( audio ) ) + // 4 channel discrete + case HB_INPUT_CH_LAYOUT_2F2R: + case HB_INPUT_CH_LAYOUT_3F1R: + if ( CAN_MIXDOWN( audio ) ) + { + if ( STEREO_ONLY( audio ) || + audio->config.out.mixdown > HB_AMIXDOWN_DOLBY ) + { + audio->config.out.mixdown = HB_AMIXDOWN_DOLBY; + } + } + else + { + // XXX we can't mixdown & don't have any way to specify + // 4 channel discrete output so we're hosed. + hb_log( "ERROR - can't handle 4 channel discrete audio stream " + "%x - output will be messed up", audio->id ); + } + break; + + // 5 or 6 channel discrete + case HB_INPUT_CH_LAYOUT_3F2R: + if ( CAN_MIXDOWN( audio ) ) { - if ( audio->config.out.mixdown < HB_AMIXDOWN_STEREO ) + if ( STEREO_ONLY( audio ) ) { - audio->config.out.mixdown = HB_AMIXDOWN_STEREO; + if ( audio->config.out.mixdown < HB_AMIXDOWN_STEREO ) + { + audio->config.out.mixdown = HB_AMIXDOWN_STEREO; + } + else if ( audio->config.out.mixdown > HB_AMIXDOWN_DOLBYPLII ) + { + audio->config.out.mixdown = HB_AMIXDOWN_DOLBYPLII; + } } - else if ( audio->config.out.mixdown > HB_AMIXDOWN_DOLBYPLII ) + else 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; } } else if ( ! ( audio->config.in.channel_layout & - HB_INPUT_CH_LAYOUT_HAS_LFE ) ) + HB_INPUT_CH_LAYOUT_HAS_LFE ) ) { - // we don't do 5 channel discrete so mixdown to DPLII - audio->config.out.mixdown = HB_AMIXDOWN_DOLBYPLII; + // XXX we can't mixdown & don't have any way to specify + // 5 channel discrete output so we're hosed. + hb_log( "ERROR - can't handle 5 channel discrete audio stream " + "%x - output will be messed up", audio->id ); } + else + { + // we can't mixdown so force 6 channel discrete + audio->config.out.mixdown = HB_AMIXDOWN_6CH; + } + break; + } + + /* log the output mixdown */ + for (j = 0; j < hb_audio_mixdowns_count; j++) { + if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) { + hb_log( " + Actual mixdown: %s (%s)", hb_audio_mixdowns[j].human_readable_name, hb_audio_mixdowns[j].internal_name ); + break; } - else if ( ! ( audio->config.in.channel_layout & - HB_INPUT_CH_LAYOUT_HAS_LFE ) ) - { - // XXX we can't mixdown & don't have any way to specify - // 5 channel discrete output so we're hosed. - hb_log( "ERROR - can't handle 5 channel discrete audio stream " - "%x - output will be messed up", audio->id ); - } - else - { - // we can't mixdown so force 6 channel discrete - audio->config.out.mixdown = HB_AMIXDOWN_6CH; - } - break; + } } - /* log the output mixdown */ - for (j = 0; j < hb_audio_mixdowns_count; j++) { - if (hb_audio_mixdowns[j].amixdown == audio->config.out.mixdown) { - hb_log( " + Actual mixdown: %s (%s)", hb_audio_mixdowns[j].human_readable_name, hb_audio_mixdowns[j].internal_name ); - break; - } - } - if (audio->config.out.codec == HB_ACODEC_VORBIS) audio->priv.config.vorbis.language = audio->config.lang.simple; |