V4L2视频采集驱动框架

来源:互联网 发布:软件如何做授权加密 编辑:程序博客网 时间:2024/04/25 00:20

    V4l2是视频采集的驱动吗,不是。V4l2只是一个视频采集的框架,何为框架,V4l2只是定义了一系列有关视频采集数据 的数据结构,而没有真正进行内存映射以及数据读写的操作。但是在V4l2中的确声明了数据读写和内存映射的操作(file_operations v4l2_fops),但是具体的实现却是另外的内核代码实现的。

    

static const struct file_operations v4l2_fops = {    .owner = THIS_MODULE    .read = v4l2_read    .write = v4l2_write    .open = v4l2_open    .mmap = v4l2_mmap    .ioctl = v4l2_ioctl    ....};

    这里我们v4l2_read函数为例,来解释一下为什么v4l2只是一个视频采集的框架而非真正意义上的驱动程序。下面是v4l2_read函数的相关代码:

    

static ssize_t v4l2_read(struct file *filp, char _user *buf, size_t sz, lofft_t *off){    struct video_device *vdev = video_devdata(filp);    if (!vdev->fops->read)        return -EINVAL;    if (video_is_unregister(vdev))        return -EIO;    return vdev->fops->read(filp, buf, sz, off);}
    这里我们可以看到v4l2_read函数里面没有做什么实际的数据操作,只是把操作引向了vdev->fops->read()函数,这个函数才是视频采集真正的驱动程序。

    那么这个函数是在什么地方呢,在2.6.32的内核版本中,deriver/media/video文件夹下面有一个vivi.c源码文件,对应的就是这个read函数的实现:

    

static const struct v4l2_file_oparations vivi_fops = {    .owner = THIS_MODULE,    .open = vivi_open,    .release = vivi_close,    .read = vivi_read,    .poll = vivi_poll,    .ioctl = video.ioctl2,    .mmap = vivi_mmap,};

   至于和缓存有关的操作,则是在driver/media/video文件夹下面的videobuf-core.c等文件中实现的。

    所以V4l2这里的作用就是一个框架的作用,它定义了一系列数据结构和操作函数,但却没有具体实现,而是指向了其他的内核代码,

0 0
原创粉丝点击