Hi Hans,

A few comments below.

On Thu, Dec 04, 2014 at 10:54:59AM +0100, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verk...@cisco.com>
> 
> Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
> ---
>  drivers/media/i2c/ak881x.c                         |  32 +++--
>  drivers/media/i2c/soc_camera/imx074.c              |  46 ++++----
>  drivers/media/i2c/soc_camera/mt9m001.c             |  74 +++++++-----
>  drivers/media/i2c/soc_camera/mt9m111.c             |  61 +++++-----
>  drivers/media/i2c/soc_camera/mt9t031.c             |  56 +++++----
>  drivers/media/i2c/soc_camera/mt9t112.c             |  64 +++++-----
>  drivers/media/i2c/soc_camera/mt9v022.c             |  72 +++++++-----
>  drivers/media/i2c/soc_camera/ov2640.c              |  45 ++++---
>  drivers/media/i2c/soc_camera/ov5642.c              |  57 +++++----
>  drivers/media/i2c/soc_camera/ov6650.c              |  78 +++++++------
>  drivers/media/i2c/soc_camera/ov772x.c              |  48 ++++----
>  drivers/media/i2c/soc_camera/ov9640.c              |  45 ++++---
>  drivers/media/i2c/soc_camera/ov9740.c              |  49 ++++----
>  drivers/media/i2c/soc_camera/rj54n1cb0c.c          |  56 +++++----
>  drivers/media/i2c/soc_camera/tw9910.c              |  51 +++-----
>  drivers/media/i2c/tvp5150.c                        |  85 +++++++-------
>  drivers/media/platform/omap3isp/ispvideo.c         |  88 +++++++++-----
>  drivers/media/platform/sh_vou.c                    |  13 ++-
>  drivers/media/platform/soc_camera/mx2_camera.c     |  18 ++-
>  drivers/media/platform/soc_camera/mx3_camera.c     |  18 ++-
>  drivers/media/platform/soc_camera/omap1_camera.c   |  23 ++--
>  drivers/media/platform/soc_camera/pxa_camera.c     |  17 ++-
>  drivers/media/platform/soc_camera/rcar_vin.c       |  26 ++---
>  .../platform/soc_camera/sh_mobile_ceu_camera.c     |  32 +++--
>  drivers/media/platform/soc_camera/soc_camera.c     | 130 
> ++++++---------------
>  .../platform/soc_camera/soc_camera_platform.c      |  49 ++++----
>  drivers/media/platform/soc_camera/soc_scale_crop.c |  85 ++++++++------
>  drivers/media/platform/soc_camera/soc_scale_crop.h |   6 +-
>  drivers/staging/media/omap4iss/iss_video.c         |  88 +++++++++-----
>  include/media/soc_camera.h                         |   7 +-
>  include/media/v4l2-subdev.h                        |   3 -
>  31 files changed, 805 insertions(+), 717 deletions(-)
> 
> diff --git a/drivers/media/i2c/ak881x.c b/drivers/media/i2c/ak881x.c
> index 69aeaf3..29d3b2a 100644
> --- a/drivers/media/i2c/ak881x.c
> +++ b/drivers/media/i2c/ak881x.c
> @@ -128,21 +128,27 @@ static int ak881x_enum_mbus_fmt(struct v4l2_subdev *sd, 
> unsigned int index,
>       return 0;
>  }
>  
> -static int ak881x_cropcap(struct v4l2_subdev *sd, struct v4l2_cropcap *a)
> +static int ak881x_get_selection(struct v4l2_subdev *sd,
> +                             struct v4l2_subdev_pad_config *cfg,
> +                             struct v4l2_subdev_selection *sel)
>  {
>       struct i2c_client *client = v4l2_get_subdevdata(sd);
>       struct ak881x *ak881x = to_ak881x(client);
>  
> -     a->bounds.left                  = 0;
> -     a->bounds.top                   = 0;
> -     a->bounds.width                 = 720;
> -     a->bounds.height                = ak881x->lines;
> -     a->defrect                      = a->bounds;
> -     a->type                         = V4L2_BUF_TYPE_VIDEO_OUTPUT;
> -     a->pixelaspect.numerator        = 1;
> -     a->pixelaspect.denominator      = 1;
> +     if (sel->which != V4L2_SUBDEV_FORMAT_ACTIVE)
> +             return -EINVAL;
>  
> -     return 0;
> +     switch (sel->target) {
> +     case V4L2_SEL_TGT_CROP_BOUNDS:
> +     case V4L2_SEL_TGT_CROP_DEFAULT:

The default targets are currently documented not to be applicable to the
V4L2 sub-device interface. I have to say I don't remember why that was the
conclusion, but could have as well been that there was no need for them at
the time.

Still the documentation
(Documentation/DocBook/media/v4l/selections-common.xml) should be changed to
reflect this.

> +             sel->r.left = 0;
> +             sel->r.top = 0;
> +             sel->r.width = 720;
> +             sel->r.height = ak881x->lines;
> +             return 0;
> +     default:
> +             return -EINVAL;
> +     }
>  }
>  
...

