Received: by 2002:ab2:6857:0:b0:1ef:ffd0:ce49 with SMTP id l23csp1002971lqp; Fri, 22 Mar 2024 02:35:40 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCUvZV/x091dobfx3qEfSe8HkpdH7oPey7Z5kemZOKDLqwdhBDoNJV3blhk6ZSYBhDJdAN1eoZ1Di3i0q7RDjZe3V0c6qxHNZJ+t9NSRHQ== X-Google-Smtp-Source: AGHT+IGHFPsJQs33+fsQKTfGU13gFSKGX+sYftASKlE3efwFp5pFmA1HX8hjS9aC0WsL8DiOoA2z X-Received: by 2002:a81:9e53:0:b0:610:e262:2675 with SMTP id n19-20020a819e53000000b00610e2622675mr2065285ywj.25.1711100140231; Fri, 22 Mar 2024 02:35:40 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1711100140; cv=pass; d=google.com; s=arc-20160816; b=N4wawH2/wwV8EzNQoEJe+uhu9zE7/3C57Uy6tQZfUXM3RwBrDETP1ujxKq3RFv0KYr ibTfjm4QprUunh9znaZ/ANk4S7lqJHKe5p6D6w4KaC0vOp8EJ1k6LxsgTDqfKtJV9l6A Wt91YvBSBVXkvnH5vkoH3J2fMiFfwPwoym79QF1f25GNv+AtM2syAjgGIF02D1yIwlAB RlMxTPwhMb5UUKluyjzBS+6lPXX6nNpofPisptv35L4aKrjHk+c5PsLzww7wt7AgN/W1 az05zqLqHEKIzgvzyKhNhwETjyEMvLAgSctYlnapBxnPRvdgvvfexrfwhuyX7yTdKQJ0 OLWA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=in-reply-to:content-disposition:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:message-id:subject:cc :to:from:date:dkim-signature; bh=V8XnGniVOsPI2baxsgJljrT2TX922jSQgXNavzomgOw=; fh=WfpwFwVEj24zwR92bZPT8UkZcFPphawJtKLkW/jAW9s=; b=KTYQTIwkvsLCsySHs+DsxZtHqX0q0MEovBIV32u3pfp3ASoRc/d55k9UuBZIx8rEks qO4pYxe5sbYJS6Y/DdM3CjCenMKvGawAdtwlPf6SSvgP4Gf8/YaMjcXpV1Ftrvf2KVzq Z6hNZTMTGtd/8MOHkAdzWyV72ZL0Tp7aHV5g3ycNYqxkAXK7aIz4054og0+yLgk2pdEF mu3n5pMG/GVR3hiBPV8jx8W3nUMcwG2pBeun04yUnBuxXRYMCQct+HkNbv6684cMmHju rewTXsCBmIJOra1K03IcT6mJB/bpmpelFMqJolmhsfvydubu1tWWm4D0vu0KoQiehkal gNlQ==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=d9YzxvCO; arc=pass (i=1 spf=pass spfdomain=ideasonboard.com dkim=pass dkdomain=ideasonboard.com); spf=pass (google.com: domain of linux-kernel+bounces-111223-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-111223-linux.lists.archive=gmail.com@vger.kernel.org" Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id cb10-20020a05622a1f8a00b00431371cf26dsi182869qtb.46.2024.03.22.02.35.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Mar 2024 02:35:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-111223-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass (test mode) header.i=@ideasonboard.com header.s=mail header.b=d9YzxvCO; arc=pass (i=1 spf=pass spfdomain=ideasonboard.com dkim=pass dkdomain=ideasonboard.com); spf=pass (google.com: domain of linux-kernel+bounces-111223-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-111223-linux.lists.archive=gmail.com@vger.kernel.org" Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id E7A071C212EF for ; Fri, 22 Mar 2024 09:35:39 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 691BD21370; Fri, 22 Mar 2024 09:35:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b="d9YzxvCO" Received: from perceval.ideasonboard.com (perceval.ideasonboard.com [213.167.242.64]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 77E56199AD; Fri, 22 Mar 2024 09:35:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=213.167.242.64 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711100130; cv=none; b=OKBWaxGG9a6j1y66RSvAZmFKIrClqYfTpT9gJWz3Hc4B5OD1i+gqCPEaA0a/VUQVdPBwDzn2M56kjWwvjkTmjNPHnOuh2DXMLVK+qGrGWQqX4qSFxuap35+54X+kkPcSAIdQzWedgFqgYqlIgYWWM1IEA6uu28OirpsYsay9fVw= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1711100130; c=relaxed/simple; bh=CKiXwlIgm9grSEOBKwbrUzEK7jX746Nv0f9cDrdsS6Y=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=l8Z6jvgzp/yD82DBI6Qh0Vrxx+fP0+FDltS73smrbOT7yPdqC7zNWWP+zuDcUi9X9aGO3uTmbKezJ8ke6oaD5fUDIx/1In09C+PDsdUkwtvhaXooDuiv+LQuzY7eO0uvuIyxKFcqwaFyBbGkA89YA3uDlLi1RiHtNalxqdm4bBw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com; spf=pass smtp.mailfrom=ideasonboard.com; dkim=pass (1024-bit key) header.d=ideasonboard.com header.i=@ideasonboard.com header.b=d9YzxvCO; arc=none smtp.client-ip=213.167.242.64 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ideasonboard.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ideasonboard.com Received: from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi [81.175.209.231]) by perceval.ideasonboard.com (Postfix) with ESMTPSA id 0C50782A; Fri, 22 Mar 2024 10:34:57 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com; s=mail; t=1711100098; bh=CKiXwlIgm9grSEOBKwbrUzEK7jX746Nv0f9cDrdsS6Y=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=d9YzxvCOjLs7kmdP8sE+Ag/sIYqX/E4HX4s32+oS9SIJHx+KvMabhxdD2aCbjMlVH y3averLSxhS1Gb7l8tGXrdMv4xkfD+MSI6W1OQTQG05lRQYFd+kTY1axTI2xTtDUav lLiTd4XxJF6Lc8HNsdU6ZCsGEs72Xjn7i5PrMzQE= Date: Fri, 22 Mar 2024 11:35:22 +0200 From: Laurent Pinchart To: Ricardo Ribalda Cc: Mauro Carvalho Chehab , Sergey Senozhatsky , linux-kernel@vger.kernel.org, "hn.chen" , linux-media@vger.kernel.org Subject: Re: [PATCH v9 6/6] media: uvcvideo: Fix hw timestamp handling for slow FPS Message-ID: <20240322093522.GN18799@pendragon.ideasonboard.com> References: <20220920-resend-hwtimestamp-v9-0-55a89f46f6be@chromium.org> <20220920-resend-hwtimestamp-v9-6-55a89f46f6be@chromium.org> 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-Disposition: inline In-Reply-To: <20220920-resend-hwtimestamp-v9-6-55a89f46f6be@chromium.org> Hi Ricardo, Thank you for the patch. On Wed, Mar 15, 2023 at 02:30:17PM +0100, Ricardo Ribalda wrote: > In UVC 1.5 we get a single clock value per frame. With the current > buffer size of 32, FPS slowers than 32 might roll-over twice. > > The current code cannot handle two roll-over and provide invalid > timestamps. > > Revome all the samples from the circular buffer that are more than two s/Revome/Remove/ > rollovers old, so the algorithm always provides good timestamps. Wouldn't it be better to support multiple rollovers instead ? > Note that we are removing values that are more than one second old, > which means that there is enough distance between the two points that > we use for the interpolation to provide good values. > > Tested-by: HungNien Chen > Signed-off-by: Ricardo Ribalda > --- > drivers/media/usb/uvc/uvc_video.c | 24 ++++++++++++++++++++++++ > drivers/media/usb/uvc/uvcvideo.h | 1 + > 2 files changed, 25 insertions(+) > > diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c > index 1db0d1bc80e6..c58b51207be6 100644 > --- a/drivers/media/usb/uvc/uvc_video.c > +++ b/drivers/media/usb/uvc/uvc_video.c > @@ -471,8 +471,31 @@ static void uvc_video_clock_add_sample(struct uvc_clock *clock, > { > unsigned long flags; > > + /* > + * If we write new data on the position where we had the last > + * overflow, remove the overflow pointer. There is no overflow > + * on the whole circular buffer. > + */ > + if (clock->head == clock->last_sof_overflow) > + clock->last_sof_overflow = -1; > + > spin_lock_irqsave(&clock->lock, flags); > > + /* Handle overflows */ > + if (clock->count > 0 && clock->last_sof > sample->dev_sof) { > + /* > + * Remove data from the circular buffer that is older than the > + * last overflow. We only support one overflow per circular > + * buffer. > + */ > + if (clock->last_sof_overflow != -1) { > + clock->count = (clock->head - clock->last_sof_overflow > + + clock->count) % clock->count; > + } > + clock->last_sof_overflow = clock->head; > + } > + > + /* Add sample */ > memcpy(&clock->samples[clock->head], sample, sizeof(*sample)); > clock->head = (clock->head + 1) % clock->size; > clock->count = min(clock->count + 1, clock->size); > @@ -605,6 +628,7 @@ static void uvc_video_clock_reset(struct uvc_clock *clock) > clock->head = 0; > clock->count = 0; > clock->last_sof = -1; > + clock->last_sof_overflow = -1; > clock->sof_offset = -1; > } > > diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h > index 07b2fdb80adf..bf9f5162b833 100644 > --- a/drivers/media/usb/uvc/uvcvideo.h > +++ b/drivers/media/usb/uvc/uvcvideo.h > @@ -499,6 +499,7 @@ struct uvc_streaming { > unsigned int head; > unsigned int count; > unsigned int size; > + unsigned int last_sof_overflow; > > u16 last_sof; > u16 sof_offset; > -- Regards, Laurent Pinchart