V4L2 driver It is a dual layered driver system of which the upper layer is videodev module.The videodev module is registered as a character device with major number Fig. Capture Flow Diagram 81. Beneath videodev is the V4L2 drivers module source : VVDN Technologies User Controls ● BRIGHTNESS ● CONTRAST ● HUE ● WHITENESS ● SHARPNESS ● BACKLIGHT COMPENSATION Etc. ● Enumerate controls : int ioctl(int fd, int VIDIOC_QUERYCTRL, struct v4l2_queryctrl *argp) ● Changing controls : int ioctl(int fd, VIDIOC_G_CTRL, struct v4l2_control *argp) int ioctl(int fd, VIDIOC_S_CTRL, struct v4l2_control *argp) struct v4l2_control //videodev2.h { __u32 id; __s32 value; }; High Brightness image Low Brightness image Low Contrast image High Contrast image Normal Hue image Abnormal Hue image Capturing Image ● int ioctl(int fd, VIDIOC_QBUF, struct v4l2_buffer *argp) To enqueue an empty (capturing) buffer in the driver's incoming queue ● int ioctl(int fd, VIDIOC_STREAMON, const int *argp) ● int ioctl(int fd, VIDIOC_STREAMOFF, const int *argp) The VIDIOC_STREAMON and VIDIOC_STREAMOFF ioctl start and stop the capture ● int ioctl(int fd, VIDIOC_DQBUF, struct v4l2_buffer *argp) Applications call the VIDIOC_DQBUF ioctl to dequeue a filled (capturing)buffer from the driver’s outgoing queue. Fig.Data Exchange Between Driver and User Space Application (source: lwn.net) Reading and Storing Captured Image ● int select(int nfds, fd_set *readfds, fd_set *writefds,fd_set *exceptfds, struct timeval *timeout); Allows a program to monitor multiple file descriptors, waiting until one or more of the file descriptors become "ready" for some class of I/O operation without blocking Alternative to ‘select’ is ‘poll’ system call Note : ‘ select ‘ is usually called before VIDIOC_DQBUF ● ssize_t write(int fd, const void *buf, size_t count); buf(memory mapped User space storage)= Storage where captured data is present fd(new dest. file) = File where image data has to be stored Other important IOCTLs ● int ioctl(int fd, VIDIOC_G_INPUT, int *argp) : Query the current video input ● int ioctl(int fd, VIDIOC_S_INPUT, int *argp) : Select the current video input ● int ioctl(int fd, VIDIOC_ENUMINPUT, struct v4l2_input *argp) : Enumerate video inputs ● int ioctl(int fd, VIDIOC_G_AUDIO, struct v4l2_audio *argp) : Query the current audio input and its attributes ● int ioctl(int fd, VIDIOC_S_AUDIO, const struct v4l2_audio *argp) : Select the current audio input and its attributes ● int ioctl(int fd, VIDIOC_G_CTRL, struct v4l2_control *argp) : Used to adjust AUTOFOCUS control(struct v4l2_ext_control variable).id = V4L2_CID_FOCUS_AUTO ● List of important headers: ........./linux/videodev2.h ● List of important V4L2 utilities CLI commands: v4l2-ctl –list-devices : To check available webcams v4l2-ctl –all : Lists all V4L2 details v4l2-ctl –set-fmt-video=width=640,height=480,pixelformat=0 : Used to set height and width of frame v4l2-ctl -d /dev/video0 –list-formats-ext : Lists the available Picture formats fswebcam -d v4l2:/dev/video0 -i 0 –list-controls : To display controls current value and range v4l2-ctl –get-priority : Query the current access priority [VIDIOC_G_PRIORITY] v4l2-compliance -d /dev/video0 : Tool to test v4l2 API compliance of drivers v4l2-ctl –get-ctrl=white_balance_temperature : Example to get current value of user controls ● List of some raw image file formats(contains minimally processed data from the image sensor): .pef .ptx (Pentax) .pxn (Logitech) .R3D (RED Digital Cinema) .raf (Fuji) .raw .rw2 (Panasonic) .raw .rwl .dng (Leica) .rwz (Rawzor) .srw (Samsung) .x3f (Sigma) ● Sources: Linux TV (https://linuxtv.org) NXP Semiconductors LWN.NET(https://lwn.net/) Nvidia VVDN Technologies THANK YOU