diff mbox series

[FFmpeg-devel,v2,2/2] libswscale: add output support for AV_PIX_FMT_GBRAPF32

Message ID 20200503231004.47636-3-mindmark@gmail.com
State Accepted
Headers show
Series initial input/output support for AV_PIX_FMT_GBRAPF32 | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Mark Reid May 3, 2020, 11:10 p.m. UTC
From: Mark Reid <mindmark@gmail.com>

---
 libswscale/output.c                      | 82 ++++++++++++++++++++++++
 libswscale/slice.c                       | 28 ++++----
 libswscale/swscale.c                     |  5 ++
 libswscale/swscale_internal.h            | 36 +++++++++++
 libswscale/swscale_unscaled.c            | 33 ++++++++++
 libswscale/utils.c                       |  8 +--
 tests/ref/fate/filter-pixdesc-gbrapf32be |  1 +
 tests/ref/fate/filter-pixdesc-gbrapf32le |  1 +
 tests/ref/fate/filter-pixdesc-gbrpf32be  |  1 +
 tests/ref/fate/filter-pixdesc-gbrpf32le  |  1 +
 tests/ref/fate/filter-pixfmts-copy       |  4 ++
 tests/ref/fate/filter-pixfmts-crop       |  4 ++
 tests/ref/fate/filter-pixfmts-field      |  4 ++
 tests/ref/fate/filter-pixfmts-fieldorder |  4 ++
 tests/ref/fate/filter-pixfmts-hflip      |  4 ++
 tests/ref/fate/filter-pixfmts-il         |  4 ++
 tests/ref/fate/filter-pixfmts-null       |  4 ++
 tests/ref/fate/filter-pixfmts-scale      |  4 ++
 tests/ref/fate/filter-pixfmts-transpose  |  4 ++
 tests/ref/fate/filter-pixfmts-vflip      |  4 ++
 20 files changed, 221 insertions(+), 15 deletions(-)
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrapf32be
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrapf32le
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrpf32be
 create mode 100644 tests/ref/fate/filter-pixdesc-gbrpf32le
diff mbox series

Patch

diff --git a/libswscale/output.c b/libswscale/output.c
index 68f43ffba3..e864e515d0 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -2312,6 +2312,82 @@  yuv2gbrp16_full_X_c(SwsContext *c, const int16_t *lumFilter,
     }
 }
 
