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

2019-01-12 15:58

3. 处理PASS1_START_ISP事件

前面的3A初始化做的事情并不多,更多的准备工作是在接收到PASS1_START_ISP事件之后做的,PASS1_START_ISP事件是在之前的Camera预览流程控制流中提到的Pass1Node的startHw函数里面发送

MBOOL

Pass1NodeImpl::

startHw(list & plPortCfg) {

......

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(&rCmd.rParamIspProfile))) {

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


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

下一篇:合肥板材品牌哪家好?板材的种类有哪些?

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

马上注册会员

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