1. 定义与核心特点
-
定义:
Offline Stream(离线流)是相机数据处理流程中的一种配置,不直接接收来自图像传感器的实时数据,而是处理已缓存的中间数据(如多帧合成的中间结果或算法处理后的数据)。 -
与实时流(Live Stream)的区别:
-
实时流:直接从传感器获取数据,处理速度需匹配传感器帧率(如预览画面)。
-
离线流:处理非实时数据,通常用于复杂算法(如HDR、多帧降噪)或后处理任务(如编码、存储)。
-
2. 离线流的应用场景
-
多帧合成(MFNR/MFHR):
通过缓存多帧RAW或YUV数据,离线流进行对齐、融合和降噪,输出高质量单帧图像。 -
高动态范围(HDR):
合并不同曝光的图像,提升动态范围。 -
视频编码:
将实时流生成的YUV数据转为H.264/HEVC格式并存储(如录像场景)。 -
AI后处理:
运行深度学习模型(如人像虚化、场景识别),需独立于实时流处理。
3. 离线流在高通CamX架构中的实现
(1) 架构设计
-
模块化处理:
高通CamX架构将功能划分为独立模块(如imglib
、stats
),每个模块通过端口(Port)连接形成流(Stream)。离线流通常由Sink模块(如imglib
)处理。 -
Pipeline管理:
每个用例(Usecase)定义一个Pipeline,离线流可能作为独立分支插入主实时流中。例如:Sensor → IFE(实时处理) → BPS(离线分支) → IPE(后处理) → 编码器 ```:cite[6]
(2) 数据流示例
以HDR场景为例:
-
实时流:Sensor输出多帧不同曝光的RAW数据,经IFE处理后缓存。
-
离线流:BPS节点从缓存中读取多帧,进行对齐和融合,结果传递给IPE进一步优化。
(3) 关键代码逻辑
-
Session与Pipeline:
每个会话(Session)通过mct_controller_new()
创建独立的Pipeline和MCT(Media Controller Thread)线程,管理离线流与实时流的协同。 -
线程调度:
MCT线程负责处理来自Image Server的消息,而Bus线程处理模块间事件,确保离线流任务异步执行。
4. 调试与性能优化
-
日志分析:
通过设置persist.vendor.camera.logInfoMask
属性,可追踪离线流节点的处理耗时(如imglib
模块的输入/输出延迟)。 -
资源隔离:
离线流通常分配至专用硬件(如DSP或GPU),避免与实时流竞争CPU资源。
5. 与Android框架的交互
在Android HAL层,离线流通过Camera3Stream
接口定义,应用层可通过CameraCharacteristics
查询设备支持的离线流能力(如REQUEST_AVAILABLE_CAPABILITIES_OFFLINE_PROCESSING
)。
总结:
Offline Stream在高通CamX架构中通过模块化设计和Pipeline管理实现复杂数据处理,适用于HDR、多帧降噪等场景,与实时流协作提升图像质量与系统效率。如需深入实现细节,可参考高通CamX源码中的media-controller
与imglib
模块。