+static void
+yuv2gbrpf32_full_X_c(SwsContext *c, const int16_t *lumFilter,
+                    const int16_t **lumSrcx, int lumFilterSize,
+                    const int16_t *chrFilter, const int16_t **chrUSrcx,
+                    const int16_t **chrVSrcx, int chrFilterSize,
+                    const int16_t **alpSrcx, uint8_t **dest,
+                    int dstW, int y)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(c->dstFormat);
+    int i;
+    int hasAlpha = (desc->flags & AV_PIX_FMT_FLAG_ALPHA) && alpSrcx;
+    uint32_t **dest32 = (uint32_t**)dest;
+    const int32_t **lumSrc  = (const int32_t**)lumSrcx;
+    const int32_t **chrUSrc = (const int32_t**)chrUSrcx;
+    const int32_t **chrVSrc = (const int32_t**)chrVSrcx;
+    const int32_t **alpSrc  = (const int32_t**)alpSrcx;
+    static const float float_mult = 1.0f / 65535.0f;
+
+    for (i = 0; i < dstW; i++) {
+        int j;
+        int Y = -0x40000000;
+        int U = -(128 << 23);
+        int V = -(128 << 23);
+        int R, G, B, A;
+
+        for (j = 0; j < lumFilterSize; j++)
+            Y += lumSrc[j][i] * (unsigned)lumFilter[j];
+
+        for (j = 0; j < chrFilterSize; j++) {
+            U += chrUSrc[j][i] * (unsigned)chrFilter[j];
+            V += chrVSrc[j][i] * (unsigned)chrFilter[j];
+        }
+
+        Y >>= 14;
+        Y += 0x10000;
+        U >>= 14;
+        V >>= 14;
+
+        if (hasAlpha) {
+            A = -0x40000000;
+
+            for (j = 0; j < lumFilterSize; j++)
+                A += alpSrc[j][i] * (unsigned)lumFilter[j];
+
+            A >>= 1;
+            A += 0x20002000;
+        }
+
+        Y -= c->yuv2rgb_y_offset;
+        Y *= c->yuv2rgb_y_coeff;
+        Y += 1 << 13;
+        R = V * c->yuv2rgb_v2r_coeff;
+        G = V * c->yuv2rgb_v2g_coeff + U * c->yuv2rgb_u2g_coeff;
+        B =                            U * c->yuv2rgb_u2b_coeff;
+
+        R = av_clip_uintp2(Y + R, 30);
+        G = av_clip_uintp2(Y + G, 30);
+        B = av_clip_uintp2(Y + B, 30);
+
+        dest32[0][i] = av_float2int(float_mult * (float)(G >> 14));
+        dest32[1][i] = av_float2int(float_mult * (float)(B >> 14));
+        dest32[2][i] = av_float2int(float_mult * (float)(R >> 14));
+        if (hasAlpha)
+            dest32[3][i] = av_float2int(float_mult * (float)(av_clip_uintp2(A, 30) >> 14));
+    }
+    if ((!isBE(c->dstFormat)) != (!HAVE_BIGENDIAN)) {
+        for (i = 0; i < dstW; i++) {
+            dest32[0][i] = av_bswap32(dest32[0][i]);
+            dest32[1][i] = av_bswap32(dest32[1][i]);
+            dest32[2][i] = av_bswap32(dest32[2][i]);
+            if (hasAlpha)
+                dest32[3][i] = av_bswap32(dest32[3][i]);
+        }
+    }
+}
+
 static void
 yuv2ya8_1_c(SwsContext *c, const int16_t *buf0,
             const int16_t *ubuf[2], const int16_t *vbuf[2],
@@ -2716,6 +2792,12 @@  av_cold void ff_sws_init_output_funcs(SwsContext *c,
         case AV_PIX_FMT_GBRAP16LE:
             *yuv2anyX = yuv2gbrp16_full_X_c;
             break;
+        case AV_PIX_FMT_GBRPF32BE:
+        case AV_PIX_FMT_GBRPF32LE:
+        case AV_PIX_FMT_GBRAPF32BE:
+        case AV_PIX_FMT_GBRAPF32LE:
+            *yuv2anyX = yuv2gbrpf32_full_X_c;
+            break;
         }
         if (!*yuv2packedX && !*yuv2anyX)
             goto YUV_PACKED;
diff --git a/libswscale/slice.c b/libswscale/slice.c
index db4fa874ff..7849b70f4d 100644
--- a/libswscale/slice.c
+++ b/libswscale/slice.c
@@ -189,23 +189,26 @@  int ff_init_slice_from_src(SwsSlice * s, uint8_t *src[4], int stride[4], int src
     return 0;
 }
 
-static void fill_ones(SwsSlice *s, int n, int is16bit)
+static void fill_ones(SwsSlice *s, int n, int bpc)
 {
-    int i;
+    int i, j, k, size, end;
+
     for (i = 0; i < 4; ++i) {
-        int j;
-        int size = s->plane[i].available_lines;
+        size = s->plane[i].available_lines;
         for (j = 0; j < size; ++j) {
-            int k;
-            int end = is16bit ? n>>1: n;
-            // fill also one extra element
-            end += 1;
-            if (is16bit)
+            if (bpc == 16) {
+                end = (n>>1) + 1;
                 for (k = 0; k < end; ++k)
                     ((int32_t*)(s->plane[i].line[j]))[k] = 1<<18;
-            else
+            } else if (bpc == 32) {
+                end = (n>>2) + 1;
+                for (k = 0; k < end; ++k)
+                    ((int64_t*)(s->plane[i].line[j]))[k] = 1LL<<34;
+            } else {
+                end = n + 1;
                 for (k = 0; k < end; ++k)
                     ((int16_t*)(s->plane[i].line[j]))[k] = 1<<14;
+            }
         }
     }
 }
@@ -272,6 +275,9 @@  int ff_init_filters(SwsContext * c)
     if (c->dstBpc == 16)
         dst_stride <<= 1;
 
+    if (c->dstBpc == 32)
+        dst_stride <<= 2;
+
     num_ydesc = need_lum_conv ? 2 : 1;
     num_cdesc = need_chr_conv ? 2 : 1;
 
@@ -302,7 +308,7 @@  int ff_init_filters(SwsContext * c)
     res = alloc_lines(&c->slice[i], dst_stride, c->dstW);
     if (res < 0) goto cleanup;
 
-    fill_ones(&c->slice[i], dst_stride>>1, c->dstBpc == 16);
+    fill_ones(&c->slice[i], dst_stride>>1, c->dstBpc);
 
     // vertical scaler output
     ++i;
diff --git a/libswscale/swscale.c b/libswscale/swscale.c
index 001cfbf15b..9cb7e8f6ac 100644
--- a/libswscale/swscale.c
+++ b/libswscale/swscale.c
@@ -500,6 +500,11 @@  static int swscale(SwsContext *c, const uint8_t *src[],
             fillPlane16(dst[3], dstStride[3], length, height, lastDstY,
                     1, desc->comp[3].depth,
                     isBE(dstFormat));
+        } else if (is32BPS(dstFormat)) {
+            const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(dstFormat);
+            fillPlane32(dst[3], dstStride[3], length, height, lastDstY,
+                    1, desc->comp[3].depth,
+                    isBE(dstFormat), desc->flags & AV_PIX_FMT_FLAG_FLOAT);
         } else
             fillPlane(dst[3], dstStride[3], length, height, lastDstY, 255);
     }
