On Friday 30 July 2010 10:49:41 Pawel Osciak wrote:
> Multi-planar API is as a backwards-compatible extension of the V4L2 API,
> which allows video buffers to consist of one or more planes. Planes are
> separate memory buffers; each has its own mapping, backed by usually
> separate physical memory buffers.
> 
> Many different uses for the multi-planar API are possible, examples
> include:
> - embedded devices requiring video components to be placed in physically
> separate buffers, e.g. for Samsung S3C/S5P SoC series' video codec,
> Y and interleaved Cb/Cr components reside in buffers in different
> memory banks;
> - applications may receive (or choose to store) video data of one video
> buffer in separate memory buffers; such data would have to be temporarily
> copied together into one buffer before passing it to a V4L2 device;
> - applications or drivers may want to pass metadata related to a buffer and
> it may not be possible to place it in the same buffer, together with video
> data.
> 
> Signed-off-by: Pawel Osciak <p.osc...@samsung.com>
> Signed-off-by: Kyungmin Park <kyungmin.p...@samsung.com>
> Reviewed-by: Marek Szyprowski <m.szyprow...@samsung.com>
> ---
>  drivers/media/video/v4l2-ioctl.c |    2 +
>  include/linux/videodev2.h        |  126 
> +++++++++++++++++++++++++++++++++++++-
>  2 files changed, 126 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/media/video/v4l2-ioctl.c 
> b/drivers/media/video/v4l2-ioctl.c
> index 0eeceae..a830bbd 100644
> --- a/drivers/media/video/v4l2-ioctl.c
> +++ b/drivers/media/video/v4l2-ioctl.c
> @@ -168,6 +168,8 @@ const char *v4l2_type_names[] = {
>       [V4L2_BUF_TYPE_SLICED_VBI_CAPTURE] = "sliced-vbi-cap",
>       [V4L2_BUF_TYPE_SLICED_VBI_OUTPUT]  = "sliced-vbi-out",
>       [V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY] = "vid-out-overlay",
> +     [V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE] = "vid-cap-mplane",
> +     [V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE] = "vid-out-mplane",
>  };
>  EXPORT_SYMBOL(v4l2_type_names);
>  
> diff --git a/include/linux/videodev2.h b/include/linux/videodev2.h
> index 047f7e6..0379f07 100644
> --- a/include/linux/videodev2.h
> +++ b/include/linux/videodev2.h
> @@ -70,6 +70,7 @@
>   * Moved from videodev.h
>   */
>  #define VIDEO_MAX_FRAME               32
> +#define VIDEO_MAX_PLANES               8
>  
>  #ifndef __KERNEL__
>  
> @@ -157,9 +158,23 @@ enum v4l2_buf_type {
>       /* Experimental */
>       V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
>  #endif
> +     V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 17,
> +     V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE  = 18,

Why 17 and 18 instead of 9 and 10?

>       V4L2_BUF_TYPE_PRIVATE              = 0x80,
>  };
>  
> +#define V4L2_TYPE_IS_MULTIPLANAR(type)                       \
> +     ((type) == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE   \
> +      || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE)
> +
> +#define V4L2_TYPE_IS_OUTPUT(type)                            \
> +     ((type) == V4L2_BUF_TYPE_VIDEO_OUTPUT                   \
> +      || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE         \
> +      || (type) == V4L2_BUF_TYPE_VIDEO_OVERLAY               \
> +      || (type) == V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY        \
> +      || (type) == V4L2_BUF_TYPE_VBI_OUTPUT                  \
> +      || (type) == V4L2_BUF_TYPE_SLICED_VBI_OUTPUT)
> +
>  enum v4l2_tuner_type {
>       V4L2_TUNER_RADIO             = 1,
>       V4L2_TUNER_ANALOG_TV         = 2,
> @@ -245,6 +260,11 @@ struct v4l2_capability {
>  #define V4L2_CAP_HW_FREQ_SEEK                0x00000400  /* Can do hardware 
> frequency seek  */
>  #define V4L2_CAP_RDS_OUTPUT          0x00000800  /* Is an RDS encoder */
>  
> +/* Is a video capture device that supports multiplanar formats */
> +#define V4L2_CAP_VIDEO_CAPTURE_MPLANE        0x00001000
> +/* Is a video output device that supports multiplanar formats */
> +#define V4L2_CAP_VIDEO_OUTPUT_MPLANE 0x00002000
> +
>  #define V4L2_CAP_TUNER                       0x00010000  /* has a tuner */
>  #define V4L2_CAP_AUDIO                       0x00020000  /* has audio 
> support */
>  #define V4L2_CAP_RADIO                       0x00040000  /* is a radio 
> device */
> @@ -514,6 +534,63 @@ struct v4l2_requestbuffers {
>       __u32                   reserved[2];
>  };
>  
> +/**
> + * struct v4l2_plane - plane info for multi-planar buffers
> + * @bytesused:               number of bytes occupied by data in the plane 
> (payload)
> + * @mem_offset:              when memory in the associated struct 
> v4l2_buffer is
> + *                   V4L2_MEMORY_MMAP, equals the offset from the start of
> + *                   the device memory for this plane (or is a "cookie" that
> + *                   should be passed to mmap() called on the video node)
> + * @userptr:         when memory is V4L2_MEMORY_USERPTR, a userspace pointer
> + *                   pointing
> + *                   to this plane

Can be put on one line instead of two.

> + * @length:          size of this plane (NOT the payload) in bytes

Note: mismatch between the order of the fields here and in the actual struct.
@length should be after @bytesused.

> + * @data_offset:     offset in plane to the start of data/end of header,
> + *                   if relevant

I would rephrase this:

offset in the plane to the start of data. Usually this is 0, unless there is
a header in front of the data.


> + *
> + * Multi-planar buffers consist of one or more planes, e.g. an YCbCr buffer
> + * with two planes can have one plane for Y, and another for interleaved CbCr
> + * components. Each plane can reside in a separate memory buffer, or even in
> + * a completely separate memory node (e.g. in embedded devices).
> + */
> +struct v4l2_plane {
> +     __u32                   bytesused;
> +     __u32                   length;
> +     union {
> +             __u32           mem_offset;
> +             unsigned long   userptr;
> +     } m;
> +     __u32                   data_offset;
> +     __u32                   reserved[11];
> +};
> +
> +/**
> + * struct v4l2_buffer - video buffer info
> + * @index:   id number of the buffer
> + * @type:    buffer type (type == *_MPLANE for multiplanar buffers)
> + * @bytesused:       number of bytes occupied by data in the buffer 
> (payload);
> + *           unused (set to 0) for multiplanar buffers
> + * @flags:   buffer informational flags
> + * @field:   field order of the image in the buffer
> + * @timestamp:       frame timestamp
> + * @timecode:        frame timecode
> + * @sequence:        sequence count of this frame
> + * @memory:  the method, in which the actual video data is passed
> + * @offset:  for non-multiplanar buffers with memory == V4L2_MEMORY_MMAP;
> + *           offset from the start of the device memory for this plane,
> + *           (or a "cookie" that should be passed to mmap() as offset)
> + * @userptr: for non-multiplanar buffers with memory == V4L2_MEMORY_USERPTR;
> + *           a userspace pointer pointing to this buffer
> + * @planes:  for multiplanar buffers; userspace pointer to the array of plane
> + *           info structs for this buffer
> + * @length:  size in bytes of the buffer (NOT its payload) for single-plane
> + *           buffers (when type != *_MPLANE); number of planes (and number
> + *           of elements in the planes array) for multi-plane buffers

This is confusing. Just write "number of elements in the planes array".

> + * @input:   input number from which the video data has has been captured
> + *
> + * Contains data exchanged by application and driver using one of the 
> Streaming
> + * I/O methods.
> + */
>  struct v4l2_buffer {
>       __u32                   index;
>       enum v4l2_buf_type      type;
> @@ -529,6 +606,7 @@ struct v4l2_buffer {
>       union {
>               __u32           offset;
>               unsigned long   userptr;
> +             struct v4l2_plane *planes;

Should use the __user attribute.

>       } m;
>       __u32                   length;
>       __u32                   input;
> @@ -1613,12 +1691,57 @@ struct v4l2_mpeg_vbi_fmt_ivtv {
>   *   A G G R E G A T E   S T R U C T U R E S
>   */
>  
> -/*   Stream data format
> +/**
> + * struct v4l2_plane_pix_format - additional, per-plane format definition
> + * @sizeimage:               maximum size in bytes required for data, for 
> which
> + *                   this plane will be used
> + * @bytesperline:    distance in bytes between the leftmost pixels in two
> + *                   adjacent lines
> + */
> +struct v4l2_plane_pix_format {
> +     __u32           sizeimage;
> +     __u16           bytesperline;
> +     __u16           reserved[7];
> +} __attribute__ ((packed));
> +
> +/**
> + * struct v4l2_pix_format_mplane - multiplanar format definition
> + * @width:           image width in pixels
> + * @height:          image height in pixels
> + * @pixelformat:     little endian four character code (fourcc)
> + * @field:           field order (for interlaced video)
> + * @colorspace:              supplemental to pixelformat
> + * @plane_fmt:               per-plane information
> + * @num_planes:              number of planes for this format and number of 
> valid
> + *                   elements in plane_fmt array

Same problem here: just write "number of planes for this format".

> + */
> +struct v4l2_pix_format_mplane {
> +     __u32                           width;
> +     __u32                           height;
> +     __u32                           pixelformat;
> +     enum v4l2_field                 field;
> +     enum v4l2_colorspace            colorspace;
> +
> +     struct v4l2_plane_pix_format    plane_fmt[VIDEO_MAX_PLANES];
> +     __u8                            num_planes;
> +     __u8                            reserved[11];
> +} __attribute__ ((packed));
> +
> +/**
> + * struct v4l2_format - stream data format
> + * @type:    type of the data stream
> + * @pix:     definition of an image format
> + * @pix_mp:  definition of a multiplanar image format
> + * @win:     definition of an overlaid image
> + * @vbi:     raw VBI capture or output parameters
> + * @sliced:  sliced VBI capture or output parameters
> + * @raw_data:        placeholder for future extensions and custom formats
>   */
>  struct v4l2_format {
>       enum v4l2_buf_type type;
>       union {
>               struct v4l2_pix_format          pix;     /* 
> V4L2_BUF_TYPE_VIDEO_CAPTURE */
> +             struct v4l2_pix_format_mplane   pix_mp;  /* 
> V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
>               struct v4l2_window              win;     /* 
> V4L2_BUF_TYPE_VIDEO_OVERLAY */
>               struct v4l2_vbi_format          vbi;     /* 
> V4L2_BUF_TYPE_VBI_CAPTURE */
>               struct v4l2_sliced_vbi_format   sliced;  /* 
> V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
> @@ -1626,7 +1749,6 @@ struct v4l2_format {
>       } fmt;
>  };
>  
> -
>  /*   Stream type-dependent parameters
>   */
>  struct v4l2_streamparm {
> 

Regards,

        Hans

-- 
Hans Verkuil - video4linux developer - sponsored by TANDBERG, part of Cisco
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to