On Mon Mar 23 09:53:53 2026 +0000, Ricardo Ribalda wrote:
> In UVC, the FID flips with every frame. For every FID flip, we increase
> the stream sequence number.
> 
> Now, if a FID flips multiple times and there is no data transferred between
> the flips, the buffer sequence number will be set to the value of the
> stream sequence number after the first flip.
> 
> Userspace uses the buffer sequence number to determine if there have been
> missing frames. With the current behaviour, userspace will think that the
> gap is in the wrong location.
> 
> This patch modifies uvc_video_decode_start() to provide the correct buffer
> sequence number and timestamp.
> 
> Cc: [email protected]
> Fixes: 650b95feee35 ("[media] uvcvideo: Generate discontinuous sequence 
> numbers when frames are lost")
> Signed-off-by: Ricardo Ribalda <[email protected]>
> Reviewed-by: Hans de Goede <[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 | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

---

diff --git a/drivers/media/usb/uvc/uvc_video.c 
b/drivers/media/usb/uvc/uvc_video.c
index 3182f5e9d9a0..62db4db4e565 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -1223,6 +1223,19 @@ static int uvc_video_decode_start(struct uvc_streaming 
*stream,
                stream->sequence++;
                if (stream->sequence)
                        uvc_video_stats_update(stream);
+
+               /*
+                * On a FID flip initialize sequence number and timestamp.
+                *
+                * The driver already takes care of injecting FID flips for
+                * UVC_QUIRK_STREAM_NO_FID and UVC_QUIRK_MJPEG_NO_EOF.
+                */
+               if (buf) {
+                       buf->buf.field = V4L2_FIELD_NONE;
+                       buf->buf.sequence = stream->sequence;
+                       buf->buf.vb2_buf.timestamp =
+                                       ktime_to_ns(uvc_video_get_time());
+               }
        }
 
        uvc_video_clock_decode(stream, buf, data, len);
@@ -1263,10 +1276,6 @@ static int uvc_video_decode_start(struct uvc_streaming 
*stream,
                        return -ENODATA;
                }
 
-               buf->buf.field = V4L2_FIELD_NONE;
-               buf->buf.sequence = stream->sequence;
-               buf->buf.vb2_buf.timestamp = ktime_to_ns(uvc_video_get_time());
-
                /* TODO: Handle PTS and SCR. */
                buf->state = UVC_BUF_STATE_ACTIVE;
        }
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to