You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2023/12/03 03:44:46 UTC

(nuttx) 02/02: move userspace interface from video.h to sys/videoio.h

This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git

commit 49398d32aaeb905321b01731d435ac528f6da134
Author: shizhenghui <sh...@xiaomi.com>
AuthorDate: Tue Nov 28 17:31:19 2023 +0800

    move userspace interface from video.h to sys/videoio.h
    
    Signed-off-by: shizhenghui <sh...@xiaomi.com>
---
 drivers/video/video.c           |    1 +
 drivers/video/video_framebuff.h |    2 +-
 include/nuttx/video/video.h     | 1607 +-------------------------------------
 include/sys/videoio.h           | 1626 ++++++++++++++++++++++++++++++++++++++-
 4 files changed, 1628 insertions(+), 1608 deletions(-)

diff --git a/drivers/video/video.c b/drivers/video/video.c
index 96ac3636dd..105e2d8745 100644
--- a/drivers/video/video.c
+++ b/drivers/video/video.c
@@ -36,6 +36,7 @@
 #include <nuttx/kmalloc.h>
 #include <nuttx/mutex.h>
 
+#include <nuttx/video/video.h>
 #include <nuttx/video/imgsensor.h>
 #include <nuttx/video/imgdata.h>
 
diff --git a/drivers/video/video_framebuff.h b/drivers/video/video_framebuff.h
index a4183a5f9c..568d45e27e 100644
--- a/drivers/video/video_framebuff.h
+++ b/drivers/video/video_framebuff.h
@@ -25,7 +25,7 @@
  * Included Files
  ****************************************************************************/
 
-#include <nuttx/video/video.h>
+#include <sys/videoio.h>
 #include <nuttx/mutex.h>
 
 /****************************************************************************
diff --git a/include/nuttx/video/video.h b/include/nuttx/video/video.h
index 71b6e44dd8..0b035318da 100644
--- a/include/nuttx/video/video.h
+++ b/include/nuttx/video/video.h
@@ -29,11 +29,7 @@
  * Included Files
  ****************************************************************************/
 
-#include <stdint.h>
-#include <sys/time.h>
-
-#include <nuttx/fs/ioctl.h>
-#include <nuttx/video/video_controls.h>
+#include <sys/videoio.h>
 
 #ifdef __cplusplus
 extern "C"
@@ -44,239 +40,6 @@ extern "C"
  * Pre-processor Definitions
  ****************************************************************************/
 
-#define VIDEO_MAX_FRAME               32
-#define VIDEO_MAX_PLANES               8
-
-/* Query device capability
- * Address pointing to struct v4l2_capability
- */
-
-#define VIDIOC_QUERYCAP               _VIDIOC(0x0000)
-
-/* Enumerate the formats supported by device */
-
-#define VIDIOC_ENUM_FMT               _VIDIOC(0x0002)
-
-/* Get the data format */
-
-#define VIDIOC_G_FMT                  _VIDIOC(0x0004)
-
-/* Set the data format */
-
-#define VIDIOC_S_FMT                  _VIDIOC(0x0005)
-
-/* Initiate user pointer I/O */
-
-#define VIDIOC_REQBUFS                _VIDIOC(0x0008)
-
-/* Query the status of a buffer */
-
-#define VIDIOC_QUERYBUF               _VIDIOC(0x0009)
-
-/* Get frame buffer overlay parameters */
-
-#define VIDIOC_G_FBUF                 _VIDIOC(0x000a)
-
-/* Set frame buffer overlay parameters */
-
-#define VIDIOC_S_FBUF                 _VIDIOC(0x000b)
-
-/* Start or stop video overlay */
-
-#define VIDIOC_OVERLAY                _VIDIOC(0x000e)
-
-/* Enqueue an empty buffer */
-
-#define VIDIOC_QBUF                   _VIDIOC(0x000f)
-
-/* Export a buffer as a DMABUF file descriptor */
-
-#define VIDIOC_EXPBUF                 _VIDIOC(0x0010)
-
-/* Dequeue a filled buffer */
-
-#define VIDIOC_DQBUF                  _VIDIOC(0x0011)
-
-/* Start streaming */
-
-#define VIDIOC_STREAMON               _VIDIOC(0x0012)
-
-/* Stop streaming */
-
-#define VIDIOC_STREAMOFF              _VIDIOC(0x0013)
-
-/* Get streaming parameters */
-
-#define VIDIOC_G_PARM                 _VIDIOC(0x0015)
-
-/* Set streaming parameters */
-
-#define VIDIOC_S_PARM                 _VIDIOC(0x0016)
-
-/* Query the video standard of the current input */
-
-#define VIDIOC_G_STD                  _VIDIOC(0x0017)
-
-/* Select the video standard of the current input */
-
-#define VIDIOC_S_STD                  _VIDIOC(0x0018)
-
-/* Enumerate supported video standards */
-
-#define VIDIOC_ENUMSTD                _VIDIOC(0x0019)
-
-/* Enumerate video inputs */
-
-#define VIDIOC_ENUMINPUT              _VIDIOC(0x001a)
-
-/* 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(0x001b)
-
-/* 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(0x001c)
-
-/* Query control */
-
-#define VIDIOC_QUERYCTRL              _VIDIOC(0x0024)
-
-/* Query menu */
-
-#define VIDIOC_QUERYMENU              _VIDIOC(0x0025)
-
-/* Get video input */
-
-#define VIDIOC_G_INPUT                _VIDIOC(0x0026)
-
-/* Set video input */
-
-#define VIDIOC_S_INPUT                _VIDIOC(0x0027)
-
-/* Set video crop and scale */
-
-#define VIDIOC_CROPCAP                _VIDIOC(0x003a)
-
-/* Query video standard */
-
-#define VIDIOC_QUERYSTD               _VIDIOC(0x003f)
-
-/* Try format */
-
-#define VIDIOC_TRY_FMT                _VIDIOC(0x0040)
-
-/* Get current control value
- *  Address pointing to struct #v4l2_ext_controls
- */
-
-#define VIDIOC_G_EXT_CTRLS            _VIDIOC(0x0047)
-
-/* Set control value
- *  Address pointing to struct #v4l2_ext_controls
- */
-
-#define VIDIOC_S_EXT_CTRLS            _VIDIOC(0x0048)
-
-/* Try control value
- *  Address pointing to struct #v4l2_ext_controls
- */
-
-#define VIDIOC_TRY_EXT_CTRLS          _VIDIOC(0x0049)
-
-/* Enumerate the framesizes supported by device */
-
-#define VIDIOC_ENUM_FRAMESIZES        _VIDIOC(0x004a)
-
-/* Enumerate the frameintervals supported by device */
-
-#define VIDIOC_ENUM_FRAMEINTERVALS    _VIDIOC(0x004b)
-
-/* Execute an encoder command */
-
-#define VIDIOC_ENCODER_CMD            _VIDIOC(0x004d)
-
-/* Dequeue event */
-
-#define VIDIOC_DQEVENT                _VIDIOC(0x0059)
-
-/* Subscribe or unsubscribe event */
-
-#define VIDIOC_SUBSCRIBE_EVENT        _VIDIOC(0x005a)
-
-/* Get clip
- * Address pointing to struct v4l2_selection
- */
-
-#define VIDIOC_G_SELECTION            _VIDIOC(0x005e)
-
-/* Set clip
- * Address pointing to struct v4l2_selection
- */
-
-#define VIDIOC_S_SELECTION            _VIDIOC(0x005f)
-
-/* Execute an decoder command */
-
-#define VIDIOC_DECODER_CMD            _VIDIOC(0x0060)
-
-/* Query control */
-
-#define VIDIOC_QUERY_EXT_CTRL         _VIDIOC(0x00c0)
-
-/* Cancel DQBUF
- *  enum #v4l2_buf_type
- */
-
-#define VIDIOC_CANCEL_DQBUF           _VIDIOC(0x00c1)
-
-/* Do halfpush */
-
-#define VIDIOC_DO_HALFPUSH            _VIDIOC(0x00c2)
-
-/* 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(0x00c3)
-
-/* Stop taking picture */
-
-#define VIDIOC_TAKEPICT_STOP          _VIDIOC(0x00c4)
-
-/* Query control for scene parameter
- *  Address pointing to struct v4s_query_ext_ctrl_scene
- */
-
-#define V4SIOC_QUERY_EXT_CTRL_SCENE   _VIDIOC(0x00c5)
-
-/* Query menu for scene parameter
- *  Address pointing to struct v4s_querymenu_scene
- */
-
-#define V4SIOC_QUERYMENU_SCENE        _VIDIOC(0x00c6)
-
-/* Get current control value
- *  Address pointing to struct v4s_ext_controls_scene
- */
-
-#define V4SIOC_G_EXT_CTRLS_SCENE      _VIDIOC(0x00c7)
-
-/* Set control value
- *  Address pointing to struct v4s_ext_controls_scene
- */
-
-#define V4SIOC_S_EXT_CTRLS_SCENE      _VIDIOC(0x00c8)
-
 #define VIDEO_HSIZE_QVGA        (320)   /* QVGA    horizontal size */
 #define VIDEO_VSIZE_QVGA        (240)   /* QVGA    vertical   size */
 #define VIDEO_HSIZE_VGA         (640)   /* VGA     horizontal size */
@@ -292,1374 +55,6 @@ extern "C"
 #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))
