diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2011-07-22 14:44:40 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-11-03 21:27:09 +0100 |
commit | 369887411fb0f35585035aa7c253dc7fbe15cbc8 (patch) | |
tree | 5b181b03a08ed6573d4cf9a7c8a728481c213134 /drivers | |
parent | [media] V4L: sh_mobile_ceu_camera: output image sizes must be a multiple of 4 (diff) | |
download | linux-369887411fb0f35585035aa7c253dc7fbe15cbc8.tar.xz linux-369887411fb0f35585035aa7c253dc7fbe15cbc8.zip |
[media] V4L: sh_mobile_ceu_camera: don't try to improve client scaling, if perfect
If the client has managed to configure the precise output format,
we don't have to try to further improve it.
Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/media/video/sh_mobile_ceu_camera.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/media/video/sh_mobile_ceu_camera.c b/drivers/media/video/sh_mobile_ceu_camera.c index f753df14aa3f..b44f318aa011 100644 --- a/drivers/media/video/sh_mobile_ceu_camera.c +++ b/drivers/media/video/sh_mobile_ceu_camera.c @@ -1279,6 +1279,7 @@ static int client_s_fmt(struct soc_camera_device *icd, unsigned int width = mf->width, height = mf->height, tmp_w, tmp_h; unsigned int max_width, max_height; struct v4l2_cropcap cap; + bool ceu_1to1; int ret; ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video, @@ -1288,7 +1289,14 @@ static int client_s_fmt(struct soc_camera_device *icd, dev_geo(dev, "camera scaled to %ux%u\n", mf->width, mf->height); - if ((width == mf->width && height == mf->height) || !ceu_can_scale) + if (width == mf->width && height == mf->height) { + /* Perfect! The client has done it all. */ + ceu_1to1 = true; + goto update_cache; + } + + ceu_1to1 = false; + if (!ceu_can_scale) goto update_cache; cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; @@ -1328,7 +1336,10 @@ update_cache: if (ret < 0) return ret; - update_subrect(cam); + if (ceu_1to1) + cam->subrect = cam->rect; + else + update_subrect(cam); return 0; } @@ -1579,8 +1590,8 @@ static void calculate_client_output(struct soc_camera_device *icd, dev_geo(dev, "3: scales %u:%u\n", scale_h, scale_v); /* - * 4. Calculate client output window by applying combined scales to real - * input window. + * 4. Calculate desired client output window by applying combined scales + * to client (real) input window. */ mf->width = scale_down(cam->rect.width, scale_h); mf->height = scale_down(cam->rect.height, scale_v); @@ -1627,7 +1638,7 @@ static int sh_mobile_ceu_set_fmt(struct soc_camera_device *icd, return -EINVAL; } - /* 1.-4. Calculate client output geometry */ + /* 1.-4. Calculate desired client output geometry */ calculate_client_output(icd, pix, &mf); mf.field = pix->field; mf.colorspace = pix->colorspace; |