diff --git a/libswscale/swscale_internal.h b/libswscale/swscale_internal.h
index 9dda53eead..ee46092ff6 100644
--- a/libswscale/swscale_internal.h
+++ b/libswscale/swscale_internal.h
@@ -647,6 +647,13 @@  static av_always_inline int is16BPS(enum AVPixelFormat pix_fmt)
     return desc->comp[0].depth == 16;
 }
 
+static av_always_inline int is32BPS(enum AVPixelFormat pix_fmt)
+{
+    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
+    av_assert0(desc);
+    return desc->comp[0].depth == 32;
+}
+
 static av_always_inline int isNBPS(enum AVPixelFormat pix_fmt)
 {
     const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
@@ -918,8 +925,37 @@  static inline void fillPlane16(uint8_t *plane, int stride, int width, int height
         }
         ptr += stride;
     }
+#undef FILL
 }
 
+static inline void fillPlane32(uint8_t *plane, int stride, int width, int height, int y,
+                               int alpha, int bits, const int big_endian, int is_float)
+{
+    int i, j;
+    uint8_t *ptr = plane + stride * y;
+    uint32_t v;
+    uint32_t onef32 = 0x3f800000;
+    if (is_float)
+        v = alpha ? onef32 : 0;
+    else
+        v = alpha ? 0xFFFFFFFF>>(32-bits) : (1<<(bits-1));
+
+    for (i = 0; i < height; i++) {
+#define FILL(wfunc) \
+        for (j = 0; j < width; j++) {\
+            wfunc(ptr+4*j, v);\
+        }
+        if (big_endian) {
+            FILL(AV_WB32);
+        } else {
+            FILL(AV_WL32);
+        }
+        ptr += stride;
+    }
+#undef FILL
+}
+
+
 #define MAX_SLICE_PLANES 4
 
 /// Slice plane
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 67440cdb4a..5fb572b51a 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -491,6 +491,34 @@  static int bswap_16bpc(SwsContext *c, const uint8_t *src[],
     return srcSliceH;
 }
 
