dcadec: set the output channel mode more accurately.

When downmixing 2.1 to 2-channel, if the 2.0 portion is Lt/Rt, sum-difference or dual mono, the actual output will be the same (with the LFE either mixed-in or discarded).

Also, when downmixing an arbitrary layout to 2-channel, if the bitstream contains custom downmix coefficients targeting Lt/Rt, then the output will be Lt/Rt rather than regular Stereo.
pull/53/head
Tim Walker 11 years ago
parent 5b4797a21d
commit 6bfdb2de88
  1. 3
      libavcodec/dcadec.c

@ -1890,7 +1890,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (s->prim_channels + !!s->lfe > 2 && if (s->prim_channels + !!s->lfe > 2 &&
avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) { avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) {
channels = 2; channels = 2;
s->output = DCA_STEREO; s->output = s->prim_channels == 2 ? s->amode : DCA_STEREO;
avctx->channel_layout = AV_CH_LAYOUT_STEREO; avctx->channel_layout = AV_CH_LAYOUT_STEREO;
/* Stereo downmix coefficients /* Stereo downmix coefficients
@ -1911,6 +1911,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
s->downmix_coef[i][1] = (!code ? 0.0f : s->downmix_coef[i][1] = (!code ? 0.0f :
sign * dca_dmixtable[code - 1]); sign * dca_dmixtable[code - 1]);
} }
s->output = s->core_downmix_amode;
} else { } else {
int am = s->amode & DCA_CHANNEL_MASK; int am = s->amode & DCA_CHANNEL_MASK;
if (am >= FF_ARRAY_ELEMS(dca_default_coeffs)) { if (am >= FF_ARRAY_ELEMS(dca_default_coeffs)) {

Loading…
Cancel
Save