V4L2 Userspace API -- interfaces

4.1 Video Capture Interface 4.13 Sub-device Interface 4.13.1 Controls 大部分 V4L2 controls 都由 sub-device hardware 实现,drivers 通常会把所有 controls 合并起来,通过 video device nodes 暴露给 userspace。 复杂的设备有时会在不同的硬件中实现相同的 control,例如对比度调整、白平衡。这时可以通过 sub-device 的 node 将 control 暴露出去,区别是通过不同的 sub-device 来实现某个功能的调整。 4.13.3 Pad-level Formats 图像的 format 通常使用 format 和 selection ioctl 在 video capture/output devices 之间协商。driver 负责将 video pipeline 中每个 block 都设置好该配置。 然而对于一些复杂的设备,相同的 pipeline output size 可以通过不同的硬件配置达到。比如图像缩放可以通过 sensor 或者 isp 实现。 sensor 实现缩放一般质量更低,但可以实现更高的帧率。根据应用场景不同 (图像质量 or 速度),pipeline 必须要下不同的配置,app 必须对 pipeline 中的每一个点去下配置。...

2025-07-28 · 3 min

V4L2 Userspace API -- Common API Elements

Common API Elements 1.1 Opening and Closing Devices 1.1.1 Controlling a hardware peripheral via V4L2 需要使用 media controller 的设备称为以 MC-centric 设备。通过 V4L2 device node 完全控制的设备 称为 video-node-centric 设备。 可以通过 ioctl VIDIOC_QUERYCAP 检查 device_caps field, 如果有 V4L2_CAP_IO_MC, 则是 MC-centric 的。 MC-centric 设备需要通过 media controller api 来 configure pipeline。 video-node-centric 设备也可能提供 media controller 和 sub-device interface. 但在这种情况下,media controller 和 sub-device 只是可读的,用来提供信息,所有的 configuration 都由 video node 来下。 1.1.2 V4L2 Device Node Naming V4L2 的 device node 主设备号为 81,次设备号是动态分配的,除非设定 CONFIG_VIDEO_FIXED_MINOR_RANGES 来指定范围。...

2025-07-28 · 2 min

V4L2 Userspace API -- Image Formats

struct v4l2_pix_format 和 v4l2_pix_format_mplane 定义了 image in memory 的 format 和 layout。 2.1 Single-planar format structure struct v4l2_pix_format { __u32 width; __u32 height; __u32 pixelformat; __u32 field; /* enum v4l2_field */ __u32 bytesperline; /* for padding, zero if unused */ __u32 sizeimage; __u32 colorspace; /* enum v4l2_colorspace */ __u32 priv; /* private data, depends on pixelformat */ __u32 flags; /* format flags (V4L2_PIX_FMT_FLAG_*) */ union { /* enum v4l2_ycbcr_encoding */ __u32 ycbcr_enc; /* enum v4l2_hsv_encoding */ __u32 hsv_enc; }; __u32 quantization; /* enum v4l2_quantization */ __u32 xfer_func; /* enum v4l2_xfer_func */ }; 2....

2025-07-28 · 1 min

V4L2 Userspace API -- Input/Output

V4L2 API 定义了几种不同的方法来读取或写入设备。 3.1 Read/Write driver capabilities 需要置起 V4L2_CAP_READWRITE。 不会传递 frame counter 和 timestamp, 最简单的 I/O 方法。 3.2 Streaming I/O (Memory Mapping) 3.3 Streaming I/O (User Pointers) 3.4 Streaming I/O (DMA buffer importing)

2025-07-28 · 1 min

V4L2 -- ioctls

https://docs.kernel.org/userspace-api/media/index.html Video for Linux API 7. Function reference 7.3 ioctl VIDIOC_CREATE_BUFS Create buffers for Memory Mapped or User Pointer or DMA Buffer I/O. 可以用作 ioctl VIDIOC_REQBUFS 的替代。 struct v4l2_create_buffers { __u32 index; __u32 count; __u32 memory; struct v4l2_format format; __u32 capabilities; __u32 flags; __u32 max_num_buffers; __u32 reserved[5]; }; app: count: 要创建的 buffer 的数量。 memory: 要创建的 buffer 的内存类型。enum v4l2_memory. format: 要创建的 buffer 的格式。通常需要先通过 VIDIOC_TRY_FMT 或者 VIDIOC_G_FMT 获取。 flags: 要创建的 buffer 的 flags....

2025-06-19 · 9 min

V4L2 -- Media device

Media Controller devices 5.1.1 Abstract media device model entity 用来抽象一个 media hardware block, 可以表示一个物理硬件设备 (CMOS sensor), 也可以表示一个逻辑硬件设备 (isp pipeline) 等。 pad 用来在 entity 之间传输数据,数据从 source pad 流向 sink pad. link 是两个 pad 之间 point-to-point 的连接。 5.1.2 Media device struct media_device 注册 media_device 需要调用:media_device_init(), media_device_register(). 注销:media_device_unregister(), media_device_cleanup(). struct media_device { struct device *dev; struct media_devnode *devnode; char model[32]; char driver_name[32]; char serial[40]; char bus_info[32]; u32 hw_revision; u64 topology_version; u32 id; struct ida entity_internal_idx; int entity_internal_idx_max; struct list_head entities; struct list_head interfaces; struct list_head pads; struct list_head links; struct list_head entity_notify; struct mutex graph_mutex; struct media_graph pm_count_walk; const struct media_device_ops *ops; struct mutex req_queue_mutex; atomic_t request_id; }; dev: 底层的 device parent....

