From b2720dba0f7427cf23be889f7c87ab25d9c6da85 Mon Sep 17 00:00:00 2001 From: wm4 Date: Sat, 2 May 2020 23:48:43 +0200 Subject: mp_image: add some helpers This is really basic for planar image data access; not sure why there weren't such helpers before. They also handle trickier formats that use bit-packing, or they would be mich simpler. (This affects only BGR4/BGR4/MONOW/MONOH, I hope whoever invented them is proud of triggering so many special cases for so little gain.) --- video/mp_image.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'video/mp_image.c') diff --git a/video/mp_image.c b/video/mp_image.c index dba787452e..cd0fe17713 100644 --- a/video/mp_image.c +++ b/video/mp_image.c @@ -1041,3 +1041,23 @@ void memset16_pic(void *dst, int fill, int unitsPerLine, int height, int stride) } } } + +// Pixel at the given luma position on the given plane, possibly rounded down. +void *mp_image_pixel_ptr(struct mp_image *img, int plane, int x, int y) +{ + return img->planes[plane] + + img->stride[plane] * (ptrdiff_t)(y >> img->fmt.ys[plane]) + + (size_t)(x >> img->fmt.xs[plane]) * img->fmt.bpp[plane] / 8; +} + +// Number of bytes for w pixels, using luma pixels, possibly rounded up. +// x0 is the start pixel; matters if the start pixel is rounded down. +// (E.g. 8 bpp, x0=7, w=7 => pixels 0..15 => 2 bytes) +size_t mp_image_plane_bytes(struct mp_image *img, int plane, int x0, int w) +{ + int bpp = img->fmt.bpp[plane]; + int xs = img->fmt.xs[plane]; + size_t b_x0 = (x0 >> xs) * bpp / 8; + size_t b_x1 = (((x0 + w + (1 << xs) - 1) >> xs) * bpp + 7) / 8; + return b_x1 - b_x0; +} -- cgit v1.2.3