+static int bswap_32bpc(SwsContext *c, const uint8_t *src[],
+                              int srcStride[], int srcSliceY, int srcSliceH,
+                              uint8_t *dst[], int dstStride[])
+{
+    int i, j, p;
+
+    for (p = 0; p < 4; p++) {
+        int srcstr = srcStride[p] / 4;
+        int dststr = dstStride[p] / 4;
+        uint32_t       *dstPtr =       (uint32_t *) dst[p];
+        const uint32_t *srcPtr = (const uint32_t *) src[p];
+        int min_stride         = FFMIN(FFABS(srcstr), FFABS(dststr));
+        if(!dstPtr || !srcPtr)
+            continue;
+        dstPtr += (srcSliceY >> c->chrDstVSubSample) * dststr;
+        for (i = 0; i < (srcSliceH >> c->chrDstVSubSample); i++) {
+            for (j = 0; j < min_stride; j++) {
+                dstPtr[j] = av_bswap32(srcPtr[j]);
+            }
+            srcPtr += srcstr;
+            dstPtr += dststr;
+        }
+    }
+
+    return srcSliceH;
+}
+
+
 static int palToRgbWrapper(SwsContext *c, const uint8_t *src[], int srcStride[],
                            int srcSliceY, int srcSliceH, uint8_t *dst[],
                            int dstStride[])
@@ -2077,6 +2105,11 @@  void ff_get_unscaled_swscale(SwsContext *c)
         IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_YUV444P16))
         c->swscale = bswap_16bpc;
 
+    /* bswap 32 bits per pixel/component formats */
+    if (IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRPF32) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAPF32))
+        c->swscale = bswap_32bpc;
+
     if (usePal(srcFormat) && isByteRGB(dstFormat))
         c->swscale = palToRgbWrapper;
 
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 193efdd881..15c0a19afa 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -236,10 +236,10 @@  static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_GBRP14BE]    = { 1, 1 },
     [AV_PIX_FMT_GBRP16LE]    = { 1, 1 },
     [AV_PIX_FMT_GBRP16BE]    = { 1, 1 },
-    [AV_PIX_FMT_GBRPF32LE]   = { 1, 0 },
-    [AV_PIX_FMT_GBRPF32BE]   = { 1, 0 },
-    [AV_PIX_FMT_GBRAPF32LE]  = { 1, 0 },
-    [AV_PIX_FMT_GBRAPF32BE]  = { 1, 0 },
+    [AV_PIX_FMT_GBRPF32LE]   = { 1, 1 },
+    [AV_PIX_FMT_GBRPF32BE]   = { 1, 1 },
+    [AV_PIX_FMT_GBRAPF32LE]  = { 1, 1 },
+    [AV_PIX_FMT_GBRAPF32BE]  = { 1, 1 },
     [AV_PIX_FMT_GBRAP]       = { 1, 1 },
     [AV_PIX_FMT_GBRAP16LE]   = { 1, 1 },
     [AV_PIX_FMT_GBRAP16BE]   = { 1, 1 },
