|
|
AEC就是自动曝光,自动曝光的实现,就是一个不断给sensor写gain与曝光的过程。高通的AEC,首先生成一个AE table ,设置一个target luma,然后实时统计出每一帧的cur luma。这样自动曝光其实就是cur luma 靠近target luma的过程,luma的变化其实就是调节sensor的gain与曝光的过程,然后配合HOLDING TIME功能使AE稳定在target luma 附近。
; V* L. _6 p! ? G. w+ ?" p4 j5 H' b' U. X, X
高通的AEC基本运转过程就是以上这么简单,然后需要注意的是sensor输出的sensor gain并不会很高,我知道的OV的一般16倍左右,SONY的也是8或者16,很少有sensor超过16的,那么当我们AE table设置的高于16时,高于16的部分会使用ISP gain去做补充。sensor厂会评估自身sensor稳定的工作极限范围,然后设置一个max gain,超过max gain就可能会导致sensor工作不稳定。9 k$ E! B# K! s; v. S
1 v- e0 C$ K+ }6 Q% \6 ^4 J s( b
; S; A2 x5 D Y/ q* U5 Q 影响亮度只有两种可能,要么改变当前帧的统计方法而影响cur luma,要么根据帧信息动态改变luma target。在advance aec里面,bright region与dark region这两个就是通过改变cur luma来调整亮度,而extreme_color 与Histogram就是改变luma target来影响亮度。还有一点AEC的调整只能单向去做调整,就是直方图要么整体左移,要么整体右移。
' G1 N7 f( r+ d) r4 G
9 R% S$ _" y, v2 _: K5 m/ O/ J/ E: o1 C0 i: [1 t' A+ I! }+ c! l
再说说曝光,sensor曝光都是逐行曝光,在国内,为了避免出现banding,曝光除了逐行曝光意外,还必须是10ms的整数倍,那么如何计算出10ms的整数倍的曝光是具体多少行呢,下面就说说这个。sensor的每一个pixel产生的数据都需要输出,输出就需要有能量,因此camera的主时钟MCLK,由BB提供,再由sensor处理后变成传输数据所需要的PCLK,PCLK给每一个pixel数据传输提供能量,它是一个频率,那么通过PCLK可以算出每一个pixel曝光需要的时间,就是1/PCLK,然后每一行有多少个pixel曝光(line_length_pclk)可以从sensor_lib.c里获取,这个值一般都会比sensor的output size会大,因为会加入dummy pixel(为啥需要加入空白的,都是为了调整曝光,从而达到消除banding的目的),有了这个值以后我们就可以很轻松的算出来10ms的整数倍到底具体是多少行,公式我还是列下来:
$ E8 S9 _ V# o* T$ _- O3 k( Z0 R (1/PCLK)*line_length_pclk*X = 10ms ----(X表示10ms的曝光行数)
$ O! Q7 c+ \2 V/ x1 |/ A" m7 p' E! [7 r) Z5 T1 L4 K A
0 x, _% @# ?% X; d- e
再多说一点,其实通过PCLK可以算出来mipi数据总量,假如我们是10bit的数据输出,那么MIPI的数据总量就是PCLK*10,如果是MIPI 4lane的那么每条lane的数据量就再除以4就好。: E4 T4 o1 V/ H7 o3 O: h& Y3 |! S
( Q+ Q) ^# P) G" j: |: x' @/ J2 A4 A5 {) }7 @% d0 e) {/ T
6 I. e' X3 S- W- R% \
- v0 ^7 C x, a5 u2 t7 N! ]$ a: v+ ~* ]0 P* v! V; G8 G) ~7 u8 }( ]
# v i- N/ T) a$ w: Q' Y |
|