]> granicus.if.org Git - handbrake/commitdiff
Fix livavcodec-based downmixing of DTS-ES 6.1 to Stereo.
authorRodeo <tdskywalker@gmail.com>
Sun, 13 Apr 2014 00:56:50 +0000 (00:56 +0000)
committerRodeo <tdskywalker@gmail.com>
Sun, 13 Apr 2014 00:56:50 +0000 (00:56 +0000)
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@6162 b64f7644-9d1e-0410-96f1-a4d463321fa5

contrib/ffmpeg/A01-dca-downmix-6point1.patch [new file with mode: 0644]

diff --git a/contrib/ffmpeg/A01-dca-downmix-6point1.patch b/contrib/ffmpeg/A01-dca-downmix-6point1.patch
new file mode 100644 (file)
index 0000000..ec9b1c0
--- /dev/null
@@ -0,0 +1,62 @@
+diff --git a/libavcodec/dcadec.c b/libavcodec/dcadec.c
+index 6c240ee..ce8660d 100644
+--- a/libavcodec/dcadec.c
++++ b/libavcodec/dcadec.c
+@@ -1856,6 +1856,16 @@ static int dca_decode_frame(AVCodecContext *avctx, void *data,
+     if (s->amode < 16) {
+         avctx->channel_layout = dca_core_channel_layout[s->amode];
++        if (s->prim_channels + !!s->lfe > 2 &&
++            avctx->request_channel_layout == AV_CH_LAYOUT_STEREO) {
++            /*
++             * Neither the core's auxiliary data nor our default tables contain
++             * downmix coefficients for the additional channel coded in the XCh
++             * extension, so when we're doing a Stereo downmix, don't decode it.
++             */
++            s->xch_disable = 1;
++        }
++
+ #if FF_API_REQUEST_CHANNELS
+ FF_DISABLE_DEPRECATION_WARNINGS
+         if (s->xch_present && !s->xch_disable &&
+@@ -1886,7 +1896,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
+             s->channel_order_tab[channels - 1 - !!s->lfe] < 0)
+             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) {
+             channels = 2;
+             s->output = s->prim_channels == 2 ? s->amode : DCA_STEREO;
+@@ -1900,7 +1910,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
+             if (s->core_downmix && (s->core_downmix_amode == DCA_STEREO ||
+                                     s->core_downmix_amode == DCA_STEREO_TOTAL)) {
+                 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;
+                     code = s->core_downmix_codes[i][0] & 0x0FF;
+                     s->downmix_coef[i][0] = (!code ? 0.0f :
+@@ -1918,19 +1928,19 @@ FF_ENABLE_DEPRECATION_WARNINGS
+                            "Invalid channel mode %d\n", am);
+                     return AVERROR_INVALIDDATA;
+                 }
+-                if (s->prim_channels + !!s->lfe >
++                if (num_core_channels + !!s->lfe >
+                     FF_ARRAY_ELEMS(dca_default_coeffs[0])) {
+                     avpriv_request_sample(s->avctx, "Downmixing %d channels",
+                                           s->prim_channels + !!s->lfe);
+                     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][1] = dca_default_coeffs[am][i][1];
+                 }
+             }
+             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,
+                         s->downmix_coef[i][0]);
+                 av_dlog(s->avctx, "R, input channel %d = %f\n", i,