linux ------ V4L2 视频驱动简述

本文详细介绍了Linux中的V4L2视频驱动,包括摄像头驱动、关键数据结构如v4l2_requestbuffers、v4l2_capability等,以及视频驱动的API函数,如video_register_device和video_unregister_device。同时,概述了驱动编写和应用程序处理视频数据的基本流程。
摘要由CSDN通过智能技术生成

    V4L2视频驱动主要涉及到以下几个知识点:摄像头方面的知识、Camera解码器、控制器、V4L2的API和数据结构、V4L2的驱动架构。

    一. 视频驱动的整体框架

          Video的基本框架图如下:

         

            对驱动程序员来说,主要是关心camera驱动这部分代码的实现。

    二. V4L2重要的数据结构

          常用的结构体在内核文件 include/linux/videodev2.h与v4l2-dev.h中定义,重要的数据结构如下面这些。

          1. struct v4l2_requestbuffers //申请帧缓冲,对应命令 VIDIOC_REQBUFS

                 struct v4l2_requestbuffers{
                        __u32   count;   //缓存数量,也就是说在缓存队列里保持多少张照片
                        enum v4l2_buf_type      type;  //数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
                        enum v4l2_memory        memory;  //V4L2_MEMORY_MMAP或V4L2_MEMORY_USERPTR
                        __u32   reserved[2];
                  };

          2. struct v4l2_capability //视频设备的功能,对应命令 VIDIOC_QUERYCAP

                 struct v4l2_capability{
                         __u8 driver[16];  //驱动名称
                         __u8 card[32];   
                         __u8 bus_info[32];  //总线信息
                         __u32   version;
                         __u32 capabilities;   //设备能力
                         __u32 device_caps;
                         __u32 reserved[3];
                  };

          3. struct v4l2_input  //视频输入信息,对应命令 VIDIOC_ENUMINPUT

                 struct v4l2_input{
                        __u32      index;  /*  Which input */ //应用关注的输入的索引号; 这是惟一一个用户空间设定的字段. 驱动要分配索引号给输入,从0开始,依次往上增加.
                        __u8      name[32];  /*  Label */ //输入的名字,由驱动设定.简单起见,可以设为”Camera”,如果卡上有多个输入,名称就要与接口的打印相符合.
                        __u32      type;  /*  Type of input */ //输入的类型,现在只有两个值可选:V4L2_INPUT_TYPE_TUNER 和V4L2_INPUT_TYPE_CAMERA.
                        __u32      audioset;  /*  Associated audios (bitfield) *///描述哪个音频输入可以与些视频输入相关联.如果没有音频输入可以与之关联,或是只有一个可选,那么就可以简单地把这个字段置0.
                        __u32        tuner;             /*  Associated tuner *///如果输入是一个调谐器 (type 字段置为V4L2_INPUT_TYPE_TUNER), 这个字段就是会包含一个相应的调谐设备的索引号.
                        v4l2_std_id  std; //描述设备支持哪个或哪些视频标准.
                        __u32      status; //给出输入的状态.,status 中设置的每一位都代表一个问题. 这些问题包括没有电源,没有信号,没有同频锁,或是其他一些不幸的问题.
                        __u32      capabilities;
                        __u32      reserved[3];
                  };

          4. struct v4l2_standard //视频的制式,比如PAL ,NTSC ,对应命令 VIDIOC_ENUMSTD

                 struct v4l2_standard{
                        __u32       index;
                        v4l2_std_id          id;
                        __u8       name[24];
                        struct v4l2_fract    frameperiod; /* Frames, not fields */
                        __u32       framelines;
                        __u32       reserved[4];
                  };

          5. struct v4l2_format //帧的格式,对应命令VIDIOC_G_FMT 、VIDIOC_S_FMT 等

                 struct v4l2_format{
                         enum v4l2_buf_type type;   //数据流类型,必须永远是V4L2_BUF_TYPE_VIDEO_CAPTURE
                         union {
                                st

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值