diff options
author | Sergey Lavrushkin <dualfal@gmail.com> | 2018-08-03 18:06:50 +0300 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2018-08-14 18:22:39 +0200 |
commit | 582bc5a348f5cd12b6ad3be4ecbee71bc082ea32 (patch) | |
tree | 8d53324a7a2b107bf4541740c07a6fcc4640f3b1 /libswscale/input.c | |
parent | 551a029a181abe2b7b6f16e9631423a12e9fcae9 (diff) |
libswscale: Adds conversions from/to float gray format.
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libswscale/input.c')
-rw-r--r-- | libswscale/input.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/libswscale/input.c b/libswscale/input.c index 3fd3a5d81e..4099c19c2b 100644 --- a/libswscale/input.c +++ b/libswscale/input.c @@ -942,6 +942,30 @@ static av_always_inline void planar_rgb16_to_uv(uint8_t *_dstU, uint8_t *_dstV, } #undef rdpx +static av_always_inline void grayf32ToY16_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, + const uint8_t *unused2, int width, uint32_t *unused) +{ + 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 * src[i])); + } +} + +static av_always_inline void grayf32ToY16_bswap_c(uint8_t *_dst, const uint8_t *_src, const uint8_t *unused1, + const uint8_t *unused2, int width, uint32_t *unused) +{ + int i; + const uint32_t *src = (const uint32_t *)_src; + uint16_t *dst = (uint16_t *)_dst; + + for (i = 0; i < width; ++i){ + dst[i] = av_clip_uint16(lrintf(65535.0f * av_int2float(av_bswap32(src[i])))); + } +} + #define rgb9plus_planar_funcs_endian(nbits, endian_name, endian) \ static void planar_rgb##nbits##endian_name##_to_y(uint8_t *dst, const uint8_t *src[4], \ int w, int32_t *rgb2yuv) \ @@ -1538,6 +1562,20 @@ av_cold void ff_sws_init_input_funcs(SwsContext *c) case AV_PIX_FMT_P010BE: c->lumToYV12 = p010BEToY_c; break; + case AV_PIX_FMT_GRAYF32LE: +#if HAVE_BIGENDIAN + c->lumToYV12 = grayf32ToY16_bswap_c; +#else + c->lumToYV12 = grayf32ToY16_c; +#endif + break; + case AV_PIX_FMT_GRAYF32BE: +#if HAVE_BIGENDIAN + c->lumToYV12 = grayf32ToY16_c; +#else + c->lumToYV12 = grayf32ToY16_bswap_c; +#endif + break; } if (c->needAlpha) { if (is16BPS(srcFormat) || isNBPS(srcFormat)) { |