8.5 子模块分析之VDIC
来源:互联网 发布:教师培训网络课程平台 编辑:程序博客网 时间:2024/05/01 08:35
(一)概述
VDIC的全称是Video De-Interlacing or Combining Block,看名字就知道有两个含义:去隔行和合并。
VDIC有两个操作模式:
1)去隔行:将一个隔行视频流转换成逐行视频;
2)合并:合并两个视频/图像位面和一个背景色。
VDIC将隔行数据去隔行后产生逐行数据,用来适应显示逐行数据的设备。对于VDIC操作来说,有三个操作域是重要的:F(n-1)域,F(n)域和F(n+1)域。F(n-1)域接收从CSI接口或者channel 1来的数据,然后将数据保存在FIFO1中。F(n)域中的数据从channel 2中获取,并且F(n)域中至少三个数据线里面的数据将要保存到Line Store memory中。F(n+1)域中的数据从channel 3中获取,然后保存到FIFO3中。FIFO控制器从这些FIFO中读取数据,然后将它们以像素格式保持对齐并保存在buffer中。然后buffer里面的数据传输到Line Padding Controller(LPC)中。这个LPC衬垫会丢失一帧的开始和结束那一行数据。之后DI子模块来进行处理过程,然后数据将要发送到IC或者内存中。
(二)VDIC特点
1)去隔行:
水平方向上最大分辨率是968像素;
最大像素率为75100MP/s
支持YUV422和YUV420格式
2)CSIFIFO模式
3)合并
(三)Deinterlacer(DI)子模块
从上面的介绍,可以看出来,DI是这个VDIC模块中的核心,DI的内部模块如下所示:
3.1 Vertical Filter Block (di_vfilt)
di_vfilt执行空间垂直方向上的像素过滤功能。这是一个四抽头垂直滤波,公式如下所示:
vfilt_out = (-3.0*pix1 + 19.0*pix2 + 19.0*pix3 – 3.0*pix4)/32.0
其中,pix1,pix2, pix3, pix4是连续的四行中同一水平位置上的四个像素点。
vfilt_out是计算出来的像素值(在pix2和pix3之间)。
3.2 Motion Calculator Block (di_mcalc)
di_mcalc模块计算任意给定像素的移动数量根据前一个,当前,后一个域中的像素值。
移动估计的公式是:
m= SAT(Ks*(|e-w|/(|e-w|+|n-s|+SPA_DETAIL)))
其中:
m是需要预测的像素的移动估计值(位于0~1之间);
n代表要预测的像素上面一行的像素;
s代表要预测的像素下面一行的像素;
e代表上一个域中同一个空间位置上需要预测的像素;
w代表下一个域中同一个空间位置上需要预测的像素;
Ks是倾斜控制,并且决定了算法从nomotion (m=0) 切换到fullmotion(m=1)的速度。
SPA_DETAIL是一个常数,等于50;
SAT()是一个饱和函数,最大输出为1.
(关于饱和函数,我参考的是matlab中的saturationfunction,
s=saturation('LinearInterval',[a,b]); %得到一个saturationfunction
y=evaluate(s,x); %返回x在saturate后的函数值。
函数关系为:当a<=x<b时y= x,当x<a时y= a,当x>=b时y= b。
详情,可参阅help For Example: s=saturation('LinearInterval',[-1,1]);s即为一个从-1到1的线性饱和函数,当x超出[-1,1]的范围,evaluation(s,x)返回值为-1和1,当x位于[-1,1)范围内,evaluation(s,x)返回值等于x。)
然后,经过一系列原因的简化(具体看芯片手册吧,实在翻译不下去了。。。),最终,移动估计简化成:
m等于|e-w|的低4位和|n-s|的[6:3]位组成的数值。
移动估计有三种模式可选,在IPUx_VDI_C寄存器的VDI_MOT_SEL位中指定,如果要修改这一位的值的话,它会在处理下一帧数据的时候生效。
这一位中的解释如下:
当VDI_MOT_SEL== 2’b00的时候,使用low motion,值为sat([0,15],delta_t-8);
当VDI_MOT_SEL== 2’b01的时候,m_calc= 0, (no motion - use weave);
当VDI_MOT_SEL== 2’b10的时候,使用highmotion,值为min(15,delta_t);
3.3 Spatial Motion Filter (di_sfilt)
di_sfilt模块展开相邻5个像素的移动估计信号,公式如下:
Mspread= MAX(m3, (0.5*m1 + m2 + m3 + m4 + 0.5*m5)/4.0)
其中,m3是当前像素的移动估计值;
m2是上一个像素的移动估计值;
m4是下一个像素的移动估计之;
m1是上上一个像素的移动估计值;
m5是下下一个像素的移动估计值。
3.4 Interpolated Pixel Calculator Block (di_interp)
di_interp模块根据di_sfilt模块计算出来的移动估计值Mspread和周围四个像素值(n,s, e, w)加权计算出一个以内插值替换的方法得到的像素值。
计算过程如下:
if (Mspread <= 0.5) { i = (1-2*Mspread)*(e+w)/2 + 2*Mspread*vfilt_out ;} else { i = vfilt_out ;}
这里,i代表以内插值替换的方法得到的像素值,n,s, e, w在3.2 Motion Calculator Block (di_mcalc)中介绍了。
3.5 Median Filter Block (di_med)
di_med模块的作用是求出n,s, e, w 和I五个像素值的中值。如果参数集合中包含偶数个数字,MEDIAN函数将返回位于中间的两个数的平均值,中值与平均值是不同的,区分如下:
平均值:平均值是算术平均数,由一组数相加然后除以这些数的个数计算得出。例如,2、3、3、5、7和10的平均数是30除以6,结果是5。
中值:中值是一组数中间位置的数;即一半数的值比中值大,另一半数的值比中值小。例如,2、3、3、5、7和10的中值是4。
在这里需要注意的是,这里并不是真正的从5个值中取中值,它实际上是一个更有效的从3个值中取中值的一个函数,公式如下所示:
3.6 Soft Switch Block (di_sswitch)
最终的去隔行输出数据是中值和vfilt_out值的混合值,(假定n,s这两个像素值与e,w这两个像素值是不相关的,不相关的含义是指:(max(n,s)< min(e,w)) 或者(min(n,s)> max(e,w)))。
计算公式如下:
if (Mspread <= 0.5 || not(F)) { pix_out = med ;} else { /* Mspread > 0.5 */ pix_out = (1-2*(Mspread-0.5))*med + 2*(Mspread-0.5)*vfilt_out ;}
(四)DMA only Mode
在DMA only模式下,数据只能够从IDMAC中传过来。
(五)Real Time Mode
在Real Time模式下,F(n-1)中的数据是从CSI中传送过来的,CSI来想FIFO1中写数据,然后DI子模块从F(n-1)中读取数据进行处理。
(六)CSI only Mode
在CSI only模式下,VDIC不进行任何处理,作为一个FIFO来使用。从CSI来的数据写到FIFO1中,然后IDMAC从FIFO1中读取数据。FIFO3和Line store memory都没有使用同时DI子模块是关闭状态。
(七)使用VDIC的Combining功能
VDIC能够进行两个位面的合并操作。
1)这两个位面都必须位于同一个颜色空间。
2)支持使用统一的背景图来覆盖一个位面。
3)这两个位面的大小不必一致。
4)每一个输出像素的合并操作需要一个单循环。
5)支持Alpha操作(global或者local)。
6)支持Color keying。
位面的位置和大小是可以通过编程控制的。如下图所示:
当使用local alpha的话,local alpha的数据应当从VDIC的channel3中来。
合并公式是:
OP= BG*(1 - alpha) + FG*alpha
OP代表输出像素,FG代表从channel3中来的前背景输入像素,BG代表从channel1中来的后背景输入像素,alpha是global or local transparency。(不会翻译了。。。)
(八)VDIC缺点
1)最大的输出像素频率为100MP/s。
2)输出像素格式和输入像素格式相同,都为YUV422或YUV420。
3)VDIC能够处理去隔行或者合并操作,但是它不能同时进行这两个操作。
- 8.5 子模块分析之VDIC
- 8.1 子模块分析之IDMAC
- 8.2 子模块分析之CSI
- 8.3 子模块分析之SMFC
- 8.4 子模块分析之IC
- 8.6 子模块分析之CM
- 项目子模块设计分析
- 存储之SCSI子模块
- DHCP源码分析_子模块划分
- 子模块
- DHCP源码分析_dhcpd后台进程子模块
- Qt之pro配置多个子工程/子模块
- Qt之pro配置多个子工程/子模块
- Qt之pro配置多个子工程/子模块
- Qt之pro配置多个子工程/子模块
- Qt之pro配置多个子工程/子模块
- Qt之配置多个子工程/子模块
- git子模块
- 系统拆分解耦利器之消息队列---RabbitMQ-发布/订阅
- 关于UI在主线程操作的问题(handler和AsyncTask)
- JSTL
- $.extend() 参数
- Maven的settings.xml文件结构之profiles
- 8.5 子模块分析之VDIC
- jsp的config对象浅析。
- 直播干货来袭,RTMPCHybridEngine颠覆传统直播
- POJ 2891 Strange Way to Express Integers(一元线性同余方程组)
- NPOI 设置Excel样式
- Storm 集群监控报警-问题排查记录
- React Native Don't Call PropTypes Warning
- 使用 Spring Boot 快速构建 Spring 框架应用
- 函数重载