This patch allows new drivers to work correctly with applications that use old-style crop API. The old crop ioctl is simulated by using selection ioctls. Signed-off-by: Tomasz Stanislawski <t.stanislaws@xxxxxxxxxxx> --- drivers/media/video/v4l2-ioctl.c | 85 +++++++++++++++++++++++++++++++++---- 1 files changed, 75 insertions(+), 10 deletions(-) diff --git a/drivers/media/video/v4l2-ioctl.c b/drivers/media/video/v4l2-ioctl.c index aeef966..d0a4073 100644 --- a/drivers/media/video/v4l2-ioctl.c +++ b/drivers/media/video/v4l2-ioctl.c @@ -1723,11 +1723,31 @@ static long __video_do_ioctl(struct file *file, { struct v4l2_crop *p = arg; - if (!ops->vidioc_g_crop) + 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); + } else + if (ops->vidioc_g_selection) { + /* simulate capture crop using selection api */ + struct v4l2_selection s = { + .type = p->type, + .target = V4L2_SEL_CROP_ACTIVE, + }; + + /* crop means compose for output devices */ + if (p->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) + s.target = V4L2_SEL_COMPOSE_ACTIVE; + + ret = ops->vidioc_g_selection(file, fh, &s); + + /* copying results to old structure on success */ + if (!ret) + p->c = s.r; + } else { break; + } - dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); - ret = ops->vidioc_g_crop(file, fh, p); if (!ret) dbgrect(vfd, "", &p->c); break; @@ -1736,11 +1756,25 @@ static long __video_do_ioctl(struct file *file, { struct v4l2_crop *p = arg; - if (!ops->vidioc_s_crop) - break; dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); dbgrect(vfd, "", &p->c); - ret = ops->vidioc_s_crop(file, fh, p); + + if (ops->vidioc_s_crop) { + ret = ops->vidioc_s_crop(file, fh, p); + } else { + /* simulate capture crop using selection api */ + struct v4l2_selection s = { + .type = p->type, + .target = V4L2_SEL_CROP_ACTIVE, + .r = p->c, + }; + + /* crop means compose for output devices */ + if (p->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) + s.target = V4L2_SEL_COMPOSE_ACTIVE; + + ret = ops->vidioc_g_selection(file, fh, &s); + } break; } case VIDIOC_G_SELECTION: @@ -1773,12 +1807,43 @@ static long __video_do_ioctl(struct file *file, { struct v4l2_cropcap *p = arg; - /*FIXME: Should also show v4l2_fract pixelaspect */ - if (!ops->vidioc_cropcap) + dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); + if (ops->vidioc_cropcap) { + ret = ops->vidioc_cropcap(file, fh, p); + } else + if (ops->vidioc_g_selection) { + struct v4l2_selection s = { .type = p->type }; + struct v4l2_rect bounds; + + /* obtaining bounds */ + if (p->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) + s.target = V4L2_SEL_COMPOSE_BOUNDS; + else + s.target = V4L2_SEL_CROP_BOUNDS; + ret = ops->vidioc_g_selection(file, fh, &s); + if (ret) + break; + bounds = s.r; + + /* obtaining defrect */ + if (p->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) + s.target = V4L2_SEL_COMPOSE_DEFAULT; + else + s.target = V4L2_SEL_CROP_DEFAULT; + ret = ops->vidioc_g_selection(file, fh, &s); + if (ret) + break; + + /* storing results */ + p->bounds = bounds; + p->defrect = s.r; + p->pixelaspect.numerator = 1; + p->pixelaspect.denominator = 1; + } else { break; + } - dbgarg(cmd, "type=%s\n", prt_names(p->type, v4l2_type_names)); - ret = ops->vidioc_cropcap(file, fh, p); + /*FIXME: Should also show v4l2_fract pixelaspect */ if (!ret) { dbgrect(vfd, "bounds ", &p->bounds); dbgrect(vfd, "defrect ", &p->defrect); -- 1.7.5 -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html