All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ricardo Ribalda <ribalda@chromium.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: linux-kernel@vger.kernel.org, "hn.chen" <hn.chen@sunplusit.com>,
	Ricardo Ribalda <ribalda@chromium.org>,
	linux-media@vger.kernel.org
Subject: [PATCH v3 6/8] media: uvcvideo: Allow hw clock updates with buffers not full
Date: Wed, 04 Jan 2023 11:45:24 +0100	[thread overview]
Message-ID: <20220920-resend-hwtimestamp-v3-6-db9faee7f47d@chromium.org> (raw)
In-Reply-To: <20220920-resend-hwtimestamp-v3-0-db9faee7f47d@chromium.org>

With UVC 1.5 we get as little as one clock sample per frame. Which means
that it takes 32 frames to move from the software timestamp to the
hardware timestamp method.

This results in abrupt changes in the timestamping after 32 frames (~1
second), resulting in noticeable artifacts when used for encoding.

With this patch we modify the update algorithm to work with whatever
amount of values are available.

Tested-by: HungNien Chen <hn.chen@sunplusit.com>
Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
---
 drivers/media/usb/uvc/uvc_video.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
index fe5c7b465adf..5c37b080e0c6 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -743,10 +743,10 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
 
 	spin_lock_irqsave(&clock->lock, flags);
 
-	if (clock->count < clock->size)
+	if (clock->count < 2)
 		goto done;
 
-	first = &clock->samples[clock->head];
+	first = &clock->samples[(clock->head - clock->count) % clock->size];
 	last = &clock->samples[(clock->head - 1) % clock->size];
 
 	/* First step, PTS to SOF conversion. */
@@ -761,6 +761,15 @@ void uvc_video_clock_update(struct uvc_streaming *stream,
 	if (y2 < y1)
 		y2 += 2048 << 16;
 
+	/*
+	 * Have at least 1/4 of a second of timestamps before we
+	 * try to do any calculation. Otherwise we do not have enough
+	 * precision. This value was determined by running Android CTS
+	 * on different devices.
+	 */
+	if ((y2 - y1) < (256 << 16))
+		goto done;
+
 	y = (u64)(y2 - y1) * (1ULL << 31) + (u64)y1 * (u64)x2
 	  - (u64)y2 * (u64)x1;
 	y = div_u64(y, x2 - x1);

-- 
2.39.0.314.g84b9a713c41-goog-b4-0.11.0-dev-696ae

  parent reply	other threads:[~2023-01-04 10:46 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-04 10:45 [PATCH v3 0/8] [PATCH 0/8] uvcvideo: Fixes for hw timestamping Ricardo Ribalda
2023-01-04 10:45 ` [PATCH v3 1/8] media: uvcvideo: Extend documentation of uvc_video_clock_decode() Ricardo Ribalda
2023-01-04 10:45 ` [PATCH v3 2/8] media: uvc: Allow quirking by entity guid Ricardo Ribalda
2023-01-04 10:45 ` [PATCH v3 3/8] media: uvc: Create UVC_QUIRK_IGNORE_EMPTY_TS quirk Ricardo Ribalda
2023-01-07  1:20   ` Laurent Pinchart
2023-01-04 10:45 ` [PATCH v3 4/8] media: uvcvideo: Quirk for invalid dev_sof in Logitech C922 Ricardo Ribalda
2023-01-04 10:45 ` [PATCH v3 5/8] media: uvcvideo: Quirk for autosuspend in Logitech B910 and C910 Ricardo Ribalda
2023-01-07  1:25   ` Laurent Pinchart
2023-01-04 10:45 ` Ricardo Ribalda [this message]
2023-01-04 10:45 ` [PATCH v3 7/8] media: uvcvideo: Refactor clock circular buffer Ricardo Ribalda
2023-01-04 10:45 ` [PATCH v3 8/8] media: uvcvideo: Fix hw timestamp handling for slow FPS Ricardo Ribalda

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20220920-resend-hwtimestamp-v3-6-db9faee7f47d@chromium.org \
    --to=ribalda@chromium.org \
    --cc=hn.chen@sunplusit.com \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-media@vger.kernel.org \
    --cc=mchehab@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.