Android 9.0 Camera学习笔记

时间:2024-04-09 22:27:09

1. CameraService模块启动流程

Android 9.0 Camera学习笔记
CameraService是NativeService, 所以随着init启动并加入到Native ServiceManager中。


2. 相机startPreview流程图

Android 9.0 Camera学习笔记

- Camera的请求和响应处理流程

Camera FW和HAL3的请求和响应,还有数据交互都是基于Stream的(Camera3InputStream,Camera3OutputStream)

请求分为三大类:

  • Preview(预览)
  • Capture(拍照)
  • Recording(录像)

流程:

  1. Camera2Client 发起预览/拍照/录像请求;
  2. 创建(Preview/Capture/Recording)OutputStream(mSurface), 返回对应的streamId, 并记录在对应的Processor中;
  3. 创建(Preview/Capture/Recording)Request;
  4. 将需要请求数据的outputstream添加到request中;
  5. 初始化Request, 并最终加入到Request列表中;
  6. 在Camera3Device的threadLoop中处理所有的Request请求;
  7. 处理请求前, 从每个ouputstream中保存的surfaceProducer各自申请一块buffer(dequeueBuffer);
  8. 将buffer携带到request中, 然后发送携带了请求包含的所有outputstreams和每个stream对应的buffer到HAL3;
  9. HAL3收到并处理请求, 然后会填充camera获取的图象数据到携带的buffer, 并填充结果信息,并返回给Camera FW.
  10. Camera FW收到返回的内容之后, 获取到填充了图像信息的buffer和outputstream;
  11. 遍历所有outputStreams(请求时带给HAL的outputstreams),获取到每个outputstream中的surfaceProducer, 通过surfaceProducer将获取的buffer queueBuffer到图形队列BufferQueue中, 交给Consumer来处理;

- 注意

  1. CallbackProcessor和JpegProcessor 的Consumer是CpuConsumer, 注册的FrameAvailableListener是自己, 所以queueBuffer之后, 回调响应是自己的onFrameAvailable函数。
  2. CpuConsumer的lockNextBuffer(&buffer)可以获取到来自produser queue的buffer.
    • JpegProcessor 收到的图象buffer最终在CaptureSequencer中处理.
    • CaptureSequencer是一个状态机模型, 每个状态函数的返回值代表了要转移的状态.
  3. 最终完成拍照数据获取,是在CaptureSequencer::manageDone函数.

3. Camera2 API_2 从CameraActivity初始化到Camera preview的流程

Android 9.0 Camera学习笔记