IAfMgr::getInstance().getAFRefWin(m_SensorDevId, rWinSize); rAeWinSize.i4Left =rWinSize.i4Left; rAeWinSize.i4Right =rWinSize.i4Right; rAeWinSize.i4Top =rWinSize.i4Top; rAeWinSize.i4Bottom=rWinSize.i4Bottom; rAeWinSize.i4Weight=rWinSize.i4Weight;
IAeMgr::getInstance().getAEMeteringYvalue(m_SensorDevId, rAeWinSize, &iYvalue);
// (2) get current AE info, and write to AF for reference.
IAeMgr::getInstance().getAEBlockYvalues(m_SensorDevId, rAEInfo.aeBlockV, 25); IAeMgr::getInstance().getPreviewParams(m_SensorDevId, rPreviewInfo); IAeMgr::getInstance().getRTParams(m_SensorDevId, AEFrameParam); rAEInfo.i4IsAEStable= IAeMgr::getInstance().IsAEStable(m_SensorDevId); rAEInfo.i4ISO=rPreviewInfo.u4RealISO;
rAEInfo.i4SceneLV=IAeMgr::getInstance().getLVvalue(m_SensorDevId,MTRUE); rAEInfo.iYvalue=(MINT64)iYwww.shanxiwang.netvalue;
rAEInfo.ishutterValue=AEFrameParam.u4PreviewShutterSpeed_us; ......
IAfMgr::getInstance().setAE2AFInfo(m_SensorDevId, rAEInfo);
// (3) doAF
IAfMgr::getInstance().doAF(m_SensorDevId, reinterpret_cast
// (4) Enqueue AFO DMA buffer
IAFOBufMgr::getInstance().enqueueHwBuf(m_SensorDevId, rBufInfo); ......
return S_3A_OK; }
直接看步骤(3)doAF函数吧,其它的步骤大部分是在为Algo设置参数,而Algo的代码不开放,所以也不知道设置的那些信息是做什么用的
MRESULT AfMgr::doAF(MVOID *pAFStatBuf) {
if (m_i4EnableAF == 0) {
m_sAFOutput.i4IsAFDone = 1; m_sAFOutput.i4IsFocused = 0; m_i4LastFocusModeTAF= FALSE; m_sAFOutput.i4AFPos = 0; mAFMgrInited = MTRUE; MY_LOG(\ return S_AF_OK;
}
//depth AF for algo data
m_DAF_TBL.curr_p1_frm_num=i4curFrmNum;
if(m_DAF_TBL.is_daf_run==1) m_sAFInput.i4HybridAFMode = 1; else m_sAFInput.i4HybridAFMode = 0;
if( m_PDAF_Sensor_Support_Mode==1 && m_PDBuf_Type==EPDBuf_Raw) m_sAFInput.i4HybridAFMode = 2; //2'b 0010
else if(m_PDAF_Sensor_Support_Mode==2 && m_PDBuf_Type==EPDBuf_VC) m_sAFInput.i4HybridAFMode = 2; //2'b 1010
else if(m_PDAF_Sensor_Support_Mode==2 && m_PDBuf_Type==EPDBuf_VC_Open) m_sAFInput.i4HybridAFMode = 10; //2'b 1010
if(m_DAF_TBL.is_daf_run==1) {
m_sAFInput.i4CurrP1FrmNum = i4curFrmNum; if(m_next_query_FrmNum == 0xFFFFFFFF) {
m_sAFInput.i4DafDacIndex = 0; m_sAFInput.i4DafConfidence = 0; } else {
m_sAFInput.i4DafDacIndex = m_DAF_TBL.daf_vec[m_next_query_FrmNum % DAF_TBL_QLEN].daf_dac_index;
m_sAFInput.i4DafConfidence= m_DAF_TBL.daf_vec[m_next_query_FrmNum % DAF_TBL_QLEN].daf_confidence; }
MY_LOG(\[cp1#]%d [cp2#]%d [nextF#]%d [DafDac]%d [DafConf]%d [daf_dist]%d\\n\
(MINT32)m_sAFInput.i4HybridAFMode, (MINT32)m_sAFInput.i4CurrP1FrmNum, (MINT32)m_DAF_TBL.curr_p2_frm_num, (MINT32)m_next_query_FrmNum, (MINT32)m_sAFInput.i4DafDacIndex, (MINT32)m_sAFInput.i4DafConfidence,
m_DAF_TBL.daf_vec[m_next_query_FrmNum % DAF_TBL_QLEN].daf_distance);
if(m_DAF_TBL.daf_vec[m_next_query_FrmNum % DAF_TBL_QLEN].daf_confidence) {
MY_LOG(\%d\\n\m_daf_distance, m_DAF_TBL.daf_vec[m_next_query_FrmNum % DAF_TBL_QLEN].daf_confidence);
m_daf_distance = (MINT32)m_DAF_TBL.daf_vec[m_next_query_FrmNum % DAF_TBL_QLEN].daf_distance; } }
//PDAF ......
//handle AF if (m_pIAfAlgo)
m_pIAfAlgo->handleAF(m_sAFInput, m_sAFOutput);
//move AF
m_pMcuDrv->moveMCU(m_sAFOutput.i4AFPos,m_i4CurrSensorDev);
//set AF info to IspTuning AF_INFO_T sAFInfo;
sAFInfo.i4AFPos = m_sAFOutput.i4AFPos;
IspTuningMgr::getInstance().setAFInfo(m_i4CurrSensorDev, sAFInfo);
return S_AF_OK; }
这个函数的代码还挺多的,看不懂的代码就不贴上来了。其中大部分代码都是为了第57行m_pIAfAlgo->handleAF函数做准备,也就是设置m_sAFInput参数。m_pIAfAlgo->handleAF会计算得到对焦位置信息并保存在m_sAFOutput参数里面,当然algo的代码我们看不到。得到对焦位置信息之后会调用m_pMcuDrv->moveMCU函数来移动对焦马达,也就是第60行,这个函数之前已经分析过了。最后第65行需要把对焦信息设置到Isp Tuning里面。
就这样AFThreadFunc通过一个死循环等待ISP中断,然后计算出对焦位置并通知镜头驱动移动对焦马达
5. 实时更新AE
在上一篇文章里提到过,Pass1Node每deque一帧数据就会发出PASS1_EOF事件来更新3A,这个事件同样由DefaultCtrlNode的onNotify函数接收处理
5.1 处理PASS1_EOF事件
MBOOL
DefaultCtrlNodeImpl::
onNotify(MUINT32 const msg, MUINT32 const ext1, MUINT32 const ext2) {
......
switch(msg) {
......
case PASS1_EOF: { {
Mutex::Autolock _l(mLock); //
if( mpHal3a &&
getFlag(muStateFlag, FLAG_DO_3A_UPDATE) && // to avoid send update after precaptrue-end
ext1 != MAGIC_NUM_INVALID ) {
MUINT32 zoomRatio = 0, cropX = 0, cropY = 0, cropW = 0, cropH = 0;
if(mpIspSyncCtrl->getCurPass2ZoomInfo(zoomRatio,cropX,cropY,cropW,cropH)) {
mpHal3a->setZoom(
zoomRatio, cropX, cropY, cropW, cropH); }
//do 3A update
mCurMagicNum = ext1;
ParamIspProfile_T _3A_profile( mIspProfile,
mCurMagicNum, MTRUE,
ParamIspProfile_T::EParamValidate_All); mpHal3a->sendCommand(ECmd_Update, reinterpret_cast
MY_LOGD(\ } } ...... break; }
default: {
ret = MTRUE; } }
return ret; }
第37行,向Hal3A发送update命令。和之前的AFUpdate命令一样,由Hal3A的postCommand函数接收命令,它再将命令转发给3A的当前状态,也就是CameraPreview状态处理
MRESULT
StateCameraPreview::
sendIntent(intent2type
......
// update AE
MBOOL isNeedUpdateI2C;
IAeMgr::getInstance().doPvAEmonitor(m_SensorDevId, m_pStateMgr->getFrameCount(), reinterpret_cast
m_pScheduler->jobAssignAndTimerStart(E_Job_AeFlare), 1, m_pScheduler->isSlowMotion(), isNeedUpdateI2C);
MBOOL isSlowMotionUpdateI2C;
isSlowMotionUpdateI2C = m_pScheduler->jobAssignAndTimerStart(E_Job_AeFlare) && m_pScheduler->isSlowMotion();
if(isNeedUpdateI2C || isSlowMotionUpdateI2C) {
MY_LOG_IF(fgLogEn, \postToAESenThread : wait to update I2C (%d, %d)\
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android 5.0 Camera系统源码分析(5):Camera预览3A流程(6)在线全文阅读。
相关推荐: