77范文网 - 专业文章范例文档资料分享平台

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

来源:网络收集 时间:2020-04-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

__FUNCTION__, isNeedUpdateI2C, isSlowMotionUpdateI2C); m_pHal3A->postToAESenThread(MFALSE); }

IAeMgr::getInstance().doPvAE(m_SensorDevId, m_pStateMgr->getFrameCount(), reinterpret_cast(rBufInfo.virtAddr),

m_pScheduler->jobAssignAndTimerStart(E_Job_AeFlare), 1, m_pScheduler->isSlowMotion());

m_pScheduler->jobTimerEnd(E_Job_AeFlare); if (isNeedUpdateI2C || isSlowMotionUpdateI2C) {

MY_LOG_IF(fgLogEn, \postToAESenThread : ready to update I2C\__FUNCTION__);

m_pHal3A->postToAESenThread(MTRUE); }

IspTuningMgr::GMA_AE_DYNAMIC_INFO dynamicInfo;

dynamicInfo.bStable = IAeMgr::getInstance().IsAEStable(m_SensorDevId); IspTuningMgr::getInstance().sendIspTuningIOCtrl(m_SensorDevId,

IspTuningMgr::E_ISPTUNING_SET_GMA_AE_DYNAMIC, (MINTPTR)&dynamicInfo, 0);

// workaround for iVHDR MUINT32 u4AFSGG1Gain;

IAeMgr::getInstance().getAESGG1Gain(m_SensorDevId, &u4AFSGG1Gain); IAfMgr::getInstance().setSGGPGN(m_SensorDevId, (MINT32) u4AFSGG1Gain);

