【android camera】高通camx 预览流程

4 阅读3分钟

以高通(Qualcomm)架构为例,预览(Preview)流程是一个复杂的异步过程。我们将这个过程简化为从 AppKernel 的函数调用/逻辑链条。

这里采用了 Camera2 API + HAL3 + CamX/CHI 架构。


第一阶段:打开相机与配置流(Setup Phase)

在预览开始前,必须先建立管道(Pipeline)。

1. APP 层 (Java)

  • cameraManager.openCamera():请求打开相机。
  • cameraDevice.createCaptureSession():传入用于显示的 Surface(通常来自 SurfaceView 或 TextureView)。

2. Framework 层 (CameraService - Native)

  • CameraService::connectDevice():接收 App 请求。
  • CameraDeviceClient::initialize():初始化客户端。
  • Camera3Device::configureStreams()核心步骤,将 App 的 Surface 转换为 HAL 可理解的 camera3_stream_t

3. HAL3 接口层 (HIDL/AIDL)

  • ICameraDeviceSession::configureStreams():跨进程调用进入 HAL。

4. 高通 CamX 层 (UMD - User Mode Driver)

  • CamX::HAL3Device::ConfigureStreams():解析 Stream 需求。
  • CamX::StaticProperties::GetHwEnvironment():读取系统配置。
  • CamX::Pipeline::Create()关键,根据 XML 拓扑文件(Topology)选择预览路径(如:IFE -> BPS -> IPE)。

第二阶段:下发预览请求(Request Loop)

预览是一个不断的循环过程(Repeating Request)。

1. APP 层 (Java)

  • CaptureRequest.Builder.addTarget(surface):指定数据去向。
  • cameraCaptureSession.setRepeatingRequest(request):开启循环请求。

2. Framework 层 (CameraService - Native)

  • Camera3Device::RequestThread::threadLoop():一个死循环线程,不断处理请求。
  • Camera3Device::processCaptureRequest():将请求封装发送给 HAL。

3. HAL3 接口层 (HIDL/AIDL)

  • ICameraDeviceSession::process_capture_request():传送包含 Buffer 句柄的请求。

4. 高通 CamX 层 (UMD)

  • CamX::HAL3Entry::process_capture_request():入口函数。
  • CamX::ChiContext::ProcessCaptureRequest():如果是使用 CHI 架构(现代高通方案),会进入 CHI 外部算法控制层。
  • CamX::Request::Activate():激活一个请求实例。
  • CamX::Node::ProcessRequest():各节点(如 SensorNode, IFENode)开始处理。
  • CamX::HwDevice::SubmitRequest():准备好指令包(Packet),交给底层硬件。

第三阶段:底层驱动与硬件执行(Kernel Phase)

硬件真正开始干活。

1. Kernel 层 (KMD - Kernel Mode Driver)

  • cam_isp_mgr_apply_request():ISP 管理器接收请求。
  • v4l2_subdev_call(ops->s_stream):通过 V4L2 子设备调用启动流。
  • 驱动读取 XML 配置
    • cam_sensor_driver_i2c_write():根据 XML 定义的寄存器序列,通过 I2C 设置 Sensor(曝光、增益等)。
    • cam_isp_hw_config():配置 IFE (Image Front End) 的硬件寄存器。

2. 硬件执行 (Hardware - ISP/Sensor)

  • Sensor:感光并输出数据(通常是 MIPI RAW)。
  • CSIPHY/CSID:接收 MIPI 信号。
  • IFE (VFE):进行初步处理(黑电平校正、抠图等)。
  • IPE (Image Processing Engine):进行 3A 后的色彩转换、降噪、缩放(输出 YUV 格式)。

第四阶段:数据回传(Result/Buffer Return)

图像处理完成后,回传给 App 显示。

  1. Kernel:产生中断(IRQ),通知数据已写入内存。
  2. CamXCamX::HwDevice::OnInterrupt(),标志着硬件处理完成。
  3. CamXCamX::HAL3Entry::process_capture_result(),将填好数据的 Buffer 返还给 Framework。
  4. FrameworkCamera3Device::returnOutputBuffers()
  5. AppSurface 自动刷新,你在屏幕上看到了预览画面。

总结:关键术语与高通特色

  • XML 配置文件:在高通架构中,摄像头的拓扑结构(Pipeline 如何连通)、Sensor 的初始化参数、3A 的参数全部定义在 XML 文件中(位于 /vendor/etc/camera/)。CamX 会在初始化阶段解析这些 XML。
  • CamX vs CHI
    • CamX 是通用核心逻辑,负责与 Kernel 交互、管理硬件资源。
    • CHI (Camera Hardware Interface) 是高通为了方便厂商定制(如加水印、美颜、多摄逻辑)而剥离出来的插件层。
  • Buffer 传递:全过程不涉及图像数据的拷贝,只传递 Buffer 句柄(fd),所有层级都直接在同一块内存上通过硬件进行读写。