(1)Loading static metadata(senosor and 3A)

与 Android P 加载流程一致,在 Android Q 中 buildStaticInfo 首先通过 impBuildStaticInfo_v1 这一路进行加载。为了兼容Android P 的 metadata 加载,会再次调用 impBuildStaticInfo。然后会加载自动生成的metadata。最后调用impBuildStaticInfo_v1_overwrite,加载需要强制复写的 metadata。

//vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1_1/HalSensorList.cppMBOOL
HalSensorList::buildStaticInfo(Info const& rInfo, IMetadata& rMetadata) const {const SensorStaticInfo *pSensorStaticInfo =&sensorStaticInfo[rInfo.getDeviceId()];MUINT8 u8Para = 0;#if MTKCAM_CUSTOM_METADATA_COMMONbool v1 = true;if (property_get_int32("vendor.debug.camera.static_meta.version", 1) != 0) {//(1)加载Android Q架构的metadataif (!impBuildStaticInfo_v1(rInfo, rMetadata)) {v1 = false;MY_LOGW("V1: Fail to build static info for %s index:%d type:%d",rInfo.getSensorDrvName().c_str(), rInfo.getDeviceId(),rInfo.getSensorType());} else {checkSensorData(rMetadata);updateAFData(rMetadata);goto lbLoadDone;}}
#endif//(2)兼容加载Android P架构的metadataif (!impBuildStaticInfo(rInfo, rMetadata)){MY_LOGE("Fail to build static info for %s index:%d",rInfo.getSensorDrvName().c_str(), rInfo.getDeviceId());//return  MFALSE;}//...//(3)加载自动产生的metadata(Sensor manual add tag list){IMetadata::IEntry entryA(MTK_MULTI_CAM_FEATURE_SENSOR_MANUAL_UPDATED);entryA.push_back((MINT64)MTK_SENSOR_INFO_ACTIVE_ARRAY_REGION, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_SENSOR_INFO_PIXEL_ARRAY_SIZE, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_SENSOR_INFO_ORIENTATION, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_SENSOR_INFO_WANTED_ORIENTATION, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_SENSOR_ORIENTATION, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_LENS_FACING, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_CONTROL_AF_AVAILABLE_MODES, Type2Type<MINT64>());entryA.push_back((MINT64)MTK_CONTROL_MAX_REGIONS, Type2Type<MINT64>());if (rMetadata.update(MTK_MULTI_CAM_FEATURE_SENSOR_MANUAL_UPDATED, entryA) < 0)MY_LOGE("update Metadata MTK_MULTI_CAM_FEATURE_SENSOR_MANUAL_UPDATED failed");}#if MTKCAM_CUSTOM_METADATA_COMMONif ( v1 )//(4)提供强制修改metadata的接口impBuildStaticInfo_v1_overwrite(rInfo, rMetadata);
#endifrMetadata.sort();return  MTRUE;
}

(A)impBuildStaticInfo_v1()

impBuildStaticInfo_v1()加载 Android Q 架构的 metadata。加载的类型是[CAMERA、CONTROL_AE、
CONTROL_AF、CONTROL_AWB、TUNING、FLASHLIGHT、SENSOR、LENS]以及[LENS、MODULE]。

//vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1_1/HalSensorList.cppstatic
char const*const
kCommonStaticMetadataNames[] =
{// MODULE"CAMERA","CONTROL_AE","CONTROL_AF","CONTROL_AWB","TUNING","FLASHLIGHT","SENSOR","LENS",// // PROJECT// "AVAILABLE_KEYS",// "FEATURE",// "MULTICAM",// "REQUEST",// "SCALER",// "VENDOR",NULL
};static
char const*const
kPlatformStaticMetadataNames[] =
{"MODULE","LENS",// "MOD_OVERWRITE"// "PROJECT",// // "PRO_OVERWRITE"NULL
};

(B)impBuildStaticInfo()

impBuildStaticInfo()兼容 Android P 架构,加载的是 Android P 类型的 metadata[LENS、SENSOR、
TUNING_3A、FLASHLIGHT、SCALERA、FEATURE、CAMERA、REQUEST]。

//vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1_1/HalSensorList.cppstatic
char const*const
kStaticMetadataTypeNames[] = {"LENS","SENSOR","TUNING_3A","FLASHLIGHT","SCALER","FEATURE","CAMERA","REQUEST",NULL
};

(C)impBuildStaticInfo_v1_overwrite()

impBuildStaticInfo_v1_overwrite()提供强制修改 metadata 的接口,加载的类型是[MOD_OVERWRITE]。

