On Wed May 13 11:49:20 2026 +0000, Ricardo Ribalda wrote:
> To avoid filling the clock circular buffer with duplicated data we only
> add it if the new value sof is different than the last added sof.
> 
> The issue is that we compare the unprocess sof with the processed sof.
> If there is a sof_offset, or UVC_QUIRK_INVALID_DEVICE_SOF is enabled,
> the comparison will not work as expected.
> 
> This patch moves the comparison to the right place.
> 
> Fixes: 141270bd95d4 ("media: uvcvideo: Refactor clock circular buffer")
> Cc: [email protected]
> Reviewed-by: Hans de Goede <[email protected]>
> Tested-by: Yunke Cao <[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 | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

---

diff --git a/drivers/media/usb/uvc/uvc_video.c 
b/drivers/media/usb/uvc/uvc_video.c
index 0e691b872701..efd746dd5db0 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -583,16 +583,7 @@ uvc_video_clock_decode(struct uvc_streaming *stream, 
struct uvc_buffer *buf,
        if (!has_scr)
                return;
 
-       /*
-        * To limit the amount of data, drop SCRs with an SOF identical 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.
-        */
        sample.dev_sof = get_unaligned_le16(&data[header_size - 2]);
-       if (sample.dev_sof == stream->clock.last_sof)
-               return;
-
        sample.dev_stc = get_unaligned_le32(&data[header_size - 6]);
 
        /*
@@ -664,6 +655,16 @@ 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
+        * 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)
+               return;
+
        uvc_video_clock_add_sample(&stream->clock, &sample);
        stream->clock.last_sof = sample.dev_sof;
 }
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to