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

上传人:b****4 文档编号:4913130 上传时间:2022-12-11 格式:DOCX 页数:40 大小:150.50KB
下载 相关 举报
Android 50 Camera系统源码分析5Camera预览3A流程.docx_第1页
第1页 / 共40页
Android 50 Camera系统源码分析5Camera预览3A流程.docx_第2页
第2页 / 共40页
Android 50 Camera系统源码分析5Camera预览3A流程.docx_第3页
第3页 / 共40页
Android 50 Camera系统源码分析5Camera预览3A流程.docx_第4页
第4页 / 共40页
Android 50 Camera系统源码分析5Camera预览3A流程.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

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

《Android 50 Camera系统源码分析5Camera预览3A流程.docx》由会员分享,可在线阅读,更多相关《Android 50 Camera系统源码分析5Camera预览3A流程.docx(40页珍藏版)》请在冰豆网上搜索。

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

Android50Camera系统源码分析5Camera预览3A流程

Android5.0Camera系统源码分析(5):

Camera预览3A流程

1.前言

本文分析的是AndroidHal层的源码,硬件平台基于mt6735。

之前几篇讲的预览流程中3A相关的环节都忽略了,现在重新整理下。

3A指的是AutoExposure,AutoFocus,AutoWhiteBalance。

这三个一起放上来代码实在太多了,这里将重点记录AF的代码。

AF的部分工作是由ISP完成的,而ISP的大部分代码mtk都没有开放给我们,比如ISP是如何计算得到对焦位置信息的,但得到对焦位置之后怎么操作对焦马达的代码我们是看得到的,所以涉及到ISP的一些代码将被略过

2.初始化3A

3A的初始化在DefaultCam1Device的onInit函数里面开始,之前在camera打开流程里面已经提到过

bool

DefaultCam1Device:

:

onInit()

{

......

//

(1)Open3A

mpHal3a=NS3A:

:

IHal3A:

:

createInstance(

NS3A:

:

IHal3A:

:

E_Camera_1,

getOpenId(),

LOG_TAG);

......

}

构造一个Hal3A对象,看下Hal3A:

:

createInstance的实现

Hal3A*

Hal3A:

:

createInstance(MINT32i4SensorDevId,MINT32i4SensorOpenIndex)

{

switch(i4SensorDevId)

{

caseSENSOR_DEV_MAIN:

Hal3ADev:

:

getInstance()->init(i4SensorDevId,i4SensorOpenIndex);

returnHal3ADev:

:

getInstance();

break;

caseSENSOR_DEV_SUB:

Hal3ADev:

:

getInstance()->init(i4SensorDevId,i4SensorOpenIndex);

returnHal3ADev:

:

getInstance();

break;

......

}

}

其实这里的Hal3A并没有直接继承IHal3A,也就是说从IHal3A:

:

createInstance到Hal3A:

:

createInstance的调用过程经历了一番波折,但暂时不用关心它。

从Hal3A:

:

createInstance可以看到除了实例化以外还会调用init函数。

构造函数没什么好看的-略过,直接看init函数

MRESULT

Hal3A:

:

init(MINT32i4SensorDevId,MINT32i4SensorOpenIndex)

{

......

//

(1)

mpStateMgr=newStateMgr(i4SensorDevId);

//

(2)

bRet=postCommand(ECmd_Init);

//(3)

createThread();

//(4)

bRet=IspTuningMgr:

:

getInstance().init(m_i4SensorDev,m_i4SensorOpenIdx);

//(5)

ret=EnableAFThread

(1);

......

returnS_3A_OK;

}

步骤

(1)newStateMgr,构造函数如下

StateMgr:

:

StateMgr(MINT32sensorDevId)

:

......