//vendor/mediatek/proprietary/hardware/mtkcam/drv/src/sensor/common/v1_1/HalSensorList.cppstatic char const*const kPlatformOverwriteStaticMetadataNames[] = {// "MODULE"// "LENS","MOD_OVERWRITE",// // "PROJECT",// "PRO_OVERWRITE",NULL};

(2)Loading other static metadata

在 Android Q 版本开始默认走 constructStaticMetadata_v1()这一路。

(A)MetadataProvider::onCreate()

//vendor/mediatek/proprietary/hardware/mtkcam/utils/metastore/metadataprovider/MetadataProvider.cppstatus_t
MetadataProvider::
onCreate()
{status_t status = OK;//prepare data for TagInfoIMetadataTagSet mtagInfo;setTagInfo(mtagInfo);//create IMetadataConvertersp<IMetadataConverter> pMetadataConverter = IMetadataConverter::createInstance(mtagInfo);{RWLock::AutoWLock _l(mRWLock);status = (mVersion==0)?constructStaticMetadata(pMetadataConverter, mpStaticCharacteristics, mpHALMetadata) :constructStaticMetadata_v1(pMetadataConverter, mpStaticCharacteristics, mpHALMetadata);if  ( CC_UNLIKELY( status!=OK ) ) {META_LOGE("constructStaticMetadata - status[%s(%d)]", ::strerror(-status), -status);return  status;}}return  status;
}

(B)constructStaticMetadata_v1()

在 constructStaticMetadata.cpp 中 constructStaticMetadata_v1()通过 impConstructStaticMetadata_v1()、impConstructStaticMetadata_v1_ext()、updateData()进行 metadata的加载,流程如下:

(C)impConstructStaticMetadata_v1()

impConstructStaticMetadata_v1()加载的是配置文件中 common 的 metadata、platform 的 metadata
以及 project 下面的 metadata。project 的优先级最高、platform 次之、common 最低。

在 impConstructStaticMetadata_v1()也保留了向前兼容 Android P 版的 metadata 配置,在
metadata 配置文件中可以直接按 Android P 的结构进行配置,而不需要任何修改。

//vendor/mediatek/proprietary/hardware/mtkcam/utils/metastore/metadataprovider/custom/info.hstatic
char const*const
kCommonStaticMetadataNames[] =
{// // MODULE// "CAMERA",// "CONTROL_AE",// "CONTROL_AF",// "CONTROL_AWB",// "TUNING",// "FLASHLIGHT",// "SENSOR",// "LENS",// PROJECT"AVAILABLE_KEYS","AVAILABLE_KEYS_VENDOR","AVAILABLE_KEYS_CUSTOM","FEATURE","MULTICAM","REQUEST","SCALER","VENDOR","CUSTOM",NULL
};static
char const*const
kPlatformStaticMetadataNames[] =
{// "MODULE",// "LENS",// // "MOD_OVERWRITE""PROJECT",// "PRO_OVERWRITE"NULL
};static
char const*const
kStaticMetadataTypeNames[] =
{// "LENS",// "SENSOR",// "TUNING_3A",// "FLASHLIGHT","SCALER","FEATURE","CAMERA","REQUEST",NULL
};

(D)impConstructStaticMetadata_v1_ext()

impConstructStaticMetadata_v1_ext()中加载的是可选/需要复写(强制覆盖)的相关平台配置。

impConstructStaticMetadata_v1_ext(mtkMetadata, kPlatformOptionalStaticMetadataNames);
impConstructStaticMetadata_v1_ext(mtkMetadata, kPlatformOverwriteStaticMetadataNames);//vendor/mediatek/proprietary/hardware/mtkcam/utils/metastore/metadataprovider/custom/info.h
static
char const*const
kPlatformOptionalStaticMetadataNames[] =
{"AVAILABLE_KEYS","VENDOR","CUSTOM",NULL
};static
char const*const
kPlatformOverwriteStaticMetadataNames[] =
{// // "MODULE"// // "LENS",// "MOD_OVERWRITE",// "PROJECT","PRO_OVERWRITE",NULL
};

(E)updateData()

updateData()与之前一样,加载的是运行时动态生成的 metadata。

void
MetadataProvider::
updateData(IMetadata &rMetadata)
{updateStreamConfiguration(rMetadata);updateRecommendedStreamConfiguration(rMetadata);updateAfRegions(rMetadata);IMetadata::IEntry availReqEntry = rMetadata.entryFor(MTK_REQUEST_AVAILABLE_REQUEST_KEYS);availReqEntry.push_back(MTK_EIS_FEATURE_EIS_MODE, Type2Type< MINT32 >());rMetadata.update(availReqEntry.tag(), availReqEntry);IMetadata::IEntry availReqEntry = rMetadata.entryFor(MTK_REQUEST_AVAILABLE_REQUEST_KEYS);availReqEntry.push_back(MTK_EIS_FEATURE_PREVIEW_EIS, Type2Type< MINT32 >());rMetadata.update(availReqEntry.tag(), availReqEntry);IMetadata::IEntry entry(MTK_REQUEST_AVAILABLE_SESSION_KEYS);entry.push_back(MTK_STREAMING_FEATURE_HDR10, Type2Type< MINT32 >());rMetadata.update(entry.tag(), entry);//...
}

(3)加载RequestTemplate

与 Android P 版加载方式差别不大,在 Android Q 上是通过 COMMON_HIERARCHY 这个宏开关来控制走 Android Q 的 Flow,只是修改了 metadata 的加载顺序。

  • 先加载 COMMON/COMMON 目录,加载 COMMON/SENSOR 目录;
  • 在加载PLATFORM/COMMON目录,加载PLATFORM/SENSOR目录;
  • 后加载PROJECT/COMMON目录,加载PROJECT/SENSOR目录;

后面的会覆盖或者追加到前面的数据。

//vendor/mediatek/proprietary/hardware/mtkcam/utils/metastore/templateRequest/TemplateRequest.cppstatus_t
TemplateRequest::
impConstructRequestMetadata(IMetadata&      metadata,int const       requestType
)
{status_t status = OK;FUNC_PROFILE_START(__FUNCTION__);
#ifdef COMMON_HIERARCHY//int32_t result = 0;std::string libPath = "libmtkcam_metastore.so";void* handle = ::dlopen(libPath.c_str(), RTLD_GLOBAL);if (!handle) {char const* err_str = ::dlerror();META_LOGW("dlopen library=%s %s", libPath.c_str(), err_str ? err_str : "unknown");return  NAME_NOT_FOUND;}{String8 const s8Symbol_Common = String8::format("%s_COMMON_%s", PREFIX_FUNCTION_REQUEST_METADATA, "COMMON");status = impConstructRequestMetadata_by_SymbolName(s8Symbol_Common, metadata, requestType, handle);if ( !status ) result|=COMMON_COMMON;String8 const s8Symbol_Sensor = String8::format("%s_COMMON_%s", PREFIX_FUNCTION_REQUEST_METADATA, mInfo.getSensorDrvName());status = impConstructRequestMetadata_by_SymbolName(s8Symbol_Sensor, metadata, requestType, handle);if ( !status ) result|=COMMON_SENSOR;}//{String8 const s8Symbol_Common = String8::format("%s_DEVICE_%s", PREFIX_FUNCTION_REQUEST_METADATA, "DEFAULT");status = impConstructRequestMetadata_by_SymbolName(s8Symbol_Common, metadata, requestType, handle);if ( !status ) result|=PLATFORM_COMMON;String8 const s8Symbol_Sensor = String8::format("%s_DEVICE_%s", PREFIX_FUNCTION_REQUEST_METADATA, mInfo.getSensorDrvName());status = impConstructRequestMetadata_by_SymbolName(s8Symbol_Sensor, metadata, requestType, handle);if ( !status ) result|=PLATFORM_SENSOR;}//{String8 const s8Symbol_Sensor = String8::format("%s_PROJECT_%s", PREFIX_FUNCTION_REQUEST_METADATA, mInfo.getSensorDrvName());status = impConstructRequestMetadata_by_SymbolName(s8Symbol_Sensor, metadata, requestType, handle);if ( !status ) result|=PROJECT_SENSOR;}META_LOGD("%s: load status(0x%x)", "TemplateRequest", result);//
#else
//...

(4)Android Q的metadata架构



(A_1)COMMON_COMMON

目录结构如下所示。主要配置 TemplateRequest,以及所有平台通用的 3A 或者其他 metadata 配置。该文件夹会最先被加载。

其中第一个参数 COMMON 和最后一个参数 COMMON 表示位于 COMMON-COMON 目录下(后面都参考此规则),第二个参数表示类型;

STATIC_METADATA2_BEGIN(COMMON, CONTROL_AF, COMMON)
STATIC_METADATA2_BEGIN(COMMON, CONTROL_AE, COMMON)
STATIC_METADATA_BEGIN(COMMON, REQUEST, COMMON)
//...

(A_2)COMMON_SENSOR

目录结构如下所示,配置的是特定 sensor 相关的信息,所有平台都通用 camera sensor 属性。

config_static_metadata.sensor.imx499mipiraw.h:配置的类型是 SENSOR,第一个参数是 COMMON,第三个参数是SENSOR_DRVNAME_IMX499_MIPI_RAW,表示位于 COMMON-SENSOR 目录下。

(B_1)PLATFORM-COMMON

该目录下的文件结构如下所示,除了config_static_metadata_project.h 这支文件,其他文件都是 STATIC_METADATA2_BEGIN(DEVICE,TYPE,COMMON)类型,以 DEVICE 开头的都是 Android P 的Metadata加载方式,只有Android Q的加载方式没有加载到数据时才会使用。


config_static_metadata_project.h配置 PEOJECT 类型的 Metadata,位于 PLATFORM 目录下,目前存放了PLARFORM通用stream configuration。

(B_2)PLATFORM-SENSOR

文件结构如下所示,该目录配置的是 Platform 中 Camera Sensor 特有的 camera metadata 配置。

(5)Camerahalserver重启时简单过程Log

04-12 09:57:32.389 26530 26530 I camerahalserver: Camera HAL Server is starting..., ADV_CAM_SUPPORT(0)04-12 09:57:32.630 26530 26530 I mtkcam-devicemgr: [getCameraDeviceManager] [hidldc] getCameraDeviceManager
04-12 09:57:32.632 26530 26530 I mtkcam-devicemgr: [initialize] +04-12 09:57:32.633 26530 26530 D MtkCam/HalSensorList: [searchSensors] searchSensors04-12 09:57:32.633 26530 26530 D SeninfDrv: [init][init]: Entry count 0 04-12 09:57:32.634 26530 26530 D ImgSensorDrv: [init][init] imgsensor_drv
04-12 09:57:32.634 26530 26530 D ImgSensorDrv: [searchSensor]searchSensor idx = 0
04-12 09:57:32.653 26530 26530 D ImgSensorDrv: [searchSensor]found <8a3/GC08A3_mipi_raw>
04-12 09:57:32.668 26530 26530 D ImgSensorDrv: [searchSensor]searchSensor idx = 1
04-12 09:57:32.688 26530 26530 D ImgSensorDrv: [searchSensor]found <8a4/GC08A4_mipi_raw>04-12 09:57:32.704 26530 26530 D MtkCam/Util/LogicalDevice: (26530)[createDeviceMap] sensorNum : 2
04-12 09:57:32.704 26530 26530 D MtkCam/Util/LogicalDevice: (26530)[createDeviceMap] 0 : facing(0), Name(SENSOR_DRVNAME_GC08A3_MIPI_RAW), remapping(0), isHidden(0)
04-12 09:57:32.704 26530 26530 D MtkCam/Util/LogicalDevice: (26530)[createDeviceMap] i : 0, remapping: 0, Info Name : SENSOR_DRVNAME_GC08A3_MIPI_RAW
04-12 09:57:32.704 26530 26530 D MtkCam/Util/LogicalDevice: (26530)[createDeviceMap] 1 : facing(1), Name(SENSOR_DRVNAME_GC08A4_MIPI_RAW), remapping(1), isHidden(0)
04-12 09:57:32.704 26530 26530 D MtkCam/Util/LogicalDevice: (26530)[createDeviceMap] i : 1, remapping: 1, Info Name : SENSOR_DRVNAME_GC08A4_MIPI_RAW04-12 09:57:32.705 26530 26530 I mtkcam-devicemgr: pHalDeviceList:0xb400006f9405ada0 searchDevices:2 queryNumberOfDevices:2
04-12 09:57:32.841 26530 26530 D mtkcam-devicemgr: [onEnumerateDevicesLocked] [0x00] vid: 0x00 isHidden:0 IMetadataProvider:0xb400006ff4047c10 sensor:SENSOR_DRVNAME_GC08A3_MIPI_RAW
04-12 09:57:32.976 26530 26530 D mtkcam-devicemgr: [onEnumerateDevicesLocked] [0x01] vid: 0x01 isHidden:0 IMetadataProvider:0xb400006ff404b250 sensor:SENSOR_DRVNAME_GC08A4_MIPI_RAW

MTK平台Metadata的加载(4)—Q版本后相关推荐

  1. MTK平台Metadata的加载(3)——其他Static和Request加载

    (1)加载其他Static Metadata 在 MetadataProvider.cpp 中的 constructStaticMetadata()进行 static metadata 加载. (A) ...

  2. 如何找出R中加载的软件包版本?

    本文翻译自:How to find out which package version is loaded in R? I am in a process of figuring out how to ...

  3. 如何检查加载了哪个版本的jQuery?

    如何检查客户端计算机上加载的jQuery版本? 客户端可能已加载jQuery但我不知道如何检查它. 如果它们已加载,我如何检查版本和前缀,例如: $('.class') JQuery('.class' ...

  4. cascader 动态加载 回显_Elementui cascader 级联选择器 动态加载数据,保存后回显的问题...

    问题描述 使用elementui,进行地区选择,分省市区三级动态加载,首次保存后,再次回看数据,怎么选中上次保存的地区 省市区三级都是动态加载,下次回来,只有省一级数据,model里面存的是一个数组, ...

  5. windows无法确定此计算机是否包含,服务器用U盘虚拟光驱装系统,有做RAID5,加载RAID驱动成功后,安装到最后会报“windows无法确定此计算机是否包含有效系统卷”错误...

    http://zhidao.baidu.com/link?url=bC5dyBz_W05bgeQOu0hF7BN7As_GjloE-Z8SeJBj8UWXZNt4eHeisP2Eo59nUwud23p ...

  6. html中searchbutton点击没有反应,点击按钮加载完整的HTML后,使用Selenium加载其他元素...

    我想刮一页并收集所有链接.该页面显示30个条目并查看完整列表,点击全部加载按钮是必要的.点击按钮加载完整的HTML后,使用Selenium加载其他元素 我使用下面的代码: from selenium ...

  7. docker加载新的镜像后repository和tag名称都为none的解决方法

    docker加载新的镜像后repository和tag名称都为none的解决方法 参考文章: (1)docker加载新的镜像后repository和tag名称都为none的解决方法 (2)https: ...

  8. Unity项目打开闪退 提示”Unity 已存在 您无法加载相同的版本“

    最近从unity hub打开项目的时候总是闪退回hub 可以新建新的项目打开,但是一旦关闭后,再次从hub打开就闪退 闪过提示" Unity 已存在 您无法加载相同的版本 " 然后 ...

  9. React Native按需加载 手Q狼人杀探索之路

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/mUzq4NaBHeF3T-NStLzuRw 作者:pe ...

最新文章

  1. P3924 康娜的线段树(マジやばくね)(线段树、期望、前缀和)难度⭐⭐⭐★
  2. C++ 编译器多态与运行时多态
  3. 《Exchange Server 2010 SP1/SP2管理实践》一2.2 部署域名解析网络环境
  4. 新版手机浏览器_新版《野性的呼唤》IGN仅3分 烂番茄72% M站54分
  5. 护理方面关于人工智能的构想_如何提出惊人的AI,ML或数据科学项目构想。
  6. scope python_Python标准库Scope
  7. 前端开发1之Node.js以及npm开发环境搭建
  8. css3 3D动画 200303
  9. 【Python】输入两个字符串,在第一字符串中删除第二个字符串中所包含的所有字符...
  10. 饿了么2020外卖备注图鉴:12个关键词覆盖我们的生活
  11. offset-list 和 prefix-list简介
  12. c++ win32 获取串口高低电平_串口和USB的区别,几种常见的串口协议
  13. JS设计模式——单例模式
  14. Pandas直接读取sql脚本
  15. 类型多样的建筑场景unity3d模型素材,速来收藏
  16. arduino loar_「雕爷学编程」Arduino动手做(15)---手指侦测心跳传感器
  17. 如何解决苹果M1处理器Mac翻车问题
  18. 湖中剑 前端周刊 #13 | Web录屏、Bundleless、低代码 Deco、Bundle Scanner、RN 低功耗蓝牙
  19. 最小拍有纹波系统仿真实验(计控实验四simulink)
  20. CentOS7上Glusterfs的安装及使用(gluster/heketi)

热门文章

  1. 边缘计算赋能智慧城市:机遇与挑战
  2. java linest_Java STLineSpacingRule類代碼示例
  3. 联合省选2022游记
  4. BGP路由器协议排错教程:BGP 对等体翻动问题
  5. 周期和频率之间的换算
  6. vue子组件给父组件传值时接收不到数据
  7. 专访中科云创周北川:用AI来做工业设备的故障诊断,目前还停留在“鸡尾酒疗法”阶段
  8. 助力企业设备上云,京东云上物联网产品重磅发布
  9. 浅析:演讲中的10条禁忌
  10. 微信小程序开发入门(连载)—— 开发前的准备工作