2025-06-19 · 4 min

V4L2 -- Memory2memory device

Overview V4L2 memory-to-memory 设备可以在内存中 compress, decompress、transform 或以其他方式将视频数据从一种格式转换为另一种格式。此类 memory-to-memory 设备会设置 video device device_caps 的 V4L2_CAP_VIDEO_M2M 或 V4L2_CAP_VIDEO_M2M_MPLANE flag。内存到内存设备的示例包括 codecs、scalers、deinterlacers 或 format converters(例如,从 YUV 转换为 RGB)。 memory-to-memory video device node 的行为与普通 video device node 类似,但它同时支持 output(将 frame 从内存发送到硬件)和 capture(将处理后的 frame 从硬件接收到内存)stream I/O。 memory-to-memory 设备是一种共享资源,可以多次 open video device node,每个 application 通过他们的 file handler 设置属于自己的属性,并且每个 application 都可以独立地使用它。 driver 会 arbitrate 硬件的访问,在其他 file handler 获得访问权限时对硬件进行重新编程。这与 normal video device node 的行为不同,在 normal device node 中,属性是全局的。 normal v4l2 driver:...

2025-06-19 · 4 min

V4L2 -- Videobuf2

struct vb2_queue { unsigned int type; unsigned int io_modes; struct device *dev; unsigned long dma_attrs; unsigned int bidirectional:1; unsigned int fileio_read_once:1; unsigned int fileio_write_immediately:1; unsigned int allow_zero_bytesused:1; unsigned int quirk_poll_must_check_waiting_for_buffers:1; unsigned int supports_requests:1; unsigned int requires_requests:1; unsigned int uses_qbuf:1; unsigned int uses_requests:1; unsigned int allow_cache_hints:1; unsigned int non_coherent_mem:1; struct mutex *lock; void *owner; const struct vb2_ops *ops; const struct vb2_mem_ops *mem_ops; const struct vb2_buf_ops *buf_ops; void *drv_priv; u32 subsystem_flags; unsigned int buf_struct_size; u32 timestamp_flags; gfp_t gfp_flags; u32 min_queued_buffers; u32 min_reqbufs_allocation; struct device *alloc_devs[VB2_MAX_PLANES]; /* private: internal use only */ struct mutex mmap_lock; unsigned int memory; enum dma_data_direction dma_dir; struct vb2_buffer **bufs; unsigned long *bufs_bitmap; unsigned int max_num_buffers; struct list_head queued_list; unsigned int queued_count; atomic_t owned_by_drv_count; struct list_head done_list; spinlock_t done_lock; wait_queue_head_t done_wq; unsigned int streaming:1; unsigned int start_streaming_called:1; unsigned int error:1; unsigned int waiting_for_buffers:1; unsigned int waiting_in_dqbuf:1; unsigned int is_multiplanar:1; unsigned int is_output:1; unsigned int is_busy:1; unsigned int copy_timestamp:1; unsigned int last_buffer_dequeued:1; struct vb2_fileio_data *fileio; struct vb2_threadio_data *threadio; char name[32]; }; type: buffer 的类型,enum v4l2_buf_type, vendor driver 初始化时设置。...

2025-06-19 · 3 min

V4L2 -- Controls

2.15 V4L2 controls V4L2 controls 用于控制和调整视频设备的各种参数。 2.15.2 Objects in the framework struct v4l2_ctrl 描述了 control properties 和对应的 value. struct v4l2_ctrl_handler 用来跟踪 v4l2_ctrl objects. 2.15.3 Basic usage for V4L2 and sub-device drivers prepare the driver 通常把 v4l2_ctrl_handler 放在 top-level struct: // v4l2 drvier: struct foo_dev { ... struct v4l2_device v4l2_dev; ... struct v4l2_ctrl_handler ctrl_handler; ... }; // sub-dev driver: struct foo_dev { ... struct v4l2_subdev sd; ... struct v4l2_ctrl_handler ctrl_handler; ... }; 通过 v4l2_ctrl_handler_init(&foo->ctrl_handler, nr_of_controls) 初始化 v4l2_ctrl_handler....

2025-06-19 · 4 min

V4L2 -- Event

2.14 V4L2 events V4L2 events 提供了一种方法给 userspace 传递 events. struct v4l2_subscribed_event { struct list_head list; u32 type; u32 id; u32 flags; struct v4l2_fh *fh; struct list_head node; const struct v4l2_subscribed_event_ops *ops; unsigned int elems; unsigned int first; unsigned int in_use; struct v4l2_kevent events[] __counted_by(elems); }; list: 加入到 v4l2_fh->subscribed list 的链表节点。 type: event type, 在 videodev2.h 中定义。 id: event 的 control id, 根据 event 的 (type, id) 二元组就能找到对应的 event. flags: 从 userspace 传入的 v4l2_event_subscription->flags 中拷贝过来。...

2025-06-19 · 1 min