Camera2API2
frameworks\base\core\java\android\hardware\camera2\CameraManager.java
或者
/frameworks/base/core/java/android/hardware/camera2/Impl/CameraDeviceImpl.java
此处触发 onOpened 与 onUnconfigured 这两个回调,每个回调都是通过 mDeviceHandler 启用一个新线程来调用的。
退回去看CameraManager.java 中opencameradevicAsync方法的connectDevice到CameraService
/frameworks/av/services/camera/libcameraservice/CameraService.cpp
初始化 client 实例。注意此处的模板类型 client 即是 CameraDeviceClient,传入的参数 mCameraProviderManager 则是与 HAL service 有关,这个相关内容之后再分析。
makeClient 主要是根据 API 版本以及 HAL 版本来选择生成具体的 Client 实例。对于 HAL3 且 CameraAPI2 的情况,实例化了 CameraDeviceClient 类作为 Client(注意此处构造传入了 ICameraDeviceCallbacks,这是连接到 CameraDeviceImpl 的远端回调) 。
最终,这一 Client 就沿着前面分析下来的路径返回到 CameraDeviceImpl 实例中,被保存到 mRemoteDevice。
目前只说Camera_API_3.0之后的
/frameworks/av/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
/frameworks/av/services/camera/libcameraservice/common/Camera2ClientBase.cpp
Camera2ClientBase是一个模板类,这里的TClientBase是CameraDeviceClientBase,可以从CameraDeviceClient的继承关系看出。除了调用父类TClientBase(CameraDeviceClientBase)的构造函数外,还创建Camera3Device实例中设置了两个回调
再回到: /frameworks/av/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
重要:上面那段话告诉我们Android还有另一种方式调用Camera,就是使用NDK API
现在返回去再看 /frameworks/av/services/camera/libcameraservice/CameraService.cpp
在connectHlper() 方法中
/frameworks/av/services/camera/libcameraservice/api2/CameraDeviceClient.cpp
/frameworks/av/services/camera/libcameraservice/common/Camera2ClientBase.cpp
frameworks/av/services/camera/libcameraservice/common/Camera2ClientBase.h
frameworks/av/services/camera/libcameraservice/device3/Camera3Device.h
frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
在返回看frameworks/av/services/camera/libcameraservice/device3/Camera3Device.cpp
中Camera3Device::initialize方法中manager->openSession
hardware\interfaces\camera\device\3.2\default\CameraDevice.cpp
/hardware/interfaces/camera/common/1.0/default/CameraModule.cpp
这里的:mModule->common.methods->open(&mModule->common, id, device)就是底层HAL接口,
高通入口/hardware/qcom/camera/msm8998/QCamera2/QCamera2Hal.cpp
先看hardware\libhardware\include\hardware\hardware.h
再看/hardware/libhardware/include/hardware/camera3.h
camera3.h还有两个个重要的结构体
返回去再看hardware\interfaces\camera\device\3.2\default\CameraDevice.cpp 中的
Return<void> CameraDevice::open方法创建CameraDeviceSession
/hardware/interfaces/camera/device/3.2/default/CameraDeviceSession.cpp
至此就进入HAL