-
-/* RGB formats */
-
-#define V4L2_PIX_FMT_RGB332   v4l2_fourcc('R', 'G', 'B', '1')
-#define V4L2_PIX_FMT_RGB444   v4l2_fourcc('R', '4', '4', '4')
-#define V4L2_PIX_FMT_ARGB444  v4l2_fourcc('A', 'R', '1', '2')
-#define V4L2_PIX_FMT_XRGB444  v4l2_fourcc('X', 'R', '1', '2')
-#define V4L2_PIX_FMT_RGB555   v4l2_fourcc('R', 'G', 'B', 'O')
-#define V4L2_PIX_FMT_ARGB555  v4l2_fourcc('A', 'R', '1', '5')
-#define V4L2_PIX_FMT_XRGB555  v4l2_fourcc('X', 'R', '1', '5')
-#define V4L2_PIX_FMT_RGB565   v4l2_fourcc('R', 'G', 'B', 'P')
-#define V4L2_PIX_FMT_RGB555X  v4l2_fourcc('R', 'G', 'B', 'Q')
-#define V4L2_PIX_FMT_ARGB555X v4l2_fourcc_be('A', 'R', '1', '5')
-#define V4L2_PIX_FMT_XRGB555X v4l2_fourcc_be('X', 'R', '1', '5')
-#define V4L2_PIX_FMT_RGB565X  v4l2_fourcc('R', 'G', 'B', 'R')
-#define V4L2_PIX_FMT_BGR666   v4l2_fourcc('B', 'G', 'R', 'H')
-#define V4L2_PIX_FMT_BGR24    v4l2_fourcc('B', 'G', 'R', '3')
-#define V4L2_PIX_FMT_RGB24    v4l2_fourcc('R', 'G', 'B', '3')
-#define V4L2_PIX_FMT_BGR32    v4l2_fourcc('B', 'G', 'R', '4')
-#define V4L2_PIX_FMT_ABGR32   v4l2_fourcc('A', 'R', '2', '4')
-#define V4L2_PIX_FMT_XBGR32   v4l2_fourcc('X', 'R', '2', '4')
-#define V4L2_PIX_FMT_RGB32    v4l2_fourcc('R', 'G', 'B', '4')
-#define V4L2_PIX_FMT_ARGB32   v4l2_fourcc('B', 'A', '2', '4')
-#define V4L2_PIX_FMT_XRGB32   v4l2_fourcc('B', 'X', '2', '4')
-
-/* Grey formats */
-
-#define V4L2_PIX_FMT_GREY     v4l2_fourcc('G', 'R', 'E', 'Y')
-#define V4L2_PIX_FMT_Y4       v4l2_fourcc('Y', '0', '4', ' ')
-#define V4L2_PIX_FMT_Y6       v4l2_fourcc('Y', '0', '6', ' ')
-#define V4L2_PIX_FMT_Y10      v4l2_fourcc('Y', '1', '0', ' ')
-#define V4L2_PIX_FMT_Y12      v4l2_fourcc('Y', '1', '2', ' ')
-#define V4L2_PIX_FMT_Y16      v4l2_fourcc('Y', '1', '6', ' ')
-#define V4L2_PIX_FMT_Y16_BE   v4l2_fourcc_be('Y', '1', '6', ' ')
-
-/* Grey bit-packed formats */
-
-#define V4L2_PIX_FMT_Y10BPACK v4l2_fourcc('Y', '1', '0', 'B')
-
-/* Palette formats */
-
-#define V4L2_PIX_FMT_PAL8     v4l2_fourcc('P', 'A', 'L', '8')
-
-/* Chrominance formats */
-
-#define V4L2_PIX_FMT_UV8      v4l2_fourcc('U', 'V', '8', ' ')
-
-/* Luminance+Chrominance formats */
-
-#define V4L2_PIX_FMT_YUYV     v4l2_fourcc('Y', 'U', 'Y', 'V')
-#define V4L2_PIX_FMT_YYUV     v4l2_fourcc('Y', 'Y', 'U', 'V')
-#define V4L2_PIX_FMT_YVYU     v4l2_fourcc('Y', 'V', 'Y', 'U')
-#define V4L2_PIX_FMT_UYVY     v4l2_fourcc('U', 'Y', 'V', 'Y')
-#define V4L2_PIX_FMT_VYUY     v4l2_fourcc('V', 'Y', 'U', 'Y')
-#define V4L2_PIX_FMT_Y41P     v4l2_fourcc('Y', '4', '1', 'P')
-#define V4L2_PIX_FMT_YUV444   v4l2_fourcc('Y', '4', '4', '4')
-#define V4L2_PIX_FMT_YUV555   v4l2_fourcc('Y', 'U', 'V', 'O')
-#define V4L2_PIX_FMT_YUV565   v4l2_fourcc('Y', 'U', 'V', 'P')
-#define V4L2_PIX_FMT_YUV32    v4l2_fourcc('Y', 'U', 'V', '4')
-#define V4L2_PIX_FMT_HI240    v4l2_fourcc('H', 'I', '2', '4')
-#define V4L2_PIX_FMT_HM12     v4l2_fourcc('H', 'M', '1', '2')
-#define V4L2_PIX_FMT_M420     v4l2_fourcc('M', '4', '2', '0')
-
-/* Two planes -- one Y, one Cr + Cb interleaved  */
-
-#define V4L2_PIX_FMT_NV12     v4l2_fourcc('N', 'V', '1', '2')
-#define V4L2_PIX_FMT_NV21     v4l2_fourcc('N', 'V', '2', '1')
-#define V4L2_PIX_FMT_NV16     v4l2_fourcc('N', 'V', '1', '6')
-#define V4L2_PIX_FMT_NV61     v4l2_fourcc('N', 'V', '6', '1')
-#define V4L2_PIX_FMT_NV24     v4l2_fourcc('N', 'V', '2', '4')
-#define V4L2_PIX_FMT_NV42     v4l2_fourcc('N', 'V', '4', '2')
-
-/* Two non contiguous planes - one Y, one Cr + Cb interleaved  */
-
-#define V4L2_PIX_FMT_NV12M    v4l2_fourcc('N', 'M', '1', '2')
-#define V4L2_PIX_FMT_NV21M    v4l2_fourcc('N', 'M', '2', '1')
-#define V4L2_PIX_FMT_NV16M    v4l2_fourcc('N', 'M', '1', '6')
-#define V4L2_PIX_FMT_NV61M    v4l2_fourcc('N', 'M', '6', '1')
-#define V4L2_PIX_FMT_NV12MT   v4l2_fourcc('T', 'M', '1', '2')
-#define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2')
-
-/* Three planes - Y Cb, Cr */
-
-#define V4L2_PIX_FMT_YUV410   v4l2_fourcc('Y', 'U', 'V', '9')
-#define V4L2_PIX_FMT_YVU410   v4l2_fourcc('Y', 'V', 'U', '9')
-#define V4L2_PIX_FMT_YUV411P  v4l2_fourcc('4', '1', '1', 'P')
-#define V4L2_PIX_FMT_YUV420   v4l2_fourcc('Y', 'U', '1', '2')
-#define V4L2_PIX_FMT_YVU420   v4l2_fourcc('Y', 'V', '1', '2')
-#define V4L2_PIX_FMT_YUV422P  v4l2_fourcc('4', '2', '2', 'P')
-
-/* Three non contiguous planes - Y, Cb, Cr */
-
-#define V4L2_PIX_FMT_YUV420M  v4l2_fourcc('Y', 'M', '1', '2')
-#define V4L2_PIX_FMT_YVU420M  v4l2_fourcc('Y', 'M', '2', '1')
-#define V4L2_PIX_FMT_YUV422M  v4l2_fourcc('Y', 'M', '1', '6')
-#define V4L2_PIX_FMT_YVU422M  v4l2_fourcc('Y', 'M', '6', '1')
-#define V4L2_PIX_FMT_YUV444M  v4l2_fourcc('Y', 'M', '2', '4')
-#define V4L2_PIX_FMT_YVU444M  v4l2_fourcc('Y', 'M', '4', '2')
-
-/* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */
-
-#define V4L2_PIX_FMT_SBGGR8   v4l2_fourcc('B', 'A', '8', '1')
-#define V4L2_PIX_FMT_SGBRG8   v4l2_fourcc('G', 'B', 'R', 'G')
-#define V4L2_PIX_FMT_SGRBG8   v4l2_fourcc('G', 'R', 'B', 'G')
-#define V4L2_PIX_FMT_SRGGB8   v4l2_fourcc('R', 'G', 'G', 'B')
-#define V4L2_PIX_FMT_SBGGR10  v4l2_fourcc('B', 'G', '1', '0')
-#define V4L2_PIX_FMT_SGBRG10  v4l2_fourcc('G', 'B', '1', '0')
-#define V4L2_PIX_FMT_SGRBG10  v4l2_fourcc('B', 'A', '1', '0')
-#define V4L2_PIX_FMT_SRGGB10  v4l2_fourcc('R', 'G', '1', '0')
-
-/* 10bit raw bayer packed, 5 bytes for every 4 pixels */
-
-#define V4L2_PIX_FMT_SBGGR10P v4l2_fourcc('p', 'B', 'A', 'A')
-#define V4L2_PIX_FMT_SGBRG10P v4l2_fourcc('p', 'G', 'A', 'A')
-#define V4L2_PIX_FMT_SGRBG10P v4l2_fourcc('p', 'g', 'A', 'A')
-#define V4L2_PIX_FMT_SRGGB10P v4l2_fourcc('p', 'R', 'A', 'A')
-
-/* 10bit raw bayer a-law compressed to 8 bits */
-
-#define V4L2_PIX_FMT_SBGGR10ALAW8 v4l2_fourcc('a', 'B', 'A', '8')
-#define V4L2_PIX_FMT_SGBRG10ALAW8 v4l2_fourcc('a', 'G', 'A', '8')
-#define V4L2_PIX_FMT_SGRBG10ALAW8 v4l2_fourcc('a', 'g', 'A', '8')
-#define V4L2_PIX_FMT_SRGGB10ALAW8 v4l2_fourcc('a', 'R', 'A', '8')
-
-/* 10bit raw bayer DPCM compressed to 8 bits */
-
-#define V4L2_PIX_FMT_SBGGR10DPCM8 v4l2_fourcc('b', 'B', 'A', '8')
-#define V4L2_PIX_FMT_SGBRG10DPCM8 v4l2_fourcc('b', 'G', 'A', '8')
-#define V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc('B', 'D', '1', '0')
-#define V4L2_PIX_FMT_SRGGB10DPCM8 v4l2_fourcc('b', 'R', 'A', '8')
-#define V4L2_PIX_FMT_SBGGR12      v4l2_fourcc('B', 'G', '1', '2')
-#define V4L2_PIX_FMT_SGBRG12      v4l2_fourcc('G', 'B', '1', '2')
-#define V4L2_PIX_FMT_SGRBG12      v4l2_fourcc('B', 'A', '1', '2')
-#define V4L2_PIX_FMT_SRGGB12      v4l2_fourcc('R', 'G', '1', '2')
-#define V4L2_PIX_FMT_SBGGR16      v4l2_fourcc('B', 'Y', 'R', '2')
-#define V4L2_PIX_FMT_SGBRG16      v4l2_fourcc('G', 'B', '1', '6')
-#define V4L2_PIX_FMT_SGRBG16      v4l2_fourcc('G', 'R', '1', '6')
-#define V4L2_PIX_FMT_SRGGB16      v4l2_fourcc('R', 'G', '1', '6')
-
-/* HSV formats */
-
-#define V4L2_PIX_FMT_HSV24    v4l2_fourcc('H', 'S', 'V', '3')
-#define V4L2_PIX_FMT_HSV32    v4l2_fourcc('H', 'S', 'V', '4')
-
-/* Compressed formats */
-
-#define V4L2_PIX_FMT_MJPEG    v4l2_fourcc('M', 'J', 'P', 'G')
-#define V4L2_PIX_FMT_JPEG     v4l2_fourcc('J', 'P', 'E', 'G')
-#define V4L2_PIX_FMT_DV       v4l2_fourcc('d', 'v', 's', 'd')
-#define V4L2_PIX_FMT_MPEG     v4l2_fourcc('M', 'P', 'E', 'G')
-#define V4L2_PIX_FMT_H264     v4l2_fourcc('H', '2', '6', '4')
-#define V4L2_PIX_FMT_H264_NO_SC v4l2_fourcc('A', 'V', 'C', '1')
-#define V4L2_PIX_FMT_H264_MVC v4l2_fourcc('M', '2', '6', '4')
-#define V4L2_PIX_FMT_H263     v4l2_fourcc('H', '2', '6', '3')
-#define V4L2_PIX_FMT_MPEG1    v4l2_fourcc('M', 'P', 'G', '1')
-#define V4L2_PIX_FMT_MPEG2    v4l2_fourcc('M', 'P', 'G', '2')
-#define V4L2_PIX_FMT_MPEG4    v4l2_fourcc('M', 'P', 'G', '4')
-#define V4L2_PIX_FMT_XVID     v4l2_fourcc('X', 'V', 'I', 'D')
-#define V4L2_PIX_FMT_VC1_ANNEX_G v4l2_fourcc('V', 'C', '1', 'G')
-#define V4L2_PIX_FMT_VC1_ANNEX_L v4l2_fourcc('V', 'C', '1', 'L')
-#define V4L2_PIX_FMT_VP8      v4l2_fourcc('V', 'P', '8', '0')
-#define V4L2_PIX_FMT_VP9      v4l2_fourcc('V', 'P', '9', '0')
-#define V4L2_PIX_FMT_HEVC     v4l2_fourcc('H', 'E', 'V', 'C')
-
-/* JPEG + sub image */
-
-#define V4L2_PIX_FMT_JPEG_WITH_SUBIMG v4l2_fourcc('J', 'S', 'U', 'B')
-
-/* YUV 4:2:2 for sub image */
-
-#define V4L2_PIX_FMT_SUBIMG_UYVY v4l2_fourcc('S', 'Y', 'U', 'V')
-
-/* RGB565 for sub image */
-
-#define V4L2_PIX_FMT_SUBIMG_RGB565 v4l2_fourcc('S', 'R', 'G', '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 CONFIG_VIDEO_REQBUFS_COUNT_MAX
-
-/* Buffer error flag */
-
-#define V4L2_BUF_FLAG_ERROR    (0x0001)
-
-/* Values for v4l2_std_id */
-
-/* One bit for each */
-
-#define V4L2_STD_PAL_B          ((v4l2_std_id)0x00000001)
-#define V4L2_STD_PAL_B1         ((v4l2_std_id)0x00000002)
-#define V4L2_STD_PAL_G          ((v4l2_std_id)0x00000004)
-#define V4L2_STD_PAL_H          ((v4l2_std_id)0x00000008)
-#define V4L2_STD_PAL_I          ((v4l2_std_id)0x00000010)
-#define V4L2_STD_PAL_D          ((v4l2_std_id)0x00000020)
-#define V4L2_STD_PAL_D1         ((v4l2_std_id)0x00000040)
-#define V4L2_STD_PAL_K          ((v4l2_std_id)0x00000080)
-
-#define V4L2_STD_PAL_M          ((v4l2_std_id)0x00000100)
-#define V4L2_STD_PAL_N          ((v4l2_std_id)0x00000200)
-#define V4L2_STD_PAL_Nc         ((v4l2_std_id)0x00000400)
-#define V4L2_STD_PAL_60         ((v4l2_std_id)0x00000800)
-
-#define V4L2_STD_NTSC_M         ((v4l2_std_id)0x00001000)    /* BTSC */
-#define V4L2_STD_NTSC_M_JP      ((v4l2_std_id)0x00002000)    /* EIA-J */
-#define V4L2_STD_NTSC_443       ((v4l2_std_id)0x00004000)
-#define V4L2_STD_NTSC_M_KR      ((v4l2_std_id)0x00008000)    /* FM A2 */
-
-#define V4L2_STD_SECAM_B        ((v4l2_std_id)0x00010000)
-#define V4L2_STD_SECAM_D        ((v4l2_std_id)0x00020000)
-#define V4L2_STD_SECAM_G        ((v4l2_std_id)0x00040000)
-#define V4L2_STD_SECAM_H        ((v4l2_std_id)0x00080000)
-#define V4L2_STD_SECAM_K        ((v4l2_std_id)0x00100000)
-#define V4L2_STD_SECAM_K1       ((v4l2_std_id)0x00200000)
-#define V4L2_STD_SECAM_L        ((v4l2_std_id)0x00400000)
-#define V4L2_STD_SECAM_LC       ((v4l2_std_id)0x00800000)
-
-/* ATSC/HDTV */
-
-#define V4L2_STD_ATSC_8_VSB     ((v4l2_std_id)0x01000000)
-#define V4L2_STD_ATSC_16_VSB    ((v4l2_std_id)0x02000000)
-
-/* Some macros to merge video standards in order to make live easier for the
- * drivers and V4L2 applications
- */
-
-/* "Common" NTSC/M - It should be noticed that V4L2_STD_NTSC_443 is
- * Missing here.
- */
-
-#define V4L2_STD_NTSC           (V4L2_STD_NTSC_M     | \
-                                 V4L2_STD_NTSC_M_JP  | \
-                                 V4L2_STD_NTSC_M_KR)
-
-/* Secam macros */
-
-#define V4L2_STD_SECAM_DK       (V4L2_STD_SECAM_D    | \
-                                 V4L2_STD_SECAM_K    | \
-                                 V4L2_STD_SECAM_K1)
-
-/* All Secam Standards */
-
-#define V4L2_STD_SECAM          (V4L2_STD_SECAM_B    | \
-                                 V4L2_STD_SECAM_G    | \
-                                 V4L2_STD_SECAM_H    | \
-                                 V4L2_STD_SECAM_DK   | \
-                                 V4L2_STD_SECAM_L    | \
-                                 V4L2_STD_SECAM_LC)
-
-/* PAL macros */
-#define V4L2_STD_PAL_BG         (V4L2_STD_PAL_B      | \
-                                 V4L2_STD_PAL_B1     | \
-                                 V4L2_STD_PAL_G)
-#define V4L2_STD_PAL_DK         (V4L2_STD_PAL_D      | \
-                                 V4L2_STD_PAL_D1     | \
-                                 V4L2_STD_PAL_K)
-
-/* "Common" PAL - This macro is there to be compatible with the old
- * V4L1 concept of "PAL": /BGDKHI.
- * Several PAL standards are missing here: /M, /N and /Nc
- */
-
-#define V4L2_STD_PAL            (V4L2_STD_PAL_BG     | \
-                                 V4L2_STD_PAL_DK     | \
-                                 V4L2_STD_PAL_H      | \
-                                 V4L2_STD_PAL_I)
-
-/* Chroma "agnostic" standards */
-
-#define V4L2_STD_B              (V4L2_STD_PAL_B      | \
-                                 V4L2_STD_PAL_B1     | \
-                                 V4L2_STD_SECAM_B)
-#define V4L2_STD_G              (V4L2_STD_PAL_G      | \
-                                 V4L2_STD_SECAM_G)
-#define V4L2_STD_H              (V4L2_STD_PAL_H      | \
-                                 V4L2_STD_SECAM_H)
-#define V4L2_STD_L              (V4L2_STD_SECAM_L    | \
-                                 V4L2_STD_SECAM_LC)
-#define V4L2_STD_GH             (V4L2_STD_G          | \
-                                 V4L2_STD_H)
-#define V4L2_STD_DK             (V4L2_STD_PAL_DK     | \
-                                 V4L2_STD_SECAM_DK)
-#define V4L2_STD_BG             (V4L2_STD_B          | \
-                                 V4L2_STD_G)
-#define V4L2_STD_MN             (V4L2_STD_PAL_M      | \
-                                 V4L2_STD_PAL_N      | \
-                                 V4L2_STD_PAL_Nc     | \
-                                 V4L2_STD_NTSC)
-
-/* Standards where MTS/BTSC stereo could be found */
-
-#define V4L2_STD_MTS            (V4L2_STD_NTSC_M     | \
-                                 V4L2_STD_PAL_M      | \
-                                 V4L2_STD_PAL_N      | \
-                                 V4L2_STD_PAL_Nc)
-
-/* Standards for Countries with 60Hz Line frequency */
-
-#define V4L2_STD_525_60         (V4L2_STD_PAL_M      | \
-                                 V4L2_STD_PAL_60     | \
-                                 V4L2_STD_NTSC       | \
-                                 V4L2_STD_NTSC_443)
-
-/* Standards for Countries with 50Hz Line frequency */
-
-#define V4L2_STD_625_50         (V4L2_STD_PAL        | \
-                                 V4L2_STD_PAL_N      | \
-                                 V4L2_STD_PAL_Nc     | \
-                                 V4L2_STD_SECAM)
-#define V4L2_STD_ATSC           (V4L2_STD_ATSC_8_VSB | \
-                                 V4L2_STD_ATSC_16_VSB)
-
-/* Macros with none and all analog standards */
-
-#define V4L2_STD_UNKNOWN        0
-#define V4L2_STD_ALL            (V4L2_STD_525_60     | \
-                                 V4L2_STD_625_50)
-
-/****************************************************************************
- * Public Types
- ****************************************************************************/
-
-/* V4L2 device capabilities for VIDIOC_QUERYCAP.
- * Currently, only member "driver" is supported.
- */
-
-struct v4l2_capability
-{
-  uint8_t  driver[16];   /* Name of driver module(e.g. "bttv" */
-  uint8_t  card[32];     /* Name of the card(e.g. "Yoyodyne TV/FM" */
-  uint8_t  bus_info[32]; /* Name of the bus(e.g. "PCI:0000:05:06.0" */
-  uint32_t version;      /* Version number of the driver */
-  uint32_t capabilities; /* Available capabilities of the physical device */
-  uint32_t device_caps;  /* Device capabilities of the opened device */
-};
-
-/* Values for 'capabilities' field */
-
-enum v4l2_capabilities
-{
-  V4L2_CAP_VIDEO_CAPTURE          = 0x00000001,  /* Is a video capture device */
-  V4L2_CAP_VIDEO_OUTPUT           = 0x00000002,  /* Is a video output device */
-  V4L2_CAP_VIDEO_OVERLAY          = 0x00000004,  /* Can do video overlay */
-  V4L2_CAP_VBI_CAPTURE            = 0x00000010,  /* Is a raw VBI capture device */
-  V4L2_CAP_VBI_OUTPUT             = 0x00000020,  /* Is a raw VBI output device */
-  V4L2_CAP_SLICED_VBI_CAPTURE     = 0x00000040,  /* Is a sliced VBI capture device */
-  V4L2_CAP_SLICED_VBI_OUTPUT      = 0x00000080,  /* Is a sliced VBI output device */
-  V4L2_CAP_RDS_CAPTURE            = 0x00000100,  /* RDS data capture */
-  V4L2_CAP_VIDEO_OUTPUT_OVERLAY   = 0x00000200,  /* Can do video output overlay */
-  V4L2_CAP_HW_FREQ_SEEK           = 0x00000400,  /* Can do hardware frequency seek */
-  V4L2_CAP_RDS_OUTPUT             = 0x00000800,  /* Is an RDS encoder */
-  V4L2_CAP_VIDEO_CAPTURE_MPLANE   = 0x00001000,  /* Is a video capture device that supports multiplanar formats */
-  V4L2_CAP_VIDEO_OUTPUT_MPLANE    = 0x00002000,  /* Is a video output device that supports multiplanar formats */
-  V4L2_CAP_VIDEO_M2M_MPLANE       = 0x00004000,  /* Is a video mem-to-mem device that supports multiplanar formats */
-  V4L2_CAP_VIDEO_M2M              = 0x00008000,  /* Is a video mem-to-mem device */
-  V4L2_CAP_TUNER                  = 0x00010000,  /* Has a tuner */
-  V4L2_CAP_AUDIO                  = 0x00020000,  /* Has audio support */
-  V4L2_CAP_RADIO                  = 0x00040000,  /* Is a radio device */
-  V4L2_CAP_MODULATOR              = 0x00080000,  /* Has a modulator */
-  V4L2_CAP_SDR_CAPTURE            = 0x00100000,  /* Is a SDR capture device */
-  V4L2_CAP_EXT_PIX_FORMAT         = 0x00200000,  /* Supports the extended pixel format */
-  V4L2_CAP_SDR_OUTPUT             = 0x00400000,  /* Is a SDR output device */
-  V4L2_CAP_READWRITE              = 0x01000000,  /* Read/write systemcalls */
-  V4L2_CAP_ASYNCIO                = 0x02000000,  /* Async I/O */
-  V4L2_CAP_STREAMING              = 0x04000000,  /* Streaming I/O ioctls */
-  V4L2_CAP_TOUCH                  = 0x10000000,  /* Is a touch device */
-  V4L2_CAP_DEVICE_CAPS            = 0x80000000,  /* Sets device capabilities field */
-};
-
-/* Rectangle information */
-
-struct v4l2_rect
-{
-  /* Horizontal offset of the top, left corner of the rectangle, in pixels. */
-
-  int32_t left;
-
-  /* Vertical offset of the top, left corner of the rectangle, in pixels. */
-
-  int32_t top;
-
-  /* Width of the rectangle, in pixels. */
-
-  uint32_t width;
-
-  /* Height of the rectangle, in pixels. */
-
-  uint32_t height;
-};
-
-/* Fraction */
-
-struct v4l2_fract
-{
-  uint32_t numerator;                     /* Numerator */
-  uint32_t denominator;                   /* Denominator */
-};
-
-/* V4L2 selection info for VIDIOC_S_SELECTION and VIDIOC_G_SELECTION.
- * Currently, only member type and r are supported.
- */
-
-struct v4l2_selection
-{
-  uint32_t type;       /* Buffer type */
-  uint32_t target;
-  uint32_t flags;
-  struct v4l2_rect r;  /* The selection rectangle. */
-};
-
-typedef uint64_t v4l2_std_id;
-
-struct v4l2_standard
-{
-  uint32_t            index;
-  v4l2_std_id         id;
-  uint8_t             name[24];
-  struct v4l2_fract   frameperiod; /* Frames, not fields */
-  uint32_t            framelines;
-  uint32_t            reserved[4];
-};
-
-/* 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_META_OUTPUT          = 14,   /* Metadata output */
-  V4L2_BUF_TYPE_PRIVATE              = 0x80, /* Deprecated, do not use */
-  V4L2_BUF_TYPE_STILL_CAPTURE        = 0x81  /* Single-planar still capture stream */
-};
-
-#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    \
-   || (type) == V4L2_BUF_TYPE_SDR_OUTPUT           \
-   || (type) == V4L2_BUF_TYPE_META_OUTPUT)
-
-/* 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 */
-};
-
-/* See also http://vektor.theorem.ca/graphics/ycbcr/ */
-
-enum v4l2_colorspace
-{
-  /* Default colorspace, i.e. let the driver figure it out.
-   *  Can only be used with video capture.
-   */
-
-  V4L2_COLORSPACE_DEFAULT       = 0,
-
-  /* SMPTE 170M: used for broadcast NTSC/PAL SDTV */
-
-  V4L2_COLORSPACE_SMPTE170M     = 1,
-
-  /* Obsolete pre-1998 SMPTE 240M HDTV standard, superseded by Rec 709 */
-
-  V4L2_COLORSPACE_SMPTE240M     = 2,
-
-  /* Rec.709: used for HDTV */
-
-  V4L2_COLORSPACE_REC709        = 3,
-
-  /* Deprecated, do not use. No driver will ever return this. This was
-   *  based on a misunderstanding of the bt878 datasheet.
-   */
-
-  V4L2_COLORSPACE_BT878         = 4,
-
-  /* NTSC 1953 colorspace. This only makes sense when dealing with
-   *  really, really old NTSC recordings. Superseded by SMPTE 170M.
-   */
-
-  V4L2_COLORSPACE_470_SYSTEM_M  = 5,
-
-  /* EBU Tech 3213 PAL/SECAM colorspace. This only makes sense when
-   * dealing with really old PAL/SECAM recordings. Superseded by
-   * SMPTE 170M.
-   */
-
-  V4L2_COLORSPACE_470_SYSTEM_BG = 6,
-
-  /* Effectively shorthand for V4L2_COLORSPACE_SRGB, V4L2_YCBCR_ENC_601
-   *  and V4L2_QUANTIZATION_FULL_RANGE. To be used for (Motion-)JPEG.
-   */
-
-  V4L2_COLORSPACE_JPEG          = 7,
-
-  /* For RGB colorspaces such as produces by most webcams. */
-
-  V4L2_COLORSPACE_SRGB          = 8,
-
-  /* opRGB colorspace */
-
-  V4L2_COLORSPACE_OPRGB         = 9,
-
-  /* BT.2020 colorspace, used for UHDTV. */
-
-  V4L2_COLORSPACE_BT2020        = 10,
-
-  /* Raw colorspace: for RAW unprocessed images */
-
-  V4L2_COLORSPACE_RAW           = 11,
-
-  /* DCI-P3 colorspace, used by cinema projectors */
-
-  V4L2_COLORSPACE_DCI_P3        = 12,
-};
-
-/* Determine how COLORSPACE_DEFAULT should map to a proper colorspace.
- * This depends on whether this is a SDTV image (use SMPTE 170M), an
- * HDTV image (use Rec. 709), or something else (use sRGB).
- */
-
-#define V4L2_MAP_COLORSPACE_DEFAULT(is_sdtv, is_hdtv) \
-        ((is_sdtv) ? V4L2_COLORSPACE_SMPTE170M : \
-        ((is_hdtv) ? V4L2_COLORSPACE_REC709 : V4L2_COLORSPACE_SRGB))
-
-enum v4l2_xfer_func
-{
-/* Mapping of V4L2_XFER_FUNC_DEFAULT to actual transfer functions
- * for the various colorspaces:
- *
- * V4L2_COLORSPACE_SMPTE170M, V4L2_COLORSPACE_470_SYSTEM_M,
- * V4L2_COLORSPACE_470_SYSTEM_BG, V4L2_COLORSPACE_REC709 and
- * V4L2_COLORSPACE_BT2020: V4L2_XFER_FUNC_709
- *
- * V4L2_COLORSPACE_SRGB, V4L2_COLORSPACE_JPEG: V4L2_XFER_FUNC_SRGB
- *
- * V4L2_COLORSPACE_OPRGB: V4L2_XFER_FUNC_OPRGB
- *
- * V4L2_COLORSPACE_SMPTE240M: V4L2_XFER_FUNC_SMPTE240M
- *
- * V4L2_COLORSPACE_RAW: V4L2_XFER_FUNC_NONE
- *
- * V4L2_COLORSPACE_DCI_P3: V4L2_XFER_FUNC_DCI_P3
- */
-
-  V4L2_XFER_FUNC_DEFAULT     = 0,
-  V4L2_XFER_FUNC_709         = 1,
-  V4L2_XFER_FUNC_SRGB        = 2,
-  V4L2_XFER_FUNC_OPRGB       = 3,
-  V4L2_XFER_FUNC_SMPTE240M   = 4,
-  V4L2_XFER_FUNC_NONE        = 5,
-  V4L2_XFER_FUNC_DCI_P3      = 6,
-  V4L2_XFER_FUNC_SMPTE2084   = 7,
-};
-
-enum v4l2_ycbcr_encoding
-{
-/* Mapping of V4L2_YCBCR_ENC_DEFAULT to actual encodings for the
- * various colorspaces:
- *
- * V4L2_COLORSPACE_SMPTE170M, V4L2_COLORSPACE_470_SYSTEM_M,
- * V4L2_COLORSPACE_470_SYSTEM_BG, V4L2_COLORSPACE_SRGB,
- * V4L2_COLORSPACE_OPRGB and V4L2_COLORSPACE_JPEG: V4L2_YCBCR_ENC_601
- *
- * V4L2_COLORSPACE_REC709 and V4L2_COLORSPACE_DCI_P3: V4L2_YCBCR_ENC_709
- *
- * V4L2_COLORSPACE_BT2020: V4L2_YCBCR_ENC_BT2020
- *
- * V4L2_COLORSPACE_SMPTE240M: V4L2_YCBCR_ENC_SMPTE240M
- */
-
-  V4L2_YCBCR_ENC_DEFAULT        = 0,
-
-  /* ITU-R 601 -- SDTV */
-
-  V4L2_YCBCR_ENC_601            = 1,
-
-  /* Rec. 709 -- HDTV */
-
-  V4L2_YCBCR_ENC_709            = 2,
-
-  /* ITU-R 601/EN 61966-2-4 Extended Gamut -- SDTV */
-
-  V4L2_YCBCR_ENC_XV601          = 3,
-
-  /* Rec. 709/EN 61966-2-4 Extended Gamut -- HDTV */
-
-  V4L2_YCBCR_ENC_XV709          = 4,
-
-/* sYCC (Y'CbCr encoding of sRGB), identical to ENC_601. It was added
- * originally due to a misunderstanding of the sYCC standard. It should
- * not be used, instead use V4L2_YCBCR_ENC_601.
- */
-
-  V4L2_YCBCR_ENC_SYCC           = 5,
-
-  /* BT.2020 Non-constant Luminance Y'CbCr */
-
-  V4L2_YCBCR_ENC_BT2020         = 6,
-
-  /* BT.2020 Constant Luminance Y'CbcCrc */
-
-  V4L2_YCBCR_ENC_BT2020_CONST_LUM = 7,
-
-  /* SMPTE 240M -- Obsolete HDTV */
-
-  V4L2_YCBCR_ENC_SMPTE240M      = 8,
-};
-
-enum v4l2_quantization
-{
-/* The default for R'G'B' quantization is always full range.
- * For Y'CbCr the quantization is always limited range, except
- * for COLORSPACE_JPEG: this is full range.
- */
-
-  V4L2_QUANTIZATION_DEFAULT     = 0,
-  V4L2_QUANTIZATION_FULL_RANGE  = 1,
-  V4L2_QUANTIZATION_LIM_RANGE   = 2,
-};
-
-/* 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
-                      */
-  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 timeval       timestamp; /* Frame timestamp */
-  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;
-
-/* Image is a keyframe (I-frame) */
-
-#define V4L2_BUF_FLAG_KEYFRAME                  0x00000008
-
-/* mem2mem encoder/decoder */
-
-#define V4L2_BUF_FLAG_LAST                      0x00100000
-
-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      */
-};
-
-enum v4l2_fmt_flag
-{
-  V4L2_FMT_FLAG_COMPRESSED = 0x0001, /* This is a compressed format */
-  V4L2_FMT_FLAG_EMULATED   = 0x0002, /* This format is not native */
-};
-
-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. */
-
-  /* In type == V4L2_FRMSIZE_TYPE_DISCRETE case, use discrete.
-   * Otherwise, use stepwise.
-   */
-
-  union
-  {
-    struct v4l2_frmsize_discrete discrete;
-    struct v4l2_frmsize_stepwise stepwise;
-  };
-};
-
-/* 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 */
-};
-
-/* 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 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. */
-  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_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
-{
-  uint32_t  sizeimage;
-  uint32_t  bytesperline;
-  uint16_t  reserved[6];
-};
-
-/* 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: enum v4l2_field; field order (for interlaced video)
- * @colorspace: enum v4l2_colorspace; supplemental to pixelformat
- * @plane_fmt: per-plane information
- * @num_planes: number of planes for this format
- * @flags: format flags (V4L2_PIX_FMT_FLAG_*)
- * @ycbcr_enc: enum v4l2_ycbcr_encoding, Y'CbCr encoding
- * @quantization: enum v4l2_quantization, colorspace quantization
- * @xfer_func: enum v4l2_xfer_func, colorspace transfer function
- */
-
-struct v4l2_pix_format_mplane
-{
-  uint32_t      width;
-  uint32_t      height;
-  uint32_t      pixelformat;
-  uint32_t      field;
-  uint32_t      colorspace;
-
-  struct v4l2_plane_pix_format plane_fmt[VIDEO_MAX_PLANES];
-  uint8_t                      num_planes;
-  uint8_t                      flags;
-  union
-  {
-    uint8_t                    ycbcr_enc;
-    uint8_t                    hsv_enc;
-  };
-  uint8_t                      quantization;
-  uint8_t                      xfer_func;
-  uint8_t                      reserved[7];
-};
-
-struct v4l2_format
-{
-  uint32_t  type;                         /* enum #v4l2_buf_type. */
-  union
-  {
-    struct v4l2_pix_format        pix;    /* Image format */
-    struct v4l2_pix_format_mplane pix_mp; /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
-  } 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_cropcap
-{
-  uint32_t                type; /* enum v4l2_buf_type */
-  struct v4l2_rect        bounds;
-  struct v4l2_rect        defrect;
-  struct v4l2_fract       pixelaspect;
-};
-
-/*  Flags for 'capability' and 'capturemode' fields */
-
-enum v4l2_capture_mode
-{
-  V4L2_MODE_HIGHQUALITY = 0x0001,    /*  High quality imaging mode */
-};
-
-enum v4l2_capture_capability
-{
-  V4L2_CAP_TIMEPERFRAME = 0x1000,    /*  timeperframe field is supported */
-};
-
-struct v4l2_streamparm
-{
-  uint32_t    type;                  /* enum v4l2_buf_type */
-  union
-  {
-    struct v4l2_captureparm capture;
-  } parm;
-};
-
-/* E V E N T S */
-
-#define V4L2_EVENT_ALL                          0
-#define V4L2_EVENT_VSYNC                        1
-#define V4L2_EVENT_EOS                          2
-#define V4L2_EVENT_CTRL                         3
-#define V4L2_EVENT_FRAME_SYNC                   4
-#define V4L2_EVENT_SOURCE_CHANGE                5
-#define V4L2_EVENT_MOTION_DET                   6
-#define V4L2_EVENT_PRIVATE_START                0x08000000
-
-/* Payload for V4L2_EVENT_VSYNC */
-
-struct v4l2_event_vsync
-{
-  /* Can be V4L2_FIELD_ANY, _NONE, _TOP or _BOTTOM */
-
-  uint8_t field;
-};
-
-/* Payload for V4L2_EVENT_CTRL */
-
-#define V4L2_EVENT_CTRL_CH_VALUE                (1 << 0)
-#define V4L2_EVENT_CTRL_CH_FLAGS                (1 << 1)
-#define V4L2_EVENT_CTRL_CH_RANGE                (1 << 2)
-
-struct v4l2_event_ctrl
-{
-  uint32_t changes;
-  uint32_t type;
-  union
-  {
-    int32_t value;
-    int64_t value64;
-  };
-  uint32_t flags;
-  int32_t minimum;
-  int32_t maximum;
-  int32_t step;
-  int32_t default_value;
-};
-
-struct v4l2_event_frame_sync
-{
-  uint32_t frame_sequence;
-};
-
-#define V4L2_EVENT_SRC_CH_RESOLUTION        (1 << 0)
-
-struct v4l2_event_src_change
-{
-  uint32_t changes;
-};
-
-#define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ     (1 << 0)
-
-/* struct v4l2_event_motion_det - motion detection event
- * @flags:             if V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ is set, then the
- *                     frame_sequence field is valid.
- * @frame_sequence:    the frame sequence number associated with this event.
- * @region_mask:       which regions detected motion.
- */
-
-struct v4l2_event_motion_det
-{
-  uint32_t flags;
-  uint32_t frame_sequence;
-  uint32_t region_mask;
-};
-
-struct v4l2_event
-{
-  uint32_t        type;
-  union
-  {
-    struct v4l2_event_vsync       vsync;
-    struct v4l2_event_ctrl        ctrl;
-    struct v4l2_event_frame_sync  frame_sync;
-    struct v4l2_event_src_change  src_change;
-    struct v4l2_event_motion_det  motion_det;
-    uint8_t                       data[64];
-  } u;
-  uint32_t        pending;
-  uint32_t        sequence;
-  struct timespec timestamp;
-  uint32_t        id;
-  uint32_t        reserved[8];
-};
-
-#define V4L2_EVENT_SUB_FL_SEND_INITIAL   (1 << 0)
-#define V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK (1 << 1)
-
-struct v4l2_event_subscription
-{
-  uint32_t       type;
-  uint32_t       id;
-  uint32_t       flags;
-  uint32_t       reserved[5];
-};
-
-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 */
-};
-
-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 */
-  };
-};
-
-struct v4l2_input
-{
-  uint32_t      index;       /*  Which input */
-  uint8_t       name[32];    /*  Label */
-  uint32_t      type;        /*  Type of input */
-  uint32_t      audioset;    /*  Associated audios (bitfield) */
-  uint32_t      tuner;       /*  enum v4l2_tuner_type */
-  v4l2_std_id   std;
-  uint32_t      status;
-  uint32_t      capabilities;
-  uint32_t      reserved[3];
-};
-
-/*  Values for the 'type' field */
-
-enum v4l2_input_type
-{
-  V4L2_INPUT_TYPE_TUNER  = 1,
-  V4L2_INPUT_TYPE_CAMERA = 2,
-  V4L2_INPUT_TYPE_TOUCH  = 3,
-};
-
-enum v4l2_input_status
-{
-  /* Field 'status' - general */
-
-  V4L2_IN_ST_NO_POWER    = 0x00000001,  /* Attached device is off */
-  V4L2_IN_ST_NO_SIGNAL   = 0x00000002,
-  V4L2_IN_ST_NO_COLOR    = 0x00000004,
-
-  /* Field 'status' - sensor orientation */
-
-  /* If sensor is mounted upside down set both bits */
-
-  V4L2_IN_ST_HFLIP       = 0x00000010,  /* Frames are flipped horizontally */
-  V4L2_IN_ST_VFLIP       = 0x00000020,  /* Frames are flipped vertically */
-
-  /* Field 'status' - analog */
-
-  V4L2_IN_ST_NO_H_LOCK   = 0x00000100,  /* No horizontal sync lock */
-  V4L2_IN_ST_COLOR_KILL  = 0x00000200,  /* Color killer is active */
-  V4L2_IN_ST_NO_V_LOCK   = 0x00000400,  /* No vertical sync lock */
-  V4L2_IN_ST_NO_STD_LOCK = 0x00000800,  /* No standard format lock */
-
-  /* Field 'status' - digital */
-
-  V4L2_IN_ST_NO_SYNC     = 0x00010000,  /* No synchronization lock */
-  V4L2_IN_ST_NO_EQU      = 0x00020000,  /* No equalizer lock */
-  V4L2_IN_ST_NO_CARRIER  = 0x00040000,  /* Carrier recovery failed */
-
-  /* Field 'status' - VCR and set-top box */
-
-  V4L2_IN_ST_MACROVISION = 0x01000000,  /* Macrovision detected */
-  V4L2_IN_ST_NO_ACCESS   = 0x02000000,  /* Conditional access denied */
-  V4L2_IN_ST_VTR         = 0x04000000,  /* VTR time constant */
-};
-
-/* Capabilities flags */
-
-enum v4l2_input_capabilities
-{
-  V4L2_IN_CAP_DV_TIMINGS  = 0x00000002, /* Supports S_DV_TIMINGS */
-  V4L2_IN_CAP_STD         = 0x00000004, /* Supports S_STD */
-  V4L2_IN_CAP_NATIVE_SIZE = 0x00000008, /* Supports setting native size */
-};
-
-enum v4l2_input_capabilites_compat
-{
-  V4L2_IN_CAP_CUSTOM_TIMINGS = V4L2_IN_CAP_DV_TIMINGS,  /* For compatibility */
-};
-
-struct v4l2_output
-{
-  uint32_t      index;           /*  Which output */
-  uint8_t       name[32];        /*  Label */
-  uint32_t      type;            /*  Type of output */
-  uint32_t      audioset;        /*  Associated audios (bitfield) */
-  uint32_t      modulator;       /*  Associated modulator */
-  v4l2_std_id   std;
-  uint32_t      capabilities;
-  uint32_t      reserved[3];
-};
-
-/*  Values for the 'type' field */
-
-enum v4l2_output_type
-{
-  V4L2_OUTPUT_TYPE_MODULATOR        = 1,
-  V4L2_OUTPUT_TYPE_ANALOG           = 2,
-  V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY = 3,
-};
-
-/* Capabilities flags */
-
-enum v4l2_output_capabilities
-{
-  V4L2_OUT_CAP_DV_TIMINGS  = 0x00000002, /* Supports S_DV_TIMINGS */
-  V4L2_OUT_CAP_STD         = 0x00000004, /* Supports S_STD */
-  V4L2_OUT_CAP_NATIVE_SIZE = 0x00000008, /* Supports setting native size */
-};
-
-enum v4l2_output_capabilites_compat
-{
-  V4L2_OUT_CAP_CUSTOM_TIMINGS = V4L2_OUT_CAP_DV_TIMINGS, /* For compatibility */
-};
-
-struct v4l2_control
-{
-  uint16_t id;
-  int32_t  value;
-};
-
-/* Structure for each control of
- *  ioctl(VIDIOC_G_EXT_CTRLS / VIDIOC_S_EXT_CTRLS)
- */
-
-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;
-  };
-};
-
-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     */
-};
-
-/* Structure for V4SIOC_S_EXT_CTRLS and V4SIOC_G_EXT_CTRLS */
-
-struct v4s_ext_controls_scene
-{
-  enum v4l2_scene_mode     mode;       /* Scene mode to be controled */
-  struct v4l2_ext_controls control;    /* Same as VIDIOC_S_EXT_CTRLS */
-};
-
-/* Structure for V4SIOC_QUERY_EXT_CTRL */
-
-struct v4s_query_ext_ctrl_scene
-{
-  enum v4l2_scene_mode       mode;     /* Scene mode to be queried */
-  struct v4l2_query_ext_ctrl control;  /* Same as VIDIOC_QUERY_EXT_CTRL */
-};
-
-/* Structure for V4SIOC_QUERYMENU */
-
-struct v4s_querymenu_scene
-{
-  enum v4l2_scene_mode       mode;     /* Scene mode to be queried */
-  struct v4l2_querymenu      menu;     /* Same as VIDIOC_QUERYMENU */
-};
-
-#define V4L2_ENC_CMD_START      (0)
-#define V4L2_ENC_CMD_STOP       (1)
-#define V4L2_ENC_CMD_PAUSE      (2)
-#define V4L2_ENC_CMD_RESUME     (3)
-
-/* Flags for V4L2_ENC_CMD_STOP */
-
-#define V4L2_ENC_CMD_STOP_AT_GOP_END (1 << 0)
-
-struct v4l2_encoder_cmd
-{
-  uint32_t cmd;
-  uint32_t flags;
-  union
-  {
-    struct
-    {
-      uint32_t data[8];
-    } raw;
-  };
-};
-
-/* Decoder commands */
-
-#define V4L2_DEC_CMD_START       (0)
-#define V4L2_DEC_CMD_STOP        (1)
-#define V4L2_DEC_CMD_PAUSE       (2)
-#define V4L2_DEC_CMD_RESUME      (3)
-
-/* The structure must be zeroed before use by the application
- *  This ensures it can be extended safely in the future.
- */
-
-struct v4l2_decoder_cmd
-{
-  uint32_t cmd;
-  uint32_t flags;
-  union
-  {
-    struct
-    {
-      uint64_t pts;
-    } stop;
-
-    struct
-    {
-/* 0 or 1000 specifies normal speed,
- * 1 specifies forward single stepping,
- * -1 specifies backward single stepping,
- * >1: playback at speed/1000 of the normal speed,
- * <-1: reverse playback at (-speed/1000) of the normal speed.
- */
-
-      int32_t speed;
-      uint32_t format;
-    } start;
-
-    struct
-    {
-      uint32_t data[16];
-    } raw;
-  };
-};
-
 /****************************************************************************
  * Public Function Prototypes
  ****************************************************************************/
diff --git a/include/sys/videoio.h b/include/sys/videoio.h
index 23dc9007bb..81b1444b16 100644
--- a/include/sys/videoio.h
+++ b/include/sys/videoio.h
@@ -18,8 +18,1632 @@
  *
  ****************************************************************************/
 
+#ifndef __INCLUDE_SYS_VIDEOIO_H
+#define __INCLUDE_SYS_VIDEOIO_H
+
 /****************************************************************************
  * Included Files
  ****************************************************************************/
 
-#include <nuttx/video/video.h>
+#include <stdint.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#include <nuttx/fs/ioctl.h>
+#include <nuttx/video/video_controls.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/****************************************************************************
+ * Pre-processor Definitions
+ ****************************************************************************/
+
+#define VIDEO_MAX_FRAME               32
+#define VIDEO_MAX_PLANES               8
+
+/*  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))
+
+/* RGB formats */
+
+#define V4L2_PIX_FMT_RGB332   v4l2_fourcc('R', 'G', 'B', '1')
+#define V4L2_PIX_FMT_RGB444   v4l2_fourcc('R', '4', '4', '4')
+#define V4L2_PIX_FMT_ARGB444  v4l2_fourcc('A', 'R', '1', '2')
+#define V4L2_PIX_FMT_XRGB444  v4l2_fourcc('X', 'R', '1', '2')
+#define V4L2_PIX_FMT_RGB555   v4l2_fourcc('R', 'G', 'B', 'O')
+#define V4L2_PIX_FMT_ARGB555  v4l2_fourcc('A', 'R', '1', '5')
+#define V4L2_PIX_FMT_XRGB555  v4l2_fourcc('X', 'R', '1', '5')
+#define V4L2_PIX_FMT_RGB565   v4l2_fourcc('R', 'G', 'B', 'P')
+#define V4L2_PIX_FMT_RGB555X  v4l2_fourcc('R', 'G', 'B', 'Q')
+#define V4L2_PIX_FMT_ARGB555X v4l2_fourcc_be('A', 'R', '1', '5')
+#define V4L2_PIX_FMT_XRGB555X v4l2_fourcc_be('X', 'R', '1', '5')
+#define V4L2_PIX_FMT_RGB565X  v4l2_fourcc('R', 'G', 'B', 'R')
+#define V4L2_PIX_FMT_BGR666   v4l2_fourcc('B', 'G', 'R', 'H')
+#define V4L2_PIX_FMT_BGR24    v4l2_fourcc('B', 'G', 'R', '3')
+#define V4L2_PIX_FMT_RGB24    v4l2_fourcc('R', 'G', 'B', '3')
+#define V4L2_PIX_FMT_BGR32    v4l2_fourcc('B', 'G', 'R', '4')
+#define V4L2_PIX_FMT_ABGR32   v4l2_fourcc('A', 'R', '2', '4')
+#define V4L2_PIX_FMT_XBGR32   v4l2_fourcc('X', 'R', '2', '4')
+#define V4L2_PIX_FMT_RGB32    v4l2_fourcc('R', 'G', 'B', '4')
+#define V4L2_PIX_FMT_ARGB32   v4l2_fourcc('B', 'A', '2', '4')
+#define V4L2_PIX_FMT_XRGB32   v4l2_fourcc('B', 'X', '2', '4')
+
+/* Grey formats */
+
+#define V4L2_PIX_FMT_GREY     v4l2_fourcc('G', 'R', 'E', 'Y')
+#define V4L2_PIX_FMT_Y4       v4l2_fourcc('Y', '0', '4', ' ')
+#define V4L2_PIX_FMT_Y6       v4l2_fourcc('Y', '0', '6', ' ')
+#define V4L2_PIX_FMT_Y10      v4l2_fourcc('Y', '1', '0', ' ')
+#define V4L2_PIX_FMT_Y12      v4l2_fourcc('Y', '1', '2', ' ')
+#define V4L2_PIX_FMT_Y16      v4l2_fourcc('Y', '1', '6', ' ')
+#define V4L2_PIX_FMT_Y16_BE   v4l2_fourcc_be('Y', '1', '6', ' ')
+
+/* Grey bit-packed formats */
+
+#define V4L2_PIX_FMT_Y10BPACK v4l2_fourcc('Y', '1', '0', 'B')
+
+/* Palette formats */
+
+#define V4L2_PIX_FMT_PAL8     v4l2_fourcc('P', 'A', 'L', '8')
+
+/* Chrominance formats */
+
+#define V4L2_PIX_FMT_UV8      v4l2_fourcc('U', 'V', '8', ' ')
+
+/* Luminance+Chrominance formats */
+
+#define V4L2_PIX_FMT_YUYV     v4l2_fourcc('Y', 'U', 'Y', 'V')
+#define V4L2_PIX_FMT_YYUV     v4l2_fourcc('Y', 'Y', 'U', 'V')
+#define V4L2_PIX_FMT_YVYU     v4l2_fourcc('Y', 'V', 'Y', 'U')
+#define V4L2_PIX_FMT_UYVY     v4l2_fourcc('U', 'Y', 'V', 'Y')
+#define V4L2_PIX_FMT_VYUY     v4l2_fourcc('V', 'Y', 'U', 'Y')
+#define V4L2_PIX_FMT_Y41P     v4l2_fourcc('Y', '4', '1', 'P')
+#define V4L2_PIX_FMT_YUV444   v4l2_fourcc('Y', '4', '4', '4')
+#define V4L2_PIX_FMT_YUV555   v4l2_fourcc('Y', 'U', 'V', 'O')
+#define V4L2_PIX_FMT_YUV565   v4l2_fourcc('Y', 'U', 'V', 'P')
+#define V4L2_PIX_FMT_YUV32    v4l2_fourcc('Y', 'U', 'V', '4')
+#define V4L2_PIX_FMT_HI240    v4l2_fourcc('H', 'I', '2', '4')
+#define V4L2_PIX_FMT_HM12     v4l2_fourcc('H', 'M', '1', '2')
+#define V4L2_PIX_FMT_M420     v4l2_fourcc('M', '4', '2', '0')
+
+/* Two planes -- one Y, one Cr + Cb interleaved  */
+
+#define V4L2_PIX_FMT_NV12     v4l2_fourcc('N', 'V', '1', '2')
+#define V4L2_PIX_FMT_NV21     v4l2_fourcc('N', 'V', '2', '1')
+#define V4L2_PIX_FMT_NV16     v4l2_fourcc('N', 'V', '1', '6')
+#define V4L2_PIX_FMT_NV61     v4l2_fourcc('N', 'V', '6', '1')
+#define V4L2_PIX_FMT_NV24     v4l2_fourcc('N', 'V', '2', '4')
+#define V4L2_PIX_FMT_NV42     v4l2_fourcc('N', 'V', '4', '2')
+
+/* Two non contiguous planes - one Y, one Cr + Cb interleaved  */
+
+#define V4L2_PIX_FMT_NV12M    v4l2_fourcc('N', 'M', '1', '2')
+#define V4L2_PIX_FMT_NV21M    v4l2_fourcc('N', 'M', '2', '1')
+#define V4L2_PIX_FMT_NV16M    v4l2_fourcc('N', 'M', '1', '6')
+#define V4L2_PIX_FMT_NV61M    v4l2_fourcc('N', 'M', '6', '1')
+#define V4L2_PIX_FMT_NV12MT   v4l2_fourcc('T', 'M', '1', '2')
+#define V4L2_PIX_FMT_NV12MT_16X16 v4l2_fourcc('V', 'M', '1', '2')
+
+/* Three planes - Y Cb, Cr */
+
+#define V4L2_PIX_FMT_YUV410   v4l2_fourcc('Y', 'U', 'V', '9')
+#define V4L2_PIX_FMT_YVU410   v4l2_fourcc('Y', 'V', 'U', '9')
+#define V4L2_PIX_FMT_YUV411P  v4l2_fourcc('4', '1', '1', 'P')
+#define V4L2_PIX_FMT_YUV420   v4l2_fourcc('Y', 'U', '1', '2')
+#define V4L2_PIX_FMT_YVU420   v4l2_fourcc('Y', 'V', '1', '2')
+#define V4L2_PIX_FMT_YUV422P  v4l2_fourcc('4', '2', '2', 'P')
+
+/* Three non contiguous planes - Y, Cb, Cr */
+
+#define V4L2_PIX_FMT_YUV420M  v4l2_fourcc('Y', 'M', '1', '2')
+#define V4L2_PIX_FMT_YVU420M  v4l2_fourcc('Y', 'M', '2', '1')
+#define V4L2_PIX_FMT_YUV422M  v4l2_fourcc('Y', 'M', '1', '6')
+#define V4L2_PIX_FMT_YVU422M  v4l2_fourcc('Y', 'M', '6', '1')
+#define V4L2_PIX_FMT_YUV444M  v4l2_fourcc('Y', 'M', '2', '4')
+#define V4L2_PIX_FMT_YVU444M  v4l2_fourcc('Y', 'M', '4', '2')
+
+/* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */
+
+#define V4L2_PIX_FMT_SBGGR8   v4l2_fourcc('B', 'A', '8', '1')
+#define V4L2_PIX_FMT_SGBRG8   v4l2_fourcc('G', 'B', 'R', 'G')
+#define V4L2_PIX_FMT_SGRBG8   v4l2_fourcc('G', 'R', 'B', 'G')
+#define V4L2_PIX_FMT_SRGGB8   v4l2_fourcc('R', 'G', 'G', 'B')
+#define V4L2_PIX_FMT_SBGGR10  v4l2_fourcc('B', 'G', '1', '0')
+#define V4L2_PIX_FMT_SGBRG10  v4l2_fourcc('G', 'B', '1', '0')
+#define V4L2_PIX_FMT_SGRBG10  v4l2_fourcc('B', 'A', '1', '0')
+#define V4L2_PIX_FMT_SRGGB10  v4l2_fourcc('R', 'G', '1', '0')
+
+/* 10bit raw bayer packed, 5 bytes for every 4 pixels */
+
+#define V4L2_PIX_FMT_SBGGR10P v4l2_fourcc('p', 'B', 'A', 'A')
+#define V4L2_PIX_FMT_SGBRG10P v4l2_fourcc('p', 'G', 'A', 'A')
+#define V4L2_PIX_FMT_SGRBG10P v4l2_fourcc('p', 'g', 'A', 'A')
+#define V4L2_PIX_FMT_SRGGB10P v4l2_fourcc('p', 'R', 'A', 'A')
+
+/* 10bit raw bayer a-law compressed to 8 bits */
+
+#define V4L2_PIX_FMT_SBGGR10ALAW8 v4l2_fourcc('a', 'B', 'A', '8')
+#define V4L2_PIX_FMT_SGBRG10ALAW8 v4l2_fourcc('a', 'G', 'A', '8')
+#define V4L2_PIX_FMT_SGRBG10ALAW8 v4l2_fourcc('a', 'g', 'A', '8')
+#define V4L2_PIX_FMT_SRGGB10ALAW8 v4l2_fourcc('a', 'R', 'A', '8')
+
+/* 10bit raw bayer DPCM compressed to 8 bits */
+
+#define V4L2_PIX_FMT_SBGGR10DPCM8 v4l2_fourcc('b', 'B', 'A', '8')
+#define V4L2_PIX_FMT_SGBRG10DPCM8 v4l2_fourcc('b', 'G', 'A', '8')
+#define V4L2_PIX_FMT_SGRBG10DPCM8 v4l2_fourcc('B', 'D', '1', '0')
+#define V4L2_PIX_FMT_SRGGB10DPCM8 v4l2_fourcc('b', 'R', 'A', '8')
+#define V4L2_PIX_FMT_SBGGR12      v4l2_fourcc('B', 'G', '1', '2')
+#define V4L2_PIX_FMT_SGBRG12      v4l2_fourcc('G', 'B', '1', '2')
+#define V4L2_PIX_FMT_SGRBG12      v4l2_fourcc('B', 'A', '1', '2')
+#define V4L2_PIX_FMT_SRGGB12      v4l2_fourcc('R', 'G', '1', '2')
+#define V4L2_PIX_FMT_SBGGR16      v4l2_fourcc('B', 'Y', 'R', '2')
+#define V4L2_PIX_FMT_SGBRG16      v4l2_fourcc('G', 'B', '1', '6')
+#define V4L2_PIX_FMT_SGRBG16      v4l2_fourcc('G', 'R', '1', '6')
+#define V4L2_PIX_FMT_SRGGB16      v4l2_fourcc('R', 'G', '1', '6')
+
+/* HSV formats */
+
+#define V4L2_PIX_FMT_HSV24    v4l2_fourcc('H', 'S', 'V', '3')
+#define V4L2_PIX_FMT_HSV32    v4l2_fourcc('H', 'S', 'V', '4')
+
+/* Compressed formats */
+
+#define V4L2_PIX_FMT_MJPEG    v4l2_fourcc('M', 'J', 'P', 'G')
+#define V4L2_PIX_FMT_JPEG     v4l2_fourcc('J', 'P', 'E', 'G')
+#define V4L2_PIX_FMT_DV       v4l2_fourcc('d', 'v', 's', 'd')
+#define V4L2_PIX_FMT_MPEG     v4l2_fourcc('M', 'P', 'E', 'G')
+#define V4L2_PIX_FMT_H264     v4l2_fourcc('H', '2', '6', '4')
+#define V4L2_PIX_FMT_H264_NO_SC v4l2_fourcc('A', 'V', 'C', '1')
+#define V4L2_PIX_FMT_H264_MVC v4l2_fourcc('M', '2', '6', '4')
+#define V4L2_PIX_FMT_H263     v4l2_fourcc('H', '2', '6', '3')
+#define V4L2_PIX_FMT_MPEG1    v4l2_fourcc('M', 'P', 'G', '1')
+#define V4L2_PIX_FMT_MPEG2    v4l2_fourcc('M', 'P', 'G', '2')
+#define V4L2_PIX_FMT_MPEG4    v4l2_fourcc('M', 'P', 'G', '4')
+#define V4L2_PIX_FMT_XVID     v4l2_fourcc('X', 'V', 'I', 'D')
+#define V4L2_PIX_FMT_VC1_ANNEX_G v4l2_fourcc('V', 'C', '1', 'G')
+#define V4L2_PIX_FMT_VC1_ANNEX_L v4l2_fourcc('V', 'C', '1', 'L')
+#define V4L2_PIX_FMT_VP8      v4l2_fourcc('V', 'P', '8', '0')
+#define V4L2_PIX_FMT_VP9      v4l2_fourcc('V', 'P', '9', '0')
+#define V4L2_PIX_FMT_HEVC     v4l2_fourcc('H', 'E', 'V', 'C')
+
+/* JPEG + sub image */
+
+#define V4L2_PIX_FMT_JPEG_WITH_SUBIMG v4l2_fourcc('J', 'S', 'U', 'B')
+
+/* YUV 4:2:2 for sub image */
+
+#define V4L2_PIX_FMT_SUBIMG_UYVY v4l2_fourcc('S', 'Y', 'U', 'V')
+
+/* RGB565 for sub image */
+
+#define V4L2_PIX_FMT_SUBIMG_RGB565 v4l2_fourcc('S', 'R', 'G', '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 CONFIG_VIDEO_REQBUFS_COUNT_MAX
+
+/* Buffer error flag */
+
+#define V4L2_BUF_FLAG_ERROR    (0x0001)
+
+/* Values for v4l2_std_id */
+
+/* One bit for each */
+
+#define V4L2_STD_PAL_B          ((v4l2_std_id)0x00000001)
+#define V4L2_STD_PAL_B1         ((v4l2_std_id)0x00000002)
+#define V4L2_STD_PAL_G          ((v4l2_std_id)0x00000004)
+#define V4L2_STD_PAL_H          ((v4l2_std_id)0x00000008)
+#define V4L2_STD_PAL_I          ((v4l2_std_id)0x00000010)
+#define V4L2_STD_PAL_D          ((v4l2_std_id)0x00000020)
+#define V4L2_STD_PAL_D1         ((v4l2_std_id)0x00000040)
+#define V4L2_STD_PAL_K          ((v4l2_std_id)0x00000080)
+
+#define V4L2_STD_PAL_M          ((v4l2_std_id)0x00000100)
+#define V4L2_STD_PAL_N          ((v4l2_std_id)0x00000200)
+#define V4L2_STD_PAL_Nc         ((v4l2_std_id)0x00000400)
+#define V4L2_STD_PAL_60         ((v4l2_std_id)0x00000800)
+
+#define V4L2_STD_NTSC_M         ((v4l2_std_id)0x00001000)    /* BTSC */
+#define V4L2_STD_NTSC_M_JP      ((v4l2_std_id)0x00002000)    /* EIA-J */
+#define V4L2_STD_NTSC_443       ((v4l2_std_id)0x00004000)
+#define V4L2_STD_NTSC_M_KR      ((v4l2_std_id)0x00008000)    /* FM A2 */
+
+#define V4L2_STD_SECAM_B        ((v4l2_std_id)0x00010000)
+#define V4L2_STD_SECAM_D        ((v4l2_std_id)0x00020000)
+#define V4L2_STD_SECAM_G        ((v4l2_std_id)0x00040000)
+#define V4L2_STD_SECAM_H        ((v4l2_std_id)0x00080000)
+#define V4L2_STD_SECAM_K        ((v4l2_std_id)0x00100000)
+#define V4L2_STD_SECAM_K1       ((v4l2_std_id)0x00200000)
+#define V4L2_STD_SECAM_L        ((v4l2_std_id)0x00400000)
+#define V4L2_STD_SECAM_LC       ((v4l2_std_id)0x00800000)
+
+/* ATSC/HDTV */
+
+#define V4L2_STD_ATSC_8_VSB     ((v4l2_std_id)0x01000000)
+#define V4L2_STD_ATSC_16_VSB    ((v4l2_std_id)0x02000000)
+
+/* Some macros to merge video standards in order to make live easier for the
+ * drivers and V4L2 applications
+ */
+
+/* "Common" NTSC/M - It should be noticed that V4L2_STD_NTSC_443 is
+ * Missing here.
+ */
+
+#define V4L2_STD_NTSC           (V4L2_STD_NTSC_M     | \
+                                 V4L2_STD_NTSC_M_JP  | \
+                                 V4L2_STD_NTSC_M_KR)
+
+/* Secam macros */
+
+#define V4L2_STD_SECAM_DK       (V4L2_STD_SECAM_D    | \
+                                 V4L2_STD_SECAM_K    | \
+                                 V4L2_STD_SECAM_K1)
+
+/* All Secam Standards */
+
+#define V4L2_STD_SECAM          (V4L2_STD_SECAM_B    | \
+                                 V4L2_STD_SECAM_G    | \
+                                 V4L2_STD_SECAM_H    | \
+                                 V4L2_STD_SECAM_DK   | \
+                                 V4L2_STD_SECAM_L    | \
+                                 V4L2_STD_SECAM_LC)
+
+/* PAL macros */
+#define V4L2_STD_PAL_BG         (V4L2_STD_PAL_B      | \
+                                 V4L2_STD_PAL_B1     | \
+                                 V4L2_STD_PAL_G)
+#define V4L2_STD_PAL_DK         (V4L2_STD_PAL_D      | \
+                                 V4L2_STD_PAL_D1     | \
+                                 V4L2_STD_PAL_K)
+
+/* "Common" PAL - This macro is there to be compatible with the old
+ * V4L1 concept of "PAL": /BGDKHI.
+ * Several PAL standards are missing here: /M, /N and /Nc
+ */
+
+#define V4L2_STD_PAL            (V4L2_STD_PAL_BG     | \
+                                 V4L2_STD_PAL_DK     | \
+                                 V4L2_STD_PAL_H      | \
+                                 V4L2_STD_PAL_I)
+
+/* Chroma "agnostic" standards */
+
+#define V4L2_STD_B              (V4L2_STD_PAL_B      | \
+                                 V4L2_STD_PAL_B1     | \
+                                 V4L2_STD_SECAM_B)
+#define V4L2_STD_G              (V4L2_STD_PAL_G      | \
+                                 V4L2_STD_SECAM_G)
+#define V4L2_STD_H              (V4L2_STD_PAL_H      | \
+                                 V4L2_STD_SECAM_H)
+#define V4L2_STD_L              (V4L2_STD_SECAM_L    | \
+                                 V4L2_STD_SECAM_LC)
+#define V4L2_STD_GH             (V4L2_STD_G          | \
+                                 V4L2_STD_H)
+#define V4L2_STD_DK             (V4L2_STD_PAL_DK     | \
+                                 V4L2_STD_SECAM_DK)
+#define V4L2_STD_BG             (V4L2_STD_B          | \
+                                 V4L2_STD_G)
+#define V4L2_STD_MN             (V4L2_STD_PAL_M      | \
+                                 V4L2_STD_PAL_N      | \
+                                 V4L2_STD_PAL_Nc     | \
+                                 V4L2_STD_NTSC)
+
+/* Standards where MTS/BTSC stereo could be found */
+
+#define V4L2_STD_MTS            (V4L2_STD_NTSC_M     | \
+                                 V4L2_STD_PAL_M      | \
+                                 V4L2_STD_PAL_N      | \
+                                 V4L2_STD_PAL_Nc)
+
+/* Standards for Countries with 60Hz Line frequency */
+
+#define V4L2_STD_525_60         (V4L2_STD_PAL_M      | \
+                                 V4L2_STD_PAL_60     | \
+                                 V4L2_STD_NTSC       | \
+                                 V4L2_STD_NTSC_443)
+
+/* Standards for Countries with 50Hz Line frequency */
+
+#define V4L2_STD_625_50         (V4L2_STD_PAL        | \
+                                 V4L2_STD_PAL_N      | \
+                                 V4L2_STD_PAL_Nc     | \
+                                 V4L2_STD_SECAM)
+#define V4L2_STD_ATSC           (V4L2_STD_ATSC_8_VSB | \
+                                 V4L2_STD_ATSC_16_VSB)
+
+/* Macros with none and all analog standards */
+
+#define V4L2_STD_UNKNOWN        0
+#define V4L2_STD_ALL            (V4L2_STD_525_60     | \
+                                 V4L2_STD_625_50)
+
+/****************************************************************************
+ * Public Types
+ ****************************************************************************/
+
+/* V4L2 device capabilities for VIDIOC_QUERYCAP.
+ * Currently, only member "driver" is supported.
+ */
+
+struct v4l2_capability
+{
+  uint8_t  driver[16];   /* Name of driver module(e.g. "bttv" */
+  uint8_t  card[32];     /* Name of the card(e.g. "Yoyodyne TV/FM" */
+  uint8_t  bus_info[32]; /* Name of the bus(e.g. "PCI:0000:05:06.0" */
+  uint32_t version;      /* Version number of the driver */
+  uint32_t capabilities; /* Available capabilities of the physical device */
+  uint32_t device_caps;  /* Device capabilities of the opened device */
+};
+
+/* Values for 'capabilities' field */
+
+enum v4l2_capabilities
+{
+  V4L2_CAP_VIDEO_CAPTURE          = 0x00000001,  /* Is a video capture device */
+  V4L2_CAP_VIDEO_OUTPUT           = 0x00000002,  /* Is a video output device */
+  V4L2_CAP_VIDEO_OVERLAY          = 0x00000004,  /* Can do video overlay */
+  V4L2_CAP_VBI_CAPTURE            = 0x00000010,  /* Is a raw VBI capture device */
+  V4L2_CAP_VBI_OUTPUT             = 0x00000020,  /* Is a raw VBI output device */
+  V4L2_CAP_SLICED_VBI_CAPTURE     = 0x00000040,  /* Is a sliced VBI capture device */
+  V4L2_CAP_SLICED_VBI_OUTPUT      = 0x00000080,  /* Is a sliced VBI output device */
+  V4L2_CAP_RDS_CAPTURE            = 0x00000100,  /* RDS data capture */
+  V4L2_CAP_VIDEO_OUTPUT_OVERLAY   = 0x00000200,  /* Can do video output overlay */
+  V4L2_CAP_HW_FREQ_SEEK           = 0x00000400,  /* Can do hardware frequency seek */
+  V4L2_CAP_RDS_OUTPUT             = 0x00000800,  /* Is an RDS encoder */
+  V4L2_CAP_VIDEO_CAPTURE_MPLANE   = 0x00001000,  /* Is a video capture device that supports multiplanar formats */
+  V4L2_CAP_VIDEO_OUTPUT_MPLANE    = 0x00002000,  /* Is a video output device that supports multiplanar formats */
+  V4L2_CAP_VIDEO_M2M_MPLANE       = 0x00004000,  /* Is a video mem-to-mem device that supports multiplanar formats */
+  V4L2_CAP_VIDEO_M2M              = 0x00008000,  /* Is a video mem-to-mem device */
+  V4L2_CAP_TUNER                  = 0x00010000,  /* Has a tuner */
+  V4L2_CAP_AUDIO                  = 0x00020000,  /* Has audio support */
+  V4L2_CAP_RADIO                  = 0x00040000,  /* Is a radio device */
+  V4L2_CAP_MODULATOR              = 0x00080000,  /* Has a modulator */
+  V4L2_CAP_SDR_CAPTURE            = 0x00100000,  /* Is a SDR capture device */
+  V4L2_CAP_EXT_PIX_FORMAT         = 0x00200000,  /* Supports the extended pixel format */
+  V4L2_CAP_SDR_OUTPUT             = 0x00400000,  /* Is a SDR output device */
+  V4L2_CAP_READWRITE              = 0x01000000,  /* Read/write systemcalls */
+  V4L2_CAP_ASYNCIO                = 0x02000000,  /* Async I/O */
+  V4L2_CAP_STREAMING              = 0x04000000,  /* Streaming I/O ioctls */
+  V4L2_CAP_TOUCH                  = 0x10000000,  /* Is a touch device */
+  V4L2_CAP_DEVICE_CAPS            = 0x80000000,  /* Sets device capabilities field */
+};
+
+/* Rectangle information */
+
+struct v4l2_rect
+{
+  /* Horizontal offset of the top, left corner of the rectangle, in pixels. */
+
+  int32_t left;
+
+  /* Vertical offset of the top, left corner of the rectangle, in pixels. */
+
+  int32_t top;
+
+  /* Width of the rectangle, in pixels. */
+
+  uint32_t width;
+
+  /* Height of the rectangle, in pixels. */
+
+  uint32_t height;
+};
+
+/* Fraction */
+
+struct v4l2_fract
+{
+  uint32_t numerator;                     /* Numerator */
+  uint32_t denominator;                   /* Denominator */
+};
+
+/* V4L2 selection info for VIDIOC_S_SELECTION and VIDIOC_G_SELECTION.
+ * Currently, only member type and r are supported.
+ */
+
+struct v4l2_selection
+{
+  uint32_t type;       /* Buffer type */
+  uint32_t target;
+  uint32_t flags;
+  struct v4l2_rect r;  /* The selection rectangle. */
+};
+
+typedef uint64_t v4l2_std_id;
+
+struct v4l2_standard
+{
+  uint32_t            index;
+  v4l2_std_id         id;
+  uint8_t             name[24];
+  struct v4l2_fract   frameperiod; /* Frames, not fields */
+  uint32_t            framelines;
+  uint32_t            reserved[4];
+};
+
+/* 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_META_OUTPUT          = 14,   /* Metadata output */
+  V4L2_BUF_TYPE_PRIVATE              = 0x80, /* Deprecated, do not use */
+  V4L2_BUF_TYPE_STILL_CAPTURE        = 0x81  /* Single-planar still capture stream */
+};
+
+#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    \
+   || (type) == V4L2_BUF_TYPE_SDR_OUTPUT           \
+   || (type) == V4L2_BUF_TYPE_META_OUTPUT)
+
+/* 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 */
+};
+
+/* See also http://vektor.theorem.ca/graphics/ycbcr/ */
+
+enum v4l2_colorspace
+{
+  /* Default colorspace, i.e. let the driver figure it out.
+   *  Can only be used with video capture.
+   */
+
+  V4L2_COLORSPACE_DEFAULT       = 0,
+
+  /* SMPTE 170M: used for broadcast NTSC/PAL SDTV */
+
+  V4L2_COLORSPACE_SMPTE170M     = 1,
+
+  /* Obsolete pre-1998 SMPTE 240M HDTV standard, superseded by Rec 709 */
+
+  V4L2_COLORSPACE_SMPTE240M     = 2,
+
+  /* Rec.709: used for HDTV */
+
+  V4L2_COLORSPACE_REC709        = 3,
+
+  /* Deprecated, do not use. No driver will ever return this. This was
+   *  based on a misunderstanding of the bt878 datasheet.
+   */
+
+  V4L2_COLORSPACE_BT878         = 4,
+
+  /* NTSC 1953 colorspace. This only makes sense when dealing with
+   *  really, really old NTSC recordings. Superseded by SMPTE 170M.
+   */
+
+  V4L2_COLORSPACE_470_SYSTEM_M  = 5,
+
+  /* EBU Tech 3213 PAL/SECAM colorspace. This only makes sense when
+   * dealing with really old PAL/SECAM recordings. Superseded by
+   * SMPTE 170M.
+   */
+
+  V4L2_COLORSPACE_470_SYSTEM_BG = 6,
+
+  /* Effectively shorthand for V4L2_COLORSPACE_SRGB, V4L2_YCBCR_ENC_601
+   *  and V4L2_QUANTIZATION_FULL_RANGE. To be used for (Motion-)JPEG.
+   */
+
+  V4L2_COLORSPACE_JPEG          = 7,
+
+  /* For RGB colorspaces such as produces by most webcams. */
+
+  V4L2_COLORSPACE_SRGB          = 8,
+
+  /* opRGB colorspace */
+
+  V4L2_COLORSPACE_OPRGB         = 9,
+
+  /* BT.2020 colorspace, used for UHDTV. */
+
+  V4L2_COLORSPACE_BT2020        = 10,
+
+  /* Raw colorspace: for RAW unprocessed images */
+
+  V4L2_COLORSPACE_RAW           = 11,
+
+  /* DCI-P3 colorspace, used by cinema projectors */
+
+  V4L2_COLORSPACE_DCI_P3        = 12,
+};
+
+/* Determine how COLORSPACE_DEFAULT should map to a proper colorspace.
+ * This depends on whether this is a SDTV image (use SMPTE 170M), an
+ * HDTV image (use Rec. 709), or something else (use sRGB).
+ */
+
+#define V4L2_MAP_COLORSPACE_DEFAULT(is_sdtv, is_hdtv) \
+        ((is_sdtv) ? V4L2_COLORSPACE_SMPTE170M : \
+        ((is_hdtv) ? V4L2_COLORSPACE_REC709 : V4L2_COLORSPACE_SRGB))
+
+enum v4l2_xfer_func
+{
+/* Mapping of V4L2_XFER_FUNC_DEFAULT to actual transfer functions
+ * for the various colorspaces:
+ *
+ * V4L2_COLORSPACE_SMPTE170M, V4L2_COLORSPACE_470_SYSTEM_M,
+ * V4L2_COLORSPACE_470_SYSTEM_BG, V4L2_COLORSPACE_REC709 and
+ * V4L2_COLORSPACE_BT2020: V4L2_XFER_FUNC_709
+ *
+ * V4L2_COLORSPACE_SRGB, V4L2_COLORSPACE_JPEG: V4L2_XFER_FUNC_SRGB
+ *
+ * V4L2_COLORSPACE_OPRGB: V4L2_XFER_FUNC_OPRGB
+ *
+ * V4L2_COLORSPACE_SMPTE240M: V4L2_XFER_FUNC_SMPTE240M
+ *
+ * V4L2_COLORSPACE_RAW: V4L2_XFER_FUNC_NONE
+ *
+ * V4L2_COLORSPACE_DCI_P3: V4L2_XFER_FUNC_DCI_P3
+ */
+
+  V4L2_XFER_FUNC_DEFAULT     = 0,
+  V4L2_XFER_FUNC_709         = 1,
+  V4L2_XFER_FUNC_SRGB        = 2,
+  V4L2_XFER_FUNC_OPRGB       = 3,
+  V4L2_XFER_FUNC_SMPTE240M   = 4,
+  V4L2_XFER_FUNC_NONE        = 5,
+  V4L2_XFER_FUNC_DCI_P3      = 6,
+  V4L2_XFER_FUNC_SMPTE2084   = 7,
+};
+
+enum v4l2_ycbcr_encoding
+{
+/* Mapping of V4L2_YCBCR_ENC_DEFAULT to actual encodings for the
+ * various colorspaces:
+ *
+ * V4L2_COLORSPACE_SMPTE170M, V4L2_COLORSPACE_470_SYSTEM_M,
+ * V4L2_COLORSPACE_470_SYSTEM_BG, V4L2_COLORSPACE_SRGB,
+ * V4L2_COLORSPACE_OPRGB and V4L2_COLORSPACE_JPEG: V4L2_YCBCR_ENC_601
+ *
+ * V4L2_COLORSPACE_REC709 and V4L2_COLORSPACE_DCI_P3: V4L2_YCBCR_ENC_709
+ *
+ * V4L2_COLORSPACE_BT2020: V4L2_YCBCR_ENC_BT2020
+ *
+ * V4L2_COLORSPACE_SMPTE240M: V4L2_YCBCR_ENC_SMPTE240M
+ */
+
+  V4L2_YCBCR_ENC_DEFAULT        = 0,
+
+  /* ITU-R 601 -- SDTV */
+
+  V4L2_YCBCR_ENC_601            = 1,
+
+  /* Rec. 709 -- HDTV */
+
+  V4L2_YCBCR_ENC_709            = 2,
+
+  /* ITU-R 601/EN 61966-2-4 Extended Gamut -- SDTV */
+
+  V4L2_YCBCR_ENC_XV601          = 3,
+
+  /* Rec. 709/EN 61966-2-4 Extended Gamut -- HDTV */
+
+  V4L2_YCBCR_ENC_XV709          = 4,
+
+/* sYCC (Y'CbCr encoding of sRGB), identical to ENC_601. It was added
+ * originally due to a misunderstanding of the sYCC standard. It should
+ * not be used, instead use V4L2_YCBCR_ENC_601.
+ */
+
+  V4L2_YCBCR_ENC_SYCC           = 5,
+
+  /* BT.2020 Non-constant Luminance Y'CbCr */
+
+  V4L2_YCBCR_ENC_BT2020         = 6,
+
+  /* BT.2020 Constant Luminance Y'CbcCrc */
+
+  V4L2_YCBCR_ENC_BT2020_CONST_LUM = 7,
+
+  /* SMPTE 240M -- Obsolete HDTV */
+
+  V4L2_YCBCR_ENC_SMPTE240M      = 8,
+};
+
+enum v4l2_quantization
+{
+/* The default for R'G'B' quantization is always full range.
+ * For Y'CbCr the quantization is always limited range, except
+ * for COLORSPACE_JPEG: this is full range.
+ */
+
+  V4L2_QUANTIZATION_DEFAULT     = 0,
+  V4L2_QUANTIZATION_FULL_RANGE  = 1,
+  V4L2_QUANTIZATION_LIM_RANGE   = 2,
+};
+
+/* 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
+                      */
+  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 timeval       timestamp; /* Frame timestamp */
+  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;
+
+/* Image is a keyframe (I-frame) */
+
+#define V4L2_BUF_FLAG_KEYFRAME                  0x00000008
+
+/* mem2mem encoder/decoder */
+
+#define V4L2_BUF_FLAG_LAST                      0x00100000
+
+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      */
+};
+
+enum v4l2_fmt_flag
+{
+  V4L2_FMT_FLAG_COMPRESSED = 0x0001, /* This is a compressed format */
+  V4L2_FMT_FLAG_EMULATED   = 0x0002, /* This format is not native */
+};
+
+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. */
+
+  /* In type == V4L2_FRMSIZE_TYPE_DISCRETE case, use discrete.
+   * Otherwise, use stepwise.
+   */
+
+  union
+  {
+    struct v4l2_frmsize_discrete discrete;
+    struct v4l2_frmsize_stepwise stepwise;
+  };
+};
+
+/* 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 */
+};
+
+/* 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 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. */
+  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_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
+{
+  uint32_t  sizeimage;
+  uint32_t  bytesperline;
+  uint16_t  reserved[6];
+};
+
+/* 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: enum v4l2_field; field order (for interlaced video)
+ * @colorspace: enum v4l2_colorspace; supplemental to pixelformat
+ * @plane_fmt: per-plane information
+ * @num_planes: number of planes for this format
+ * @flags: format flags (V4L2_PIX_FMT_FLAG_*)
+ * @ycbcr_enc: enum v4l2_ycbcr_encoding, Y'CbCr encoding
+ * @quantization: enum v4l2_quantization, colorspace quantization
+ * @xfer_func: enum v4l2_xfer_func, colorspace transfer function
+ */
+
+struct v4l2_pix_format_mplane
+{
+  uint32_t      width;
+  uint32_t      height;
+  uint32_t      pixelformat;
+  uint32_t      field;
+  uint32_t      colorspace;
+
+  struct v4l2_plane_pix_format plane_fmt[VIDEO_MAX_PLANES];
+  uint8_t                      num_planes;
+  uint8_t                      flags;
+  union
+  {
+    uint8_t                    ycbcr_enc;
+    uint8_t                    hsv_enc;
+  };
+  uint8_t                      quantization;
+  uint8_t                      xfer_func;
+  uint8_t                      reserved[7];
+};
+
+struct v4l2_format
+{
+  uint32_t  type;                         /* enum #v4l2_buf_type. */
+  union
+  {
+    struct v4l2_pix_format        pix;    /* Image format */
+    struct v4l2_pix_format_mplane pix_mp; /* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */
+  } 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_cropcap
+{
+  uint32_t                type; /* enum v4l2_buf_type */
+  struct v4l2_rect        bounds;
+  struct v4l2_rect        defrect;
+  struct v4l2_fract       pixelaspect;
+};
+
+/*  Flags for 'capability' and 'capturemode' fields */
+
+enum v4l2_capture_mode
+{
+  V4L2_MODE_HIGHQUALITY = 0x0001,    /*  High quality imaging mode */
+};
+
+enum v4l2_capture_capability
+{
+  V4L2_CAP_TIMEPERFRAME = 0x1000,    /*  timeperframe field is supported */
+};
+
+struct v4l2_streamparm
+{
+  uint32_t    type;                  /* enum v4l2_buf_type */
+  union
+  {
+    struct v4l2_captureparm capture;
+  } parm;
+};
+
+/* E V E N T S */
+
+#define V4L2_EVENT_ALL                          0
+#define V4L2_EVENT_VSYNC                        1
+#define V4L2_EVENT_EOS                          2
+#define V4L2_EVENT_CTRL                         3
+#define V4L2_EVENT_FRAME_SYNC                   4
+#define V4L2_EVENT_SOURCE_CHANGE                5
+#define V4L2_EVENT_MOTION_DET                   6
+#define V4L2_EVENT_PRIVATE_START                0x08000000
+
+/* Payload for V4L2_EVENT_VSYNC */
+
+struct v4l2_event_vsync
+{
+  /* Can be V4L2_FIELD_ANY, _NONE, _TOP or _BOTTOM */
+
+  uint8_t field;
+};
+
+/* Payload for V4L2_EVENT_CTRL */
+
+#define V4L2_EVENT_CTRL_CH_VALUE                (1 << 0)
+#define V4L2_EVENT_CTRL_CH_FLAGS                (1 << 1)
+#define V4L2_EVENT_CTRL_CH_RANGE                (1 << 2)
+
+struct v4l2_event_ctrl
+{
+  uint32_t changes;
+  uint32_t type;
+  union
+  {
+    int32_t value;
+    int64_t value64;
+  };
+  uint32_t flags;
+  int32_t minimum;
+  int32_t maximum;
+  int32_t step;
+  int32_t default_value;
+};
+
+struct v4l2_event_frame_sync
+{
+  uint32_t frame_sequence;
+};
+
+#define V4L2_EVENT_SRC_CH_RESOLUTION        (1 << 0)
+
+struct v4l2_event_src_change
+{
+  uint32_t changes;
+};
+
+#define V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ     (1 << 0)
+
+/* struct v4l2_event_motion_det - motion detection event
+ * @flags:             if V4L2_EVENT_MD_FL_HAVE_FRAME_SEQ is set, then the
+ *                     frame_sequence field is valid.
+ * @frame_sequence:    the frame sequence number associated with this event.
+ * @region_mask:       which regions detected motion.
+ */
+
+struct v4l2_event_motion_det
+{
+  uint32_t flags;
+  uint32_t frame_sequence;
+  uint32_t region_mask;
+};
+
+struct v4l2_event
+{
+  uint32_t        type;
+  union
+  {
+    struct v4l2_event_vsync       vsync;
+    struct v4l2_event_ctrl        ctrl;
+    struct v4l2_event_frame_sync  frame_sync;
+    struct v4l2_event_src_change  src_change;
+    struct v4l2_event_motion_det  motion_det;
+    uint8_t                       data[64];
+  } u;
+  uint32_t        pending;
+  uint32_t        sequence;
+  struct timespec timestamp;
+  uint32_t        id;
+  uint32_t        reserved[8];
+};
+
+#define V4L2_EVENT_SUB_FL_SEND_INITIAL   (1 << 0)
+#define V4L2_EVENT_SUB_FL_ALLOW_FEEDBACK (1 << 1)
+
+struct v4l2_event_subscription
+{
+  uint32_t       type;
+  uint32_t       id;
+  uint32_t       flags;
+  uint32_t       reserved[5];
+};
+
+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 */
+};
+
+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 */
+  };
+};
+
+struct v4l2_input
+{
+  uint32_t      index;       /*  Which input */
+  uint8_t       name[32];    /*  Label */
+  uint32_t      type;        /*  Type of input */
+  uint32_t      audioset;    /*  Associated audios (bitfield) */
+  uint32_t      tuner;       /*  enum v4l2_tuner_type */
+  v4l2_std_id   std;
+  uint32_t      status;
+  uint32_t      capabilities;
+  uint32_t      reserved[3];
+};
+
+/*  Values for the 'type' field */
+
+enum v4l2_input_type
+{
+  V4L2_INPUT_TYPE_TUNER  = 1,
+  V4L2_INPUT_TYPE_CAMERA = 2,
+  V4L2_INPUT_TYPE_TOUCH  = 3,
+};
+
+enum v4l2_input_status
+{
+  /* Field 'status' - general */
+
+  V4L2_IN_ST_NO_POWER    = 0x00000001,  /* Attached device is off */
+  V4L2_IN_ST_NO_SIGNAL   = 0x00000002,
+  V4L2_IN_ST_NO_COLOR    = 0x00000004,
+
+  /* Field 'status' - sensor orientation */
+
+  /* If sensor is mounted upside down set both bits */
+
+  V4L2_IN_ST_HFLIP       = 0x00000010,  /* Frames are flipped horizontally */
+  V4L2_IN_ST_VFLIP       = 0x00000020,  /* Frames are flipped vertically */
+
+  /* Field 'status' - analog */
+
+  V4L2_IN_ST_NO_H_LOCK   = 0x00000100,  /* No horizontal sync lock */
+  V4L2_IN_ST_COLOR_KILL  = 0x00000200,  /* Color killer is active */
+  V4L2_IN_ST_NO_V_LOCK   = 0x00000400,  /* No vertical sync lock */
+  V4L2_IN_ST_NO_STD_LOCK = 0x00000800,  /* No standard format lock */
+
+  /* Field 'status' - digital */
+
+  V4L2_IN_ST_NO_SYNC     = 0x00010000,  /* No synchronization lock */
+  V4L2_IN_ST_NO_EQU      = 0x00020000,  /* No equalizer lock */
+  V4L2_IN_ST_NO_CARRIER  = 0x00040000,  /* Carrier recovery failed */
+
+  /* Field 'status' - VCR and set-top box */
+
+  V4L2_IN_ST_MACROVISION = 0x01000000,  /* Macrovision detected */
+  V4L2_IN_ST_NO_ACCESS   = 0x02000000,  /* Conditional access denied */
+  V4L2_IN_ST_VTR         = 0x04000000,  /* VTR time constant */
+};
+
+/* Capabilities flags */
+
+enum v4l2_input_capabilities
+{
+  V4L2_IN_CAP_DV_TIMINGS  = 0x00000002, /* Supports S_DV_TIMINGS */
+  V4L2_IN_CAP_STD         = 0x00000004, /* Supports S_STD */
+  V4L2_IN_CAP_NATIVE_SIZE = 0x00000008, /* Supports setting native size */
+};
+
+enum v4l2_input_capabilites_compat
+{
+  V4L2_IN_CAP_CUSTOM_TIMINGS = V4L2_IN_CAP_DV_TIMINGS,  /* For compatibility */
+};
+
+struct v4l2_output
+{
+  uint32_t      index;           /*  Which output */
+  uint8_t       name[32];        /*  Label */
+  uint32_t      type;            /*  Type of output */
+  uint32_t      audioset;        /*  Associated audios (bitfield) */
+  uint32_t      modulator;       /*  Associated modulator */
+  v4l2_std_id   std;
+  uint32_t      capabilities;
+  uint32_t      reserved[3];
+};
+
+/*  Values for the 'type' field */
+
+enum v4l2_output_type
+{
+  V4L2_OUTPUT_TYPE_MODULATOR        = 1,
+  V4L2_OUTPUT_TYPE_ANALOG           = 2,
+  V4L2_OUTPUT_TYPE_ANALOGVGAOVERLAY = 3,
+};
+
+/* Capabilities flags */
+
+enum v4l2_output_capabilities
+{
+  V4L2_OUT_CAP_DV_TIMINGS  = 0x00000002, /* Supports S_DV_TIMINGS */
+  V4L2_OUT_CAP_STD         = 0x00000004, /* Supports S_STD */
+  V4L2_OUT_CAP_NATIVE_SIZE = 0x00000008, /* Supports setting native size */
+};
+
+enum v4l2_output_capabilites_compat
+{
+  V4L2_OUT_CAP_CUSTOM_TIMINGS = V4L2_OUT_CAP_DV_TIMINGS, /* For compatibility */
+};
+
+struct v4l2_control
+{
+  uint16_t id;
+  int32_t  value;
+};
+
+/* Structure for each control of
+ *  ioctl(VIDIOC_G_EXT_CTRLS / VIDIOC_S_EXT_CTRLS)
+ */
+
+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;
+  };
+};
+
+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     */
+};
+
+/* Structure for V4SIOC_S_EXT_CTRLS and V4SIOC_G_EXT_CTRLS */
+
+struct v4s_ext_controls_scene
+{
+  enum v4l2_scene_mode     mode;       /* Scene mode to be controled */
+  struct v4l2_ext_controls control;    /* Same as VIDIOC_S_EXT_CTRLS */
+};
+
+/* Structure for V4SIOC_QUERY_EXT_CTRL */
+
+struct v4s_query_ext_ctrl_scene
+{
+  enum v4l2_scene_mode       mode;     /* Scene mode to be queried */
+  struct v4l2_query_ext_ctrl control;  /* Same as VIDIOC_QUERY_EXT_CTRL */
+};
+
+/* Structure for V4SIOC_QUERYMENU */
+
+struct v4s_querymenu_scene
+{
+  enum v4l2_scene_mode       mode;     /* Scene mode to be queried */
+  struct v4l2_querymenu      menu;     /* Same as VIDIOC_QUERYMENU */
+};
+
+#define V4L2_ENC_CMD_START      (0)
+#define V4L2_ENC_CMD_STOP       (1)
+#define V4L2_ENC_CMD_PAUSE      (2)
+#define V4L2_ENC_CMD_RESUME     (3)
+
+/* Flags for V4L2_ENC_CMD_STOP */
+
+#define V4L2_ENC_CMD_STOP_AT_GOP_END (1 << 0)
+
+struct v4l2_encoder_cmd
+{
+  uint32_t cmd;
+  uint32_t flags;
+  union
+  {
+    struct
+    {
+      uint32_t data[8];
+    } raw;
+  };
+};
+
+/* Decoder commands */
+
+#define V4L2_DEC_CMD_START       (0)
+#define V4L2_DEC_CMD_STOP        (1)
+#define V4L2_DEC_CMD_PAUSE       (2)
+#define V4L2_DEC_CMD_RESUME      (3)
+
+/* The structure must be zeroed before use by the application
+ *  This ensures it can be extended safely in the future.
+ */
+
+struct v4l2_decoder_cmd
+{
+  uint32_t cmd;
+  uint32_t flags;
+  union
+  {
+    struct
+    {
+      uint64_t pts;
+    } stop;
+
+    struct
+    {
+/* 0 or 1000 specifies normal speed,
+ * 1 specifies forward single stepping,
+ * -1 specifies backward single stepping,
+ * >1: playback at speed/1000 of the normal speed,
+ * <-1: reverse playback at (-speed/1000) of the normal speed.
+ */
+
+      int32_t speed;
+      uint32_t format;
+    } start;
+
+    struct
+    {
+      uint32_t data[16];
+    } raw;
+  };
+};
+
+/* Query device capability
+ * Address pointing to struct v4l2_capability
+ */
+
+#define VIDIOC_QUERYCAP               _VIDIOC(0x0000)
+
+/* Enumerate the formats supported by device */
+
+#define VIDIOC_ENUM_FMT               _VIDIOC(0x0002)
+
+/* Get the data format */
+
+#define VIDIOC_G_FMT                  _VIDIOC(0x0004)
+
+/* Set the data format */
+
+#define VIDIOC_S_FMT                  _VIDIOC(0x0005)
+
+/* Initiate user pointer I/O */
+
+#define VIDIOC_REQBUFS                _VIDIOC(0x0008)
+
+/* Query the status of a buffer */
+
+#define VIDIOC_QUERYBUF               _VIDIOC(0x0009)
+
+/* Get frame buffer overlay parameters */
+
+#define VIDIOC_G_FBUF                 _VIDIOC(0x000a)
+
+/* Set frame buffer overlay parameters */
+
+#define VIDIOC_S_FBUF                 _VIDIOC(0x000b)
+
+/* Start or stop video overlay */
+
+#define VIDIOC_OVERLAY                _VIDIOC(0x000e)
+
+/* Enqueue an empty buffer */
+
+#define VIDIOC_QBUF                   _VIDIOC(0x000f)
+
+/* Export a buffer as a DMABUF file descriptor */
+
+#define VIDIOC_EXPBUF                 _VIDIOC(0x0010)
+
+/* Dequeue a filled buffer */
+
+#define VIDIOC_DQBUF                  _VIDIOC(0x0011)
+
+/* Start streaming */
+
+#define VIDIOC_STREAMON               _VIDIOC(0x0012)
+
+/* Stop streaming */
+
+#define VIDIOC_STREAMOFF              _VIDIOC(0x0013)
+
+/* Get streaming parameters */
+
+#define VIDIOC_G_PARM                 _VIDIOC(0x0015)
+
+/* Set streaming parameters */
+
+#define VIDIOC_S_PARM                 _VIDIOC(0x0016)
+
+/* Query the video standard of the current input */
+
+#define VIDIOC_G_STD                  _VIDIOC(0x0017)
+
+/* Select the video standard of the current input */
+
+#define VIDIOC_S_STD                  _VIDIOC(0x0018)
+
+/* Enumerate supported video standards */
+
+#define VIDIOC_ENUMSTD                _VIDIOC(0x0019)
+
+/* Enumerate video inputs */
+
+#define VIDIOC_ENUMINPUT              _VIDIOC(0x001a)
+
+/* 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(0x001b)
+
+/* 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(0x001c)
+
+/* Query control */
+
+#define VIDIOC_QUERYCTRL              _VIDIOC(0x0024)
+
+/* Query menu */
+
+#define VIDIOC_QUERYMENU              _VIDIOC(0x0025)
+
+/* Get video input */
+
+#define VIDIOC_G_INPUT                _VIDIOC(0x0026)
+
+/* Set video input */
+
+#define VIDIOC_S_INPUT                _VIDIOC(0x0027)
+
+/* Set video crop and scale */
+
+#define VIDIOC_CROPCAP                _VIDIOC(0x003a)
+
+/* Query video standard */
+
+#define VIDIOC_QUERYSTD               _VIDIOC(0x003f)
+
+/* Try format */
+
+#define VIDIOC_TRY_FMT                _VIDIOC(0x0040)
+
+/* Get current control value
+ *  Address pointing to struct #v4l2_ext_controls
+ */
+
+#define VIDIOC_G_EXT_CTRLS            _VIDIOC(0x0047)
+
+/* Set control value
+ *  Address pointing to struct #v4l2_ext_controls
+ */
+
+#define VIDIOC_S_EXT_CTRLS            _VIDIOC(0x0048)
+
+/* Try control value
+ *  Address pointing to struct #v4l2_ext_controls
+ */
+
+#define VIDIOC_TRY_EXT_CTRLS          _VIDIOC(0x0049)
+
+/* Enumerate the framesizes supported by device */
+
+#define VIDIOC_ENUM_FRAMESIZES        _VIDIOC(0x004a)
+
+/* Enumerate the frameintervals supported by device */
+
+#define VIDIOC_ENUM_FRAMEINTERVALS    _VIDIOC(0x004b)
+
+/* Execute an encoder command */
+
+#define VIDIOC_ENCODER_CMD            _VIDIOC(0x004d)
+
+/* Dequeue event */
+
+#define VIDIOC_DQEVENT                _VIDIOC(0x0059)
+
+/* Subscribe or unsubscribe event */
+
+#define VIDIOC_SUBSCRIBE_EVENT        _VIDIOC(0x005a)
+
+/* Get clip
+ * Address pointing to struct v4l2_selection
+ */
+
+#define VIDIOC_G_SELECTION            _VIDIOC(0x005e)
+
+/* Set clip
+ * Address pointing to struct v4l2_selection
+ */
+
+#define VIDIOC_S_SELECTION            _VIDIOC(0x005f)
+
+/* Execute an decoder command */
+
+#define VIDIOC_DECODER_CMD            _VIDIOC(0x0060)
+
+/* Query control */
+
+#define VIDIOC_QUERY_EXT_CTRL         _VIDIOC(0x00c0)
+
+/* Cancel DQBUF
+ *  enum #v4l2_buf_type
+ */
+
+#define VIDIOC_CANCEL_DQBUF           _VIDIOC(0x00c1)
+
+/* Do halfpush */
+
+#define VIDIOC_DO_HALFPUSH            _VIDIOC(0x00c2)
+
+/* 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(0x00c3)
+
+/* Stop taking picture */
+
+#define VIDIOC_TAKEPICT_STOP          _VIDIOC(0x00c4)
+
+/* Query control for scene parameter
+ *  Address pointing to struct v4s_query_ext_ctrl_scene
+ */
+
+#define V4SIOC_QUERY_EXT_CTRL_SCENE   _VIDIOC(0x00c5)
+
+/* Query menu for scene parameter
+ *  Address pointing to struct v4s_querymenu_scene
+ */
+
+#define V4SIOC_QUERYMENU_SCENE        _VIDIOC(0x00c6)
+
+/* Get current control value
+ *  Address pointing to struct v4s_ext_controls_scene
+ */
+
+#define V4SIOC_G_EXT_CTRLS_SCENE      _VIDIOC(0x00c7)
+
+/* Set control value
+ *  Address pointing to struct v4s_ext_controls_scene
+ */
+
+#define V4SIOC_S_EXT_CTRLS_SCENE      _VIDIOC(0x00c8)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_SYS_VIDEOIO_H */