summaryrefslogtreecommitdiff
path: root/libswscale/input.c
diff options
context:
space:
mode:
authorSergey Lavrushkin <dualfal@gmail.com>2018-08-03 18:06:50 +0300
committerMichael Niedermayer <michael@niedermayer.cc>2018-08-14 18:22:39 +0200
commit582bc5a348f5cd12b6ad3be4ecbee71bc082ea32 (patch)
tree8d53324a7a2b107bf4541740c07a6fcc4640f3b1 /libswscale/input.c
parent551a029a181abe2b7b6f16e9631423a12e9fcae9 (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.c38
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)) {