Embedded System/Video4Linux2

[V4L2] Data Formats

임베지수 2017. 4. 2. 14:43

 

 

 

Now, set the data format. Each devices are exchange different kind of data with applications. A single mechanism exists to negotiate all data formats using the aggregate struct v4l2_format and the VIDIOC_G_FMT and VIDIOC_S_FMT ioctls. The VIDIOC_S_FMT ioctl is a major turning-point in the initialization sequence. Prior to this point multiple panel applications can access the same device concurrently to select the current input, change controls or modify other properties. the first VIDIOC_S_FMT assigns a logical stream (video data, VBI data etc.) exclusively to one file descriptor.

 

* v4l2_capability definition *

  /**
   * struct v4l2_format - stream data format

   * @type:    type of the data stream
   * @pix:    definition of an image format
   * @pix_mp:    definition of a multiplanar image format

   * @win:    definition of an overlaid image
   * @vbi:    raw VBI capture or output parameters
   * @sliced:    sliced VBI capture or output parameters
   * @raw_data:    placeholder for future extensions and custom formats
   */
 
   struct v4l2_format {
     enum v4l2_buf_type type;
     union {
          struct v4l2_pix_format pix;                      /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
          struct v4l2_pix_format_mplane pix_mp/* V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE */

          struct v4l2_window win;                          /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
          struct v4l2_vbi_format vbi;                      /* V4L2_BUF_TYPE_VBI_CAPTURE */
          struct v4l2_sliced_vbi_format sliced;       /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */

          __u8    raw_data[200];                            /* user-defined */
     } fmt;
   };

 

When application omit the VIDIOC_S_FMT ioctl its locking side effects are implied by the next step, the selection of an I/O method with the VIDIOC_REQBUFS ioctl or implicit with the first read() or write() call.

 

Example

 

struct v4l2_format fmt;
memset(&fmt, 0, sizeof(fmt));
fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
fmt.fmt.pix.width = 800;
fmt.fmt.pix.height = 600;
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;
ioctl(fd, VIDIOC_S_FMT, &fmt);

 

I set the YUYV format(ycbcr422). If you want to change format, fix the V4L2_PIX_FMT_YUYV.

For instance, V4L2_PIX_FMT_RGB555 or V4L2_PIX_FMT_GREY or ... etc.

 

Pretty easy.

'Embedded System > Video4Linux2' 카테고리의 다른 글

[V4L2] 이진화, 선 긋기  (5) 2017.04.02
[V4L2] Memory Mapping  (0) 2017.04.02
[V4L2] Querying Capabilities  (0) 2017.04.02
[V4L2] Opening and Closing Devices  (0) 2017.04.02
V4L2 API를 이용하여 영상획득 성공!!  (0) 2017.04.02