在Linux V4L2中清空vb2 buffer queue的过程通常涉及以下几个步骤:
- 停止流媒体:
首先,你需要停止当前正在进行的任何流媒体操作。这通常通过VIDIOC_STREAMOFF ioctl调用来完成。
int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
if (ioctl(fd, VIDIOC_STREAMOFF, &type) < 0) {
perror("VIDIOC_STREAMOFF");
return -1;
}
- 请求释放所有缓冲区:
使用VIDIOC_REQBUFS ioctl,请求0个缓冲区,这将释放之前分配的所有缓冲区。
struct v4l2_requestbuffers req = {0};
req.count = 0;
req.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
req.memory = V4L2_MEMORY_MMAP; // 或者你使用的其他内存类型
if (ioctl(fd, VIDIOC_REQBUFS, &req) < 0) {
perror("VIDIOC_REQBUFS");
return -1;
}
Android External Camera Provider也确实是这样做的:ExternalCameraDeviceSession.cpp - OpenGrok cross reference for /hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp