日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android MTK PDAF流程

發布時間:2023/12/10 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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

Sensor TypeCharacterPorting guideType1PD pixel corrected by sensor
PD value calculate by sensor Type1 PDAF portingType2PD pixel corrected by sensor
PD pixel output to ISP via VC Type2 PDAF portingType3PD pixel corrected by ISP
PD pixel extracted by ISP from raw image
PD pixel extracted by PDAF algo on ISP3.0 Type3 PDAF portingDual PDNo need to correct PD pixel
PD pixel extracted by ISP, under mode 1
PD pixel output to ISP under mode 3 DualPD PDAF porting

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

static struct SET_PD_BLOCK_INFO_T imgsensor_pd_info_1920_1080 = {.i4OffsetX = 16, // x offset of PD area.i4OffsetY = 12, // y offset of PD area.i4PitchX = 16, // x pitch/width of a PD block.i4PitchY = 16, // y pitch/height of a PD block.i4PairNum = 8, // num of pairs L/R PD pixel within a PD block.i4SubBlkW = 8, // x interval of 1 pair L/R PD pixel within a PD block.i4SubBlkH = 4, // y interval of 1 pair L/R PD pixel within a PD block.i4BlockNumX = 120, // PD block number in X direction.i4BlockNumY = 67, // PD block number in Y direction .iMirrorFlip = 0,.i4PosR = {{16,13}, {24,13}, {20,17}, {28,17},{16,21}, {24,21}, {20,25}, {28,25},},.i4PosL = {{17,13}, {25,13}, {21,17}, {29,17},{17,21}, {25,21}, {21,25}, {29,25},},.i4Crop = { {0, 0}, {0, 0}, {1040, 960}, {0, 0}, {0, 0}, {1040,960},{0, 0}, {0, 0}, {0, 0}, {0, 0} }, };

(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

{//AF_NVRAM{ // i4HybridAFCoefs1[64]1, // [0] hybrid_default_param37, // [1] tracking_width38, // [2] tracking_height3, // [3] max_pd_win_x3, // [4] max_pd_win_y...{//PD_NVRAM_T{//PD_CALIBRATION_DATA_T{0},0,},//PD_CALIBRATION_DATA_T{//PD_ALGO_TUNING_T//--------------------------------------------------------------------------------/// Section: PD Block Size// Description: Determine PD block width and height//// i4FocusPDSizeX (width)// i4FocusPDSizeY (height)// range: [0] 32 to (raw_width/x_density), [0] 24 to (raw_height/y_density)// default:// S5K3P8: SizeX=32, SizeY=24 (density_x=16, density_y=16)// OV13855: SizeX=32, SizeY=48 (density_x=16, density_y=8)// IMX258: SizeX=64, SizeY=24 (density_x=8, density_y=16)// IMX398: SizeX=64, SizeY=48 (density_x=8, y_density_y=8)// S5K2L8: SizeX=240, SizeY=96 (density_x=2, y_density_y=4)// constraints: must be a multiplier of 4// effect: A large block takes longer computation time than a small block.//--------------------------------------------------------------------------------/28, // i4FocusPDSizeX32, // i4FocusPDSizeY//--------------------------------------------------------------------------------/

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

static struct SENSOR_WINSIZE_INFO_STRUCT imgsensor_winsize_info[7] = {{8032, 6032, 0, 12, 8032, 6008, 4016, 3004, 8, 2, 4000, 3000, 0, 0, 4000, 3000}, //preview(4000 x 3000){8032, 6032, 0, 12, 8032, 6008, 4016, 3004, 8, 2, 4000, 3000, 0, 0, 4000, 3000}, //capture(4000 x 3000){8032, 6032, 0, 12, 8032, 6008, 4016, 3004, 8, 2, 4000, 3000, 0, 0, 4000, 3000}, // VIDEO (4000 x 3000){8032, 6032, 0, 1568, 8032, 2896, 2008, 724, 364, 2, 1280, 720, 0, 0, 1280, 720}, // hight speed video (1280 x 720){8032, 6032, 0, 12, 8032, 6008, 4016, 3004, 8, 2, 4000, 3000, 0, 0, 4000, 3000}, // slim video (1280 x 720){8032, 6032, 2080, 1932, 3872, 2168, 1936, 1084, 8, 2, 1920, 1080,0, 0, 1920, 1080}, // custom1 (1920x 1080){8032, 6032, 0, 14, 8032, 6004, 8032, 6004, 16, 2, 8000, 6000, 0, 0, 8000, 6000}, //remosaic (8000 x 6000) };

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

static struct SENSOR_VC_INFO_STRUCT SENSOR_VC_INFO[4]= {/* Preview mode setting */{0x02, //VC_Num0x0a, //VC_PixelNum0x00, //ModeSelect /* 0:auto 1:direct */0x00, //EXPO_Ratio /* 1/1, 1/2, 1/4, 1/8 */0x00, //0DValue /* 0D Value */0x00, //RG_STATSMODE /* STATS divistion mode 0:16x16 1:8x8 2:4x4 3:1x1 */0x00, 0x2B, 0x0FA0, 0x0BB8, // VC0 image data0x00, 0x00, 0x0000, 0x0000, // VC1 MVHDR0x01, 0x30, 0x026C, 0x05D0, // VC2 PDAF0x00, 0x00, 0x0000, 0x0000}, // VC3 /* Capture mode setting */ /* Video mode setting *//* Custom1 mode setting */{0x02, //VC_Num0x0a, //VC_PixelNum0x00, //ModeSelect /* 0:auto 1:direct */0x00, //EXPO_Ratio /* 1/1, 1/2, 1/4, 1/8 */0x00, //0DValue /* 0D Value */0x00, //RG_STATSMODE /* STATS divistion mode 0:16x16 1:8x8 2:4x4 3:1x1 */0x00, 0x2B, 0x0780, 0x0438, // VC0 image data0x00, 0x00, 0x0000, 0x0000, // VC1 MVHDR0x01, 0x30, 0x012C, 0x0218, // VC2 PDAF0x00, 0x00, 0x0000, 0x0000}, // VC3 };};

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流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。