Android 5.0 Camera系统源码分析(5):Camera预览3A流程(6)

2020-04-17 07:39

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(rBufInfo.virtAddr));

// (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(&_3A_profile)); } else {

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(rBufInfo.virtAddr),

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)\


Android 5.0 Camera系统源码分析(5):Camera预览3A流程(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:营建技术部工作职责

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: