文章目录
1. CameraService模块启动流程
CameraService是NativeService, 所以随着init启动并加入到Native ServiceManager中。
2. 相机startPreview流程图
- Camera的请求和响应处理流程
Camera FW和HAL3的请求和响应,还有数据交互都是基于Stream的(Camera3InputStream,Camera3OutputStream)
请求分为三大类:
- Preview(预览)
- Capture(拍照)
- Recording(录像)
流程:
- Camera2Client 发起预览/拍照/录像请求;
- 创建(Preview/Capture/Recording)OutputStream(mSurface), 返回对应的streamId, 并记录在对应的Processor中;
- 创建(Preview/Capture/Recording)Request;
- 将需要请求数据的outputstream添加到request中;
- 初始化Request, 并最终加入到Request列表中;
- 在Camera3Device的threadLoop中处理所有的Request请求;
- 处理请求前, 从每个ouputstream中保存的surfaceProducer各自申请一块buffer(dequeueBuffer);
- 将buffer携带到request中, 然后发送携带了请求包含的所有outputstreams和每个stream对应的buffer到HAL3;
- HAL3收到并处理请求, 然后会填充camera获取的图象数据到携带的buffer, 并填充结果信息,并返回给Camera FW.
- Camera FW收到返回的内容之后, 获取到填充了图像信息的buffer和outputstream;
- 遍历所有outputStreams(请求时带给HAL的outputstreams),获取到每个outputstream中的surfaceProducer, 通过surfaceProducer将获取的buffer queueBuffer到图形队列BufferQueue中, 交给Consumer来处理;
- 注意
- CallbackProcessor和JpegProcessor 的Consumer是CpuConsumer, 注册的FrameAvailableListener是自己, 所以queueBuffer之后, 回调响应是自己的onFrameAvailable函数。
- CpuConsumer的lockNextBuffer(&buffer)可以获取到来自produser queue的buffer.
-
- JpegProcessor 收到的图象buffer最终在CaptureSequencer中处理.
-
- CaptureSequencer是一个状态机模型, 每个状态函数的返回值代表了要转移的状态.
- 最终完成拍照数据获取,是在CaptureSequencer::manageDone函数.