On 11/13/2018 10:42 AM, Hans Verkuil wrote:
> From: Hans Verkuil <hans.verk...@cisco.com>
> 
> Add support for 'tags' to struct v4l2_buffer. These can be used
> by m2m devices so userspace can set a tag for an output buffer and
> this value will then be copied to the capture buffer(s).
> 
> This tag can be used to refer to capture buffers, something that
> is needed by stateless HW codecs.
> 
> The new V4L2_BUF_CAP_SUPPORTS_TAGS capability indicates whether
> or not tags are supported.
> 
> Signed-off-by: Hans Verkuil <hans.verk...@cisco.com>
> ---
>  include/uapi/linux/videodev2.h | 38 +++++++++++++++++++++++++++++++++-
>  1 file changed, 37 insertions(+), 1 deletion(-)
> 
> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
> index c8e8ff810190..ec1fef2a9445 100644
> --- a/include/uapi/linux/videodev2.h
> +++ b/include/uapi/linux/videodev2.h
> @@ -879,6 +879,7 @@ struct v4l2_requestbuffers {
>  #define V4L2_BUF_CAP_SUPPORTS_USERPTR        (1 << 1)
>  #define V4L2_BUF_CAP_SUPPORTS_DMABUF (1 << 2)
>  #define V4L2_BUF_CAP_SUPPORTS_REQUESTS       (1 << 3)
> +#define V4L2_BUF_CAP_SUPPORTS_TAGS   (1 << 4)
>  
>  /**
>   * struct v4l2_plane - plane info for multi-planar buffers
> @@ -912,6 +913,11 @@ struct v4l2_plane {
>       __u32                   reserved[11];
>  };
>  
> +struct v4l2_buffer_tag {
> +     __u32 low;
> +     __u32 high;
> +};
> +
>  /**
>   * struct v4l2_buffer - video buffer info
>   * @index:   id number of the buffer
> @@ -950,7 +956,10 @@ struct v4l2_buffer {
>       __u32                   flags;
>       __u32                   field;
>       struct timeval          timestamp;
> -     struct v4l2_timecode    timecode;
> +     union {
> +             struct v4l2_timecode    timecode;
> +             struct v4l2_buffer_tag  tag;
> +     };
>       __u32                   sequence;
>  
>       /* memory location */
> @@ -988,6 +997,8 @@ struct v4l2_buffer {
>  #define V4L2_BUF_FLAG_IN_REQUEST             0x00000080
>  /* timecode field is valid */
>  #define V4L2_BUF_FLAG_TIMECODE                       0x00000100
> +/* tag field is valid */
> +#define V4L2_BUF_FLAG_TAG                    0x00000200
>  /* Buffer is prepared for queuing */
>  #define V4L2_BUF_FLAG_PREPARED                       0x00000400
>  /* Cache handling flags */
> @@ -1007,6 +1018,31 @@ struct v4l2_buffer {
>  /* request_fd is valid */
>  #define V4L2_BUF_FLAG_REQUEST_FD             0x00800000
>  
> +static inline void v4l2_buffer_set_tag(struct v4l2_buffer *buf, __u64 tag)
> +{
> +     buf->tag.high = tag >> 32;
> +     buf->tag.low = tag & 0xffffffffULL;
> +     buf->flags |= V4L2_BUF_FLAG_TAG;
> +}
> +
> +static inline void v4l2_buffer_set_tag_ptr(struct v4l2_buffer *buf,
> +                                        const void *tag)
> +{
> +     v4l2_buffer_set_tag(buf, (uintptr_t)tag);
> +}
> +
> +static inline __u64 v4l2_buffer_get_tag(const struct v4l2_buffer *buf)
> +{
> +     if (!(buf->flags & V4L2_BUF_FLAG_TAG))
> +             return 0;
> +     return (((__u64)buf->tag.high) << 32) | (__u64)buf->tag.low;
> +}
> +
> +static inline void *v4l2_buffer_get_tag_ptr(const struct v4l2_buffer *buf)
> +{
> +     return (void *)(uintptr_t)v4l2_buffer_get_tag(buf);
> +}
> +

I'm reconsidering my decision to use a u64 for the tag. It is too fiddly due
to the fact that I have to use a struct v4l2_buffer_tag. I think I'll just
use a u32.

I'll post a new version where I make this change.

Regards,

        Hans

>  /**
>   * struct v4l2_exportbuffer - export of video buffer as DMABUF file 
> descriptor
>   *
> 

Reply via email to