[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>
This commit is contained in:
parent
eec5ce013a
commit
369887411f
1 changed files with 16 additions and 5 deletions
|
@ -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 width = mf->width, height = mf->height, tmp_w, tmp_h;
|
||||||
unsigned int max_width, max_height;
|
unsigned int max_width, max_height;
|
||||||
struct v4l2_cropcap cap;
|
struct v4l2_cropcap cap;
|
||||||
|
bool ceu_1to1;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = v4l2_device_call_until_err(sd->v4l2_dev, (long)icd, video,
|
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);
|
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;
|
goto update_cache;
|
||||||
|
|
||||||
cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
cap.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
|
||||||
|
@ -1328,7 +1336,10 @@ update_cache:
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
update_subrect(cam);
|
if (ceu_1to1)
|
||||||
|
cam->subrect = cam->rect;
|
||||||
|
else
|
||||||
|
update_subrect(cam);
|
||||||
|
|
||||||
return 0;
|
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);
|
dev_geo(dev, "3: scales %u:%u\n", scale_h, scale_v);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 4. Calculate client output window by applying combined scales to real
|
* 4. Calculate desired client output window by applying combined scales
|
||||||
* input window.
|
* to client (real) input window.
|
||||||
*/
|
*/
|
||||||
mf->width = scale_down(cam->rect.width, scale_h);
|
mf->width = scale_down(cam->rect.width, scale_h);
|
||||||
mf->height = scale_down(cam->rect.height, scale_v);
|
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;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 1.-4. Calculate client output geometry */
|
/* 1.-4. Calculate desired client output geometry */
|
||||||
calculate_client_output(icd, pix, &mf);
|
calculate_client_output(icd, pix, &mf);
|
||||||
mf.field = pix->field;
|
mf.field = pix->field;
|
||||||
mf.colorspace = pix->colorspace;
|
mf.colorspace = pix->colorspace;
|
||||||
|
|
Loading…
Add table
Reference in a new issue