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

支持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<=x<by= x,当x<ay= 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)这两个位面都必须位于同一个颜色空间。

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能够处理去隔行或者合并操作,但是它不能同时进行这两个操作。


0 0
原创粉丝点击