3. 处理PASS1_START_ISP事件
前面的3A初始化做的事情并不多,更多的准备工作是在接收到PASS1_START_ISP事件之后做的,PASS1_START_ISP事件是在之前的Camera预览流程控制流中提到的Pass1Node的startHw函数里面发送
MBOOL
Pass1NodeImpl::
startHw(list
......
handleNotify(PASS1_START_ISP, newMagicNum, 0); ...... }
3.1 DefaultCtrlNode接收处理PASS1_START_ISP事件
Pass1Node发出的event将在DefaultCtrlNode的onNotify函数中接收处理
MBOOL
DefaultCtrlNodeImpl::
onNotify(MUINT32 const msg, MUINT32 const ext1, MUINT32 const ext2) {
switch(msg)
{
case PASS1_START_ISP: {
if(mpHal3a) {
cmd = ECmd_CameraPreviewStart; ......
mpHal3a->sendCommand(cmd); }
case PASS1_STOP_ISP: {
...... }
case PASS1_EOF: {
...... }
default: {
ret = MTRUE; } }
return ret; }
Hal3a的sendCommand函数会把命令加入到命令队列,然后由主线程onThreadLoop获取
MVOID*
Hal3A::onThreadLoop(MVOID *arg) {
while (_this->getCommand(rCmd, bGetCmd, MFALSE)) {
switch (rCmd.eCmd) {
case ECmd_PrecaptureStart: {
...... }
case ECmd_Update: {
...... }
default: if ( ! _this->postCommand(rCmd.eCmd,
reinterpret_cast
MY_ERR(\failed(0x%x)\rCmd.eCmd, _this->getErrorCode());
AEE_ASSERT_3A_HAL(\ } } } }
onThreadLoop通过getCommand函数获取命令,获取到命令之后调用postCommand函数对命令进行处理
再看一次postCommand
MBOOL Hal3A::postCommand(ECmd_T const eCmd, MINTPTR const i4Arg) {
if( eCmd == ECmd_CameraPreviewStart || eCmd == ECmd_CaptureStart) {
mbEnAESenThd = MTRUE; createAEThread();
mEnFlushVSIrq = mFlushVSIrqDone = 0; mEnFlushAFIrq = mFlushAFIrqDone = 0; }
......
ERROR_CHECK(mpStateMgr->sendCmd(eCmd)) ......
return MTRUE; }
接收到的命令是ECmd_CameraPreviewStart,所以这里的createAEThread函数会执行
MVOID
Hal3A::createAEThread() {
pthread_create(&mAESenThread, NULL, AESensorThreadLoop, this); }
加上这个AESensorThreadLoop,需要关注的线程增加到了3个
3.2 StateInit处理CameraPreviewStart命令
继续看mpStateMgr->sendCmd函数。之前介绍过,它会把命令交给当前状态的sendIntent函数进行处理。在初始化阶段已经把当前状态切换到init状态,所以来看StateInit的sendIntent的实现
MRESULT StateInit::
sendIntent(intent2type
if (ENABLE_3A_GENERAL & m_pHal3A->m_3ACtrlEnable) { if (ENABLE_AAOBUF & m_pHal3A->m_3ACtrlEnable) { // AAO DMAInit + AAStatEnable
if (!IAAOBufMgr::getInstance().DMAInit(m_SensorDevId)) { MY_ERR(\ return E_3A_ERR; }
if (!IAAOBufMgr::getInstance().AAStatEnable(m_SensorDevId, MTRUE)) { MY_ERR(\ return E_3A_ERR; }
if (!IAEBufMgr::getInstance().DMAInit(m_SensorDevId)) { MY_ERR(\ return E_3A_ERR; }
if (!IAEBufMgr::getInstance().AAStatEnable(m_SensorDevId, MTRUE)) { MY_ERR(\ return E_3A_ERR; } }
if (ENABLE_AFOBUF & m_pHal3A->m_3ACtrlEnable) { // AFO DMAInit + AFStatEnable
if (!IAFOBufMgr::getInstance().DMAInit(m_SensorDevId)) { MY_ERR(\ return E_3A_ERR; }
if (!IAFOBufMgr::getInstance().AFStatEnable(m_SensorDevId, MTRUE)) { MY_ERR(\ return E_3A_ERR; } }
......
if (ENABLE_AWB & m_pHal3A->m_3ACtrlEnable) { // AWB init
bRet = (m_pHal3A->get3APreviewMode() == EPv_Normal)
? IAwbMgr::getInstance().cameraPreviewInit(m_SensorDevId, i4SensorIdx, rParam) : IAwbMgr::getInstance().camcorderPreviewInit(m_SensorDevId, i4SensorIdx, rParam); if (!bRet) {
MY_ERR(\fail, PvMode = %d\\n\m_pHal3A->get3APreviewMode()); return E_3A_ERR; } }
if (ENABLE_AE & m_pHal3A->m_3ACtrlEnable) { // AE init
err = (m_pHal3A->get3APreviewMode() == EPv_Normal)
? IAeMgr::getInstance().cameraPreviewInit(m_SensorDevId, i4SensorIdx, rParam) : IAeMgr::getInstance().camcorderPreviewInit(m_SensorDevId, i4SensorIdx, rParam); if (FAILED(err)) {
MY_ERR(\fail, PvMode = %d\\n\m_pHal3A->get3APreviewMode()); return err; } }
if (ENABLE_AF & m_pHal3A->m_3ACtrlEnable) { // AF init
err = IAfMgr::getInstance().init(m_SensorDevId, i4SensorIdx); if (FAILED(err)) {
MY_ERR(\ return err; } }
IspTuningMgr::getInstance().sendIspTuningIOCtrl(m_SensorDevId, IspTuningMgr::E_ISPTUNING_SET_GMA_SCENARIO, IspTuningMgr::E_GMA_SCENARIO_PREVIEW, 0);
IspTuningMgr::getInstance().sendIspTuningIOCtrl(m_SensorDevId, IspTuningMgr::E_ISPTUNING_NOTIFY_START, 0, 0);
// Reset frame count to -2
m_pStateMgr->resetFrameCount();
// State transition: eState_Init --> eState_CameraPreview
m_pStateMgr->transitState(eState_Init, eState_CameraPreview);