summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--contrib/ffmpeg/A01-dca-downmix-6point1.patch62
1 files changed, 62 insertions, 0 deletions
diff --git a/contrib/ffmpeg/A01-dca-downmix-6point1.patch b/contrib/ffmpeg/A01-dca-downmix-6point1.patch
new file mode 100644
index 000000000..ec9b1c044
--- /dev/null
+++ b/contrib/ffmpeg/A01-dca-downmix-6point1.patch
@@ -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,