diff options
author | Rodeo <[email protected]> | 2012-05-27 13:38:41 +0000 |
---|---|---|
committer | Rodeo <[email protected]> | 2012-05-27 13:38:41 +0000 |
commit | f2ffde5fff6540a84bca511a67ad7468c25aab81 (patch) | |
tree | 1026ba45c33da4d752b50fa9a11d4eff4269e46a /libhb/common.c | |
parent | c906e05b28bae440471dd2a816627b9852eed3e8 (diff) |
decdca: attempt to fix Dolby Surround and Pro Logic II mixdown. We were doing it wrong in some cases.
This means Dolby Pro Logic II is now only available for sources with at least L, R, C, Ls, Rs channels (as well as any additional channels), due to some libdca limitations. This will eventually go away when we use our own downmixing for all sources.
Further cleanup to follow.
Also cleans up usage of audio->config.in.flags (was audio->config.flags.*).
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4705 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/common.c')
-rw-r--r-- | libhb/common.c | 62 |
1 files changed, 33 insertions, 29 deletions
diff --git a/libhb/common.c b/libhb/common.c index 23c6ea21e..0bc48a842 100644 --- a/libhb/common.c +++ b/libhb/common.c @@ -705,41 +705,33 @@ int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown ) } switch (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 - best_mixdown = HB_AMIXDOWN_STEREO; - break; - // mono input case HB_INPUT_CH_LAYOUT_MONO: - // everything else passes through best_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 + // Dolby Pro Logic (a.k.a. Dolby Surround), 4.0 channels (matrix-encoded) + // 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: - best_mixdown = HB_AMIXDOWN_DOLBY; - break; - - // 4 channel discrete + // 3 or 4 discrete channels + // case HB_INPUT_CH_LAYOUT_3F: // FIXME: can it be downmixed to Dolby? + // case HB_INPUT_CH_LAYOUT_2F1R: // FIXME: can it be downmixed to Dolby? case HB_INPUT_CH_LAYOUT_2F2R: case HB_INPUT_CH_LAYOUT_3F1R: // a52dec and libdca can't upmix to 6ch, // so we must downmix these. - best_mixdown = HB_AMIXDOWN_DOLBYPLII; + // libdca only supports DPLII if the source is 3F2R to begin with + best_mixdown = HB_AMIXDOWN_DOLBY; break; - // 5, 6, 7, or 8 channel discrete + // 5 to 8 discrete channels case HB_INPUT_CH_LAYOUT_4F2R: case HB_INPUT_CH_LAYOUT_3F4R: case HB_INPUT_CH_LAYOUT_3F2R: - if ( ! ( layout & HB_INPUT_CH_LAYOUT_HAS_LFE ) ) + if (!(layout & HB_INPUT_CH_LAYOUT_HAS_LFE)) { - // we don't do 5 channel discrete so mixdown to DPLII + // we don't do 5-channel discrete // a52dec and libdca can't upmix to 6ch, // so we must downmix this. best_mixdown = HB_AMIXDOWN_DOLBYPLII; @@ -759,6 +751,12 @@ int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown ) } } break; + + // stereo input or something not handled above + default: + // mono gets mixed up to stereo & more than stereo gets mixed down + best_mixdown = HB_AMIXDOWN_STEREO; + break; } // return the best that is not greater than the requested mixdown // 0 means the caller requested the best available mixdown @@ -1608,30 +1606,36 @@ hb_audio_t *hb_audio_copy(const hb_audio_t *src) *********************************************************************/ void hb_audio_config_init(hb_audio_config_t * audiocfg) { - /* Set read only paramaters to invalid values */ - audiocfg->in.codec = 0xDEADBEEF; - audiocfg->in.bitrate = -1; - audiocfg->in.samplerate = -1; - audiocfg->in.channel_layout = 0; - audiocfg->in.channel_map = NULL; + /* Set read-only paramaters to invalid values */ + audiocfg->in.codec = 0; + audiocfg->in.codec_param = 0; + audiocfg->in.reg_desc = 0; + audiocfg->in.stream_type = 0; + audiocfg->in.substream_type = 0; audiocfg->in.version = 0; + audiocfg->in.flags = 0; audiocfg->in.mode = 0; - audiocfg->flags.ac3 = 0; + audiocfg->in.samplerate = -1; + audiocfg->in.samples_per_frame = -1; + audiocfg->in.bitrate = -1; + audiocfg->in.channel_layout = -1; + audiocfg->in.channel_map = NULL; audiocfg->lang.description[0] = 0; audiocfg->lang.simple[0] = 0; audiocfg->lang.iso639_2[0] = 0; - /* Initalize some sensable defaults */ + /* Initalize some sensible defaults */ audiocfg->in.track = audiocfg->out.track = 0; - audiocfg->out.codec = HB_ACODEC_FAAC; + audiocfg->out.codec = hb_audio_encoders[0].encoder; + audiocfg->out.samplerate = -1; + audiocfg->out.samples_per_frame = -1; audiocfg->out.bitrate = -1; audiocfg->out.quality = HB_INVALID_AUDIO_QUALITY; audiocfg->out.compression_level = -1; - audiocfg->out.samplerate = -1; audiocfg->out.mixdown = -1; audiocfg->out.dynamic_range_compression = 0; + audiocfg->out.gain = 0; audiocfg->out.name = NULL; - } /********************************************************************** |