[v2] rcar-vin: Do not enumerate unsupported pixel formats
diff mbox series

Message ID 20191014000750.2863254-1-niklas.soderlund+renesas@ragnatech.se
State New
Delegated to: Kieran Bingham
Headers show
Series
  • [v2] rcar-vin: Do not enumerate unsupported pixel formats
Related show

Commit Message

Niklas Söderlund Oct. 14, 2019, 12:07 a.m. UTC
If a pixel format is not supported by the hardware NULL is returned by
rvin_format_from_pixel() for that fourcc. Verify that the pixel format
is supported using this or skip it when enumerating.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
---
 drivers/media/platform/rcar-vin/rcar-v4l2.c | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

Comments

Laurent Pinchart Oct. 14, 2019, 8:58 p.m. UTC | #1
Hi Niklas,

Thank you for the patch.

On Mon, Oct 14, 2019 at 02:07:50AM +0200, Niklas Söderlund wrote:
> If a pixel format is not supported by the hardware NULL is returned by
> rvin_format_from_pixel() for that fourcc. Verify that the pixel format
> is supported using this or skip it when enumerating.
> 
> Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
> ---
>  drivers/media/platform/rcar-vin/rcar-v4l2.c | 20 +++++++++++++++-----
>  1 file changed, 15 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> index 9a9b89c0dc0b3be4..13b7cd5d2e40415a 100644
> --- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
> +++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
> @@ -296,12 +296,22 @@ static int rvin_g_fmt_vid_cap(struct file *file, void *priv,
>  static int rvin_enum_fmt_vid_cap(struct file *file, void *priv,
>  				 struct v4l2_fmtdesc *f)
>  {
> -	if (f->index >= ARRAY_SIZE(rvin_formats))
> -		return -EINVAL;
> -
> -	f->pixelformat = rvin_formats[f->index].fourcc;
> +	struct rvin_dev *vin = video_drvdata(file);
> +	unsigned int i;
> +	int matched;
> +
> +	matched = -1;
> +	for (i = 0; i < ARRAY_SIZE(rvin_formats); i++) {
> +		if (rvin_format_from_pixel(vin, rvin_formats[i].fourcc))
> +			matched++;
> +
> +		if (matched == f->index) {
> +			f->pixelformat = rvin_formats[i].fourcc;
> +			return 0;
> +		}
> +	}

I wonder if the following would be more readable ?

	struct rvin_dev *vin = video_drvdata(file);
	unsigned int index = f->index;
	unsigned int i;

	for (i = 0; i < ARRAY_SIZE(rvin_formats); i++) {
		if (rvin_format_from_pixel(vin, rvin_formats[i].fourcc))
			continue;

		if (index-- == 0) {
			f->pixelformat = rvin_formats[i].fourcc;
			return 0;
		}
	}
 
	return -EINVAL;

In any case,

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

> -	return 0;
> +	return -EINVAL;
>  }
>  
>  static int rvin_g_selection(struct file *file, void *fh,

Patch
diff mbox series

diff --git a/drivers/media/platform/rcar-vin/rcar-v4l2.c b/drivers/media/platform/rcar-vin/rcar-v4l2.c
index 9a9b89c0dc0b3be4..13b7cd5d2e40415a 100644
--- a/drivers/media/platform/rcar-vin/rcar-v4l2.c
+++ b/drivers/media/platform/rcar-vin/rcar-v4l2.c
@@ -296,12 +296,22 @@  static int rvin_g_fmt_vid_cap(struct file *file, void *priv,
 static int rvin_enum_fmt_vid_cap(struct file *file, void *priv,
 				 struct v4l2_fmtdesc *f)
 {
-	if (f->index >= ARRAY_SIZE(rvin_formats))
-		return -EINVAL;
-
-	f->pixelformat = rvin_formats[f->index].fourcc;
+	struct rvin_dev *vin = video_drvdata(file);
+	unsigned int i;
+	int matched;
+
+	matched = -1;
+	for (i = 0; i < ARRAY_SIZE(rvin_formats); i++) {
+		if (rvin_format_from_pixel(vin, rvin_formats[i].fourcc))
+			matched++;
+
+		if (matched == f->index) {
+			f->pixelformat = rvin_formats[i].fourcc;
+			return 0;
+		}
+	}
 
-	return 0;
+	return -EINVAL;
 }
 
 static int rvin_g_selection(struct file *file, void *fh,