本讲是Android Camera Native Framework专题的第26讲,我们介绍Camera Native FW Device架构介绍。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
Camera Device主要交互逻辑
从两个角度来看Camera Device架构
- 提供接口给上层控制操作Camera设备 – CameraDeviceBase
-
回调Result Metadata和Image Buffer给上层 – FrameProcessor和Stream
提供接口给上层控制操作Camera – CameraDeviceBase
- CameraDeviceBase继承FrameProducer,实现对外获取Result metadata的接口
-
CameraDeviceBase接口用于Client操作HAL2/HAL3 Device, Camera2Device是过渡产品,代码已经废弃
-
HidlCamera3Device对接HIDL HAL层接口,AidlCamera3Device对接AIDL HAL层接口,他们都继承自Camera3Device
回调Result Metadata架构 – FrameProcessor
- FrameProcessorBase启动一个线程调用FrameProducer的waitForNextFrame和getNextResult从Result Queue里面获取CaptureResult
- Camera API2的Result metadata处理逻辑在FrameProcessorBase里面
- Camera API1的Result metadata处理逻辑在FrameProcessor里面
API2 回调Image Buffer架构 – Camera Stream
- Camera3Device根据配置信息决定创建Camera3InputStream/Camera3OutputStream/Camera3SharedOutputStream
-
camera_stream是一个结构体,与HAL Stream长得一模一样
疑问 | 答案 |
---|---|
为什么要抽象出 Camera3Stream | 1.Input和Output Stream的基类,继承camera_stream(与HAL Stream长得一样的结构体) 2.维护Stream的状态机切换 3.提供接口访问Stream的基本信息,比如ID、width、height、usage、dataspace等等 4.提供接口转换成HAL Stream |
为什么要抽象出 Camera3IOStreamBase | Input和Output Stream的基类,用于维护哪些Buffer给HAL了,感觉这个类有点冗余了,直接放Camera3Stream可能更好 |
为什么要抽象出 Camera3OutputStreamInterface | 1.Camera3Device对Input Stream和Output Stream操作的流程完全不一样,将Output Stream的特殊操作抽象出来放到Camera3OutputStreamInterface 2.对Input Stream的操作还是放在Camera3Stream,这是做得不太好的地方 |
API1 回调Image Buffer架构 – Processor
上层使用API1时,Buffer送到Stream后,要么直接送给上层(Preview+Recording Stream),要么送给Processor取出Buffer回调给上层。
Processor | 作用 |
---|---|
StreamingProcessor | 创建Preview和Recording的Stream |
JpegProcessor | 创建Jpeg的Stream,用于Jpeg拍照 |
CallbackProcessor | 创建Callback的Stream,用于预览Callback |
ZslProcessor | 创建ZSL的Stream,用于实现ZSL逻辑 |