All of lore.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: Linux Media Mailing List <linux-media@vger.kernel.org>
Subject: Re: [PATCH] V4L: soc-camera: add selection API host operations
Date: Fri, 06 Jul 2012 00:17:59 +0200	[thread overview]
Message-ID: <2010732.dj1mZZWrvn@avalon> (raw)
In-Reply-To: <Pine.LNX.4.64.1206221749190.17552@axis700.grange>

Hi Guennadi,

Thanks for the patch.

On Friday 22 June 2012 18:40:08 Guennadi Liakhovetski wrote:
> Add .get_selection() and .set_selection() soc-camera host driver
> operations. Additionally check, that the user is not trying to change the
> output sizes during a running capture.

How will that interact with the crop operations ? The goal is to move away 
from crop operations to selection operations, so we need to establish clear 
rules.

> Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
> ---
> diff --git a/drivers/media/video/soc_camera.c
> b/drivers/media/video/soc_camera.c index 0421bf9..72798d2 100644
> --- a/drivers/media/video/soc_camera.c
> +++ b/drivers/media/video/soc_camera.c
> @@ -902,6 +902,65 @@ static int soc_camera_s_crop(struct file *file, void
> *fh, return ret;
>  }
> 
> +static int soc_camera_g_selection(struct file *file, void *fh,
> +				  struct v4l2_selection *s)
> +{
> +	struct soc_camera_device *icd = file->private_data;
> +	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
> +
> +	/* With a wrong type no need to try to fall back to cropping */
> +	if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE)
> +		return -EINVAL;
> +
> +	if (!ici->ops->get_selection)
> +		return -ENOTTY;
> +
> +	return ici->ops->get_selection(icd, s);
> +}
> +
> +static int soc_camera_s_selection(struct file *file, void *fh,
> +				  struct v4l2_selection *s)
> +{
> +	struct soc_camera_device *icd = file->private_data;
> +	struct soc_camera_host *ici = to_soc_camera_host(icd->parent);
> +	int ret;
> +
> +	/* In all these cases cropping emulation will not help */
> +	if (s->type != V4L2_BUF_TYPE_VIDEO_CAPTURE ||
> +	    (s->target != V4L2_SEL_TGT_COMPOSE_ACTIVE &&
> +	     s->target != V4L2_SEL_TGT_CROP_ACTIVE))
> +		return -EINVAL;
> +
> +	if (s->target == V4L2_SEL_TGT_COMPOSE_ACTIVE) {
> +		/* No output size change during a running capture! */
> +		if (is_streaming(ici, icd) &&
> +		    (icd->user_width != s->r.width ||
> +		     icd->user_height != s->r.height))
> +			return -EBUSY;
> +
> +		/*
> +		 * Only one user is allowed to change the output format, touch
> +		 * buffers, start / stop streaming, poll for data
> +		 */
> +		if (icd->streamer && icd->streamer != file)
> +			return -EBUSY;
> +	}
> +
> +	if (!ici->ops->set_selection)
> +		return -ENOTTY;
> +
> +	ret = ici->ops->set_selection(icd, s);
> +	if (!ret &&
> +	    s->target == V4L2_SEL_TGT_COMPOSE_ACTIVE) {
> +		icd->user_width = s->r.width;
> +		icd->user_height = s->r.height;
> +		if (!icd->streamer)
> +			icd->streamer = file;
> +	}
> +
> +	return ret;
> +}
> +
>  static int soc_camera_g_parm(struct file *file, void *fh,
>  			     struct v4l2_streamparm *a)
>  {
> @@ -1405,6 +1464,8 @@ static const struct v4l2_ioctl_ops
> soc_camera_ioctl_ops = { .vidioc_cropcap		 = soc_camera_cropcap,
>  	.vidioc_g_crop		 = soc_camera_g_crop,
>  	.vidioc_s_crop		 = soc_camera_s_crop,
> +	.vidioc_g_selection	 = soc_camera_g_selection,
> +	.vidioc_s_selection	 = soc_camera_s_selection,
>  	.vidioc_g_parm		 = soc_camera_g_parm,
>  	.vidioc_s_parm		 = soc_camera_s_parm,
>  	.vidioc_g_chip_ident     = soc_camera_g_chip_ident,
> diff --git a/include/media/soc_camera.h b/include/media/soc_camera.h
> index d865dcf..f997d6a 100644
> --- a/include/media/soc_camera.h
> +++ b/include/media/soc_camera.h
> @@ -86,6 +86,8 @@ struct soc_camera_host_ops {
>  	int (*cropcap)(struct soc_camera_device *, struct v4l2_cropcap *);
>  	int (*get_crop)(struct soc_camera_device *, struct v4l2_crop *);
>  	int (*set_crop)(struct soc_camera_device *, struct v4l2_crop *);
> +	int (*get_selection)(struct soc_camera_device *, struct v4l2_selection 
*);
> +	int (*set_selection)(struct soc_camera_device *, struct v4l2_selection
> *); /*
>  	 * The difference to .set_crop() is, that .set_livecrop is not allowed
>  	 * to change the output sizes
-- 
Regards,

Laurent Pinchart


  reply	other threads:[~2012-07-05 22:17 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-06-22 16:40 [PATCH] V4L: soc-camera: add selection API host operations Guennadi Liakhovetski
2012-07-05 22:17 ` Laurent Pinchart [this message]
2012-07-11 16:10   ` Guennadi Liakhovetski
2012-09-19 19:05     ` Laurent Pinchart

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=2010732.dj1mZZWrvn@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=g.liakhovetski@gmx.de \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.