On Sun, Nov 17, 2013 at 12:14 AM, Tim Walker <[email protected]> wrote: > --- > libavcodec/dcadec.c | 21 +++++++++++++++------ > 1 file changed, 15 insertions(+), 6 deletions(-) > > diff --git a/libavcodec/dcadec.c b/libavcodec/dcadec.c > index 7af5e5c..b2e9e8a 100644 > --- a/libavcodec/dcadec.c > +++ b/libavcodec/dcadec.c > @@ -1288,7 +1288,9 @@ static int dca_filter_channels(DCAContext *s, int > block_index) > } > > /* Down mixing */ > - if (s->avctx->request_channels == 2 && s->prim_channels > 2) { > + if (s->prim_channels > 2 && > + (s->avctx->request_channels == 2 || > + s->avctx->request_channel_layout == AV_CH_LAYOUT_STEREO)) { > dca_downmix(s->samples_chanptr, s->amode, s->downmix_coef, > s->channel_order_tab); > } > > @@ -1803,8 +1805,11 @@ static int dca_decode_frame(AVCodecContext *avctx, > void *data, > if (s->amode < 16) { > avctx->channel_layout = dca_core_channel_layout[s->amode]; > > - if (s->xch_present && (!avctx->request_channels || > - avctx->request_channels > num_core_channels + > !!s->lfe)) { > + if (s->xch_present && > + (!avctx->request_channels || > + avctx->request_channels > num_core_channels + !!s->lfe) && > + (!avctx->request_channel_layout || > + avctx->request_channel_layout & AV_CH_BACK_CENTER)) { > avctx->channel_layout |= AV_CH_BACK_CENTER; > if (s->lfe) { > avctx->channel_layout |= AV_CH_LOW_FREQUENCY; > @@ -1826,7 +1831,9 @@ static int dca_decode_frame(AVCodecContext *avctx, void > *data, > s->channel_order_tab[channels - 1 - !!s->lfe] < 0) > return AVERROR_INVALIDDATA; > > - if (avctx->request_channels == 2 && s->prim_channels > 2) { > + if (s->prim_channels > 2 && > + (avctx->request_channels == 2 || > + avctx->request_channel_layout == AV_CH_LAYOUT_STEREO)) { > channels = 2; > s->output = DCA_STEREO; > avctx->channel_layout = AV_CH_LAYOUT_STEREO; > @@ -1922,8 +1929,10 @@ static av_cold int dca_decode_init(AVCodecContext > *avctx) > avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; > > /* allow downmixing to stereo */ > - if (avctx->channels > 2 && avctx->request_channels == 2) { > - avctx->channels = avctx->request_channels; > + if (avctx->channels > 2 && > + (avctx->request_channels == 2 || > + avctx->request_channel_layout == AV_CH_LAYOUT_STEREO)) { > + avctx->channels = 2; > } > > return 0; > -- > 1.8.3.4 (Apple Git-47) >
Hm, how about removing request_channels from all the decoding code, and just setting request_channel_layout in init if request_channels is set? Should make for a bit prettier code and less cruft to be removed later. - Hendrik _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
