__FUNCTION__, isNeedUpdateI2C, isSlowMotionUpdateI2C); m_pHal3A->postToAESenThread(MFALSE); }
IAeMgr::getInstance().doPvAE(m_SensorDevId, m_pStateMgr->getFrameCount(), reinterpret_cast
m_pScheduler->jobAssignAndTimerStart(E_Job_AeFlare), 1, m_pScheduler->isSlowMotion());
m_pScheduler->jobTimerEnd(E_Job_AeFlare); if (isNeedUpdateI2C || isSlowMotionUpdateI2C) {
MY_LOG_IF(fgLogEn, \postToAESenThread : ready to update I2C\__FUNCTION__);
m_pHal3A->postToAESenThread(MTRUE); }
IspTuningMgr::GMA_AE_DYNAMIC_INFO dynamicInfo;
dynamicInfo.bStable = IAeMgr::getInstance().IsAEStable(m_SensorDevId); IspTuningMgr::getInstance().sendIspTuningIOCtrl(m_SensorDevId,
IspTuningMgr::E_ISPTUNING_SET_GMA_AE_DYNAMIC, (MINTPTR)&dynamicInfo, 0);
// workaround for iVHDR MUINT32 u4AFSGG1Gain;
IAeMgr::getInstance().getAESGG1Gain(m_SensorDevId, &u4AFSGG1Gain); IAfMgr::getInstance().setSGGPGN(m_SensorDevId, (MINT32) u4AFSGG1Gain);
MY_LOG_IF(fgLogEn, \doPvAE done\\n\
// update AWB
if (m_pScheduler->jobAssignAndTimerStart(E_Job_Awb))
IAwbMgr::getInstance().doPvAWB(m_SensorDevId, m_pStateMgr->getFrameCount(), bAEStable, i4AoeCompLv, reinterpret_cast
return S_3A_OK; }
这个函数也是长得不要不要的,它除了更新了AE、AWB参数外,还更新了其他图像参数,但这里只关注AE。乱七八糟的代码略过,看第22行doPvAE函数的实现
MRESULT AeMgr::doPvAE(MINT32 i4FrameCount, MVOID *pAEStatBuf, MINT32 i4ActiveAEItem, MUINT32 u4AAOUpdate, MBOOL bAAASchedule) {
strAEInput rAEInput; strAEOutput rAEOutput;
......
rAEInput.pAESatisticBuffer = pAEStatBuf;
rAEInput.eAeTargetMode = m_eAETargetMode; if(m_pIAeAlgo != NULL) {
if(m_bRestoreAE == MFALSE) {
AaaTimer localTimer(\m_eSensorDev, (m_3ALogEnable & EN_3A_SCHEDULE_LOG));
m_pIAeAlgo->handleAE(&rAEInput, &rAEOutput); localTimer.End();
copyAEInfo2mgr(&m_rAEOutput.rPreviewMode, &rAEOutput); m_rAEOutput.rCaptureMode[0] = m_rAEOutput.rPreviewMode;
mPreviewMode = m_rAEOutput.rPreviewMode; m_i4WaitVDNum = 0; // reset the delay frame if((rAEInput.eAeState == AE_STATE_NORMAL_PREVIEW) || (rAEInput.eAeState == AE_STATE_ONE_SHOT)) {
m_bAEStable = rAEOutput.bAEStable; m_bAEMonitorStable = m_bAEStable; } } else {
bRestore=1;
m_bRestoreAE = MFALSE;
MY_LOG(\ } } else {
MY_LOG(\The AE algo class is NULL i4SensorDev = %d line:%d\__FUNCTION__, m_eSensorDev, __LINE__); }
......
if ((i4ActiveItem & E_AE_AE_APPLY) || (bApplyAE == MTRUE)){ // apply AE UpdateSensorISPParams(AE_AUTO_FRAMERATE_STATE); } ......
return S_AE_OK;
}
第13行,调用m_pIAeAlgo->handleAE函数计算AE相关的参数,包括曝光时间和亮度的Gain值
第19行,将得到的AE参数保存到mPreviewMode变量中
第36行,获取到AE参数之后调用UpdateSensorISPParams函数更新sensor和ISP的参数
MRESULT AeMgr::UpdateSensorISPParams(AE_STATE_T eNewAEState) {
MRESULT err;
AE_INFO_T rAEInfo2ISP; MUINT32 u4IndexRatio;
m_AEState = eNewAEState;
switch(eNewAEState) {
case AE_INIT_STATE: case AE_REINIT_STATE: ......
case AE_AUTO_FRAMERATE_STATE: case AE_MANUAL_FRAMERATE_STATE: if(m_pIAeAlgo != NULL) {
m_pIAeAlgo->getAEInfoForISP(rAEInfo2ISP, LIB3A_SENSOR_MODE_PRVIEW);
rAEInfo2ISP.i4GammaIdx = m_i4GammaIdx; rAEInfo2ISP.i4LESE_Ratio = m_i4LESE_Ratio; rAEInfo2ISP.u4SWHDR_SE = m_u4SWHDR_SE; rAEInfo2ISP.u4MaxISO m_u4MaxISO*m_rAEPLineLimitation.u4IncreaseISO_x100/100;
rAEInfo2ISP.u4AEStableCnt = m_u4StableCnt; }
rAEInfo2ISP.u4Eposuretime = mPreviewMode.u4Eposuretime; rAEInfo2ISP.u4AfeGain = mPreviewMode.u4AfeGain; rAEInfo2ISP.u4IspGain = mPreviewMode.u4IspGain; rAEInfo2ISP.u4EVRatio m_rAEInitInput.rAEPARAM.pEVValueArray[m_eAEEVcomp];
if(m_i4WaitVDNum <= m_i4IspGainDelayFrames) { if(m_i4WaitVDNum == m_i4ShutterDelayFrames) { m_bSetShutterValue = MTRUE;
m_u4UpdateShutterValue = mPreviewMode.u4Eposuretime;
= = m_u4PrevExposureTime = mPreviewMode.u4Eposuretime; }
if(m_i4WaitVDNum == m_i4SensorGainDelayFrames) { m_bSetGainValue = MTRUE;
m_u4UpdateGainValue = mPreviewMode.u4AfeGain; m_u4PrevSensorGain = mPreviewMode.u4AfeGain; }
IspTuningMgr::getInstance().setIspFlareGainOffset((ESensorDev_T)m_eSensorDev, mPreviewMode.i2FlareGain, (-1*mPreviewMode.i2FlareOffset));
IspTuningMgr::getInstance().setAEInfo((ESensorDev_T)m_eSensorDev, rAEInfo2ISP);
if(m_i4WaitVDNum == m_i4IspGainDelayFrames) {
IspTuningMgr::getInstance().setISPAEGain((ESensorDev_T)m_eSensorDev, MFALSE, mPreviewMode.u4IspGain>>1);
m_AEState = eNewAEState; } }
break;
case AE_AF_STATE: ...... default: break; }
return S_AE_OK; }
第32-41行,把曝光时间和Gain值保存下来,后面会用到
第47行,将保存在mPreviewMode里的Gain值设置到Isp Tuning里面去,Isp Tuning的重点代码不开放,再往下跟已经没有意义了
还没结束,这里只更新了ISP的参数,并没有更新Sensor的参数
5.2 AESensorThreadLoop函数分析
之前提到有3个重点关注的线程,剩下最后一个了
MVOID*
Hal3A::AESensorThreadLoop(MVOID *arg) {
......
// (2) thread-in-loop while(1) {
MY_LOG_IF(fgLogEn, \ _this->waitVSirq();
MY_LOG_IF(fgLogEn, \
......
MY_LOG_IF(fgLogEn, \ IAeMgr::getInstance().updateSensorbyI2C(_this->m_i4SensorDev);
MY_LOG_IF(fgLogEn, \
}
return NULL; }
和之前的AF线程一样,通过一个死循环不断去捕获中断。捕获到中断之后调用updateSensorbyI2C函数进行处理
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android 5.0 Camera系统源码分析(5):Camera预览3A流程(7)在线全文阅读。
相关推荐: