On Wed May 13 11:49:23 2026 +0000, Ricardo Ribalda wrote:
> Some UVC 1.1 cameras running in fast isochronous mode tend to spam the
> USB host with a lot of empty packets. These packets contain clock
> information and are added to the clock buffer but do not add any
> accuracy to the calculation. In fact, it is quite the opposite, in our
> calculations, only the first and the last timestamp is used, and we only
> have 32 slots.
> 
> Ignore the samples that will produce less than MIN_HW_TIMESTAMP_DIFF
> data.
> 
> Fixes: 141270bd95d4 ("media: uvcvideo: Refactor clock circular buffer")
> Cc: [email protected]
> Tested-by: Yunke Cao <[email protected]>
> Reviewed-by: Hans de Goede <[email protected]>
> Signed-off-by: Ricardo Ribalda <[email protected]>
> Link: 
> https://patch.msgid.link/[email protected]
> Signed-off-by: Hans de Goede <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>

Patch committed.

Thanks,
Hans Verkuil

 drivers/media/usb/uvc/uvc_video.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

---

diff --git a/drivers/media/usb/uvc/uvc_video.c 
b/drivers/media/usb/uvc/uvc_video.c
index d2e61be35bf6..09d6baf87ec5 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -544,6 +544,15 @@ static void uvc_video_clock_add_sample(struct uvc_clock 
*clock,
        spin_unlock_irqrestore(&clock->lock, flags);
 }
 
+static inline u16 sof_diff(u16 a, u16 b)
+{
+       /*
+        * Because the result is modulo 2048 (via & 2047), we do not need a
+        * special case for a < b.
+        */
+       return (a - b) & 2047;
+}
+
 static void
 uvc_video_clock_decode(struct uvc_streaming *stream, struct uvc_buffer *buf,
                       const u8 *data, int len)
@@ -664,12 +673,13 @@ uvc_video_clock_decode(struct uvc_streaming *stream, 
struct uvc_buffer *buf,
        sample.dev_sof = (sample.dev_sof + stream->clock.sof_offset) & 2047;
 
        /*
-        * To limit the amount of data, drop SCRs with an SOF identical to the
+        * To limit the amount of data, drop SCRs with an SOF similar to the
         * previous one. This filtering is also needed to support UVC 1.5, where
         * all the data packets of the same frame contains the same SOF. In that
         * case only the first one will match the host_sof.
         */
-       if (sample.dev_sof == stream->clock.last_sof)
+       if (sof_diff(sample.dev_sof, stream->clock.last_sof) <=
+           (UVC_MIN_HW_TIMESTAMP_DIFF / stream->clock.size))
                return;
 
        uvc_video_clock_add_sample(&stream->clock, &sample);
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to