diff --git a/tests/ref/fate/filter-pixdesc-gbrapf32be b/tests/ref/fate/filter-pixdesc-gbrapf32be
new file mode 100644
index 0000000000..97d613ad09
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrapf32be
@@ -0,0 +1 @@ 
+pixdesc-gbrapf32be  a4fd00f17d746849f30597c496923107
diff --git a/tests/ref/fate/filter-pixdesc-gbrapf32le b/tests/ref/fate/filter-pixdesc-gbrapf32le
new file mode 100644
index 0000000000..ef59306625
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrapf32le
@@ -0,0 +1 @@ 
+pixdesc-gbrapf32le  26af38a6975e2ce425e9fec477e6b2ba
diff --git a/tests/ref/fate/filter-pixdesc-gbrpf32be b/tests/ref/fate/filter-pixdesc-gbrpf32be
new file mode 100644
index 0000000000..71033771c1
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrpf32be
@@ -0,0 +1 @@ 
+pixdesc-gbrpf32be   3ee0b82f5aaea48ca3c01f4294505d73
diff --git a/tests/ref/fate/filter-pixdesc-gbrpf32le b/tests/ref/fate/filter-pixdesc-gbrpf32le
new file mode 100644
index 0000000000..1715415999
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-gbrpf32le
@@ -0,0 +1 @@ 
+pixdesc-gbrpf32le   0e6b20215ac9b475e917c7bb4cbee349
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index d19314bae9..45fe1be21a 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -25,6 +25,8 @@  gbrap12be           0c4c1f8af361571265ca259d5f70f026
 gbrap12le           5f1d8c663d4c28863e687192433b34a4
 gbrap16be           e4edca4361d643794034e5aa9ef290b1
 gbrap16le           9a95b389d2bf556179e8f4b27fb550ab
+gbrapf32be          d908f0950d3735863fe6f0793fa24f76
+gbrapf32le          f6eab5a145cffc52c055e07c26d3995f
 gbrp                5fbc319e30110d19d539f5b274eddb6d
 gbrp10be            703a17591a2a5c236675c5101c349bcc
 gbrp10le            ee014153f55c011918df5b2394815780
@@ -36,6 +38,8 @@  gbrp16be            7b6764a504c853b09f5c7d0b2223c5a4
 gbrp16le            fb9323a5bd060282bec7bfd7d38dc230
 gbrp9be             a4dc6f6f9bb051de2dc348b592ad4282
 gbrp9le             699da3a3b324f3fd001a56aee9683384
+gbrpf32be           ae33c2d738af01ae66a5d2b08a7a60b7
+gbrpf32le           4e3305c619337beeeacc5e6b2f42c793
 gray                188590b1231afd231ea910815aef2b25
 gray10be            d486558ecd2e27afc17930be861f0e4c
 gray10le            917d687103b2adcca7132bfc070ca54a
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index ab89d06142..430e90e195 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -25,6 +25,8 @@  gbrap12be           c9769d18733cdc2664d8b9af09a03f6d
 gbrap12le           3f80453c1ac6c5d1b2febf3ef141b476
 gbrap16be           21c98d0d7e7de2a93f9f095e5bb5c227
 gbrap16le           ea9a96870c1b742dd9f065c5db568184
+gbrapf32be          ec06b3b168dc74048100f29a4412da90
+gbrapf32le          57ee44f9ca41e7b5e6410cdd105442d6
 gbrp                ec671f573c2105072ab68a1933c58fee
 gbrp10be            6f0130a41f01e58593d3840446dd94b7
 gbrp10le            9c152b7dfb7ad7bc477518d97316d04f
@@ -36,6 +38,8 @@  gbrp16be            59e4c27ee33520e23dbceafbec27aa9b
 gbrp16le            0768a2462783829f63ed0bfd53d01222
 gbrp9be             4af43999e5e9742992b6550ea5ad9b23
 gbrp9le             b4cbfa7878706a14295f09212e41f7fe
+gbrpf32be           4f06588a3de6ed0f30436f814eda0909
+gbrpf32le           b2a9df783d8c2156c5aafc561989918d
 gray                0d70b54b4b888ec4dbd89713620ac1ee
 gray10be            18ed76cab145ab9058cc353fcec6d3c4
 gray10le            fd83f7489880160783ddb125615b4638
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index 994026dd7c..b5f7013afd 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -25,6 +25,8 @@  gbrap12be           e7f471132628b1c034199cc109b84bc2
 gbrap12le           886207e5aa379a0312485b94e5fd5edd
 gbrap16be           eaa0158f27ebc40cde9e3d6eef1e2ba1
 gbrap16le           6cf68992d4fcac2aa025d1014b669d24
+gbrapf32be          37c627796dee55ca6f4e7ca965460680
+gbrapf32le          3ff02eb8465b921c09182ec5cfda434a
 gbrp                838025a3062f7f31e99196ce66961ad7
 gbrp10be            f63c2555ea19fc78b00fd5b3e2b48e8c
 gbrp10le            be64c374ab318235d912372e99a0516a
@@ -36,6 +38,8 @@  gbrp16be            020eff1626415ea726c55b23162ce59a
 gbrp16le            0ab77b498d4a39905515b6e1f0329ed2
 gbrp9be             170da3a8644cbea61c3caeadc45354c5
 gbrp9le             da5d80e6f12cabaa7081bb85d3b7fd30
+gbrpf32be           cd5b0edd510652a0bcfd7e36935e3cb0
+gbrpf32le           9d42fc5331376b5307268498a06613ce
 gray                57fd8e6e00f6be8752726005974cce1b
 gray10be            437713f3d081238cddb738e106e5a27d
 gray10le            c749b80049b152f4ba3e66a72c0c5acc
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index 3d3eef3f3e..dfc464ff80 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -25,6 +25,8 @@  gbrap12be           302b353dff696ec9fd0d85a0cc14802b
 gbrap12le           ae2d6db2c9c825f06d92389de21263d2
 gbrap16be           52c10d8046d123dfc4a478276906467c
 gbrap16le           2317737b8f5140add27d121de8f5ba95
+gbrapf32be          6781751ef9d444d150cb0a1e1cefe141
+gbrapf32le          f2ffc9e45dbc9919d516304abb514306
 gbrp                506dea2fe492e985a396d1b11ccd8db3
 gbrp10be            55bbfe2d472780dcbadf3027778caa0e
 gbrp10le            13a39077ab1b2c3b49afd3e250b84a77
@@ -36,6 +38,8 @@  gbrp16be            f82e4bda468275f51becf70f3880be52
 gbrp16le            c7813a905f94aabb2bcade79c9b7e39e
 gbrp9be             b8d294d4bc81ceef1fb529e917c02e48
 gbrp9le             0d42cc9e222d806c33172781b45cb3e3
+gbrpf32be           cef1384ac5c95cf4b3ea2e49133dbef0
+gbrpf32le           c053b8bf8314196099b1e2e1d0617b75
 gray                d96e0f1c73d3f0b9506d691b5cd36c73
 gray10be            c26c73de96b630f1207ff589b6553ebd
 gray10le            16e4db1d611ec3fa5c9fd8fbdbf1ffcc
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index 87120747c7..8b8c659fc8 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -25,6 +25,8 @@  gbrap12be           ffe9aa4cbcc42f71757efe18826764ac
 gbrap12le           88a85c1b3c5e19e299fdd209b73ac1ba
 gbrap16be           3117e84b258433a7efb9288bbb8815d4
 gbrap16le           3ad08cf8b49d8eb31a1b356ec4b7b88b
+gbrapf32be          d82e48eb62c1e2d2ce5d614aeda38a99
+gbrapf32le          323259d76d5c5350091704813f22bf57
 gbrp                0ecfeca171ba3a1a2ff4e92f572b71cf
 gbrp10be            774398c2f81757a536c094f16cfc541a
 gbrp10le            e9a6434d691be541f789f850963da181
@@ -36,6 +38,8 @@  gbrp16be            46cf9473646a4b9dbcb05661ade658ec
 gbrp16le            6ce6093b24d09c0edcd55b2d6fec89a0
 gbrp9be             174de037c2a9f2b6fb4d9444ae0ff82f
 gbrp9le             ba7c2631fb2967aa909c66509bd243fe