> diff --git a/drivers/staging/media/omap4iss/iss_video.c 
> b/drivers/staging/media/omap4iss/iss_video.c
> index cdee596..65dd272 100644
> --- a/drivers/staging/media/omap4iss/iss_video.c
> +++ b/drivers/staging/media/omap4iss/iss_video.c
> @@ -643,40 +643,45 @@ iss_video_try_format(struct file *file, void *fh, 
> struct v4l2_format *format)
>  }
>  
>  static int
> -iss_video_cropcap(struct file *file, void *fh, struct v4l2_cropcap *cropcap)
> -{
> -     struct iss_video *video = video_drvdata(file);
> -     struct v4l2_subdev *subdev;
> -     int ret;
> -
> -     subdev = iss_video_remote_subdev(video, NULL);
> -     if (subdev == NULL)
> -             return -EINVAL;
> -
> -     mutex_lock(&video->mutex);
> -     ret = v4l2_subdev_call(subdev, video, cropcap, cropcap);
> -     mutex_unlock(&video->mutex);
> -
> -     return ret == -ENOIOCTLCMD ? -ENOTTY : ret;
> -}
> -
> -static int
> -iss_video_get_crop(struct file *file, void *fh, struct v4l2_crop *crop)
> +iss_video_get_selection(struct file *file, void *fh, struct v4l2_selection 
> *sel)
>  {
>       struct iss_video *video = video_drvdata(file);
>       struct v4l2_subdev_format format;
>       struct v4l2_subdev *subdev;
> +     struct v4l2_subdev_selection sdsel = {
> +             .which = V4L2_SUBDEV_FORMAT_ACTIVE,
> +             .target = sel->target,
> +     };
>       u32 pad;
>       int ret;
>  
> +     switch (sel->target) {
> +     case V4L2_SEL_TGT_CROP:
> +     case V4L2_SEL_TGT_CROP_BOUNDS:
> +     case V4L2_SEL_TGT_CROP_DEFAULT:
> +             if (video->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
> +                     return -EINVAL;
> +             break;
> +     case V4L2_SEL_TGT_COMPOSE:
> +     case V4L2_SEL_TGT_COMPOSE_BOUNDS:
> +     case V4L2_SEL_TGT_COMPOSE_DEFAULT:
> +             if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
> +                     return -EINVAL;
> +             break;
> +     default:
> +             return -EINVAL;
> +     }
>       subdev = iss_video_remote_subdev(video, &pad);
>       if (subdev == NULL)
>               return -EINVAL;
>  
> -     /* Try the get crop operation first and fallback to get format if not
> +     /* Try the get selection operation first and fallback to get format if 
> not
>        * implemented.
>        */
> -     ret = v4l2_subdev_call(subdev, video, g_crop, crop);
> +     sdsel.pad = pad;
> +     ret = v4l2_subdev_call(subdev, pad, get_selection, NULL, &sdsel);
> +     if (!ret)
> +             sel->r = sdsel.r;
>       if (ret != -ENOIOCTLCMD)
>               return ret;
>  
> @@ -686,28 +691,50 @@ iss_video_get_crop(struct file *file, void *fh, struct 
> v4l2_crop *crop)
>       if (ret < 0)
>               return ret == -ENOIOCTLCMD ? -ENOTTY : ret;
>  
> -     crop->c.left = 0;
> -     crop->c.top = 0;
> -     crop->c.width = format.format.width;
> -     crop->c.height = format.format.height;
> +     sel->r.left = 0;
> +     sel->r.top = 0;
> +     sel->r.width = format.format.width;
> +     sel->r.height = format.format.height;
>  
>       return 0;
>  }
>  
>  static int
> -iss_video_set_crop(struct file *file, void *fh, const struct v4l2_crop *crop)
> +iss_video_set_selection(struct file *file, void *fh, struct v4l2_selection 
> *sel)
>  {
>       struct iss_video *video = video_drvdata(file);
>       struct v4l2_subdev *subdev;
> +     struct v4l2_subdev_selection sdsel = {
> +             .which = V4L2_SUBDEV_FORMAT_ACTIVE,
> +             .target = sel->target,
> +             .flags = sel->flags,
> +             .r = sel->r,
> +     };
> +     u32 pad;
>       int ret;
>  
> -     subdev = iss_video_remote_subdev(video, NULL);
> +     switch (sel->target) {
> +     case V4L2_SEL_TGT_CROP:
> +             if (video->type == V4L2_BUF_TYPE_VIDEO_OUTPUT)
> +                     return -EINVAL;
> +             break;
> +     case V4L2_SEL_TGT_COMPOSE:
> +             if (video->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
> +                     return -EINVAL;
> +             break;
> +     default:
> +             return -EINVAL;
> +     }
> +     subdev = iss_video_remote_subdev(video, &pad);
>       if (subdev == NULL)
>               return -EINVAL;
>  
> +     sdsel.pad = pad;
>       mutex_lock(&video->mutex);
> -     ret = v4l2_subdev_call(subdev, video, s_crop, crop);
> +     ret = v4l2_subdev_call(subdev, pad, set_selection, NULL, &sdsel);

None of the omap4iss sub-devices support crop nor selection. I think this is
a leftover from a time when cropping was supported on some of the video node
of the omap3isp driver.

The compose target has never been supported on video nodes by either
drivers, so I suggest to remove the references to that from this patch.

I can submit a patch to remove support for crop on video nodes for both.

>       mutex_unlock(&video->mutex);
> +     if (!ret)
> +             sel->r = sdsel.r;
>  
>       return ret == -ENOIOCTLCMD ? -ENOTTY : ret;
>  }
> @@ -1013,9 +1040,8 @@ static const struct v4l2_ioctl_ops iss_video_ioctl_ops 
> = {
>       .vidioc_g_fmt_vid_out           = iss_video_get_format,
>       .vidioc_s_fmt_vid_out           = iss_video_set_format,
>       .vidioc_try_fmt_vid_out         = iss_video_try_format,
> -     .vidioc_cropcap                 = iss_video_cropcap,
> -     .vidioc_g_crop                  = iss_video_get_crop,
> -     .vidioc_s_crop                  = iss_video_set_crop,
> +     .vidioc_g_selection             = iss_video_get_selection,
> +     .vidioc_s_selection             = iss_video_set_selection,
>       .vidioc_g_parm                  = iss_video_get_param,
>       .vidioc_s_parm                  = iss_video_set_param,
>       .vidioc_reqbufs                 = iss_video_reqbufs,

-- 
Kind regards,

Sakari Ailus
e-mail: sakari.ai...@iki.fi     XMPP: sai...@retiisi.org.uk
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to