From 3889dfde9c0284b008c5cfcbc921c1d137fb81e2 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Mon, 24 Apr 2017 22:39:32 +0200 Subject: [PATCH] dca: Move the downmix request check outside the loop --- libavcodec/dcadec.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/libavcodec/dcadec.c b/libavcodec/dcadec.c index 3fe46cdc5c..9c1f878239 100644 --- a/libavcodec/dcadec.c +++ b/libavcodec/dcadec.c @@ -932,7 +932,7 @@ static int dca_subsubframe(DCAContext *s, int base_channel, int block_index) return 0; } -static int dca_filter_channels(DCAContext *s, int block_index, int upsample) +static int dca_filter_channels(DCAContext *s, int block_index, int upsample, int downmix) { int k; @@ -1000,8 +1000,7 @@ static int dca_filter_channels(DCAContext *s, int block_index, int upsample) /* FIXME: This downmixing is probably broken with upsample. * Probably totally broken also with XLL in general. */ /* Downmixing to Stereo */ - if (s->audio_header.prim_channels + !!s->lfe > 2 && - s->avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) { + if (downmix) { dca_downmix(s->samples_chanptr, s->amode, !!s->lfe, s->downmix_coef, s->channel_order_tab); } @@ -1378,6 +1377,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data, DCAContext *s = avctx->priv_data; int channels, full_channels; int upsample = 0; + int downmix; s->exss_ext_mask = 0; s->xch_present = 0; @@ -1488,6 +1488,9 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data, return ret; } + downmix = s->audio_header.prim_channels > 2 && + avctx->request_channel_layout == AV_CH_LAYOUT_STEREO; + /* filter to get final output */ for (i = 0; i < (s->sample_blocks / SAMPLES_PER_SUBBAND); i++) { int ch; @@ -1497,7 +1500,7 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data, for (; ch < full_channels; ch++) s->samples_chanptr[ch] = s->extra_channels[ch - channels] + i * block; - dca_filter_channels(s, i, upsample); + dca_filter_channels(s, i, upsample, downmix); /* If this was marked as a DTS-ES stream we need to subtract back- */ /* channel from SL & SR to remove matrixed back-channel signal */