ImageVerifierCode 换一换
格式:DOCX , 页数:40 ,大小:150.50KB ,
资源ID:4913130      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4913130.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Android 50 Camera系统源码分析5Camera预览3A流程.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Android 50 Camera系统源码分析5Camera预览3A流程.docx

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