vivi结合v4l2应用学习v4l2架构
文章平均质量分 53
vivi结合v4l2应用学习v4l2架构
dianlong_lee
普通造bug码农一枚。。。
展开
-
从应用调用vivi驱动分析v4l2 -- 一个小的总结
写到这里,对v4l2应该有比较深的认识了。分析的过程中,有些发散思维,这行代码为什么这样写?什么情况下会产生这种情况?...从应用调用vivi驱动分析v4l2这个系列还没完结,后面就是各种尝试比如2个应用程序打开同一个摄像头会是什么情况?2个应用程序打开同一个摄像头,申请的缓存是各用各的,还是一起使用?等等...原创 2021-04-02 16:36:24 · 632 阅读 · 2 评论 -
从应用调用vivi驱动分析v4l2 -- 应用close过程分析
vivi代码v4l2测试代码终于走到最后一步closeclose(fd);对于v4l2来说,会调用到 v4l2_fops.release : v4l2_releasestatic int v4l2_release(struct inode *inode, struct file *filp){ struct video_device *vdev = video_devdata(filp); int ret = 0; if (vdev->fops->release原创 2021-04-02 16:31:18 · 554 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 停止设备(VIDIOC_STREAMOFF)
vivi代码v4l2测试代码enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;if (ioctl(fd, VIDIOC_STREAMOFF, &type) < 0){ printf("ERR(%s):VIDIOC_STREAMOFF failed\n", __func__); return -1;}调用vidioc_streamoffstatic int vidioc_streamoff(st原创 2021-04-02 14:23:36 · 902 阅读 · 2 评论 -
从应用调用vivi驱动分析v4l2 -- 获取camera数据
vivi代码v4l2测试代码获取camera数据的过程简写如下 type = V4L2_BUF_TYPE_VIDEO_CAPTURE; if (ioctl(fd, VIDIOC_STREAMON, &type) < 0) printf ("VIDIOC_STREAMON failed\n"); int num = 0; while (1) { .原创 2021-04-02 10:52:43 · 848 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 出队列(VIDIOC_DQBUF)
vivi代码v4l2测试代码step 7 : 读取数据2,出队列struct v4l2_buffer buffer;buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;buffer.memory = V4L2_MEMORY_MMAP;if (ioctl(fd, VIDIOC_DQBUF, &buffer) < 0){ printf("ERR(%s):VIDIOC_DQBUF failed, dropped frame\n",原创 2021-04-02 10:06:00 · 1799 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- select
vivi代码v4l2测试代码step 7 : 读取数据1,poll或者select这里使用select,对应代码如下 fd_set fds; struct timeval tv; int r; FD_ZERO (&fds); FD_SET(fd, &fds); tv.tv_sec = 5; tv.tv_usec = 0; r = select (fd + 1, &fds, NULL, NULL, &tv); if原创 2021-04-01 15:38:39 · 1178 阅读 · 0 评论 -
记一次 VIDIOC_REQBUFS failed 问题
最近更新了一个手里板子的sdk,在写应用测试vivi驱动的时候,出现了一个错误。Reqbufs fail这里比较奇怪,于是打算去分析一下原因。static int vidioc_reqbufs(struct file *file, void *priv, struct v4l2_requestbuffers *p){ struct vivi_dev *dev = video_drvdata(file); return vb2_reqbufs(&dev->vb_v原创 2021-04-01 14:06:49 · 3155 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 运行设备(VIDIOC_STREAMON)
vivi代码v4l2测试代码step 6 : 运行设备enum v4l2_buf_type type = V4L2_BUF_TYPE_VIDEO_CAPTURE;if (ioctl(fd, VIDIOC_STREAMON, &type) < 0){ printf("ERR(%s):VIDIOC_STREAMON failed\n", __func__); return -1;}调用vidioc_streamonvidioc_streamon..原创 2021-03-31 16:41:39 · 2319 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 缓存放入队列(VIDIOC_QBUF)
vivi代码v4l2测试代码step 5 : 设置缓存3,将所有的缓存放入队列struct v4l2_buffer v4l2_buffer;for(i = 0; i < nr_bufs; i++){ memset(&v4l2_buffer, 0, sizeof(struct v4l2_buffer)); v4l2_buffer.index = i; //想要放入队列的缓存 v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE原创 2021-03-30 13:26:30 · 3404 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 映射 mmap
vivi代码v4l2测试代码step 5 : 设置缓存映射mmap一般都是配合VIDIOC_QUERYBUF使用 for (n_buffers = 0; n_buffers < req.count; ++n_buffers) { struct v4l2_buffer buf; CLEAR (buf); buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; buf.memory = V4L2_MEMORY_原创 2021-03-29 15:56:40 · 866 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 查询(VIDIOC_QUERYBUF)缓存信息
vivi代码:https://gitee.com/ldl17/v4l2-learn/blob/master/vivi.cv4l2测试代码:https://gitee.com/ldl17/v4l2-learn/blob/master/v4l2_test.cstep 5 : 设置缓存2,查询并映射缓存memset(&v4l2_buffer, 0, sizeof(struct v4l2_buffer));v4l2_buffer.index = i; //想要查询的缓存v4l2原创 2021-03-29 12:10:33 · 1893 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 申请缓存(VIDIOC_REQBUFS)
vivi代码:https://gitee.com/ldl17/v4l2-learn/blob/master/vivi.cv4l2测试代码:https://gitee.com/ldl17/v4l2-learn/blob/master/v4l2_test.cstep 5 : 设置缓存1,申请缓存struct v4l2_requestbuffers req;req.count = nr_bufs; //缓存数量req.type = V4L2_BUF_TYPE_VIDEO_CAPTU原创 2021-03-25 17:06:26 · 3091 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 设置图像格式(VIDIOC_S_FMT)
vivi代码:https://gitee.com/ldl17/v4l2-learn/blob/master/vivi.cv4l2测试代码:https://gitee.com/ldl17/v4l2-learn/blob/master/v4l2_test.cstep 4 : 设置图像格式1.枚举支持的像素格式struct v4l2_fmtdesc fmtdesc;fmtdesc.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;fmtdesc.index =原创 2021-03-25 15:17:40 · 3919 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 输入源列举(VIDIOC_ENUMINPUT)和设置(VIDIOC_S_INPUT)过程分析
vivi代码:https://gitee.com/ldl17/v4l2-learn/blob/master/vivi.cv4l2测试代码:https://gitee.com/ldl17/v4l2-learn/blob/master/v4l2_test.cstep 3 : 设置输入设备1,列举输入设备ioctl(fd, VIDIOC_ENUMINPUT, &input)对应vivi的vidioc_enum_input/* only one input in this原创 2021-03-24 15:21:12 · 2210 阅读 · 3 评论 -
从应用调用vivi驱动分析v4l2 -- 应用查询(VIDIOC_QUERYCAP)过程分析
vivi驱动分析如下:从vivi虚拟摄像头驱动分析v4l2step 2 : 查询设备功能struct v4l2_capability cap;ioctl(fd, VIDIOC_QUERYCAP, &cap)video注册的时候fops是v4l2_fops,所以会调用到v4l2_fops.unlocked_ioctl 也就是 v4l2_ioctlv4l2_ioctl中 调用到 vdev->fops->unlocked_ioctl,vdev->fops对于viv原创 2021-03-24 09:18:05 · 2002 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 应用open过程分析
vivi驱动分析如下:从vivi虚拟摄像头驱动分析v4l2step 1 : 打开设备节点int fd = open("/dev/video0", flag);应用层的open函数最后会对应到驱动的fops的open函数vivi驱动中配置如下video_device[vdev->minor] = vdev;vdev->cdev->ops = &v4l2_fops;vdev->cdev->owner = owner;static cons原创 2021-03-23 12:07:57 · 1362 阅读 · 0 评论 -
从应用调用vivi驱动分析v4l2 -- 应用代码编写
V4L2支持多种接口:capture(捕获)、output(输出)、overlay(预览)等等这里主要分析capturestep 1 : 打开设备节点int fd = open("/dev/video0", flag);step 2 : 查询设备功能struct v4l2_capability { __u8 driver[16]; /* i.e. "bttv" */ __u8 card[32]; /* i.e. "Hauppauge WinTV" */ __u8 bus_.原创 2021-03-23 09:32:57 · 1724 阅读 · 0 评论 -
从vivi虚拟摄像头驱动开始分析v4l2
vivi 代码在线查看https://elixir.bootlin.com/linux/v3.0.101/source/drivers/media/video/vivi.c这是一个比较老的版本,但是比较适合我们入门v4l2。原创 2021-03-22 09:31:59 · 3067 阅读 · 6 评论