3. MTK Camera HAL 架构分析:模块划分与关键数据结构
本章深入剖析 MediaTek(MTK)平台的 Camera HAL 架构。与 Qualcomm(QCOM)平台高度模块化、依赖 CHI(Camera Hardware Interface)架构不同,MTK 的 Camera HAL 更强调硬件抽象与 ISP(Image Signal Processor)流水线的紧耦合,其核心设计围绕 HAL、ISP、AAA(Auto Focus/Auto Exposure/Auto White Balance) 三大模块展开。理解这一架构是进行平台适配与性能调优的基础。
架构核心差异: QCOM 的 HAL 通过 CHI 架构将算法与硬件解耦,而 MTK 的 HAL 则通过 P1(Pre-ISP)/ P2(Post-ISP) 流水线以及 AAA 算法库 实现高度集成的硬件控制。适配工作的重点在于理解 MTK 特有的 Streaming 管理 与 3A 同步机制。
3.1 MTK Camera HAL 模块划分
MTK Camera HAL 从逻辑上可划分为三个核心层次,它们共同协作完成从应用层请求到底层硬件驱动的完整链路。
| 模块 | 主要职责 | 关键组件/文件 | 与 QCOM 对应关系 |
|---|---|---|---|
| HAL 层 | 实现 Android Camera HAL3 接口,管理 Camera 设备生命周期、Session、Stream 和 Request。 | CameraDevice.cpp, CameraHALManager.cpp |
类似 QCOM 的 QCamera2Hal |
| ISP 层 | 负责图像信号处理流水线,包括 RAW 域处理(P1)和 YUV 域处理(P2),以及 3A 统计数据的生成。 | isp_drv.cpp, p1_proc.cpp, p2_proc.cpp |
类似 QCOM 的 IFace 和 IPE |
| AAA 层 | 实现自动对焦(AF)、自动曝光(AE)、自动白平衡(AWB)算法,以及闪光灯控制、HDR 策略等。 | aaa_hal.cpp, af_algo.cpp, ae_algo.cpp |
类似 QCOM 的 mm-camera 中的 3A 模块 |
适配要点: 在从 QCOM 向 MTK 迁移时,HAL 层的接口适配相对直接,真正的难点在于 ISP 流水线的配置(如 P1 的 RAW 输出格式、P2 的缩放与裁剪参数)以及 AAA 算法的参数调优。MTK 的 ISP 通常通过 私有 metadata 与 HAL 层通信,这是适配中需要重点关注的隐藏接口。
3.2 关键数据结构与流程
MTK Camera HAL 的核心数据流围绕 Request 和 Result 展开,但其内部使用了大量私有数据结构来管理 ISP 流水线和 3A 状态。以下是几个关键的数据结构及其在流程中的作用。
3.2.1 核心数据结构
| 数据结构 | 所属模块 | 关键字段 | 作用描述 |
|---|---|---|---|
NSCameraParameter |
HAL | feature, data, type |
MTK 自定义的通用参数结构,用于在 HAL 内部模块间传递私有配置(如 ISP 模式、3A 策略)。 |
isp_param_t |
ISP | p1_param, p2_param, sensor_param |
封装 P1(RAW 处理)和 P2(YUV 处理)阶段的配置参数,包括分辨率、帧率、裁剪窗口等。 |
aaa_stat_t |
AAA | ae_stat, af_stat, awb_stat |
存储从 ISP 硬件获取的 3A 统计数据,是 AAA 算法进行闭环控制的输入。 |
hal_3a_result_t |
AAA | exposure, gain, lens_pos, wb_gain |
AAA 算法计算后的输出结果,用于更新 Sensor 和 ISP 的寄存器。 |
3.2.2 关键流程:从 Request 到 Frame
一个典型的 Capture Request 在 MTK HAL 中的处理流程如下:
- Request 分发: HAL 层收到 Framework 的
processCaptureRequest(),将其转换为内部NSCameraParameter列表,并分发到 ISP 和 AAA 模块。 - ISP 流水线配置: ISP 模块根据 Request 中的输出 Stream 配置(如 YUV_420_888、JPEG),设置 P1 和 P2 的处理参数。P1 负责从 Sensor 接收 RAW 数据并进行预处理(如坏点校正、黑电平补偿),P2 负责进行缩放、裁剪、格式转换等。
- AAA 参数计算: AAA 模块根据上一帧的统计信息(
aaa_stat_t)和当前 Request 的 3A 控制参数,运行算法,生成新的hal_3a_result_t。 - 硬件同步与捕获: ISP 和 AAA 的参数通过 私有 metadata 同步到 Kernel 驱动。Sensor 按照新的曝光和增益设置进行捕获,ISP 硬件按照配置的流水线处理 RAW 数据。
- Result 返回: 处理完成的 Buffer(YUV/JPEG)和包含 3A 结果、时间戳的 metadata 被封装成
CaptureResult,返回给 Framework。
3.3 模块间通信机制
MTK Camera HAL 的模块间通信主要依赖以下两种机制:
- 私有 Metadata 通道: 通过
NSCameraParameter和camera_metadata_t的扩展 Tag(如MTK_SENSOR_EXPOSURE_TIME),实现 HAL 层与 ISP/AAA 模块之间的参数传递。这是最核心的通信方式,适配时需要仔细核对 Tag 定义。 - 回调与事件机制: AAA 模块通过注册回调函数,将计算出的 3A 结果(如新的曝光时间)主动推送给 ISP 模块或 HAL 层。ISP 模块在完成一帧处理后,也会通过回调通知 HAL 层取走 Result。
适配陷阱: 在 QCOM 平台上,很多 3A 参数是通过标准的 Android Metadata(如
ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION)传递的。但在 MTK 平台上,部分高级功能(如特定的 HDR 模式、多帧降噪)的配置必须通过 MTK 私有 Tag 进行。如果直接复用 QCOM 的代码,忽略这些私有 Tag,会导致功能异常或性能下降。务必查阅 MTK 的 mtk_metadata_tags.h 文件。
3.4 小结
MTK Camera HAL 的架构核心在于 HAL-ISP-AAA 三层紧密协作,通过私有 metadata 和回调机制实现高效的数据同步。与 QCOM 的 CHI 架构相比,MTK 的架构更偏向于硬件直控,ISP 流水线和 3A 算法的耦合度更高。在进行平台适配时,深入理解 NSCameraParameter、isp_param_t 等私有数据结构,以及 Request 到 Frame 的完整流程,是确保 Camera 功能正确性和性能达标的关键。