Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support
@ 2022-11-21 22:11 mindmark
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support mindmark
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: mindmark @ 2022-11-21 22:11 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Mark Reid

From: Mark Reid <mindmark@gmail.com>

This patch series adds swscale input/output support for the packed rgb float formats.
A few of the filters also needed support the larger 96/128 bit packed pixel sizes.

I also plan to eventually add lossless unscaled conversions between the planer and packed formats.

changes since v3
* removed half uv path implementation
changes since v2
* add bias to rgbaf32 output to improve non overflowing range
changes since v1
* output correct alpha if src doesn't have alpha

Mark Reid (4):
  swscale/input: add rgbaf32 input support
  avfilter/vf_hflip: add support for packed rgb float formats
  avfilter/vf_transpose: add support for packed rgb float formats
  swscale/output: add rgbaf32 output support

 libavfilter/vf_hflip_init.h              |  25 +++++
 libavfilter/vf_transpose.c               |  44 +++++++++
 libswscale/input.c                       | 120 +++++++++++++++++++++++
 libswscale/output.c                      |  92 +++++++++++++++++
 libswscale/swscale_unscaled.c            |   4 +-
 libswscale/tests/floatimg_cmp.c          |   4 +-
 libswscale/utils.c                       |  14 ++-
 libswscale/yuv2rgb.c                     |   2 +
 tests/ref/fate/filter-pixdesc-rgbaf32be  |   1 +
 tests/ref/fate/filter-pixdesc-rgbaf32le  |   1 +
 tests/ref/fate/filter-pixdesc-rgbf32be   |   1 +
 tests/ref/fate/filter-pixdesc-rgbf32le   |   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 +
 tests/ref/fate/sws-floatimg-cmp          |  16 +++
 23 files changed, 361 insertions(+), 4 deletions(-)
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbaf32be
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbaf32le
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbf32be
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbf32le

--
2.31.1.windows.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support
  2022-11-21 22:11 [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support mindmark
@ 2022-11-21 22:11 ` mindmark
  2022-11-22 19:42   ` Michael Niedermayer
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 2/4] avfilter/vf_hflip: add support for packed rgb float formats mindmark
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: mindmark @ 2022-11-21 22:11 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Mark Reid

From: Mark Reid <mindmark@gmail.com>

---
 libswscale/input.c | 120 +++++++++++++++++++++++++++++++++++++++++++++
 libswscale/utils.c |   6 +++
 2 files changed, 126 insertions(+)

diff --git a/libswscale/input.c b/libswscale/input.c
index d5676062a2..a305be5ac2 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -1284,6 +1284,96 @@ static void rgbaf16##endian_name##ToA_c(uint8_t *_dst, const uint8_t *_src, cons
 rgbaf16_funcs_endian(le, 0)
 rgbaf16_funcs_endian(be, 1)
 
+#define rdpx(src) (is_be ? av_int2float(AV_RB32(&src)): av_int2float(AV_RL32(&src)))
+
+static av_always_inline void rgbaf32ToUV_endian(uint16_t *dstU, uint16_t *dstV, int is_be,
+                                                const float *src, int width,
+                                                int32_t *rgb2yuv, int comp)
+{
+    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
+    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
+    int i;
+    for (i = 0; i < width; i++) {
+        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f, 65535.0f));
+        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f, 65535.0f));
+        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f, 65535.0f));
+
+        dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+        dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+    }
+}
+
+static av_always_inline void rgbaf32ToY_endian(uint16_t *dst, const float *src, int is_be,
+                                               int width, int32_t *rgb2yuv, int comp)
+{
+    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
+    int i;
+    for (i = 0; i < width; i++) {
+        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f, 65535.0f));
+        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f, 65535.0f));
+        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f, 65535.0f));
+
+        dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
+    }
+}
+
+static av_always_inline void rgbaf32ToA_endian(uint16_t *dst, const float *src, int is_be,
+                                               int width, void *opq)
+{
+    int i;
+    for (i=0; i<width; i++) {
+        dst[i] = lrintf(av_clipf(65535.0f * rdpx(src[i*4+3]), 0.0f, 65535.0f));
+    }
+}
+
+#undef rdpx
+
+#define rgbaf32_funcs_endian(endian_name, endian)                                                         \
+static void rgbf32##endian_name##ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused,            \
+                                         const uint8_t *src1, const uint8_t *src2,                        \
+                                         int width, uint32_t *rgb2yuv, void *opq)                         \
+{                                                                                                         \
+    const float *src = (const float*)src1;                                                                \
+    uint16_t *dstU = (uint16_t*)_dstU;                                                                    \
+    uint16_t *dstV = (uint16_t*)_dstV;                                                                    \
+    av_assert1(src1==src2);                                                                               \
+    rgbaf32ToUV_endian(dstU, dstV, endian, src, width, rgb2yuv, 3);                                       \
+}                                                                                                         \
+static void rgbf32##endian_name##ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0,        \
+                                        const uint8_t *unused1, int width, uint32_t *rgb2yuv, void *opq)  \
+{                                                                                                         \
+    const float *src = (const float*)_src;                                                                \
+    uint16_t *dst = (uint16_t*)_dst;                                                                      \
+    rgbaf32ToY_endian(dst, src, endian, width, rgb2yuv, 3);                                               \
+}                                                                                                         \
+static void rgbaf32##endian_name##ToUV_c(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *unused,           \
+                                         const uint8_t *src1, const uint8_t *src2,                        \
+                                         int width, uint32_t *rgb2yuv, void *opq)                         \
+{                                                                                                         \
+    const float *src = (const float*)src1;                                                                \
+    uint16_t *dstU = (uint16_t*)_dstU;                                                                    \
+    uint16_t *dstV = (uint16_t*)_dstV;                                                                    \
+    av_assert1(src1==src2);                                                                               \
+    rgbaf32ToUV_endian(dstU, dstV, endian, src, width, rgb2yuv, 4);                                       \
+}                                                                                                         \
+static void rgbaf32##endian_name##ToY_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0,       \
+                                        const uint8_t *unused1, int width, uint32_t *rgb2yuv, void *opq)  \
+{                                                                                                         \
+    const float *src = (const float*)_src;                                                                \
+    uint16_t *dst = (uint16_t*)_dst;                                                                      \
+    rgbaf32ToY_endian(dst, src, endian, width, rgb2yuv, 4);                                               \
+}                                                                                                         \
+static void rgbaf32##endian_name##ToA_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused0,       \
+                                        const uint8_t *unused1, int width, uint32_t *unused2, void *opq)  \
+{                                                                                                         \
+    const float *src = (const float*)_src;                                                                \
+    uint16_t *dst = (uint16_t*)_dst;                                                                      \
+    rgbaf32ToA_endian(dst, src, endian, width, opq);                                                      \
+}
+
+rgbaf32_funcs_endian(le, 0)
+rgbaf32_funcs_endian(be, 1)
+
 av_cold void ff_sws_init_input_funcs(SwsContext *c)
 {
     enum AVPixelFormat srcFormat = c->srcFormat;
@@ -1663,6 +1753,18 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
         case AV_PIX_FMT_RGBAF16LE:
             c->chrToYV12 = rgbaf16leToUV_c;
             break;
+        case AV_PIX_FMT_RGBF32BE:
+            c->chrToYV12 = rgbf32beToUV_c;
+            break;
+        case AV_PIX_FMT_RGBAF32BE:
+            c->chrToYV12 = rgbaf32beToUV_c;
+            break;
+        case AV_PIX_FMT_RGBF32LE:
+            c->chrToYV12 = rgbf32leToUV_c;
+            break;
+        case AV_PIX_FMT_RGBAF32LE:
+            c->chrToYV12 = rgbaf32leToUV_c;
+            break;
         }
     }
 
@@ -1973,6 +2075,18 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
     case AV_PIX_FMT_RGBAF16LE:
         c->lumToYV12 = rgbaf16leToY_c;
         break;
+    case AV_PIX_FMT_RGBF32BE:
+        c->lumToYV12 = rgbf32beToY_c;
+        break;
+    case AV_PIX_FMT_RGBAF32BE:
+        c->lumToYV12 = rgbaf32beToY_c;
+        break;
+    case AV_PIX_FMT_RGBF32LE:
+        c->lumToYV12 = rgbf32leToY_c;
+        break;
+    case AV_PIX_FMT_RGBAF32LE:
+        c->lumToYV12 = rgbaf32leToY_c;
+        break;
     }
     if (c->needAlpha) {
         if (is16BPS(srcFormat) || isNBPS(srcFormat)) {
@@ -1998,6 +2112,12 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c)
         case AV_PIX_FMT_RGBAF16LE:
             c->alpToYV12 = rgbaf16leToA_c;
             break;
+        case AV_PIX_FMT_RGBAF32BE:
+            c->alpToYV12 = rgbaf32beToA_c;
+            break;
+        case AV_PIX_FMT_RGBAF32LE:
+            c->alpToYV12 = rgbaf32leToA_c;
+            break;
         case AV_PIX_FMT_YA8:
             c->alpToYV12 = uyvyToY_c;
             break;
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 85640a143f..2c520f68d1 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -266,6 +266,10 @@ static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_VUYX]        = { 1, 1 },
     [AV_PIX_FMT_RGBAF16BE]   = { 1, 0 },
     [AV_PIX_FMT_RGBAF16LE]   = { 1, 0 },
+    [AV_PIX_FMT_RGBF32BE]    = { 1, 0 },
+    [AV_PIX_FMT_RGBF32LE]    = { 1, 0 },
+    [AV_PIX_FMT_RGBAF32BE]   = { 1, 0 },
+    [AV_PIX_FMT_RGBAF32LE]   = { 1, 0 },
     [AV_PIX_FMT_XV30LE]      = { 1, 1 },
     [AV_PIX_FMT_XV36LE]      = { 1, 1 },
 };
@@ -1572,6 +1576,8 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
         srcFormat != AV_PIX_FMT_GBRAP16BE  && srcFormat != AV_PIX_FMT_GBRAP16LE &&
         srcFormat != AV_PIX_FMT_GBRPF32BE  && srcFormat != AV_PIX_FMT_GBRPF32LE &&
         srcFormat != AV_PIX_FMT_GBRAPF32BE && srcFormat != AV_PIX_FMT_GBRAPF32LE &&
+        srcFormat != AV_PIX_FMT_RGBF32BE   && srcFormat != AV_PIX_FMT_RGBF32LE  &&
+        srcFormat != AV_PIX_FMT_RGBAF32BE  && srcFormat != AV_PIX_FMT_RGBAF32LE  &&
         ((dstW >> c->chrDstHSubSample) <= (srcW >> 1) ||
          (flags & SWS_FAST_BILINEAR)))
         c->chrSrcHSubSample = 1;
-- 
2.31.1.windows.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [FFmpeg-devel] [PATCH v4 2/4] avfilter/vf_hflip: add support for packed rgb float formats
  2022-11-21 22:11 [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support mindmark
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support mindmark
@ 2022-11-21 22:11 ` mindmark
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 3/4] avfilter/vf_transpose: " mindmark
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: mindmark @ 2022-11-21 22:11 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Mark Reid

From: Mark Reid <mindmark@gmail.com>

---
 libavfilter/vf_hflip_init.h | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/libavfilter/vf_hflip_init.h b/libavfilter/vf_hflip_init.h
index d0319f463d..31173f73fc 100644
--- a/libavfilter/vf_hflip_init.h
+++ b/libavfilter/vf_hflip_init.h
@@ -86,6 +86,29 @@ static void hflip_qword_c(const uint8_t *ssrc, uint8_t *ddst, int w)
         dst[j] = src[-j];
 }
 
+static void hflip_b96_c(const uint8_t *ssrc, uint8_t *ddst, int w)
+{
+    const uint32_t *in = (const uint32_t *)ssrc;
+    uint32_t *out = (uint32_t *)ddst;
+
+    for (int j = 0; j < w; j++, out += 3, in -= 3) {
+        out[0] = in[0];
+        out[1] = in[1];
+        out[2] = in[2];
+    }
+}
+
+static void hflip_b128_c(const uint8_t *ssrc, uint8_t *ddst, int w)
+{
+    const uint64_t *in = (const uint64_t *)ssrc;
+    uint64_t *out = (uint64_t *)ddst;
+
+    for (int j = 0; j < w; j++, out += 2, in -= 2) {
+        out[0] = in[0];
+        out[1] = in[1];
+    }
+}
+
 static av_unused int ff_hflip_init(FlipContext *s, int step[4], int nb_planes)
 {
     for (int i = 0; i < nb_planes; i++) {
@@ -97,6 +120,8 @@ static av_unused int ff_hflip_init(FlipContext *s, int step[4], int nb_planes)
         case 4: s->flip_line[i] = hflip_dword_c; break;
         case 6: s->flip_line[i] = hflip_b48_c;   break;
         case 8: s->flip_line[i] = hflip_qword_c; break;
+        case 12: s->flip_line[i] = hflip_b96_c; break;
+        case 16: s->flip_line[i] = hflip_b128_c; break;
         default:
             return AVERROR_BUG;
         }
-- 
2.31.1.windows.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [FFmpeg-devel] [PATCH v4 3/4] avfilter/vf_transpose: add support for packed rgb float formats
  2022-11-21 22:11 [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support mindmark
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support mindmark
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 2/4] avfilter/vf_hflip: add support for packed rgb float formats mindmark
@ 2022-11-21 22:11 ` mindmark
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 4/4] swscale/output: add rgbaf32 output support mindmark
  2022-11-21 22:21 ` [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support StreamNG Harold Camargo
  4 siblings, 0 replies; 10+ messages in thread
From: mindmark @ 2022-11-21 22:11 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Mark Reid

From: Mark Reid <mindmark@gmail.com>

---
 libavfilter/vf_transpose.c | 44 ++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)

diff --git a/libavfilter/vf_transpose.c b/libavfilter/vf_transpose.c
index 469e66729f..1023d6fe82 100644
--- a/libavfilter/vf_transpose.c
+++ b/libavfilter/vf_transpose.c
@@ -174,6 +174,46 @@ static void transpose_8x8_64_c(uint8_t *src, ptrdiff_t src_linesize,
     transpose_block_64_c(src, src_linesize, dst, dst_linesize, 8, 8);
 }
 
+static inline void transpose_block_96_c(uint8_t *src, ptrdiff_t src_linesize,
+                                        uint8_t *dst, ptrdiff_t dst_linesize,
+                                        int w, int h)
+{
+    int x, y;
+    for (y = 0; y < h; y++, dst += dst_linesize, src += 12) {
+        for (x = 0; x < w; x++) {
+            *((uint32_t *)(dst+0 + 12*x)) = *((uint32_t *)(src+0 + x*src_linesize));
+            *((uint32_t *)(dst+4 + 12*x)) = *((uint32_t *)(src+4 + x*src_linesize));
+            *((uint32_t *)(dst+8 + 12*x)) = *((uint32_t *)(src+8 + x*src_linesize));
+        }
+    }
+}
+
+static void transpose_8x8_96_c(uint8_t *src, ptrdiff_t src_linesize,
+                               uint8_t *dst, ptrdiff_t dst_linesize)
+{
+    transpose_block_96_c(src, src_linesize, dst, dst_linesize, 8, 8);
+}
+
+
+static inline void transpose_block_128_c(uint8_t *src, ptrdiff_t src_linesize,
+                                         uint8_t *dst, ptrdiff_t dst_linesize,
+                                         int w, int h)
+{
+    int x, y;
+    for (y = 0; y < h; y++, dst += dst_linesize, src += 16) {
+        for (x = 0; x < w; x++) {
+            *((uint64_t *)(dst+0 + 16*x)) = *((uint64_t *)(src+0 + x*src_linesize));
+            *((uint64_t *)(dst+8 + 16*x)) = *((uint64_t *)(src+8 + x*src_linesize));
+        }
+    }
+}
+
+static void transpose_8x8_128_c(uint8_t *src, ptrdiff_t src_linesize,
+                                uint8_t *dst, ptrdiff_t dst_linesize)
+{
+    transpose_block_128_c(src, src_linesize, dst, dst_linesize, 8, 8);
+}
+
 static int config_props_output(AVFilterLink *outlink)
 {
     AVFilterContext *ctx = outlink->src;
@@ -232,6 +272,10 @@ static int config_props_output(AVFilterLink *outlink)
                 v->transpose_8x8   = transpose_8x8_48_c; break;
         case 8: v->transpose_block = transpose_block_64_c;
                 v->transpose_8x8   = transpose_8x8_64_c; break;
+        case 12: v->transpose_block = transpose_block_96_c;
+                 v->transpose_8x8   = transpose_8x8_96_c; break;
+        case 16: v->transpose_block = transpose_block_128_c;
+                 v->transpose_8x8   = transpose_8x8_128_c; break;
         }
     }
 
-- 
2.31.1.windows.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [FFmpeg-devel] [PATCH v4 4/4] swscale/output: add rgbaf32 output support
  2022-11-21 22:11 [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support mindmark
                   ` (2 preceding siblings ...)
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 3/4] avfilter/vf_transpose: " mindmark
@ 2022-11-21 22:11 ` mindmark
  2022-11-21 22:21 ` [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support StreamNG Harold Camargo
  4 siblings, 0 replies; 10+ messages in thread
From: mindmark @ 2022-11-21 22:11 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Mark Reid

From: Mark Reid <mindmark@gmail.com>

---
 libswscale/output.c                      | 92 ++++++++++++++++++++++++
 libswscale/swscale_unscaled.c            |  4 +-
 libswscale/tests/floatimg_cmp.c          |  4 +-
 libswscale/utils.c                       | 16 +++--
 libswscale/yuv2rgb.c                     |  2 +
 tests/ref/fate/filter-pixdesc-rgbaf32be  |  1 +
 tests/ref/fate/filter-pixdesc-rgbaf32le  |  1 +
 tests/ref/fate/filter-pixdesc-rgbf32be   |  1 +
 tests/ref/fate/filter-pixdesc-rgbf32le   |  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 ++
 tests/ref/fate/sws-floatimg-cmp          | 16 +++++
 20 files changed, 170 insertions(+), 8 deletions(-)
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbaf32be
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbaf32le
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbf32be
 create mode 100644 tests/ref/fate/filter-pixdesc-rgbf32le

diff --git a/libswscale/output.c b/libswscale/output.c
index 5c85bff971..1d86a244f9 100644
--- a/libswscale/output.c
+++ b/libswscale/output.c
@@ -2471,6 +2471,92 @@ yuv2gbrpf32_full_X_c(SwsContext *c, const int16_t *lumFilter,
     }
 }
 
+static void
+yuv2rgbaf32_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 alpha = desc->flags & AV_PIX_FMT_FLAG_ALPHA;
+    int hasAlpha = alpha && alpSrcx;
+    int pixelStep = alpha ? 4 : 3;
+    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;
+    uint32_t a = av_float2int(1.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;
+            a = av_float2int(float_mult * (float)(av_clip_uintp2(A, 30) >> 14));
+        }
+
+        Y -= c->yuv2rgb_y_offset;
+        Y *= c->yuv2rgb_y_coeff;
+        Y += (1 << 13) - (1 << 29);
+        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) >> 14) + (1<<15), 16);
+        G = av_clip_uintp2(((Y + G) >> 14) + (1<<15), 16);
+        B = av_clip_uintp2(((Y + B) >> 14) + (1<<15), 16);
+
+        dest32[0] = av_float2int(float_mult * (float)R);
+        dest32[1] = av_float2int(float_mult * (float)G);
+        dest32[2] = av_float2int(float_mult * (float)B);
+        if (alpha)
+            dest32[3] = a;
+
+        dest32 += pixelStep;
+    }
+    if ((!isBE(c->dstFormat)) != (!HAVE_BIGENDIAN)) {
+        dest32 = (uint32_t*)dest;
+        for (i = 0; i < dstW; i++) {
+            dest32[0] = av_bswap32(dest32[0]);
+            dest32[1] = av_bswap32(dest32[1]);
+            dest32[2] = av_bswap32(dest32[2]);
+            if (alpha)
+                dest32[3] = av_bswap32(dest32[3]);
+
+            dest32 += pixelStep;
+        }
+    }
+
+}
+
 static void
 yuv2ya8_1_c(SwsContext *c, const int16_t *buf0,
             const int16_t *ubuf[2], const int16_t *vbuf[2],
@@ -2983,6 +3069,12 @@ av_cold void ff_sws_init_output_funcs(SwsContext *c,
             }
             break;
 
+        case AV_PIX_FMT_RGBF32LE:
+        case AV_PIX_FMT_RGBF32BE:
+        case AV_PIX_FMT_RGBAF32LE:
+        case AV_PIX_FMT_RGBAF32BE:
+            *yuv2packedX = yuv2rgbaf32_full_X_c;
+            break;
         case AV_PIX_FMT_RGB24:
             *yuv2packedX = yuv2rgb24_full_X_c;
             *yuv2packed2 = yuv2rgb24_full_2_c;
diff --git a/libswscale/swscale_unscaled.c b/libswscale/swscale_unscaled.c
index 9af2e7ecc3..5a73cfa541 100644
--- a/libswscale/swscale_unscaled.c
+++ b/libswscale/swscale_unscaled.c
@@ -2160,7 +2160,9 @@ void ff_get_unscaled_swscale(SwsContext *c)
 
     /* 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))
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_GBRAPF32) ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGBF32)   ||
+        IS_DIFFERENT_ENDIANESS(srcFormat, dstFormat, AV_PIX_FMT_RGBAF32))
         c->convert_unscaled = bswap_32bpc;
 
     if (usePal(srcFormat) && isByteRGB(dstFormat))
diff --git a/libswscale/tests/floatimg_cmp.c b/libswscale/tests/floatimg_cmp.c
index 5c67594fb6..9559c93aac 100644
--- a/libswscale/tests/floatimg_cmp.c
+++ b/libswscale/tests/floatimg_cmp.c
@@ -54,7 +54,9 @@ static const enum AVPixelFormat pix_fmts[] = {
     AV_PIX_FMT_GBRP10LE, AV_PIX_FMT_GBRAP10LE,
     AV_PIX_FMT_GBRP12LE, AV_PIX_FMT_GBRAP12LE,
     AV_PIX_FMT_GBRP14LE,
-    AV_PIX_FMT_GBRP16LE,  AV_PIX_FMT_GBRAP16LE
+    AV_PIX_FMT_GBRP16LE, AV_PIX_FMT_GBRAP16LE,
+    AV_PIX_FMT_RGBF32LE, AV_PIX_FMT_RGBAF32LE,
+    AV_PIX_FMT_RGBF32BE, AV_PIX_FMT_RGBAF32BE
 };
 
 const char *usage =  "floatimg_cmp -pixel_format <pix_fmt> -size <image_size> -ref <testfile>\n";
diff --git a/libswscale/utils.c b/libswscale/utils.c
index 2c520f68d1..642f765550 100644
--- a/libswscale/utils.c
+++ b/libswscale/utils.c
@@ -266,10 +266,10 @@ static const FormatEntry format_entries[] = {
     [AV_PIX_FMT_VUYX]        = { 1, 1 },
     [AV_PIX_FMT_RGBAF16BE]   = { 1, 0 },
     [AV_PIX_FMT_RGBAF16LE]   = { 1, 0 },
-    [AV_PIX_FMT_RGBF32BE]    = { 1, 0 },
-    [AV_PIX_FMT_RGBF32LE]    = { 1, 0 },
-    [AV_PIX_FMT_RGBAF32BE]   = { 1, 0 },
-    [AV_PIX_FMT_RGBAF32LE]   = { 1, 0 },
+    [AV_PIX_FMT_RGBF32BE]    = { 1, 1 },
+    [AV_PIX_FMT_RGBF32LE]    = { 1, 1 },
+    [AV_PIX_FMT_RGBAF32BE]   = { 1, 1 },
+    [AV_PIX_FMT_RGBAF32LE]   = { 1, 1 },
     [AV_PIX_FMT_XV30LE]      = { 1, 1 },
     [AV_PIX_FMT_XV36LE]      = { 1, 1 },
 };
@@ -1512,7 +1512,7 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
             }
         }
     }
-    if (isPlanarRGB(dstFormat)) {
+    if (isPlanarRGB(dstFormat) || isFloat(dstFormat)) {
         if (!(flags & SWS_FULL_CHR_H_INT)) {
             av_log(c, AV_LOG_DEBUG,
                    "%s output is not supported with half chroma resolution, switching to full\n",
@@ -1544,7 +1544,11 @@ av_cold int sws_init_context(SwsContext *c, SwsFilter *srcFilter,
         dstFormat != AV_PIX_FMT_BGR4_BYTE &&
         dstFormat != AV_PIX_FMT_RGB4_BYTE &&
         dstFormat != AV_PIX_FMT_BGR8 &&
-        dstFormat != AV_PIX_FMT_RGB8
+        dstFormat != AV_PIX_FMT_RGB8 &&
+        dstFormat != AV_PIX_FMT_RGBF32LE &&
+        dstFormat != AV_PIX_FMT_RGBF32BE &&
+        dstFormat != AV_PIX_FMT_RGBAF32LE &&
+        dstFormat != AV_PIX_FMT_RGBAF32BE
     ) {
         av_log(c, AV_LOG_WARNING,
                "full chroma interpolation for destination format '%s' not yet implemented\n",
diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c
index 9c3f5e23c6..7ad9d2c9dc 100644
--- a/libswscale/yuv2rgb.c
+++ b/libswscale/yuv2rgb.c
@@ -999,6 +999,8 @@ av_cold int ff_yuv2rgb_c_init_tables(SwsContext *c, const int inv_table[4],
         break;
     case 32:
     case 64:
+    case 96:
+    case 128:
         base      = (c->dstFormat == AV_PIX_FMT_RGB32_1 ||
                      c->dstFormat == AV_PIX_FMT_BGR32_1) ? 8 : 0;
         rbase     = base + (isRgb ? 16 : 0);
diff --git a/tests/ref/fate/filter-pixdesc-rgbaf32be b/tests/ref/fate/filter-pixdesc-rgbaf32be
new file mode 100644
index 0000000000..def2537716
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-rgbaf32be
@@ -0,0 +1 @@
+pixdesc-rgbaf32be   8c618ffd38084857013b0f50d2cee0dd
diff --git a/tests/ref/fate/filter-pixdesc-rgbaf32le b/tests/ref/fate/filter-pixdesc-rgbaf32le
new file mode 100644
index 0000000000..01913ecaa7
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-rgbaf32le
@@ -0,0 +1 @@
+pixdesc-rgbaf32le   bb5239a00a3ec2b1f1d569733a1e03a2
diff --git a/tests/ref/fate/filter-pixdesc-rgbf32be b/tests/ref/fate/filter-pixdesc-rgbf32be
new file mode 100644
index 0000000000..77e40f20b9
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-rgbf32be
@@ -0,0 +1 @@
+pixdesc-rgbf32be    ca6c4115dc368a192a67d06bd47f369f
diff --git a/tests/ref/fate/filter-pixdesc-rgbf32le b/tests/ref/fate/filter-pixdesc-rgbf32le
new file mode 100644
index 0000000000..c0cb4d60f0
--- /dev/null
+++ b/tests/ref/fate/filter-pixdesc-rgbf32le
@@ -0,0 +1 @@
+pixdesc-rgbf32le    290153561ddc3266b253fa075e040578
diff --git a/tests/ref/fate/filter-pixfmts-copy b/tests/ref/fate/filter-pixfmts-copy
index b28a114c7b..9aa653d12d 100644
--- a/tests/ref/fate/filter-pixfmts-copy
+++ b/tests/ref/fate/filter-pixfmts-copy
@@ -90,6 +90,10 @@ rgb8                7ac6008c84d622c2fc50581706e17576
 rgba                b6e1b441c365e03b5ffdf9b7b68d9a0c
 rgba64be            ae2ae04b5efedca3505f47c4dd6ea6ea
 rgba64le            b91e1d77f799eb92241a2d2d28437b15
+rgbaf32be           abb244bb1af2247bbba7b4eac0357f6b
+rgbaf32le           99b2afe809649e58eea0a188fd6ab3f2
+rgbf32be            e4a0b47e8ecb2e7e461915227ebd4edd
+rgbf32le            2979d6bfe509a55486e55e4de63d67d1
 uyvy422             3bcf3c80047592f2211fae3260b1b65d
 vuya                3d5e934651cae1ce334001cb1829ad22
 vuyx                3f68ea6ec492b30d867cb5401562264e
diff --git a/tests/ref/fate/filter-pixfmts-crop b/tests/ref/fate/filter-pixfmts-crop
index bdb2536f7d..9bb54cf9f0 100644
--- a/tests/ref/fate/filter-pixfmts-crop
+++ b/tests/ref/fate/filter-pixfmts-crop
@@ -88,6 +88,10 @@ rgb8                9b364a8f112ad9459fec47a51cc03b30
 rgba                9488ac85abceaf99a9309eac5a87697e
 rgba64be            89910046972ab3c68e2a348302cc8ca9
 rgba64le            fea8ebfc869b52adf353778f29eac7a7
+rgbaf32be           48be3ace31f293fa2bf174c583c46b50
+rgbaf32le           a2a358ecc5fe53a684d3de994134c4ce
+rgbf32be            ad982fbaf08c908658e66cb4330257cd
+rgbf32le            14b944af62af458fa53da118721a258f
 vuya                76578a705ff3a37559653c1289bd03dd
 vuyx                5d2bae51a2f4892bd5f177f190cc323b
 x2bgr10le           84de725b85662c362862820dc4a309aa
diff --git a/tests/ref/fate/filter-pixfmts-field b/tests/ref/fate/filter-pixfmts-field
index 4e5a798471..5c8817a5c7 100644
--- a/tests/ref/fate/filter-pixfmts-field
+++ b/tests/ref/fate/filter-pixfmts-field
@@ -90,6 +90,10 @@ rgb8                62c3b9e2a171de3d894a8eeb271c85e8
 rgba                ee616262ca6d67b7ecfba4b36c602ce3
 rgba64be            23c8c0edaabe3eaec89ce69633fb0048
 rgba64le            dfdba4de4a7cac9abf08852666c341d3
+rgbaf32be           f081b6c6df6094d36563b78dccdbc97a
+rgbaf32le           e461aff4408751a03f8effd0e16be47c
+rgbf32be            d71855f12b960ab02b787c99bc0e4cf1
+rgbf32le            a4251c66110290418f15cb1e334a7f0d
 uyvy422             1c49e44ab3f060e85fc4a3a9464f045e
 vuya                f72bcf29d75cd143d0c565f7cc49119a
 vuyx                6257cd1ce11330660e9fa9c675acbdcc
diff --git a/tests/ref/fate/filter-pixfmts-fieldorder b/tests/ref/fate/filter-pixfmts-fieldorder
index bebaf07371..05b288dbe3 100644
--- a/tests/ref/fate/filter-pixfmts-fieldorder
+++ b/tests/ref/fate/filter-pixfmts-fieldorder
@@ -79,6 +79,10 @@ rgb8                6deae05ccac5c50bd0d9c9fe8e124557
 rgba                1fdf872a087a32cd35b80cc7be399578
 rgba64be            5598f44514d122b9a57c5c92c20bbc61
 rgba64le            b34e6e30621ae579519a2d91a96a0acf
+rgbaf32be           9a7c2182fd89218172f07e3b37f9728e
+rgbaf32le           940e87c0ddb7a86f9df438591b4870e6
+rgbf32be            f23c5dd85e312471e3def0204051d264
+rgbf32le            fec06f561663e7d01dec08c1c337f068
 uyvy422             75de70e31c435dde878002d3f22b238a
 vuya                a3891d4168ff208948fd0b3ba0910495
 vuyx                d7a900e970c9a69ed41f8b220114b9fa
diff --git a/tests/ref/fate/filter-pixfmts-hflip b/tests/ref/fate/filter-pixfmts-hflip
index fd5e9723fd..02a734d8af 100644
--- a/tests/ref/fate/filter-pixfmts-hflip
+++ b/tests/ref/fate/filter-pixfmts-hflip
@@ -88,6 +88,10 @@ rgb8                68a3a575badadd9e4f90226209f11699
 rgba                51961c723ea6707e0a410cd3f21f15d3
 rgba64be            c910444019f4cfbf4d995227af55da8d
 rgba64le            0c810d8b3a6bca10321788e1cb145340
+rgbaf32be           6077603ed554db4149f82d891e1d1120
+rgbaf32le           3081376a3a9e90fd2849751dfd69094b
+rgbf32be            0e5ffacba8dc768acfa50fc590dddac6
+rgbf32le            542380fd2490e3227b70373eace3bade
 vuya                7e530261e7ac4eae4fd616fd7572d0b8
 vuyx                3ce9890363cad3984521293be1eb679c
 x2bgr10le           827cc659f29378e00c5a7d2c0ada8f9a
diff --git a/tests/ref/fate/filter-pixfmts-il b/tests/ref/fate/filter-pixfmts-il
index ec9d809721..48701fe9a3 100644
--- a/tests/ref/fate/filter-pixfmts-il
+++ b/tests/ref/fate/filter-pixfmts-il
@@ -89,6 +89,10 @@ rgb8                93f9fa5ecf522abe13ed34f21831fdfe
 rgba                625d8f4bd39c4bdbf61eb5e4713aecc9
 rgba64be            db70d33aa6c06f3e0a1c77bd11284261
 rgba64le            a8a2daae04374a27219bc1c890204007
+rgbaf32be           e803073624dee4ce4c10d5d22f95b788
+rgbaf32le           f87c6898ef385fb7239b16677a450326
+rgbf32be            3696160d95d41564a1a375ddeab82d70
+rgbf32le            71d9d0c83ded4c0866ea0673c1eed8d0
 uyvy422             d6ee3ca43356d08c392382b24b22cda5
 vuya                b9deab5ba249dd608b709c09255a4932
 vuyx                49cc92fcc002ec0f312017014dd68c0c
diff --git a/tests/ref/fate/filter-pixfmts-null b/tests/ref/fate/filter-pixfmts-null
index b28a114c7b..9aa653d12d 100644
--- a/tests/ref/fate/filter-pixfmts-null
+++ b/tests/ref/fate/filter-pixfmts-null
@@ -90,6 +90,10 @@ rgb8                7ac6008c84d622c2fc50581706e17576
 rgba                b6e1b441c365e03b5ffdf9b7b68d9a0c
 rgba64be            ae2ae04b5efedca3505f47c4dd6ea6ea
 rgba64le            b91e1d77f799eb92241a2d2d28437b15
+rgbaf32be           abb244bb1af2247bbba7b4eac0357f6b
+rgbaf32le           99b2afe809649e58eea0a188fd6ab3f2
+rgbf32be            e4a0b47e8ecb2e7e461915227ebd4edd
+rgbf32le            2979d6bfe509a55486e55e4de63d67d1
 uyvy422             3bcf3c80047592f2211fae3260b1b65d
 vuya                3d5e934651cae1ce334001cb1829ad22
 vuyx                3f68ea6ec492b30d867cb5401562264e
diff --git a/tests/ref/fate/filter-pixfmts-scale b/tests/ref/fate/filter-pixfmts-scale
index 525306ec12..b22a6d639d 100644
--- a/tests/ref/fate/filter-pixfmts-scale
+++ b/tests/ref/fate/filter-pixfmts-scale
@@ -90,6 +90,10 @@ rgb8                bcdc033b4ef0979d060dbc8893d4db58
 rgba                85bb5d03cea1c6e8002ced3373904336
 rgba64be            ee73e57923af984b31cc7795d13929da
 rgba64le            783d2779adfafe3548bdb671ec0de69e
+rgbaf32be           0ccc31b373d6465ab72247ae42f395ce
+rgbaf32le           3eb06a5ba1c2341f12a30ff2539d5de0
+rgbf32be            11d0d9722abf9ea4fdce370920ff5820
+rgbf32le            a9c247ff3d50e07bd7d0f777b9f82b32
 uyvy422             aeb4ba4f9f003ae21f6d18089198244f
 vuya                ffa817e283bf6a0b6fba21b07523ccaa
 vuyx                ba182200e20e0c82765eba15217848d3
diff --git a/tests/ref/fate/filter-pixfmts-transpose b/tests/ref/fate/filter-pixfmts-transpose
index 24f4249639..868a784731 100644
--- a/tests/ref/fate/filter-pixfmts-transpose
+++ b/tests/ref/fate/filter-pixfmts-transpose
@@ -82,6 +82,10 @@ rgb8                c90feb30c3c9391ef5f470209d7b7a15
 rgba                4d76a9542143752a4ac30f82f88f68f1
 rgba64be            a60041217f4c0cd796d19d3940a12a41
 rgba64le            ad47197774858858ae7b0c177dffa459
+rgbaf32be           83d7d66f59a8b62c40aa59c81188584d
+rgbaf32le           d9cb46bfebebadaf838bb13d243feabe
+rgbf32be            b090912ac60da12be5f84672d223300f
+rgbf32le            4b4e06621fb626952fc632f5049453ba
 vuya                9ece18a345beb17cd19e09e443eca4bf
 vuyx                4c2929cd1c6e5512f62e802f482f0ef2
 x2bgr10le           4aa774b6d8f6d446a64f1f288e5c97eb
diff --git a/tests/ref/fate/filter-pixfmts-vflip b/tests/ref/fate/filter-pixfmts-vflip
index b7b0526588..b999109ff8 100644
--- a/tests/ref/fate/filter-pixfmts-vflip
+++ b/tests/ref/fate/filter-pixfmts-vflip
@@ -90,6 +90,10 @@ rgb8                7df049b6094f8a5e084d74462f6d6cde
 rgba                c1a5908572737f2ae1e5d8218af65f4b
 rgba64be            17e6273323b5779b5f3f775f150c1011
 rgba64le            48f45b10503b7dd140329c3dd0d54c98
+rgbaf32be           cd7a7ce6f70ef8ca4a05d69458c6c40d
+rgbaf32le           4516303140dd7ff5bc02e4ae0c94b46d
+rgbf32be            f416f773dd17dd15ca0845b47bf5ff44
+rgbf32le            16c50e897557972203c7e637080dc885
 uyvy422             3a237e8376264e0cfa78f8a3fdadec8a
 vuya                fb849f76e56181e005c31fce75d7038c
 vuyx                7a8079a97610e2c1c97aa8832b58a102
diff --git a/tests/ref/fate/sws-floatimg-cmp b/tests/ref/fate/sws-floatimg-cmp
index 251042f1c3..d524dd612f 100644
--- a/tests/ref/fate/sws-floatimg-cmp
+++ b/tests/ref/fate/sws-floatimg-cmp
@@ -118,3 +118,19 @@ gbrpf32le -> gbrap16le -> gbrpf32le
 avg diff: 0.000249
 min diff: 0.000000
 max diff: 0.000990
+gbrpf32le -> rgbf32le -> gbrpf32le
+avg diff: 0.000249
+min diff: 0.000000
+max diff: 0.000990
+gbrpf32le -> rgbaf32le -> gbrpf32le
+avg diff: 0.000249
+min diff: 0.000000
+max diff: 0.000990
+gbrpf32le -> rgbf32be -> gbrpf32le
+avg diff: 0.000249
+min diff: 0.000000
+max diff: 0.000990
+gbrpf32le -> rgbaf32be -> gbrpf32le
+avg diff: 0.000249
+min diff: 0.000000
+max diff: 0.000990
-- 
2.31.1.windows.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support
  2022-11-21 22:11 [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support mindmark
                   ` (3 preceding siblings ...)
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 4/4] swscale/output: add rgbaf32 output support mindmark
@ 2022-11-21 22:21 ` StreamNG Harold Camargo
  4 siblings, 0 replies; 10+ messages in thread
From: StreamNG Harold Camargo @ 2022-11-21 22:21 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

unsuscribe

Harold F. Camargo R.
Stream NG
Cel. 318 3227862
Bogotá Colombia
www.stream-ng.com


El lun, 21 nov 2022 a las 17:11, <mindmark@gmail.com> escribió:

> From: Mark Reid <mindmark@gmail.com>
>
> This patch series adds swscale input/output support for the packed rgb
> float formats.
> A few of the filters also needed support the larger 96/128 bit packed
> pixel sizes.
>
> I also plan to eventually add lossless unscaled conversions between the
> planer and packed formats.
>
> changes since v3
> * removed half uv path implementation
> changes since v2
> * add bias to rgbaf32 output to improve non overflowing range
> changes since v1
> * output correct alpha if src doesn't have alpha
>
> Mark Reid (4):
>   swscale/input: add rgbaf32 input support
>   avfilter/vf_hflip: add support for packed rgb float formats
>   avfilter/vf_transpose: add support for packed rgb float formats
>   swscale/output: add rgbaf32 output support
>
>  libavfilter/vf_hflip_init.h              |  25 +++++
>  libavfilter/vf_transpose.c               |  44 +++++++++
>  libswscale/input.c                       | 120 +++++++++++++++++++++++
>  libswscale/output.c                      |  92 +++++++++++++++++
>  libswscale/swscale_unscaled.c            |   4 +-
>  libswscale/tests/floatimg_cmp.c          |   4 +-
>  libswscale/utils.c                       |  14 ++-
>  libswscale/yuv2rgb.c                     |   2 +
>  tests/ref/fate/filter-pixdesc-rgbaf32be  |   1 +
>  tests/ref/fate/filter-pixdesc-rgbaf32le  |   1 +
>  tests/ref/fate/filter-pixdesc-rgbf32be   |   1 +
>  tests/ref/fate/filter-pixdesc-rgbf32le   |   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 +
>  tests/ref/fate/sws-floatimg-cmp          |  16 +++
>  23 files changed, 361 insertions(+), 4 deletions(-)
>  create mode 100644 tests/ref/fate/filter-pixdesc-rgbaf32be
>  create mode 100644 tests/ref/fate/filter-pixdesc-rgbaf32le
>  create mode 100644 tests/ref/fate/filter-pixdesc-rgbf32be
>  create mode 100644 tests/ref/fate/filter-pixdesc-rgbf32le
>
> --
> 2.31.1.windows.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support
  2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support mindmark
@ 2022-11-22 19:42   ` Michael Niedermayer
  2022-11-22 21:17     ` Mark Reid
  0 siblings, 1 reply; 10+ messages in thread
From: Michael Niedermayer @ 2022-11-22 19:42 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 2829 bytes --]

On Mon, Nov 21, 2022 at 02:11:43PM -0800, mindmark@gmail.com wrote:
> From: Mark Reid <mindmark@gmail.com>
> 
> ---
>  libswscale/input.c | 120 +++++++++++++++++++++++++++++++++++++++++++++
>  libswscale/utils.c |   6 +++
>  2 files changed, 126 insertions(+)
> 
> diff --git a/libswscale/input.c b/libswscale/input.c
> index d5676062a2..a305be5ac2 100644
> --- a/libswscale/input.c
> +++ b/libswscale/input.c
> @@ -1284,6 +1284,96 @@ static void rgbaf16##endian_name##ToA_c(uint8_t *_dst, const uint8_t *_src, cons
>  rgbaf16_funcs_endian(le, 0)
>  rgbaf16_funcs_endian(be, 1)
>  
> +#define rdpx(src) (is_be ? av_int2float(AV_RB32(&src)): av_int2float(AV_RL32(&src)))
> +
> +static av_always_inline void rgbaf32ToUV_endian(uint16_t *dstU, uint16_t *dstV, int is_be,
> +                                                const float *src, int width,
> +                                                int32_t *rgb2yuv, int comp)
> +{
> +    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX];
> +    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv = rgb2yuv[BV_IDX];
> +    int i;
> +    for (i = 0; i < width; i++) {
> +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f, 65535.0f));
> +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f, 65535.0f));
> +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f, 65535.0f));
> +
> +        dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
> +        dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
> +    }
> +}





> +
> +static av_always_inline void rgbaf32ToY_endian(uint16_t *dst, const float *src, int is_be,
> +                                               int width, int32_t *rgb2yuv, int comp)
> +{
> +    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
> +    int i;
> +    for (i = 0; i < width; i++) {
> +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f, 65535.0f));
> +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f, 65535.0f));
> +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f, 65535.0f));
> +
> +        dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >> RGB2YUV_SHIFT;
> +    }
> +}

I thought you would post a patchset that in the end has 1 lrintf/av_clipf
for a function like this not 3
Just asking as you arent saying this is temporary in this set nor why its
left liek this nor does it include the factorization of these operations

thx

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

I have never wished to cater to the crowd; for what I know they do not
approve, and what they approve I do not know. -- Epicurus

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support
  2022-11-22 19:42   ` Michael Niedermayer
@ 2022-11-22 21:17     ` Mark Reid
  2022-11-22 22:43       ` Michael Niedermayer
  0 siblings, 1 reply; 10+ messages in thread
From: Mark Reid @ 2022-11-22 21:17 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Tue, Nov 22, 2022 at 11:43 AM Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Mon, Nov 21, 2022 at 02:11:43PM -0800, mindmark@gmail.com wrote:
> > From: Mark Reid <mindmark@gmail.com>
> >
> > ---
> >  libswscale/input.c | 120 +++++++++++++++++++++++++++++++++++++++++++++
> >  libswscale/utils.c |   6 +++
> >  2 files changed, 126 insertions(+)
> >
> > diff --git a/libswscale/input.c b/libswscale/input.c
> > index d5676062a2..a305be5ac2 100644
> > --- a/libswscale/input.c
> > +++ b/libswscale/input.c
> > @@ -1284,6 +1284,96 @@ static void rgbaf16##endian_name##ToA_c(uint8_t
> *_dst, const uint8_t *_src, cons
> >  rgbaf16_funcs_endian(le, 0)
> >  rgbaf16_funcs_endian(be, 1)
> >
> > +#define rdpx(src) (is_be ? av_int2float(AV_RB32(&src)):
> av_int2float(AV_RL32(&src)))
> > +
> > +static av_always_inline void rgbaf32ToUV_endian(uint16_t *dstU,
> uint16_t *dstV, int is_be,
> > +                                                const float *src, int
> width,
> > +                                                int32_t *rgb2yuv, int
> comp)
> > +{
> > +    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu =
> rgb2yuv[BU_IDX];
> > +    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv =
> rgb2yuv[BV_IDX];
> > +    int i;
> > +    for (i = 0; i < width; i++) {
> > +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f,
> 65535.0f));
> > +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f,
> 65535.0f));
> > +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f,
> 65535.0f));
> > +
> > +        dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1)))
> >> RGB2YUV_SHIFT;
> > +        dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1)))
> >> RGB2YUV_SHIFT;
> > +    }
> > +}
>
>
>
>
>
> > +
> > +static av_always_inline void rgbaf32ToY_endian(uint16_t *dst, const
> float *src, int is_be,
> > +                                               int width, int32_t
> *rgb2yuv, int comp)
> > +{
> > +    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by =
> rgb2yuv[BY_IDX];
> > +    int i;
> > +    for (i = 0; i < width; i++) {
> > +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f,
> 65535.0f));
> > +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f,
> 65535.0f));
> > +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f,
> 65535.0f));
> > +
> > +        dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >>
> RGB2YUV_SHIFT;
> > +    }
> > +}
>
> I thought you would post a patchset that in the end has 1 lrintf/av_clipf
> for a function like this not 3
> Just asking as you arent saying this is temporary in this set nor why its
> left liek this nor does it include the factorization of these operations
>
>
Sorry I must have misunderstood. I was hoping I could leave it like this
temporarily as it matches the planar f32 version and address the
factorization separate patchset.


> thx
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> I have never wished to cater to the crowd; for what I know they do not
> approve, and what they approve I do not know. -- Epicurus
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support
  2022-11-22 21:17     ` Mark Reid
@ 2022-11-22 22:43       ` Michael Niedermayer
  2022-11-23  2:07         ` Mark Reid
  0 siblings, 1 reply; 10+ messages in thread
From: Michael Niedermayer @ 2022-11-22 22:43 UTC (permalink / raw)
  To: FFmpeg development discussions and patches


[-- Attachment #1.1: Type: text/plain, Size: 3757 bytes --]

On Tue, Nov 22, 2022 at 01:17:09PM -0800, Mark Reid wrote:
> On Tue, Nov 22, 2022 at 11:43 AM Michael Niedermayer <michael@niedermayer.cc>
> wrote:
> 
> > On Mon, Nov 21, 2022 at 02:11:43PM -0800, mindmark@gmail.com wrote:
> > > From: Mark Reid <mindmark@gmail.com>
> > >
> > > ---
> > >  libswscale/input.c | 120 +++++++++++++++++++++++++++++++++++++++++++++
> > >  libswscale/utils.c |   6 +++
> > >  2 files changed, 126 insertions(+)
> > >
> > > diff --git a/libswscale/input.c b/libswscale/input.c
> > > index d5676062a2..a305be5ac2 100644
> > > --- a/libswscale/input.c
> > > +++ b/libswscale/input.c
> > > @@ -1284,6 +1284,96 @@ static void rgbaf16##endian_name##ToA_c(uint8_t
> > *_dst, const uint8_t *_src, cons
> > >  rgbaf16_funcs_endian(le, 0)
> > >  rgbaf16_funcs_endian(be, 1)
> > >
> > > +#define rdpx(src) (is_be ? av_int2float(AV_RB32(&src)):
> > av_int2float(AV_RL32(&src)))
> > > +
> > > +static av_always_inline void rgbaf32ToUV_endian(uint16_t *dstU,
> > uint16_t *dstV, int is_be,
> > > +                                                const float *src, int
> > width,
> > > +                                                int32_t *rgb2yuv, int
> > comp)
> > > +{
> > > +    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu =
> > rgb2yuv[BU_IDX];
> > > +    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv =
> > rgb2yuv[BV_IDX];
> > > +    int i;
> > > +    for (i = 0; i < width; i++) {
> > > +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f,
> > 65535.0f));
> > > +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f,
> > 65535.0f));
> > > +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f,
> > 65535.0f));
> > > +
> > > +        dstU[i] = (ru*r + gu*g + bu*b + (0x10001<<(RGB2YUV_SHIFT-1)))
> > >> RGB2YUV_SHIFT;
> > > +        dstV[i] = (rv*r + gv*g + bv*b + (0x10001<<(RGB2YUV_SHIFT-1)))
> > >> RGB2YUV_SHIFT;
> > > +    }
> > > +}
> >
> >
> >
> >
> >
> > > +
> > > +static av_always_inline void rgbaf32ToY_endian(uint16_t *dst, const
> > float *src, int is_be,
> > > +                                               int width, int32_t
> > *rgb2yuv, int comp)
> > > +{
> > > +    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by =
> > rgb2yuv[BY_IDX];
> > > +    int i;
> > > +    for (i = 0; i < width; i++) {
> > > +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]), 0.0f,
> > 65535.0f));
> > > +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]), 0.0f,
> > 65535.0f));
> > > +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]), 0.0f,
> > 65535.0f));
> > > +
> > > +        dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1))) >>
> > RGB2YUV_SHIFT;
> > > +    }
> > > +}
> >
> > I thought you would post a patchset that in the end has 1 lrintf/av_clipf
> > for a function like this not 3
> > Just asking as you arent saying this is temporary in this set nor why its
> > left liek this nor does it include the factorization of these operations
> >
> >
> Sorry I must have misunderstood. I was hoping I could leave it like this
> temporarily as it matches the planar f32 version and address the
> factorization separate patchset.

you can, i just want to make sure its not forgotten. Maybe you can add
some note to the commit message that this will be addressed in a future
pachset

thx


[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If the United States is serious about tackling the national security threats 
related to an insecure 5G network, it needs to rethink the extent to which it
values corporate profits and government espionage over security.-Bruce Schneier

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support
  2022-11-22 22:43       ` Michael Niedermayer
@ 2022-11-23  2:07         ` Mark Reid
  0 siblings, 0 replies; 10+ messages in thread
From: Mark Reid @ 2022-11-23  2:07 UTC (permalink / raw)
  To: FFmpeg development discussions and patches

On Tue, Nov 22, 2022 at 2:43 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:

> On Tue, Nov 22, 2022 at 01:17:09PM -0800, Mark Reid wrote:
> > On Tue, Nov 22, 2022 at 11:43 AM Michael Niedermayer <
> michael@niedermayer.cc>
> > wrote:
> >
> > > On Mon, Nov 21, 2022 at 02:11:43PM -0800, mindmark@gmail.com wrote:
> > > > From: Mark Reid <mindmark@gmail.com>
> > > >
> > > > ---
> > > >  libswscale/input.c | 120
> +++++++++++++++++++++++++++++++++++++++++++++
> > > >  libswscale/utils.c |   6 +++
> > > >  2 files changed, 126 insertions(+)
> > > >
> > > > diff --git a/libswscale/input.c b/libswscale/input.c
> > > > index d5676062a2..a305be5ac2 100644
> > > > --- a/libswscale/input.c
> > > > +++ b/libswscale/input.c
> > > > @@ -1284,6 +1284,96 @@ static void
> rgbaf16##endian_name##ToA_c(uint8_t
> > > *_dst, const uint8_t *_src, cons
> > > >  rgbaf16_funcs_endian(le, 0)
> > > >  rgbaf16_funcs_endian(be, 1)
> > > >
> > > > +#define rdpx(src) (is_be ? av_int2float(AV_RB32(&src)):
> > > av_int2float(AV_RL32(&src)))
> > > > +
> > > > +static av_always_inline void rgbaf32ToUV_endian(uint16_t *dstU,
> > > uint16_t *dstV, int is_be,
> > > > +                                                const float *src,
> int
> > > width,
> > > > +                                                int32_t *rgb2yuv,
> int
> > > comp)
> > > > +{
> > > > +    int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu =
> > > rgb2yuv[BU_IDX];
> > > > +    int32_t rv = rgb2yuv[RV_IDX], gv = rgb2yuv[GV_IDX], bv =
> > > rgb2yuv[BV_IDX];
> > > > +    int i;
> > > > +    for (i = 0; i < width; i++) {
> > > > +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]),
> 0.0f,
> > > 65535.0f));
> > > > +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]),
> 0.0f,
> > > 65535.0f));
> > > > +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]),
> 0.0f,
> > > 65535.0f));
> > > > +
> > > > +        dstU[i] = (ru*r + gu*g + bu*b +
> (0x10001<<(RGB2YUV_SHIFT-1)))
> > > >> RGB2YUV_SHIFT;
> > > > +        dstV[i] = (rv*r + gv*g + bv*b +
> (0x10001<<(RGB2YUV_SHIFT-1)))
> > > >> RGB2YUV_SHIFT;
> > > > +    }
> > > > +}
> > >
> > >
> > >
> > >
> > >
> > > > +
> > > > +static av_always_inline void rgbaf32ToY_endian(uint16_t *dst, const
> > > float *src, int is_be,
> > > > +                                               int width, int32_t
> > > *rgb2yuv, int comp)
> > > > +{
> > > > +    int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by =
> > > rgb2yuv[BY_IDX];
> > > > +    int i;
> > > > +    for (i = 0; i < width; i++) {
> > > > +        int r = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+0]),
> 0.0f,
> > > 65535.0f));
> > > > +        int g = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+1]),
> 0.0f,
> > > 65535.0f));
> > > > +        int b = lrintf(av_clipf(65535.0f * rdpx(src[i*comp+2]),
> 0.0f,
> > > 65535.0f));
> > > > +
> > > > +        dst[i] = (ry*r + gy*g + by*b + (0x2001<<(RGB2YUV_SHIFT-1)))
> >>
> > > RGB2YUV_SHIFT;
> > > > +    }
> > > > +}
> > >
> > > I thought you would post a patchset that in the end has 1
> lrintf/av_clipf
> > > for a function like this not 3
> > > Just asking as you arent saying this is temporary in this set nor why
> its
> > > left liek this nor does it include the factorization of these
> operations
> > >
> > >
> > Sorry I must have misunderstood. I was hoping I could leave it like this
> > temporarily as it matches the planar f32 version and address the
> > factorization separate patchset.
>
> you can, i just want to make sure its not forgotten. Maybe you can add
> some note to the commit message that this will be addressed in a future
> pachset
>
>
Okay, I'll add a note to the commit message and I'll add a comment to the
code too.


> thx
>
>
> [...]
> --
> Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> If the United States is serious about tackling the national security
> threats
> related to an insecure 5G network, it needs to rethink the extent to which
> it
> values corporate profits and government espionage over security.-Bruce
> Schneier
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2022-11-23  2:07 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-21 22:11 [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support mindmark
2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 1/4] swscale/input: add rgbaf32 input support mindmark
2022-11-22 19:42   ` Michael Niedermayer
2022-11-22 21:17     ` Mark Reid
2022-11-22 22:43       ` Michael Niedermayer
2022-11-23  2:07         ` Mark Reid
2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 2/4] avfilter/vf_hflip: add support for packed rgb float formats mindmark
2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 3/4] avfilter/vf_transpose: " mindmark
2022-11-21 22:11 ` [FFmpeg-devel] [PATCH v4 4/4] swscale/output: add rgbaf32 output support mindmark
2022-11-21 22:21 ` [FFmpeg-devel] [PATCH v4 0/4] swscale: rgbaf32 input/output support StreamNG Harold Camargo

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git