 框架

Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera driver的实现接口进行封装,再经过算法处理,提供接口给framework连接起来。
在安卓上实现camera的功能会有这么几个流程实现,open、config、request、result、close

  1. Hal层封装了kernel的器件实现,向Camera service封装了各种算法接口,供其调用。在hal3中有这么几个接口,ICameraProvider, ICameraDevice, ICameraDeviceSession, ICameraDeviceCallback。
  2. ICameraProvider主要是向上层提供能力值查询,比如属性类的metadata,并且通过它可以获取CameraDevice3lmpl(例如open camera)和cameradevice3sessionimpl实例。
  3. AppStreamMgr主要是向framework层提供process result、转化framework request格式为hal3 request和pipeline request、更新厂商定义的帧缓冲区使用方法。
  4. 在pipeline中p1node主要输出raw图。JPEJ nod e主要是将yuv转化为jpeg,metadata转化为app metadata。P1node就是root node是所有节点的根node,输出raw data到p2c或者p2s
     AppStreamMgr

负责AppStreamMgr的回调
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.CallbackHandler.cpp
负责AppStreamMgr的Frame处理
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.FrameHandler.cpp
负责AppStreamMgr的Batch处理
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.BatchHandler.cpp
负责AppStreamMgr的处理请求
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.RequestHandler.cpp
负责AppStreamMgr的结果返回
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.ResultHandler.cpp
负责AppStreamMgr的Config处理
alps/vendor/mediatek/proprietary/hardware/mtkcam3/main/hal/device/3.x/app/AppStreamMgr.ConfigHandler.cpp

 Open

  1. mHalDeviceAdapter的Open用于初始化DeviceAdapter, 调用powerOn接口,这里的powerOn有另起一个线程去操作sensor,等待sensor上电完成后对3A进行powerOn操作。
  2. 在halSensor中主要是跟driver交互的地方,主要是初始化sensor drv、设置sensor mclk、继续调用ImgSensorDrv::open。再会调用featureControl调用到驱动的SENSOR_FEATURE_OPEN。Close流程跟open大致相同。
  3. 在freamwork跨进程调用camera3devicelmpl::open时,会创建CameraDevice3SessionImpl对象。
  4. CameraDevice3Impl::open(const ::android::sp<V3_2::ICameraDeviceCallback>& callback, open_cb _hidl_cb){
    //打开mSession,CameraDevice3Impl初始化时会创建mSession
    ::android::status_t status = mSession->open(V3_4::ICameraDeviceCallback::castFrom(callback));
    //返回CameraDevice3SessionImpl对象
    _hidl_cb(mapToHidlCameraStatus(status), mSession);
    return Void();
    }
  5. 在CameraDevice3SessionImpl中会构造AppStreamMgr和获取pipelineModuleManager进而创建pipelineModule。
  6. 创建IAppStreamManager
    mAppStreamManager = IAppStreamManager::create(
    IAppStreamManager::CreationInfo{
    .mInstanceId = getInstanceId(),
    .mCameraDeviceCallback = callback,
    .mMetadataProvider = mStaticInfo.mMetadataProvider,读取底层相机信息,初始化时会赋值
    .mMetadataConverter = mStaticInfo.mMetadataConverter,读取底层相机信息,初始化时会赋值
    mErrorPrinter= std::static_pointer_castandroid::Printer(mAppStreamManagerErrorState),
    mWarningPrinter=std::static_pointer_castandroid::Printer(mAppStreamManagerWarningState),
    mDebugPrinter=std::static_pointer_castandroid::Printer(mAppStreamManagerDebugState),
    }
    //获得PipelineModelManager
    auto pPipelineModelMgr = IPipelineModelManager::get();
    //创建 PipelineModel
    auto pPipelineModel = pPipelineModelMgr->getPipelineModel( getInstanceId() );
    //初始化pPipelineModel,并通知底层初始化和powerOn
    ii. pPipelineModel->open(getInstanceName().c_str(), this);
    //保存PipelineModel
    mPipelineModel = pPipelineModel;
    6 appStreamMgr初始化的时候创建 对象,不同对象处理不同类型的事件,这样可以最大程度减小阻塞。

7、pipelineModulelmpl调用创建线程来进行open和powerOn。

配流

在给配流过程中有两次配流
IPipelineModelSessionFactory::
createPipelineModelSession(
CreationParams const& params __unused
){
// (1) convert to UserConfiguration
auto pUserConfiguration = convertToUserConfiguration(
*params.pPipelineStaticInfo,
*params.pUserConfigurationParams
);
// (2) pipeline policy
auto pSettingPolicy = IPipelineSettingPolicyFactory::createPipelineSettingPolicy(
IPipelineSettingPolicyFactory::CreationParams{
.pPipelineStaticInfo = params.pPipelineStaticInfo,
.pPipelineUserConfiguration = pUserConfiguration,
});
// (3) pipeline session
auto pSession = decidePipelineModelSession(params, pUserConfiguration, pSettingPolicy);
}
Config stream 1st (pipelingsettingPolicy)
sessionCfgParams.pPipelineStaticInfo = mPipelineStaticInfo;
sessionCfgParams.pUserConfigurationParams = params;
sessionCfgParams.pPipelineModelCallback = mCallback.promote();

Config stream 2nd
mPolicyTable->fConfigPipelineNodesNeed
mPolicyTable->fConfigPipelineTopology
mPolicyTable->fConfigSensorSetting
mPolicyTable->fConfigP1HwSetting
mPolicyTable->fConfigP1DmaNeed
mPolicyTable->fConfigStreamInfo_P1
mPolicyTable->fConfigStreamInfo_NonP1
第二次配流主要配置pipelineModuleSession和构建pipelineContext,构建pipelineContext需要配streaming、node、pipeline。
构建pipelineContext:
Config streaming:网上代码乱码。。
Config node:configContextLocked_Nodes(…)
{
for(size_t i = 0; i < pPipelineNodesNeed->needP1Node.size(); i++) {
if (pPipelineNodesNeed->needP1Node[i]) {
configContextLocked_P1Node(pContext,
pOldPipelineContext,
pStreamingFeatureSetting,
pPipelineNodesNeed,
&(*pParsedStreamInfo_P1)[i],
pParsedStreamInfo_NonP1,
&(*pSensorSetting)[i],
&(*pvP1HwSetting)[i],
i,
batchSize,
useP1NodeCount > 1,
bMultiCam_CamSvPath,
pCommon,
isReConfig);
}
}
if( pPipelineNodesNeed->needP2StreamNode ) {
bool hasMonoSensor = false;
for(auto const v : pPipelineStaticInfo->sensorRawType) {
if(SENSOR_RAW_MONO == v) {
hasMonoSensor = true;
break;
}
}
configContextLocked_P2SNode(pContext,
pStreamingFeatureSetting,
pParsedStreamInfo_P1,
pParsedStreamInfo_NonP1,
batchSize,
useP1NodeCount,
hasMonoSensor,
pCommon);
}
if( pPipelineNodesNeed->needP2CaptureNode ) {
configContextLocked_P2CNode(pContext,
pCaptureFeatureSetting,
pParsedStreamInfo_P1,
pParsedStreamInfo_NonP1,
useP1NodeCount,
pCommon);
}
if( pPipelineNodesNeed->needFDNode ) {
configContextLocked_FdNode(pContext,
pParsedStreamInfo_P1,
pParsedStreamInfo_NonP1,
useP1NodeCount,
pCommon);
}
if( pPipelineNodesNeed->needJpegNode ) {
configContextLocked_JpegNode(pContext,
pParsedStreamInfo_NonP1,
useP1NodeCount,
pCommon);
}
if( pPipelineNodesNeed->needRaw16Node ) {
configContextLocked_Raw16Node(pContext,
pParsedStreamInfo_P1,
pParsedStreamInfo_NonP1,
useP1NodeCount,
pCommon);
}
if( pPipelineNodesNeed->needPDENode ) {
configContextLocked_PDENode(pContext,
pParsedStreamInfo_P1,
pParsedStreamInfo_NonP1,
useP1NodeCount,
pCommon);
}
}
配置pipeline
mpPipelineConfig->setRootNode(rootNodes);
mpPipelineConfig->setNodeEdges(edges);
 Request阶段

Camera3deviceSession通过submitRequest将request发给appStreamMgr进行校验和格式转化为hal request和pipeline request,然后camera3deviceSession把转化结果送给pipelineModule处理。

1、Camera3deviceSession接到request,将request通过submitRequest先提交给appstreamMgr再提交给pipelineModule。
pAppStreamManager->submitRequest(requests, appRequests);
pPipelineModel->submitRequest(vPipelineRequests, numRequestProcessed);
2、PipelineModelSessionBase里面解析request并通过submitOneRequest(reqs[i])提交处理。
PipelineModelSessionBase::
submitRequest(
std::vector<std::shared_ptr>const& requests,
uint32_t& numRequestProcessed
){
解析
for (size_t i = 0; i < requests.size(); i++) {
auto r = std::make_shared();
parseAppRequest(r.get(), requests[i].get() );//构造AppRequest对象
reqs.emplace_back®;
}

逐个提交
for (size_t i = 0; i < reqs.size(); i++, numRequestProcessed++) {submitOneRequest(reqs[i]);
}

}
3、进行处理流程

在处理前会构建freamqueue,建立这个request的I/O buffer、Topological、sub frame、dummy frame、feature set等信息;
android::sp pPipelineFrame;
buildPipelineFrame(pPipelineFrame,params);
PipelineContext流程

基于Mtk平台的android camera hal3学习相关推荐

  1. 基于MTK平台的Android预制语音信箱号码

    我们可以将预制的语音信箱号码写到xml文件夹中. 一般路径为: vendor\mediatek\frameworks\telephony\etc 下的voicemail-conf.xml. <? ...

  2. Camera HAL3学习

    转自: Camera HAL3学习 Android Camera System Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层ca ...

  3. 团队环境搭建:MTK平台,Android 9.0内销TV编译服务器配置

    团队环境搭建:MTK平台,Android 9.0内销TV编译环境配置 文章目录 团队环境搭建:MTK平台,Android 9.0内销TV编译环境配置 一.前言 二.硬件环境要求 四 .替国内换源:so ...

  4. 精准送达目标客户——基于极光平台优化Android通知

    内容来源:2017年4月21日,极光资深产品经理王猛在"极光开发者沙龙--JIGUANG MEETUP"进行<精准送达目标客户--基于极光平台优化Android通知>演 ...

  5. 基于Eclipse平台的Android OpenCV开发环境搭建

    基于Eclipse平台的Android OpenCV开发环境搭建 作者:雨水, 日期:2016-1-31,CSDN博客:http://blog.csdn.net/gobitan 摘要:本文主要记录了如 ...

  6. MTK平台 更换前后camera的MIPI CSI接口

    MTK平台 更换前后camera的MIPI CSI接口 在vendor目录下面,有一个文件"cfg_setting_imgsensor.cpp",这个文件里面有一个函数" ...

  7. Camera HAL3学习: Android Camera System

    Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera drive与硬件和位于android.hardware中的framew ...

  8. Android Camera HAL3 - Multi Camera(1)

    本文介绍下 Google Android 在其文档中对于 Multi-Camera 的描述,以及 Android R 中对 Camera HAL3 的一些新增内容,Multi-Camera 从 And ...

  9. 如何在MTK平台(mt6765 android 11)新增raw data分区

    最近在调试MT6765平台,需要新增raw data分区,并且在lk和kernel可以读取到分区信息.感觉非常繁琐,而且做错一步要重新编译整个SDK,非常耗时.因此,记录下这个过程的关键点,希望大家能 ...

最新文章

  1. MySQL的SQL语句如何优化?
  2. redis分布式锁实现思路
  3. 澎思科技马原:AI为基,IoT为翼,加速人工智能普惠丨MEET2021
  4. c++面对对象设计 2
  5. *44.程序的链接方式
  6. JavaScript之match()方法讲解
  7. javascript初级代码块
  8. 【练习题】构造方法 编写Java程序,模拟简单的计算器。
  9. 用企业实例说明,制造业如何打破4大困境,解决数字化转型痛点
  10. 再看产业地图及《中国2010-2011产业地图》书评
  11. soap协议有get方式
  12. python3 file_Python3-file
  13. react+vite+ts关于路径别名的配置
  14. 办公用计算机安全使用常识,办公电脑使用注意事项
  15. 海量微博数据舆情热点挖掘项目难点总结
  16. 保姆级在自己电脑搭建我的世界服务器教程
  17. 【git】出现Merge Conflict,解冲突
  18. 锅炉给水用碳酸钠调PH值与氢氧化钠调PH值优劣势对比
  19. 半导体器件基础06:发光二极管
  20. oracle分页查询SQL模板

热门文章

  1. MySQL:设置初始密码
  2. 消息中间件 RocketMQ的单机安装
  3. 测试人员都应该是好的产品人员
  4. HC-SR04超声波模块程序原理和Proteus ISIS仿真
  5. Ubuntu 16.04 安装Java jdk-8u171-linux-x64.tar.gz 教程
  6. 我是怎么看friends练口语的(转贴)
  7. Exception获取getMessage()为空
  8. 为什么我们懂得很多道理,却依然过不好这一生?
  9. 熬夜总结!最全的Pycharm常用快捷键大全!
  10. 【手绘漫画】图解LeetCode之两两交换链表中的节点(LeetCode 24)