150.QTI CHI 架构与 Extend Module 实战解析:构建可插拔的 Camera 能力体系
QTI CHI 架构与 Extend Module 实战解析:构建可插拔的 Camera 能力体系
关键词
QTI、CHI、Camera Hardware Interface、Extend Module、CamX、Vendor Tag、图像处理链路、Pipeline 插件化、异构算法框架
摘要
CHI(Camera Hardware Interface)是高通 QTI 在 CamX 架构上为 OEM 和算法厂商设计的一套上层图像处理插件框架,作为 HAL3 与实际处理模块之间的抽象层,CHI 提供了灵活的图像流调度机制、可插拔算法路径、Extend Module 机制与异构 ISP 控制接口,支持自定义的 3A、后处理、AI 模型插入与多摄策略重构。
本文将基于 Snapdragon 8 Gen 系列平台的实战部署,详细解析 CHI 架构的核心模块、模块加载机制、Extend Module 注册流程与图像处理回调路径,帮助开发者构建自定义的成像能力,满足差异化拍照体验与跨模组控制需求。
目录
- CHI 架构整体概览:连接 HAL3、CamX 与自定义处理链的核心桥梁
- Pipeline 插件化机制:Capture Request 到节点执行的动态路由
- Extend Module 接入流程:模块注册、能力声明与生命周期管理
- CHI Node 结构详解:图像处理单元的定义、执行与上下游绑定
- 自定义 AI 插件示例:构建 ISP → AI → ISP 闭环图像增强路径
- Metadata 读写与 Vendor Tag 扩展机制
- 多摄策略调度(ChiOverride)与场景切换逻辑控制
- 开发调试流程与典型问题排查:基于日志链路分析节点执行轨迹
第1章 CHI 架构整体概览:连接 HAL3、CamX 与自定义处理链的核心桥梁
CHI(Camera Hardware Interface)由 Qualcomm Technologies, Inc. 推出,作为 CamX 框架中位于 HAL3 与核心图像处理链之间的抽象层,目标是为 OEM 厂商与算法供应商提供可扩展、可控、可插拔的图像处理能力接口。
在 Snapdragon 845 之后的所有主流平台中,CHI 已成为高通平台相机系统架构的标准组成部分。
CHI 在架构中的位置:
- 位于 Framework 调用 HAL3 接口与底层 CamX Pipeline 执行节点之间,CHI 提供标准化的图像流 Hook 点;
- 将 Capture Request 拆解成标准图像任务,通过 Pipeline 分发至节点,支持算法模块与图像子链路的灵活组合;
- 管理 Node 插件、Metadata Tag、Session 生命周期、Pipeline Context 等关键资源。
CHI 的核心职责包括:
- 提供 Node 插件管理机制 :CHI 支持在图像处理链中任意位置插入用户自定义节点(如 AI 增强、LTM 映射、图像识别等);
- 封装图像上下游数据 :通过 CHINODEBUFFERHANDLE 与 CHIMETADATA 接口,统一管理图像 Buffer 和控制参数传递;
- 支持跨 Pipeline 场景管理 :如视频录制、夜景拍照、人像模式可定义多个 Pipeline Context 动态切换;
- 支持多摄策略协同 :通过 CHI Override 模块管理多 Session 的对焦模式、Sensor 控制策略、ISP 路由绑定等;
- 连接 OEM Extend Module 接口 :CHI 提供模块注册机制,将定制算法模块以动态库形式接入 CamX 主流程。
关键模块组成:
- ChiModule :系统主入口,负责注册 Extend Module 与 Node Plugin;
- ChiContext :每条 Pipeline 的上下文信息容器,包含 Node 图结构、Metadata 缓存、调度策略等;
- ChiNode :图像处理执行单元,每个 Node 具备输入输出 Buffer,支持并行执行;
- ChiOverride :扩展控制器模块,用于接管或替换默认调度策略,实现如多摄主副切换、自定义 AE 路径等;
- ChiUsecase :场景封装对象,如 PreviewUsecase、VideoUsecase,用于绑定 Pipeline 配置与上下文逻辑。
CHI 框架本质上为图像通路构建了一个强约束、可插拔、弱耦合的模块管理系统,使得原本由驱动层控制的图像处理流程,逐步演变为高层可控、动态调度的图像计算平台,为 OEM 的拍照体验创新提供了极大的工程空间。
第2章 Pipeline 插件化机制:Capture Request 到节点执行的动态路由
CHI 架构中最关键的能力之一是 Pipeline 插件化机制,它允许开发者通过注册 Node 插件与节点链路关系,自主构建 Capture Request 执行路径,并决定图像在 HAL 层是如何处理的、经过哪些算法模块、在哪个阶段回传到 Framework。
Pipeline 执行基本流程:
-
Capture Request 创建 :App 层通过 Camera2 API 发起图像采集请求,Framework 构造
CaptureRequest,交由 HAL3 接口调用process_capture_request()。 -
CHI 拦截与转译 :CamX HAL 层将请求传递至 CHI,CHI 框架根据 Usecase 对应的 Pipeline 配置生成内部任务链。
-
Node Graph 构建 :根据 Usecase JSON 描述或动态配置,CHI 解析出图像处理图结构(DAG),包括每个 Node 的类型、上下游关系、Buffer format。
-
调度器分发图像帧 :Pipeline Manager 控制每个帧的分发流程,将输入 Buffer 从 Sensor → ISP → AI Node → JPEG 编码 Node 依次流转。
-
Node 调用机制 :每个 CHI Node 注册三个核心回调函数:
ChiNodeProcessRequest():图像帧处理主函数,处理输入 Buffer,输出结果;ChiNodeSetNodeInterface():提供节点能力集与输入输出格式定义;ChiNodeQueryCapabilities():初始化阶段注册支持的操作模式与节点版本。
-
Buffer 与 Metadata 流通 :每个 Node 在执行前后由 CHI Scheduler 注入 CHINODEBUFFERHANDLE 和 Metadata Handle,确保图像帧与控制参数正确流动。
-
执行结果上传 :Pipeline 最终输出结果写入 HAL3 回调链,由 CamX 封装为
camera3_capture_result返回至 Framework。
插件化机制的优势:
- 灵活定义图像通路 :开发者可按需定义预处理、AI 插入、后处理、编码等多阶段路径,支持算法并发与路径选择;
- 支持条件流控制 :通过 Metadata 中的特定值控制是否启用某个 Node,实现如仅在夜景模式下启用降噪插件;
- 多路输出支持 :支持一个 Node 输出结果供多个下游节点使用,适用于 AI 模型 + 图像渲染并发处理;
- 支持动态扩展与灰度加载 :CHI 支持按模块加载插件库,可实现算法版本灰度发布与按场景切换节点路径。
Pipeline 插件机制彻底解耦了图像采集、处理、输出等过程,配合 Extend Module 能力,可在不修改 HAL 内核的前提下持续演进 Camera 算法链与处理能力,是当前高通平台上实现差异化拍照体验的主力架构机制。
第3章 Extend Module 接入流程:模块注册、能力声明与生命周期管理
Extend Module 是 CHI 框架对外开放的模块化接口,允许 OEM、ISP 供应商或第三方算法团队将自研图像处理逻辑以共享库形式嵌入整个图像通路中,实现图像增强、AI 识别、后处理压缩、语义标签等功能的可插拔部署。
接入流程概览:
-
模块结构实现 :开发者需实现
ChiModuleInterface结构体,该结构定义了模块的初始化、场景注册、Node 管理等函数接口。 -
接口入口导出 :模块以
libcamxchi*.so的动态库形式部署,必须实现ChiModuleEntry函数作为模块入口,在 CamX 启动时自动加载。 -
模块能力声明 :
- Module Version
- 支持的 Usecase 列表(如 Preview、Snapshot、Night)
- 对应的 Node 名称与数量
-
系统加载逻辑 :CamX 启动时扫描
/vendor/lib/camera/components路径,自动加载所有符合规范的.so文件并执行ChiModuleEntry。 -
模块初始化 :
- 调用
ChiModuleInitialize,传入 ChiContext 和 Pipeline Manager 接口; - 注册自定义 Node 列表,绑定到 Usecase 场景;
- 完成配置后,CHI 将该模块注册到全局 ModuleList,用于后续任务调度。
- 调用
生命周期管理:
CHI 对 Extend Module 提供完整的生命周期控制:
Initialize:模块初始化时被调用,创建上下文、加载配置文件;Destroy:系统关闭或场景切换时调用,用于释放资源与状态保存;ActivatePipeline/DeactivatePipeline:用于动态启用/关闭某条 Pipeline 实例;SessionChanged:通知模块当前活动 Session 更新,如摄像头从主摄切换到长焦。
实战要点:
- Extend Module 应使用 C 接口风格实现,确保在不同版本 CamX 上兼容性;
- 模块注册后,所有 Node 都必须在 CHI Pipeline 中注册并声明输入输出格式,否则调度失败;
- 每个 Extend Module 建议实现独立日志系统,便于在大规模图像流程中隔离问题。
Extend Module 架构的引入,使高通平台上的相机系统不再局限于预设图像链路,而是变成一个开放的、多节点、可重构的视觉处理平台。模块接入的规范性与能力声明的准确性,直接影响系统的稳定性与图像处理效率。
第4章 CHI Node 结构详解:图像处理单元的定义、执行与上下游绑定
CHI Node 是图像处理流程中的最小计算单元,它代表某一个功能明确的处理步骤,例如图像锐化、去噪、AI 识别、色彩映射、合成等。每个 Node 通过接口标准化输入输出,注册进图像流处理图中,由 Pipeline Manager 调度执行。
Node 接口结构定义:
-
CHINODE_INTERFACE:每个 Node 实现该结构体,包括以下函数:ChiNodeInitialize:初始化节点资源与上下文ChiNodeProcessRequest:每帧图像进入该节点时调用,用于执行图像处理ChiNodeQueryCapabilities:声明该节点支持的功能与图像格式ChiNodeDestroy:释放节点资源
-
CHINODECAPS:用于定义节点的输入输出能力,包括:- 支持的图像格式(如 NV12、UBWC、RAW10)
- 是否支持 Metadata 操作
- 并发处理能力与线程模型
-
CHINODEPROPERTY:每个节点在 JSON 或动态注册时声明的属性信息,用于构建 Pipeline 拓扑图。
节点间绑定机制:
- 节点之间通过 CHINODEBUFFERHANDLE 进行图像数据传递;
- Buffer 的实际内存由 HAL 或 CamX 提前分配,Node 仅处理逻辑;
- 节点连接关系在 Pipeline 构建阶段由 CHI Usecase Manager 解析配置文件生成,生成一张有向无环图(DAG),保证图像在每一帧中的唯一性与路径完整性;
- 节点之间通过
NodeInputPort与NodeOutputPort数组绑定上下游逻辑关系。
典型节点示例:
ChiNode_Sharpen:图像锐化模块,执行基于局部对比度增强算法;ChiNode_DepthFusion:双摄深度图合成,处理左右图像并输出灰度深度图;ChiNode_LTM:局部色调映射模块,用于实现 HDR 模式下的细节增强;ChiNode_AiEnhancer:AI 插件模块,调用 TFLite 或 SNPE 模型进行超分、风格迁移等。
节点执行策略与性能优化:
- 每个 Node 可定义为同步或异步处理节点;
- 高频调用节点(如实时美颜)建议开启多线程处理模型,通过
ChiNodeSetNodeInterface中配置; - 对耗时较长的 Node,需在 Metadata 中设置节点延迟参数,避免 Frame Timeout;
- 所有 Node 在执行前需校验输入 Buffer 与参数合法性,防止断链或空 Buffer 异常。
CHI Node 作为图像处理链中的核心操作单位,是构建灵活、高效、可编排视觉计算图的基础。通过清晰的接口规范、独立的执行线程与标准化的数据结构,CHI Node 模型可支持复杂图像任务的高性能执行,并可持续集成外部模型与算法能力。
第5章 自定义 AI 插件示例:构建 ISP → AI → ISP 闭环图像增强路径
在现代移动影像系统中,AI 已不仅局限于拍摄前后的辅助计算,而是深入嵌入图像处理链路中,实现实时图像增强、语义识别、区域调节等功能。在高通 CHI 架构中,开发者可以基于 CHI Node 构建 AI 插件,将神经网络模型集成进图像帧的处理路径,实现“ISP → AI → ISP”闭环的动态图像质量优化。
整体架构路径设计:
- Sensor → ISP(Spectra) :完成 Bayer 到 YUV 转换,执行基础降噪、色彩映射等处理。
- CHI Node - AI 插件调用 :将 YUV Buffer 传入 AI 模型处理节点,执行图像超分、风格迁移、HDR 区域增强等任务。
- AI Output 回写 → ISP 后处理路径 :将 AI 增强后的图像重新接入后续通路(如 JPEG 编码或显示预览)。
- Metadata 路径并发处理 :AI 节点可输出附加 Metadata,如图像标签、人脸区域等供后续节点使用。
插件实现流程:
- 创建 AI Node 插件,注册为 CHINODE 接口;
- 在
ChiNodeProcessRequest()中,将输入 Buffer 使用 CPU Mapping 或 GPU Mapping 拷贝至模型输入 Tensor; - 模型推理执行(推荐使用 SNPE SDK 或 Hexagon NN);
- 推理结果写入输出 Buffer,或更新 Metadata 字段供后续路径读取;
- 返回处理完成状态,由 CHI 调度进入下一个节点。
示例伪代码(简化流程):
CDKResult ChiAiNode::ChiNodeProcessRequest(...) {
// 1. 获取输入图像数据
void* inputData = MapBuffer(pInputBuffer->bufferInfo.phBuffer);
// 2. 准备 AI 模型输入 Tensor
ai_input_tensor.fill(inputData);
// 3. 调用 SNPE 推理接口
snpe_model.Execute(ai_input_tensor, &ai_output_tensor);
// 4. 拷贝输出图像结果至 output buffer
memcpy(pOutputBuffer->bufferInfo.phBuffer, ai_output_tensor.data, size);
// 5. 更新 Metadata(如人脸信息、处理延迟)
SetMetaData(pRequestObject, "com.oem.face_count", faceCount);
return CDKResultSuccess;
}
实战优化策略:
- 尽量避免每帧都加载模型,建议使用会话级别模型加载,帧级输入输出复用;
- 使用平台支持的 FastDMA 或 C2D Copy 加速图像数据迁移;
- 对模型输入做 Crop & Resize 预处理,减小推理延迟;
- 使用异步线程运行推理逻辑,提升整帧处理吞吐率。
通过上述流程,CHI 架构下的 AI 插件可与原生 ISP 流程无缝集成,实现实时图像增强任务的闭环管控,并支持多类型图像路径共享同一 AI 模型结果,显著提升视觉系统智能水平与差异化能力。
第6章 Metadata 读写与 Vendor Tag 扩展机制
在 CHI 架构中,Metadata 是贯穿图像处理流程的关键数据结构,负责在各节点间传递图像帧级控制信息、AI 结果、3A 参数与平台状态等。CHI 提供完整的 Metadata 读写接口及 Vendor Tag 扩展机制,开发者可以基于此定义并使用自定义参数,在不同 Node 或 HAL3 回调中同步信息。
CHI Metadata 结构说明:
- 基本数据结构:
CHIMETADATAHANDLE - 每个图像帧都绑定唯一的 Metadata 实例,包含标准字段(如 exposure time、white balance)与 Vendor 扩展字段;
- 所有 Metadata 字段通过 TagID(类似于键)访问,值支持 int、float、double、struct、blob 等多种格式。
读写接口使用:
- 读取字段:
UINT32 faceCount = 0;
pMetadataOps->GetTag(pMetaHandle, vendorTag_faceCount, &faceCount, &size);
- 写入字段:
UINT32 faceCount = 3;
pMetadataOps->SetTag(pMetaHandle, vendorTag_faceCount, &faceCount, 1);
- 字段类型定义 :通过
ChiMetadataUtil::GetTagType()获取 Tag 的数据类型; - Tag 数组批量操作 :支持结构化 Metadata 组合操作,用于复用模型推理结构(如多目标信息)。
Vendor Tag 注册流程:
- 在 Extend Module 中实现
ChiVendorTagEntry数组,定义每个字段的名称、类型、权限等; - 在
ChiModuleEntry()中调用ChiVendorTagManager::RegisterVendorTagList()注册; - Tag 名称建议采用命名空间风格,例如
com.oem.face.faceCount; - HAL3 Framework 可通过同名 Tag 访问该字段,实现应用端 → HAL → CHI 的完整链路通信。
实战应用场景:
- AI 插件输出人脸位置、人脸数、人眼框坐标等信息供后续节点或 UX 使用;
- 在多摄模块中记录主摄副摄切换状态,用于同步图像路径;
- 在场景识别后更新曲线控制参数或图像融合权重。
开发注意事项:
- 所有 Vendor Tag 的注册需在 CameraService 启动前完成,否则 Framework 无法识别;
- 建议在文档中同步记录各 Tag 的用途与结构,便于跨团队协作;
- 对频繁访问的 Metadata 字段应做 Tag 缓存优化,减少反复查表开销。
Vendor Tag 机制使得 CHI 能够以结构化、强类型、低耦合的方式完成控制信息与算法参数的传递,是实现复杂图像通路控制的基础设施。配合 AI 插件与多摄策略框架,CHI Metadata 成为现代移动影像系统中真正的数据总线。
第7章 多摄策略调度(ChiOverride)与场景切换逻辑控制
ChiOverride 是 CHI 框架中专门用于自定义调度策略和摄像头资源管理的接口模块,负责接管默认的 ISP 路由、3A 控制流程、多 Session 配置以及场景级别的动态 Pipeline 切换逻辑。它为多摄融合、主副摄切换、超分合成、多路径 Preview 设计等提供了灵活的系统级控制点。
ChiOverride 的核心职责包括:
- 决定当前场景使用哪条 Pipeline(例如普通拍照、夜景模式、超分模式);
- 控制每个 Pipeline 所绑定的 Sensor 模块、ISP 路由、Node 链路;
- 管理多个 Camera Session 的激活与同步(主摄、副摄、ToF 等);
- 对 3A 模块配置参数进行重写(例如强制长曝光、锁定白平衡);
- 动态创建、销毁 Pipeline 实例,实现场景无感切换。
接口结构实现:
ChiOverride 模块通常通过以下函数对外实现控制:
static CDKResult ChiOverrideEntry(ChiOverrideCallbacks* callbacks);
CDKResult ChiOverrideCallbacks::GetPipelineToUse(...)
CDKResult ChiOverrideCallbacks::SelectSensor(...)
CDKResult ChiOverrideCallbacks::Configure3ASettings(...)
CDKResult ChiOverrideCallbacks::OnSessionActivate(...)
CDKResult ChiOverrideCallbacks::OverrideMetadata(...)
典型多摄策略逻辑示例:
-
主摄/长焦切换:
在连续变焦过程中,ChiOverride 会根据缩放比例动态选择当前主用摄像头,通过SelectSensor()函数修改 Frame Request 所绑定的 Sensor ID,并同步构建新的 Pipeline 路由图。 -
夜景合成激活逻辑:
当检测到低光环境或动态范围过宽场景时,Override 模块将强制启用NightPipeline,并通过Configure3ASettings()修改 ISP 的 AE 参数为长曝光,同时禁用闪光灯。 -
多摄虚化:
若主摄与辅助深度摄同时开启,ChiOverride 将配置DepthPipeline,并在OverrideMetadata()中插入主副帧对齐控制字段,确保后续 Node 可完成基于时间戳的人像分割。
实战部署建议:
- 在 Usecase JSON 配置中预定义每种场景对应的 Pipeline ID 与链路路径,ChiOverride 仅在运行时根据条件进行调用;
- 将高频调用逻辑(如缩放、对焦)尽量缓存中间状态,避免频繁重构 Pipeline 导致帧丢失;
- 合理管理 Session 生命周期,防止长时间保持副摄开启造成功耗激增;
- 在测试阶段使用
ChiOverrideLog()打印每一帧使用的 Pipeline 与控制策略,利于调试。
ChiOverride 模块让 OEM 能在硬件能力与拍照逻辑之间建立一套“感知 → 决策 → 调度”的运行时框架,赋予终端设备面向多场景、动态切换的计算摄影能力,是现代旗舰影像系统不可或缺的核心调度组件。
第8章 开发调试流程与典型问题排查:基于日志链路分析节点执行轨迹
CHI 框架下的图像处理链路涉及多模块协同运行,包括 Pipeline 构建、Node 执行、Metadata 传输、AI 插件调用与多摄 Session 管理。开发调试过程中,仅靠 logcat 或应用日志往往无法定位处理瓶颈或路径异常,因此需要系统级日志链路与调度轨迹分析能力。
调试流程构建:
-
日志模块启用:
在camxsettings.txt中打开调试日志项:ChiLogMask = CHI_LOG_METADATA | CHI_LOG_NODE | CHI_LOG_PIPELINE LogBufferCount = 10通过开启不同等级日志,可监控节点调度、Metadata 流动与 Pipeline 激活状态。
-
实时日志观察:
adb logcat | grep "Chi"输出包含:
- 每帧绑定的 Pipeline ID、Node 执行顺序;
- Metadata 中的控制字段变更;
- Buffer 分配与释放状态;
- Pipeline 构建失败与 Node 初始化异常信息。
-
节点执行轨迹分析:
每个 Node 执行后会输出如下信息:[ChiNode_AiEnhance][NodeProcessRequest] FrameId: 1543, Input: 0x1e5a2000, Output: 0x1e5f6000, Latency: 12ms通过分析每帧图像在不同 Node 的处理时间,可识别耗时瓶颈,便于后续异步优化或线程调整。
-
Buffer 跟踪与内存验证:
- 使用
ionheap-dump查看每帧分配情况; - 结合
dmabuf info工具分析是否存在未释放或重复使用现象。
- 使用
-
Pipeline 动态配置验证:
- 查看
PipelineId与UsecaseId是否正确切换; - 日志中确认每次切换是否触发了
ChiOverrideCallbacks::OnSessionActivate()。
- 查看
常见问题与排查方式:
-
图像花屏或错误色彩:
- 检查 Node 输入输出格式是否对齐;
- 确保 Buffer Mapping 正确(特别是 UBWC 格式);
-
Pipeline 不生效:
- 排查 JSON 配置是否与 Usecase 绑定错误;
- 日志确认是否执行了
ActivatePipeline并绑定 Node 成功。
-
AI 插件不触发:
- 确认是否在 Pipeline 图中注册对应 Node;
- 检查是否满足启用条件(如 Metadata Tag 启动位未打开)。
-
多摄模式失效或同帧错乱:
- 核对每帧是否正确绑定 SensorId 与同步时间戳;
- 查看 Metadata 中是否存在 ChiOverride 覆盖失败标志。
通过规范的调试流程、全链路日志追踪与问题分段定位机制,可有效提高 CHI 开发效率,降低新插件、新场景引入过程中的不确定性,并建立可维护、可观测的系统架构基础。至此,CHI 与 Extend Module 的关键能力已完整覆盖,为 OEM 打造自研高端影像系统提供了平台级支撑。
本文转自 https://zhxin.blog.csdn.net/article/details/148676170,如有侵权,请联系删除。
150.QTI CHI 架构与 Extend Module 实战解析:构建可插拔的 Camera 能力体系
http://114.132.213.38:6250/archives/1751036964972
评论