+gbrpf32be           a53fc24a298bf419051fb57c63cc4cef
+gbrpf32le           b44dae0881043398bfd704a944094737
 gray                8bd4ece1dbf89b20ee785e0515356e07
 gray10be            160dd03e30d33379de92c70ee52c01fd
 gray10le            6baac1da6be3789409b67cd506afe7da
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index 7f1c339de4..1c7e94643b 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -25,6 +25,8 @@  gbrap12be           48609d6b61ff6313939fa2d9c3ebb6d9
 gbrap12le           e3b5342c8e47820f2de7e2dd61872312
 gbrap16be           696c84c8b009c7320cad7f3847bb35da
 gbrap16le           9bacb81fbbe9cdfd04d71eb55a9719d2
+gbrapf32be          5995aba2bf66254f63d5413cd9860353
+gbrapf32le          aab9c11ec483fe28f7156bfeb9f015a3
 gbrp                dc06edb62e70024a216c8e303b79b328
 gbrp10be            321e7f061d8b9b5801221b6cf3c99666
 gbrp10le            799ed3afca01076439a0b6785b3dc4bb
@@ -36,6 +38,8 @@  gbrp16be            c8c95027703c680ed8f8f91c725db40a
 gbrp16le            c95c9d7c2b19826b73ff1811d9fe6bdb
 gbrp9be             f029d87fa642f4261160471ad27fd53f
 gbrp9le             b310d3cf37f7b41d706155993f8f0584
+gbrpf32be           83722ee41b4397e19bb075ab305147b5
+gbrpf32le           82210a8f9e8708968fa13cf8cf64afe4
 gray                52ae18648161ac43144f5c9cd2127786
 gray10be            8400dec0eefb172849b785d35fc55674
 gray10le            b7d6e49e8d1291f2b0a57d55e9478ef1
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index d19314bae9..45fe1be21a 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -25,6 +25,8 @@  gbrap12be           0c4c1f8af361571265ca259d5f70f026
 gbrap12le           5f1d8c663d4c28863e687192433b34a4
 gbrap16be           e4edca4361d643794034e5aa9ef290b1
 gbrap16le           9a95b389d2bf556179e8f4b27fb550ab
+gbrapf32be          d908f0950d3735863fe6f0793fa24f76
+gbrapf32le          f6eab5a145cffc52c055e07c26d3995f
 gbrp                5fbc319e30110d19d539f5b274eddb6d
 gbrp10be            703a17591a2a5c236675c5101c349bcc
 gbrp10le            ee014153f55c011918df5b2394815780
@@ -36,6 +38,8 @@  gbrp16be            7b6764a504c853b09f5c7d0b2223c5a4
 gbrp16le            fb9323a5bd060282bec7bfd7d38dc230
 gbrp9be             a4dc6f6f9bb051de2dc348b592ad4282
 gbrp9le             699da3a3b324f3fd001a56aee9683384
+gbrpf32be           ae33c2d738af01ae66a5d2b08a7a60b7
+gbrpf32le           4e3305c619337beeeacc5e6b2f42c793
 gray                188590b1231afd231ea910815aef2b25
 gray10be            d486558ecd2e27afc17930be861f0e4c
 gray10le            917d687103b2adcca7132bfc070ca54a
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 89d3f58eb6..1e5c7db3d4 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -25,6 +25,8 @@  gbrap12be           1d9b57766ba9c2192403f43967cb9af0
 gbrap12le           bb1ba1c157717db3dd612a76d38a018e
 gbrap16be           c72b935a6e57a8e1c37bff08c2db55b1
 gbrap16le           13eb0e62b1ac9c1c86c81521eaefab5f
