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
支持 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 时 y=
x ,当 x 时 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 )这两个位面都必须位于同一个颜 {MOD}空间。
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 能够处理去隔行或者合并操作,但是它不能同时进行这两个操作。
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