]> git.sesse.net Git - ffmpeg/commitdiff
dcadec: set the output channel mode more accurately.
authorTim Walker <tdskywalker@gmail.com>
Wed, 11 Dec 2013 02:03:30 +0000 (02:03 +0000)
committerTim Walker <tdskywalker@gmail.com>
Sun, 5 Jan 2014 15:41:56 +0000 (16:41 +0100)
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.

libavcodec/dcadec.c

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