目录整体架构概述类总览_Module模块类型契约Algorithm 基类生命周期接口详解1. init()2. configure()3. queueRequest()4. prepare()5. process()算法整体时序Factory 工厂与注册机制AlgorithmFactoryBase_ModuleAlgorithmFactory_AlgorithmREGISTER_IPA_ALGORITHM 宏工厂使用流程核心设计要点总结调用链路完整梳理整体架构概述libcamera IPA 框架采用抽象接口 对象工厂自动注册模式将 AE/AWB/AGC 等 ISP 算法做成可插拔组件。 一套统一虚函数接口定义算法完整生命周期新增算法不需要修改框架主代码继承基类 注册宏即可接入 IPA 模块。类总览类模板参数作用Algorithm_Module_ModuleIPA 模块类型所有 IPA 算法的基类模板定义算法生命周期接口全部虚函数提供默认空实现AlgorithmFactoryBase_Module_ModuleIPA 模块类型工厂抽象基类保存算法名称构造时自动向 IPA 模块注册自身声明纯虚create()接口用于创建算法实例AlgorithmFactory_Algorithm_Algorithm具体算法子类工厂实现类继承AlgorithmFactoryBasetypename _Algorithm::Module实现create()构造对应算法对象REGISTER_IPA_ALGORITHM宏算法类名、算法名字定义 static 工厂实例库加载时触发工厂构造完成自动注册_Module模块类型契约当实现一套 IPA 模块时使用者必须自定义_Module类型内部包含下面内嵌类型_Module::Context // IPA会话全局共享上下文 _Module::FrameContext // 单帧上下文保存该帧相关算法状态 _Module::Config // IPA配置信息来自pipeline handler _Module::Params // 输出结构体下发给ISP硬件的参数 _Module::Stats // ISP硬件输出统计数据Algorithm 模板依靠上述内嵌类型完成接口参数绑定实现一套接口适配不同 ISP 硬件的 IPA 模块。Algorithm 基类生命周期接口详解templatetypename _Module class Algorithm { public: using Module _Module; virtual ~Algorithm() {} virtual int init(Context context, const ValueNode tuningData); virtual int configure(Context context, const Config configInfo); virtual void queueRequest(Context context, uint32_t frame, FrameContext frameContext, const ControlList controls); virtual void prepare(Context context, uint32_t frame, FrameContext frameContext, Params *params); virtual void process(Context context, uint32_t frame, FrameContext frameContext, const Stats *stats, ControlList metadata); };1. init()virtual int init(Context context, const ValueNode tuningData)调用时机IPA 模块初始化阶段整个生命周期仅执行一次输入全局共享上下文tuningData调参配置树 (ValueNode)职责读取调优参数初始化算法内部状态返回0 成功非 0 代表错误码。2. configure()virtual int configure(Context context, const Config configInfo)调用时机相机流启动之前拿到 PipelineHandler 下发配置信息输入全局上下文、IPA 配置信息分辨率、模式等职责基于当前相机配置预计算参数配置状态保存到Context会话配置结构。返回0 成功非 0 错误码。3. queueRequest()virtual void queueRequest(Context context, uint32_t frame, FrameContext frameContext, const ControlList controls)调用时机上层每向相机提交一个 Request 时调用frameRequest 序列号标识该批控制希望生效的目标帧输入controls来自应用层用户控制参数曝光、增益等职责提取用户控制值保存到对应FrameContext此时还没有 ISP 统计数据。4. prepare()virtual void prepare(Context context, uint32_t frame, FrameContext frameContext, Params *params)调用时机ISP 处理对应帧图像之前输出paramsISP 硬件参数结构体职责填充 ISP 寄存器 / 处理块参数、使能对应 ISP 模块硬件使用 params 完成图像处理。5. process()virtual void process(Context context, uint32_t frame, FrameContext frameContext, const Stats *stats, ControlList metadata)调用时机ISP 完成一帧图像处理后拿到 ISP 统计结果stats输入ISP 统计数据输出metadata帧元数据回填给上层应用职责运行算法闭环计算AE/AWB 迭代更新帧上下文状态⚠️关键约束该函数运行在关键路径禁止耗时计算重运算必须丢到异步线程。算法状态存放于FrameContext可访问其他算法保存的帧上下文状态。存在硬件帧延迟Request 序列号和 ISP 返回统计帧不一定一一对应早期框架对历史帧上下文访问能力有限容易造成控制环路震荡。需要仔细维护上下文访问顺序保证拿到有效最新状态。算法整体时序IPA初始化 ↓ init() 【仅一次】 ↓ configure() 【流开启前】 ↓ [流式循环] 上层提交Request → queueRequest() 接收用户控制 ↓ prepare() 填充ISP参数交给硬件执行 ↓ ISP硬件执行图像处理 ↓ process() 读取ISP统计执行算法计算输出metadata注意因为硬件流水线延迟process()处理的统计帧对应较早之前的 Request不是刚刚 queueRequest 那一帧存在帧偏移。Factory 工厂与注册机制AlgorithmFactoryBase_Moduletemplatetypename _Module class AlgorithmFactoryBase { public: AlgorithmFactoryBase(const char *name) { _Module::registerAlgorithm(this); } virtual std::unique_ptrAlgorithm_Module create() const 0; private: std::string name_; };构造函数接收算法名字立刻调用_Module::registerAlgorithm(this)把工厂基类指针注册进 IPA 模块create()纯虚接口产出算法实例的抽象接口。AlgorithmFactory_Algorithmtemplatetypename _Algorithm class AlgorithmFactory : public AlgorithmFactoryBasetypename _Algorithm::Module { public: std::unique_ptrAlgorithmtypename _Algorithm::Module create() const override { return std::make_unique_Algorithm(); } };模板参数是具体算法子类通过_Algorithm::Module推导所属 IPA 模块类型create()实现使用std::make_unique构造对应算法子类对象并返回。REGISTER_IPA_ALGORITHM 宏#define REGISTER_IPA_ALGORITHM(algorithm, name) \ static AlgorithmFactoryalgorithm global_##algorithm##Factory(name);定义static 静态工厂对象当 IPA 插件库被加载时静态变量构造函数执行自动完成工厂注册name算法名字必须在同一个 IPA 模块内全局唯一使用示例// AWB为自定义算法继承 AlgorithmMyModule REGISTER_IPA_ALGORITHM(AWB, awb);工厂使用流程插件库加载宏生成 static 工厂构造函数调用registerAlgorithm注册到 IPA 模块IPA 内部通过算法名字查找匹配的AlgorithmFactoryBase调用工厂create()生成算法实例基类指针不需要依赖具体子类头文件拿到std::unique_ptrAlgorithm_Module后依次调用init/configure/queueRequest/prepare/process接口。核心设计要点总结模板泛型设计不硬编码 Context/Stats/Params 结构体不同硬件 IPA 模块自定义一套类型复用同一套算法框架。插件化低耦合IPA 主逻辑只依赖Algorithm抽象基类新增算法只需要继承基类 注册宏不需要修改框架代码。两级状态隔离Module::Context全局会话状态Module::FrameContext每帧独立状态存储算法把状态保存在帧上下文应对多帧流水线历史帧上下文访问能力早期有限是框架待改进点。职责分离queueRequest接收上层用户控制prepare输出参数给 ISP 硬件process基于 ISP 统计数据运行算法闭环性能约束process()运行在图像处理关键路径阻塞会直接降低帧率复杂计算必须异步处理。调用链路完整梳理库加载阶段REGISTER_IPA_ALGORITHM定义 static 工厂实例 → 工厂构造函数执行 →_Module::registerAlgorithm(this)工厂注册进 IPA 模块。IPA 初始化IPA 模块根据配置的算法名字检索对应的AlgorithmFactoryBase调用factory-create()得到算法基类对象调用algorithm-init(context, tuningData)初始化算法。相机配置相机准备开启流调用algorithm-configure(context, configInfo)。相机运行流式阶段App 提交 Request 触发algorithm-queueRequest(...)保存用户控制ISP 处理帧前调用algorithm-prepare(...)填充硬件参数ISP 完成图像处理输出统计调用algorithm-process(...)执行算法逻辑、回填 metadata 返回上层。