summaryrefslogtreecommitdiff
path: root/libswscale/input.c
diff options
context:
space:
mode:
authorMark Reid <mindmark@gmail.com>2020-09-28 20:44:34 -0700
committerMichael Niedermayer <michael@niedermayer.cc>2020-10-02 14:59:52 +0200
commit453004fde6fdfeb5506947d253ec768dae1115b8 (patch)
tree2161982bd3f34c4cc4ef5a06101fc18a41608b6c /libswscale/input.c
parent6bf57c6a2a30f80f6182408c9605e11a109b0486 (diff)
libswcale/input: use more accurate rgbf32 yuv conversions
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libswscale/input.c')
-rw-r--r--libswscale/input.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/libswscale/input.c b/libswscale/input.c
index 064ed5902f..67a85b0418 100644
--- a/libswscale/input.c
+++ b/libswscale/input.c
@@ -984,15 +984,14 @@ static av_always_inline void planar_rgbf32_to_uv(uint8_t *_dstU, uint8_t *_dstV,
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];
- int bpc = 16;
- int shift = 14;
+
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 + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
- dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14);
+ 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;
}
}
@@ -1003,14 +1002,13 @@ static av_always_inline void planar_rgbf32_to_y(uint8_t *_dst, const uint8_t *_s
uint16_t *dst = (uint16_t *)_dst;
int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX];
- int bpc = 16;
- int shift = 14;
+
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 + (33 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14));
+ dst[i] = (ry*r + gy*g + by*b + (0x2001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
}
}