V4L2 全名 Video For Linux Version 2, 它是 Linux 裡面多媒體類的 kernel module [1]. 和它同等地位的包括 DTV, CEC 等其他 user space API. 比較複雜的系統也可能使用 Media Controller API 來維護 [5], 因為 V4L2 不提供查找 device 的能力, 但後者可以.
V4L2 支援 16 種介面 (Interface), 在 [2] 裡面會各自稍微給一點介紹. 重點部分還是在它的 function [3] 和基本操作流程. 標準的 V4L2 使用流程, 包括下面 6 個步驟. 但執行順序可調換, 也可以省略其中幾步.
- Opening the device
- Changing device properties, selecting a video and audio input, video standard, picture brightness a. o.
- Negotiating a data format
- Negotiating an input/output method
- The actual input/output loop
- Closing the device
不可省略的像是基本安裝和打開關閉 device (open()/close()) 等等, 例如
mknod /dev/video0 c 81 0 // V4L2 的 major number 是 81.
某些 device 可以接受多次 open(), 表示各自得到使用的權利. 理論上每個 node 都可以支援所有的 function, 但這偏離現實. 我們可以使用 ioctl VIDIOC_QUERYCAP 這個 ioctl 去看一個 device 支援那些 function 和 IO method.
附帶一題, 最近不常看書, 所以很少找到印刷錯誤. 但我覺得 [6] 這裡打錯了, hyperlink 也錯. 畫紅線的地方應該是 mmap(), 要 link 到 [7] 才對.

在這數十個 function 之中, 最基本的就是: open(), close(), read(), write(), select(),poll(), mmap(), unmap(). 其他 97 個 VIDIOC_ 開頭的 request 都是代入 V4L2 ioctl() 使用.
[REF]
- https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/v4l2.html
- https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/devices.html#devices
- https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/user-func.html
- https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/open.html
- https://www.kernel.org/doc/html/v4.16/media/uapi/mediactl/media-controller.html
- https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/libv4l-introduction.html
- https://www.kernel.org/doc/html/v4.16/media/uapi/v4l/func-mmap.html