MY_LOG_IF(fgLogEn, \doPvAE done\\n\

// update AWB

if (m_pScheduler->jobAssignAndTimerStart(E_Job_Awb))

IAwbMgr::getInstance().doPvAWB(m_SensorDevId, m_pStateMgr->getFrameCount(), bAEStable, i4AoeCompLv, reinterpret_cast(rBufInfo.virtAddr)); m_pScheduler->jobTimerEnd(E_Job_Awb); MY_LOG_IF(fgLogEn, \doPvAWB done\\n\

return S_3A_OK; }

这个函数也是长得不要不要的,它除了更新了AE、AWB参数外,还更新了其他图像参数,但这里只关注AE。乱七八糟的代码略过,看第22行doPvAE函数的实现

MRESULT AeMgr::doPvAE(MINT32 i4FrameCount, MVOID *pAEStatBuf, MINT32 i4ActiveAEItem, MUINT32 u4AAOUpdate, MBOOL bAAASchedule) {

strAEInput rAEInput; strAEOutput rAEOutput;

......

rAEInput.pAESatisticBuffer = pAEStatBuf;

rAEInput.eAeTargetMode = m_eAETargetMode; if(m_pIAeAlgo != NULL) {

if(m_bRestoreAE == MFALSE) {

AaaTimer localTimer(\m_eSensorDev, (m_3ALogEnable & EN_3A_SCHEDULE_LOG));

m_pIAeAlgo->handleAE(&rAEInput, &rAEOutput); localTimer.End();

copyAEInfo2mgr(&m_rAEOutput.rPreviewMode, &rAEOutput); m_rAEOutput.rCaptureMode[0] = m_rAEOutput.rPreviewMode;

mPreviewMode = m_rAEOutput.rPreviewMode; m_i4WaitVDNum = 0; // reset the delay frame if((rAEInput.eAeState == AE_STATE_NORMAL_PREVIEW) || (rAEInput.eAeState == AE_STATE_ONE_SHOT)) {

m_bAEStable = rAEOutput.bAEStable; m_bAEMonitorStable = m_bAEStable; } } else {

bRestore=1;

m_bRestoreAE = MFALSE;

MY_LOG(\ } } else {

MY_LOG(\The AE algo class is NULL i4SensorDev = %d line:%d\__FUNCTION__, m_eSensorDev, __LINE__); }

......

if ((i4ActiveItem & E_AE_AE_APPLY) || (bApplyAE == MTRUE)){ // apply AE UpdateSensorISPParams(AE_AUTO_FRAMERATE_STATE); } ......

return S_AE_OK;

}

第13行,调用m_pIAeAlgo->handleAE函数计算AE相关的参数,包括曝光时间和亮度的Gain值

第19行,将得到的AE参数保存到mPreviewMode变量中

第36行,获取到AE参数之后调用UpdateSensorISPParams函数更新sensor和ISP的参数

MRESULT AeMgr::UpdateSensorISPParams(AE_STATE_T eNewAEState) {

MRESULT err;

AE_INFO_T rAEInfo2ISP; MUINT32 u4IndexRatio;

m_AEState = eNewAEState;

switch(eNewAEState) {

case AE_INIT_STATE: case AE_REINIT_STATE: ......

case AE_AUTO_FRAMERATE_STATE: case AE_MANUAL_FRAMERATE_STATE: if(m_pIAeAlgo != NULL) {

m_pIAeAlgo->getAEInfoForISP(rAEInfo2ISP, LIB3A_SENSOR_MODE_PRVIEW);

rAEInfo2ISP.i4GammaIdx = m_i4GammaIdx; rAEInfo2ISP.i4LESE_Ratio = m_i4LESE_Ratio; rAEInfo2ISP.u4SWHDR_SE = m_u4SWHDR_SE; rAEInfo2ISP.u4MaxISO m_u4MaxISO*m_rAEPLineLimitation.u4IncreaseISO_x100/100;

rAEInfo2ISP.u4AEStableCnt = m_u4StableCnt; }

rAEInfo2ISP.u4Eposuretime = mPreviewMode.u4Eposuretime; rAEInfo2ISP.u4AfeGain = mPreviewMode.u4AfeGain; rAEInfo2ISP.u4IspGain = mPreviewMode.u4IspGain; rAEInfo2ISP.u4EVRatio m_rAEInitInput.rAEPARAM.pEVValueArray[m_eAEEVcomp];

if(m_i4WaitVDNum <= m_i4IspGainDelayFrames) { if(m_i4WaitVDNum == m_i4ShutterDelayFrames) { m_bSetShutterValue = MTRUE;

m_u4UpdateShutterValue = mPreviewMode.u4Eposuretime;

= = m_u4PrevExposureTime = mPreviewMode.u4Eposuretime; }

if(m_i4WaitVDNum == m_i4SensorGainDelayFrames) { m_bSetGainValue = MTRUE;

m_u4UpdateGainValue = mPreviewMode.u4AfeGain; m_u4PrevSensorGain = mPreviewMode.u4AfeGain; }

IspTuningMgr::getInstance().setIspFlareGainOffset((ESensorDev_T)m_eSensorDev, mPreviewMode.i2FlareGain, (-1*mPreviewMode.i2FlareOffset));

IspTuningMgr::getInstance().setAEInfo((ESensorDev_T)m_eSensorDev, rAEInfo2ISP);

if(m_i4WaitVDNum == m_i4IspGainDelayFrames) {

IspTuningMgr::getInstance().setISPAEGain((ESensorDev_T)m_eSensorDev, MFALSE, mPreviewMode.u4IspGain>>1);

m_AEState = eNewAEState; } }

break;

case AE_AF_STATE: ...... default: break; }

return S_AE_OK; }

第32-41行,把曝光时间和Gain值保存下来,后面会用到

第47行,将保存在mPreviewMode里的Gain值设置到Isp Tuning里面去,Isp Tuning的重点代码不开放,再往下跟已经没有意义了

还没结束,这里只更新了ISP的参数,并没有更新Sensor的参数

5.2 AESensorThreadLoop函数分析

之前提到有3个重点关注的线程,剩下最后一个了

MVOID*

Hal3A::AESensorThreadLoop(MVOID *arg) {

......

// (2) thread-in-loop while(1) {

MY_LOG_IF(fgLogEn, \ _this->waitVSirq();

MY_LOG_IF(fgLogEn, \

......

MY_LOG_IF(fgLogEn, \ IAeMgr::getInstance().updateSensorbyI2C(_this->m_i4SensorDev);

MY_LOG_IF(fgLogEn, \

}

return NULL; }

和之前的AF线程一样,通过一个死循环不断去捕获中断。捕获到中断之后调用updateSensorbyI2C函数进行处理

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Android 5.0 Camera系统源码分析(5):Camera预览3A流程(7)在线全文阅读。

Android 5.0 Camera系统源码分析(5):Camera预览3A流程(7).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/984277.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: