+#define rdpx(src) (is_be ? av_int2float(AV_RB32(src)): av_int2float(AV_RL32(src)))
+
+static av_always_inline void planar_rgbf32_to_a(uint8_t *_dst, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv)
+{
+ int i;
+ const float **src = (const float **)_src;
+ uint16_t *dst = (uint16_t *)_dst;
+
+ for (i = 0; i < width; i++) {
+ dst[i] = av_clip_uint16(lrintf(65535.0f * rdpx(src[3] + i)));
+ }
+}
+
+static av_always_inline void planar_rgbf32_to_uv(uint8_t *_dstU, uint8_t *_dstV, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv)
+{
+ int i;
+ const float **src = (const float **)_src;
+ uint16_t *dstU = (uint16_t *)_dstU;
+ uint16_t *dstV = (uint16_t *)_dstV;
+ 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];
+
+ for (i = 0; i < width; i++) {
+ int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + i)));
+ int b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i)));
+ int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + i)));
+
+ 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 planar_rgbf32_to_y(uint8_t *_dst, const uint8_t *_src[4], int width, int is_be, int32_t *rgb2yuv)
+{
+ int i;
+ const float **src = (const float **)_src;
+ uint16_t *dst = (uint16_t *)_dst;
+
+ int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
+
+ for (i = 0; i < width; i++) {
+ int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + i)));
+ int b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i)));
+ int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + i)));
+
+ dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
+ }
+}
+
+#undef rdpx
+