From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Cc: linux-media@vger.kernel.org, Hans Verkuil <hverkuil@xs4all.nl>
Subject: Re: [PATCH v8] uvcvideo: Add a metadata device node
Date: Mon, 11 Dec 2017 22:16:23 +0200 [thread overview]
Message-ID: <6758104.TntGDxqkIy@avalon> (raw)
In-Reply-To: <alpine.DEB.2.20.1712061202230.26640@axis700.grange>
Hi Guennadi,
Thank you for the patch.
On Wednesday, 6 December 2017 17:15:40 EET Guennadi Liakhovetski wrote:
> From: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
>
> Some UVC video cameras contain metadata in their payload headers. This
> patch extracts that data, adding more clock synchronisation information,
> on both bulk and isochronous endpoints and makes it available to the user
> space on a separate video node, using the V4L2_CAP_META_CAPTURE capability
> and the V4L2_BUF_TYPE_META_CAPTURE buffer queue type. By default, only the
> V4L2_META_FMT_UVC pixel format is available from those nodes. However,
> cameras can be added to the device ID table to additionally specify their
> own metadata format, in which case that format will also become available
> from the metadata node.
>
> Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@intel.com>
> ---
>
> v8: addressed comments and integrated changes from Laurent, thanks again,
> e.g.:
>
> - multiple stylistic changes
> - remove the UVC_DEV_FLAG_METADATA_NODE flag / quirk: nodes are now
> created unconditionally
> - reuse uvc_ioctl_querycap()
> - reuse code in uvc_register_video()
> - set an error flag when the metadata buffer overflows
>
> drivers/media/usb/uvc/Makefile | 2 +-
> drivers/media/usb/uvc/uvc_driver.c | 15 ++-
> drivers/media/usb/uvc/uvc_isight.c | 2 +-
> drivers/media/usb/uvc/uvc_metadata.c | 179 ++++++++++++++++++++++++++++++++
> drivers/media/usb/uvc/uvc_queue.c | 44 +++++++--
> drivers/media/usb/uvc/uvc_video.c | 132 ++++++++++++++++++++++++--
> drivers/media/usb/uvc/uvcvideo.h | 16 +++-
> include/uapi/linux/uvcvideo.h | 26 +++++
> 8 files changed, 394 insertions(+), 22 deletions(-)
> create mode 100644 drivers/media/usb/uvc/uvc_metadata.c
[snip]
> diff --git a/drivers/media/usb/uvc/uvc_video.c
> b/drivers/media/usb/uvc/uvc_video.c index 13f459e..2fc0bf2 100644
> --- a/drivers/media/usb/uvc/uvc_video.c
> +++ b/drivers/media/usb/uvc/uvc_video.c
[snip]
> +static void uvc_video_decode_meta(struct uvc_streaming *stream,
> + struct uvc_buffer *meta_buf,
> + const u8 *mem, unsigned int length)
> +{
> + struct uvc_meta_buf *meta;
> + size_t len_std = 2;
> + bool has_pts, has_scr;
> + unsigned long flags;
> + ktime_t time;
> + const u8 *scr;
> +
> + if (!meta_buf || length == 2)
> + return;
> +
> + if (meta_buf->length - meta_buf->bytesused <
> + length + sizeof(meta->ns) + sizeof(meta->sof)) {
> + meta_buf->error = 1;
> + return;
> + }
> +
> + has_pts = mem[1] & UVC_STREAM_PTS;
> + has_scr = mem[1] & UVC_STREAM_SCR;
> +
> + if (has_pts) {
> + len_std += 4;
> + scr = mem + 6;
> + } else {
> + scr = mem + 2;
> + }
> +
> + if (has_scr)
> + len_std += 6;
> +
> + if (stream->meta.format == V4L2_META_FMT_UVC)
> + length = len_std;
> +
> + if (length == len_std && (!has_scr ||
> + !memcmp(scr, stream->clock.last_scr, 6)))
> + return;
> +
> + meta = (struct uvc_meta_buf *)((u8 *)meta_buf->mem + meta_buf->bytesused);
> + local_irq_save(flags);
> + time = uvc_video_get_time();
> + meta->sof = usb_get_current_frame_number(stream->dev->udev);
You need a put_unaligned here too. If you're fine with the patch below there's
no need to resubmit, and
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Would you mind sending me your test tool patch ?
diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/
uvc_video.c
index 2fc0bf2221db..02e4997a32bb 100644
--- a/drivers/media/usb/uvc/uvc_video.c
+++ b/drivers/media/usb/uvc/uvc_video.c
@@ -1142,6 +1142,7 @@ static void uvc_video_decode_meta(struct uvc_streaming
*stream,
size_t len_std = 2;
bool has_pts, has_scr;
unsigned long flags;
+ unsigned int sof;
ktime_t time;
const u8 *scr;
@@ -1177,9 +1178,10 @@ static void uvc_video_decode_meta(struct uvc_streaming
*stream,
meta = (struct uvc_meta_buf *)((u8 *)meta_buf->mem + meta_buf->bytesused);
local_irq_save(flags);
time = uvc_video_get_time();
- meta->sof = usb_get_current_frame_number(stream->dev->udev);
+ sof = usb_get_current_frame_number(stream->dev->udev);
local_irq_restore(flags);
__put_unaligned_cpu64(ktime_to_ns(time), &meta->ns);
+ __put_unaligned_cpu16(sof, &meta->sof);
if (has_scr)
memcpy(stream->clock.last_scr, scr, 6);
> + local_irq_restore(flags);
> + __put_unaligned_cpu64(ktime_to_ns(time), &meta->ns);
> +
> + if (has_scr)
> + memcpy(stream->clock.last_scr, scr, 6);
> +
> + memcpy(&meta->length, mem, length);
> + meta_buf->bytesused += length + sizeof(meta->ns) + sizeof(meta->sof);
> +
> + uvc_trace(UVC_TRACE_FRAME,
> + "%s(): t-sys %lluns, SOF %u, len %u, flags 0x%x, PTS %u, STC %u frame
> SOF %u\n", + __func__, time, meta->sof, meta->length, meta->flags,
> + has_pts ? *(u32 *)meta->buf : 0,
> + has_scr ? *(u32 *)scr : 0,
> + has_scr ? *(u32 *)(scr + 4) & 0x7ff : 0);
> +}
[snip]
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2017-12-11 20:16 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-08 16:00 [PATCH 0/3 v7] uvcvideo: metadata nodes Guennadi Liakhovetski
2017-11-08 16:00 ` [PATCH 1/3 v7] V4L: Add a UVC Metadata format Guennadi Liakhovetski
2017-11-28 15:20 ` Laurent Pinchart
2017-11-28 15:26 ` Guennadi Liakhovetski
2017-11-08 16:00 ` [PATCH 2/3 v7] uvcvideo: add extensible device information Guennadi Liakhovetski
2017-11-28 15:55 ` Laurent Pinchart
2017-11-28 16:20 ` Guennadi Liakhovetski
2017-11-08 16:00 ` [PATCH 3/3 v7] uvcvideo: add a metadata device node Guennadi Liakhovetski
2017-12-05 0:24 ` Laurent Pinchart
2017-12-05 1:03 ` Laurent Pinchart
2017-12-05 8:06 ` Guennadi Liakhovetski
2017-12-05 9:44 ` Laurent Pinchart
2017-12-05 10:56 ` Guennadi Liakhovetski
2017-12-05 13:35 ` Laurent Pinchart
2017-12-05 13:44 ` Guennadi Liakhovetski
2017-12-05 13:49 ` Laurent Pinchart
2017-12-05 14:00 ` Guennadi Liakhovetski
2017-12-06 15:08 ` Guennadi Liakhovetski
2017-12-11 19:53 ` Laurent Pinchart
2017-12-06 15:15 ` [PATCH v8] uvcvideo: Add " Guennadi Liakhovetski
2017-12-11 20:16 ` Laurent Pinchart [this message]
2017-12-11 21:15 ` Laurent Pinchart
2017-12-11 21:44 ` Guennadi Liakhovetski
2017-12-11 21:53 ` Laurent Pinchart
2017-12-12 8:30 ` Guennadi Liakhovetski
2017-12-13 9:41 ` Laurent Pinchart
2017-12-13 9:51 ` Guennadi Liakhovetski
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=6758104.TntGDxqkIy@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=g.liakhovetski@gmx.de \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.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.