https://deepinout.com/android-camera-native-framework/cameraserver-process-startup-enumerateproviders-overview.html
1 Android Camera HAL接口简介
Android Camera HAL接口分成HIDL和AIDL两种,谷歌之后会强推AIDL。
核心接口如下:
- ICameraProvider管理多个ICameraDevice
- ICameraDevice管理和维护某一颗CameraDevice
- 通过ICameraProvider获取到ICameraDevice
- 通过ICameraDevice获取到ICameraDeviceSession
- 初始化时,ICameraProvider和ICameraDevice的实例就会被创建起来,
ICameraDeviceSession要open camera时才创建,close camera时销毁
HIDL代码路径:
/hardware/interfaces/camera/common/1.0
/hardware/interfaces/camera/device/1.0
/hardware/interfaces/camera/metadata/1.0
/hardware/interfaces/camera/provider/1.0
AIDL代码路径:
/hardware/interfaces/camera/common/aidl
/hardware/interfaces/camera/device/aidl
/hardware/interfaces/camera/metadata/aidl
/hardware/interfaces/camera/provider/aidl
2 CameraService与CameraProviderManager的关系
2.1 CameraService
ICameraService的实现,CameraService与HAL Provider的交互要通过
CameraProviderManager
2.2 CameraProviderManager
负责管理 Camera HAL Providers
3 CameraProviderManager中的ProviderInfo
CameraProviderManager抽象出ProviderInfo来屏蔽HIDL和AIDL Provider的差异,
将差异部分交给HidlProviderInfo和AidlProviderInfo去处理。
4 enumerateProviders总体流程介绍
4.1 有哪些情况会调用到
- CameraServer进程启动时(onFirstRef)
- CameraServer进程启动后,有新的Provider注册到ServiceManager时(onNewProviderRegistered)
4.2 enumerateProviders流程介绍
- 创建CameraProviderManager,并调用initialize完成初始化
- 初始化 VendorTags
- 初始化Flashlight并完成枚举动作
- 针对主前/后摄,为SPerfClass过滤CameraCharacteristics
frameworks/av/services/camera/libcameraservice/CameraService.cpp
status_t CameraService::enumerateProviders() {
status_t res;
std::vector deviceIds;
{
Mutex::Autolock l(mServiceLock);
if (nullptr == mCameraProviderManager.get()) {
mCameraProviderManager = new CameraProviderManager();
res = mCameraProviderManager->initialize(this);
if (res != OK) {
ALOGE("%s: Unable to initialize camera provider manager: %s (%d)",
__FUNCTION__, strerror(-res), res);
logServiceError(String8::format("Unable to initialize camera provider manager"),
ERROR_DISCONNECTED);
return res;
}
}
// Setup vendor tags before we call get_camera_info the first time
// because HAL might need to setup static vendor keys in get_camera_info
// TODO: maybe put this into CameraProviderManager::initialize()?
mCameraProviderManager->setUpVendorTags();
if (nullptr == mFlashlight.get()) {
mFlashlight = new CameraFlashlight(mCameraProviderManager, this);
}
res = mFlashlight->findFlashUnits();
if (res != OK) {
ALOGE("Failed to enumerate flash units: %s (%d)", strerror(-res), res);
}
deviceIds = mCameraProviderManager->getCameraDeviceIds();
}
for (auto& cameraId : deviceIds) {
String8 id8 = String8(cameraId.c_str());
if (getCameraState(id8) == nullptr) {
onDeviceStatusChanged(id8, CameraDeviceStatus::PRESENT);
}
}
// Derive primary rear/front cameras, and filter their charactierstics.
// This needs to be done after all cameras are enumerated and camera ids are sorted.
if (SessionConfigurationUtils::IS_PERF_CLASS) {
// Assume internal cameras are advertised from the same
// provider. If multiple providers are registered at different time,
// and each provider contains multiple internal color cameras, the current
// logic may filter the characteristics of more than one front/rear color
// cameras.
Mutex::Autolock l(mServiceLock);
filterSPerfClassCharacteristicsLocked();
}
return OK;
}