Commit 8bc4793b authored by Koji Matsuoka's avatar Koji Matsuoka Committed by Mauro Carvalho Chehab

[media] soc-camera: fix rectangle adjustment in cropping

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: default avatarKoji Matsuoka <koji.matsuoka.xm@renesas.com>
Signed-off-by: default avatarYoshihiro Kaneko <ykaneko0929@gmail.com>
[g.liakhovetski@gmx.de: dropped supposedly wrong hunks]
Signed-off-by: default avatarGuennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent 6713c88f
...@@ -62,7 +62,8 @@ int soc_camera_client_g_rect(struct v4l2_subdev *sd, struct v4l2_rect *rect) ...@@ -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); EXPORT_SYMBOL(soc_camera_client_g_rect);
/* Client crop has changed, update our sub-rectangle to remain within the area */ /* 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) if (rect->width < subrect->width)
subrect->width = rect->width; subrect->width = rect->width;
...@@ -72,14 +73,14 @@ static void update_subrect(struct v4l2_rect *rect, struct v4l2_rect *subrect) ...@@ -72,14 +73,14 @@ static void update_subrect(struct v4l2_rect *rect, struct v4l2_rect *subrect)
if (rect->left > subrect->left) if (rect->left > subrect->left)
subrect->left = rect->left; subrect->left = rect->left;
else if (rect->left + rect->width > else if (rect->left + rect->width <
subrect->left + subrect->width) subrect->left + subrect->width)
subrect->left = rect->left + rect->width - subrect->left = rect->left + rect->width -
subrect->width; subrect->width;
if (rect->top > subrect->top) if (rect->top > subrect->top)
subrect->top = rect->top; subrect->top = rect->top;
else if (rect->top + rect->height > else if (rect->top + rect->height <
subrect->top + subrect->height) subrect->top + subrect->height)
subrect->top = rect->top + rect->height - subrect->top = rect->top + rect->height -
subrect->height; subrect->height;
...@@ -216,7 +217,7 @@ int soc_camera_client_s_selection(struct v4l2_subdev *sd, ...@@ -216,7 +217,7 @@ int soc_camera_client_s_selection(struct v4l2_subdev *sd,
if (!ret) { if (!ret) {
*target_rect = *cam_rect; *target_rect = *cam_rect;
update_subrect(target_rect, subrect); move_and_crop_subrect(target_rect, subrect);
} }
return ret; return ret;
...@@ -299,7 +300,7 @@ static int client_set_fmt(struct soc_camera_device *icd, ...@@ -299,7 +300,7 @@ static int client_set_fmt(struct soc_camera_device *icd,
if (host_1to1) if (host_1to1)
*subrect = *rect; *subrect = *rect;
else else
update_subrect(rect, subrect); move_and_crop_subrect(rect, subrect);
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment