前言
接连啃了两个sample,还是觉得笼笼统统模模糊糊,没有达到想要的一目了然的程度,那就再整理整理资料,补些硬货吧
图像和像素格式
颜色:
(1)颜色是主观还是客观存在?
颜色的本质是光的波长,但是因为有人去看才有了颜色这个概念
(2)颜色的三个关键:亮度、色度、饱和度
颜色是由亮度和色度共同表示的,色度是不包括亮度在内的颜色的性质,它反映的是颜色的色调和饱和度。
(3)人的眼睛并非理想完美的颜色识别器件,图像表达也有清晰度和质量高低的差异
(4)科学研究如何定义(或者表达、记录、计算)一种颜色,即如何将颜色数字化?
色彩空间,色彩空间”一词源于西方的“Color Space”,又称作“色域”,色彩学中,人们建立了多种色彩模型,以一维、二维、三维甚至四维空间坐标来表示某一色彩,这种坐标系统所能定义的色彩范围即色彩空间。我们经常用到的色彩空间主要有RGB、CMYK、Lab等。
图像
(1)图像采集的过程:
光照在成像物体被反射->镜头汇聚->Sensor光电转换->ADC为rawRGB(ADC直接转换得到的原始RGB,RGB由rawRGB经过运算得到的)
(2)sensor上每个像素只采集特定颜色的光的强度,
因此sensor每个像素只能为R或G或B,一般我们常说摄像头多少万像素,指的是sensor上的像素点的数量,一个像素点可以转换出一个模拟信号。
(3)rawRGB和RGB都是用来描述图像的,
图像采集时RGB是由rawRGB计算而来的
RAW图像数据到RGB:https://blog.csdn.net/peng864534630/article/details/78177211
(4)图像要素
因为图像颜色本身有一定连贯性,而且人眼是非理想的,因此图像采集和再显示给人这整个构成中有三个要素:分辨率、pitch(像素点之间的距离)、观看距离
(5)如果是视频,质量好坏还要加上帧率framerate
(6)图像的表达、压缩、修整等相关技术,就发生在rawRGB进来以后的各个环节
1、RGB方式表示颜色
(1)RGB有RGB565和RGB888(真彩色),ARGB(A表示透明度)等多种子分类
(2)RGB的本质:
将色度分解为R、G、B三部分,然后记录下各个基色亮度数据(亮度值),RGB这种颜色表示方法并未记录颜色,只是表示了亮度。
RGB颜色表示:https://blog.csdn.net/PC_small_wang/article/details/100138219
(3)RGB的优势:
方便数字化表达,广泛用于数字化彩色显示器,计算机编程等领域。
(4)RGB的劣势:
和传统的灰度图(黑白图像)兼容不好,表达颜色的效率不高
(5)何基于RGB颜色模型的加色色彩空间都属于RGB色彩空间。
RGB色彩空间由红绿蓝三原色的色度定义,借此可以定义出相应的色三角,生成其它颜色。完整的RGB色彩空间定义还需要给出白点的色度和伽玛校正曲线。最常见的RGB色彩空间是sRGB色彩空间。
2、YUV
(1)YUV也是一种色彩空间,
Y表示亮度,U和V表示色度。只有Y就是黑白图像,再加上UV就是彩色图像了。YUV的一个好处就是让彩色系统和传统黑白系统很好的兼容。
(2)YUV和RGB的异同:
相同的是:都是用来表达颜色的数学方法;
不同点是:对颜色的描述思路和方法不同。RGB将一个颜色拆解为3个纯色的亮度组合,YUV将一个颜色分解为一个亮度和2个色度的组合。
(3)RGB和YUV之间可以用数学方法互相换算,
是个典型的浮点运算过程。浮点运算比较庞大,最好用CPU进行计算。
详细过程可百度搜索别人写的博客。
(4)YUV和YCbCr几乎可以看做一个概念,
详细的区分以后再去慢慢体会。YCbCr模型来源于yuv模型,应用于数字视频。
(5)YUV分为packed和planar两种。具体参考:
http://blog.csdn.net/sunnylgz/article/details/7580628
4个像素,每个像素都有一个YUV 2 所以:YOUOVO Y1U1V1 packed: [Y0,UO,V0],[Y1,U1,V1], [Y2,U2,V2], [Y3,U3,V3] palaner: [YO,Y1,Y2, Y3], [UO,U1, U2, U3], [vo, v1, V2, V3]
这个图只是为了让大家理解二者数据存放方式的区别(但实际上数据排列不是这样的)
(6)有多种YUV相关的概念需要弄清楚(详见YUV0基础基本知识篇)
YUV
YUYV
YUV422
YUV420(YUV411)
YUV422 planar(YUV422P)
YUV420 Planar(YUV420P)
YUV422 semi planar(YUV422SP)
YUV420 semi Planar(YUV420SP)
视频
是由单帧图像(即图片)以每秒x帧的速率连续组成的,单帧图像类似位图。我们常说的电影一般是每秒24张图片的速度(即每秒24帧)进行播放。
原始视频产生:镜头(光信号->光信号)和sensor(光信号->电信号)sensor本身直接出来的是一个模拟的电信号,经过AD转换得到数字的电信号(即一系列二进制数据,代表原始图像数据)
名词解释
图像处理:
ISP(image signal processing),如对原始图像进行畸变矫正,处理后的图像仍是原始图像数据,未经过编码及压缩。
视频编码压缩:
如h.264/h.265压缩算法,运算,内置DSP进行压缩运算的(,如果用CPU进行压缩运算,是十分耗费CPU的,需要高性能的CPU。
MIPI
“MIPI是MobileIndustry Processor Interface(移动通信行业处理器接口)的缩写。MIPI协议的提出,旨在解决日益增长的高清图像(视频)传输的高带宽要求与传统接口的低速率之间的矛盾,同时为整个行业提供统一的标准,进而缩短产品的开发周期,增强不同厂商之间产品的兼容性。换一句话说,MIPI协议是MIPI联盟发起的为移动应用处理器制定的开放标准和一个规范。”
MPP
“MPP” 是海思提供的媒体处理软件平台(Media Process Platform,简称 MPP),可支持应用软件快速开发。该平台对应用软件屏蔽了芯片相关的复杂的底层处理,并对应用软件直接提供MPI( MPP Programe Interface)接口完成相应功能。该平台支持应用软件快速开发以下功能:输入视频捕获、 H.265/H.264/MJPEG/JPEG/MPEG4 编码、 H.264/MPEG4/MPEG2解码、视频输出显示、视频图像前处理(包括去噪、增强、锐化、 Deinterlace)、编码码流叠加 OSD、视频侦测分析、智能分析、音频捕获及输出、音频编解码等功能。
海思媒体处理平台的主要内部处理流程如下图,主要分为视频输入( VI)、视频处理( VPSS)、视频编码( VENC)、视频解码( VDEC)、视频输出(VO)、视频侦测分析(VDA)、音频输入(AI)、音频输出(AO)、音频编码( AENC)、音频解码( ADEC)、区域管理( REGION)等模块。
VI 模块捕获视频图像,可对其做剪切、缩放等处理,并输出多路不同分辨率的图
像数据。补充了解:双码流采用一路高码率的码流用于本地高清存储,例如1080P和720P,
一路低码率的码流用于网络传输,同时兼顾本地存储和远程网络传输。
三码流指三种码率。三码流采用一路高码率的码流用于本地高清存储,例如h.264\D1编码,一路低码率的码流用于网络传输,例如D1/CIF编码,另一路超低码流用于3G\网络传输,手机观看,例如QCIF,同时兼顾本地存储和远程网络传输。三码流能实现本地传输和远程传输三种不同的带宽码流需要,本地传输采用高码流可以获得更高的高清录像存储,远程传输采用较低的码流以适应CDMA/ADSL等各种网络而获得更高的图像流畅度。
VDEC解码模块对编码后的视频码流进行解码,并将解析后的图像数据送 VPSS 进行图像处理或直接送 VO 显示。可对 H264/MPEG4/MPEG2 格式的视频码流进行解码。
VPSS 模块接收 VI 和解码模块发送过来的图像,可对图像进行去噪、图像增强、锐化等处理,并实现同源输出多路不同分辨率的图像数据用于编码、预览或抓拍。
VENC编码模块接收 VI 捕获并经 VPSS 处理后输出的图像数据,可叠加用户通过 Region模块设置的 OSD 图像,然后按不同协议进行编码并输出相应码流。
VDA 模块接收 VI 的输出图像,并进行移动侦测和遮挡侦测,最后输出侦测分析结果。
VO 模块接收 VPSS 处理后的输出图像,可进行播放控制等处理,最后按用户配置的输出协议输出给外围视频设备。
AI 模块捕获音频数据,然后 AENC 模块支持按多种音频协议对其进行编码,最后输出音频码流。
用户从网络或外围存储设备获取的音频码流可直接送给 ADEC 模块, ADEC 支持解码多种不同的音频格式码流,解码后数据送给 AO 模块即可播放声音。
VB
(1)视频的本质是多帧图片,图片的本质是RGB或rawRGB数据,要占用一段连续内存
(2)视频的裁剪、缩放、修正处理等各种操作,本质上就是对内存中的数据进行运算
(3)视频缓存池(VB, video buffer)就是一段很大,又被合理划分和管理的内存,用来做视频数据的暂存和运算场地
(4)公共视频缓存池的公共2字,可以理解为全局变量,也就是各个模块都能访问的一段内存
(5)看似视频缓存块在各个模块之间流转,实际上并没有内存复制,而是指针在传递
(6)视频缓存池的内存由MPP来维护,我们在系统启动时就把整个SDRAM分成了2部分:系统部分(由linux kernel来维护管理)和mpp部分(由mpp系统来维护管理)
(7)缓存池需要几个,每个中包含几个缓存块,每个缓存块多大,都是可以由用户程序设置好参数,然后调用MPP的相应API来向MPP申请分配的。
视频缓存池主要向媒体业务提供大块物理内存管理功能,负责内存的分配和回收,充
分发挥内存缓存池的作用,让物理内存资源在各个媒体处理模块中合理使用。一组大小相同、物理地址连续的缓存块组成一个视频缓存池。
视频输入通道需要使用公共视频缓存池。所有的视频输入通道都可以从公共视频缓存
池中获取视频缓存块用于保存采集的图像(如图中所示从公共视频缓存池 A 中获取视频缓
存块 Bm)。由于视频输入通道不提供创建和销毁公共视频缓存池功能,因此,在系统初始
化之前,必须为视频输入通道配置公共视频缓存池。根据业务的不同,公共缓存池的数量、缓存块的大小和数量不同。
图中所示缓存块的生存期是指经过 VPSS 通道传给后续模块的情形( 图实线路径)。如果该缓存块完全没有经过 VPSS 通道传给其他模块,则将在 VPSS 模块处理后被放回公共缓存池( 图虚线路径)
VI
视频输入设备
所有 VI 设备都是相互独立的,支持时序解析。
视频输入 PIPE
VI 的 PIPE 包含了 ISP 的相关处理功能,主要是对图像数据进行流水线处理,输出YUV 图像格式给通道。PIPE 的工作模式请参考“系统控制”章节的“VI 和 VPSS”的
工作模式描述。
视频物理通道
Hi3559AV100ES VI 的一个 PIPE 包含 2 个物理通道,每个物理通道具有裁剪等功能,每个物理通道同时支持 8 个扩展通道。
Hi3559AV100 VI 只有一个物理通道,支持 8 个扩展通道。
Hi3559AV100 物理通道支持的典型分辨率如 7680x4320@30fps、3840x2160@120fps、3840x2160@60fps、3840x2160@30fps、1080p@240fps、
1080p @120fps、1080p @60fps、1080p@30fps 等。
视频扩展通道
扩展通道是物理通道的扩展,扩展通道具备缩放、裁剪、鱼眼矫正功能,它通过绑定物理通道,将物理通道输出作为自己的输入,然后输出用户设置的目标图像。
绑定关系
MIPI 和 DEV 的绑定关系。
Hi3559AV100的 Dev 与 MIPI 绑定关系是固定的,不能动态修改绑定关系。
DEV 和前端时序输入的接口有约束关系。例如 Hi3559AV100 前端需要接入BT.1120,且选择了第 0 组 BT.1120 管脚,PIPE 应该和 DEV5 绑定,才能正常接收数据。
Hi3559AV100 DEV 和时序输入接口的约束关系如表 3-2 所示。
DEV 和 PIPE 的绑定关系。
每个 PIPE 都可以与任意 Dev 绑定,但不能动态修改绑定关系
线性模式(非 WDR 模式)的一条通路应该是一个物理 PIPE 绑定一个 Dev,WDR模式下需要多个物理 PIPE 绑定一个 Dev,例如 2 合 1WDR,我们需要 2 个物理PIPE 绑定到一个 Dev。且在 WDR 模式下只有绑定到 Dev 的第 1 条物理 PIPE 的通道有数据输出,其他绑定的物理 PIPE 的通道是没有图像数据输出
VPSS
视频处理子系统。这个模块功能很多,支持的具体图像处理功能包括
FRC(Frame Rate Control)、CROP(裁剪)、Sharpen(锐化)、3DNR、Scale(缩放)、像素格式转换、LDC、Spread、固定角度旋转、任意角度旋转、鱼眼校正、Cover/Coverex、Overlayex、Mosaic(马赛克)、Mirror/Flip(镜像翻转)、HDR、Aspect Ratio、压缩解压等。我们使用比较单一,大部分都没有用到。
功能上需要注意Hi3559AV100 仅离线模式下支持 semi-planar 422 转 semiplanar 420
这里有2个概念必须理解,那就是group和channel。每个group都有若干channel,分为物理channel和扩展channel。每个group的channel和其它group的channel没有任何关系,所以不同group可以有相同编号的channel。group是输入的概念,一个group必须也只能bind一个输入视频源。Channel是输出的概念。每个group的多个channel可以bind到不同输出。如一个1080p视频源bind到vpss的某一个group,然后channel0输出到venc0,编码1080p-H264-30p,channel1输出到venc1编码720p-H265-25p。注意如果设置多个输出,通道必须设置user模式,auto模式只能bind一个输出。Vpss不设置帧率控制,输入和输出都不管,即输入多少帧率,输出就多少帧率,帧率改变通过其它方式来处理。
Vpss的设置大概流程顺序:
参数初始化,用于属性配置
HI_MPI_VPSS_CreateGrp(VPSS_GRP VpssGrp, const VPSS_GRP_ATTR_S *pstGrpAttr); HI_MPI_VPSS_SetChnAttr(VPSS_GRP VpssGrp, VPSS_CHN VpssChn, const VPSS_CHN_ATTR_S *pstChnAttr); HI_MPI_VPSS_EnableChn(VPSS_GRP VpssGrp, VPSS_CHN VpssChn); HI_MPI_VPSS_StartGrp(VPSS_GRP VpssGrp);
VENC
编码模块。3559支持多路实时编码,每路独立。当然所有编码通道的编码负载之和要在3559最大编码范围内。我想看看极限时,编码2路4KP60的时候,偶尔会出现闪烁,按道理说这距离3559的编码最大范围还很远。先试了试1080和720,并且路数不是很多,所以没有深挖极限。支持H264/H265/jpeg。输入源可以是下面中的一项:
通道接收到图像之后,比较图像尺寸和编码通道尺寸:
1 如果输入图像比编码通道尺寸大,VENC 将按照编码通道尺寸大小,调用 VGS 对源图像进行缩小,然后对缩小之后的图像进行编码。
2 如果输入图像比编码通道尺寸小,VENC 丢弃源图像。VENC 不支持放大输入图像编码。
3 如果输入图像与编码通道尺寸相当,VENC 直接接受源图像,进行编码。
也就是说如果你的输入视频源比编码通道设置的视频尺寸小的话,是没有输出的。码率和gop设置,帧存计算一类,这一块内容量比较大,我没有细究,大部分参考sample默认就可以。