Commit 992efeff authored by Tomasz Stanislawski's avatar Tomasz Stanislawski Committed by Mauro Carvalho Chehab

[media] v4l: emulate old crop API using extended crop/compose API

This patch allows new video drivers to work correctly with applications that
use the old-style crop API.  The old crop ioctl is emulated by using selection
callbacks.
Signed-off-by: default avatarTomasz Stanislawski <t.stanislaws@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 8af4922f
...@@ -1549,11 +1549,32 @@ static long __video_do_ioctl(struct file *file, ...@@ -1549,11 +1549,32 @@ static long __video_do_ioctl(struct file *file,
{ {
struct v4l2_crop *p = arg; struct v4l2_crop *p = arg;
if (!ops->vidioc_g_crop) if (!ops->vidioc_g_crop && !ops->vidioc_g_selection)
break; break;
dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
if (ops->vidioc_g_crop) {
ret = ops->vidioc_g_crop(file, fh, p); ret = ops->vidioc_g_crop(file, fh, p);
} else {
/* simulate capture crop using selection api */
struct v4l2_selection s = {
.type = p->type,
};
/* crop means compose for output devices */
if (V4L2_TYPE_IS_OUTPUT(p->type))
s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE;
else
s.target = V4L2_SEL_TGT_CROP_ACTIVE;
ret = ops->vidioc_g_selection(file, fh, &s);
/* copying results to old structure on success */
if (!ret)
p->c = s.r;
}
if (!ret) if (!ret)
dbgrect(vfd, "", &p->c); dbgrect(vfd, "", &p->c);
break; break;
...@@ -1562,15 +1583,33 @@ static long __video_do_ioctl(struct file *file, ...@@ -1562,15 +1583,33 @@ static long __video_do_ioctl(struct file *file,
{ {
struct v4l2_crop *p = arg; struct v4l2_crop *p = arg;
if (!ops->vidioc_s_crop) if (!ops->vidioc_s_crop && !ops->vidioc_s_selection)
break; break;
if (ret_prio) { if (ret_prio) {
ret = ret_prio; ret = ret_prio;
break; break;
} }
dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
dbgrect(vfd, "", &p->c); dbgrect(vfd, "", &p->c);
if (ops->vidioc_s_crop) {
ret = ops->vidioc_s_crop(file, fh, p); ret = ops->vidioc_s_crop(file, fh, p);
} else {
/* simulate capture crop using selection api */
struct v4l2_selection s = {
.type = p->type,
.r = p->c,
};
/* crop means compose for output devices */
if (V4L2_TYPE_IS_OUTPUT(p->type))
s.target = V4L2_SEL_TGT_COMPOSE_ACTIVE;
else
s.target = V4L2_SEL_TGT_CROP_ACTIVE;
ret = ops->vidioc_s_selection(file, fh, &s);
}
break; break;
} }
case VIDIOC_G_SELECTION: case VIDIOC_G_SELECTION:
...@@ -1610,11 +1649,42 @@ static long __video_do_ioctl(struct file *file, ...@@ -1610,11 +1649,42 @@ static long __video_do_ioctl(struct file *file,
struct v4l2_cropcap *p = arg; struct v4l2_cropcap *p = arg;
/*FIXME: Should also show v4l2_fract pixelaspect */ /*FIXME: Should also show v4l2_fract pixelaspect */
if (!ops->vidioc_cropcap) if (!ops->vidioc_cropcap && !ops->vidioc_g_selection)
break; break;
dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names));
if (ops->vidioc_cropcap) {
ret = ops->vidioc_cropcap(file, fh, p); ret = ops->vidioc_cropcap(file, fh, p);
} else {
struct v4l2_selection s = { .type = p->type };
/* 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)
break;
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;
ret = ops->vidioc_g_selection(file, fh, &s);
if (ret)
break;
p->defrect = s.r;
/* setting trivial pixelaspect */
p->pixelaspect.numerator = 1;
p->pixelaspect.denominator = 1;
}
if (!ret) { if (!ret) {
dbgrect(vfd, "bounds ", &p->bounds); dbgrect(vfd, "bounds ", &p->bounds);
dbgrect(vfd, "defrect ", &p->defrect); dbgrect(vfd, "defrect ", &p->defrect);
......
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