forked from Minki/linux
[media] v4l2-ioctl: call g_selection before calling cropcap
If the vidioc_cropcap op is implemented by the driver then the v4l2 core will call that directly. If g_selection is available, then the core cropcap implementation uses g_selection to fill in the bounds and defrect and it sets the pixelaspect to 1x1. But if both are available, then I would like to use g_selection to fill in defrect and bounds before calling cropcap. That way the driver's cropcap implementation doesn't have to set defrect or bounds. Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
This commit is contained in:
parent
865c4642e3
commit
9409945c7f
@ -1842,37 +1842,41 @@ static int v4l_cropcap(const struct v4l2_ioctl_ops *ops,
|
||||
struct file *file, void *fh, void *arg)
|
||||
{
|
||||
struct v4l2_cropcap *p = arg;
|
||||
struct v4l2_selection s = { .type = p->type };
|
||||
int ret;
|
||||
|
||||
if (ops->vidioc_cropcap)
|
||||
return ops->vidioc_cropcap(file, fh, p);
|
||||
if (ops->vidioc_g_selection) {
|
||||
struct v4l2_selection s = { .type = p->type };
|
||||
int ret;
|
||||
|
||||
/* obtaining bounds */
|
||||
if (V4L2_TYPE_IS_OUTPUT(p->type))
|
||||
s.target = V4L2_SEL_TGT_COMPOSE_BOUNDS;
|
||||
else
|
||||
s.target = V4L2_SEL_TGT_CROP_BOUNDS;
|
||||
/* obtaining bounds */
|
||||
if (V4L2_TYPE_IS_OUTPUT(p->type))
|
||||
s.target = V4L2_SEL_TGT_COMPOSE_BOUNDS;
|
||||
else
|
||||
s.target = V4L2_SEL_TGT_CROP_BOUNDS;
|
||||
|
||||
ret = ops->vidioc_g_selection(file, fh, &s);
|
||||
if (ret)
|
||||
return ret;
|
||||
p->bounds = s.r;
|
||||
ret = ops->vidioc_g_selection(file, fh, &s);
|
||||
if (ret)
|
||||
return ret;
|
||||
p->bounds = s.r;
|
||||
|
||||
/* obtaining defrect */
|
||||
if (V4L2_TYPE_IS_OUTPUT(p->type))
|
||||
s.target = V4L2_SEL_TGT_COMPOSE_DEFAULT;
|
||||
else
|
||||
s.target = V4L2_SEL_TGT_CROP_DEFAULT;
|
||||
/* obtaining defrect */
|
||||
if (V4L2_TYPE_IS_OUTPUT(p->type))
|
||||
s.target = V4L2_SEL_TGT_COMPOSE_DEFAULT;
|
||||
else
|
||||
s.target = V4L2_SEL_TGT_CROP_DEFAULT;
|
||||
|
||||
ret = ops->vidioc_g_selection(file, fh, &s);
|
||||
if (ret)
|
||||
return ret;
|
||||
p->defrect = s.r;
|
||||
ret = ops->vidioc_g_selection(file, fh, &s);
|
||||
if (ret)
|
||||
return ret;
|
||||
p->defrect = s.r;
|
||||
}
|
||||
|
||||
/* setting trivial pixelaspect */
|
||||
p->pixelaspect.numerator = 1;
|
||||
p->pixelaspect.denominator = 1;
|
||||
|
||||
if (ops->vidioc_cropcap)
|
||||
return ops->vidioc_cropcap(file, fh, p);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user