Linux Media Controller development
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: "Niklas Söderlund" <niklas.soderlund+renesas@ragnatech.se>
Cc: Hans Verkuil <hverkuil@xs4all.nl>,
	linux-media@vger.kernel.org, linux-renesas-soc@vger.kernel.org,
	tomoharu.fukawa.eb@renesas.com,
	Kieran Bingham <kieran.bingham@ideasonboard.com>
Subject: Re: [PATCH v13 16/33] rcar-vin: simplify how formats are set and reset
Date: Wed, 04 Apr 2018 01:09:29 +0300	[thread overview]
Message-ID: <1544952.AcMr2TBica@avalon> (raw)
In-Reply-To: <20180326214456.6655-17-niklas.soderlund+renesas@ragnatech.se>

Hi Niklas,

Thank you for the patch.

On Tuesday, 27 March 2018 00:44:39 EEST Niklas Söderlund wrote:
> With the recent cleanup of the format code to prepare for Gen3 it's
> possible to simplify the Gen2 format code path as well. Clean up the
> process by defining two functions to handle the set format and reset of
> format when the standard is changed.
> 
> While at it replace the driver local struct rvin_source_fmt with a
> struct v4l2_rect as all it's used for is keep track of the source
> dimensions.

I wonder whether we should introduce v4l2_size (or <insert your preferred name 
here>) when all we need is width and height, as v4l2_rect stores the top and 
left offsets too. This doesn't have to be fixed here though.

> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> Reviewed-by: Hans Verkuil <hans.verkuil@cisco.com>
> 
> ---
> 
> * Changes since v11
> - This patch where 'rcar-vin: read subdevice format for crop only when
> needed'
> - Keep caching the source dimensions and drop all changes to
> rvin_g_selection() and rvin_s_selection().
> - Inline rvin_get_vin_format_from_source() into rvin_reset_format()
> which now is the only user left.
> ---
>  drivers/media/platform/rcar-vin/rcar-v4l2.c | 116 +++++++++++--------------
>  drivers/media/platform/rcar-vin/rcar-vin.h  |  14 +---
>  2 files changed, 52 insertions(+), 78 deletions(-)
> 
> diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> b/drivers/media/platform/rcar-vin/rcar-v4l2.c index
> c39891386576afb8..c4be0bcb8b16f941 100644
> --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> @@ -138,67 +138,60 @@ static int rvin_format_align(struct rvin_dev *vin,
> struct v4l2_pix_format *pix) * V4L2
>   */
> 
> -static void rvin_reset_crop_compose(struct rvin_dev *vin)
> -{
> -	vin->crop.top = vin->crop.left = 0;
> -	vin->crop.width = vin->source.width;
> -	vin->crop.height = vin->source.height;
> -
> -	vin->compose.top = vin->compose.left = 0;
> -	vin->compose.width = vin->format.width;
> -	vin->compose.height = vin->format.height;
> -}
> -
>  static int rvin_reset_format(struct rvin_dev *vin)
>  {
>  	struct v4l2_subdev_format fmt = {
>  		.which = V4L2_SUBDEV_FORMAT_ACTIVE,
> +		.pad = vin->digital->source_pad,
>  	};
> -	struct v4l2_mbus_framefmt *mf = &fmt.format;
>  	int ret;
> 
> -	fmt.pad = vin->digital->source_pad;
> -
>  	ret = v4l2_subdev_call(vin_to_source(vin), pad, get_fmt, NULL, &fmt);
>  	if (ret)
>  		return ret;
> 
> -	vin->format.width	= mf->width;
> -	vin->format.height	= mf->height;
> -	vin->format.colorspace	= mf->colorspace;
> -	vin->format.field	= mf->field;
> +	v4l2_fill_pix_format(&vin->format, &fmt.format);
> 
> -	rvin_reset_crop_compose(vin);
> +	ret = rvin_format_align(vin, &vin->format);
> +	if (ret)
> +		return ret;

rvin_format_align() always returns 0 so you can remove the error check. You 
can actually turn the function into a void function.

> -	vin->format.bytesperline = rvin_format_bytesperline(&vin->format);
> -	vin->format.sizeimage = rvin_format_sizeimage(&vin->format);
> +	vin->source.top = vin->crop.top = 0;
> +	vin->source.left = vin->crop.left = 0;
> +	vin->source.width = vin->crop.width = vin->format.width;
> +	vin->source.height = vin->crop.height = vin->format.height;

I find multiple assignations on the same line hard to read. How about

	vin->source.top = 0;
	vin->source.left = 0;
	vin->source.width = vin->format.width;
	vin->source.height = vin->format.height;

	vin->crop = vin->source;
	vin->compose = vin->source;

> +	vin->compose.top = vin->compose.left = 0;
> +	vin->compose.width = vin->format.width;
> +	vin->compose.height = vin->format.height;
> 
>  	return 0;
>  }

