summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libhb/common.c91
1 files changed, 34 insertions, 57 deletions
diff --git a/libhb/common.c b/libhb/common.c
index 93c98ffa4..6d4d5ee5e 100644
--- a/libhb/common.c
+++ b/libhb/common.c
@@ -710,74 +710,51 @@ float hb_get_default_audio_compression( uint32_t codec )
return compression;
}
-int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown )
+int hb_get_best_mixdown(uint32_t codec, int layout, int mixdown)
{
-
int best_mixdown;
-
+
if (codec & HB_ACODEC_PASS_FLAG)
{
- // Audio pass-thru. No mixdown.
+ // Audio passthrough, no mixdown
return HB_AMIXDOWN_NONE;
}
- switch (layout & ~AV_CH_LOW_FREQUENCY)
+ else if ((layout & AV_CH_LAYOUT_5POINT1) == AV_CH_LAYOUT_5POINT1 ||
+ (layout & AV_CH_LAYOUT_5POINT1_BACK) == AV_CH_LAYOUT_5POINT1_BACK)
{
- // mono input
- case AV_CH_LAYOUT_MONO:
- best_mixdown = HB_AMIXDOWN_MONO;
- break;
-
- // 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 AV_CH_LAYOUT_STEREO_DOWNMIX:
- // 3 or 4 discrete channels
- case AV_CH_LAYOUT_2_1:
- case AV_CH_LAYOUT_2_2:
- case AV_CH_LAYOUT_QUAD:
- case AV_CH_LAYOUT_4POINT0:
- case AV_CH_LAYOUT_SURROUND:
- // a52dec and libdca can't upmix to 6ch, so we must downmix these.
- // libdca only supports DPLII if the source is 3F2R to begin with.
- best_mixdown = HB_AMIXDOWN_DOLBY;
- break;
-
- // 5 to 8 discrete channels
- case AV_CH_LAYOUT_5POINT0:
- case AV_CH_LAYOUT_7POINT0:
- if (!(layout & AV_CH_LOW_FREQUENCY))
- {
- // 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;
- }
- else
- {
- switch (codec)
- {
- case HB_ACODEC_LAME:
- case HB_ACODEC_FFAAC:
- best_mixdown = HB_AMIXDOWN_DOLBYPLII;
- break;
-
- default:
- best_mixdown = HB_AMIXDOWN_6CH;
- break;
- }
- }
- 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;
+ // full 3F2R, possibly with additional channels, and an LFE
+ // limiting factor: liba52, libdca (can't upmix)
+ best_mixdown = HB_AMIXDOWN_6CH;
+ }
+ else if ((layout & AV_CH_LAYOUT_5POINT0) == AV_CH_LAYOUT_5POINT0 ||
+ (layout & AV_CH_LAYOUT_5POINT0_BACK) == AV_CH_LAYOUT_5POINT0_BACK)
+ {
+ // full 3F2R, possibly with additional channels, but no LFE
+ // limiting factor: liba52, libdca (can't upmix)
+ // limiting factor: libdca (can only do DPL2 with 3F2R sources)
+ best_mixdown = HB_AMIXDOWN_DOLBYPLII;
+ }
+ else if(layout == AV_CH_LAYOUT_STEREO)
+ {
+ // limiting factor: no Dolby Surround for Stereo sources
+ best_mixdown = HB_AMIXDOWN_STEREO;
}
+ else if(av_get_channel_layout_nb_channels(layout) == 1)
+ {
+ // only one channel, not much point in upmixing
+ best_mixdown = HB_AMIXDOWN_MONO;
+ }
+ else
+ {
+ // everything else, including Dolby (AV_CH_LAYOUT_STEREO_DOWNMIX)
+ best_mixdown = HB_AMIXDOWN_DOLBY;
+ }
+
// return the best that is not greater than the requested mixdown
// 0 means the caller requested the best available mixdown
- if( best_mixdown > mixdown && mixdown > 0 )
+ if (best_mixdown > mixdown && mixdown > 0)
best_mixdown = mixdown;
-
+
return best_mixdown;
}