walnux/include/nuttx/video/video.h
2021-03-09 23:18:28 +08:00

639 lines
21 KiB
C

/****************************************************************************
* include/nuttx/video/video.h
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
#ifndef __INCLUDE_NUTTX_VIDEO_H
#define __INCLUDE_NUTTX_VIDEO_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/compiler.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include "video_controls.h"
#ifdef __cplusplus
extern "C"
{
#endif
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
#define _VIDIOCBASE (0x1000)
#define _VIDIOC(nr) _IOC(_VIDIOCBASE,nr)
/* Enumerate the formats supported by device */
#define VIDIOC_ENUM_FMT _VIDIOC(0x0001)
/* Enumerate the framesizes supported by device */
#define VIDIOC_ENUM_FRAMESIZES _VIDIOC(0x0002)
/* Enumerate the frameintervals supported by device */
#define VIDIOC_ENUM_FRAMEINTERVALS _VIDIOC(0x0003)
/* Try format */
#define VIDIOC_TRY_FMT _VIDIOC(0x0004)
/* Set the data format. */
#define VIDIOC_S_FMT _VIDIOC(0x0005)
/* Set the frame interval. */
#define VIDIOC_S_PARM _VIDIOC(0x0006)
/* Initiate user pointer I/O */
#define VIDIOC_REQBUFS _VIDIOC(0x0007)
/* Enqueue an empty buffer */
#define VIDIOC_QBUF _VIDIOC(0x0008)
/* Dequeue a filled buffer */
#define VIDIOC_DQBUF _VIDIOC(0x0009)
/* Start streaming */
#define VIDIOC_STREAMON _VIDIOC(0x000A)
/* Stop streaming */
#define VIDIOC_STREAMOFF _VIDIOC(0x000B)
/* Do halfpush */
#define VIDIOC_DO_HALFPUSH _VIDIOC(0x000C)
/* Start taking picture
*
* Type is int32_t, not address pointer.\n
* 0 or negative value means continuing until VIDIOC_TAKEPICT_STOP. \n
* Positive value(to be supported) means continuing
* up to a specified number of times or until VIDIOC_TAKEPICT_STOP.
*/
#define VIDIOC_TAKEPICT_START _VIDIOC(0x000D)
/* Stop taking picture */
#define VIDIOC_TAKEPICT_STOP _VIDIOC(0x000E)
/* Query control */
#define VIDIOC_QUERYCTRL _VIDIOC(0x000F)
/* Query control */
#define VIDIOC_QUERY_EXT_CTRL _VIDIOC(0x0010)
/* Query menu */
#define VIDIOC_QUERYMENU _VIDIOC(0x0011)
/* Get current control value.
* This request is a special case of VIDIOC_G_EXT_CTRLS.
* Address pointing to struct #v4l2_control
*/
#define VIDIOC_G_CTRL _VIDIOC(0x0012)
/* Set control value.
* This request is a special case of VIDIOC_S_EXT_CTRLS.
* Address pointing to struct #v4l2_control
*/
#define VIDIOC_S_CTRL _VIDIOC(0x0013)
/* Get current control value
* Address pointing to struct #v4l2_ext_controls
*/
#define VIDIOC_G_EXT_CTRLS _VIDIOC(0x0014)
/* Set control value
* Address pointing to struct #v4l2_ext_controls
*/
#define VIDIOC_S_EXT_CTRLS _VIDIOC(0x0015)
/* Cancel DQBUF
* enum #v4l2_buf_type
*/
#define VIDIOC_CANCEL_DQBUF _VIDIOC(0x0016)
#define VIDEO_HSIZE_QVGA (320) /* QVGA horizontal size */
#define VIDEO_VSIZE_QVGA (240) /* QVGA vertical size */
#define VIDEO_HSIZE_VGA (640) /* VGA horizontal size */
#define VIDEO_VSIZE_VGA (480) /* VGA vertical size */
#define VIDEO_HSIZE_QUADVGA (1280) /* QUADVGA horizontal size */
#define VIDEO_VSIZE_QUADVGA (960) /* QUADVGA vertical size */
#define VIDEO_HSIZE_HD (1280) /* HD horizontal size */
#define VIDEO_VSIZE_HD (720) /* HD vertical size */
#define VIDEO_HSIZE_FULLHD (1920) /* FULLHD horizontal size */
#define VIDEO_VSIZE_FULLHD (1080) /* FULLHD vertical size */
#define VIDEO_HSIZE_5M (2560) /* 5M horizontal size */
#define VIDEO_VSIZE_5M (1920) /* 5M vertical size */
#define VIDEO_HSIZE_3M (2048) /* 3M horizontal size */
#define VIDEO_VSIZE_3M (1536) /* 3M vertical size */
/* Four-character-code (FOURCC) */
#define v4l2_fourcc(a, b, c, d)\
((uint32_t)(a) | ((uint32_t)(b) << 8) | \
((uint32_t)(c) << 16) | ((uint32_t)(d) << 24))
#define v4l2_fourcc_be(a, b, c, d) (v4l2_fourcc(a, b, c, d) | (1 << 31))
/* YUV 4:2:2 */
#define V4L2_PIX_FMT_UYVY v4l2_fourcc('U', 'Y', 'V', 'Y')
/* RGB565 */
#define V4L2_PIX_FMT_RGB565 v4l2_fourcc('R', 'G', 'B', 'P')
/* JFIF JPEG */
#define V4L2_PIX_FMT_JPEG v4l2_fourcc('J', 'P', 'E', 'G')
/* JPEG + sub image */
#define V4L2_PIX_FMT_JPEG_WITH_SUBIMG v4l2_fourcc('J', 'S', 'U', 'B')
/* MAX length of v4l2_fmtdesc description string */
#define V4L2_FMT_DSC_MAX (32)
/* MAX length of v4l2_query_ext_ctrl dims array */
#define V4L2_CTRL_MAX_DIMS (4)
/* MAX value of VIDIOC_REQBUFS count parameter */
#define V4L2_REQBUFS_COUNT_MAX (256)
/* Buffer error flag */
#define V4L2_BUF_FLAG_ERROR (0x0001)
/****************************************************************************
* Public Types
****************************************************************************/
/* Buffer type.
* Currently, support only V4L2_BUF_TYPE_VIDEO_CAPTURE and
* V4L2_BUF_TYPE_STILL_CAPTURE.
*/
enum v4l2_buf_type
{
V4L2_BUF_TYPE_VIDEO_CAPTURE = 1, /* single-planar video capture stream */
V4L2_BUF_TYPE_VIDEO_OUTPUT = 2, /* single-planar video output stream */
V4L2_BUF_TYPE_VIDEO_OVERLAY = 3, /* video overlay */
V4L2_BUF_TYPE_VBI_CAPTURE = 4, /* raw VBI capture stream */
V4L2_BUF_TYPE_VBI_OUTPUT = 5, /* raw VBI output stream */
V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6, /* sliced VBI capture stream */
V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7, /* sliced VBI output stream */
V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8, /* video output overlay */
V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE = 9, /* multi-planar video capture stream */
V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE = 10, /* multi-planar video output stream */
V4L2_BUF_TYPE_SDR_CAPTURE = 11, /* Software Defined Radio capture stream */
V4L2_BUF_TYPE_SDR_OUTPUT = 12, /* Software Defined Radio output stream */
V4L2_BUF_TYPE_META_CAPTURE = 13, /* metadata capture */
V4L2_BUF_TYPE_PRIVATE = 0x80, /* Deprecated, do not use */
V4L2_BUF_TYPE_STILL_CAPTURE = 0x81 /* single-planar still capture stream */
};
/* Memory I/O method. Currently, support only V4L2_MEMORY_USERPTR. */
enum v4l2_memory
{
V4L2_MEMORY_MMAP = 1, /* memory mapping I/O */
V4L2_MEMORY_USERPTR = 2, /* user pointer I/O */
V4L2_MEMORY_OVERLAY = 3, /* overlay I/O */
V4L2_MEMORY_DMABUF = 4, /* DMA shared buffer I/O */
};
/* Field order. Currently, support only V4L2_FIELD_ANY */
enum v4l2_field
{
V4L2_FIELD_ANY = 0, /* driver can choose from none, */
V4L2_FIELD_NONE = 1, /* this device has no fields ... */
V4L2_FIELD_TOP = 2, /* top field only */
V4L2_FIELD_BOTTOM = 3, /* bottom field only */
V4L2_FIELD_INTERLACED = 4, /* both fields interlaced */
V4L2_FIELD_SEQ_TB = 5, /* both fields sequential into one */
V4L2_FIELD_SEQ_BT = 6, /* same as above + bottom-top order */
V4L2_FIELD_ALTERNATE = 7, /* both fields alternating into */
V4L2_FIELD_INTERLACED_TB = 8, /* both fields interlaced, top field */
V4L2_FIELD_INTERLACED_BT = 9, /* both fields interlaced, top field */
};
/* Buffer mode */
enum v4l2_buf_mode
{
V4L2_BUF_MODE_RING = 0, /* Ring structure */
V4L2_BUF_MODE_FIFO = 1, /* FIFO structure */
};
struct v4l2_requestbuffers
{
uint32_t count; /* The number of buffers requested.
* Supported maximum is
* is V4L2_REQBUFS_COUNT_MAX(=256)
*/
uint32_t type; /* enum #v4l2_buf_type */
uint32_t memory; /* enum #v4l2_memory */
uint32_t mode; /* enum #v4l2_buf_mode */
};
typedef struct v4l2_requestbuffers v4l2_requestbuffers_t;
struct v4l2_timecode
{
uint32_t type;
uint32_t flags;
uint8_t frames;
uint8_t seconds;
uint8_t minutes;
uint8_t hours;
uint8_t userbits[4];
};
typedef struct v4l2_timecode v4l2_timecode_t;
struct v4l2_plane
{
uint32_t bytesused;
uint32_t length;
union
{
uint32_t mem_offset;
unsigned long userptr;
int fd;
} m;
uint32_t data_offset;
uint32_t reserved[11];
};
typedef struct v4l2_plane v4l2_plane_t;
/* struct v4l2_buffer
* Parameter of ioctl(VIDIOC_QBUF) and ioctl(VIDIOC_DQBUF).
* Currently, support only index, type, bytesused, memory,
* m.userptr, and length.
*/
struct v4l2_buffer
{
uint16_t index; /* buffer id */
uint16_t type; /* enum #v4l2_buf_type */
uint32_t bytesused; /* Driver sets the image size */
uint16_t flags; /* buffer flags. */
uint16_t field; /* the field order of the image */
struct v4l2_timecode timecode; /* frame timecode */
uint16_t sequence; /* frame sequence number */
uint16_t memory; /* enum #v4l2_memory */
union
{
uint32_t offset;
unsigned long userptr; /* address of buffer */
struct v4l2_plane *planes;
int fd;
} m;
uint32_t length; /* user set the buffer size */
};
typedef struct v4l2_buffer v4l2_buffer_t;
struct v4l2_fmtdesc
{
uint16_t index; /* Format number */
uint16_t type; /* enum v4l2_buf_type */
uint32_t flags;
char description[V4L2_FMT_DSC_MAX]; /* Description string */
uint32_t pixelformat; /* Format fourcc */
uint32_t subimg_pixelformat; /* Format fourcc */
};
enum v4l2_frmsizetypes
{
V4L2_FRMSIZE_TYPE_DISCRETE = 1, /* Discrete value */
V4L2_FRMSIZE_TYPE_CONTINUOUS = 2, /* Continuous value */
V4L2_FRMSIZE_TYPE_STEPWISE = 3, /* Step value */
};
struct v4l2_frmsize_discrete
{
uint16_t width; /* Frame width [pixel] */
uint16_t height; /* Frame height [pixel] */
};
struct v4l2_frmsize_stepwise
{
uint16_t min_width; /* Minimum frame width [pixel] */
uint16_t max_width; /* Maximum frame width [pixel] */
uint16_t step_width; /* Frame width step size [pixel] */
uint16_t min_height; /* Minimum frame height [pixel] */
uint16_t max_height; /* Maximum frame height [pixel] */
uint16_t step_height; /* Frame height step size [pixel] */
};
struct v4l2_frmsizeenum
{
uint32_t index; /* Frame size number */
uint32_t buf_type; /* enum #v4l2_buf_type */
uint32_t pixel_format; /* Pixel format */
uint32_t type; /* Frame size type the device supports. */
union
{ /* Frame size */
struct v4l2_frmsize_discrete discrete; /* Use in type =
* V4L2_FRMSIZE_TYPE_DISCRETE
* case
*/
struct v4l2_frmsize_stepwise stepwise; /* Use in type =
* V4L2_FRMSIZE_TYPE_CONTINUOUS
* or V4L2_FRMSIZE_TYPE_STEPWISE
* case
*/
};
uint32_t subimg_pixel_format; /* Pixel format of sub image */
uint32_t subimg_type; /* Frame size type of subimage. */
union
{ /* Frame size of subimage */
struct v4l2_frmsize_discrete discrete; /* Use in subimg_type =
* V4L2_FRMSIZE_TYPE_DISCRETE
* case
*/
struct v4l2_frmsize_stepwise stepwise; /* Use in subimg_type =
* V4L2_FRMSIZE_TYPE_CONTINUOUS
* or V4L2_FRMSIZE_TYPE_STEPWISE
* case
*/
} subimg;
};
/* type of frame interval enumeration */
enum v4l2_frmivaltypes
{
V4L2_FRMIVAL_TYPE_DISCRETE = 1, /* Discrete value */
V4L2_FRMIVAL_TYPE_CONTINUOUS = 2, /* Continuous value */
V4L2_FRMIVAL_TYPE_STEPWISE = 3, /* Step value */
};
/* Fraction */
struct v4l2_fract
{
uint32_t numerator; /* numerator */
uint32_t denominator; /* denominator */
};
/* frame interval enumeration with stepwise format */
struct v4l2_frmival_stepwise
{
struct v4l2_fract min; /* Minimum frame interval [s] */
struct v4l2_fract max; /* Maximum frame interval [s] */
struct v4l2_fract step; /* Frame interval step size [s] */
};
struct v4l2_frmivalenum
{
uint32_t index; /* Frame format index */
uint32_t buf_type; /* enum #v4l2_buf_type */
uint32_t pixel_format; /* Pixel format */
uint16_t width; /* Frame width */
uint16_t height; /* Frame height */
uint32_t subimg_pixel_format; /* Pixel format for sub image */
uint16_t subimg_width; /* Frame width for sub image */
uint16_t subimg_height; /* Frame height for sub image */
uint32_t type; /* Frame interval type */
union
{ /* Frame interval */
struct v4l2_fract discrete;
struct v4l2_frmival_stepwise stepwise;
};
};
/* Single-planar format structure. */
struct v4l2_pix_format
{
uint16_t width; /* Image width in pixels */
uint16_t height; /* Image height in pixels */
uint32_t pixelformat; /* The pixel format or type of compression. */
uint16_t subimg_width; /* sub image width in pixels in case of pixelformat = V4L2_PIX_FMT_JPEG_WITH_SUBIMG */
uint16_t subimg_height; /* sub image height in pixels in case of pixelformat = V4L2_PIX_FMT_JPEG_WITH_SUBIMG */
uint32_t subimg_pixelformat; /* The pixel format of sub image in case of pixelformat = V4L2_PIX_FMT_JPEG_WITH_SUBIMG */
uint32_t field; /* enum #v4l2_field */
uint32_t bytesperline; /* for padding, zero if unused */
uint32_t sizeimage; /* Size in bytes of the buffer to hold a complete image */
uint32_t colorspace; /* Image colorspace */
uint32_t priv; /* private data, depends on pixelformat */
uint32_t flags; /* format flags (V4L2_PIX_FMT_FLAG_*) */
union
{
uint32_t ycbcr_enc; /* enum v4l2_ycbcr_encoding */
uint32_t hsv_enc; /* enum v4l2_hsv_encoding */
};
uint32_t quantization; /* enum v4l2_quantization */
uint32_t xfer_func; /* enum v4l2_xfer_func */
};
typedef struct v4l2_pix_format v4l2_pix_format_t;
struct v4l2_format
{
uint32_t type; /* enum #v4l2_buf_type. */
union
{
struct v4l2_pix_format pix; /* image format */
} fmt;
};
typedef struct v4l2_format v4l2_format_t;
struct v4l2_captureparm
{
uint32_t capability; /* Supported modes */
uint32_t capturemode; /* Current mode */
struct v4l2_fract timeperframe; /* Time per frame in seconds */
uint32_t extendedmode; /* Driver-specific extensions */
uint32_t readbuffers; /* # of buffers for read */
};
struct v4l2_streamparm
{
uint32_t type; /* enum v4l2_buf_type */
union
{
struct v4l2_captureparm capture;
} parm;
};
enum v4l2_ctrl_type
{
V4L2_CTRL_TYPE_INTEGER = 1,
V4L2_CTRL_TYPE_BOOLEAN = 2,
V4L2_CTRL_TYPE_MENU = 3,
V4L2_CTRL_TYPE_BUTTON = 4,
V4L2_CTRL_TYPE_INTEGER64 = 5,
V4L2_CTRL_TYPE_CTRL_CLASS = 6,
V4L2_CTRL_TYPE_STRING = 7,
V4L2_CTRL_TYPE_BITMASK = 8,
V4L2_CTRL_TYPE_INTEGER_MENU = 9,
V4L2_CTRL_TYPE_U8FIXEDPOINT_Q7 = 10,
V4L2_CTRL_TYPE_U16FIXEDPOINT_Q8 = 11,
V4L2_CTRL_TYPE_INTEGER_TIMES_3 = 12,
/* Compound types are >= 0x0100 */
V4L2_CTRL_COMPOUND_TYPES = 0x0100,
V4L2_CTRL_TYPE_U8 = 0x0100,
V4L2_CTRL_TYPE_U16 = 0x0101,
V4L2_CTRL_TYPE_U32 = 0x0102,
};
struct v4l2_queryctrl
{
uint16_t ctrl_class; /* Control class */
uint16_t id; /* Control id */
uint16_t type; /* enum #v4l2_ctrl_type */
char name[32]; /* Name of control */
int32_t minimum; /* Minimum value */
int32_t maximum; /* Maximum value */
uint32_t step; /* step */
int32_t default_value; /* Default value */
uint32_t flags; /* Flag */};
struct v4l2_query_ext_ctrl
{
uint16_t ctrl_class; /* Control class */
uint16_t id; /* Control id */
uint16_t type; /* enum #v4l2_ctrl_type */
char name[32]; /* Name of control */
int64_t minimum; /* Minimum value */
int64_t maximum; /* Maximum value */
uint64_t step; /* step */
int64_t default_value; /* Default value */
uint32_t flags; /* Flag */
uint32_t elem_size; /* size of each element */
uint32_t elems; /* number of elements */
uint32_t nr_of_dims; /* number of dimensions */
uint32_t dims[V4L2_CTRL_MAX_DIMS]; /* Dimensions */
};
begin_packed_struct struct v4l2_querymenu
{
uint16_t ctrl_class; /* camera control class */
uint16_t id; /* camera control id */
uint32_t index; /* index of menu. */
union
{
char name[32]; /* name of menu */
int64_t value; /* value of menu */
};
} end_packed_struct;
struct v4l2_control
{
uint16_t id;
int32_t value;
};
/* structure for each control of
* ioctl(VIDIOC_G_EXT_CTRLS / VIDIOC_S_EXT_CTRLS)
*/
begin_packed_struct struct v4l2_ext_control
{
uint16_t id; /* camera control id */
uint16_t size; /* size of value(not use) */
union
{
int32_t value; /* QUERY_EXT_CTRL type = INTEGER, xxx */
int64_t value64; /* QUERY_EXT_CTRL type = INTEGER64, MENU */
char *string;
uint8_t *p_u8; /* QUERY_EXT_CTRL type = U8 */
uint16_t *p_u16; /* QUERY_EXT_CTRL type = U16 */
uint32_t *p_u32; /* QUERY_EXT_CTRL type = U32 */
void *ptr;
};
} end_packed_struct;
struct v4l2_ext_controls
{
union
{
uint16_t ctrl_class; /* camera control class */
uint16_t which;
};
uint16_t count; /* number of requests */
uint16_t error_idx; /* index in that error occurred */
struct v4l2_ext_control *controls; /* each control information */
};
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Public Function Prototypes
****************************************************************************/
/* Initialize video driver.
*
* param [in] devpath: path to video device
*
* return On success, 0 is returned. On failure,
* negative value is returned.
*/
int video_initialize(FAR const char *devpath,
FAR const struct video_devops_s *devops);
/* Uninitialize video driver.
*
* return On success, 0 is returned. On failure,
* negative value is returned.
*/
int video_uninitialize(void);
#ifdef __cplusplus
}
#endif
#endif /* __INCLUDE_NUTTX_VIDEO_H */