1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2025-08-15 14:13:16 +02:00

libswcale/input: use more accurate rgbf32 yuv conversions

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
Mark Reid
2020-09-28 20:44:34 -07:00
committed by Michael Niedermayer
parent 6bf57c6a2a
commit 453004fde6
3 changed files with 70 additions and 72 deletions

View File

@@ -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; uint16_t *dstV = (uint16_t *)_dstV;
int32_t ru = rgb2yuv[RU_IDX], gu = rgb2yuv[GU_IDX], bu = rgb2yuv[BU_IDX]; 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]; 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++) { for (i = 0; i < width; i++) {
int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + 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 b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i)));
int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + 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); dstU[i] = (ru*r + gu*g + bu*b + (0x10001 << (RGB2YUV_SHIFT - 1))) >> RGB2YUV_SHIFT;
dstV[i] = (rv*r + gv*g + bv*b + (257 << (RGB2YUV_SHIFT + bpc - 9))) >> (RGB2YUV_SHIFT + shift - 14); 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; uint16_t *dst = (uint16_t *)_dst;
int32_t ry = rgb2yuv[RY_IDX], gy = rgb2yuv[GY_IDX], by = rgb2yuv[BY_IDX]; 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++) { for (i = 0; i < width; i++) {
int g = av_clip_uint16(lrintf(65535.0f * rdpx(src[0] + 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 b = av_clip_uint16(lrintf(65535.0f * rdpx(src[1] + i)));
int r = av_clip_uint16(lrintf(65535.0f * rdpx(src[2] + 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;
} }
} }

View File

@@ -25,8 +25,8 @@ gbrap12be 1d9b57766ba9c2192403f43967cb9af0
gbrap12le bb1ba1c157717db3dd612a76d38a018e gbrap12le bb1ba1c157717db3dd612a76d38a018e
gbrap16be c72b935a6e57a8e1c37bff08c2db55b1 gbrap16be c72b935a6e57a8e1c37bff08c2db55b1
gbrap16le 13eb0e62b1ac9c1c86c81521eaefab5f gbrap16le 13eb0e62b1ac9c1c86c81521eaefab5f
gbrapf32be 42e53d9edccbd9e09c4cd78780ba92f3 gbrapf32be 366b804d5697276e8c481c4bdf05a00b
gbrapf32le eebf3973ef94c841f0a1ceb1ed61621d gbrapf32le 558a268e6d6b907449d1056afab78f29
gbrp dc3387f925f972c61aae7eb23cdc19f0 gbrp dc3387f925f972c61aae7eb23cdc19f0
gbrp10be 0277d4c3a8498d75e2783fb81379e481 gbrp10be 0277d4c3a8498d75e2783fb81379e481
gbrp10le f3d70f8ab845c3c9b8f7452e4a6e285a gbrp10le f3d70f8ab845c3c9b8f7452e4a6e285a
@@ -38,8 +38,8 @@ gbrp16be 5fc826cfabebfc1442cb793c4b6303e2
gbrp16le 1b3e0b63d47a3e1b6b20931316883bf2 gbrp16le 1b3e0b63d47a3e1b6b20931316883bf2
gbrp9be d9c88968001e1452ff31fbc8d16b18a0 gbrp9be d9c88968001e1452ff31fbc8d16b18a0
gbrp9le 2ccfed0816bf6bd4bb3a5b7591d9603a gbrp9le 2ccfed0816bf6bd4bb3a5b7591d9603a
gbrpf32be 4614d32e4417f80e0adcc1bdcf6cde42 gbrpf32be f3d0cefdf11c861001880772d817aac8
gbrpf32le 1366ee77e5559672260bbe51040e28b2 gbrpf32le 290468205c1c18a0667edfca45061aee
gray 221201cc7cfc4964eacd8b3e426fd276 gray 221201cc7cfc4964eacd8b3e426fd276
gray10be 9452756d0b37f4f5c7cae7635e22d747 gray10be 9452756d0b37f4f5c7cae7635e22d747
gray10le 37fd2e1ec6b66410212d39a342e864df gray10le 37fd2e1ec6b66410212d39a342e864df

View File

@@ -1,120 +1,120 @@
gbrpf32le -> yuv444p16le -> gbrpf32le gbrpf32le -> yuv444p16le -> gbrpf32le
avg diff: 0.003852 avg diff: 0.000125
min diff: 0.000000 min diff: 0.000000
max diff: 0.006638 max diff: 0.000501
gbrpf32le -> yuv444p -> gbrpf32le gbrpf32le -> yuv444p -> gbrpf32le
avg diff: 0.004316 avg diff: 0.001804
min diff: 0.000000 min diff: 0.000000
max diff: 0.012704 max diff: 0.006399
gbrpf32le -> yuv444p9le -> gbrpf32le gbrpf32le -> yuv444p9le -> gbrpf32le
avg diff: 0.004053 avg diff: 0.000906
min diff: 0.000001 min diff: 0.000000
max diff: 0.009402 max diff: 0.003313
gbrpf32le -> yuv444p10le -> gbrpf32le gbrpf32le -> yuv444p10le -> gbrpf32le
avg diff: 0.003960 avg diff: 0.000467
min diff: 0.000000 min diff: 0.000000
max diff: 0.008123 max diff: 0.001912
gbrpf32le -> yuv444p12le -> gbrpf32le gbrpf32le -> yuv444p12le -> gbrpf32le
avg diff: 0.003878 avg diff: 0.000166
min diff: 0.000000 min diff: 0.000000
max diff: 0.007011 max diff: 0.000802
gbrpf32le -> yuv444p14le -> gbrpf32le gbrpf32le -> yuv444p14le -> gbrpf32le
avg diff: 0.003868 avg diff: 0.000127
min diff: 0.000000 min diff: 0.000000
max diff: 0.006729 max diff: 0.000524
gbrpf32le -> rgb24 -> gbrpf32le gbrpf32le -> rgb24 -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> bgr24 -> gbrpf32le gbrpf32le -> bgr24 -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> rgba -> gbrpf32le gbrpf32le -> rgba -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> bgra -> gbrpf32le gbrpf32le -> bgra -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> argb -> gbrpf32le gbrpf32le -> argb -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> abgr -> gbrpf32le gbrpf32le -> abgr -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> 0rgb -> gbrpf32le gbrpf32le -> 0rgb -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> 0bgr -> gbrpf32le gbrpf32le -> 0bgr -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> rgb0 -> gbrpf32le gbrpf32le -> rgb0 -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> bgr0 -> gbrpf32le gbrpf32le -> bgr0 -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> rgb48le -> gbrpf32le gbrpf32le -> rgb48le -> gbrpf32le
avg diff: 0.003851 avg diff: 0.000249
min diff: 0.000000 min diff: 0.000000
max diff: 0.007076 max diff: 0.000990
gbrpf32le -> bgr48le -> gbrpf32le gbrpf32le -> bgr48le -> gbrpf32le
avg diff: 0.003851 avg diff: 0.000249
min diff: 0.000000 min diff: 0.000000
max diff: 0.007076 max diff: 0.000990
gbrpf32le -> rgba64le -> gbrpf32le gbrpf32le -> rgba64le -> gbrpf32le
avg diff: 0.003851 avg diff: 0.000249
min diff: 0.000000 min diff: 0.000000
max diff: 0.007076 max diff: 0.000990
gbrpf32le -> bgra64le -> gbrpf32le gbrpf32le -> bgra64le -> gbrpf32le
avg diff: 0.003851 avg diff: 0.000249
min diff: 0.000000 min diff: 0.000000
max diff: 0.007076 max diff: 0.000990
gbrpf32le -> gbrp -> gbrpf32le gbrpf32le -> gbrp -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> gbrap -> gbrpf32le gbrpf32le -> gbrap -> gbrpf32le
avg diff: 0.004122 avg diff: 0.001011
min diff: 0.000000 min diff: 0.000000
max diff: 0.008975 max diff: 0.004229
gbrpf32le -> gbrp9le -> gbrpf32le gbrpf32le -> gbrp9le -> gbrpf32le
avg diff: 0.007737 avg diff: 0.003917
min diff: 0.000000 min diff: 0.000000
max diff: 0.014009 max diff: 0.007870
gbrpf32le -> gbrp10le -> gbrpf32le gbrpf32le -> gbrp10le -> gbrpf32le
avg diff: 0.007662 avg diff: 0.003841
min diff: 0.000000 min diff: 0.000000
max diff: 0.013605 max diff: 0.007456
gbrpf32le -> gbrap10le -> gbrpf32le gbrpf32le -> gbrap10le -> gbrpf32le
avg diff: 0.007662 avg diff: 0.003841
min diff: 0.000000 min diff: 0.000000
max diff: 0.013605 max diff: 0.007456
gbrpf32le -> gbrp12le -> gbrpf32le gbrpf32le -> gbrp12le -> gbrpf32le
avg diff: 0.007622 avg diff: 0.003796
min diff: 0.000000 min diff: 0.000000
max diff: 0.013335 max diff: 0.007140
gbrpf32le -> gbrap12le -> gbrpf32le gbrpf32le -> gbrap12le -> gbrpf32le
avg diff: 0.007622 avg diff: 0.003796
min diff: 0.000000 min diff: 0.000000
max diff: 0.013335 max diff: 0.007140
gbrpf32le -> gbrp14le -> gbrpf32le gbrpf32le -> gbrp14le -> gbrpf32le
avg diff: 0.007620 avg diff: 0.003792
min diff: 0.000000 min diff: 0.000000
max diff: 0.013232 max diff: 0.007034
gbrpf32le -> gbrp16le -> gbrpf32le gbrpf32le -> gbrp16le -> gbrpf32le
avg diff: 0.007680 avg diff: 0.003853
min diff: 0.000000 min diff: 0.000000
max diff: 0.013275 max diff: 0.007098
gbrpf32le -> gbrap16le -> gbrpf32le gbrpf32le -> gbrap16le -> gbrpf32le
avg diff: 0.007680 avg diff: 0.003853
min diff: 0.000000 min diff: 0.000000
max diff: 0.013275 max diff: 0.007098