linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ricardo Ribalda <ribalda@chromium.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Mauro Carvalho Chehab <mchehab@kernel.org>,
	Sergey Senozhatsky <senozhatsky@chromium.org>,
	 linux-kernel@vger.kernel.org, "hn.chen" <hn.chen@sunplusit.com>,
	 linux-media@vger.kernel.org
Subject: Re: [PATCH v9 6/6] media: uvcvideo: Fix hw timestamp handling for slow FPS
Date: Fri, 22 Mar 2024 10:53:42 +0100	[thread overview]
Message-ID: <CANiDSCvZc9CyqkJ5Noz_vzisErVk+dzHW2GUGchQnG2h=d6oTw@mail.gmail.com> (raw)
In-Reply-To: <20240322093522.GN18799@pendragon.ideasonboard.com>

Hi

On Fri, 22 Mar 2024 at 10:35, Laurent Pinchart
<laurent.pinchart@ideasonboard.com> wrote:
>
> Hi Ricardo,
>
> Thank you for the patch.
>
> On Wed, Mar 15, 2023 at 02:30:17PM +0100, 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.
> >
> > Revome all the samples from the circular buffer that are more than two
>
> s/Revome/Remove/
>
> > rollovers old, so the algorithm always provides good timestamps.
>
> Wouldn't it be better to support multiple rollovers instead ?

I believe one second is enough to provide a good ramp for the clock
interpolation,
with as little as 1/4 we are getting results good enough to pass CTS.

To support multiple roll-ups we would need to keep track of the
"generation" of every timestamp, and numerical overflows will start to
be an issue....

IMO it is better to fix what we have broken and If we ever need more
accuracy we could add a follow-up patch later.


>
> > 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>
> > 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 1db0d1bc80e6..c58b51207be6 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
> > +      * 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 */
> > +     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;
> > +             }
> > +             clock->last_sof_overflow = clock->head;
> > +     }
> > +
> > +     /* Add sample */
> >       memcpy(&clock->samples[clock->head], sample, sizeof(*sample));
> >       clock->head = (clock->head + 1) % clock->size;
> >       clock->count = min(clock->count + 1, clock->size);
> > @@ -605,6 +628,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 07b2fdb80adf..bf9f5162b833 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



-- 
Ricardo Ribalda

      reply	other threads:[~2024-03-22  9:54 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-15 13:30 [PATCH v9 0/6] uvcvideo: Fixes for hw timestamping Ricardo Ribalda
2023-03-15 13:30 ` [PATCH v9 1/6] media: uvcvideo: Fix negative modulus calculation Ricardo Ribalda
2023-03-16  3:05   ` Sergey Senozhatsky
2024-02-12 22:59   ` Laurent Pinchart
2024-02-19 10:28     ` Ricardo Ribalda
2024-02-19 10:40       ` Laurent Pinchart
2024-02-19 15:07         ` Ricardo Ribalda
2024-03-21 21:50           ` Laurent Pinchart
2024-03-22  9:19             ` Laurent Pinchart
2024-03-22  9:29               ` Ricardo Ribalda
2024-03-22  9:35                 ` Laurent Pinchart
2023-03-15 13:30 ` [PATCH v9 2/6] media: uvcvideo: Ignore empty TS packets Ricardo Ribalda
2024-03-21 23:26   ` Laurent Pinchart
2024-03-22  8:22     ` Ricardo Ribalda
2024-03-22  8:52       ` Laurent Pinchart
2023-03-15 13:30 ` [PATCH v9 3/6] media: uvcvideo: Quirk for invalid dev_sof in Logitech C922 Ricardo Ribalda
2024-03-21 23:44   ` Laurent Pinchart
2024-03-22  8:32     ` Ricardo Ribalda
2024-03-22  8:52       ` Laurent Pinchart
2023-03-15 13:30 ` [PATCH v9 4/6] media: uvcvideo: Allow hw clock updates with buffers not full Ricardo Ribalda
2023-03-16  3:08   ` Sergey Senozhatsky
2024-03-22  0:12   ` Laurent Pinchart
2023-03-15 13:30 ` [PATCH v9 5/6] media: uvcvideo: Refactor clock circular buffer Ricardo Ribalda
2024-03-22  0:36   ` Laurent Pinchart
2023-03-15 13:30 ` [PATCH v9 6/6] media: uvcvideo: Fix hw timestamp handling for slow FPS Ricardo Ribalda
2023-03-16  3:07   ` Sergey Senozhatsky
2024-03-22  9:35   ` Laurent Pinchart
2024-03-22  9:53     ` Ricardo Ribalda [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='CANiDSCvZc9CyqkJ5Noz_vzisErVk+dzHW2GUGchQnG2h=d6oTw@mail.gmail.com' \
    --to=ribalda@chromium.org \
    --cc=hn.chen@sunplusit.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.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 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).