这部分涉及不少专业支持,有些可能写的不好,请大家原谅!
/* Values for ’capabilities’ field */ #define V4L2_CAP_VIDEO_CAPTURE 0x00000001 /* Is a video capture device */ #define V4L2_CAP_VIDEO_OUTPUT 0x00000002 /* Is a video output device */ #define V4L2_CAP_VIDEO_OVERLAY 0x00000004 /* Can do video overlay */ #define V4L2_CAP_VBI_CAPTURE 0x00000010 /* Is a raw VBI capture device */ #define V4L2_CAP_VBI_OUTPUT 0x00000020 /* Is a raw VBI output device */ #define V4L2_CAP_SLICED_VBI_CAPTURE 0x00000040 /* Is a sliced VBI capture device */ #define V4L2_CAP_SLICED_VBI_OUTPUT 0x00000080 /* Is a sliced VBI output device */ #define V4L2_CAP_RDS_CAPTURE 0x00000100 /* RDS data capture */ #define V4L2_CAP_VIDEO_OUTPUT_OVERLAY 0x00000200 /* Can do video output overlay */ #define V4L2_CAP_HW_FREQ_SEEK 0x00000400 /* Can do hardware frequency seek */ #define V4L2_CAP_RDS_OUTPUT 0x00000800 /* Is an RDS encoder */ /* Is a video capture device that supports multiplanar formats */ #define V4L2_CAP_VIDEO_CAPTURE_MPLANE 0x00001000 /* Is a video output device that supports multiplanar formats */ #define V4L2_CAP_VIDEO_OUTPUT_MPLANE 0x00002000 #define V4L2_CAP_TUNER 0x00010000 /* has a tuner */ #define V4L2_CAP_AUDIO 0x00020000 /* has audio support */ #define V4L2_CAP_RADIO 0x00040000 /* is a radio device */ #define V4L2_CAP_MODULATOR 0x00080000 /* has a modulator */ #define V4L2_CAP_READWRITE 0x01000000 /* read/write systemcalls */ #define V4L2_CAP_ASYNCIO 0x02000000 /* async I/O */ #define V4L2_CAP_STREAMING 0x04000000 /* streaming I/O ioctls */
下面是解释:
1. videocapture 、video overlay、video output、video output overlay
上面说了一个是采集一个是直接传送视频
vieo overlay不同于video
capture,是指不需要对video信号的帧进行copy,直接将视频信号转化成显卡的VGA信号或者将捕获到的视频帧直接存放在显卡的内存中。
Video overlay需要硬件的支持。这个直接的通道主要是DMA去实现。
Viedo overlay只用来preview,又被称为framebuffer overlay或previwing。 实际上video capture interface也能实现preview,只是没有overlay有效率。
如果是同时进行overlay和capture,应该尽量不使用同一个文件
描述符,比如说如果此时在overlay,要拍照的话应该再打开设备,使用一个分开的文件描述符来进行capture。如果driver支持同时进行
overlay和capture的话,必须支持使用分开的文件描述符来分别进行overlay和capture
。为了多文件描述符的操作linux操作系统加入v4l2_fh和v4l2_prio的机制。以后再说。
video output设备是把静态图片编码为模拟video信号,这就意味着output设备的输出是模拟video信号。
Video Output Overlay又称on-screen display,把framebuffer中的内容叠加到输出的video信号中。
2. vbi
VBI= Vertical Blanking Interval(场消隐区)。在模拟显示设备上(例如:CRT显示器),一场的显
示是从屏幕上方到下方一行一行绘制而成。一旦一场数据绘制完毕,电子束会由下方转移到上方,以备
开始下一场数据的显示。在这个电极复位的时间间隙内,CRT和信号间是没有数据传输的,因此称作场
消隐区。
在场消隐区时间内,不需要传输任何有用的视频数据,所以显示器不接受和处理任何的输入视频
信号。在这个间隔内,设备间可以利用空闲的基带进行额外的数据通讯。为了让这个问题简单化,水
平扫描线在场消隐区时继续传输,但是扫描线上不附带任何可供显示的视频数据。此时,每一个VBI
扫描线,或者一组VBI数据扫描线可能包含有按照某种标准进行编码后的信息。最常用的VBI应用就是
在闭路电视上,用于显示字幕。图文电视(Teletext)就是VBI数据广播的一种.
Raw VBI和SlicedVBI
接收到VBI数据的硬件设备,只需要去完完整整的接纳数据,并且对接收到的数据不做任何的数据处理,
这个称之为原始数据。这些原始数据可能直接提交给软件解析其内容。另外一种方式是用VBI硬件按照
某种标准或者类型去解析VBI数据,在这种方式下,信号的输出就被分离成为闭路电视字幕,或者其他
类型的数据包。典型的VBI数据分离电路支持都支持这两种模式。自从VBI硬件处理电路中添加了数据分
离,错误处理等功能后,Sliced模式变得更加有用。Raw VBI Data(原始VBI数据)主要用于没有任何
数据标准,且信号直接送递显示设备的场合。
3 .RDS
无线电数据系统,简称RDS,是欧洲广播联盟的通信协议标准,该标准的建立是为了使用传统的FM无线电广播发送少量的数字化信息。RDS系统标准化
了好几个类型的信息传输,包括时间,信息跟踪和电台识别。在九十年代早期,RDS在欧洲和拉丁美洲已经标准化,但在北美标准化较少。
这是百度文库找的,其实RDS发明是针对汽车使用的。和FM和AM比较主要有两点:
a.信息
在调频广播发射信号中利用副载波把电台名称、节目类型、节目内容及其它信息以数字形式发送出去。
b. 电台识别
通过RDS可知道接收到的是那个电台,它的发射频率,并给出该电台其余的频率。一个电台有几个频率,你在不同地域要使用不同的频率,才能有好的效果。如果你在开车从这个地点到另一个地点。RDS会自动搜索当前电台的其他的发射频率,当找到另一个信号比原来的好、稳定的频率时,就会自动跳转过去。
3. multi-planar
多平面格式 例如 V4L2_PIX_FMT_NV12M,V4L2_PIX_FMT_YUV420M等
Packed格式把一个像素的所有分量值连续存放在一起。
Planar 格式把每一个分量单独存储成一个阵列。例如在 YUV 格式中,所有 Y 值都连续地一起存
储在一个阵列中,U 值存储在另一个中,V 值存在第三个中。这些平面常常都存储在一个缓冲区
中,但并不一定非要这样。 目前只看到s5p-fimc驱动使用了这个东西。
4. 输入/输出
使用read和write方法,每一帧都要通过I/O 操作,在用户和内核空间之间拷贝数据。设备cap要或上V4L2_CAP_READWRITE
Streaming I/O(DMA buffer importing)
在设备cap上要或上V4L2_CAP_STREAMING,让用户与内核空间之间交换缓冲区指针,这些缓冲区将被映射到用户地址空间,使帧的零 拷贝成为可能。
“用户与内核空间之间交换缓冲区指针”我们要理解的是缓冲区是在用户空间还是内核空间。对于内核空间(内核申请的缓冲
区可以是大而连续 DMA 缓冲区、通过 vmalloc()创建的虚拟缓冲区,或者直接在设备的 I/O 内存中开辟的缓冲区,如果硬件支持)
。我们通过mmap()方法映射。 对于用户空间就不需要mmap(),此方法比较难用。
AsynchronousI/O //目前没实现。
5、TUNER和MODULATOR
调谐器和调制器,一个算是输入一个是输出。
调谐器:是某些车载主机所具有的FM/AM调谐器或TV调谐器,具有这些调谐器的车载主机也就具有了FM/AM收音或电视接收功能。又是叫高频头。
调制器:把信号源(可以是数字电视机顶盒、卫星数字电视接收机、DVD机、电脑、摄像机、电视解调器等AV信号源)所提供的视频信号(VIDEO)和音频信号(AUDIO)调制成稳定的高频射频振荡信号,视频为调幅调制方式,音频为调频调制方式。