[英](V4L2 related) What do these 2 lines do?
s->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
s->buf.memory = V4L2_MEMORY_MMAP;
我必须承认我不熟悉V4L2 API。 我在上面的两行中查找,第一行是建立缓冲区类型,第二行是将视频设备专用内存的指针传递给缓冲区。
问题是,我不知道我是否做出正确的猜测,我需要有人详细解释第二行的工作方式。
第二行确定如何使用缓冲区。 合法值是:
表3.5。 枚举v4l2_memory
V4L2_MEMORY_MMAP 1 The buffer is used for memory mapping I/O.
V4L2_MEMORY_USERPTR 2 The buffer is used for user pointer I/O.
V4L2_MEMORY_OVERLAY 3 [Not Yet Implemented]
V4L2_MEMORY_DMABUF 4 The buffer is used for DMA shared buffer I/O.
您包含的代码实际上并未分配缓冲区。 这里是表示一个较为完整的代码片段mmap
缓冲器ING:
CLEAR(req);
req.count = 2;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP;
xioctl(fd, VIDIOC_REQBUFS, &req);
buffers = calloc(req.count, sizeof(*buffers));
for (n_buffers = 0; n_buffers < req.count; ++n_buffers) {
CLEAR(buf);
buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory = V4L2_MEMORY_MMAP;
buf.index = n_buffers;
xioctl(fd, VIDIOC_QUERYBUF, &buf);
buffers[n_buffers].length = buf.length;
buffers[n_buffers].start = v4l2_mmap(NULL, buf.length,
PROT_READ | PROT_WRITE, MAP_SHARED,
fd, buf.m.offset);
if (MAP_FAILED == buffers[n_buffers].start) {
perror("mmap");
exit(EXIT_FAILURE);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.