]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: v4l2-common: Add an helper to apply frmsize constraints
authorBoris Brezillon <boris.brezillon@collabora.com>
Tue, 28 May 2019 17:02:18 +0000 (13:02 -0400)
committerMauro Carvalho Chehab <mchehab+samsung@kernel.org>
Wed, 29 May 2019 14:48:34 +0000 (10:48 -0400)
The rockchip VPU driver is open-coding this logic which seems pretty
generic. Let's provide an helper to apply the min/max and alignment
constraints on width/height.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
drivers/media/v4l2-core/v4l2-common.c
include/media/v4l2-common.h

index 6ee9fa3bdb1830c469cba0fdf1c774671b552811..f8ad1c580a3e327c6f2defeb78c0b00aef660df9 100644 (file)
@@ -321,6 +321,16 @@ static unsigned int clamp_align(unsigned int x, unsigned int min,
        return x;
 }
 
+static unsigned int clamp_roundup(unsigned int x, unsigned int min,
+                                  unsigned int max, unsigned int alignment)
+{
+       x = clamp(x, min, max);
+       if (alignment)
+               x = round_up(x, alignment);
+
+       return x;
+}
+
 void v4l_bound_align_image(u32 *w, unsigned int wmin, unsigned int wmax,
                           unsigned int walign,
                           u32 *h, unsigned int hmin, unsigned int hmax,
@@ -531,6 +541,23 @@ static inline unsigned int v4l2_format_block_height(const struct v4l2_format_inf
        return info->block_h[plane];
 }
 
+void v4l2_apply_frmsize_constraints(u32 *width, u32 *height,
+                                   const struct v4l2_frmsize_stepwise *frmsize)
+{
+       if (!frmsize)
+               return;
+
+       /*
+        * Clamp width/height to meet min/max constraints and round it up to
+        * macroblock alignment.
+        */
+       *width = clamp_roundup(*width, frmsize->min_width, frmsize->max_width,
+                              frmsize->step_width);
+       *height = clamp_roundup(*height, frmsize->min_height, frmsize->max_height,
+                               frmsize->step_height);
+}
+EXPORT_SYMBOL_GPL(v4l2_apply_frmsize_constraints);
+
 int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt,
                        u32 pixelformat, u32 width, u32 height)
 {
index 3226bc8107cc7cde8496f00b6a320780a222c0ae..e826b154bc3589740e20ab7e979bdbf5c4e4eb45 100644 (file)
@@ -420,6 +420,8 @@ struct v4l2_format_info {
 
 const struct v4l2_format_info *v4l2_format_info(u32 format);
 
+void v4l2_apply_frmsize_constraints(u32 *width, u32 *height,
+                                   const struct v4l2_frmsize_stepwise *frmsize);
 int v4l2_fill_pixfmt(struct v4l2_pix_format *pixfmt, u32 pixelformat,
                     u32 width, u32 height);
 int v4l2_fill_pixfmt_mp(struct v4l2_pix_format_mplane *pixfmt, u32 pixelformat,