Commit 6e69c4801a for ffmpeg
commit 6e69c4801a3ff2f1439ea2528fe98953334a5621
Author: Ramiro Polla <ramiro.polla@gmail.com>
Date: Thu Oct 29 18:13:35 2026 +0100
swscale/output: add YAF32 output support
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Ramiro Polla <ramiro.polla@gmail.com>
diff --git a/libswscale/format.c b/libswscale/format.c
index 447f11a894..c3d3a88968 100644
--- a/libswscale/format.c
+++ b/libswscale/format.c
@@ -232,8 +232,8 @@ static const LegacyFormatEntry legacy_format_entries[] = {
[AV_PIX_FMT_GRAYF32BE] = { 1, 1 },
[AV_PIX_FMT_GRAYF16LE] = { 1, 0 },
[AV_PIX_FMT_GRAYF16BE] = { 1, 0 },
- [AV_PIX_FMT_YAF32LE] = { 1, 0 },
- [AV_PIX_FMT_YAF32BE] = { 1, 0 },
+ [AV_PIX_FMT_YAF32LE] = { 1, 1 },
+ [AV_PIX_FMT_YAF32BE] = { 1, 1 },
[AV_PIX_FMT_YAF16LE] = { 1, 0 },
[AV_PIX_FMT_YAF16BE] = { 1, 0 },
[AV_PIX_FMT_YUVA422P12BE] = { 1, 1 },
diff --git a/libswscale/output.c b/libswscale/output.c
index 5cc5cf026d..b6ad322da0 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -250,7 +250,7 @@ yuv2plane1_float_bswap_c_template(const int32_t *src, uint32_t *dest, int dstW)
static av_always_inline void
yuv2planeX_float_c_template(const int16_t *filter, int filterSize, const int32_t **src,
- float *dest, int dstW)
+ float *dest, int dstW, ptrdiff_t stride)
{
static const int big_endian = HAVE_BIGENDIAN;
static const int shift = 15;
@@ -264,13 +264,13 @@ yuv2planeX_float_c_template(const int16_t *filter, int filterSize, const int32_t
val += src[j][i] * (unsigned)filter[j];
}
output_pixel(&val_uint, val, 0x8000, int);
- dest[i] = float_mult * (float)val_uint;
+ dest[i * stride] = float_mult * (float)val_uint;
}
}
static av_always_inline void
yuv2planeX_float_bswap_c_template(const int16_t *filter, int filterSize, const int32_t **src,
- uint32_t *dest, int dstW)
+ uint32_t *dest, int dstW, ptrdiff_t stride)
{
static const int big_endian = HAVE_BIGENDIAN;
static const int shift = 15;
@@ -284,7 +284,7 @@ yuv2planeX_float_bswap_c_template(const int16_t *filter, int filterSize, const i
val += src[j][i] * (unsigned)filter[j];
}
output_pixel(&val_uint, val, 0x8000, int);
- dest[i] = av_bswap32(av_float2int(float_mult * (float)val_uint));
+ dest[i * stride] = av_bswap32(av_float2int(float_mult * (float)val_uint));
}
}
@@ -300,7 +300,31 @@ static void yuv2planeX_float ## BE_LE ## _c(const int16_t *filter, int filterSiz
const int16_t **src, uint8_t *dest, int dstW, \
const uint8_t *dither, int offset) \
{ \
- template(filter, filterSize, (const int32_t **)src, (dest_type *)dest, dstW); \
+ template(filter, filterSize, (const int32_t **)src, (dest_type *)dest, dstW, 1); \
+}
+
+#define yuv2yaf32_X(template, dest_type, BE_LE, is_be) \
+static void yuv2yaf32 ## BE_LE ## _X_c(SwsInternal *c, const int16_t *lumFilter, \
+ const int16_t **lumSrc, int lumFilterSize, \
+ const int16_t *chrFilter, \
+ const int16_t **chrUSrc, \
+ const int16_t **chrVSrc, int chrFilterSize, \
+ const int16_t **alpSrc, uint8_t *dest, \
+ int dstW, int y) \
+{ \
+ dest_type *dst = (dest_type *) dest; \
+ template(lumFilter, lumFilterSize, (const int32_t **) lumSrc, dst, dstW, 2); \
+ if (alpSrc) { \
+ template(lumFilter, lumFilterSize, (const int32_t **) alpSrc, dst + 1, dstW, 2); \
+ } else { \
+ for (int i = 0; i < dstW; i++) { \
+ if (is_be) { \
+ AV_WB32(&dst[2 * i + 1], av_float2int(1.0f)); \
+ } else { \
+ AV_WL32(&dst[2 * i + 1], av_float2int(1.0f)); \
+ } \
+ } \
+ } \
}
#if HAVE_BIGENDIAN
@@ -308,11 +332,15 @@ yuv2plane1_float(yuv2plane1_float_c_template, float, BE)
yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, LE)
yuv2planeX_float(yuv2planeX_float_c_template, float, BE)
yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, LE)
+yuv2yaf32_X(yuv2planeX_float_c_template, float, be, 1)
+yuv2yaf32_X(yuv2planeX_float_bswap_c_template, uint32_t, le, 0)
#else
yuv2plane1_float(yuv2plane1_float_c_template, float, LE)
yuv2plane1_float(yuv2plane1_float_bswap_c_template, uint32_t, BE)
yuv2planeX_float(yuv2planeX_float_c_template, float, LE)
yuv2planeX_float(yuv2planeX_float_bswap_c_template, uint32_t, BE)
+yuv2yaf32_X(yuv2planeX_float_c_template, float, le, 0)
+yuv2yaf32_X(yuv2planeX_float_bswap_c_template, uint32_t, be, 1)
#endif
#undef output_pixel
@@ -3836,6 +3864,12 @@ av_cold void ff_sws_init_output_funcs(SwsInternal *c,
*yuv2packed2 = yuv2ya16be_2_c;
*yuv2packedX = yuv2ya16be_X_c;
break;
+ case AV_PIX_FMT_YAF32LE:
+ *yuv2packedX = yuv2yaf32le_X_c;
+ break;
+ case AV_PIX_FMT_YAF32BE:
+ *yuv2packedX = yuv2yaf32be_X_c;
+ break;
case AV_PIX_FMT_V30XLE:
*yuv2packedX = yuv2v30xle_X_c;
break;
diff --git a/tests/ref/fate/filter-pixdesc-yaf32be b/tests/ref/fate/filter-pixdesc-yaf32be
new file mode 100644
index 0000000000..310f352e98
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yaf32be
@@ -0,0 +1 @@
+pixdesc-yaf32be 52967c7979f408430ea08da36adf51e9
diff --git a/tests/ref/fate/filter-pixdesc-yaf32le b/tests/ref/fate/filter-pixdesc-yaf32le
new file mode 100644
index 0000000000..731f569e2b
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-yaf32le
@@ -0,0 +1 @@
+pixdesc-yaf32le afe5b813bca1972266f6f3023b71f892
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index 25e8a6c586..28e1102c94 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -125,6 +125,8 @@ y216le 0e99aeddfee304e72d525d72998d9e9b
ya16be c7a868787e0f3d487dbc8af804d15d81
ya16le a5299b6c9cb1b5b1f5fb62546b9c6c4e
ya8 dbb99fbcdc204aaa1a7397ff561f1a67
+yaf32be 0d7f48b22abca63936637d8e22985299
+yaf32le decb6e2e85575573608c503af244df57
yuv410p 5d4d992a7728431aa4e0700f87fb7fd8
yuv411p 7e1300e89f5bc07939e2c4a6acbdf267
yuv420p a014c7eb7a8385d1dd092b7a583f1bff
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index 53b74ffbfb..55c6dbf185 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -119,6 +119,8 @@ xyz12le 122fb7eea3575b4edbbd83219bc7af91
ya16be e2b490dc18f6ca3814fe9d68193ba263
ya16le 33b0e26f3c2e89c651345970474f6703
ya8 51a8dd297e35d40b06d3ebe8f4717895
+yaf32be 9294ff8cc89b6dda482b931286fb7c05
+yaf32le 6ebf9e1338a6de1d9a553c38a85da251
yuv410p 3bb6c7b64f2c46bc5e8b77198ce4ea58
yuv411p 693e4afe96998e6dd91734037d75d887
yuv420p 510d36163e4d3710988c23c2240ca6dc
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index 9f30c63648..f783d04ef5 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -125,6 +125,8 @@ y216le e65b5bfae1b40edbbed2012e9cd45e31
ya16be 466e6864b69dc93be890d32e021f4ab1
ya16le bd151aacfa82c803983e5c7bdc23b58b
ya8 28cea4f98ed452bd3da9c752e5e3399c
+yaf32be 3e440e683f461143e924b666d86f3d1c
+yaf32le 6d69152d5a1dd44f7943e0126e08b85a
yuv410p a85920d6bd26f51306e2ecbe71d1c554
yuv411p 9106e283d5dbcfba01c611886d58871a
yuv420p 9ea8ed3c22c31c0354b7face540bb280
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index 2245eebc9e..68c230eb43 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -114,6 +114,8 @@ y216le 360cb98ac80b13d3a8ec61c9f1ff3bac
ya16be 9462d3dded4802b9d9f96e8a40709067
ya16le f7eefa08ae0bfa77baf48c7064f59c13
ya8 055ac5ab5ff8533dd319edc17a398af1
+yaf32be 64c009faa0df2a44a5db191a1c5ae2b9
+yaf32le 55adc32f0c975d444c508a3b7ffbf179
yuv411p e4a040e0e786c4dae07d9d3f90a54905
yuv422p 16ce67249c6ce7ef57a433646ad6dfc1
yuv422p10be 62ae323dcc41aabf8ff6ecc53b119ce8
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index cfa86f776c..76b21757e2 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -119,6 +119,8 @@ xyz12le a8273fe17f2a738f3fd7f457de5c1df4
ya16be e7665e62e476df4eb143420e57cc9ec2
ya16le 3a23b71db418b74e1cc304d7cd3e1989
ya8 4ad5920716de3d2fbbc49f95adb60345
+yaf32be a0fd0741821b0734a6ecbcc989127e40
+yaf32le 3832240b5772affc0c04189200c35dd4
yuv410p c49fd0c55c41185b1580aac77211992b
yuv411p c416371077dce13d31bf1dc706111ae7
yuv420p eb8d9f02db98e10400781428c43e9438
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index dde63f7dd6..b3824c3ac1 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -124,6 +124,8 @@ y216le 9e44c6d76b09bcbe71738423b4b3d67a
ya16be d08393d66f14fb1e31a9e9cbcb3df664
ya16le 372426fb917ea93365d775c3d1ef491a
ya8 a38d6e288f582f1a04310232ed764afc
+yaf32be 011351dda00897c16b407c96a1007f30
+yaf32le 47e7b8e817394855721e2397c9967c8c
yuv410p dea1ab8843465adf5b8240b2d98fd85b
yuv411p 8bf73777a5ff43c126be274245aceff1
yuv420p f1f4e7e94a76d5320049464bdeac24ed
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index 25e8a6c586..28e1102c94 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -125,6 +125,8 @@ y216le 0e99aeddfee304e72d525d72998d9e9b
ya16be c7a868787e0f3d487dbc8af804d15d81
ya16le a5299b6c9cb1b5b1f5fb62546b9c6c4e
ya8 dbb99fbcdc204aaa1a7397ff561f1a67
+yaf32be 0d7f48b22abca63936637d8e22985299
+yaf32le decb6e2e85575573608c503af244df57
yuv410p 5d4d992a7728431aa4e0700f87fb7fd8
yuv411p 7e1300e89f5bc07939e2c4a6acbdf267
yuv420p a014c7eb7a8385d1dd092b7a583f1bff
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index d6ea9496d3..c8a3cff578 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -125,6 +125,8 @@ y216le 17be2999e97d36b8ed903f07ef428c09
ya16be 2c473f0f4c9330c1ed61bcc80ee11022
ya16le 76d4ff84d1014db24397f936dad9d0fa
ya8 0a9db5bb4b009de9197eede5e9d19e16
+yaf32be e3aad2e56b46ac9ecb7cdb76de8bd954
+yaf32le 7ece90b90ad6e132421a9feea6273a3e
yuv410p e8f49b5fb9335b62c074f7f8bb0234fc
yuv411p 5af32557c93beb482e26e7af693104c6
yuv420p 5d3ac239c3712143560b1dfbd48a7ddd
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index e4f8784178..f492c2c3ba 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -109,6 +109,8 @@ xyz12le 77912a89e6525f6809d8c31fed87a439
ya16be 9bb39f9567d807be0fb8631dcfa8d5f8
ya16le b13453818b83c8dc2610975095393ac1
ya8 d4b7a62f80681fa44c977ff3a64f4ce4
+yaf32be b8e5b5fdfc7cbc60f47d93a34d4277b0
+yaf32le c1905efebcef8574bdf883bceb158434
yuv410p 4c0143429edd30aa01493447c90132ea
yuv420p 2fa5b2201c75034206cc20e2c6134aed
yuv420p10be 0931660f930d9be8aea9d0c76b406055
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index 8e6ea439b4..d5ca454c85 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -125,6 +125,8 @@ y216le 985db498aedf3fb1c547ad07442b7258
ya16be 633230e223ca00e8398e46514d35422d
ya16le 9bee2882baafbfeba9adb8787c61f2f4
ya8 4299c6ca3b470a7d8a420e26eb485b1d
+yaf32be 24987299dc2a16dd391d7d48b94c3d64
+yaf32le 09b87da5eeaeabc36bdbcd49955cc05f
yuv410p c7adfe96c8e043a6cb9290c39bf8063c
yuv411p 3fce29db403a25f81be39e01aaf6ff3a
yuv420p d64fae96fac22aefa8fbcf45a09f37c1