From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Sakari Ailus <sakari.ailus@iki.fi>
Cc: linux-media@vger.kernel.org, hverkuil@xs4all.nl
Subject: Re: [RFC 4/4] v4l: Tell user space we're using monotonic timestamps
Date: Sun, 04 Nov 2012 13:07:25 +0100 [thread overview]
Message-ID: <6800416.KHKIF7a4Tv@avalon> (raw)
In-Reply-To: <1351102583-682-4-git-send-email-sakari.ailus@iki.fi>
Hi Sakari,
Thanks for the patch.
On Wednesday 24 October 2012 21:16:23 Sakari Ailus wrote:
> Set buffer timestamp flags for videobuf, videobuf2 and drivers that use
> neither.
>
> Signed-off-by: Sakari Ailus <sakari.ailus@iki.fi>
> ---
> drivers/media/pci/meye/meye.c | 4 ++--
> drivers/media/pci/zoran/zoran_driver.c | 2 +-
> drivers/media/platform/omap3isp/ispqueue.c | 1 +
> drivers/media/platform/vino.c | 3 +++
> drivers/media/usb/cpia2/cpia2_v4l.c | 5 ++++-
> drivers/media/usb/sn9c102/sn9c102_core.c | 2 +-
> drivers/media/usb/stkwebcam/stk-webcam.c | 1 +
> drivers/media/usb/usbvision/usbvision-video.c | 5 +++--
> drivers/media/v4l2-core/videobuf-core.c | 2 +-
> drivers/media/v4l2-core/videobuf2-core.c | 10 ++++++----
> 10 files changed, 23 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/media/pci/meye/meye.c b/drivers/media/pci/meye/meye.c
> index 86713e0..d3e5ca0 100644
> --- a/drivers/media/pci/meye/meye.c
> +++ b/drivers/media/pci/meye/meye.c
> @@ -1426,7 +1426,7 @@ static int vidioc_querybuf(struct file *file, void
> *fh, struct v4l2_buffer *buf) return -EINVAL;
>
> buf->bytesused = meye.grab_buffer[index].size;
> - buf->flags = V4L2_BUF_FLAG_MAPPED;
> + buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
>
> if (meye.grab_buffer[index].state == MEYE_BUF_USING)
> buf->flags |= V4L2_BUF_FLAG_QUEUED;
> @@ -1499,7 +1499,7 @@ static int vidioc_dqbuf(struct file *file, void *fh,
> struct v4l2_buffer *buf)
>
> buf->index = reqnr;
> buf->bytesused = meye.grab_buffer[reqnr].size;
> - buf->flags = V4L2_BUF_FLAG_MAPPED;
> + buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> buf->field = V4L2_FIELD_NONE;
> buf->timestamp = meye.grab_buffer[reqnr].timestamp;
> buf->sequence = meye.grab_buffer[reqnr].sequence;
> diff --git a/drivers/media/pci/zoran/zoran_driver.c
> b/drivers/media/pci/zoran/zoran_driver.c index 53f12c7..33521a4 100644
> --- a/drivers/media/pci/zoran/zoran_driver.c
> +++ b/drivers/media/pci/zoran/zoran_driver.c
> @@ -1334,7 +1334,7 @@ static int zoran_v4l2_buffer_status(struct zoran_fh
> *fh, struct zoran *zr = fh->zr;
> unsigned long flags;
>
> - buf->flags = V4L2_BUF_FLAG_MAPPED;
> + buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
>
> switch (fh->map_mode) {
> case ZORAN_MAP_MODE_RAW:
> diff --git a/drivers/media/platform/omap3isp/ispqueue.c
> b/drivers/media/platform/omap3isp/ispqueue.c index 15bf3ea..6599963 100644
> --- a/drivers/media/platform/omap3isp/ispqueue.c
> +++ b/drivers/media/platform/omap3isp/ispqueue.c
> @@ -674,6 +674,7 @@ static int isp_video_queue_alloc(struct isp_video_queue
> *queue, buf->vbuf.index = i;
> buf->vbuf.length = size;
> buf->vbuf.type = queue->type;
> + buf->vbuf.flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> buf->vbuf.field = V4L2_FIELD_NONE;
> buf->vbuf.memory = memory;
>
> diff --git a/drivers/media/platform/vino.c b/drivers/media/platform/vino.c
> index 28350e7..eb5d6f9 100644
> --- a/drivers/media/platform/vino.c
> +++ b/drivers/media/platform/vino.c
> @@ -3410,6 +3410,9 @@ static void vino_v4l2_get_buffer_status(struct
> vino_channel_settings *vcs, if (fb->map_count > 0)
> b->flags |= V4L2_BUF_FLAG_MAPPED;
>
> + b->flags &= ~V4L2_BUF_FLAG_TIMESTAMP_MASK;
> + b->flags |= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> +
> b->index = fb->id;
> b->memory = (vcs->fb_queue.type == VINO_MEMORY_MMAP) ?
> V4L2_MEMORY_MMAP : V4L2_MEMORY_USERPTR;
> diff --git a/drivers/media/usb/cpia2/cpia2_v4l.c
> b/drivers/media/usb/cpia2/cpia2_v4l.c index aeb9d22..d5d42b6 100644
> --- a/drivers/media/usb/cpia2/cpia2_v4l.c
> +++ b/drivers/media/usb/cpia2/cpia2_v4l.c
> @@ -825,6 +825,8 @@ static int cpia2_querybuf(struct file *file, void *fh,
> struct v4l2_buffer *buf) else
> buf->flags = 0;
>
> + buf->flags |= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> +
> switch (cam->buffers[buf->index].status) {
> case FRAME_EMPTY:
> case FRAME_ERROR:
> @@ -943,7 +945,8 @@ static int cpia2_dqbuf(struct file *file, void *fh,
> struct v4l2_buffer *buf)
>
> buf->index = frame;
> buf->bytesused = cam->buffers[buf->index].length;
> - buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_DONE;
> + buf->flags = V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_DONE
> + | V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> buf->field = V4L2_FIELD_NONE;
> buf->timestamp = cam->buffers[buf->index].timestamp;
> buf->sequence = cam->buffers[buf->index].seq;
> diff --git a/drivers/media/usb/sn9c102/sn9c102_core.c
> b/drivers/media/usb/sn9c102/sn9c102_core.c index 843fadc..2e0e2ff 100644
> --- a/drivers/media/usb/sn9c102/sn9c102_core.c
> +++ b/drivers/media/usb/sn9c102/sn9c102_core.c
> @@ -173,7 +173,7 @@ sn9c102_request_buffers(struct sn9c102_device* cam, u32
> count, cam->frame[i].buf.sequence = 0;
> cam->frame[i].buf.field = V4L2_FIELD_NONE;
> cam->frame[i].buf.memory = V4L2_MEMORY_MMAP;
> - cam->frame[i].buf.flags = 0;
> + cam->frame[i].buf.flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> }
>
> return cam->nbuffers;
> diff --git a/drivers/media/usb/stkwebcam/stk-webcam.c
> b/drivers/media/usb/stkwebcam/stk-webcam.c index c22a4d0..459ebc6 100644
> --- a/drivers/media/usb/stkwebcam/stk-webcam.c
> +++ b/drivers/media/usb/stkwebcam/stk-webcam.c
> @@ -470,6 +470,7 @@ static int stk_setup_siobuf(struct stk_camera *dev, int
> index) buf->dev = dev;
> buf->v4lbuf.index = index;
> buf->v4lbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
> + buf->v4lbuf.flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> buf->v4lbuf.field = V4L2_FIELD_NONE;
> buf->v4lbuf.memory = V4L2_MEMORY_MMAP;
> buf->v4lbuf.m.offset = 2*index*buf->v4lbuf.length;
> diff --git a/drivers/media/usb/usbvision/usbvision-video.c
> b/drivers/media/usb/usbvision/usbvision-video.c index 5c36a57..c6bc8ce
> 100644
> --- a/drivers/media/usb/usbvision/usbvision-video.c
> +++ b/drivers/media/usb/usbvision/usbvision-video.c
> @@ -761,7 +761,7 @@ static int vidioc_querybuf(struct file *file,
> if (vb->index >= usbvision->num_frames)
> return -EINVAL;
> /* Updating the corresponding frame state */
> - vb->flags = 0;
> + vb->flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> frame = &usbvision->frame[vb->index];
> if (frame->grabstate >= frame_state_ready)
> vb->flags |= V4L2_BUF_FLAG_QUEUED;
> @@ -843,7 +843,8 @@ static int vidioc_dqbuf(struct file *file, void *priv,
> struct v4l2_buffer *vb) vb->memory = V4L2_MEMORY_MMAP;
> vb->flags = V4L2_BUF_FLAG_MAPPED |
> V4L2_BUF_FLAG_QUEUED |
> - V4L2_BUF_FLAG_DONE;
> + V4L2_BUF_FLAG_DONE |
> + V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> vb->index = f->index;
> vb->sequence = f->sequence;
> vb->timestamp = f->timestamp;
> diff --git a/drivers/media/v4l2-core/videobuf-core.c
> b/drivers/media/v4l2-core/videobuf-core.c index bf7a326..e98db7e 100644
> --- a/drivers/media/v4l2-core/videobuf-core.c
> +++ b/drivers/media/v4l2-core/videobuf-core.c
> @@ -337,7 +337,7 @@ static void videobuf_status(struct videobuf_queue *q,
> struct v4l2_buffer *b, break;
> }
>
> - b->flags = 0;
> + b->flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
> if (vb->map)
> b->flags |= V4L2_BUF_FLAG_MAPPED;
>
> diff --git a/drivers/media/v4l2-core/videobuf2-core.c
> b/drivers/media/v4l2-core/videobuf2-core.c index 432df11..19a5866 100644
> --- a/drivers/media/v4l2-core/videobuf2-core.c
> +++ b/drivers/media/v4l2-core/videobuf2-core.c
> @@ -40,9 +40,10 @@ module_param(debug, int, 0644);
> #define call_qop(q, op, args...) \
> (((q)->ops->op) ? ((q)->ops->op(args)) : 0)
>
> -#define V4L2_BUFFER_STATE_FLAGS (V4L2_BUF_FLAG_MAPPED |
> V4L2_BUF_FLAG_QUEUED | \ +#define
> V4L2_BUFFER_MASK_FLAGS (V4L2_BUF_FLAG_MAPPED | V4L2_BUF_FLAG_QUEUED | \
> V4L2_BUF_FLAG_DONE | V4L2_BUF_FLAG_ERROR | \
> - V4L2_BUF_FLAG_PREPARED)
> + V4L2_BUF_FLAG_PREPARED | \
> + V4L2_BUF_FLAG_TIMESTAMP_MASK)
>
> /**
> * __vb2_buf_mem_alloc() - allocate video memory for the given buffer
> @@ -367,7 +368,8 @@ static void __fill_v4l2_buffer(struct vb2_buffer *vb,
> struct v4l2_buffer *b) /*
> * Clear any buffer state related flags.
> */
> - b->flags &= ~V4L2_BUFFER_STATE_FLAGS;
> + b->flags &= ~V4L2_BUFFER_MASK_FLAGS;
> + b->flags |= V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
That's an issue. Drivers that use videobuf2 would always be restricted to
monotonic timestamps in the future, even if they provide support for a device-
specific clock.
Would it instead make sense to pass a v4l2_buffer pointer to
v4l2_get_timestamp() and set the monotonic flag there ? Not all callers of
v4l2_get_timestamp() might have a v4l2_buffer pointer though.
> switch (vb->state) {
> case VB2_BUF_STATE_QUEUED:
> @@ -863,7 +865,7 @@ static void __fill_vb2_buffer(struct vb2_buffer *vb,
> const struct v4l2_buffer *b
>
> vb->v4l2_buf.field = b->field;
> vb->v4l2_buf.timestamp = b->timestamp;
> - vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_STATE_FLAGS;
> + vb->v4l2_buf.flags = b->flags & ~V4L2_BUFFER_MASK_FLAGS;
> }
>
> /**
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2012-11-05 10:33 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-24 18:16 [RFC 0/4] Monotonic timestamps Sakari Ailus
2012-10-24 18:16 ` [RFC 1/4] v4l: Define video buffer flags for timestamp types Sakari Ailus
2012-11-04 12:05 ` Laurent Pinchart
2012-10-24 18:16 ` [RFC 2/4] v4l: Helper function for obtaining timestamps Sakari Ailus
2012-10-24 18:16 ` [RFC 3/4] v4l: Convert drivers to use monotonic timestamps Sakari Ailus
2012-10-24 18:16 ` [RFC 4/4] v4l: Tell user space we're using " Sakari Ailus
2012-11-04 12:07 ` Laurent Pinchart [this message]
2012-11-05 14:04 ` Sakari Ailus
2012-11-08 12:18 ` Laurent Pinchart
2012-11-08 22:33 ` Sakari Ailus
2012-11-12 12:17 ` Laurent Pinchart
2012-11-12 15:20 ` Sakari Ailus
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=6800416.KHKIF7a4Tv@avalon \
--to=laurent.pinchart@ideasonboard.com \
--cc=hverkuil@xs4all.nl \
--cc=linux-media@vger.kernel.org \
--cc=sakari.ailus@iki.fi \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox