dcadec: Use correct channel count in stereo downmix check

s->prim_channels is greater than num_core_channels
when an XCh extension is present in the bitstream.

Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
This commit is contained in:
Tim Walker 2014-04-12 22:11:53 +02:00 committed by Luca Barbato
parent c8cf461c19
commit 801c39e1e3
1 changed files with 5 additions and 5 deletions

View File

@ -1890,7 +1890,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
s->channel_order_tab[channels - 1 - !!s->lfe] < 0) s->channel_order_tab[channels - 1 - !!s->lfe] < 0)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
if (s->prim_channels + !!s->lfe > 2 && if (num_core_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 = s->prim_channels == 2 ? s->amode : DCA_STEREO; s->output = s->prim_channels == 2 ? s->amode : DCA_STEREO;
@ -1904,7 +1904,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
if (s->core_downmix && (s->core_downmix_amode == DCA_STEREO || if (s->core_downmix && (s->core_downmix_amode == DCA_STEREO ||
s->core_downmix_amode == DCA_STEREO_TOTAL)) { s->core_downmix_amode == DCA_STEREO_TOTAL)) {
int sign, code; int sign, code;
for (i = 0; i < s->prim_channels + !!s->lfe; i++) { for (i = 0; i < num_core_channels + !!s->lfe; i++) {
sign = s->core_downmix_codes[i][0] & 0x100 ? 1 : -1; sign = s->core_downmix_codes[i][0] & 0x100 ? 1 : -1;
code = s->core_downmix_codes[i][0] & 0x0FF; code = s->core_downmix_codes[i][0] & 0x0FF;
s->downmix_coef[i][0] = (!code ? 0.0f : s->downmix_coef[i][0] = (!code ? 0.0f :
@ -1922,19 +1922,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
"Invalid channel mode %d\n", am); "Invalid channel mode %d\n", am);
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
} }
if (s->prim_channels + !!s->lfe > if (num_core_channels + !!s->lfe >
FF_ARRAY_ELEMS(dca_default_coeffs[0])) { FF_ARRAY_ELEMS(dca_default_coeffs[0])) {
avpriv_request_sample(s->avctx, "Downmixing %d channels", avpriv_request_sample(s->avctx, "Downmixing %d channels",
s->prim_channels + !!s->lfe); s->prim_channels + !!s->lfe);
return AVERROR_PATCHWELCOME; return AVERROR_PATCHWELCOME;
} }
for (i = 0; i < s->prim_channels + !!s->lfe; i++) { for (i = 0; i < num_core_channels + !!s->lfe; i++) {
s->downmix_coef[i][0] = dca_default_coeffs[am][i][0]; s->downmix_coef[i][0] = dca_default_coeffs[am][i][0];
s->downmix_coef[i][1] = dca_default_coeffs[am][i][1]; s->downmix_coef[i][1] = dca_default_coeffs[am][i][1];
} }
} }
av_dlog(s->avctx, "Stereo downmix coeffs:\n"); av_dlog(s->avctx, "Stereo downmix coeffs:\n");
for (i = 0; i < s->prim_channels + !!s->lfe; i++) { for (i = 0; i < num_core_channels + !!s->lfe; i++) {
av_dlog(s->avctx, "L, input channel %d = %f\n", i, av_dlog(s->avctx, "L, input channel %d = %f\n", i,
s->downmix_coef[i][0]); s->downmix_coef[i][0]);
av_dlog(s->avctx, "R, input channel %d = %f\n", i, av_dlog(s->avctx, "R, input channel %d = %f\n", i,