From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Ricardo Ribalda <ribalda@chromium.org>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
"hn.chen" <hn.chen@sunplusit.com>,
Hans Verkuil <hverkuil@xs4all.nl>,
Sergey Senozhatsky <senozhatsky@chromium.org>
Subject: Re: [PATCH v10 6/6] media: uvcvideo: Fix hw timestamp handling for slow FPS
Date: Mon, 10 Jun 2024 15:52:58 +0300 [thread overview]
Message-ID: <20240610125258.GS18479@pendragon.ideasonboard.com> (raw)
In-Reply-To: <20240323-resend-hwtimestamp-v10-6-b08e590d97c7@chromium.org>
Hi Ricardo,
Thank you for the patch.
On Sat, Mar 23, 2024 at 10:48:07AM +0000, Ricardo Ribalda wrote:
> In UVC 1.5 we get a single clock value per frame. With the current
> buffer size of 32, FPS slowers than 32 might roll-over twice.
>
> The current code cannot handle two roll-over and provide invalid
> timestamps.
>
> Remove all the samples from the circular buffer that are more than two
> rollovers old, so the algorithm always provides good timestamps.
>
> Note that we are removing values that are more than one second old,
> which means that there is enough distance between the two points that
> we use for the interpolation to provide good values.
>
> Tested-by: HungNien Chen <hn.chen@sunplusit.com>
> Reviewed-by: Sergey Senozhatsky <senozhatsky@chromium.org>
> Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
> ---
> drivers/media/usb/uvc/uvc_video.c | 24 ++++++++++++++++++++++++
> drivers/media/usb/uvc/uvcvideo.h | 1 +
> 2 files changed, 25 insertions(+)
>
> diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
> index 5df8f61d39cd1..900b57afac93a 100644
> --- a/drivers/media/usb/uvc/uvc_video.c
> +++ b/drivers/media/usb/uvc/uvc_video.c
> @@ -471,8 +471,31 @@ static void uvc_video_clock_add_sample(struct uvc_clock *clock,
> {
> unsigned long flags;
>
> + /*
> + * If we write new data on the position where we had the last
> + * overflow, remove the overflow pointer. There is no overflow
s/overflow/SOF overflow/
otherwise it sounds like a circular buffer overflow. Same in the other
comments below.
> + * on the whole circular buffer.
> + */
> + if (clock->head == clock->last_sof_overflow)
> + clock->last_sof_overflow = -1;
> +
> spin_lock_irqsave(&clock->lock, flags);
>
> + /* Handle overflows */
s/overflows/overflows./
> + if (clock->count > 0 && clock->last_sof > sample->dev_sof) {
> + /*
> + * Remove data from the circular buffer that is older than the
> + * last overflow. We only support one overflow per circular
> + * buffer.
> + */
> + if (clock->last_sof_overflow != -1) {
> + clock->count = (clock->head - clock->last_sof_overflow
> + + clock->count) % clock->count;
If I'm following you correctly here, you want to set count to the
distance between last_sof_overflow and head. Shouldn't it be
clock->count = (clock->head - clock->last_sof_overflow
+ clock->size) % clock->size;
> + }
No need for curly braces.
> + clock->last_sof_overflow = clock->head;
> + }
> +
> + /* Add sample */
s/sample/sample./
I still think it would be nicer to handle multiple rollovers correctly,
but that probably better handled by moving all the clock handling to
userspace. With the above issues addressed, I think this patch can go
in.
I could address all these issues when applying, but I'd like the count
-> size change to be tested first. You can submit a new version of this
patch only, I've applied the rest of the series to my tree already.
> clock->samples[clock->head] = *sample;
> clock->head = (clock->head + 1) % clock->size;
> clock->count = min(clock->count + 1, clock->size);
> @@ -616,6 +639,7 @@ static void uvc_video_clock_reset(struct uvc_clock *clock)
> clock->head = 0;
> clock->count = 0;
> clock->last_sof = -1;
> + clock->last_sof_overflow = -1;
> clock->sof_offset = -1;
> }
>
> diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
> index cb9dd50bba8ac..fb9f9771131ac 100644
> --- a/drivers/media/usb/uvc/uvcvideo.h
> +++ b/drivers/media/usb/uvc/uvcvideo.h
> @@ -499,6 +499,7 @@ struct uvc_streaming {
> unsigned int head;
> unsigned int count;
> unsigned int size;
> + unsigned int last_sof_overflow;
>
> u16 last_sof;
> u16 sof_offset;
--
Regards,
Laurent Pinchart
prev parent reply other threads:[~2024-06-10 12:53 UTC|newest]
Thread overview: 29+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-03-23 10:48 [PATCH v10 0/6] uvcvideo: Fixes for hw timestamping Ricardo Ribalda
2024-03-23 10:48 ` [PATCH v10 1/6] media: uvcvideo: Support timestamp lists of any size Ricardo Ribalda
2024-05-29 6:13 ` Tomasz Figa
2024-06-10 11:38 ` Laurent Pinchart
2024-03-23 10:48 ` [PATCH v10 2/6] media: uvcvideo: Ignore empty TS packets Ricardo Ribalda
2024-05-29 6:19 ` Tomasz Figa
2024-03-23 10:48 ` [PATCH v10 3/6] media: uvcvideo: Quirk for invalid dev_sof in Logitech C922 Ricardo Ribalda
2024-03-23 12:16 ` Oleksandr Natalenko
2024-03-25 7:52 ` Ricardo Ribalda
2024-03-25 9:23 ` Oleksandr Natalenko
2024-03-25 9:25 ` Ricardo Ribalda
2024-03-25 12:50 ` Oleksandr Natalenko
2024-03-25 14:13 ` Ricardo Ribalda
2024-05-29 7:20 ` Tomasz Figa
2024-03-23 10:48 ` [PATCH v10 4/6] media: uvcvideo: Allow hw clock updates with buffers not full Ricardo Ribalda
2024-05-29 8:03 ` Tomasz Figa
2024-06-10 11:43 ` Laurent Pinchart
2024-06-12 3:28 ` Tomasz Figa
2024-06-12 7:43 ` Laurent Pinchart
2024-06-12 7:47 ` Ricardo Ribalda
2024-06-12 8:20 ` Laurent Pinchart
2024-06-12 8:47 ` Tomasz Figa
2024-06-12 8:35 ` Tomasz Figa
2024-06-12 9:21 ` Laurent Pinchart
2024-03-23 10:48 ` [PATCH v10 5/6] media: uvcvideo: Refactor clock circular buffer Ricardo Ribalda
2024-05-29 8:13 ` Tomasz Figa
2024-03-23 10:48 ` [PATCH v10 6/6] media: uvcvideo: Fix hw timestamp handling for slow FPS Ricardo Ribalda
2024-05-29 8:30 ` Tomasz Figa
2024-06-10 12:52 ` Laurent Pinchart [this message]
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=20240610125258.GS18479@pendragon.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=hn.chen@sunplusit.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=ribalda@chromium.org \
--cc=senozhatsky@chromium.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.