CameraProviderManager.cpp revision cdb74a6840fc4ae594afadf5eedc1d27106989ea
12f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala/* 22f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * Copyright (C) 2016 The Android Open Source Project 32f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * 42f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 52f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * you may not use this file except in compliance with the License. 62f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * You may obtain a copy of the License at 72f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * 82f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 92f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * 102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * See the License for the specific language governing permissions and 142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * limitations under the License. 152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala */ 162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define LOG_TAG "CameraProviderManager" 182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala//#define LOG_NDEBUG 0 202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include "CameraProviderManager.h" 222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 236540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh#include <chrono> 248d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala#include <inttypes.h> 252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include <hidl/ServiceManagement.h> 2671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev#include <functional> 2771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev#include <camera_metadata_hidden.h> 282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace android { 302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalausing namespace ::android::hardware::camera; 322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalausing namespace ::android::hardware::camera::common::V1_0; 332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace { 352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the 362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// service manager 372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string kLegacyProviderName("legacy/0"); 382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// Slash-separated list of provider types to consider for use via the old camera API 402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string kStandardProviderTypes("internal/legacy"); 412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} // anonymous namespace 432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::HardwareServiceInteractionProxy 452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::sHardwareServiceInteractionProxy{}; 462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::~CameraProviderManager() { 482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener, 512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ServiceInteractionProxy* proxy) { 524c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh std::lock_guard<std::mutex> lock(mInterfaceMutex); 534c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh if (proxy == nullptr) { 544c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__); 554c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh return BAD_VALUE; 562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 574c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh mListener = listener; 584c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh mServiceProxy = proxy; 594c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh 604c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh // Registering will trigger notifications for all already-known providers 614c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh bool success = mServiceProxy->registerForNotifications( 624c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh /* instance name, empty means no filter */ "", 634c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh this); 644c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh if (!success) { 654c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh ALOGE("%s: Unable to register with hardware service manager for notifications " 664c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh "about camera providers", __FUNCTION__); 674c5b1c777680df26af1d28624b99f8388fb9df4cYin-Chia Yeh return INVALID_OPERATION; 686540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh } 695d7e5151e2572413fa7e30a8f65beadd89f45416Emilian Peev 706566536c89a9e8646404bd2e671e3e081c181b4aEino-Ville Talvala // See if there's a passthrough HAL, but let's not complain if there's not 718d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala addProviderLocked(kLegacyProviderName, /*expected*/ false); 726566536c89a9e8646404bd2e671e3e081c181b4aEino-Ville Talvala 732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaint CameraProviderManager::getCameraCount() const { 772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int count = 0; 792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 80e8e9e191502ce306a04221e10ea2fe06ee40cacbYin-Chia Yeh count += provider->mUniqueDeviceCount; 812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return count; 832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 85f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peevint CameraProviderManager::getAPI1CompatibleCameraCount() const { 862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int count = 0; 882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) { 90cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev count += provider->mUniqueAPI1CompatibleCameraIds.size(); 912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return count; 942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastd::vector<std::string> CameraProviderManager::getCameraDeviceIds() const { 972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::vector<std::string> deviceIds; 992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 100dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh for (auto& id : provider->mUniqueCameraIds) { 101dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh deviceIds.push_back(id); 102dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh } 103dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh } 104dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh return deviceIds; 105dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh} 106dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh 107f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peevstd::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const { 108dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh std::lock_guard<std::mutex> lock(mInterfaceMutex); 109dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh std::vector<std::string> deviceIds; 110dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh for (auto& provider : mProviders) { 111dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) { 112cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev for (auto& id : provider->mUniqueAPI1CompatibleCameraIds) { 113cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev deviceIds.push_back(id); 114dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh } 1152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceIds; 1182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const { 1212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return isValidDeviceLocked(id, majorVersion); 1232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const { 1262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) { 1292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return true; 1302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return false; 1342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::hasFlashUnit(const std::string &id) const { 1372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return false; 1412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->hasFlashUnit(); 1432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getResourceCost(const std::string &id, 1462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraResourceCost* cost) const { 1472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *cost = deviceInfo->mResourceCost; 1532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 1542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getCameraInfo(const std::string &id, 1572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo* info) const { 1582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->getCameraInfo(info); 1642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getCameraCharacteristics(const std::string &id, 1672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraMetadata* characteristics) const { 1682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1700b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 1712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->getCameraCharacteristics(characteristics); 1742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getHighestSupportedVersion(const std::string &id, 1772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::hidl_version *v) { 1782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::hidl_version maxVersion{0,0}; 1812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool found = false; 1822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mId == id) { 1852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mVersion > maxVersion) { 1862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala maxVersion = deviceInfo->mVersion; 1872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala found = true; 1882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!found) { 1932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 1942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *v = maxVersion; 1962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 1972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 199dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yehbool CameraProviderManager::supportSetTorchMode(const std::string &id) { 200dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh std::lock_guard<std::mutex> lock(mInterfaceMutex); 201dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh bool support = false; 202dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh for (auto& provider : mProviders) { 203dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh auto deviceInfo = findDeviceInfoLocked(id); 204dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh if (deviceInfo != nullptr) { 205dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh provider->mInterface->isSetTorchModeSupported( 206dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh [&support](auto status, bool supported) { 207dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh if (status == Status::OK) { 208dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh support = supported; 209dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh } 210dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh }); 211dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh } 212dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh } 213dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh return support; 214dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh} 215dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh 2162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) { 2172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 2202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->setTorchMode(enabled); 2232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 2242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 225067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yehstatus_t CameraProviderManager::setUpVendorTags() { 22671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache(); 22771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 22871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev VendorTagDescriptorCache::clearGlobalVendorTagCache(); 229067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (auto& provider : mProviders) { 230067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh hardware::hidl_vec<VendorTagSection> vts; 231067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh Status status; 2328d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 2338d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = provider->mInterface->getVendorTags( 234067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh [&](auto s, const auto& vendorTagSecs) { 235067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh status = s; 236067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (s == Status::OK) { 237067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh vts = vendorTagSecs; 238067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 239067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh }); 2408d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 2418d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s", 2428d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, provider->mProviderName.c_str(), ret.description().c_str()); 2438d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 2448d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 245067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (status != Status::OK) { 246067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return mapToStatusT(status); 247067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 248067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 249067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Read all vendor tag definitions into a descriptor 250067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<VendorTagDescriptor> desc; 251067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh status_t res; 252067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/desc)) 253067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh != OK) { 254067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: Could not generate descriptor from vendor tag operations," 255067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "received error %s (%d). Camera clients will not be able to use" 256067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "vendor tags", __FUNCTION__, strerror(res), res); 257067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return res; 258067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 259067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 26071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev tagCache->addVendorDescriptor(provider->mProviderTagid, desc); 261067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 26271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 26371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache); 26471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 265067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return OK; 266067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh} 267067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 2680b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvalastatus_t CameraProviderManager::openSession(const std::string &id, 2690b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback, 2700b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*out*/ 2710b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session) { 2720b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2730b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2740b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2750b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, 2760b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 2770b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2780b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2790b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo); 2800b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2810b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala Status status; 2828d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 2838d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = deviceInfo3->mInterface->open(callback, [&status, &session] 2840b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) { 2850b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala status = s; 2860b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (status == Status::OK) { 2870b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala *session = cameraSession; 2880b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala } 2890b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala }); 2908d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 2918d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error opening a session for camera device %s: %s", 2928d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, id.c_str(), ret.description().c_str()); 2938d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 2948d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 2950b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala return mapToStatusT(status); 2960b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala} 2970b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2980b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvalastatus_t CameraProviderManager::openSession(const std::string &id, 2990b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback, 3000b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*out*/ 3010b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala sp<hardware::camera::device::V1_0::ICameraDevice> *session) { 3020b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 3030b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 3040b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 3050b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, 3060b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*minVersion*/ {1,0}, /*maxVersion*/ {2,0}); 3070b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 3080b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 3090b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo); 3100b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 3118d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<Status> status = deviceInfo1->mInterface->open(callback); 3128d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!status.isOk()) { 3138d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error opening a session for camera device %s: %s", 3148d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, id.c_str(), status.description().c_str()); 3158d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 3168d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 3170b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (status == Status::OK) { 3180b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala *session = deviceInfo1->mInterface; 3190b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala } 3200b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala return mapToStatusT(status); 3210b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala} 3220b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 3230b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 3242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::onRegistration( 3252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& /*fqName*/, 3262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& name, 3272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool /*preexisting*/) { 3282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 3292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3308d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala addProviderLocked(name); 3312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Return<void>(); 3322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { 3352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 3362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 3382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala provider->dump(fd, args); 3392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked( 3440b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const std::string& id, 3450b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const { 3462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 3472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 3480b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo->mId == id && 3490b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) { 3502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo.get(); 3512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 3552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 35771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peevmetadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked( 35871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const std::string& id, hardware::hidl_version minVersion, 35971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev hardware::hidl_version maxVersion) const { 36071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID; 36171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 36271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev std::lock_guard<std::mutex> lock(mInterfaceMutex); 36371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev for (auto& provider : mProviders) { 36471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev for (auto& deviceInfo : provider->mDevices) { 36571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if (deviceInfo->mId == id && 36671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev minVersion <= deviceInfo->mVersion && 36771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev maxVersion >= deviceInfo->mVersion) { 36871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev return provider->mProviderTagid; 36971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 37071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 37171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 37271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 37371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev return ret; 37471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev} 3752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3768d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvalastatus_t CameraProviderManager::addProviderLocked(const std::string& newProvider, bool expected) { 3772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (const auto& providerInfo : mProviders) { 3782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (providerInfo->mProviderName == newProvider) { 3792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__, 3802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala newProvider.c_str()); 3812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return ALREADY_EXISTS; 3822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3848d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala 3858d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala sp<provider::V2_4::ICameraProvider> interface; 3868d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala interface = mServiceProxy->getService(newProvider); 3872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (interface == nullptr) { 3892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (expected) { 3908d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__, 3918d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala newProvider.c_str()); 3922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 3932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 3942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<ProviderInfo> providerInfo = 3992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala new ProviderInfo(newProvider, interface, this); 4002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = providerInfo->initialize(); 4012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 4022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return res; 4032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviders.push_back(providerInfo); 4062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 4082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::removeProvider(const std::string& provider) { 4118d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala std::unique_lock<std::mutex> lock(mInterfaceMutex); 4128d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala std::vector<String8> removedDeviceIds; 4138d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala status_t res = NAME_NOT_FOUND; 4142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto it = mProviders.begin(); it != mProviders.end(); it++) { 4152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if ((*it)->mProviderName == provider) { 4168d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala removedDeviceIds.reserve((*it)->mDevices.size()); 4178d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala for (auto& deviceInfo : (*it)->mDevices) { 4188d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala removedDeviceIds.push_back(String8(deviceInfo->mId.c_str())); 4198d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 4202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviders.erase(it); 4218d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala res = OK; 4228d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala break; 4232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4258d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (res != OK) { 4268d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__, 4278d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala provider.c_str()); 4288d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } else { 4298d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala // Inform camera service of loss of presence for all the devices from this provider, 4308d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala // without lock held for reentrancy 4318d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala sp<StatusListener> listener = getStatusListener(); 4328d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (listener != nullptr) { 4338d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala lock.unlock(); 4348d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala for (auto& id : removedDeviceIds) { 4358d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT); 4368d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 4378d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 4388d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 4398d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return res; 4408d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala} 4418d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala 4428d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvalasp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const { 4438d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return mListener.promote(); 4442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala/**** Methods for ProviderInfo ****/ 4472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::ProviderInfo( 4502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &providerName, 4512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<provider::V2_4::ICameraProvider>& interface, 4522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraProviderManager *manager) : 4532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName(providerName), 4542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface), 45571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev mProviderTagid(generateVendorTagId(providerName)), 456cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev mUniqueDeviceCount(0), 4572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mManager(manager) { 4582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala (void) mManager; 4592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::initialize() { 4622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = parseProviderName(mProviderName, &mType, &mId); 4632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 4642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__); 4652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4676540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh ALOGI("Connecting to new camera provider: %s, isRemote? %d", 4686540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh mProviderName.c_str(), mInterface->isRemote()); 4698d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<Status> status = mInterface->setCallback(this); 4708d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!status.isOk()) { 4718d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s", 4728d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mProviderName.c_str(), status.description().c_str()); 4738d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 4748d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 4752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 4762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to register callbacks with camera provider '%s'", 4772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 4782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 4792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4808d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala 4818d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<bool> linked = mInterface->linkToDeath(this, /*cookie*/ mId); 4828d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!linked.isOk()) { 4838d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s", 4848d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 4858d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 4868d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } else if (!linked) { 4878d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGW("%s: Unable to link to provider '%s' death notifications", 4888d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 4898d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 4902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get initial list of camera devices, if any 4922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::vector<std::string> devices; 4938d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret = mInterface->getCameraIdList([&status, &devices]( 4942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status idStatus, 4952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) { 4962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = idStatus; 4972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status == Status::OK) { 4982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (size_t i = 0; i < cameraDeviceNames.size(); i++) { 4992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala devices.push_back(cameraDeviceNames[i]); 5002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } }); 5028d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 5038d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s", 5048d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mProviderName.c_str(), linked.description().c_str()); 5058d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 5068d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 5072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 5082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to query for camera devices from provider '%s'", 5092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 5102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 5112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5138d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala sp<StatusListener> listener = mManager->getStatusListener(); 5142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& device : devices) { 5158d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala std::string id; 5168d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala status_t res = addDevice(device, 5178d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, &id); 5182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 5192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)", 5202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, device.c_str(), strerror(-res), res); 5218d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala continue; 5228d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 5238d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (listener != nullptr) { 5248d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala listener->onDeviceStatusChanged(String8(id.c_str()), CameraDeviceStatus::PRESENT); 5252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 528e8e9e191502ce306a04221e10ea2fe06ee40cacbYin-Chia Yeh for (auto& device : mDevices) { 529dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh mUniqueCameraIds.insert(device->mId); 530cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev if (device->isAPI1Compatible()) { 531cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev mUniqueAPI1CompatibleCameraIds.insert(device->mId); 532cdb74a6840fc4ae594afadf5eedc1d27106989eaEmilian Peev } 533e8e9e191502ce306a04221e10ea2fe06ee40cacbYin-Chia Yeh } 534dc3134e3f612050ae2c8a0d847bf091c53ed2f4cYin-Chia Yeh mUniqueDeviceCount = mUniqueCameraIds.size(); 535e8e9e191502ce306a04221e10ea2fe06ee40cacbYin-Chia Yeh 5362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera provider %s ready with %zu camera devices", 5372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), mDevices.size()); 5382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 5402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string& CameraProviderManager::ProviderInfo::getType() const { 5432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mType; 5442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, 5472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) { 5482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Enumerating new camera device: %s", name.c_str()); 5502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t major, minor; 5522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string type, id; 5532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = parseDeviceName(name, &major, &minor, &type, &id); 5552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 5562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return res; 5572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (type != mType) { 5592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__, 5602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala type.c_str(), mType.c_str()); 5612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 5622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (mManager->isValidDeviceLocked(id, major)) { 5642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__, 5652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), id.c_str(), major); 5662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 5672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::unique_ptr<DeviceInfo> deviceInfo; 5702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch (major) { 5712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case 1: 57271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, mProviderTagid, 57371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev id, minor); 5742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 5752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case 3: 57671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid, 57771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev id, minor); 5782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 5792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala default: 5802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 5812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), major); 5822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 5832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return BAD_VALUE; 5852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo->mStatus = initialStatus; 5862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDevices.push_back(std::move(deviceInfo)); 5882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (parsedId != nullptr) { 5902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *parsedId = id; 5912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 5932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { 5968d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n", 5978d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough", 5988d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala mDevices.size()); 5992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& device : mDevices) { 601d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(), 602d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala device->mVersion.get_major(), device->mVersion.get_minor()); 603d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost); 604d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala if (device->mResourceCost.conflictingDevices.size() == 0) { 605d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Conflicting devices: None\n"); 606d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else { 607d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Conflicting devices:\n"); 6082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { 609d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " %s\n", 6102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device->mResourceCost.conflictingDevices[i].c_str()); 6112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 613d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " API1 info:\n"); 614d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Has a flash unit: %s\n", 615d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala device->hasFlashUnit() ? "true" : "false"); 616d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala hardware::CameraInfo info; 617d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala status_t res = device->getCameraInfo(&info); 618d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala if (res != OK) { 619d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " <Error reading camera info: %s (%d)>\n", 620d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala strerror(-res), res); 621d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else { 622d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Facing: %s\n", 623d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front"); 624d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Orientation: %d\n", info.orientation); 625d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } 626d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala CameraMetadata info2; 627d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala res = device->getCameraCharacteristics(&info2); 628d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala if (res == INVALID_OPERATION) { 629d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " API2 not directly supported\n"); 630d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else if (res != OK) { 631d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n", 632d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala strerror(-res), res); 633d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else { 634d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " API2 camera characteristics:\n"); 635d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); 636d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } 6372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 6392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange( 6422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& cameraDeviceName, 6432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraDeviceStatus newStatus) { 6442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<StatusListener> listener; 6452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string id; 6462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala { 6478d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mLock); 6482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool known = false; 6492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : mDevices) { 6502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mName == cameraDeviceName) { 6512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(), 6522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus)); 6532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo->mStatus = newStatus; 6542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // TODO: Handle device removal (NOT_PRESENT) 6552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala id = deviceInfo->mId; 6562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala known = true; 6572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 6582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Previously unseen device; status must not be NOT_PRESENT 6612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!known) { 6622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (newStatus == CameraDeviceStatus::NOT_PRESENT) { 6632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.", 6642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), cameraDeviceName.c_str()); 6652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 6662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala addDevice(cameraDeviceName, newStatus, &id); 6682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6698d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala listener = mManager->getStatusListener(); 6702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Call without lock held to allow reentrancy into provider manager 6722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (listener != nullptr) { 6732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener->onDeviceStatusChanged(String8(id.c_str()), newStatus); 6742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 6762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange( 6792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& cameraDeviceName, 6802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TorchModeStatus newStatus) { 6812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<StatusListener> listener; 6822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string id; 6832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala { 68452778d448123c185fd30cd77e84659fab966d740Yin-Chia Yeh std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 6852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool known = false; 6862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : mDevices) { 6872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mName == cameraDeviceName) { 6882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(), 6892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala torchStatusToString(newStatus)); 6902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala id = deviceInfo->mId; 6912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala known = true; 6922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 6932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!known) { 6962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.", 6972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), cameraDeviceName.c_str(), newStatus); 6982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 6992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7008d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala listener = mManager->getStatusListener(); 7012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Call without lock held to allow reentrancy into provider manager 7032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (listener != nullptr) { 7042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener->onTorchStatusChanged(String8(id.c_str()), newStatus); 7052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 7072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7098d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvalavoid CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie, 7108d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala const wp<hidl::base::V1_0::IBase>& who) { 7118d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala (void) who; 7128d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGI("Camera provider '%s' has died; removing it", mProviderName.c_str()); 7138d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (cookie != mId) { 7148d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32, 7158d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, cookie, mId); 7168d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 7178d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala mManager->removeProvider(mProviderName); 7188d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala} 7192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class DeviceInfoT> 7212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastd::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo> 7222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraProviderManager::ProviderInfo::initializeDeviceInfo( 72371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const std::string &name, const metadata_vendor_id_t tagId, 7242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, uint16_t minorVersion) const { 7252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 7262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto cameraInterface = 7282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala getDeviceInterface<typename DeviceInfoT::InterfaceT>(name); 7292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (cameraInterface == nullptr) return nullptr; 7302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraResourceCost resourceCost; 7322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface->getResourceCost([&status, &resourceCost]( 7332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, CameraResourceCost cost) { 7342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 7352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala resourceCost = cost; 7362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 7372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 7382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__, 7392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 7402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 7412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return std::unique_ptr<DeviceInfo>( 74371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev new DeviceInfoT(name, tagId, id, minorVersion, resourceCost, 74471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev cameraInterface)); 7452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class InterfaceT> 7482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<InterfaceT> 7492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const { 7502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 7512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), InterfaceT::version.get_major()); 7522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 7532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<> 7562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<device::V1_0::ICameraDevice> 7572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface 7582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala <device::V1_0::ICameraDevice>(const std::string &name) const { 7592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 7602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<device::V1_0::ICameraDevice> cameraInterface; 7618d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 7628d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface]( 7632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, sp<device::V1_0::ICameraDevice> interface) { 7642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 7652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface = interface; 7662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 7678d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 7688d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s", 7698d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, name.c_str(), ret.description().c_str()); 7708d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return nullptr; 7718d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 7722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 7732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 7742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 7752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 7762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return cameraInterface; 7782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<> 7812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<device::V3_2::ICameraDevice> 7822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface 7832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala <device::V3_2::ICameraDevice>(const std::string &name) const { 7842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 7852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<device::V3_2::ICameraDevice> cameraInterface; 7868d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 7878d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface]( 7882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, sp<device::V3_2::ICameraDevice> interface) { 7892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 7902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface = interface; 7912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 7928d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 7938d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s", 7948d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, name.c_str(), ret.description().c_str()); 7958d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return nullptr; 7968d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 7972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 7982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 7992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 8002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 8012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return cameraInterface; 8032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {} 8062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class InterfaceT> 8082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface, 8092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool enabled) { 8102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF); 8112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(s); 8122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name, 81571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const metadata_vendor_id_t tagId, const std::string &id, 8162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t minorVersion, 8172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const CameraResourceCost& resourceCost, 8182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<InterfaceT> interface) : 81971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev DeviceInfo(name, tagId, id, hardware::hidl_version{1, minorVersion}, 82071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev resourceCost), 8212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface) { 8222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get default parameters and initialize flash unit availability 8232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Requires powering on the camera device 8248d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<Status> status = mInterface->open(nullptr); 8258d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!status.isOk()) { 8268d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error opening camera device %s to check for a flash unit: %s", 8278d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mId.c_str(), status.description().c_str()); 8288d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return; 8298d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 8302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 8318d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s", __FUNCTION__, 8328d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala mId.c_str(), CameraProviderManager::statusToString(status)); 8332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return; 8342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8358d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 8368d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = mInterface->getParameters([this](const hardware::hidl_string& parms) { 8372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDefaultParameters.unflatten(String8(parms.c_str())); 8382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 8398d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 8408d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error reading camera device %s params to check for a flash unit: %s", 8418d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mId.c_str(), status.description().c_str()); 8428d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return; 8438d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 8442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const char *flashMode = 8452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 8462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) { 8472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = true; 8482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8508d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = mInterface->close(); 8518d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 8528d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error closing camera device %s after check for a flash unit: %s", 8538d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mId.c_str(), status.description().c_str()); 8548d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 8552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {} 8582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) { 8602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DeviceInfo::setTorchMode(mInterface, enabled); 8612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo( 8642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo *info) const { 8652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (info == nullptr) return BAD_VALUE; 8662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 8682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device::V1_0::CameraInfo cInfo; 8698d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 8708d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) { 8712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 8722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cInfo = camInfo; 8732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 8748d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 8758d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error reading camera info from device %s: %s", 8768d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mId.c_str(), ret.description().c_str()); 8778d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return DEAD_OBJECT; 8788d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 8792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 8802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 8812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(cInfo.facing) { 8842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::BACK: 8852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 8862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 8872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::EXTERNAL: 8882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Map external to front for legacy API 8892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::FRONT: 8902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_FRONT; 8912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 8922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala default: 8938d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGW("%s: Device %s: Unknown camera facing: %d", 8948d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala __FUNCTION__, mId.c_str(), cInfo.facing); 8952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 8962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->orientation = cInfo.orientation; 8982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 9002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name, 90371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const metadata_vendor_id_t tagId, const std::string &id, 9042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t minorVersion, 9052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const CameraResourceCost& resourceCost, 9062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<InterfaceT> interface) : 90771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion}, 90871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev resourceCost), 9092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface) { 9102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get camera characteristics and initialize flash unit availability 9112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 9128d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala hardware::Return<void> ret; 9138d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret = mInterface->getCameraCharacteristics([&status, this](Status s, 9142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device::V3_2::CameraMetadata metadata) { 9152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 9162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (s == Status::OK) { 9172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_t *buffer = 9182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala reinterpret_cast<camera_metadata_t*>(metadata.data()); 919238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh size_t expectedSize = metadata.size(); 920238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh int res = validate_camera_metadata_structure(buffer, &expectedSize); 921238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) { 922238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh set_camera_metadata_vendor_id(buffer, mProviderTagid); 923238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh mCameraCharacteristics = buffer; 924238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh } else { 925238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__); 926238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh status = Status::INTERNAL_ERROR; 927238ef5f352a59e97a90e2f9af88a27ad705442e5Yin-Chia Yeh } 9282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 9308d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala if (!ret.isOk()) { 9318d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ALOGE("%s: Transaction error getting camera characteristics for device %s" 9328d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala " to check for a flash unit: %s", __FUNCTION__, mId.c_str(), 9338d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala ret.description().c_str()); 9348d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala return; 9358d942f9a5c5affcdc6f1138d4ce3bac4b7ee53d5Eino-Ville Talvala } 9362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 9372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)", 9382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status); 9392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return; 9402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_entry flashAvailable = 9422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE); 9432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (flashAvailable.count == 1 && 9442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) { 9452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = true; 9462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 9472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = false; 9482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {} 9522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) { 9542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DeviceInfo::setTorchMode(mInterface, enabled); 9552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo( 9582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo *info) const { 9592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (info == nullptr) return BAD_VALUE; 9602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_ro_entry facing = 9622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_LENS_FACING); 9632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (facing.count == 1) { 9642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch (facing.data.u8[0]) { 9652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_BACK: 9662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 9672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 9682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_EXTERNAL: 9692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Map external to front for legacy API 9702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_FRONT: 9712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_FRONT; 9722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 9732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 9752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__); 9762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 9772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_ro_entry orientation = 9802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION); 9812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (orientation.count == 1) { 9822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->orientation = orientation.data.i32[0]; 9832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 9842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__); 9852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 9862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 9892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 990f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peevbool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const { 991f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev bool isBackwardCompatible = false; 992f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev camera_metadata_ro_entry_t caps = mCameraCharacteristics.find( 993f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev ANDROID_REQUEST_AVAILABLE_CAPABILITIES); 994f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev for (size_t i = 0; i < caps.count; i++) { 995f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev if (caps.data.u8[i] == 996f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) { 997f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev isBackwardCompatible = true; 998f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev break; 999f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev } 1000f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev } 1001f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev 1002f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev return isBackwardCompatible; 1003f53f66edb3b06d1df5caf1fa806f7ed95305a4cfEmilian Peev} 10042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics( 10062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraMetadata *characteristics) const { 10072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (characteristics == nullptr) return BAD_VALUE; 10082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *characteristics = mCameraCharacteristics; 10102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 10112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name, 10142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string *type, uint32_t *id) { 10152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Format must be "<type>/<id>" 10162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \ 10172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "Should match '<type>/<id>' - " 10182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!type || !id) return INVALID_OPERATION; 10202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type slashIdx = name.find('/'); 10222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (slashIdx == std::string::npos || slashIdx == name.size() - 1) { 10232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 10242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have / separator between type and id", 10252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 10262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 10272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string typeVal = name.substr(0, slashIdx); 10302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala char *endPtr; 10322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala errno = 0; 10332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10); 10342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 10352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 10362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse provider id as an integer: %s (%d)", 10372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 10382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 10392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + name.size()) { 10412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 10422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "provider id has unexpected length", 10432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 10442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 10452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (idVal < 0) { 10472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 10482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "id is negative: %ld", 10492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), idVal); 10502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 10512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#undef ERROR_MSG_PREFIX 10542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *type = typeVal; 10562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *id = static_cast<uint32_t>(idVal); 10572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 10592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 106171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peevmetadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId( 106271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev const std::string &name) { 106371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev metadata_vendor_id_t ret = std::hash<std::string> {} (name); 106471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value 106571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) { 106671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev ret = 0; 106771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev } 106871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 106971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev return ret; 107071c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev} 107171c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev 10722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name, 10732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t *major, uint16_t *minor, std::string *type, std::string *id) { 10742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Format must be "device@<major>.<minor>/<type>/<id>" 10762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \ 10782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "Should match 'device@<major>.<minor>/<type>/<id>' - " 10792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!major || !minor || !type || !id) return INVALID_OPERATION; 10812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Verify starting prefix 10832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const char expectedPrefix[] = "device@"; 10842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (name.find(expectedPrefix) != 0) { 10862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 10872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not start with '%s'", 10882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), expectedPrefix); 10892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 10902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Extract major/minor versions 10932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2; 10942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type dotIdx = name.find('.', atIdx); 10952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (dotIdx == std::string::npos) { 10962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 10972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have @<major>. version section", 10982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 10992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type typeSlashIdx = name.find('/', dotIdx); 11022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (typeSlashIdx == std::string::npos) { 11032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have .<minor>/ version section", 11052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 11062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala char *endPtr; 11102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala errno = 0; 11112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10); 11122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 11132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse major version: %s (%d)", 11152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 11162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + dotIdx) { 11192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "major version has unexpected length", 11212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 11222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10); 11252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 11262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse minor version: %s (%d)", 11282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 11292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + typeSlashIdx) { 11322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "minor version has unexpected length", 11342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 11352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) { 11382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "major/minor version is out of range of uint16_t: %ld.%ld", 11402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), majorVal, minorVal); 11412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Extract type and id 11452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1); 11472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (instanceSlashIdx == std::string::npos) { 11482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have /<type>/ component", 11502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 11512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1); 11542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (instanceSlashIdx == name.size() - 1) { 11562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 11572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have an /<id> component", 11582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 11592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 11612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string idVal = name.substr(instanceSlashIdx + 1); 11622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#undef ERROR_MSG_PREFIX 11642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *major = static_cast<uint16_t>(majorVal); 11662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *minor = static_cast<uint16_t>(minorVal); 11672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *type = typeVal; 11682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *id = idVal; 11692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 11712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 11722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::~ProviderInfo() { 11762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Destruction of ProviderInfo is only supposed to happen when the respective 11772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // CameraProvider interface dies, so do not unregister callbacks. 11782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 11802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 11812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::mapToStatusT(const Status& s) { 11822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 11832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OK: 11842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 11852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::ILLEGAL_ARGUMENT: 11862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 11872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_IN_USE: 11882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return -EBUSY; 11892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::MAX_CAMERAS_IN_USE: 11902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return -EUSERS; 11912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::METHOD_NOT_SUPPORTED: 11922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return UNKNOWN_TRANSACTION; 11932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OPERATION_NOT_SUPPORTED: 11942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 11952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_DISCONNECTED: 11962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DEAD_OBJECT; 11972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::INTERNAL_ERROR: 11982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 11992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 12002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL status code %d", s); 12012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 12022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 12032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 12042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::statusToString(const Status& s) { 12052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 12062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OK: 12072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "OK"; 12082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::ILLEGAL_ARGUMENT: 12092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "ILLEGAL_ARGUMENT"; 12102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_IN_USE: 12112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "CAMERA_IN_USE"; 12122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::MAX_CAMERAS_IN_USE: 12132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "MAX_CAMERAS_IN_USE"; 12142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::METHOD_NOT_SUPPORTED: 12152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "METHOD_NOT_SUPPORTED"; 12162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OPERATION_NOT_SUPPORTED: 12172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "OPERATION_NOT_SUPPORTED"; 12182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_DISCONNECTED: 12192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "CAMERA_DISCONNECTED"; 12202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::INTERNAL_ERROR: 12212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "INTERNAL_ERROR"; 12222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 12232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL status code %d", s); 12242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_ERROR"; 12252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 12262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 12272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) { 12282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 12292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::NOT_PRESENT: 12302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "NOT_PRESENT"; 12312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::PRESENT: 12322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "PRESENT"; 12332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::ENUMERATING: 12342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "ENUMERATING"; 12352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 12362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL device status code %d", s); 12372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_STATUS"; 12382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 12392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 12402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) { 12412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 12422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::NOT_AVAILABLE: 12432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "NOT_AVAILABLE"; 12442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::AVAILABLE_OFF: 12452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "AVAILABLE_OFF"; 12462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::AVAILABLE_ON: 12472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "AVAILABLE_ON"; 12482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 12492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL torch mode status code %d", s); 12502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_STATUS"; 12512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 12522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1253067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1254067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yehstatus_t HidlVendorTagDescriptor::createDescriptorFromHidl( 1255067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts, 1256067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh /*out*/ 1257067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<VendorTagDescriptor>& descriptor) { 1258067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1259067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int tagCount = 0; 1260067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1261067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t s = 0; s < vts.size(); s++) { 1262067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagCount += vts[s].tags.size(); 1263067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1264067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1265067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagCount < 0 || tagCount > INT32_MAX) { 1266067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount); 1267067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1268067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1269067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1270067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh Vector<uint32_t> tagArray; 1271067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, 1272067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); 1273067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1274067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1275067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor(); 1276067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagCount = tagCount; 1277067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1278067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh SortedVector<String8> sections; 1279067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh KeyedVector<uint32_t, String8> tagToSectionMap; 1280067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1281067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int idx = 0; 1282067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t s = 0; s < vts.size(); s++) { 1283067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const hardware::camera::common::V1_0::VendorTagSection& section = vts[s]; 1284067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const char *sectionName = section.sectionName.c_str(); 1285067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (sectionName == NULL) { 1286067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s); 1287067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1288067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1289067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh String8 sectionString(sectionName); 1290067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sections.add(sectionString); 1291067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1292067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t j = 0; j < section.tags.size(); j++) { 1293067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh uint32_t tag = section.tags[j].tagId; 1294067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 1295067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 1296067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1297067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1298067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1299067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagArray.editItemAt(idx++) = section.tags[j].tagId; 1300067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1301067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const char *tagName = section.tags[j].tagName.c_str(); 1302067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagName == NULL) { 1303067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); 1304067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1305067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1306067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToNameMap.add(tag, String8(tagName)); 1307067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagToSectionMap.add(tag, sectionString); 1308067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1309067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int tagType = (int) section.tags[j].tagType; 1310067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagType < 0 || tagType >= NUM_TYPES) { 1311067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 1312067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1313067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1314067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToTypeMap.add(tag, tagType); 1315067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1316067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1317067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1318067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mSections = sections; 1319067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1320067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t i = 0; i < tagArray.size(); ++i) { 1321067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh uint32_t tag = tagArray[i]; 1322067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh String8 sectionString = tagToSectionMap.valueFor(tag); 1323067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1324067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set up tag to section index map 1325067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ssize_t index = sections.indexOf(sectionString); 1326067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); 1327067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index)); 1328067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1329067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set up reverse mapping 1330067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ssize_t reverseIndex = -1; 1331067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { 1332067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 1333067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); 1334067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1335067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); 1336067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1337067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1338067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh descriptor = desc; 1339067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return OK; 1340067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh} 1341067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1342067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 13432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} // namespace android 1344