I like the new rvin_reset_format(), it's much simpler.

> -static int __rvin_try_format_source(struct rvin_dev *vin,
> -				    u32 which,
> -				    struct v4l2_pix_format *pix,
> -				    struct rvin_source_fmt *source)
> +static int rvin_try_format(struct rvin_dev *vin, u32 which,
> +			   struct v4l2_pix_format *pix,
> +			   struct v4l2_rect *crop, struct v4l2_rect *compose)
>  {
> -	struct v4l2_subdev *sd;
> +	struct v4l2_subdev *sd = vin_to_source(vin);
>  	struct v4l2_subdev_pad_config *pad_cfg;
>  	struct v4l2_subdev_format format = {
>  		.which = which,
> +		.pad = vin->digital->source_pad,
>  	};
>  	enum v4l2_field field;
>  	u32 width, height;
>  	int ret;
> 
> -	sd = vin_to_source(vin);
> -
> -	v4l2_fill_mbus_format(&format.format, pix, vin->digital->code);
> -
>  	pad_cfg = v4l2_subdev_alloc_pad_config(sd);
>  	if (pad_cfg == NULL)
>  		return -ENOMEM;
> 
> -	format.pad = vin->digital->source_pad;
> +	if (!rvin_format_from_pixel(pix->pixelformat) ||
> +	    (vin->info->model == RCAR_M1 &&
> +	     pix->pixelformat == V4L2_PIX_FMT_XBGR32))
> +		pix->pixelformat = RVIN_DEFAULT_FORMAT;
> +
> +	v4l2_fill_mbus_format(&format.format, pix, vin->digital->code);
> 
>  	/* Allow the video device to override field and to scale */
>  	field = pix->field;
> @@ -211,8 +204,16 @@ static int __rvin_try_format_source(struct rvin_dev
> *vin,
> 
>  	v4l2_fill_pix_format(pix, &format.format);
> 
> -	source->width = pix->width;
> -	source->height = pix->height;
> +	crop->top = crop->left = 0;

I'd split this in two lines, it would be easier to read.

> +	crop->width = pix->width;
> +	crop->height = pix->height;
> +
> +	/*
> +	 * If source is ALTERNATE the driver will use the VIN hardware
> +	 * to INTERLACE it. The crop height then needs to be doubled.
> +	 */
> +	if (pix->field == V4L2_FIELD_ALTERNATE)
> +		crop->height *= 2;

You're duplicating this logic in rvin_format_align() so it makes me feel that 
there's still room for some simplification, but that can be done in a separate 
patch (or I could simply be wrong).

>  	if (field != V4L2_FIELD_ANY)
>  		pix->field = field;
> @@ -220,32 +221,17 @@ static int __rvin_try_format_source(struct rvin_dev
> *vin, pix->width = width;
>  	pix->height = height;
> 
> -	vin_dbg(vin, "Source resolution: %ux%u\n", source->width,
> -		source->height);
> +	ret = rvin_format_align(vin, pix);
> +	if (ret)
> +		return ret;
> 
> +	compose->top = compose->left = 0;

Ditto.

> +	compose->width = pix->width;
> +	compose->height = pix->height;
>  done:
>  	v4l2_subdev_free_pad_config(pad_cfg);
> -	return ret;
> -}
> 
> -static int __rvin_try_format(struct rvin_dev *vin,
> -			     u32 which,
> -			     struct v4l2_pix_format *pix,
> -			     struct rvin_source_fmt *source)
> -{
> -	int ret;
> -
> -	if (!rvin_format_from_pixel(pix->pixelformat) ||
> -	    (vin->info->model == RCAR_M1 &&
> -	     pix->pixelformat == V4L2_PIX_FMT_XBGR32))
> -		pix->pixelformat = RVIN_DEFAULT_FORMAT;
> -
> -	/* Limit to source capabilities */
> -	ret = __rvin_try_format_source(vin, which, pix, source);
> -	if (ret)
> -		return ret;
> -
> -	return rvin_format_align(vin, pix);
> +	return 0;
>  }
> 
>  static int rvin_querycap(struct file *file, void *priv,
> @@ -264,33 +250,31 @@ static int rvin_try_fmt_vid_cap(struct file *file,
> void *priv, struct v4l2_format *f)
>  {
>  	struct rvin_dev *vin = video_drvdata(file);
> -	struct rvin_source_fmt source;
> +	struct v4l2_rect crop, compose;
> 
> -	return __rvin_try_format(vin, V4L2_SUBDEV_FORMAT_TRY, &f->fmt.pix,
> -				 &source);
> +	return rvin_try_format(vin, V4L2_SUBDEV_FORMAT_TRY, &f->fmt.pix, &crop,
> +			       &compose);

How about making crop and compose optional in rvin_try_format() to avoid a 
need for the two local variables here ?

Apart from these small issues, I think this is a nice simplification,

Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

>  }
> 
>  static int rvin_s_fmt_vid_cap(struct file *file, void *priv,
>  			      struct v4l2_format *f)
>  {
>  	struct rvin_dev *vin = video_drvdata(file);
> -	struct rvin_source_fmt source;
> +	struct v4l2_rect crop, compose;
>  	int ret;
> 
>  	if (vb2_is_busy(&vin->queue))
>  		return -EBUSY;
> 
> -	ret = __rvin_try_format(vin, V4L2_SUBDEV_FORMAT_ACTIVE, &f->fmt.pix,
> -				&source);
> +	ret = rvin_try_format(vin, V4L2_SUBDEV_FORMAT_ACTIVE, &f->fmt.pix,
> +			      &crop, &compose);
>  	if (ret)
>  		return ret;
> 
> -	vin->source.width = source.width;
> -	vin->source.height = source.height;
> -
>  	vin->format = f->fmt.pix;
> -
> -	rvin_reset_crop_compose(vin);
> +	vin->crop = crop;
> +	vin->compose = compose;
> +	vin->source = crop;
> 
>  	return 0;
>  }
> diff --git a/drivers/media/platform/rcar-vin/rcar-vin.h
> b/drivers/media/platform/rcar-vin/rcar-vin.h index
> 1c91b774205a7750..e940366d7e8d0e76 100644
> --- a/drivers/media/platform/rcar-vin/rcar-vin.h
> +++ b/drivers/media/platform/rcar-vin/rcar-vin.h
> @@ -46,16 +46,6 @@ enum rvin_dma_state {
>  	STOPPING,
>  };
> 
> -/**
> - * struct rvin_source_fmt - Source information
> - * @width:	Width from source
> - * @height:	Height from source
> - */
> -struct rvin_source_fmt {
> -	u32 width;
> -	u32 height;
> -};
> -
>  /**
>   * struct rvin_video_format - Data format stored in memory
>   * @fourcc:	Pixelformat
> @@ -123,11 +113,11 @@ struct rvin_info {
>   * @sequence:		V4L2 buffers sequence number
>   * @state:		keeps track of operation state
>   *
> - * @source:		active format from the video source
>   * @format:		active V4L2 pixel format
>   *
>   * @crop:		active cropping
>   * @compose:		active composing
> + * @source:		active size of the video source
>   */
>  struct rvin_dev {
>  	struct device *dev;
> @@ -151,11 +141,11 @@ struct rvin_dev {
>  	unsigned int sequence;
>  	enum rvin_dma_state state;
> 
> -	struct rvin_source_fmt source;
>  	struct v4l2_pix_format format;
> 
>  	struct v4l2_rect crop;
>  	struct v4l2_rect compose;
> +	struct v4l2_rect source;
>  };
> 
>  #define vin_to_source(vin)		((vin)->digital->subdev)


-- 
Regards,

Laurent Pinchart

  reply	other threads:[~2018-04-03 22:09 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-26 21:44 [PATCH v13 00/33] rcar-vin: Add Gen3 with media controller Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 01/33] dt-bindings: media: rcar_vin: Reverse SoC part number list Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 02/33] dt-bindings: media: rcar_vin: add device tree support for r8a774[35] Niklas Söderlund
2018-04-10  9:55   ` Fabrizio Castro
2018-04-10 10:17     ` Niklas Söderlund
2018-04-10 11:04       ` Fabrizio Castro
2018-03-26 21:44 ` [PATCH v13 03/33] rcar-vin: add Gen3 devicetree bindings documentation Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 04/33] rcar-vin: rename poorly named initialize and cleanup functions Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 05/33] rcar-vin: unregister video device on driver removal Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 06/33] rcar-vin: move subdevice handling to async callbacks Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 07/33] rcar-vin: move model information to own struct Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 08/33] rcar-vin: move max width and height information to chip information Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 09/33] rcar-vin: move functions regarding scaling Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 10/33] rcar-vin: all Gen2 boards can scale simplify logic Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 11/33] rcar-vin: set a default field to fallback on Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 12/33] rcar-vin: fix handling of single field frames (top, bottom and alternate fields) Niklas Söderlund
2018-04-03 21:50   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 13/33] rcar-vin: update bytesperline and sizeimage calculation Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 14/33] rcar-vin: align pixelformat check Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 15/33] rcar-vin: break out format alignment and checking Niklas Söderlund
2018-04-03 21:47   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 16/33] rcar-vin: simplify how formats are set and reset Niklas Söderlund
2018-04-03 22:09   ` Laurent Pinchart [this message]
2018-04-05 21:18     ` Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 17/33] rcar-vin: cache video standard Niklas Söderlund
2018-04-03 22:11   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 18/33] rcar-vin: move media bus configuration to struct rvin_dev Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 19/33] rcar-vin: enable Gen3 hardware configuration Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 20/33] rcar-vin: add function to manipulate Gen3 chsel value Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 21/33] rcar-vin: add flag to switch to media controller mode Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 22/33] rcar-vin: use different v4l2 operations in " Niklas Söderlund
2018-04-03 21:43   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 23/33] rcar-vin: force default colorspace for media centric mode Niklas Söderlund
2018-04-03 21:40   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 24/33] rcar-vin: prepare for media controller mode initialization Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 25/33] rcar-vin: add group allocator functions Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 26/33] rcar-vin: change name of video device Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 27/33] rcar-vin: add chsel information to rvin_info Niklas Söderlund
2018-04-03 21:38   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 28/33] rcar-vin: parse Gen3 OF and setup media graph Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 29/33] rcar-vin: add link notify for Gen3 Niklas Söderlund
2018-04-03 21:36   ` Laurent Pinchart
2018-03-26 21:44 ` [PATCH v13 30/33] rcar-vin: extend {start,stop}_streaming to work with media controller Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 31/33] rcar-vin: enable support for r8a7795 Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 32/33] rcar-vin: enable support for r8a7796 Niklas Söderlund
2018-03-26 21:44 ` [PATCH v13 33/33] rcar-vin: enable support for r8a77970 Niklas Söderlund
2018-04-03 12:30 ` [PATCH v13 00/33] rcar-vin: Add Gen3 with media controller Hans Verkuil
2018-04-03 13:42   ` Kieran Bingham
2018-04-03 13:51   ` Laurent Pinchart
2018-04-04 10:28   ` Hans Verkuil
2018-04-05 21:09     ` Niklas Söderlund

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=1544952.AcMr2TBica@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=hverkuil@xs4all.nl \
    --cc=kieran.bingham@ideasonboard.com \
    --cc=linux-media@vger.kernel.org \
    --cc=linux-renesas-soc@vger.kernel.org \
    --cc=niklas.soderlund+renesas@ragnatech.se \
    --cc=tomoharu.fukawa.eb@renesas.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox