Re: [PATCH v2 2/3] usb: gadget/uvc: also handle v4l2 ioctl ENUM_FMT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Michael,

Thank you for the patch.

(CC'ing Hans Verkuil and the linux-media mailing list)

On Friday 08 August 2014 17:38:58 Michael Grzeschik wrote:
> This patch adds ENUM_FMT as possible ioctl to the uvc v4l2 device.
> That makes userspace applications with a generic IOCTL calling
> convention make also use of it.
> 
> Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>
> ---
> v1 -> v2:
>  - changed first switch case to simple if
>  - added separate function
>  - added description field
>  - bail out on array boundaries
> 
>  drivers/usb/gadget/uvc_v4l2.c | 30 ++++++++++++++++++++++++++++--
>  1 file changed, 28 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/gadget/uvc_v4l2.c b/drivers/usb/gadget/uvc_v4l2.c
> index ad48e81..58633bf 100644
> --- a/drivers/usb/gadget/uvc_v4l2.c
> +++ b/drivers/usb/gadget/uvc_v4l2.c
> @@ -55,14 +55,30 @@ struct uvc_format
>  {
>  	u8 bpp;
>  	u32 fcc;
> +	char *description;
>  };
> 
>  static struct uvc_format uvc_formats[] = {
> -	{ 16, V4L2_PIX_FMT_YUYV  },
> -	{ 0,  V4L2_PIX_FMT_MJPEG },
> +	{ 16, V4L2_PIX_FMT_YUYV, "YUV 4:2:2" },
> +	{ 0,  V4L2_PIX_FMT_MJPEG, "MJPEG" },

Format descriptions are currently duplicated in every driver, causing higher 
memory usage and different descriptions for the same format depending on the 
driver. Hans, should we try to fix this ?

>  };
> 
>  static int
> +uvc_v4l2_enum_format(struct uvc_video *video, struct v4l2_fmtdesc *fmt)
> +{
> +

There's an extra blank line here.

> +	int index = fmt->index;

You can use fmt->index directly below, there's no need for a local variable.

> +	if (index >= ARRAY_SIZE(uvc_formats))
> +		return -EINVAL;
> +
> +	strcpy(fmt->description, uvc_formats[index].description);

How about strlcpy to make sure we don't overflow the buffer ?

> +	fmt->pixelformat = uvc_formats[index].fcc;
> +
> +	return 0;
> +}
> +
> +static int
>  uvc_v4l2_get_format(struct uvc_video *video, struct v4l2_format *fmt)
>  {
>  	fmt->fmt.pix.pixelformat = video->fcc;
> @@ -183,6 +199,16 @@ uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd,
> void *arg) break;
>  	}
> 
> +	case VIDIOC_ENUM_FMT:
> +	{
> +		struct v4l2_fmtdesc *fmt = arg;
> +
> +		if (fmt->type != video->queue.queue.type)
> +			return -EINVAL;
> +
> +		return uvc_v4l2_enum_format(video, fmt);
> +	}
> +
>  	/* Get & Set format */
>  	case VIDIOC_G_FMT:

-- 
Regards,

Laurent Pinchart

--
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




[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux