https://deepinout.com/android-camera-native-framework/camera-native-fw-api1-api2-to-hal3-flow-intro.html
1 API1->HAL3 参数设置流程
- 上层App调用Camera2Client的setParameters将参数送下来
- Camera2Client会将参数送给StreamingProcessor完成Parameters到CaptureRequest的转换
- 转换后的CaptureRequest (mPreviewRequest和mRecordingRequest)保存在StreamingProcessor中
2 API1->HAL3 startPreview流程
启动数据流 sensor不停采图
- 调用StreamingProcessor和JPEG/Callback/ZSL Processor的update Stream,创建Stream
- 再次更新Preview/Recording Request
- 调用StreamingProcessor的startStream,将Repeating request送给Camera3Device,Camera3Device执行ConfigureStream并submit request给HAL
3 API1->HAL3 参数回调流程
processFaceDetect 和 process3aState 通过 binder 通知上层
- FrameProcessorBase有一个线程不停问CameraDeviceBase是否有可用的CaptureResult
- 拿到可用的CaptureResult后送给FrameProcessor执行processSingleFrame,处理Face Detect回调和向Parameters更新3A State。
4 API1 -> HAL3 图像数据回调流程
4.1 API1 -> HAL3 图像数据回调流程 – 预览/录像
- StreamingProcessor(预览/录像)
通过 调用 StreamingProcessor的 onFrameAvailable 通知 上层的Consumer 去取 buffer queue 信息。
- CallbackProcessor
这里讨论非setPreviewCallbackTarget方式回调预览Data,PreviewCallbackTarget方式跟上面StreamingProcessor流程一样
4.2 API1 -> HAL3 图像数据回调流程 – 拍照
Google创建了一个CaptureSequencer来维护拍照的状态机转换。
- API1->HAL3 Non-ZSL && Non-AE Precapture 流程
非ZSL且不带AE Prepare Trigger的拍照流程如上图所示,整个拍照过程由CaptureSequencer来驱动,JpegProcessor收到拍照图像后,通知给CaptureSequencer负责回调给App。
HAL 层采到照片时会回调 JpegProcessor的onFrameAvailable
4.3 API2->HAL3 控制流程与参数回调
- CameraDeviceClient收到上层的调用后,会对应调用到Camera3Device,进而调用到HAL层的接口
- FrameProcessorBase拿到Result Metadata后会回调给CameraDeviceClient,CameraDeviceClient再通过onResultReceived接口回调给上层
4.4 API2->HAL3 数据流回调
API2中,所有数据流都走BufferQueue,Camera3Device通知Camera3Stream buffer处理完毕后,会直接queueBuffer给BufferQueue,进而Consumer就会被通知到有Buffer上来了。
Consumer的 onFrameAvailable回调会被调用