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