+gbrapf32be          42e53d9edccbd9e09c4cd78780ba92f3
+gbrapf32le          eebf3973ef94c841f0a1ceb1ed61621d
 gbrp                dc3387f925f972c61aae7eb23cdc19f0
 gbrp10be            0277d4c3a8498d75e2783fb81379e481
 gbrp10le            f3d70f8ab845c3c9b8f7452e4a6e285a
@@ -36,6 +38,8 @@  gbrp16be            5fc826cfabebfc1442cb793c4b6303e2
 gbrp16le            1b3e0b63d47a3e1b6b20931316883bf2
 gbrp9be             d9c88968001e1452ff31fbc8d16b18a0
 gbrp9le             2ccfed0816bf6bd4bb3a5b7591d9603a
+gbrpf32be           4614d32e4417f80e0adcc1bdcf6cde42
+gbrpf32le           1366ee77e5559672260bbe51040e28b2
 gray                221201cc7cfc4964eacd8b3e426fd276
 gray10be            9452756d0b37f4f5c7cae7635e22d747
 gray10le            37fd2e1ec6b66410212d39a342e864df
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index e4a170f722..e194c335cf 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -25,6 +25,8 @@  gbrap12be           1518c9a565d1ba1a45dd369acc1aa75e
 gbrap12le           714fe318af81a46f83655c6e7e13351e
 gbrap16be           39d488528aacff466aac7539c9b948a8
 gbrap16le           5426ac9457289927bfe2ec03038a8780
+gbrapf32be          ea02b3912372c8671ff4eacbcbda740a
+gbrapf32le          3021d477bdbeba4e2ae7a6bc6cff33e5
 gbrp                7b4b6a2f1cdc51455b25515c3ecea944
 gbrp10be            d7401725699b2ddf954caa16a0878a1e
 gbrp10le            6036711969eae1979be6358f688bd9c8
@@ -36,6 +38,8 @@  gbrp16be            0d003b88d4f446ae9ba12cab1cbb359a
 gbrp16le            a1c09038fa4636c9843ab8dd2b7601ea
 gbrp9be             df381b4b27be25d172fa556434478807
 gbrp9le             a5301e978f68b29bfc613b2462ec4888
+gbrpf32be           b90d6189e71afd6ec1f379489884cc8e
+gbrpf32le           48dee2c9cee8ac6582492fd1c7acb183
 gray                c5f8bc6636fd15dbc57deb4bba1e7379
 gray10be            48b421da79c195fd91dffb8fca79a8a2
 gray10le            7774e3296916b896afa46f626334a280
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index 2522c840f3..6d0f9eecc6 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -25,6 +25,8 @@  gbrap12be           16a3d105ba852a9fa23ea5232db51b48
 gbrap12le           6ef8a3ac4129ec23c34aec14ac41f249
 gbrap16be           70b020b6b9e1896b72f890de3570ffda
 gbrap16le           e0cf341cdbaf1f5c40016f181bc9d7d4
+gbrapf32be          e82323abcb665014346a3a34a4b084c3
+gbrapf32le          b24471278a899eb2f9cb563632d29b09
 gbrp                413b0f6ea51588d4be5f0c76d43d8796
 gbrp10be            d02bd50db83213667808f5bacefe667c
 gbrp10le            2d4a5ebc773ffc3d857a6ef24afbe10e
@@ -36,6 +38,8 @@  gbrp16be            3fef87fe67bf1fd0e2f5056dc0db2ef4
 gbrp16le            f3b2b76fe707f77eb1376640759f5168
 gbrp9be             99c694dd47d12ae48fc8f47a0c410333
 gbrp9le             26e103a4ab99fb3f58667df490997a36
+gbrpf32be           3eaa2d475754c2b4ae3c59dbdb7ccd84
+gbrpf32le           0267e215c3d11ae22414c3e29e665896
 gray                41811422d5819ed69389357294384c10
 gray10be            52710b3ab3ccf6101d28109f58cd48c4
 gray10le            9c432a163f0cfe9ee2a4b72ae8a7c307