Commit 8ba5dc011b for ffmpeg
commit 8ba5dc011b304781eade0a1ed057f1af80fceeb7
Author: Michael Niedermayer <michael@niedermayer.cc>
Date: Sat Oct 10 23:59:54 2026 +0200
avcodec/dcaenc: compute the LFE FIR table in double precision
0xffffff800000 is not representable as a float, so the float product
rounds differently with SSE arithmetic than under x87 excess precision
and the encoded LFE channel differed between x86-64 and x86-32. The
product is exact in double, which makes the table identical everywhere.
diff --git a/libavcodec/dcaenc.c b/libavcodec/dcaenc.c
index d06287b3f2..6862444431 100644
--- a/libavcodec/dcaenc.c
+++ b/libavcodec/dcaenc.c
@@ -306,8 +306,8 @@ static av_cold int encode_init(AVCodecContext *avctx)
for (k = 0; k < 32; k++) {
for (j = 0; j < 8; j++) {
- c->lfe_fir_64i[64 * j + k] = (int32_t)(0xffffff800000ULL * ff_dca_lfe_fir_64[8 * k + j]);
- c->lfe_fir_64i[64 * (7-j) + (63 - k)] = (int32_t)(0xffffff800000ULL * ff_dca_lfe_fir_64[8 * k + j]);
+ c->lfe_fir_64i[64 * j + k] = (int32_t)(0xffffff800000ULL * (double)ff_dca_lfe_fir_64[8 * k + j]);
+ c->lfe_fir_64i[64 * (7-j) + (63 - k)] = (int32_t)(0xffffff800000ULL * (double)ff_dca_lfe_fir_64[8 * k + j]);
}
}