Android MTK PDAF流程
PDAF:Phase Detection Auto Focus
PDAF sensor的實現原理(SPC結構):
PDAF通過比較L/R PD pixel構成的兩幅圖像,PD算法會計算出當前的相位差,根據相位差和模組的PD calibration data,估算出像距,從而移動lens快速對焦,PDAF快速對焦的搜索范圍[infinity,macro]主要來自于燒錄的OTP中的AF段,此距離并未實際與物體的物理距離即轉換后的DAC值。PDAF OTP中主要燒錄以上的SPC(shield pixel calibration)用于補償遮光后的亮度增益,DCC(defocus conversion coefficient)主要是用于將相位差轉換為Lens移動的距離,DCC中數值是通用過PD Diff 與DAC的關系擬合一條曲線的斜率(即PDAF線性度斜率)
PD pixel types主要有以下三類,Dual PD、Super PD、Shield PD。
目前接觸使用的都是Shield PD(像素點有一半會被遮擋),信噪比SNR一般是越大越好(S/N S表示攝像機在假設無噪聲時的圖像信號值,N表示攝像機本身產生的噪聲值);Shield PD 信噪比SNR一般比較差,但是能支持大尺寸像素;
Dual PD指每一個像素底部的感光區域一分為二,在同一個像素內即可獲得相位差,也稱2PD,全像素雙核對焦,PD點覆蓋率100%;
Super PD相鄰兩個像素共用一個micor lens(微透鏡用于提高感光度)得到相位差信息
CMOS傳感器的結構:1.微透鏡 2.色彩濾鏡 3.感光片(光電二極管)4.高速傳輸電路 (Mono sensor沒有色彩濾鏡,黑白)
SensorType:不同的類型主要是針對PD pixel和PD value是由sensor還是ISP處理;接觸較多的Type 2 PDAF_SUPPORT_CAMSV
MTK不同SensorType的總體處理流程:
MTK PDAF Flow:
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr.cpp MTK
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr_open.cpp 3rd party
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/common/hal3a/v3.0/HAL3AFlowCtrl.cpp
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/common/utils/pdtblgen/pdtblgen.cpp
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/isp_6s/af_assist_mgr.cpp
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr.cpp
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr/xxx_mipi_raw/pd_xxx_mipiraw.cpp
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/mem/common/v2/cam_cal_drv.cpp
vendor/mediatek/proprietary/hardware/mtkcam/drv/src/mem/common/v2/cam_cal_helper.cpp
vendor/mediatek/proprietary/custom/common/hal/imgsensor_src/camera_calibration_cam_cal.cpp
kernel-4.14/drivers/misc/mediatek/cam_cal/src/common/v2/eeprom_driver.c
(1) 前4個變量和L/R的坐標可直接從PD INI文檔中獲取
(2) i4PairNum指一個block中有幾對L/R pixel
(3) i4SubBlkW 和 i4SubBlkH 分別對應PD INI文檔中的 PD_DENSITY_X/Y
(4) i4BlockNumX 和 i4BlockNumY 分別對應PD INI文檔中的 PD_BLOCK_NUM_X_Y
(5) iMirrorFlip 指出圖方向與 模組廠 calibration出圖方向的相對方向
pd_info都是從4000*3000 尺寸上操作的,原來值的計算方式是
i4BlockNumX = ( 4000 - 16 * 2 ) / 16 = 248
i4BlockNumY = ( 3000 - 12 * 2 ) / 16 = 186
由于1920*1080是crop后的,故i4BlockNumX 和 i4BlockNumY 是需要修改的 ,與otp中的是不一致的
i4BlockNumX = 1920 / 16 = 120
i4BlockNumY = 1080 / 16 = 67.5 = 67
i4Crop用于記錄[Scenario][Crop] -> [x_crop][y_crop] RAW_OFFSET_X = 1040 RAW_OFFSET_Y = 960
1920*1080在驅動中用于配置SensorMode 6,應該前面一個{1040, 960}不用填,是SensorMode2
i4Crop = (4000 - 1040) / 2 (3000 - 960) / 2 = 1920 1080
vendor/mediatek/proprietary/custom/mt6853/hal/pd_buf_mgr/src/pd_buf_mgr/xxx_mipi_raw/pd_xxx_mipiraw.cpp
MBOOL PD_xxxMIPIRAW::IsSupport( SPDProfile_t &iPdProfile) {if (( iPdProfile.i4SensorMode == 5) && ((iPdProfile.uImgXsz == 1920) && (iPdProfile.uImgYsz == 1080))){m_PDBufXSz = 240;m_PDBufYSz = 536;if(m_PDBuf){delete m_PDBuf;m_PDBuf = nullptr;}m_PDBufSz = m_PDBufXSz*m_PDBufYSz;m_PDBuf = new uint16_t [m_PDBufSz];ret = MTRUE;AAA_LOGD("[1080P 60fps] is Support : i4SensorMode:%d w[%d] s[%d]\n", iPdProfile.i4SensorMode,iPdProfile.uImgXsz, iPdProfile.uImgYsz);}... }m_PDXSz代表每一行傳送pixel num = PitchX / DensityX * BlockNumX = 16 / 8 * 120 = 240
m_PDYSz代表傳送的行數line num = PitchY / DensityY * 2 * BlockNumY = 16 / 8 *2 *67 = 536
i4FocusPDSizeY = RAW_HIGHT * tracking_height / 100 / max_pd_win_y / PD_DENSITY_Y
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 1080 * 38 / 100 / 3 / 4 = 34.2 = 32
i4FocusPDSizex = RAW_WIDTH * tracking_width / 100 / max_pd_win_x / PD_DENSITY_X
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?= 1920 * 37 / 100 / 3 / 8 = 29.6 = 28
8032 6032 sensor內部有效像素 crop → binning → crop 如果有還要小的尺寸還需要crop
為了保持中心一致 0 12 上下都裁剪 crop
8032-(0 * 2) 6032 -(12 * 2)= 8032 6008 再binning
4016 3004 繼續上下crop
4016-(8 * 2)3004(2*2)= 4000 * 3000 最終輸出 tgsize
Type 2會使用VC(Virtual channel control),VC的主要作用就是將數據流的數據通過不同的通道分離給不同的流程。通過每一幀都是包含圖像幀+PD 虛擬幀(將Bayer數據和PD數據按照MIPI協議打包)
圖像幀(Image Data VC=0 DT=0x2B RAW10)
? ? ? ? 0x0780 = 1920 0x0438 = 1080 ;
PD 虛擬幀(PDAF Data VC=1 DT=0x30 通過date type區分通道)
? ? ? ? 0x012C = 120 * 2 * 10 / 8 = 300 //.i4BlockNumX = 120, // PD block number in X direction
? ? ? ? 0x0218 = 67 * 4 * 2 = 536 ? ?? ?? ? //.i4BlockNumY = 67, // PD block number in Y direction
PDAF線性度測試:
ISO<200,對著菱形圖20cm 位置下,在Confidence > 60的場景下抓取log,在log里查找PD Value與AF DAC,看他們是否是呈線性關系
插入一下OTP相關的知識
LCS Lens Shade Correction gridx gridy 垂直和網格大小,周圍亮度不均勻,處理不好可能經算法會有豎條紋,光暈等 BLC BlackLevel Correction 黑電平校正 (沒有做黑電平校正的的圖會更亮,影響圖像的對比度)sensor輸出的電壓越高,電流越大,而sensor電路本算存在暗電流,導致沒有光線輸入時也有一定的輸出電壓,所以需要把這一部分去掉,所有像素都減去一個校準值,raw10對應的OB(Optical Black)一般為64,需要注意init setting中的寄存器修改 AWB Auto White Balance RGB轉成Bayer模式的圖一般由(R Gr Gb B四個通道的值) ,AWB一般比較關注R/G B/G的值,Gr Gb一般值都比較接近,R/G 變大時,意味著R gain減小,整幅圖R分量少了,就會呈現泛綠泛藍,燒錄的數據主要是當前模組和Golden模組(一批生產中較為平均的做基準)的R Gr Gb B的數據總結
以上是生活随笔為你收集整理的Android MTK PDAF流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript 检测 页面是否在i
- 下一篇: Android service 小研究