frameworks/av/services/camera/libcameraservice/CameraService.cpp
status_t CameraService::enumerateProviders() {
status_t res;
std::vector<std::string> deviceIds;
{
Mutex::Autolock l(mServiceLock);
// 1. 初始化 provider 和 device 代码略
// 2. 初始化 vendortags
// 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;
}
创建VendorTagDescriptorCache
vendor 厂商自定义的 metadata
VendorTagDescriptorCache是一个Manager,管理不同Provider里面的Vendor Tag Descriptor,VendorTagDescriptor维护管理所有Vendor Tags的Section、Name、Type,ID之间的关系。
frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp
status_t CameraProviderManager::setUpVendorTags() {
sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
for (auto& provider : mProviders) {
tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor);
}
VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);
return OK;
}
vendor tag id 的生成
CameraProviderManager::ProviderInfo::ProviderInfo(
const std::string &providerName,
const std::string &providerInstance,
CameraProviderManager *manager) :
mProviderName(providerName),
mProviderInstance(providerInstance),
// 构造的时候自动产生,会根据字符串产生一个hash值
mProviderTagid(generateVendorTagId(providerName)),
mUniqueDeviceCount(0),
mManager(manager) {
(void) mManager;
}
vendor tag discripter 的生成, 将vendor tag 转花为discripter
status_t HidlProviderInfo::setUpVendorTags() {
if (mVendorTagDescriptor != nullptr)
return OK;
hardware::hidl_vec<VendorTagSection> vts;
Status status;
hardware::Return<void> ret;
const sp<hardware::camera::provider::V2_4::ICameraProvider> interface =
startProviderInterface();
if (interface == nullptr) {
return DEAD_OBJECT;
}
ret = interface->getVendorTags(
[&](auto s, const auto& vendorTagSecs) {
status = s;
if (s == Status::OK) {
vts = vendorTagSecs;
}
});
if (!ret.isOk()) {
ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s",
__FUNCTION__, mProviderName.c_str(), ret.description().c_str());
return DEAD_OBJECT;
}
if (status != Status::OK) {
return mapToStatusT(status);
}
// Read all vendor tag definitions into a descriptor
status_t res;
// 转化
if ((res = IdlVendorTagDescriptor::createDescriptorFromIdl<
hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>,
hardware::camera::common::V1_0::VendorTagSection>(vts,
/*out*/mVendorTagDescriptor))
!= OK) {
ALOGE("%s: Could not generate descriptor from vendor tag operations,"
"received error %s (%d). Camera clients will not be able to use"
"vendor tags", __FUNCTION__, strerror(res), res);
return res;
}
return OK;
}
Flashlight初始化
通过类来管理闪光灯
CameraServer通过CameraFlashlight来管理各CameraDevice的Flashlight,类图如下:
通过CameraFlashlight::findFlashUnits完成Flashlight的初始化,流程如下:
status_t CameraService::enumerateProviders() {
status_t res;
std::vector<std::string> deviceIds;
{
// 如果没有先创建 CameraFlashlight
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);
}
}
return OK;
}
findFlashUnits 层层调用
status_t CameraFlashlight::findFlashUnits() {
Mutex::Autolock l(mLock);
status_t res;
std::vector<String8> cameraIds;
// 1. 拿到所有的camera id
std::vector<std::string> ids = mProviderManager->getCameraDeviceIds();
int numberOfCameras = static_cast<int>(ids.size());
cameraIds.resize(numberOfCameras);
// No module, must be provider
for (size_t i = 0; i < cameraIds.size(); i++) {
cameraIds[i] = String8(ids[i].c_str());
}
//2. 释放 flash control
mFlashControl.clear();
//3. 遍历每个camera, 检测 camera id 是否存在于 mHasFlashlightMap
// 如果不存在,创建一个FlashlightControl
for (auto &id : cameraIds) {
ssize_t index = mHasFlashlightMap.indexOfKey(id);
if (0 <= index) {
continue;
}
bool hasFlash = false;
res = createFlashlightControl(id);
if (res) {
ALOGE("%s: failed to create flash control for %s", __FUNCTION__,
id.string());
} else {
// hasFlashUnit 调用链 service -- providerMgnager -- device info
res = mFlashControl->hasFlashUnit(id, &hasFlash);
if (res == -EUSERS || res == -EBUSY) {
ALOGE("%s: failed to check if camera %s has a flash unit. Some "
"camera devices may be opened", __FUNCTION__,
id.string());
return res;
} else if (res) {
ALOGE("%s: failed to check if camera %s has a flash unit. %s"
" (%d)", __FUNCTION__, id.string(), strerror(-res),
res);
}
mFlashControl.clear();
}
mHasFlashlightMap.add(id, hasFlash);
}
mFlashlightMapInitialized = true;
return OK;
}
为SPerfClass过滤Characteristics
针对主后置和主前置,过滤掉<1080p的JPEG尺寸
status_t CameraService::enumerateProviders() {
//
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;
}
执行条件:
peformance class 是anfroid s 加入的
ro.odm.build.media_performance_class >= 31
执行动作:
针对主后置和主前置,过滤掉<1080p的JPEG尺寸
CTS(SPerfClassTest.java)
testSPerfClassJpegSizesByCamera
流程