CameraProviderManager.cpp revision 067428c5a8429d711f94bf008debde29ac118849
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 232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include <android/hidl/manager/1.0/IServiceManager.h> 242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include <hidl/ServiceManagement.h> 252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace android { 272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalausing namespace ::android::hardware::camera; 292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalausing namespace ::android::hardware::camera::common::V1_0; 302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace { 322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the 332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// service manager 342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string kLegacyProviderName("legacy/0"); 352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// Slash-separated list of provider types to consider for use via the old camera API 372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string kStandardProviderTypes("internal/legacy"); 382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} // anonymous namespace 402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::HardwareServiceInteractionProxy 422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::sHardwareServiceInteractionProxy{}; 432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::~CameraProviderManager() { 452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener, 482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ServiceInteractionProxy* proxy) { 492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (proxy == nullptr) { 512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__); 522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mListener = listener; 552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mServiceProxy = proxy; 562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Registering will trigger notifications for all already-known providers 582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool success = mServiceProxy->registerForNotifications( 592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala /* instance name, empty means no filter */ "", 602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala this); 612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!success) { 622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to register with hardware service manager for notifications " 632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "about camera providers", __FUNCTION__); 642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Also see if there's a passthrough HAL, but let's not complain if there's not 682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala addProvider(kLegacyProviderName, /*expected*/ false); 692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaint CameraProviderManager::getCameraCount() const { 742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int count = 0; 762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala count += provider->mDevices.size(); 782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return count; 802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaint CameraProviderManager::getStandardCameraCount() const { 832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int count = 0; 852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) { 872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala count += provider->mDevices.size(); 882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return count; 912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastd::vector<std::string> CameraProviderManager::getCameraDeviceIds() const { 942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::vector<std::string> deviceIds; 962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceIds.push_back(deviceInfo->mId); 992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceIds; 1022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const { 1052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return isValidDeviceLocked(id, majorVersion); 1072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const { 1102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) { 1132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return true; 1142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return false; 1182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::hasFlashUnit(const std::string &id) const { 1212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return false; 1252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->hasFlashUnit(); 1272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getResourceCost(const std::string &id, 1302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraResourceCost* cost) const { 1312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *cost = deviceInfo->mResourceCost; 1372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 1382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getCameraInfo(const std::string &id, 1412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo* info) const { 1422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->getCameraInfo(info); 1482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getCameraCharacteristics(const std::string &id, 1512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraMetadata* characteristics) const { 1522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1540b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 1552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->getCameraCharacteristics(characteristics); 1582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getHighestSupportedVersion(const std::string &id, 1612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::hidl_version *v) { 1622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::hidl_version maxVersion{0,0}; 1652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool found = false; 1662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mId == id) { 1692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mVersion > maxVersion) { 1702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala maxVersion = deviceInfo->mVersion; 1712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala found = true; 1722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!found) { 1772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 1782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *v = maxVersion; 1802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 1812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) { 1842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->setTorchMode(enabled); 1902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 192067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yehstatus_t CameraProviderManager::setUpVendorTags() { 193067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // TODO (b/34275821): support aggregating vendor tags for more than one provider 194067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (auto& provider : mProviders) { 195067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh hardware::hidl_vec<VendorTagSection> vts; 196067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh Status status; 197067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh provider->mInterface->getVendorTags( 198067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh [&](auto s, const auto& vendorTagSecs) { 199067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh status = s; 200067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (s == Status::OK) { 201067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh vts = vendorTagSecs; 202067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 203067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh }); 204067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 205067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (status != Status::OK) { 206067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return mapToStatusT(status); 207067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 208067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 209067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 210067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 211067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Read all vendor tag definitions into a descriptor 212067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<VendorTagDescriptor> desc; 213067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh status_t res; 214067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/desc)) 215067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh != OK) { 216067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: Could not generate descriptor from vendor tag operations," 217067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "received error %s (%d). Camera clients will not be able to use" 218067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "vendor tags", __FUNCTION__, strerror(res), res); 219067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return res; 220067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 221067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 222067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set the global descriptor to use with camera metadata 223067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); 224067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 225067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return OK; 226067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh} 227067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 2280b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvalastatus_t CameraProviderManager::openSession(const std::string &id, 2290b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback, 2300b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*out*/ 2310b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session) { 2320b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2330b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2340b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2350b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, 2360b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 2370b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2380b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2390b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo); 2400b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2410b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala Status status; 2420b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala deviceInfo3->mInterface->open(callback, [&status, &session] 2430b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) { 2440b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala status = s; 2450b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (status == Status::OK) { 2460b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala *session = cameraSession; 2470b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala } 2480b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala }); 2490b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala return mapToStatusT(status); 2500b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala} 2510b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2520b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvalastatus_t CameraProviderManager::openSession(const std::string &id, 2530b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback, 2540b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*out*/ 2550b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala sp<hardware::camera::device::V1_0::ICameraDevice> *session) { 2560b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2570b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2580b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2590b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, 2600b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*minVersion*/ {1,0}, /*maxVersion*/ {2,0}); 2610b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2620b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2630b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo); 2640b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2650b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala Status status = deviceInfo1->mInterface->open(callback); 2660b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (status == Status::OK) { 2670b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala *session = deviceInfo1->mInterface; 2680b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala } 2690b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala return mapToStatusT(status); 2700b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala} 2710b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2720b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::onRegistration( 2742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& /*fqName*/, 2752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& name, 2762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool /*preexisting*/) { 2772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala addProvider(name); 2802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Return<void>(); 2812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 2822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { 2842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala dprintf(fd, "Available camera providers and devices:\n"); 2872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 2882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala provider->dump(fd, args); 2892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 2902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 2912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 2922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked( 2940b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const std::string& id, 2950b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const { 2962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 2972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 2980b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo->mId == id && 2990b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) { 3002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo.get(); 3012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 3052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::addProvider(const std::string& newProvider, bool expected) { 3092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (const auto& providerInfo : mProviders) { 3102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (providerInfo->mProviderName == newProvider) { 3112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__, 3122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala newProvider.c_str()); 3132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return ALREADY_EXISTS; 3142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<provider::V2_4::ICameraProvider> interface = 3172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mServiceProxy->getService(newProvider); 3182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (interface == nullptr) { 3202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (expected) { 3212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__, 3222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala newProvider.c_str()); 3232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 3242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 3252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Not guaranteed to be found, so not an error if it wasn't 3262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<ProviderInfo> providerInfo = 3312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala new ProviderInfo(newProvider, interface, this); 3322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = providerInfo->initialize(); 3332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 3342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return res; 3352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviders.push_back(providerInfo); 3382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::removeProvider(const std::string& provider) { 3432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto it = mProviders.begin(); it != mProviders.end(); it++) { 3442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if ((*it)->mProviderName == provider) { 3452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviders.erase(it); 3462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__, 3502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala provider.c_str()); 3512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 3522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala/**** Methods for ProviderInfo ****/ 3552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::ProviderInfo( 3582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &providerName, 3592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<provider::V2_4::ICameraProvider>& interface, 3602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraProviderManager *manager) : 3612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName(providerName), 3622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface), 3632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mManager(manager) { 3642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala (void) mManager; 3652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::initialize() { 3682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = parseProviderName(mProviderName, &mType, &mId); 3692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 3702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__); 3712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 3722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Connecting to new camera provider: %s", mProviderName.c_str()); 3742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status = mInterface->setCallback(this); 3752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 3762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to register callbacks with camera provider '%s'", 3772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 3782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 3792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // TODO: Register for hw binder death notifications as well 3812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get initial list of camera devices, if any 3832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::vector<std::string> devices; 3842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraIdList([&status, &devices]( 3852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status idStatus, 3862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) { 3872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = idStatus; 3882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status == Status::OK) { 3892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (size_t i = 0; i < cameraDeviceNames.size(); i++) { 3902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala devices.push_back(cameraDeviceNames[i]); 3912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } }); 3932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 3952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to query for camera devices from provider '%s'", 3962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 3972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 3982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& device : devices) { 4012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = addDevice(device); 4022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 4032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)", 4042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, device.c_str(), strerror(-res), res); 4052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera provider %s ready with %zu camera devices", 4092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), mDevices.size()); 4102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 4122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string& CameraProviderManager::ProviderInfo::getType() const { 4152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mType; 4162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, 4192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) { 4202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Enumerating new camera device: %s", name.c_str()); 4222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t major, minor; 4242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string type, id; 4252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = parseDeviceName(name, &major, &minor, &type, &id); 4272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 4282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return res; 4292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (type != mType) { 4312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__, 4322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala type.c_str(), mType.c_str()); 4332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (mManager->isValidDeviceLocked(id, major)) { 4362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__, 4372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), id.c_str(), major); 4382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::unique_ptr<DeviceInfo> deviceInfo; 4422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch (major) { 4432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case 1: 4442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, id, minor); 4452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 4462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case 3: 4472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, id, minor); 4482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 4492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala default: 4502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 4512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), major); 4522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return BAD_VALUE; 4552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo->mStatus = initialStatus; 4562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDevices.push_back(std::move(deviceInfo)); 4582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (parsedId != nullptr) { 4602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *parsedId = id; 4612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 4632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { 46652778d448123c185fd30cd77e84659fab966d740Yin-Chia Yeh dprintf(fd, " %s: %zu devices:\n", mProviderName.c_str(), mDevices.size()); 4672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& device : mDevices) { 4692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala dprintf(fd, " %s: Resource cost: %d\n", device->mName.c_str(), 4702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device->mResourceCost.resourceCost); 4712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (device->mResourceCost.conflictingDevices.size() > 0) { 4722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala dprintf(fd, " Conflicting devices:\n"); 4732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { 4742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala dprintf(fd, " %s\n", 4752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device->mResourceCost.conflictingDevices[i].c_str()); 4762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 4802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange( 4832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& cameraDeviceName, 4842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraDeviceStatus newStatus) { 4852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<StatusListener> listener; 4862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string id; 4872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala { 48852778d448123c185fd30cd77e84659fab966d740Yin-Chia Yeh std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 4892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool known = false; 4902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : mDevices) { 4912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mName == cameraDeviceName) { 4922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(), 4932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus)); 4942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo->mStatus = newStatus; 4952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // TODO: Handle device removal (NOT_PRESENT) 4962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala id = deviceInfo->mId; 4972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala known = true; 4982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 4992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Previously unseen device; status must not be NOT_PRESENT 5022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!known) { 5032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (newStatus == CameraDeviceStatus::NOT_PRESENT) { 5042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.", 5052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), cameraDeviceName.c_str()); 5062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala addDevice(cameraDeviceName, newStatus, &id); 5092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener = mManager->mListener.promote(); 5112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Call without lock held to allow reentrancy into provider manager 5132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (listener != nullptr) { 5142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener->onDeviceStatusChanged(String8(id.c_str()), newStatus); 5152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange( 5202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& cameraDeviceName, 5212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TorchModeStatus newStatus) { 5222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<StatusListener> listener; 5232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string id; 5242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala { 52552778d448123c185fd30cd77e84659fab966d740Yin-Chia Yeh std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 5262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool known = false; 5272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : mDevices) { 5282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mName == cameraDeviceName) { 5292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(), 5302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala torchStatusToString(newStatus)); 5312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala id = deviceInfo->mId; 5322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala known = true; 5332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 5342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!known) { 5372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.", 5382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), cameraDeviceName.c_str(), newStatus); 5392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener = mManager->mListener.promote(); 5422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Call without lock held to allow reentrancy into provider manager 5442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (listener != nullptr) { 5452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener->onTorchStatusChanged(String8(id.c_str()), newStatus); 5462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class DeviceInfoT> 5522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastd::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo> 5532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraProviderManager::ProviderInfo::initializeDeviceInfo( 5542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &name, 5552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, uint16_t minorVersion) const { 5562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 5572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto cameraInterface = 5592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala getDeviceInterface<typename DeviceInfoT::InterfaceT>(name); 5602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (cameraInterface == nullptr) return nullptr; 5612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraResourceCost resourceCost; 5632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface->getResourceCost([&status, &resourceCost]( 5642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, CameraResourceCost cost) { 5652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 5662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala resourceCost = cost; 5672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 5682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 5692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__, 5702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 5712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 5722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return std::unique_ptr<DeviceInfo>( 5742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala new DeviceInfoT(name, id, minorVersion, resourceCost, cameraInterface)); 5752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class InterfaceT> 5782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<InterfaceT> 5792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const { 5802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 5812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), InterfaceT::version.get_major()); 5822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 5832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<> 5862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<device::V1_0::ICameraDevice> 5872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface 5882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala <device::V1_0::ICameraDevice>(const std::string &name) const { 5892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 5902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<device::V1_0::ICameraDevice> cameraInterface; 5912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface]( 5922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, sp<device::V1_0::ICameraDevice> interface) { 5932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 5942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface = interface; 5952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 5962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 5972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 5982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 5992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 6002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return cameraInterface; 6022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<> 6052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<device::V3_2::ICameraDevice> 6062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface 6072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala <device::V3_2::ICameraDevice>(const std::string &name) const { 6082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 6092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<device::V3_2::ICameraDevice> cameraInterface; 6102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface]( 6112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, sp<device::V3_2::ICameraDevice> interface) { 6122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 6132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface = interface; 6142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 6172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 6182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 6192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return cameraInterface; 6212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {} 6242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class InterfaceT> 6262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface, 6272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool enabled) { 6282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF); 6292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(s); 6302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name, 6332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, 6342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t minorVersion, 6352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const CameraResourceCost& resourceCost, 6362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<InterfaceT> interface) : 6372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DeviceInfo(name, id, hardware::hidl_version{1, minorVersion}, resourceCost), 6382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface) { 6392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get default parameters and initialize flash unit availability 6402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Requires powering on the camera device 6412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status = mInterface->open(nullptr); 6422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s (%d)", __FUNCTION__, 6442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mId.c_str(), CameraProviderManager::statusToString(status), status); 6452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return; 6462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getParameters([this](const hardware::hidl_string& parms) { 6482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDefaultParameters.unflatten(String8(parms.c_str())); 6492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const char *flashMode = 6522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 6532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) { 6542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = true; 6552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 6562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = false; 6572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->close(); 6602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {} 6632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) { 6652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DeviceInfo::setTorchMode(mInterface, enabled); 6662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo( 6692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo *info) const { 6702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (info == nullptr) return BAD_VALUE; 6712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 6732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device::V1_0::CameraInfo cInfo; 6742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) { 6752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 6762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cInfo = camInfo; 6772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 6802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(cInfo.facing) { 6832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::BACK: 6842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 6852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 6862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::EXTERNAL: 6872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Map external to front for legacy API 6882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::FRONT: 6892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_FRONT; 6902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 6912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala default: 6922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Unknown camera facing: %d", __FUNCTION__, cInfo.facing); 6932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 6942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->orientation = cInfo.orientation; 6962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 6982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name, 7012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, 7022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t minorVersion, 7032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const CameraResourceCost& resourceCost, 7042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<InterfaceT> interface) : 7052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DeviceInfo(name, id, hardware::hidl_version{3, minorVersion}, resourceCost), 7062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface) { 7072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get camera characteristics and initialize flash unit availability 7082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 7092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraCharacteristics([&status, this](Status s, 7102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device::V3_2::CameraMetadata metadata) { 7112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 7122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (s == Status::OK) { 7132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_t *buffer = 7142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala reinterpret_cast<camera_metadata_t*>(metadata.data()); 7152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics = buffer; 7162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 7182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 7192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)", 7202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status); 7212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return; 7222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_entry flashAvailable = 7242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE); 7252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (flashAvailable.count == 1 && 7262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) { 7272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = true; 7282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 7292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = false; 7302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {} 7342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) { 7362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DeviceInfo::setTorchMode(mInterface, enabled); 7372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo( 7402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo *info) const { 7412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (info == nullptr) return BAD_VALUE; 7422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_ro_entry facing = 7442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_LENS_FACING); 7452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (facing.count == 1) { 7462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch (facing.data.u8[0]) { 7472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_BACK: 7482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 7492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 7502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_EXTERNAL: 7512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Map external to front for legacy API 7522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_FRONT: 7532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_FRONT; 7542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 7552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 7572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__); 7582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 7592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_ro_entry orientation = 7622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION); 7632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (orientation.count == 1) { 7642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->orientation = orientation.data.i32[0]; 7652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 7662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__); 7672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 7682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 7712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics( 7742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraMetadata *characteristics) const { 7752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (characteristics == nullptr) return BAD_VALUE; 7762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *characteristics = mCameraCharacteristics; 7782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 7792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name, 7822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string *type, uint32_t *id) { 7832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Format must be "<type>/<id>" 7842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \ 7852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "Should match '<type>/<id>' - " 7862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!type || !id) return INVALID_OPERATION; 7882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type slashIdx = name.find('/'); 7902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (slashIdx == std::string::npos || slashIdx == name.size() - 1) { 7912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 7922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have / separator between type and id", 7932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 7942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 7952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string typeVal = name.substr(0, slashIdx); 7982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala char *endPtr; 8002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala errno = 0; 8012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10); 8022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 8032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse provider id as an integer: %s (%d)", 8052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 8062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + name.size()) { 8092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "provider id has unexpected length", 8112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (idVal < 0) { 8152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "id is negative: %ld", 8172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), idVal); 8182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#undef ERROR_MSG_PREFIX 8222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *type = typeVal; 8242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *id = static_cast<uint32_t>(idVal); 8252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 8272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name, 8302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t *major, uint16_t *minor, std::string *type, std::string *id) { 8312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Format must be "device@<major>.<minor>/<type>/<id>" 8332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \ 8352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "Should match 'device@<major>.<minor>/<type>/<id>' - " 8362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!major || !minor || !type || !id) return INVALID_OPERATION; 8382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Verify starting prefix 8402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const char expectedPrefix[] = "device@"; 8412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (name.find(expectedPrefix) != 0) { 8432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not start with '%s'", 8452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), expectedPrefix); 8462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Extract major/minor versions 8502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2; 8512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type dotIdx = name.find('.', atIdx); 8522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (dotIdx == std::string::npos) { 8532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have @<major>. version section", 8552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type typeSlashIdx = name.find('/', dotIdx); 8592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (typeSlashIdx == std::string::npos) { 8602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have .<minor>/ version section", 8622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala char *endPtr; 8672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala errno = 0; 8682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10); 8692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 8702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse major version: %s (%d)", 8722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 8732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + dotIdx) { 8762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "major version has unexpected length", 8782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10); 8822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 8832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse minor version: %s (%d)", 8852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 8862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + typeSlashIdx) { 8892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "minor version has unexpected length", 8912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) { 8952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "major/minor version is out of range of uint16_t: %ld.%ld", 8972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), majorVal, minorVal); 8982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Extract type and id 9022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1); 9042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (instanceSlashIdx == std::string::npos) { 9052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have /<type>/ component", 9072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1); 9112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (instanceSlashIdx == name.size() - 1) { 9132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have an /<id> component", 9152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string idVal = name.substr(instanceSlashIdx + 1); 9192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#undef ERROR_MSG_PREFIX 9212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *major = static_cast<uint16_t>(majorVal); 9232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *minor = static_cast<uint16_t>(minorVal); 9242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *type = typeVal; 9252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *id = idVal; 9262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 9282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::~ProviderInfo() { 9332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Destruction of ProviderInfo is only supposed to happen when the respective 9342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // CameraProvider interface dies, so do not unregister callbacks. 9352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::mapToStatusT(const Status& s) { 9392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 9402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OK: 9412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 9422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::ILLEGAL_ARGUMENT: 9432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_IN_USE: 9452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return -EBUSY; 9462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::MAX_CAMERAS_IN_USE: 9472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return -EUSERS; 9482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::METHOD_NOT_SUPPORTED: 9492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return UNKNOWN_TRANSACTION; 9502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OPERATION_NOT_SUPPORTED: 9512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 9522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_DISCONNECTED: 9532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DEAD_OBJECT; 9542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::INTERNAL_ERROR: 9552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 9562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL status code %d", s); 9582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 9592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::statusToString(const Status& s) { 9622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 9632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OK: 9642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "OK"; 9652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::ILLEGAL_ARGUMENT: 9662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "ILLEGAL_ARGUMENT"; 9672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_IN_USE: 9682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "CAMERA_IN_USE"; 9692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::MAX_CAMERAS_IN_USE: 9702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "MAX_CAMERAS_IN_USE"; 9712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::METHOD_NOT_SUPPORTED: 9722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "METHOD_NOT_SUPPORTED"; 9732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OPERATION_NOT_SUPPORTED: 9742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "OPERATION_NOT_SUPPORTED"; 9752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_DISCONNECTED: 9762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "CAMERA_DISCONNECTED"; 9772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::INTERNAL_ERROR: 9782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "INTERNAL_ERROR"; 9792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL status code %d", s); 9812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_ERROR"; 9822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) { 9852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 9862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::NOT_PRESENT: 9872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "NOT_PRESENT"; 9882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::PRESENT: 9892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "PRESENT"; 9902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::ENUMERATING: 9912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "ENUMERATING"; 9922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL device status code %d", s); 9942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_STATUS"; 9952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) { 9982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 9992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::NOT_AVAILABLE: 10002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "NOT_AVAILABLE"; 10012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::AVAILABLE_OFF: 10022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "AVAILABLE_OFF"; 10032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::AVAILABLE_ON: 10042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "AVAILABLE_ON"; 10052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL torch mode status code %d", s); 10072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_STATUS"; 10082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1010067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1011067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yehstatus_t HidlVendorTagDescriptor::createDescriptorFromHidl( 1012067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts, 1013067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh /*out*/ 1014067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<VendorTagDescriptor>& descriptor) { 1015067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1016067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int tagCount = 0; 1017067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1018067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t s = 0; s < vts.size(); s++) { 1019067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagCount += vts[s].tags.size(); 1020067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1021067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1022067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagCount < 0 || tagCount > INT32_MAX) { 1023067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount); 1024067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1025067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1026067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1027067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh Vector<uint32_t> tagArray; 1028067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, 1029067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); 1030067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1031067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1032067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor(); 1033067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagCount = tagCount; 1034067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1035067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh SortedVector<String8> sections; 1036067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh KeyedVector<uint32_t, String8> tagToSectionMap; 1037067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1038067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int idx = 0; 1039067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t s = 0; s < vts.size(); s++) { 1040067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const hardware::camera::common::V1_0::VendorTagSection& section = vts[s]; 1041067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const char *sectionName = section.sectionName.c_str(); 1042067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (sectionName == NULL) { 1043067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s); 1044067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1045067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1046067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh String8 sectionString(sectionName); 1047067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sections.add(sectionString); 1048067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1049067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t j = 0; j < section.tags.size(); j++) { 1050067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh uint32_t tag = section.tags[j].tagId; 1051067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 1052067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 1053067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1054067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1055067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1056067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagArray.editItemAt(idx++) = section.tags[j].tagId; 1057067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1058067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const char *tagName = section.tags[j].tagName.c_str(); 1059067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagName == NULL) { 1060067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); 1061067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1062067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1063067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToNameMap.add(tag, String8(tagName)); 1064067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagToSectionMap.add(tag, sectionString); 1065067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1066067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int tagType = (int) section.tags[j].tagType; 1067067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagType < 0 || tagType >= NUM_TYPES) { 1068067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 1069067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1070067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1071067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToTypeMap.add(tag, tagType); 1072067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1073067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1074067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1075067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mSections = sections; 1076067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1077067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t i = 0; i < tagArray.size(); ++i) { 1078067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh uint32_t tag = tagArray[i]; 1079067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh String8 sectionString = tagToSectionMap.valueFor(tag); 1080067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1081067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set up tag to section index map 1082067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ssize_t index = sections.indexOf(sectionString); 1083067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); 1084067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index)); 1085067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1086067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set up reverse mapping 1087067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ssize_t reverseIndex = -1; 1088067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { 1089067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 1090067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); 1091067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1092067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); 1093067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1094067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1095067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh descriptor = desc; 1096067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return OK; 1097067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh} 1098067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1099067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 11002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} // namespace android 1101