NXP

8.5 子模块分析之VDIC

2019-07-12 13:52发布

(一)概述 VDIC的全称是Video De-Interlacing or Combining Block,看名字就知道有两个含义:去隔行和合并。 VDIC有两个操作模式: 1)去隔行:将一个隔行视频流转换成逐行视频; 2)合并:合并两个视频/图像位面和一个背景 {MOD}。 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 支持YUV422YUV420格式 2CSIFIFO 模式 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是计算出来的像素值(在pix2pix3之间)。
3.2 Motion Calculator Block (di_mcalc) di_mcalc模块计算任意给定像素的移动数量根据前一个,当前,后一个域中的像素值。 移动估计的公式是:
m= SAT(Ks*(|e-w|/(|e-w|+|n-s|+SPA_DETAIL))) 其中: m是需要预测的像素的移动估计值(位于01之间); 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);                             %返回xsaturate后的函数值。 函数关系为:当 a<=xy= x,当xy= a,当x>=by= b 详情,可参阅help For Example: s=saturation('LinearInterval',[-1,1]);s即为一个从-11的线性饱和函数,当x超出[-1,1]的范围,evaluation(s,x)返回值为-11,当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, w3.2 Motion Calculator Block (di_mcalc)中介绍了。
3.5 Median Filter Block (di_med) di_med模块的作用是求出n,s, e, w I五个像素值的中值。如果参数集合中包含偶数个数字,MEDIAN函数将返回位于中间的两个数的平均值,中值与平均值是不同的,区分如下: 平均值:平均值是算术平均数,由一组数相加然后除以这些数的个数计算得出。例如,2335710的平均数是30除以6,结果是5 中值:中值是一组数中间位置的数;即一半数的值比中值大,另一半数的值比中值小。例如,2335710的中值是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中,然后IDMACFIFO1中读取数据。FIFO3Line store memory都没有使用同时DI子模块是关闭状态。
(七)使用VDICCombining功能 VDIC能够进行两个位面的合并操作。 1)这两个位面都必须位于同一个颜 {MOD}空间。 2)支持使用统一的背景图来覆盖一个位面。 3)这两个位面的大小不必一致。 4)每一个输出像素的合并操作需要一个单循环。 5)支持Alpha操作(global或者local)。 6)支持Color keying
位面的位置和大小是可以通过编程控制的。如下图所示: 当使用local alpha的话,local alpha的数据应当从VDICchannel3中来。 合并公式是: OP= BG*(1 - alpha) + FG*alpha OP代表输出像素,FG代表从channel3中来的前背景输入像素,BG代表从channel1中来的后背景输入像素,alphaglobal or local transparency。(不会翻译了。。。)
(八)VDIC缺点 1)最大的输出像素频率为100MP/s 2)输出像素格式和输入像素格式相同,都为YUV422YUV420 3VDIC能够处理去隔行或者合并操作,但是它不能同时进行这两个操作。