前言
接上一篇Android R camera Hal启动(上)接着写,把谷歌的代码都分析完成,高通/MTK的代码就不贴了。
代码流程分析
上一篇说到getProviderImpl函数。实例化了CameraProvider对象,先看CameraProvider的构造函数。
template<typename IMPL>
struct CameraProvider : public ICameraProvider {
CameraProvider() : impl() {
}
...
}
调用了impl也就是LegacyCameraProviderImpl_2_4的构造。
LegacyCameraProviderImpl_2_4::LegacyCameraProviderImpl_2_4() :
camera_module_callbacks_t({
sCameraDeviceStatusChange,
sTorchModeStatusChange}) {
mInitFailed = initialize();
}
camera_module_callbacks_t是HAL的回调函数,用于通知FW相机状态更新。直接看构造函数调用camera_module_callbacks_t比较奇怪,先看下LegacyCameraProviderImpl_2_4的类的申明和sCameraDeviceStatusChange/sTorchModeStatusChange两个函数的定义就能明白了。
struct LegacyCameraProviderImpl_2_4 : public camera_module_callbacks_t {
...
static void sCameraDeviceStatusChange(
const struct camera_module_callbacks* callbacks,
int camera_id,
int new_status);
static void sTorchModeStatusChange(
const struct camera_module_callbacks* callbacks,
const char* camera_id,
int new_status);
...
}
LegacyCameraProviderImpl_2_4是继承了camera_module_callbacks_t,所以类构造的同时使用sCameraDeviceStatusChange/sTorchModeStatusChange初始化了camera_module_callbacks_t中的camera_device_status_change/torch_mode_status_change函数指针。
camera_module_callbacks_t结构定义如下:
typedef struct camera_module_callbacks {
void (*camera_device_status_change)(const struct camera_module_callbacks*,
int camera_id,
int new_status);
void (*torch_mode_status_change)(const struct camera_module_callbacks*,
const char* camera_id,
int new_status);
} camera_module_callbacks_t;
再继续往下看,调用mInitFailed = initialize();看下initialize的实现:
bool LegacyCameraProviderImpl_2_4::initialize() {
camera_module_t *rawModule;
int err = hw_get_module(CAMERA_HARDWARE_MODULE_ID,
(const hw_module_t **)&rawModule);
if (err < 0) {
ALOGE("Could not load camera HAL module: %d (%s)", err, strerror(-err));
return true;
}
mModule = new CameraModule(rawModule);
err = mModule->init();
if (err != OK) {
ALOGE("Could not initialize camera HAL module: %d (%s)", err, strerror(-err));
mModule.clear();
return true;
}
ALOGI(