1、Android 50 Camera系统源码分析5Camera预览3A流程Android 5.0 Camera系统源码分析(5):Camera预览3A流程1. 前言本文分析的是Android Hal层的源码,硬件平台基于mt6735。之前几篇讲的预览流程中3A相关的环节都忽略了,现在重新整理下。3A指的是Auto Exposure,Auto Focus,Auto White Balance。这三个一起放上来代码实在太多了,这里将重点记录AF的代码。AF的部分工作是由ISP完成的,而ISP的大部分代码mtk都没有开放给我们,比如ISP是如何计算得到对焦位置信息的,但得到对焦位置之后怎么操作对焦马达
2、的代码我们是看得到的,所以涉及到ISP的一些代码将被略过2. 初始化3A3A的初始化在DefaultCam1Device的onInit函数里面开始,之前在camera打开流程里面已经提到过boolDefaultCam1Device:onInit() . / (1) Open 3A mpHal3a = NS3A:IHal3A:createInstance( NS3A:IHal3A:E_Camera_1, getOpenId(), LOG_TAG); .构造一个Hal3A对象,看下Hal3A:createInstance的实现Hal3A*Hal3A:createInstance(MINT32 i4
3、SensorDevId, MINT32 i4SensorOpenIndex) switch (i4SensorDevId) case SENSOR_DEV_MAIN: Hal3ADev:getInstance()-init(i4SensorDevId, i4SensorOpenIndex); return Hal3ADev:getInstance(); break; case SENSOR_DEV_SUB: Hal3ADev:getInstance()-init(i4SensorDevId, i4SensorOpenIndex); return Hal3ADev:getInstance();
4、break; . 其实这里的Hal3A并没有直接继承IHal3A,也就是说从IHal3A:createInstance到Hal3A:createInstance的调用过程经历了一番波折,但暂时不用关心它。从Hal3A:createInstance可以看到除了实例化以外还会调用init函数。构造函数没什么好看的-略过,直接看init函数MRESULTHal3A:init(MINT32 i4SensorDevId, MINT32 i4SensorOpenIndex) . / (1) mpStateMgr = new StateMgr(i4SensorDevId); / (2) bRet = pos
5、tCommand(ECmd_Init); / (3) createThread(); / (4) bRet = IspTuningMgr:getInstance().init(m_i4SensorDev, m_i4SensorOpenIdx); / (5) ret = EnableAFThread(1); . return S_3A_OK;步骤(1) new StateMgr,构造函数如下StateMgr:StateMgr(MINT32 sensorDevId) : . #define STATE_INITIALIZE(_state_) mpIStateeState_#_state_ = ne
6、w State#_state_(sensorDevId, this); STATE_INITIALIZE(Init); STATE_INITIALIZE(Uninit); STATE_INITIALIZE(CameraPreview); STATE_INITIALIZE(CamcorderPreview); STATE_INITIALIZE(Recording); STATE_INITIALIZE(Precapture); STATE_INITIALIZE(Capture); STATE_INITIALIZE(AF); mpCurrentState = mpIStateeState_Unini
7、t;初始化3A的状态管理,将各个子状态都保存在mpIState数组里面,并将当前状态设置为Uninit状态步骤(2) postCommandMBOOL Hal3A:postCommand(ECmd_T const eCmd, MINTPTR const i4Arg) . ERROR_CHECK(mpStateMgr-sendCmd(eCmd) .MRESULT StateMgr:sendCmd(ECmd_T eCmd) Mutex:Autolock lock(m_Lock); EIntent_T eNewIntent = static_cast(eCmd); #define SEND_INTE
8、NT(_intent_) case _intent_: return mpCurrentState-sendIntent(intent2type(); switch (eNewIntent) SEND_INTENT(eIntent_CameraPreviewStart) SEND_INTENT(eIntent_CameraPreviewEnd) SEND_INTENT(eIntent_CaptureStart) SEND_INTENT(eIntent_CaptureEnd) SEND_INTENT(eIntent_RecordingStart) SEND_INTENT(eIntent_Reco
9、rdingEnd) SEND_INTENT(eIntent_AFUpdate) SEND_INTENT(eIntent_AFStart) SEND_INTENT(eIntent_AFEnd) SEND_INTENT(eIntent_Init) SEND_INTENT(eIntent_Uninit) return -1;从步骤(1)可以看出这里的mpCurrentState指向的是StateUninit对象,所以接着看StateUninit的sendIntent函数MRESULTStateUninit:sendIntent(intent2type) MY_LOG(StateUninit:send
10、Intent); / AAO DMA buffer init MINT32 i4SensorIdx = m_pHal3A-getSensorOpenIdx();if (ENABLE_3A_GENERAL & m_pHal3A-m_3ACtrlEnable) if (ENABLE_AAOBUF & m_pHal3A-m_3ACtrlEnable) / AAO DMA buffer init if (!IAAOBufMgr:getInstance().init(m_SensorDevId, i4SensorIdx) MY_ERR(IAAOBufMgr:getInstance().init() fa
11、il); return E_3A_ERR; if (!IAEBufMgr:getInstance().init(m_SensorDevId, i4SensorIdx) MY_ERR(IAEBufMgr:getInstance().init() fail); return E_3A_ERR; if (ENABLE_AFOBUF & m_pHal3A-m_3ACtrlEnable) / AFO DMA buffer init if (!IAFOBufMgr:getInstance().init(m_SensorDevId, i4SensorIdx) MY_ERR(IAFOBufMgr:getIns
12、tance().init() fail); return E_3A_ERR; / State transition: eState_Uninit - eState_Init m_pStateMgr-transitState(eState_Uninit, eState_Init); return S_3A_OK;做了一堆乱七八糟的初始化之后将3A状态从Uninit状态切换到Init状态步骤(3) createThread和步骤(5) EnableAFThreadMVOIDHal3A:createThread() . pthread_create(&mThread, NULL, onThreadL
13、oop, this); pthread_create(&mPDThread, NULL, PDThreadLoop, this); pthread_create(&mPDVCThread, NULL, PDVCThreadLoop, this); .MRESULT Hal3A:EnableAFThread(MINT32 a_bEnable) if (a_bEnable) if (mbAFThreadLoop= 0) . pthread_create(&mAFThread, &attr, AFThreadFunc, this); else . return ret;一共创建了4个线程,暂时只关心
14、onThreadLoop 和AFThreadFunc。onThreadLoop是3A主线程,负责接收处理命令;AFThreadFunc负责实时更新AF参数3. 处理PASS1_START_ISP事件前面的3A初始化做的事情并不多,更多的准备工作是在接收到PASS1_START_ISP事件之后做的,PASS1_START_ISP事件是在之前的Camera预览流程控制流中提到的Pass1Node的startHw函数里面发送MBOOLPass1NodeImpl:startHw(list & plPortCfg) . handleNotify(PASS1_START_ISP, newMagicNum,
15、 0); .3.1 DefaultCtrlNode接收处理PASS1_START_ISP事件Pass1Node发出的event将在DefaultCtrlNode的onNotify函数中接收处理MBOOLDefaultCtrlNodeImpl: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 P
16、ASS1_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-postCom
17、mand(rCmd.eCmd, reinterpret_cast(&rCmd.rParamIspProfile) MY_ERR(Cmd(%d) failed(0x%x), rCmd.eCmd, _this-getErrorCode(); AEE_ASSERT_3A_HAL(onThreadLoop postCommand fail(2).); onThreadLoop通过getCommand函数获取命令,获取到命令之后调用postCommand函数对命令进行处理再看一次postCommandMBOOL Hal3A:postCommand(ECmd_T const eCmd, MINTPTR c
18、onst 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函数会执行MV
19、OIDHal3A:createAEThread() pthread_create(&mAESenThread, NULL, AESensorThreadLoop, this);加上这个AESensorThreadLoop,需要关注的线程增加到了3个3.2 StateInit处理CameraPreviewStart命令继续看mpStateMgr-sendCmd函数。之前介绍过,它会把命令交给当前状态的sendIntent函数进行处理。在初始化阶段已经把当前状态切换到init状态,所以来看StateInit的sendIntent的实现MRESULTStateInit:sendIntent(inte
20、nt2type)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(IAAOBufMgr:getInstance().DMAInit() fail); return E_3A_ERR; if (!IAAOBufMgr:getInstance().AAStatEnable(m_Senso
21、rDevId, MTRUE) MY_ERR(IAAOBufMgr:getInstance().AAStatEnable() fail); return E_3A_ERR; if (!IAEBufMgr:getInstance().DMAInit(m_SensorDevId) MY_ERR(IAEBufMgr:getInstance().DMAInit() fail); return E_3A_ERR; if (!IAEBufMgr:getInstance().AAStatEnable(m_SensorDevId, MTRUE) MY_ERR(IAEBufMgr:getInstance().AA
22、StatEnable() fail); return E_3A_ERR; if (ENABLE_AFOBUF & m_pHal3A-m_3ACtrlEnable) / AFO DMAInit + AFStatEnable if (!IAFOBufMgr:getInstance().DMAInit(m_SensorDevId) MY_ERR(IAFOBufMgr:getInstance().DMAInit() fail); return E_3A_ERR; if (!IAFOBufMgr:getInstance().AFStatEnable(m_SensorDevId, MTRUE) MY_ER
23、R(IAFOBufMgr:getInstance().AFStatEnable() fail); 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_Senso
24、rDevId, i4SensorIdx, rParam); if (!bRet) MY_ERR(IAwbMgr:getInstance().PreviewInit() fail, PvMode = %dn, 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_SensorD
25、evId, i4SensorIdx, rParam) : IAeMgr:getInstance().camcorderPreviewInit(m_SensorDevId, i4SensorIdx, rParam); if (FAILED(err) MY_ERR(IAeMgr:getInstance().PreviewInit() fail, PvMode = %dn, m_pHal3A-get3APreviewMode(); return err; if (ENABLE_AF & m_pHal3A-m_3ACtrlEnable) / AF init err = IAfMgr:getInstan
26、ce().init(m_SensorDevId, i4SensorIdx); if (FAILED(err) MY_ERR(AfMgr:getInstance().init() failn); return err; IspTuningMgr:getInstance().sendIspTuningIOCtrl(m_SensorDevId, IspTuningMgr:E_ISPTUNING_SET_GMA_SCENARIO, IspTuningMgr:E_GMA_SCENARIO_PREVIEW, 0); IspTuningMgr:getInstance().sendIspTuningIOCtr
27、l(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); return S_3A_OK;包含了AWB、AE、AF在内的ISP相关的初始化,相关的初始化完成之后会调用m_pStateMgr
28、-transitState函数将当前状态切换到CameraPreview状态。代码太多,这里只关注AF的初始化MRESULT AfMgr:init(MINT32 i4SensorIdx, MINT32 isInitMCU) . / - init MCU - SensorStaticInfo rSensorStaticInfo; if (m_i4EnableAF = -1) IHalSensorList* const pIHalSensorList = IHalSensorList:get(); IHalSensor* pIHalSensor = pIHalSensorList-createSensor(af_mgr, m_i4SensorIdx); SensorDynamicInfo rSensorDynamicInfo; switch(m_i4CurrSensorDev) case ESensorDev_Main: pIHalSensorList-querySensorStaticInfo(NSCam:SENSOR_DEV_MAIN, &rSensorStaticInfo); pIHalSensor-querySensorDynamicInfo(NSCam:SENSOR_DEV_MAIN, &rSensorDynamicInf
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1