From nobody Tue Apr 7 05:01:25 2026 Received: from mail-lf1-f41.google.com (mail-lf1-f41.google.com [209.85.167.41]) (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 82BD33976AC for ; Mon, 16 Mar 2026 13:30:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.167.41 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773667835; cv=none; b=J6mRAGiLg/+Qu009enbzwYqZC6Rk9jnyTsoNHnn46Hf6TdvJGWDLNJGZpzUEexQZh5sbRNVVaiTflDH/B5fYPAQC+R2sPfxfC8GGU+c3JR9uGWZzr25RIswkY9b0ZVfGcZw7uQjIDqYuD0j6GpmD74Pcdkax2LXW6w5u3i+B78E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773667835; c=relaxed/simple; bh=RB+Ts3QkIKlZ/tRagbOBunzShfDi7jafPn0xkXpiu9k=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=kBBwVRgVdnxstNDbPXVcUD/1Z8CkkvrVQdimeW4LMzARkyAAcmeMJwJPjaHdb1uvWNNUCvyo+ZIFZEY34zn6xoBw9vZMR7vrKP6dCAYln/+My6AcqigzbHmjsQJ8rjaWkR0VjITlmi9XoU3DsjEn4Gl9ZmSMO42M44gAQxWrbh4= 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=ILn5y5KI; arc=none smtp.client-ip=209.85.167.41 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="ILn5y5KI" Received: by mail-lf1-f41.google.com with SMTP id 2adb3069b0e04-5a107b387a5so5945398e87.2 for ; Mon, 16 Mar 2026 06:30:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; t=1773667832; x=1774272632; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=ZWcSfGy9KQONYfZbcr63kentbs7tqTbeJBgJ1hS1gko=; b=ILn5y5KIZGFilQab4r3Y++jBJmuD1590hAunuMNNFNxAmO8/RSA+g0s6JTCfW1fhtY Rb0n5ARnYEPrkNQuSN0DqfhlIhvpyIv2o0nIV/RIq9nMyFsJSH/c0hiq2TzuwilQVc3Y WvQlFVvQ51qYJ4nq6ee5eDKXtNWAtqq84LFr8= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773667832; x=1774272632; h=cc:to:in-reply-to:references: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=ZWcSfGy9KQONYfZbcr63kentbs7tqTbeJBgJ1hS1gko=; b=b3mlqilRT3O2Mc85itZE1TtYTnueIi8euRzGy6RQEjaq5sve0YDAolDPHbgYj6ifXq 0u7ZZwlAbsEvdCl7hSzohlSIZmtW178MFpMaa1PoZSX34yA80MeACygtY/dC4YjcZTGI IaYjhF9fC7fXJ5TK8YMCygaB8gQ1wYpMl+x1aoM8InKx7ZemmKlLDJp8gYkaq7b8U2Zb WBVHlFRfFNWnOTbYBlam4qt+9dYuMCdbX4/YXYd1xC93TuiDkAjl9UhGrJs/GN83w90d RORCbb9MUr5lZDEt4OCNhIPjpD/E7FrrTVqGHpa6IA7mFIq70bPDpxD8bVDbuUCi8mAw D32w== X-Forwarded-Encrypted: i=1; AJvYcCW74/QbUPrKD3ar6he3wyiig1BnLUdQTjBQybE7KbOg3fz0PNzcSjecRUV6c7eyQwLhdrVM/Xjp9DissXg=@vger.kernel.org X-Gm-Message-State: AOJu0YyjXPKEHrX44coJjlkEJvzM8kmcgsnZockCXyPPB6GEWM6uWAwv RpvBi0FHBfJ1XB1Thl3+xH8SEfYRaefKeexn4xY1GvEtfRenEYNSVyocKBh4sRBb5Q== X-Gm-Gg: ATEYQzyy7RICWtKY0eT+ulUk6LUzhV4TPsoecYkIYLLIPhKVlDHDW6lOOZ4a1xA566x MzKg/uQqtPRPA81HZNbJrsIyllN/mRKOd0jk3q/FPFipsKa5GfYJtGfxREbzZaZUjYyHe3zs/jV 5clXqiK5aGLFoDReh3h4/4FxzQSNBHly4dbRBHndmAiHroJCwbgatrnX0g4PUXS8J1OkbEwITLy 225m7MUeyDQaiXfc5BvIal7PZBBMD8BzfX1kpvRmUB/esfkV9CwhCbYE4oGJfSgp40ExPfdbWDb PHmkHP88QbkIhfFMRrByf67czPCkDlRy0mdmLu4Chv3seKiLwc50Xz7NTJSTcRyHibifsJyW53C QfoxFrHGNKz1Qdl/3c/TZOjQFYGAyO1LU5sikcgoXWM0adA65/FIrpECYsK5DLu/emhhf8p3MxB wCxof98YPUYbYSuRyifQTzaTgrepjbOgp38633eew7cN05RQCYxRS7Ws3a9BE8feFRWiFBDRT/2 A== X-Received: by 2002:ac2:4ed9:0:b0:5a1:2a20:9255 with SMTP id 2adb3069b0e04-5a16270eaf4mr4277043e87.18.1773667831543; Mon, 16 Mar 2026 06:30:31 -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-5a15636b69dsm3469985e87.82.2026.03.16.06.30.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Mar 2026 06:30:31 -0700 (PDT) From: Ricardo Ribalda Date: Mon, 16 Mar 2026 13:30:29 +0000 Subject: [PATCH v3 1/2] 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: <20260316-uvc-fid-v3-1-c793354469b5@chromium.org> References: <20260316-uvc-fid-v3-0-c793354469b5@chromium.org> In-Reply-To: <20260316-uvc-fid-v3-0-c793354469b5@chromium.org> To: Laurent Pinchart , Hans de Goede , Mauro Carvalho Chehab Cc: linux-media@vger.kernel.org, linux-kernel@vger.kernel.org, Yunke Cao , Ricardo Ribalda , stable@kernel.org 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 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 --- 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; } --=20 2.53.0.851.ga537e3e6e9-goog