本章围绕影像3A技术是如何在高通和联发科的芯片平台上落地,高通平台通过statsNode,联发科平台通过HAL3A架构的实现方法,以及不同平台在实现逻辑上的对比和映射总结。
其他平台更新较慢,VX号持续更新,且进行了排版,链接:VX:Android影像基础-3A在系统平台中的实现

AF/AE/AWB是由对应的算法组去负责,集成这些算法是由软件完成的,所以影像系统需要熟悉原理的同时,协助算法一起分析和定位问题,或者使用3A信息实现新的需求功能。
CSDN每次都列为VIP内容,可以直接关注VX号免费查看原文: 
索佳尼这几家方案不太清楚,本文以高通和联发科平台为例,如果没有相关资源,也可以学习其他平台比如RK、海思、全志等。
一、3A落地方法
3A算法的软件实现机制可以包括统计值获取和解析、算法调用和结果返回的完整流程。
结论先行,高通和联发科尽管实现3A的方式不同,两者在HAL层面遵循相同的Android HAL3规范和原则。针对上层framework都使用标准化的camera3_device_ops 接口,内部通过camera_metadata_t 传递3A参数与状态,内部均通过AE/AWB/AF状态机实现状态管理,3A控制都与CaptureRequest绑定,确保每帧参数一致性,而3A计算则都采用异步线程模型处理3A计算,避免阻塞主线程。
3A都遵循统一的统计闭环收敛:ISP统计 → HAL解析 → 3A算法 → 控制参数 → 下一帧,并在拍照前都需等待3A收敛后再触发Shutter。
通过整个闭环流程可知,整个流程是由软件和3A算法共同构成,联发科有HAL3A架构单独抽象出来专门负责3A软件部分,高通则把同类职责才分到了camx-CHI的stats中。联发科的3A是和P1硬件绑定,体现了其集中式的特点,高通的3A则是以节点的形式挂在IFE后面构成pipeline,体现了其高度模块化和内部抽象的特点。
二、高通Stat 3A实现
高通平台CamX-CHI架构中,软件通过Stats 机制,ISP统计值由Stats Parser解析成结构化数据,有camX stats 3A算法process计算,算法结果生产的控制量打包成CSL Packet,通过CSL应用到硬件sensor/ISP。高通的设计更加灵活性。
高通没有MTK Hal3A的概念,类似的职责分散在 StatsNode + AECNode/AWBNode/AFNode + FrameControl
数据流整体描述,从sensor 输出图像数据经过IFE后,同步生成统计信息stats Blob,然后经过parser解析为AECStats/AWBStats/AFStats,分发至AECNode/AWBNode/AFNode,各Node运行算法后合并统一生成FrameControl,再经过IFE Node 或Sensor Node,之后通过CSL将FrameControl转为CSL命令,通过KMD配置Sensor寄存器 (曝光/增益/AWB gain/AF position) ,硬件是生效后进行下一帧。
1. 统计值获取解析
StatsNode是CamX中的软件节点,即StatsNode负责统计值解析,输入是从ISP硬件(IFE/BPS)获取原始的3A(AE/AWB/AF/PD等)统计信息,输出是将原始统计转换为算法可用的结构化数据
代码位置:vendor/qcom/proprietary/camx/src/swl/stats/
会有人不了解统计值是什么,分别分类简单表述一下,AE统计值是描述亮度直方图以及区域曝光值信息,主要用于自动曝光算法计算;
AWB统计值是描述色温估计和RGB通道统计,用于白平衡增益算法计算;AF统计值是描述对比度值以及CPAF的相位检测数据,用于对焦位置计算;此外统计值还可能包含PD点信息或者ASD场景检测等等。
统计值是通过Buffer的方式流转,由ISP硬件的IFE/BPS产生,经过StatsNode解析buffer,最终被3A的so算法库使用,并最终作用回硬件。
2. 3A算法调用流程
高通使用Stats 加载机制,可以通过动态加载.so文件实现3A算法的替换,可以在/vendor/lib64/camera/components/路径下找到相关的算法so库,常见的算法名有com.qti.stats.aec.so或者com.qti.stats.awb.so等。
算法库入口函数,可以找类似ChiNodeEntry()的方法,通过回调的方式里面实现了输出算法的接口,包含创建实例以及处理请求等能力。
算法执行流程,首先通过上层每帧的request开始,在pipeline中通过ProcessRequest调用算法,其中会通过AddDeferredNode的接口加入延迟队列等待统计值就绪,队列在统计值Buffer就绪后调度DispatchReadyNodes,之后StatsNode根据获得的ISP统计信息,在ExecuteProcessRequest中解析为算法的输入格式,然后调用到对应Node中调用对应的com.qti.stats.aec.so算法库,最终算法库的输出为曝光参数、白平衡增益、对焦位置等信息。
3. 结果返回与参数应用
算法结果通过Metadata 返回给上层使用,算法结果通过FrameControl应用回ISP硬件,对应于寄存器控制过程。
对比联发科的直接控制寄存器,并通过i2c写入的流程,高通这里使用Frame Control抽象,AECNode的算法输出使用Frame Control汇总到statNode, 然后通过FrameNotify机制传递到IFE Node 或Sensor Node。
算法输出的结果不同生效的硬件也不同,但统一通过CSL层调用到高通的KMD从而实现最终寄存器的控制。比如AE的Shutter/Gain通过CSL写入Sensor寄存器,AWB的R/G/B Gain通过CSL写入IFE/IPE color correction模块,AF的Lens Position通过CSL实现VCM驱动控制马达。
三、联发科HAL3A实现
联发科可平台使用HAL3A和lib3a实现3A控制调节,通过Buffer mgr 获取ISP统计值,在独立线程 3A thread 中运行3A算法,通过IspTuningMgr等将结果写入buffer,最后由驱动侧完成寄存器写入硬件,形成完整的3A控制闭环。整个流程高度模块化,便于平台适配和算法优化。
1. 统计值获取解析
统计值来源与格式
MTK平台中,3A的统计值信息是由P1Node 硬件生成。其中AE统计值实际是将图像切分为128×90个block,每个block输出R/G/B/Y平均值构成,即通过结构体存储RGB色彩和亮度信息;AWB统计值则是记录每个block输出中心像素R/G/B值;AF统计值则支持类似16个窗口,每个窗口输出6种filter统计值(high_iir/low_iir/luma/sobel_v/sobel_h/ysat)。
统计值Buffer管理
HAL3A通过专门的Buffer管理器来获取ISP统计值,比如AE的曝光统计值是IAEBufMgr使用AEO buffer,然后用于后续的曝光计算;AF的对焦统计值是IAFOBufMgr使用AFO buffer,之后用于对焦算法;AE/AWB混合统计值是IAAOBufMgr使用AAO buffer,之后用于自动曝光和白平衡
初始化时则通过DMAInit()和AAStatEnable()等来启用统计。
统计值解析
统计值解析Parse Stats,则是把读取到的buffer结构体给到HAL3A,封装后提供给算法模块。
2. 3A算法调用流程
主线程循环
Hal3A会创建独立线程thread 3A: Hal3A::onThreadLoop来专门处理3A命令,会接受不同的case:Update、CaptureStart等
算法模块调用
各算法通过Manager单例调用,有ae_mgr af_mgr和awb_Mgr,通过mgr实例去调用具体的算法模块,比如:
IAeMgr::getInstance().doPvAE(...); // 预览AE
算法执行流程
每帧通过do3Aprocess函数执行算法,输入值是每帧拿到解析后的统计值信息,process固定某一个3A算法的过程,输出值是tuning参数,比如Shutter/Gain/ AWB Gain/Pos等
3. 结果返回与参数应用
算法结构
算法的输出通过特定结构体传递和封装,AE的结构体信息中主要包含change是否更新、shutter曝光时间(us)、sensorGain和ispGain,以及当前亮度信息等;AF的结构体信息包含change是否更新和NextPos马达位置等信息;AWB结构体包含change、RGB各通道的gain以及ColorTmp色温信息等。
参数写入流程
算法的输出结果需要回溯给硬件sensor和ISP,使其调整到平衡后停止。结果返回路径首先是算法输出生成ISP寄存器配置,通过Metadata封装到CaptureResult返回上层,下层则通过IspTuningMgr的接口sendIspTuningIOCtrl把参数通过Driver,写入Sensor/ISP寄存器,下一帧生效。
平台实现对比
首先这两种常见架构都遵循Android HAL3标准,但设计理念不同,联发科平台3A和P1深度绑定,集成度较高;高通平台3A加入pipeline中,模块化程度较高。
1. 架构设计差异
关于3A的不同平台设计理念不同,联发科核心实现架构是hal3A紧耦合架构,3A算法内聚在 aaa_mgr 模块,与P1 Node深度绑定,且P1 Node是3A与ISP的交汇节点;高通的核心架构是Stats Node插件化架构,AEC/AWB/AF Node各自独,3A算法为独立 .so 库;设计哲学的角度,联发科是高集成度、强稳定性,高通是高模块化、高开放性。
3A架构中,关于统计值输入,联发科HAL3A的是通过AEO/AFO等专用bufferMgr获取,高通是通过StatsNode统一解析;3A算法的线程,连发科是有独立3A主线程,高通则使用CamX线程池调度;关于算法的输出参数,联发科是通过IspTuningMgr等配置到diver,高通则通过CSL层才能写入配置KMD。
最后说到定制化开发,联发科的逻辑是可以直接Hal3A源码实现适配,高通则在CHI架构插件化修改。
2. 3A算法实现差异
联发科 3A 实现
联发科使用P1 Node为中心的思想,HAL3A直接从ISP Driver获取统计信息,3A算法与P1 Node紧密集成,通过Magic Number映射的方式关联3A帧号、Request ID以及统计信息,通过OnSyncBegin/OnSyncEnd 确保3A计算与硬件出帧同步 ,通过内部结构体和Metadata实现参数传递。
当每帧CaptureRequest下发的时候,进入到hal3的核心接口Hal3A::update()中,接收 Sensor 统计信息 (brightness,focus等) ,其中的aaa_mgr中运行3A算法,生成新一帧配置参数 (曝光时间、Sensor gain等),回写参数到 metadata,供下一帧使用。
P1Node则有多个thread运行包括3A thread,3A thread接收Vsync信号 调用OnSyncEnd设置metadata,计算完成后结果驱动Sensor/ISP ,同通过ISP driver把3A参数应用到硬件寄存器,然后再从ISP中输出图像帧和新的统计值。
高通3A实现
高通使用Node化架构,进入StatsNode的核心接口ProcessRequest来收集解析3A统计信息,然后则由AEC、AWB、AF自独立Node运行算法,通过Topology XML配置连接在pipeline中。通过FrameNotify 和Fence保证同步,内部通过FrameControl传递参数,外部则通过metadata传递参数。
当每帧CaptureRequest下发的时候,首先到达camX core中,通过Usecase / Feature / Pipeline 逐层管理,然后到达Stats Node:收集IFE/BPS生成的统计信息,之后分别加载3a的算法库,计算的输出信息通过CSL层FrameControl转为CSL命令,发到KMD,然后发送到 Spectra ISP的寄存器中,之后由IFE输出图像帧和新的统计值。
3.软件模块差异
高通 Stats 3A Node核心代码
关键代码

高通调试工具链:
bash
# 开启3A详细日志
adb shell setprop persist.camera.hal.debug 7
adb shell setprop persist.camera.3adebug 1
# 查看AEC/AWB/AF日志
adb logcat -s CamX | grep -E "STATS_AEC|STATS_AWB|STATS_AF"
# Dump统计值和图像
adb shell setprop persist.vendor.camera.autoImageDump true
adb shell setprop persist.vendor.camera.autoImageDumpMask 0x600
# 查看3A算法库加载
adb logcat -s CHIUSECASE | grep "stats"
核心结构体
cpp
// 3A算法库接口 vendor/qcom/proprietary/camx/src/core/chi/
typedef struct ChiAECAlgorithm {
void* (*Create)(const AECAlgoCreateParam* param);
void (*Destroy)(void* algoHandle);
int (*ProcessStats)(void* algoHandle, const Stats* stats, AECOutput* output);
int (*SetParams)(void* algoHandle, const AECAlgoSetParam* param);
} ChiAECAlgorithm;
// Stats Node
class StatsNode : public Node {
virtual CamxResult ProcessRequest(const Request& request);
virtual CamxResult PostPipelineCreate();
// 加载3A算法库
CamxResult Load3AAlgorithms();
// 统计处理
CamxResult ProcessAECStats(const Stats* stats);
CamxResult ProcessAWBStats(const Stats* stats);
CamxResult ProcessAFStats(const Stats* stats);
};
联发科 Hal3A 核心代码
关键代码

|
调试工具链:
bash
# 开启HAL3A日志
adb shell setprop debug.hal3av3.log 263
adb shell setprop debug.camera.log.hal3a 1
adb shell setprop vendor.debug.3a.log 1
# 查看AE/AWB/AF状态
adb shell setprop vendor.debug.ae_mgr.enable 1
adb shell setprop vendor.debug.awb_mgr.enable 1
adb shell setprop vendor.debug.af_mgr.enable 4
# Dump统计值和图像
adb shell setprop vendor.debug.camera.dump 1
核心类
cpp
// vendor/mediatek/proprietary/hardware/mtkcam3/
class Hal3A : public IHal3A {
public:
virtual bool update(const Request& request) = 0; // 核心接口
virtual void setParams(const Params& params) = 0;
virtual void getParams(Params& params) = 0;
// AE/AWB/AF 控制
virtual void setAEMode(AEMode mode) = 0;
virtual void setAFMode(AFMode mode) = 0;
virtual void triggerAF() = 0;
// 统计信息处理
virtual void onVsyncEnd() = 0; // 同步信号处理
virtual void processStats(const Stats& stats) = 0;
};
// P1 Node中的3A线程
class P1Node {
void onProcess3A(); // 3A Th 入口
void onSyncEnd(); // Vsync结束回调
// Magic Number管理
uint32_t mMagicNum; // 关联3A与帧
};
五、总结
联发科 Hal3A采用垂直集成思路,将3A算法深度嵌入P1 Node,通过Magic Number机制实现帧同步,优势在于稳定性高、集成度高,但灵活性受限。
高通 3A采用水平模块化思路,将3A算法解耦为独立Node,优势在可扩展性强、架构灵活,但开发复杂度高,需要深入理解CamX-CHI架构。
高通和联发科都遵循Android HAL3标准,所以在对外比如,Metadata接口、状态机定义、统计回环机制上等都保持一致,从而确保应用层兼容性。
本章主要介绍3A算法在高通和联发科平台的落地实现,如果你是影像行业的从业者,建议参考本文对照代码仔细拆解和溯源,这样才能理解更深。

AI这么发达了,我们技术人员或者内容创作者的价值在哪里?