[media] soc-camera: fix rectangle adjustment in cropping
authorKoji Matsuoka <koji.matsuoka.xm@renesas.com>
Mon, 27 Feb 2017 10:23:34 +0000 (07:23 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Thu, 23 Mar 2017 17:45:59 +0000 (14:45 -0300)
update_subrect() adjusts the sub-rectangle to be inside a base area.
It checks width and height to not exceed those of the area, then it
checks the low border (left or top) to lie within the area, then the
high border (right or bottom) to lie there too. This latter check has
a bug, which is fixed by this patch.

Signed-off-by: Koji Matsuoka <koji.matsuoka.xm@renesas.com>
Signed-off-by: Yoshihiro Kaneko <ykaneko0929@gmail.com>
[g.liakhovetski@gmx.de: dropped supposedly wrong hunks]
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/platform/soc_camera/soc_scale_crop.c

index f77252d6ccd3a3c3caade41b2be891e5ddb4ed47..0116097c0c0faf8ce7db5a42032213a92ba615a2 100644 (file)
@@ -62,7 +62,8 @@ int soc_camera_client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect)
 EXPORT_SYMBOL(soc_camera_client_g_rect);
 
 /* Client crop has changed, update our sub-rectangle to remain within the area */
-static void update_subrect(struct v4l2_rect *rect, struct v4l2_rect *subrect)
+static void move_and_crop_subrect(struct v4l2_rect *rect,
+                                 struct v4l2_rect *subrect)
 {
        if (rect->width < subrect->width)
                subrect->width = rect->width;
@@ -72,14 +73,14 @@ static void update_subrect(struct v4l2_rect *rect, struct v4l2_rect *subrect)
 
        if (rect->left > subrect->left)
                subrect->left = rect->left;
-       else if (rect->left + rect->width >
+       else if (rect->left + rect->width <
                 subrect->left + subrect->width)
                subrect->left = rect->left + rect->width -
                        subrect->width;
 
        if (rect->top > subrect->top)
                subrect->top = rect->top;
-       else if (rect->top + rect->height >
+       else if (rect->top + rect->height <
                 subrect->top + subrect->height)
                subrect->top = rect->top + rect->height -
                        subrect->height;
@@ -216,7 +217,7 @@ int soc_camera_client_s_selection(struct v4l2_subdev *sd,
 
        if (!ret) {
                *target_rect = *cam_rect;
-               update_subrect(target_rect, subrect);
+               move_and_crop_subrect(target_rect, subrect);
        }
 
        return ret;
@@ -299,7 +300,7 @@ update_cache:
        if (host_1to1)
                *subrect = *rect;
        else
-               update_subrect(rect, subrect);
+               move_and_crop_subrect(rect, subrect);
 
        return 0;
 }