{

#defineSTATE_INITIALIZE(_state_)\

mpIState[eState_##_state_]=newState##_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=mpIState[eState_Uninit];

}

初始化3A的状态管理,将各个子状态都保存在mpIState数组里面,并将当前状态设置为Uninit状态

步骤

(2)postCommand

MBOOLHal3A:

:

postCommand(ECmd_TconsteCmd,MINTPTRconsti4Arg)

{

......

ERROR_CHECK(mpStateMgr->sendCmd(eCmd))

......

}

MRESULTStateMgr:

:

sendCmd(ECmd_TeCmd)

{

Mutex:

:

Autolocklock(m_Lock);

EIntent_TeNewIntent=static_cast(eCmd);

#defineSEND_INTENT(_intent_)\

case_intent_:

returnmpCurrentState->sendIntent(intent2type<_intent_>());\

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

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函数

MRESULT

StateUninit:

:

sendIntent(intent2type

{

MY_LOG("[StateUninit:

:

sendIntent]");

//AAODMAbufferinit

MINT32i4SensorIdx=m_pHal3A->getSensorOpenIdx();

if(ENABLE_3A_GENERAL&m_pHal3A->m_3ACtrlEnable){

if(ENABLE_AAOBUF&m_pHal3A->m_3ACtrlEnable){

//AAODMAbufferinit

if(!

IAAOBufMgr:

:

getInstance().init(m_SensorDevId,i4SensorIdx)){

MY_ERR("IAAOBufMgr:

:

getInstance().init()fail");

returnE_3A_ERR;

}

if(!

IAEBufMgr:

:

getInstance().init(m_SensorDevId,i4SensorIdx)){

MY_ERR("IAEBufMgr:

:

getInstance().init()fail");

returnE_3A_ERR;

}

}

if(ENABLE_AFOBUF&m_pHal3A->m_3ACtrlEnable){

//AFODMAbufferinit

if(!

IAFOBufMgr:

:

getInstance().init(m_SensorDevId,i4SensorIdx)){

MY_ERR("IAFOBufMgr:

:

getInstance().init()fail");

returnE_3A_ERR;

}

}

}

//Statetransition:

eState_Uninit-->eState_Init

m_pStateMgr->transitState(eState_Uninit,eState_Init);

returnS_3A_OK;

}

做了一堆乱七八糟的初始化之后将3A状态从Uninit状态切换到Init状态

步骤(3)createThread和步骤(5)EnableAFThread

MVOID

Hal3A:

:

createThread()

{

......

pthread_create(&mThread,NULL,onThreadLoop,this);

pthread_create(&mPDThread,NULL,PDThreadLoop,this);

pthread_create(&mPDVCThread,NULL,PDVCThreadLoop,this);

......

}

MRESULTHal3A:

:

EnableAFThread(MINT32a_bEnable)

{

if(a_bEnable){

if(mbAFThreadLoop==0)

{

......

pthread_create(&mAFThread,&attr,AFThreadFunc,this);

}

}else{

......

}

returnret;

}

一共创建了4个线程,暂时只关心onThreadLoop和AFThreadFunc。

onThreadLoop是3A主线程,负责接收处理命令;AFThreadFunc负责实时更新AF参数

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.1DefaultCtrlNode接收处理PASS1_START_ISP事件

Pass1Node发出的event将在DefaultCtrlNode的onNotify函数中接收处理

MBOOL

DefaultCtrlNodeImpl:

:

onNotify(MUINT32constmsg,MUINT32constext1,MUINT32constext2)

{

switch(msg)

{

casePASS1_START_ISP:

{

if(mpHal3a)

{

cmd=ECmd_CameraPreviewStart;

......

mpHal3a->sendCommand(cmd);

}

casePASS1_STOP_ISP:

{

......

}

casePASS1_EOF:

{

......

}

default:

{

ret=MTRUE;

}

}

returnret;

}

Hal3a的sendCommand函数会把命令加入到命令队列,然后由主线程onThreadLoop获取

MVOID*

Hal3A:

:

onThreadLoop(MVOID*arg)

{

while(_this->getCommand(rCmd,bGetCmd,MFALSE))

{

switch(rCmd.eCmd)

{

caseECmd_PrecaptureStart:

{

......

}

caseECmd_Update:

{

......

}

default:

if(!

_this->postCommand(rCmd.eCmd,reinterpret_cast(&rCmd.rParamIspProfile)))

{

MY_ERR("Cmd(%d)failed(0x%x)",rCmd.eCmd,_this->getErrorCode());

AEE_ASSERT_3A_HAL("onThreadLooppostCommandfail

(2).");

}

}

}

}

onThreadLoop通过getCommand函数获取命令,获取到命令之后调用postCommand函数对命令进行处理

再看一次postCommand

MBOOLHal3A:

:

postCommand(ECmd_TconsteCmd,MINTPTRconsti4Arg)

{

if(eCmd==ECmd_CameraPreviewStart||eCmd==ECmd_CaptureStart)

{

mbEnAESenThd=MTRUE;

createAEThread();

mEnFlushVSIrq=mFlushVSIrqDone=0;

mEnFlushAFIrq=mFlushAFIrqDone=0;

}

......

ERROR_CHECK(mpStateMgr->sendCmd(eCmd))

......

returnMTRUE;

}

接收到的命令是ECmd_CameraPreviewStart,所以这里的createAEThread函数会执行

MVOID

Hal3A:

:

createAEThread()

{

pthread_create(&mAESenThread,NULL,AESensorThreadLoop,this);

}

加上这个AESensorThreadLoop,需要关注的线程增加到了3个

3.2StateInit处理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){

//AAODMAInit+AAStatEnable

if(!

IAAOBufMgr:

:

getInstance().DMAInit(m_SensorDevId)){

MY_ERR("IAAOBufMgr:

:

getInstance().DMAInit()fail");

returnE_3A_ERR;

}

if(!

IAAOBufMgr:

:

getInstance().AAStatEnable(m_SensorDevId,MTRUE)){

MY_ERR("IAAOBufMgr:

:

getInstance().AAStatEnable()fail");

returnE_3A_ERR;

}

if(!

IAEBufMgr:

:

getInstance().DMAInit(m_SensorDevId)){

MY_ERR("IAEBufMgr:

:

getInstance().DMAInit()fail");

returnE_3A_ERR;

}

if(!

IAEBufMgr:

:

getInstance().AAStatEnable(m_SensorDevId,MTRUE)){

MY_ERR("IAEBufMgr:

:

getInstance().AAStatEnable()fail");

returnE_3A_ERR;

}

}

if(ENABLE_AFOBUF&m_pHal3A->m_3ACtrlEnable){

//AFODMAInit+AFStatEnable

if(!

IAFOBufMgr:

:

getInstance().DMAInit(m_SensorDevId)){

MY_ERR("IAFOBufMgr:

:

getInstance().DMAInit()fail");

returnE_3A_ERR;

}

if(!

IAFOBufMgr:

:

getInstance().AFStatEnable(m_SensorDevId,MTRUE)){

MY_ERR("IAFOBufMgr:

:

getInstance().AFStatEnable()fail");

returnE_3A_ERR;

}

}

......

if(ENABLE_AWB&m_pHal3A->m_3ACtrlEnable){

//AWBinit

bRet=(m_pHal3A->get3APreviewMode()==EPv_Normal)

?

IAwbMgr:

:

getInstance().cameraPreviewInit(m_SensorDevId,i4SensorIdx,rParam)

:

IAwbMgr:

:

getInstance().camcorderPreviewInit(m_SensorDevId,i4SensorIdx,rParam);

if(!

bRet){

MY_ERR("IAwbMgr:

:

getInstance().PreviewInit()fail,PvMode=%d\n",m_pHal3A->get3APreviewMode());

returnE_3A_ERR;

}

}

if(ENABLE_AE&m_pHal3A->m_3ACtrlEnable){

//AEinit

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("IAeMgr:

:

getInstance().PreviewInit()fail,PvMode=%d\n",m_pHal3A->get3APreviewMode());

returnerr;

}

}

if(ENABLE_AF&m_pHal3A->m_3ACtrlEnable){

//AFinit

err=IAfMgr:

:

getInstance().init(m_SensorDevId,i4SensorIdx);

if(FAILED(err)){

MY_ERR("AfMgr:

:

getInstance().init()fail\n");

returnerr;

}

}

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

//Resetframecountto-2

m_pStateMgr->resetFrameCount();

//Statetransition:

eState_Init-->eState_CameraPreview

m_pStateMgr->transitState(eState_Init,eState_CameraPreview);

returnS_3A_OK;

}

包含了AWB、AE、AF在内的ISP相关的初始化,相关的初始化完成之后会调用m_pStateMgr->transitState函数将当前状态切换到CameraPreview状态。

代码太多,这里只关注AF的初始化

MRESULTAfMgr:

:

init(MINT32i4SensorIdx,MINT32isInitMCU)

{

......

//---initMCU---

SensorStaticInforSensorStaticInfo;

if(m_i4EnableAF==-1)

{

IHalSensorList*constpIHalSensorList=IHalSensorList:

:

get();

IHalSensor*pIHalSensor=pIHalSensorList->createSensor("af_mgr",m_i4SensorIdx);

SensorDynamicInforSensorDynamicInfo;

switch(m_i4CurrSensorDev)

{

caseESensorDev_Main:

pIHalSensorList->querySensorStaticInfo(NSCam:

:

SENSOR_DEV_MAIN,&rSensorStaticInfo);

pIHalSensor->querySensorDynamicInfo(NSCam:

:

SENSOR_DEV_MAIN,&rSensorDynamicInf

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1