From nobody Tue Apr 7 09:26:32 2026 Received: from mail-lf1-f48.google.com (mail-lf1-f48.google.com [209.85.167.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 793863AB267 for ; Fri, 13 Mar 2026 18:21:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773426080; cv=none; b=iDNd9KH/OOsXh862A9fOaF/orjR0U3iOp9PMmCgey+u6PDPpXTsrRkoHeR1IE6aKm2QZ5rGmdj8+7l1k3tjmq9YaoufNHRFX0DAqCWLugKDDUBezs81bdCiuu7tcuI1kppTl7twmcDCstdccq96Rry55jDiVRUc3dNjtB6IQ1Ec= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773426080; c=relaxed/simple; bh=FPiOdnFRxwwj4yBBQS7IlAO9n0Q31tHDbSTTMEbWTz4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:To:Cc; b=hCpdrQ7zb6L448Vx5RYTdkLjHJ50+g91jCDJ9D3RZXYHk1y8xaHXIht567qxJJRaZjqRc2aStAimTMQFHETb5BS5lB9xnYbFXTKdbvkoUbgVnOPk/O5GU8XTNsWRwC7fdjg1fhN3rc4h16gcSi0k37s62I9grhRSIY52QIDuLDA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org; spf=pass smtp.mailfrom=chromium.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b=eaGCClTr; arc=none smtp.client-ip=209.85.167.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=chromium.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=chromium.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="eaGCClTr" Received: by mail-lf1-f48.google.com with SMTP id 2adb3069b0e04-5a1443780c4so3864932e87.0 for ; Fri, 13 Mar 2026 11:21:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773426076; x=1774030876; darn=vger.kernel.org; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:from:to:cc:subject:date:message-id:reply-to; bh=l/GRqsBWigY/fgWSjpHBrgBJmMne+sWw+2+mDk8tZ2o=; b=eaGCClTr/7yjDpwwrwPkTFT4zYsXtMiyBXPI/Bfsdv0fXf6XlXtXHUBaxE1FuI/Xu8 X1Ub5Hh4OzBRoWEHiCOnxIFMYFJ98H5uXSPqCecKFu7xP0JGDIiU0JHFGUlTQ5ML4lzi auGX8DaxxqWJsUUn8HkjRCf7KiScChdH7VgjA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773426076; x=1774030876; h=cc:to:message-id:content-transfer-encoding:mime-version:subject :date:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=l/GRqsBWigY/fgWSjpHBrgBJmMne+sWw+2+mDk8tZ2o=; b=W1JIb+w5KXFL7ZQStDW5LcH1GwlW9UQcVoAmVzKlbzmaFguMwdSPIaN3OcwqYuYYt5 0H5awcL3wQh4LzBh4se8cPLOtjr044yxlaA+4WITsMDMK1BEFBX2yz2/l+g9uQ+4FmYr PV2wUaiCObB4aKPDtx5Gqntjla2xutIoQJIImK6hTx1p5P44NWZf3ktqYTdrJrBOg6Q2 dfKSp//HTqcrlwVoIZtctgGzqgs1wgaEqoLGdcsuLq2sDneUZ8TwzbexjXZsXYIk70Xh AefYD+3NmpPQlfsHkTZkY9/wkqKR/yB+XxHoHWF/kZygH0sL+zH7yxBHcq/dtcggw6yV hbcg== X-Forwarded-Encrypted: i=1; AJvYcCWH2m+SQGWXuQexdTtV2jHKouc28V2CYQCe+ixWqEyF+S9osHqprufgvIuUJ3M1fkLgqFzYhF6HE97Xq5I=@vger.kernel.org X-Gm-Message-State: AOJu0YwoKoKamhbceYfudsGcLhPOGjdqDa3J+qZhhOyw+8y1OYyn19tS 7IBEFwiyoq/V2v+sy8PoMg8RPLNdOAb3JCaiph2Jvu+sEtX9qRfOC5JJTHr+DXl3zubKPa1Z8FW kUoSapA== X-Gm-Gg: ATEYQzyP+ARpXYfNUMZad+ZR8k1HjglFxs4u7/JFHcen0g/XHTkSoRf/mGkbw8M/ilP MZql+f0+LwC+gl8wqFxm1hH0k3VGFb4xQ4RWMKn4JC4zw3uM+rxfezG0Tm+ysEf9I21HtTxSAsM aa/kveSG+b0wzA+nAf092j5PJ/Cd8NMWFGIZ+fuU0mL2o0r22JWgZyTn4KEn1W82GZF864Y1RoV Y4s+KhbW7Fpfd1umV8qS8KrxFwvl3bJisVBOTDV1USruNKPbWK8FPdSlEUrnRZwVc/6B8dtTRuK UNqINcWgZT6YbPGOQHsg4VM3ig/ZaMLcQQuPQ4i+IqBD1ofIbkmI/tZoe0L/mX/h0JoygmcpUTM c2jXq91wrqY8YHA7pfiCsDXEgvLr18zx5rBHJWRabplhdOWpqfGtz5F5toRLAdesed95XcHqbR+ noAboPdX161FcrVIDl5305gq7WR5yoCNue7mmMvtQq37x0/ZL1V4hJBNJ3318YwPmLIKRefG+kj A== X-Received: by 2002:a05:6512:1310:b0:5a1:4246:4167 with SMTP id 2adb3069b0e04-5a15a4c78admr2865479e87.19.1773426076428; Fri, 13 Mar 2026 11:21:16 -0700 (PDT) Received: from ribalda.c.googlers.com (27.69.88.34.bc.googleusercontent.com. [34.88.69.27]) by smtp.gmail.com with ESMTPSA id 2adb3069b0e04-5a15636a96bsm1709243e87.79.2026.03.13.11.21.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 11:21:14 -0700 (PDT) From: Ricardo Ribalda Date: Fri, 13 Mar 2026 18:21:13 +0000 Subject: [PATCH v2] media: uvcvideo: Fix buffer sequence in frame gaps Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-uvc-fid-v2-1-3f7a996d9047@chromium.org> X-B4-Tracking: v=1; b=H4sIAJhVtGkC/2XMSw7CIBSF4a00dyyGZ0kcuQ/TgcKl3EGLAUs0D XsXO3X4n5x8OxTMhAUuww4ZKxVKaw95GsDF+zojI98bJJcjV4KzrToWyDMUaIzW9jEGAf39zBj ofUi3qXek8kr5c8BV/NZ/owommEFlvVPOcqmvLua00LacU55haq19AX88+62hAAAA X-Change-ID: 20260310-uvc-fid-e1e55447b6f1 To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Yunke Cao , stable@kernel.org, Ricardo Ribalda X-Mailer: b4 0.14.3 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 has 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 correct buffer sequence number and timestamp. Cc: stable@kernel.org Fixes: 650b95feee35 ("[media] uvcvideo: Generate discontinuous sequence num= bers when frames are lost") Signed-off-by: Ricardo Ribalda --- Changes in v2 (Thanks Laurent): - Improve commit message. - Remove original timestamp and sequence assignment. It is not neeed - Link to v1: https://lore.kernel.org/r/20260310-uvc-fid-v1-1-5e37dc3c7024@= chromium.org --- drivers/media/usb/uvc/uvc_video.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_= video.c index 40c76c051da2..9e06b1d0f0f9 100644 --- a/drivers/media/usb/uvc/uvc_video.c +++ b/drivers/media/usb/uvc/uvc_video.c @@ -1176,6 +1176,20 @@ static int uvc_video_decode_start(struct uvc_streami= ng *stream, stream->sequence++; if (stream->sequence) uvc_video_stats_update(stream); + + /* + * If there is a FID flip and the buffer has no data, + * initialize its 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->bytesused) { + buf->buf.field =3D V4L2_FIELD_NONE; + buf->buf.sequence =3D stream->sequence; + buf->buf.vb2_buf.timestamp =3D + ktime_to_ns(uvc_video_get_time()); + } } =20 uvc_video_clock_decode(stream, buf, data, len); @@ -1216,10 +1230,6 @@ static int uvc_video_decode_start(struct uvc_streami= ng *stream, return -ENODATA; } =20 - buf->buf.field =3D V4L2_FIELD_NONE; - buf->buf.sequence =3D stream->sequence; - buf->buf.vb2_buf.timestamp =3D ktime_to_ns(uvc_video_get_time()); - /* TODO: Handle PTS and SCR. */ buf->state =3D UVC_BUF_STATE_ACTIVE; } --- base-commit: a7da7fb57f2a787412da1a62292a17fa00fbfbdf change-id: 20260310-uvc-fid-e1e55447b6f1 Best regards, --=20 Ricardo Ribalda