diff options
Diffstat (limited to 'contrib/ffmpeg/A01-dca-downmix-6point1.patch')
-rw-r--r-- | contrib/ffmpeg/A01-dca-downmix-6point1.patch | 62 |
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, |