From: Michael Grzeschik <mgr@pengutronix.de>
To: Avichal Rakesh <arakesh@google.com>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
Daniel Scally <dan.scally@ideasonboard.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 2/3] usb: gadget: uvc: add g_parm and s_parm for frame interval
Date: Thu, 18 Jul 2024 00:22:02 +0200 [thread overview]
Message-ID: <ZphEChcy_ftCp86s@pengutronix.de> (raw)
In-Reply-To: <9ad8b7fc-2c5e-4b2e-ba8c-e956171c2893@google.com>
[-- Attachment #1: Type: text/plain, Size: 4748 bytes --]
Hi Avichal,
On Wed, Jun 26, 2024 at 11:30:58AM -0700, Avichal Rakesh wrote:
>On 6/22/24 4:48 PM, Michael Grzeschik wrote:
>> The uvc gadget driver is lacking the information which frame interval
>> was set by the host. We add this information by implementing the g_parm
>> and s_parm callbacks.
>
>This change requires the userspace application (uvc-gagdet equivalent)
>to call s/g_parm when the FPS negotiations are finished. This is fine,
>but we should document that in the commit message here so implementers
>know that something needs to be done to take advantage of the change.
Fair point! I will do that for v3.
>On a similar note, the reference uvc-gadget should also be updated to
>call the added functions (and apologies if you've already put up a
>patch for it, I was unable find one).
Since I am only working with gstreamer with the uvcsink nowadays I
missed that. The internal v4l2sink does already do everything right. But
you are absolutely right. I will send an patch for uvc-gadget.
Regards,
Michael
>>
>> Signed-off-by: Michael Grzeschik <m.grzeschik@pengutronix.de>
>>
>> ---
>> v1 -> v2: -
>> ---
>> drivers/usb/gadget/function/uvc.h | 1 +
>> drivers/usb/gadget/function/uvc_v4l2.c | 52 ++++++++++++++++++++++++++++++++++
>> 2 files changed, 53 insertions(+)
>>
>> diff --git a/drivers/usb/gadget/function/uvc.h b/drivers/usb/gadget/function/uvc.h
>> index cb35687b11e7e..d153bd9e35e31 100644
>> --- a/drivers/usb/gadget/function/uvc.h
>> +++ b/drivers/usb/gadget/function/uvc.h
>> @@ -97,6 +97,7 @@ struct uvc_video {
>> unsigned int width;
>> unsigned int height;
>> unsigned int imagesize;
>> + unsigned int interval;
>> struct mutex mutex; /* protects frame parameters */
>>
>> unsigned int uvc_num_requests;
>> diff --git a/drivers/usb/gadget/function/uvc_v4l2.c b/drivers/usb/gadget/function/uvc_v4l2.c
>> index a024aecb76dc3..5b579ec1f5040 100644
>> --- a/drivers/usb/gadget/function/uvc_v4l2.c
>> +++ b/drivers/usb/gadget/function/uvc_v4l2.c
>> @@ -307,6 +307,56 @@ uvc_v4l2_set_format(struct file *file, void *fh, struct v4l2_format *fmt)
>> return ret;
>> }
>>
>> +static int uvc_v4l2_g_parm(struct file *file, void *fh,
>> + struct v4l2_streamparm *parm)
>> +{
>> + struct video_device *vdev = video_devdata(file);
>> + struct uvc_device *uvc = video_get_drvdata(vdev);
>> + struct uvc_video *video = &uvc->video;
>> + struct v4l2_fract timeperframe;
>> +
>> + if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
>> + return -EINVAL;
>> +
>> + /* Return the actual frame period. */
>> + timeperframe.numerator = video->interval;
>> + timeperframe.denominator = 10000000;
>> + v4l2_simplify_fraction(&timeperframe.numerator,
>> + &timeperframe.denominator, 8, 333);
>> +
>> + uvcg_dbg(&uvc->func, "Getting frame interval of %u/%u (%u)\n",
>> + timeperframe.numerator, timeperframe.denominator,
>> + video->interval);
>> +
>> + parm->parm.output.timeperframe = timeperframe;
>> + parm->parm.output.capability = V4L2_CAP_TIMEPERFRAME;
>> +
>> + return 0;
>> +}
>> +
>> +static int uvc_v4l2_s_parm(struct file *file, void *fh,
>> + struct v4l2_streamparm *parm)
>> +{
>> + struct video_device *vdev = video_devdata(file);
>> + struct uvc_device *uvc = video_get_drvdata(vdev);
>> + struct uvc_video *video = &uvc->video;
>> + struct v4l2_fract timeperframe;
>> +
>> + if (parm->type == V4L2_BUF_TYPE_VIDEO_CAPTURE)
>> + return -EINVAL;
>> +
>> + timeperframe = parm->parm.output.timeperframe;
>> +
>> + video->interval = v4l2_fraction_to_interval(timeperframe.numerator,
>> + timeperframe.denominator);
>> +
>> + uvcg_dbg(&uvc->func, "Setting frame interval to %u/%u (%u)\n",
>> + timeperframe.numerator, timeperframe.denominator,
>> + video->interval);
>> +
>> + return 0;
>> +}
>> +
>> static int
>> uvc_v4l2_enum_frameintervals(struct file *file, void *fh,
>> struct v4l2_frmivalenum *fival)
>> @@ -577,6 +627,8 @@ const struct v4l2_ioctl_ops uvc_v4l2_ioctl_ops = {
>> .vidioc_dqbuf = uvc_v4l2_dqbuf,
>> .vidioc_streamon = uvc_v4l2_streamon,
>> .vidioc_streamoff = uvc_v4l2_streamoff,
>> + .vidioc_s_parm = uvc_v4l2_s_parm,
>> + .vidioc_g_parm = uvc_v4l2_g_parm,
>> .vidioc_subscribe_event = uvc_v4l2_subscribe_event,
>> .vidioc_unsubscribe_event = uvc_v4l2_unsubscribe_event,
>> .vidioc_default = uvc_v4l2_ioctl_default,
>>
>
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2024-07-17 22:22 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-22 23:48 [PATCH v2 0/3] usb: gadget: uvc: allocate requests based on frame interval length and buffersize Michael Grzeschik
2024-06-22 23:48 ` [PATCH v2 1/3] usb: gadget: function: uvc: set req_size once when the vb2 queue is calculated Michael Grzeschik
2024-06-22 23:48 ` [PATCH v2 2/3] usb: gadget: uvc: add g_parm and s_parm for frame interval Michael Grzeschik
2024-06-26 18:30 ` Avichal Rakesh
2024-07-17 22:22 ` Michael Grzeschik [this message]
2024-06-22 23:48 ` [PATCH v2 3/3] usb: gadget: uvc: set req_size and n_requests based on the " Michael Grzeschik
2024-06-26 18:57 ` Avichal Rakesh
2024-07-17 22:19 ` Michael Grzeschik
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=ZphEChcy_ftCp86s@pengutronix.de \
--to=mgr@pengutronix.de \
--cc=arakesh@google.com \
--cc=dan.scally@ideasonboard.com \
--cc=gregkh@linuxfoundation.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).