Qualcomm CamX 框架的 ZSL 场景中,"both target buffer fences" 通常指的是以下两个目标缓冲区的同步信号(fences):

  1. 实时预览缓冲区 (Preview Buffer)
  2. ZSL 输出缓冲区 (ZSL Buffer)

📸 1. 为什么 ZSL 需要等待两个缓冲区完成?

ZSL 模式下,ISP 同时为 实时预览ZSL 捕获帧 生成图像数据,但这两个数据流的处理路径有所区别:

Buffer 用途
Preview Buffer 实时显示在屏幕上的帧,主要用于用户取景。
ZSL Buffer 写入 ZSL Ring Buffer,用于快门按下后的帧选择。

当 HAL(Hardware Abstraction Layer)向 ISP 发送捕获请求时,ISP 需要并行生成这两种数据流,并在两者都处理完毕后,才能提供完整的 capture result


🔍 2. 数据流处理流程分析

帧生成与输出
  1. 实时预览路径

    • ISP 处理后的帧会传递到 Display,显示在取景器中。
    • 同时,将该帧写入 Preview Buffer,以便 HAL 使用。
  2. ZSL 捕获路径

    • 另一份相同的帧(RAW/YUV)被写入 ZSL Ring Buffer,等待快门触发时进行帧挑选(anchor frame)。
    • 这些帧可用于多帧合成、HDR、夜景模式。
Fence 信号的作用

Fence(同步信号)用于跟踪缓冲区的使用状态,防止数据竞争。

  • Preview Fence 标志实时帧生成完成。
  • ZSL Fence 标志 ZSL 帧写入 ZSL 缓冲区完成。

只有当**两个 Fence 都被信号触发(signaled)**后,HAL 才会认为此帧处理完毕,生成 CameraMetadata 并向 Framework 上报。


📊 3. 具体代码实现解析(CamX 框架)

CamX 中,相关逻辑主要位于 Result Submission 阶段,涉及以下模块:

  1. Frame Processing

    • 硬件 ISP 并行处理 Preview 和 ZSL 输出。
    • 通过 ChiFence 监控两者完成状态。
  2. Fence 等待与 Result 生成
    只有在以下条件满足时,才会生成 capture result


cpp

CopyEdit

if (previewFence->IsSignaled() && zslFence->IsSignaled()) { // 两个目标缓冲区均已完成,生成结果 SubmitCaptureResult(pCaptureResult); }

相关代码路径(Android 14 + Qualcomm 平台):

  • Fence 信号管理camxfence.cpp
  • Capture Result 提交camxhal3module.cpp

📌 4. 为什么需要等待两个 Fence?

原因一:确保数据一致性

  • ISP 可能对 PreviewZSL 进行不同的后处理(如降噪、锐化等)。
  • 需要确保两者完成后,元数据(如 AE、AWB、AF)与帧数据对齐。

原因二:支持复杂的多帧处理

  • ZSL 捕获通常涉及多帧合成(如 HDR、夜景模式)。
  • 需要等到 实时帧ZSL 帧 都准备好,才能执行 Anchor Frame Picking

📚 5. 总结

  • "Both target buffer fences" 指的是 Preview BufferZSL Buffer
  • HAL 必须等待这两个缓冲区都完成后,才能上报 capture result
  • 这种机制保证了数据一致性,支持 ZSL + 多帧合成 等复杂图像处理需求。
Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