高通相机系统用usecase描述一个相机的使用场景。相机场景配置以序列化的形式保存在g_sm8350_usecase.xml。工程构建阶段配置转换脚本usecaseconverter.pl解析这些usecase配置,以数据结构的形式组织管理,最终以so的形式提供一组访问这些usecase配置的接口。
1.usecase配置转换
2.usecase配置操作接口的加载
3.加载usecase配置
ExtensionModule加载动态链接库中实现的usecase配置操作接口后,首先需要将usecase配置数据导入,后续才能通过usecase操作接口获取配置。
通过PopulatePipelineData(),ExtensionModule将sm8350 usecase配置数据导入。
//chi-cdk/core/chiframework/chxextensionmodule.cpp
ExtensionModule::ExtensionModule()
:...
{
//1.加载usecase selector实现
const CHAR* pChiusecaseSelector = "/vendor/lib/com.qti.chiusecaseselector.so";
m_chiUsecaseHandle = ChxUtils::LibMap(pChiusecaseSelector);
//2.获取usecase selector导出配置函数
ChiPopulatePipelineData pFuncPopulatePipelineData =
reinterpret_cast<ChiPopulatePipelineData>(
ChxUtils::LibGetAddr(m_chiUsecaseHandle, "PopulatePipelineData"));
//3.导出usecase配置
pFuncPopulatePipelineData(m_platformID);
...
}
4.操作usecase配置
usecase配置数据导入后,就可以通过UsecaseSelector提供的操作接口操作usecase配置了。
usecase配置操作接口有:
//chi-cdk/oem/qcom/chiusecase/common/chxusecaseselector.cpp
//1.导入配置
extern "C" CAMX_VISIBILITY_PUBLIC VOID PopulatePipelineData(
INT32 socId)extern "C" CAMX_VISIBILITY_PUBLIC VOID PopulatePipelineData(
INT32 socId)
//获取匹配的usecase选择器
extern "C" CAMX_VISIBILITY_PUBLIC ChiUsecase* UsecaseSelector::DefaultMatchingUsecaseSelection(
camera3_stream_configuration_t* pStreamConfig,
UINT32 bpp)
//获取默认匹配的usecase
extern "C" CAMX_VISIBILITY_PUBLIC ChiUsecase* GetDefaultMatchingUsecase(
camera3_stream_configuration_t* pStreamConfig,
UINT32 bpp)
//根据streamConfigure裁剪usecase
extern "C" CAMX_VISIBILITY_PUBLIC CDKResult PruneUsecaseByStreamConfig(
const camera3_stream_configuration* pStreamConfig,
const ChiUsecase* pUsecaseInputDescriptor,
ChiUsecase** ppUsecaseOutputDescriptor)
//获取配置中enumName-enumValue映射表
extern "C" CAMX_VISIBILITY_PUBLIC VOID* GetMapFromLibEnum()
//获取配置中usecaseName-usecaseInstance映射表
extern "C" CAMX_VISIBILITY_PUBLIC VOID* GetMapFromLibpChiUsecase()
//获取配置中usecaseCollectionName-usecaseCollection映射表
extern "C" CAMX_VISIBILITY_PUBLIC VOID* GetMapFromLibpChiTargetUsecases()
//
extern "C" CAMX_VISIBILITY_PUBLIC VOID* GetMapFromLibStringArray()
usecase配置管理模块根据taget个数将usecase进行分组。一个分组中的usecase拥有相同个数的target,构成一个collection(用ChiTargetUsecase数据结构表示)。usecase分组中的一个usecase是一个实例,用ChiUsecase数据结构表示。
5.使用实例
以轻颜后置预览为例,对configure_streams阶段创建advancedCameraUsecase过程中usecase配置操作进行说明。
advanced usecase实例的构建可以分为两个阶段:clone 默认的usecase,然后根据流配置进行裁剪。