导图社区 AE_flow思维导图
这是一篇关于AE_flow的思维导图。该思维导图比较系统全面地归纳总结了关于这一部分知识的要点,可帮助系统学习备考。
编辑于2021-08-19 20:46:03PreviewAEInit
Sensor initial
1 、由 IHalSensorList 来 createSensor 实例化 m_pHalSensorObj 对象 ,然后才能够通过该对象向 sensor 下参数设置,如 shutter/sensorgain 等。 AAASensorMgr::getInstance().init(m_i4SensorIdx);
getSsensorResolution()
2 、 调用了 getSensorWidthHeight 针对不同 sensorIDx , 获取不同 sensor mode 的静态数据信息,如,宽高。用 于后面的 Zoom 操作。 AAASensorMgr::getSensorWidthHeight(MINT32 i4SensorDev, SENSOR_RES_INFO_T* a_rSensorResolution) {… pIHalSensorList->querySensorStaticInfo(i4SensorDev, &rSensorStaticInfo); a_rSensorResolution->u2SensorPreviewWidth = rSensorStaticInfo. preview Width ; a_rSensorResolution->u2SensorPreviewHeight = rSensorStaticInfo. preview Height ; … }
getNvramData()
3 、获取 NVRAM 中关于 3A 部分的数据,如,更新AE_PLINETABLE_T 类型的全局变量 m_pAEPlineTable , 包含了 strAESceneMapping 、 strAEPLineTable 、 strAEPLineInfomation 和 strAEPLineGainList 四个类型的 信息。
getSensorDeviceInfo2()
AAASensorMgr::getSensorDeviceInfo2(MINT32 i4SensorDev, ae_device_info *rDevicesInfo, MUINT32 *u4GainTable) 1. 通过 m_pHalSensorObj 获取 deviceInfo 的信息,并初始化 ae_device_info 类型变量 m_rAeHwCfg 中的信息,如,u4MinGain 、 iso_gain 、 framerate 等,如下两点都是在更新 m_rAeHwCfg 变量的内容。 2. 针对在不同 sensor mode 下,根据 u4PixelClock 计算最小曝光时间和行曝光时间。 3. 通过执行 querySensorStaticInfo 函数获取不同 sensor mode 下的 staticInfo ,如,不同 mode 下的 FrameRate( 10Xbase )。 从 3A sensor 端获取 sensor 在该 TargetMode 下的,sensor_vc_info_t 结构体的成员值,如,长短曝光 MaxBlockWidth 和 MaxBlockHeight 的大小(会在 setNVRAMIndex 中赋值)。 if (m_eAETargetMode == AE_MODE_MVHDR_TARGET) AAASensorMgr::getInstance(). getSensorVCinfo (m_eSensorDev, &m_rSensorVCInfo);
AEInit
setCamScenarioMode()
设置 CamScenarioMode(// currently only for AE_MODE_4CELL_MVHDR_TARGET) , 还会 getAEModuleParamData ,如moduleID 、 LensID 。 \vendor\mediatek\proprietary\custom\mt6873\hal\inc\camera_custom_3a_nvram.h // Camera Scenario typedef enum { CAM_SCENARIO_PREVIEW = 0, // PREVIEW CAM_SCENARIO_VIDEO, // VIDEO CAM_SCENARIO_CAPTURE, // CAPTURE CAM_SCENARIO_CUSTOM1, // HDR CAM_SCENARIO_CUSTOM2, // AUTO HDR CAM_SCENARIO_CUSTOM3, // VT CAM_SCENARIO_CUSTOM4, // STEREO CAM_SCENARIO_NUM } CAM_SCENARIO_T;
setNVRAMIndex()
1. 设置全局变量 m_rAEConfigInfo (AE statistics and histogram config) 和 m_rAEInitInput (AAO 信息 ) 的成员值,后者的 AAO 信息会在 AEAlgo 会用到。 2. 会调整 pline mapping table 的 ae_mgr 中的全局变量 m_pAEMapPineTable 为 stereo/HDR/default 三种 pline mapping table 中的一个。(其中有一个全局变量 m_bPlineMappingChange 控制是否进行 pline mapping table 的修改。
getSensorDynamicInfo()
通过 IHalSensor 更新 SensorDynamicInfo 结构体下的 TG_info 和 pixel mode( 未用到 ) ,使用 querySensorDynamicInfo 函数获取 了相关信息,然后更新全局变量 m_eSensorTG 。 struct SensorDynamicInfo { MUINT32 TgInfo ; /*TG_NONE,TG_1,...*/ MUINT32 pixelMode ; /*ONE_PIXEL_MODE, …E */ MUINT32 TgVR1Info; /* CAM_TG_1, CAM_TG_2, …*/ MUINT32 TgVR2Info ; … };
Create SensorProvider Object
// --- Create SensorProvider Object --- if (mpSensorProvider == NULL) { mpSensorProvider = SensorProvider::createInstance(LOG_TAG); if (mpSensorProvider != nullptr) { MUINT32 interval= 30; interval = property_get_int32("vendor.debug.ae_mgr.gyrointerval", SENSOR_GYRO_POLLING_MS); if (mpSensorProvider->enableSensor(SENSOR_TYPE_GYRO, interval)) m_bGryoVd = MTRUE; } else { m_bGryoVd = MFALSE; } … m_bAcceVd = MTRUE; … m_bLightVd = MTRUE; … }
sensor table mapping&get custom params
AE init 配置 sensor table 和 custom params 的获取 else if (m_pAEPlineTable != NULL) { m_rAEInitInput.rAEPlineTable = m_pAEPlineTable; //sensor table mapping ,将 sceneMapping table 整个表复制到 m_rAEInitInput for (j = 0; j < MAX_PLINE_MAP_TABLE; j++) { for (i = 0; i < LIB3A_SENSOR_MODE_MAX; i++) { // 从 sceneMapping 中初始化 scene Mode m_rAEInitInput.rAEPlineMapTable[j].eAEScene = m_pAEPlineTable- >sAEScenePLineMapping.sAESceneMapping[j].ae_scene_mode; // 从 sceneMapping 中初始化 plineID m_rAEInitInput.rAEPlineMapTable[j].ePLineID[i] = m_pAEPlineTable- >sAEScenePLineMapping.sAESceneMapping[j].ePLineID[i]; } } } // Clear FD Area ,初始化 face area 的变量置 0 memset(&m_eAEFDArea, 0, sizeof(AEMeteringArea_T)); …… // ezoom info default m_eZoomWinInfo.u4XOffset = 0; m_eZoomWinInfo.u4YOffset = 0; m_eZoomWinInfo.u4XWidth = 2000; m_eZoomWinInfo.u4YHeight = 1000; memcpy(& eZoomWinInfo , &m_eZoomWinInfo, sizeof(AEZOOM_WINDOW_T)); m_rAEInitInput.rEZoomWin = eZoomWinInfo; m_rAEInitInput.eAEScene = m_eAEScene; m_rAEInitInput.eAECamMode = m_eAECamMode; m_rAEInitInput.eAEFlickerMode = m_eAEFlickerMode; m_rAEInitInput.eAEEVcomp = m_eAEEVcomp; m_rAEInitInput.u4AEISOSpeed = m_u4AEISOSpeed; m_rAEInitInput.i4SensorMode = m_eSensorMode; ……
AEalgo init
AE Algo 的初始化,输入参数来源于前一部分的初始化。 再通过 AE Algo 输出 AE statistic window 配置信息 m_pIAeCalc->initAE (& m_rAEInitInput & m_rAEStatCfg ); /* output the AE statistic window config for AE algorithm */ m_pIAeCalc->modifyHistogramWinConfig ( eZoomWinInfo , & m_rAEStatCfg , m_u4Hbinwidth, m_u4Hbinheight, m_i4AETgValidBlockWidth, m_i4AETgValidBlockHeight); ……
checkAEPline()
执行 checkAEPline 函数 checkAEPline ();
AI shutter init
AI shutter 的初始化。 /* AI-Shutter: init */ m_pIAiShutterCalc = NS3A:: IAiShutterCalc::createInstance (); ……
Return
memcpy(&m_rAESettingCa pture,&m_rAEAlgoOutput, sizeof(strAERealSetting))
recalcAEExpInfoEVcomp_v4p0
switchCaptureState
if(bSetAEEVAndAELock)
switchCaptureState
recalcAEExpInfo_v4p0
getOnePlineTable
if(m_i4ManualPlineIdx)
if (m_bAPAELock)
updateAEAlgoInfo(& m_rAEInfoPreview)
if (m_pIAeCalc !=NULL)
prepareCapParams
m_eAEState =MTK_CONTROL_AE_STATE_SEARCHING
m_eAEState =MTK_CONTROL_AE_STATE_LOCKED
m_eAEState =MTK_CONTROL_AE_STATE_CONVERGED
m_eAEState =MTK_CONTROL_AE_STATE_LOCKED
if (m_bAEStable == MTRUE)
闪光灯?
闪光灯?
if(m_bAlgoAPAELock == MTRUE)
// AE is stable, change to AF state prepareCapParams(); prepareAE2AFParams();
UpdateSensorISPParams(AE_FLOW_STATE_AE2AF,m_rAESettingAE2AF)
if (!bAAASchedule)
prepareCapParams
calculateCPUAE(bAAASchedule,bisSkipCalAE);
setAEMgrStateCPU(AE_M GR_STATE_DOAFAE);
专业模式?
if ((m_eAEMode == LIB3A_AE_MODE_OFF && !m_bAdbAEPreviewUpdate) || m_bManualByShutterISOPriorityMode
if (m_bAEStable == MTRUE)
if(getAEManualSetting (&m_rAESettingManual))
在 Ae Manual 模式时,获取每一帧 的 exposure time 等 getAEManualSetting() { if(m_SensorQueueCtrl.uInputIndex != m_SensorQueueCtrl.uOutputIndex) … return MTRUE; else return MFALSE; }
prepareAE2AFParams
在获取 CapParms 参数后,在 Aealgo 中转到 m_rAESettingAE2AF
if (!bAAASchedule)
UpdateSensorISPParams(AE_FLOW_STATE_PREVIEW, m_rAESettingPreview)
return
UpdateSensorISPParams(AE_FLOW_STATE_MANUAL,m_rAESettingManual)
doAFAE
if(m_i4FrameCount >=30){ }
Task3ATouchImp::run()流程
Prepare statistic data
根据输入的变量 TaskData& rData 获取 buffer 信息。
pAAOBuffer 、 pTSFOBuffer 、pLTMSOBuffer、pMvHdrBuffer 、pThreadRaw
UpdateMstreamAESetting
lock AE by CAF
AeMgr::UpdateMstreamAESetting — > UpdateSensorISPParams
AWB calculation(doPvAWB)
if(AE Stable&&bFlashReady){ }
Normal AE
FEATURE_MVHDR_SUPPORT_VIRTUAL_CHANNEL
FEATURE_MVHDR_SUPPORT_3EXPO_VIRTUAL_CHANNEL
if (pLTMSOBuffer)更新 ltm_metering_input 参数,如 magicNumber 。 IAwbMgr::getInstance().setLTMInfo(m_i4SensorDev, awb_ltm_in);
AE calculation
set awb gain to ae_mgr
if(isMvHDREnable == ?)
AE update sensor setting
end
Task3ACaptureImp::run() 流程
Capture
TASK_STATUS_INIT
if(getStatus() == TASK_STATUS_INIT)
Update Flash on/off information to AE/AWB
对 ae_mgr.cpp 中的闪光灯 flag 变量进行赋值 IAwbMgr::getInstance().setStrobeMode(m_i4SensorDev, (bFlashOnOff ? AWB_STROBE_MODE_ON : AWB_STROBE_MODE_OFF)); if(bFlashOnOff) IAwbMgr::getInstance().doCapFlashAWBDisplay(m_i4SensorDev); if((FlashMgr::getInstance(m_i4SensorDev)->getFlashMode() != LIB3A_FLASH_MODE_FORCE_TORCH)) { MBOOL bStrobeMode = bFlashOnOff ? MTRUE : MFALSE; … IAeMgr::getInstance().sendAECtrl(m_i4SensorDev, EAECtrl_NotifyMainFlashON, bStrobeMode, NULL, NULL, NULL); }
update capture parameter
若没有开主闪,就不会执行 doBackupAE();
LTM related Flow
获取 LTM 的信息,如 meter 区域、 LTMBuffer 的寄存器地址、magicNumber 。 IAeMgr::getInstance(). getLTMInfo (m_i4SensorDev,ltm_metering_input, pltm_metering_output); if (pLTMSOBuffer) { ltm_metering_input. pu4LtmsAddr = reinterpret_cast<MUINT32 *>(pLTMSOBuffer->mVa); ltm_metering_input.i4LTMSOMagicNum = pLTMSOBuffer- > mMagicNumber ; }
doCapAE
doPvAWB
get LSC info
在执行完 doCapAE 后,从 AEMgr 中获取当前的 AEPerframeInfo ,如, ISOValue/bAEStable/bAELock 等,再作为 LSCMgr 的 Info 输入。 AE_PERFRAME_INFO_T AEPerframeInfo; IAeMgr::getInstance().getAEInfo(m_i4SensorDev, AEPerframeInfo); rLscInputInfo .isFlash = bFlashOnOff; rLscInputInfo.u4RealISOValue = AEPerframeInfo.rAEISPInfo.u4P1RealISOValue; rLscInputInfo.u4MgrCWValue = AEPerframeInfo.rAEISPInfo.u4CWValue; rLscInputInfo.i4deltaIndex = AEPerframeInfo.rAEISPInfo.i4deltaIndex; rLscInputInfo.u4AEFinerEVIdxBase = AEPerframeInfo.rAEISPInfo.u4AEFinerEVIdxBase; rLscInputInfo.bAEStable = AEPerframeInfo.rAEISPInfo.bAEStable; rLscInputInfo.bAELock = AEPerframeInfo.rAEUpdateInfo.bAELock; pLsc->evaluate_cus_Ratio (rLscInputInfo, forceUnlock); ……
prepare AWB info to TSF and AE
Prepare statistic data
pAAOBuffer 、 pLTMSOBuffer 、 pTSFOBuffer
AAASensorMgr:: setPreviewMaxFrameRate() setSensorExpTime() setSensorGain()
/* update frame rate */ /* update shutter value */ /* update sensor gain value */
AeSettingDefault::updateExpoSettingbyI2C()
IAeMgr::updateSensorbyI2C()
ThreadRawImp::onEventThreadLoop()
ThreadRawImp::postToEventThread()
if (pLTMSOBuffer)更新 ltm_metering_input 参数,如 magicNumber 。 IAwbMgr::getInstance().setLTMInfo(m_i4SensorDev, awb_ltm_in);
Normal AE
FEATURE_MVHDR_SUPPORT_3EXPO_VIRTUAL_CHANNEL
FEATURE_MVHDR_SUPPORT_VIRTUAL_CHANNEL
if(!(i4Opt &TASK_OPTION_BYP_AE))
set awb gain to ae_mgr
if(isMvHDREnable == ?)
AE update sensor setting
Shading calculation
if(!(i4Opt & TASK_OPTION_BYP_TSF)) { 更新 rAwbInfo ; if (pTSFOBuffer) { 更新 rTsfInfo} }
AWB calculation(doPvAWB)
AE calculation
lock AE by CAF
AeMgr::UpdateMstreamAESetting — > UpdateSensorISPParams
UpdateMstreamAESetting
Prepare statistic data
根据输入的变量 TaskData& rData 获取 buffer 信息。
pAAOBuffer 、 pTSFOBuffer 、pLTMSOBuffer、pMvHdrBuffer 、pThreadRaw
Task3APreviewImp::run()流程
根据 sensor 端的 maxSensorGain ,获取当前 afegain 和 maxSensorGain 的比率,并将当前 IspGain 按照这个比率转换新的值,新的 afegain 则默认取最大值。 if(current Afegain>maxSensorGain) new Ispgain=old ispgain*(current Afegain/maxSensorGain) new Afegain=maxSensorGain
1. 该部分的作用是若启动了 AIHDR ,则将 AIHDR 计算出来的 AE Setting 给updateSensorISPParams 函数作为输入( m_strAHDRInfoOut->m_rAESettingCapture ),并传递到 sensor 和 ISP 。 2. 有 short/normal/long 的 exposure 的区分。
return
UpdateSensorISPParams(AE_FLOW_STATE_CAPTURE,m_rAESettingCapture)
if (!bIsSyncAE)
checkIfSensorGainOver
getAIHDRCaptureSetting
calcAIHDRCaptureSetti ng(&m_rAEAlgoOutput ,&m_strAHDRInfoOut)
if(m_bAIHDRCapInfoReady == MFALSE)
if (m_i4ExposureLevel != MTK_3A_FEATURE_AE_EXPOSURE_LEVEL_NONE)
calculateCPUAE
setAEMgrStateCPU(AE_MGR_STATE_DOCAPAE)
doCapAE
AE not stable
AE stable
return
if (!bAAASchedule)
if (!bAAASchedule)
m_eAEState = MTK_CONTROL_AE_STATE_LOCKED;
UpdateSensorISPParams(AE_FLOW_STATE_PREVIEW, m_rAESettingPreview)
m_eAEState = MTK_CONTROL_AE_STATE_LOCKED;
m_eAEState = MTK_CONTROL_AE_STATE_CONVERGED;
m_eAEState = MTK_CONTROL_AE_STATE_SEARCHING
if (m_bAlgoAPAELock == MTRUE)
if (m_bAlgoAPAELock == MFALSE)
if (m_bAEStable == MTRUE)
UpdateSensorISPParams(AE_FLOW_STATE_MANUAL,m_rAESettingManual)
if (isValidMunual)
isValidMunual= getAEManualSetting(& m_rAESettingManual)
专业模式
if ((m_eAEMode == LIB3A_AE_MODE_OFF && !m_bAdbAEPreviewUpdate) || m_bManualByShutterISOPriorityMode
lock?
update algo main in information
update onchange information ,如,m_u4IndexMin/m_u4In dexFMin 等
update vsync/perframe information ,如,minFps/maxFps ,sensormode 等
return
updatealgomainininformation
m_pIAeFlowCPU->controltrigger((MUINT32) E_AE_FLOW_CPU_TRIGGER_ONCH_INFO_UPDATE, MTRUE)
prepareAlgoOnchInfo
checkAEPline
if(m_bNeedCheckAEPline)
m_pIAeFlowCPU- >controltrigger((MUINT32) E_AE_FLOW_CPU_TRIGGER_FR AME_INFO_UPDATE,MTRUE)
prepareAlgoFrameInfo
UpdateGyroInfo
return
updateAiShutterCalcInfo(); getAiShutterExpoSetting();
if (m_bEnAiShutter &&m_eAEMode! = LIB3A_AE_MODE_OFF && !m_bSkipAiShutterCalc)
m_pIAeFlowCPU->getAEInfoForISP(m_rAEInfoPr eview,m_rAEInfoV2)
通过 ae_algo_ctrl 获取 ae_info 信息,m_rAEInfoPreview 会在 prepareCapParams 用 到, m_rAEInfoV2 会在 updateAEInfo2ISP 中使 用。
copyAlgoResult2Mgr(&m_rCPUCalOutput,isSkipCalAE)
将 CPU 的计算结果 m_rCPUCalOutput 的 AESetting 部分复制到 m_rAEAlgo Output 。即,用于之后的计算。 copy ae algo result to ae mgr. 如: m_u4Index = m_rAEAlgoOutput.u4Index; m_i4BVvalue=pAlgoOutput->bv; m_u4CWVY=pAlgoOutput->cwv;
if(!isSkipCalAE|| isAAASchedule)
if (m_pIAeFlowCPU->calculateAE ((MVOID*)&rCPUCalInput, (MVOID*)& m_rCPUCalOutput))
ae_algo_main 有没有计算?
prepareCPUCalculateInfo
为下一步 calculateAE 准 备输入, rCPUCalInput 。
checkADBCmdCtrl
check if controlled by ADB cmd
这是啥操作???
N
return
UpdateSensorISPParams
UpdateSensorISPParams()
AeMgr::UpdateSensorISPParams(AE_FLOW_STATE_T eAEFlowState, strAERealSetting &rAERealSetting, MBOOL bUpdateSESetting==TRUE)
getBinSumTransSetting()
customized transform function: binning sum transformation 获取 binSum 转换设置,并重新计算 shutter/gain
transSuperNightShot()
customized transform function: super night shot transforamtion
fill in m_rSensorCurrentInfo:AE setting before convert
保存当前传下来的 EVSetting ,如 exposure time 、 ISO ,备份操作。
remapping VHDR state()
根据 aeTargetMode 的类型重置 AE flow state
case:AE_FLOW_STATE_INIT
updateAESetting()
AeMgr::updateAESetting(strAERealSetting &rAERealSetting, UPDATE_AE_SETTING_TYPE update_type) ae_mgr_setting.cpp 1. 根据输入的 AESetting 设置 exposureMode 为 0 : exposure time 还 是 1 : exposure line 。 2. 保存当前和前两帧 AESetting 的 flicker 、 exp 、 afegain 、 ispgain 信息。 3. 若 AETargetMode 为 HDR 时,会保存长中短曝光的 AESetting 参数。 MRESULT AeMgr:: updateAESetting (strAERealSetting &rAERealSetting, UPDATE_AE_SETTING_TYPE update_type) { m_u4ExposureMode = rAERealSetting.u4ExposureMode ; if ( m_eAETargetMode == AE_MODE_NORMAL || m_eAETargetMode == AE_MODE_MSTREAM_VHDR_TARGET || m_eAETargetMode == AE_MODE_MSTREAM_VHDR_RTO1X_TARGET) { if (update_type & UPDATE_QUEUE_ONLY) {// MAX_AE_SETTING_NUM = 4 for (int i = MAX_AE_SETTING_NUM - 2 ; i >= 0; i--) {// 将旧的 AESetting 数据从数组中后移 m_u4AESettingFL[i+1] = m_u4AESettingFL[i]; m_u4AESettingEXP[i+1] = m_u4AESettingEXP[i]; m_u4AESettingAFE[i+1] = m_u4AESettingAFE[i]; m_u4AESettingISP[i+1] = m_u4AESettingISP[i]; } } if (update_type & UPDATE_SETTING_ONLY) { // 保存新的 AESetting 数据 m_u4AESettingFL[0] = rAERealSetting.u4Framelength; m_u4AESettingEXP[0 ] = rAERealSetting.EvSetting.u4Eposuretime; m_u4AESettingAFE[0 ] = rAERealSetting.EvSetting.u4AfeGain ; m_u4AESettingISP[0] = rAERealSetting.EvSetting.u4IspGain ; } … }
controltrigger()
1. 初始化启动 AESetting 向 sensorMgr 设置 shutter/gain 值的 flag 。 这些 flag 在 updateExpoSettingbyI2C 会作为 if 条件。 MVOID AeSettingDefault:: controltrigger (MUINT32 index, MBOOL btrigger) { E_AE_SETTING_CPU_TRIGER_T etrigger = (E_AE_SETTING_CPU_TRIGER_T) index; switch(etrigger){ … case E_AE_SETTING_CPU_SHUTTER: m_bSetShutterValue = btrigger; break; case E_AE_SETTING_CPU_SENSORGAIN: m_bSetGainValue = btrigger; break; … }
prepareAEInfoDelaySetting()
2. 获取 delayFrames 对应的 AESetting Info MRESULT AeMgr:: prepareAEInfoDelaySetting (strAERealSetting &rAERealSetting) { rAERealSetting.u4Framelength = m_u4AESettingFL [m_i4FrameLengthDelayFrames]; rAERealSetting.EvSetting.u4Eposuretime = m_u4AESettingEXP [ m_i4ShutterDelayFrames ]; rAERealSetting.EvSetting.u4AfeGain = m_u4AESettingAFE [m_i4SensorGainDelayFrames]; rAERealSetting.EvSetting.u4IspGain = m_u4AESettingISP [m_i4IspGainDelayFrames] ; return S_AE_OK; }
updateAEInfo2ISP()
向 ISP 传递 algo 和 ae_mgr 的数据: 从 aeAlgo 获取 AE_ISP_INFO_T 结构体的信息, 如, AETarget 、 FinerEVIdxBase 等; 从 AE_mgr 中获取 AE_ISP_INFO_T 结构体的信 息,如, Shutter 、 gain 值等。 MRESULTAeMgr::updateAEInfo2ISP(AE_FLOW_STATE_TeAEFlowState, strAERealSetting&rSettingBeforeConv,strAERealSetting&rSettingAfterConv, MBOOLbForceSetByCPU) { AE_INFO_T*pAEInfo2ISP; if(eAEFlowState==AE_FLOW_STATE_CAPTURE){//根据AE_Flow选择AESetting pAEInfo2ISP=&m_rAEInfoCapture; }else{ pAEInfo2ISP=&m_rAEInfoPreview;//aeAlgo输出的AE_INFO_T } …//UpdatefromNVram if(m_p3ANVRAM!=NULL){ u4ISOBase_1xGain=m_rAeHwCfg.iso_gain*m_u4BinSumRatio; ....//Updateinfotoisptuning AE_ISP_INFO_TrAEISPInfo; rAEISPInfo.u4AETarget=pAEInfo2ISP->u4AETarget; … rAEISPInfo.u4IndexFMax=m_u4IndexFMax; rAEISPInfo.u4IndexFMin=m_u4IndexFMin; … switch(eAEFlowState){ caseAE_FLOW_STATE_INIT: caseAE_FLOW_STATE_PREVIEW: caseAE_FLOW_STATE_MANUAL: rAEISPInfo.u4P1SensorGain=rSettingAfterConv.HdrEvSetting.i4LEAfeGain; …break;//更新shutter、gain、ISO值到ISP if(eAEFlowState==AE_FLOW_STATE_POSTCAP) … else{… memcpy(&(m_AEPerFrameInfo.rAEISPInfo),&rAEISPInfo, sizeof(AE_ISP_INFO_T));//将上面更新的数据拷贝m_AEPerFrameInfo,ISP或者 Hal3A中可通过getAEInfo调用 …}
controlCPUExpoSetting()
设置当前帧的曝光参数, exp 、 afegain MRESULT AeMgr:: controlCPUExpoSetting (strAERealSetting &rAERealSetting, MBOOL bTriggerControlbyI2C) { //1 、保存当前和前两帧 AESetting 的 flicker 、 exp 、 afegain 、 ispgain 信息。 updateAESetting (rAERealSetting, UPDATE_QUEUE_AND_SETTING); if (!bTriggerControlbyI2C) { // bTriggerControlbyI2C 默认为 false AE_SETTING_CONTROL_INFO_T rAESetControlInfo; //2 、强制设置 capture 的 Evsetting 为最新的一个 EVSetting prepareSetControlParam (&rAESetControlInfo); //3 、向 sensorMgr 端设置, exposure time 和 Afegain m_pIAeSettingCPU-> updateExpoSetting ((MVOID*) &rAESetControlInfo); } else { // trigger control setting by updateSensorbyI2C() m_pIAeSettingCPU->controltrigger(E_AE_SETTING_CPU_SHUTTER, MTRUE); m_pIAeSettingCPU->controltrigger(E_AE_SETTING_CPU_SENSORGAIN, MTRUE); } return S_AE_OK; }
controlCPUSensorMaxFPS()
1. 设置 sensor 的 MaxFPS MRESULT AeMgr::controlCPUSensorMaxFPS(MUINT32 u4SensorMaxFPS, MBOOL bTriggerControlbyI2C) { m_u4UpdateFrameRate_x10 = u4SensorMaxFPS; if (!bTriggerControlbyI2C) { // trigger control setting immediately MUINT32 u4MaxFPS = m_u4UpdateFrameRate_x10; m_pIAeSettingCPU->updateSensorMaxFPS((MVOID*) &u4MaxFPS); } else { // trigger control setting by updateSensorbyI2C() m_pIAeSettingCPU->controltrigger (E_AE_SETTING_CPU_FRAMERATE, MTRUE); } }
if (m_eSettingType ==E_AE_SETTING_CPU) AEAlgo 计算类别判断
case:AE_FLOW_STATE_PREVIEW
controlCPUExpoSetting()
controlCPUSensorMaxFPS()
setLastResult2Algo()
调用 ae_algo_ctrl 返回最新的strAERealSetting 给局部变量last_result ,但并未使用到该变量 通过 m_pIAeFlowCPU->setLastResult2Algo(&last_result); 调用 ae_algo_ctrl((MUINT32)AE_ALGO_CTRL_SET_LAST_RESULT, m_eCamID, (void*)last_result, sizeof(AE_ALGO_CTRL_LAST_RESULT), 0, 0); 返回最新的 strAERealSetting 。但是局部变量 last_result 并未用到。
prepareAEInfoDelaySetting()
updateAEInfo2ISP()
exposure setting control Frame rate control
case:......
m_pFSMgr->framesync_ae_info( m_i4SensorIdx,&fs_ae_input);
通过执行 ccuControl 函数同步 ae info 。 bool FS_Mgr:: framesync_ae_info (int sensor_idx, fs_ae_result *ae_result) { ae_result-> sensor_idx = sensor_idx; ICcuCtrlExt *m_pCcuCtrl = (ICcuCtrlExt *)ICcuCtrlExt::getInstance(); m_pCcuCtrl-> ccuControl (CCU_FEATURE_FSCTRL, CCU_IMGSENSOR_SENSOR_IDX_MAIN, MSG_TO_CCU_FRAME_SYNC_SET_AE_INFO, ae_result, sizeof(fs_ae_result), NULL, 0); return true; }
if (!bAAASchedule)
ISP_AE_CONFIG_T::AEConfig_update
calculateCPUAE(bAAASchedule,bisSkipCalAE);
if(m_bEnableAE)
ISP_AE_CONFIG_T::AEConfig
会设置看 blockNum 为 120*90 ,以及一 些特殊参数,如 AAOSize 。
m_pIAeCalc->modifyHistogramWinConfig
if (m_pIAeCalc !=NULL)
if(m_eZoomWinInfo. bZoomChange== MTRUE)
setAEMgrStateCPU(AE_MGR_STATE_DOPVAE)
MBOOL AeMgr::setAEMgrStateCPU(MUINT32 u4AEMgrStateCPU) { if (m_u4AEMgrStateCPU != u4AEMgrStateCPU) { m_u4AEMgrStateCPU = u4AEMgrStateCPU; } return MFALSE; }
doPvAE
Start()
从 Hal3ARawImp:: ThreadAEStart 中启动 Start()
getSensorMaxFrameRate()
获取不同 sensormode 下的 max framerate 。切 sensormode 时, max framerate 将会改变。 max frame rate 是由 sensor driver 决定的, AE Pline 只决定 min frame rate 。 MRESULT AAASensorMgr:: getSensorMaxFrameRate (MINT32 i4SensorDev, MUINT32 rSensorMaxFrmRate[NSIspTuning::ESensorMode_NUM]) { SensorStaticInfo rSensorStaticInfo; IHalSensorList* const pIHalSensorList = MAKE_HalSensorList(); pIHalSensorList-> querySensorStaticInfo(i4SensorDev, &rSensorStaticInfo); rSensorMaxFrmRate[NSIspTuning:: ESensorMode_Preview ] = rSensorStaticInfo. previewFrameRate ; rSensorMaxFrmRate[NSIspTuning:: ESensorMode_Capture ] = rSensorStaticInfo. captureFrameRate ; …… }
getSensorDelayInfo()
通过 AAAsensorMgr 获取 shutter 、 sensorgain 、 ispgain 的 delayframe 等 staticInfo ,如 0,0,2 。 再计算下到 sensor 的 shutter 和 gain 值是拿第几帧的 AESetting ,默认是最新的。 code 表现 如, m_i4ShutterDelayFrames =0 。 delay frame for ae_mgr set Exp setting
getSensorResolution()
getSensorDynamicInfo()
modifyHistogramWinConfig 和初始化一些变量信息 m_pIAeCalc- > modifyHistogramWinConfig (eZoomWinInfo, &m_rAEStatCfg, m_u4Hbinwidth, m_u4Hbinheight,m_i4AETgValidBlockWidth, m_i4AETgValidBlockHeight); // 在 setSensorMode 时有设置 ISP_AE_CONFIG_T::getInstance(m_eSensorDev). AEConfig (&m_rAEStatCfg, &m_rAEConfigInfo, &m_sAEResultConfig); … m_bAEStable = MFALSE; m_bNeedCheckAEPline = MTRUE; m_bMainFlashON = MFALSE; … m_eAEState = (m_bAlgoAPAELock) ? MTK_CONTROL_AE_STATE_LOCKED : MTK_CONTROL_AE_STATE_SEARCHING; // add condion for ITS m_u4AEMgrStateCPU = m_u4AEMgrStateCCU = AE_MGR_STATE_INIT; … m_bSkipCalAE = MFALSE; m_bSkipAiShutterCalc = MFALSE;
AE statistics and histogram config
initializeCCU()
针对AAO统计值的配置进行初 始化和自定义,如hdr和tsf的 统计值是否可用的 flag 。 (CCU_AE_control_CFG_T 类型成 员 )
initializeCPUAE()
AE algo initialization information ,如 Ae plineInfo 的 Index 、 sensorMode 、 maxFps 、 deviceInfo 等。 /* AE algo type decision */ MINT32 i4CustomFlow = property_get_int32("vendor.debug.ae.custom.flow", 0); // 根据 algoType 选择使用 AEflowCPU 的 default 还是 custom if (i4CustomFlow) { // customizes AE algo, decided by sensor EEPROM m_eAlgoType = E_AE_ALGO_CPU_CUSTOM; m_eSettingType = E_AE_SETTING_CPU; initializeCPUAE(m_eAlgoType); startAESetting (m_eSettingType); } else { // default CPU AE algo m_eAlgoType = E_AE_ALGO_CPU_DEFAULT; m_eSettingType = E_AE_SETTING_CPU; initializeCPUAE(m_eAlgoType ); startAESetting (m_eSettingType); }
UpdateSensorISPParams()
AeMgr::UpdateSensorISPParams(AE_FLOW_STATE_T eAEFlowState, strAERealSetting &rAERealSetting, MBOOL bUpdateSESetting==TRUE)
getBinSumTransSetting()
customized transform function: binning sum transformation 获取 binSum 转换设置,并重新计算 shutter/gain
transSuperNightShot()
customized transform function: super night shot transforamtion
fill in m_rSensorCurrentInfo:AE setting before convert
保存当前传下来的 EVSetting ,如 exposure time 、 ISO ,备份操作。
remapping VHDR state()
根据 aeTargetMode 的类型重置 AE flow state
case:AE_FLOW_STATE_INIT
updateAESetting()
AeMgr::updateAESetting(strAERealSetting &rAERealSetting, UPDATE_AE_SETTING_TYPE update_type) ae_mgr_setting.cpp 1. 根据输入的 AESetting 设置 exposureMode 为 0 : exposure time 还 是 1 : exposure line 。 2. 保存当前和前两帧 AESetting 的 flicker 、 exp 、 afegain 、 ispgain 信息。 3. 若 AETargetMode 为 HDR 时,会保存长中短曝光的 AESetting 参数。 MRESULT AeMgr:: updateAESetting (strAERealSetting &rAERealSetting, UPDATE_AE_SETTING_TYPE update_type) { m_u4ExposureMode = rAERealSetting.u4ExposureMode ; if ( m_eAETargetMode == AE_MODE_NORMAL || m_eAETargetMode == AE_MODE_MSTREAM_VHDR_TARGET || m_eAETargetMode == AE_MODE_MSTREAM_VHDR_RTO1X_TARGET) { if (update_type & UPDATE_QUEUE_ONLY) {// MAX_AE_SETTING_NUM = 4 for (int i = MAX_AE_SETTING_NUM - 2 ; i >= 0; i--) {// 将旧的 AESetting 数据从数组中后移 m_u4AESettingFL[i+1] = m_u4AESettingFL[i]; m_u4AESettingEXP[i+1] = m_u4AESettingEXP[i]; m_u4AESettingAFE[i+1] = m_u4AESettingAFE[i]; m_u4AESettingISP[i+1] = m_u4AESettingISP[i]; } } if (update_type & UPDATE_SETTING_ONLY) { // 保存新的 AESetting 数据 m_u4AESettingFL[0] = rAERealSetting.u4Framelength; m_u4AESettingEXP[0 ] = rAERealSetting.EvSetting.u4Eposuretime; m_u4AESettingAFE[0 ] = rAERealSetting.EvSetting.u4AfeGain ; m_u4AESettingISP[0] = rAERealSetting.EvSetting.u4IspGain ; } … }
controltrigger()
1. 初始化启动 AESetting 向 sensorMgr 设置 shutter/gain 值的 flag 。 这些 flag 在 updateExpoSettingbyI2C 会作为 if 条件。 MVOID AeSettingDefault:: controltrigger (MUINT32 index, MBOOL btrigger) { E_AE_SETTING_CPU_TRIGER_T etrigger = (E_AE_SETTING_CPU_TRIGER_T) index; switch(etrigger){ … case E_AE_SETTING_CPU_SHUTTER: m_bSetShutterValue = btrigger; break; case E_AE_SETTING_CPU_SENSORGAIN: m_bSetGainValue = btrigger; break; … }
prepareAEInfoDelaySetting()
2. 获取 delayFrames 对应的 AESetting Info MRESULT AeMgr:: prepareAEInfoDelaySetting (strAERealSetting &rAERealSetting) { rAERealSetting.u4Framelength = m_u4AESettingFL [m_i4FrameLengthDelayFrames]; rAERealSetting.EvSetting.u4Eposuretime = m_u4AESettingEXP [ m_i4ShutterDelayFrames ]; rAERealSetting.EvSetting.u4AfeGain = m_u4AESettingAFE [m_i4SensorGainDelayFrames]; rAERealSetting.EvSetting.u4IspGain = m_u4AESettingISP [m_i4IspGainDelayFrames] ; return S_AE_OK; }
updateAEInfo2ISP()
向 ISP 传递 algo 和 ae_mgr 的数据: 从 aeAlgo 获取 AE_ISP_INFO_T 结构体的信息, 如, AETarget 、 FinerEVIdxBase 等; 从 AE_mgr 中获取 AE_ISP_INFO_T 结构体的信 息,如, Shutter 、 gain 值等。 MRESULTAeMgr::updateAEInfo2ISP(AE_FLOW_STATE_TeAEFlowState, strAERealSetting&rSettingBeforeConv,strAERealSetting&rSettingAfterConv, MBOOLbForceSetByCPU) { AE_INFO_T*pAEInfo2ISP; if(eAEFlowState==AE_FLOW_STATE_CAPTURE){//根据AE_Flow选择AESetting pAEInfo2ISP=&m_rAEInfoCapture; }else{ pAEInfo2ISP=&m_rAEInfoPreview;//aeAlgo输出的AE_INFO_T } …//UpdatefromNVram if(m_p3ANVRAM!=NULL){ u4ISOBase_1xGain=m_rAeHwCfg.iso_gain*m_u4BinSumRatio; ....//Updateinfotoisptuning AE_ISP_INFO_TrAEISPInfo; rAEISPInfo.u4AETarget=pAEInfo2ISP->u4AETarget; … rAEISPInfo.u4IndexFMax=m_u4IndexFMax; rAEISPInfo.u4IndexFMin=m_u4IndexFMin; … switch(eAEFlowState){ caseAE_FLOW_STATE_INIT: caseAE_FLOW_STATE_PREVIEW: caseAE_FLOW_STATE_MANUAL: rAEISPInfo.u4P1SensorGain=rSettingAfterConv.HdrEvSetting.i4LEAfeGain; …break;//更新shutter、gain、ISO值到ISP if(eAEFlowState==AE_FLOW_STATE_POSTCAP) … else{… memcpy(&(m_AEPerFrameInfo.rAEISPInfo),&rAEISPInfo, sizeof(AE_ISP_INFO_T));//将上面更新的数据拷贝m_AEPerFrameInfo,ISP或者 Hal3A中可通过getAEInfo调用 …}
controlCPUExpoSetting()
设置当前帧的曝光参数, exp 、 afegain MRESULT AeMgr:: controlCPUExpoSetting (strAERealSetting &rAERealSetting, MBOOL bTriggerControlbyI2C) { //1 、保存当前和前两帧 AESetting 的 flicker 、 exp 、 afegain 、 ispgain 信息。 updateAESetting (rAERealSetting, UPDATE_QUEUE_AND_SETTING); if (!bTriggerControlbyI2C) { // bTriggerControlbyI2C 默认为 false AE_SETTING_CONTROL_INFO_T rAESetControlInfo; //2 、强制设置 capture 的 Evsetting 为最新的一个 EVSetting prepareSetControlParam (&rAESetControlInfo); //3 、向 sensorMgr 端设置, exposure time 和 Afegain m_pIAeSettingCPU-> updateExpoSetting ((MVOID*) &rAESetControlInfo); } else { // trigger control setting by updateSensorbyI2C() m_pIAeSettingCPU->controltrigger(E_AE_SETTING_CPU_SHUTTER, MTRUE); m_pIAeSettingCPU->controltrigger(E_AE_SETTING_CPU_SENSORGAIN, MTRUE); } return S_AE_OK; }
controlCPUSensorMaxFPS()
1. 设置 sensor 的 MaxFPS MRESULT AeMgr::controlCPUSensorMaxFPS(MUINT32 u4SensorMaxFPS, MBOOL bTriggerControlbyI2C) { m_u4UpdateFrameRate_x10 = u4SensorMaxFPS; if (!bTriggerControlbyI2C) { // trigger control setting immediately MUINT32 u4MaxFPS = m_u4UpdateFrameRate_x10; m_pIAeSettingCPU->updateSensorMaxFPS((MVOID*) &u4MaxFPS); } else { // trigger control setting by updateSensorbyI2C() m_pIAeSettingCPU->controltrigger (E_AE_SETTING_CPU_FRAMERATE, MTRUE); } }
if (m_eSettingType ==E_AE_SETTING_CPU) AEAlgo 计算类别判断
case:AE_FLOW_STATE_PREVIEW
controlCPUExpoSetting()
controlCPUSensorMaxFPS()
setLastResult2Algo()
调用 ae_algo_ctrl 返回最新的strAERealSetting 给局部变量last_result ,但并未使用到该变量 通过 m_pIAeFlowCPU->setLastResult2Algo(&last_result); 调用 ae_algo_ctrl((MUINT32)AE_ALGO_CTRL_SET_LAST_RESULT, m_eCamID, (void*)last_result, sizeof(AE_ALGO_CTRL_LAST_RESULT), 0, 0); 返回最新的 strAERealSetting 。但是局部变量 last_result 并未用到。
prepareAEInfoDelaySetting()
updateAEInfo2ISP()
exposure setting control Frame rate control
case:......
frame sync mgr init
init 创建的 m_pFSMgr 对象,并将 ae_mgr 中的参数赋值给该对象,如 SensorIdx 、exposure time 等。
AiShutter Calc init
AEInit() 函数只是创建了 AI Shutter 的对象,这里表示初始化,如,对成员pDeviceInfo 进行赋值。
CCTDumpDeviceInfoSetting()
表示可利用 CCT 工具获取设备信息的函数,可以输出 deviceInfo 文件到设定的 文件路径。
getAEInitExpoSetting()
从 P1Node 下 Event enum 命令到 Hal3ARawImp 来执行 send3ACtrl 函数。
SetAETargetMode()
MRESULTAeMgr::SetAETargetMode(eAETargetMODE eAETargetMode,MINT32i4APPMode){ if((m_eAETargetMode!=eAETargetMode)||(m_i4APPMode!=i4APPMode)) { m_eAETargetMode=eAETargetMode; //以下code,会根据TargetMode的类型执行enableAEManualPline,若不 是normal则修改MaualPline,如, …. enableAEManualPline(EAEManualPline_Default,MFALSE); … enableAEManualPline(EAEManualPline_Video,MTRUE);//targetmode== AE_MODE_MSTREAM_VHDR_RTO1X_TARGET ….. m_bNeedCheckAEPline=MTRUE; …… } MRESULT AeMgr:: enableAEManualPline (EAEManualPline_T eAEManualPline, MBOOL bEnable) { if (!bEnable) { eAEManualPline = EAEManualPline_Default; } if (m_eAEManualPline != eAEManualPline) { m_eAEManualPline = eAEManualPline; m_bNeedCheckAEPline = MTRUE; // 重新设置启用的 ManualPline ,并 checkpline } return S_AE_OK; }
setSensorMode()
设置 sensorMode update window size ,如将输入 参数 sensor 的 width/height 赋值, TG AAO information 获取 AAO 相 关的 block 参数,用于后面输入 modifyHistogramWinConfig
setAEMinMaxFrameRate()
输入: setAEMinMaxFrameRate(LIB3A_AE_FRAMERATE_MODE_05FPS* 100, a_rAEInitExpoSetting.sensorCfg.framerate* 1000 ); MRESULT AeMgr:: setAEMinMaxFrameRate (MINT32 i4NewAEMinFps, MINT32 i4NewAEMaxFps) MINT32 i4NewMinFPS, i4NewMaxFPS, i4SensorMaxFPS; i4NewMinFPS = i4NewAEMinFps / 100; i4NewMaxFPS = i4NewAEMaxFps / 100; //1 、获取 sensor 支持的最大帧率,并使 FPS <=SensorMaxFPS i4SensorMaxFPS = m_rSensorMaxFrmRate [m_eSensorMode]; if (i4NewMaxFPS > i4SensorMaxFPS) { i4NewMaxFPS = i4SensorMaxFPS; } // 最小帧率为 5 if ((i4NewMinFPS < LIB3A_AE_FRAMERATE_MODE_05FPS ) || (i4NewMaxFPS > LIB3A_AE_FRAMERATE_MODE_MAX)) { AE_LOG("[%s()] Unsupport AE frame rate range:%d~%d\n", __FUNCTION__, i4NewMinFPS, i4NewMaxFPS); return S_AE_OK; } … if ((m_i4AEMinFps != i4NewMinFPS) || (m_i4AEMaxFps != i4NewMaxFPS)) { m_i4AEMinFps = i4NewMinFPS; m_i4AEMaxFps = i4NewMaxFPS; … m_bNeedCheckAEPline = MTRUE; //2 、 set max fps ,从 AESettingCPU 设置 max FPS 到 sensor controlCPUSensorMaxFPS(m_i4AEMaxFps, MFALSE); } return S_AE_OK;
checkAEPline()
在checkAEPline之后,会获得插值之后的 m_PreviewTableF和IndexF值,该函数的作用是将 获取的这些参数更新到曝光设定中。 若targetMode为VHDR模式,还会通过AEAlgo初 始化VHDR的exposuresetting。
updateAEidxtoExpsetting()
MRESULTAeMgr::updateAEidxtoExpsetting(MUINT32u4Index,MUINT32 u4IndexF){ if(m_pPreviewTableCurrent->pCurrentTable!=NULL){ if(m_bAdbAEPreviewUpdate){ //1、获取ADB的参数更新EVSetting } else{ //2、将插值后得到的PlineTable的IndexF对应的EVSetting赋值给Preview 的曝光设定 if(m_PreviewTableF.sPlineTable[0].u4Eposuretime!=0){ m_rAESettingPreview.EvSetting.u4Eposuretime= m_PreviewTableF.sPlineTable[u4IndexF].u4Eposuretime; m_rAESettingPreview.EvSetting.u4AfeGain= m_PreviewTableF.sPlineTable[u4IndexF].u4AfeGain; m_rAESettingPreview.EvSetting.u4IspGain= m_PreviewTableF.sPlineTable[u4IndexF].u4IspGain*(AE_GAIN_BASE_ISP/ 1024); } else{ //3、将没有插值处理的plineTable的Index对应的EVSetting赋值 m_rAESettingPreview.EvSetting.u4Eposuretime= m_pPreviewTableCurrent->pCurrentTable->sPlineTable[u4Index].u4Eposuretime; } }……. //4、calcuateISO MUINT32u4FinalGain; MUINT32u4PreviewBaseISO=m_rAeHwCfg.iso_gain; u4FinalGain= (m_rAESettingPreview.EvSetting.u4AfeGain*m_rAESettingPreview.EvSetting.u4Is pGain)/AE_GAIN_BASE_ISP;//TransferMicroDb2Gain(aeoutput- >EvSetting.u4AfeGain); m_rAESettingPreview.u4ISO= u4PreviewBaseISO*u4FinalGain/AE_GAIN_BASE_AFE; m_rAESettingPreview.u4Index=m_u4Index; m_rAESettingPreview.u4IndexF=m_u4IndexF; … }
getSensorBinningType()
在 ae Init exp setting 时获取 sensor binning sum transformation. Get m_u4BinSumRatio from tuning
getBinSumTransSetting()
Get getBinSumTransSetting to translate shutter/gain 在 remosaic 时,会调用 custom 函数根据 ratio 来 translate the shutter/gain. E.g. IMX471 UINT32 transBinSum_imx471mipiraw (VOID* const pData)
cameraPreviewInit()
在 Hal3ARawImp::init 中调用,执行 AE init ,同时该 init 函数还会执行 AWB/AF/Flash/Flicker init