CameraProviderManager.cpp revision d00111e3b0c2ee59736fda992dd9ea24b23ef46a
12f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala/* 22f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * Copyright (C) 2016 The Android Open Source Project 32f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * 42f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License"); 52f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * you may not use this file except in compliance with the License. 62f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * You may obtain a copy of the License at 72f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * 82f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * http://www.apache.org/licenses/LICENSE-2.0 92f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * 102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software 112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS, 122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * See the License for the specific language governing permissions and 142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala * limitations under the License. 152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala */ 162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define LOG_TAG "CameraProviderManager" 182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA 192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala//#define LOG_NDEBUG 0 202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include "CameraProviderManager.h" 222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 236540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh#include <chrono> 242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include <android/hidl/manager/1.0/IServiceManager.h> 252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#include <hidl/ServiceManagement.h> 262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace android { 282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalausing namespace ::android::hardware::camera; 302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalausing namespace ::android::hardware::camera::common::V1_0; 312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalanamespace { 332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// Hardcoded name for the passthrough HAL implementation, since it can't be discovered via the 342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// service manager 352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string kLegacyProviderName("legacy/0"); 362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala// Slash-separated list of provider types to consider for use via the old camera API 382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string kStandardProviderTypes("internal/legacy"); 392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} // anonymous namespace 412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::HardwareServiceInteractionProxy 432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::sHardwareServiceInteractionProxy{}; 442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::~CameraProviderManager() { 462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener, 492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ServiceInteractionProxy* proxy) { 506540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh int numProviders = 0; 516540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh { 526540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh std::lock_guard<std::mutex> lock(mInterfaceMutex); 536540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh if (proxy == nullptr) { 546540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__); 556540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh return BAD_VALUE; 566540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh } 576540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh mListener = listener; 586540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh mServiceProxy = proxy; 596540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh 606540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh // Registering will trigger notifications for all already-known providers 616540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh bool success = mServiceProxy->registerForNotifications( 626540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh /* instance name, empty means no filter */ "", 636540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh this); 646540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh if (!success) { 656540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh ALOGE("%s: Unable to register with hardware service manager for notifications " 666540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh "about camera providers", __FUNCTION__); 676540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh return INVALID_OPERATION; 686540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh } 696540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh numProviders = mProviders.size(); 702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 726540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh if (numProviders == 0) { 736540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh // Remote provider might have not been initialized 746540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh // Wait for a bit and see if we get one registered 756540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh std::mutex mtx; 766540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh std::unique_lock<std::mutex> lock(mtx); 776540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh mProviderRegistered.wait_for(lock, std::chrono::seconds(15)); 786540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh if (mProviders.size() == 0) { 796540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh ALOGI("%s: Unable to get one registered provider within timeout!", 806540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh __FUNCTION__); 816540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh std::lock_guard<std::mutex> lock(mInterfaceMutex); 826540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh // See if there's a passthrough HAL, but let's not complain if there's not 836540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh addProvider(kLegacyProviderName, /*expected*/ false); 846540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh } 856540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh } 862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaint CameraProviderManager::getCameraCount() const { 912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int count = 0; 932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala count += provider->mDevices.size(); 952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return count; 972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaint CameraProviderManager::getStandardCameraCount() const { 1002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala int count = 0; 1022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (kStandardProviderTypes.find(provider->getType()) != std::string::npos) { 1042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala count += provider->mDevices.size(); 1052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return count; 1082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastd::vector<std::string> CameraProviderManager::getCameraDeviceIds() const { 1112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::vector<std::string> deviceIds; 1132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceIds.push_back(deviceInfo->mId); 1162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceIds; 1192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const { 1222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return isValidDeviceLocked(id, majorVersion); 1242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const { 1272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) { 1302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return true; 1312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return false; 1352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalabool CameraProviderManager::hasFlashUnit(const std::string &id) const { 1382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return false; 1422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->hasFlashUnit(); 1442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getResourceCost(const std::string &id, 1472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraResourceCost* cost) const { 1482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *cost = deviceInfo->mResourceCost; 1542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 1552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getCameraInfo(const std::string &id, 1582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo* info) const { 1592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 1622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->getCameraInfo(info); 1652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getCameraCharacteristics(const std::string &id, 1682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraMetadata* characteristics) const { 1692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1710b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 1722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 1732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->getCameraCharacteristics(characteristics); 1752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::getHighestSupportedVersion(const std::string &id, 1782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::hidl_version *v) { 1792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 1802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::hidl_version maxVersion{0,0}; 1822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool found = false; 1832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 1842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 1852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mId == id) { 1862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mVersion > maxVersion) { 1872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala maxVersion = deviceInfo->mVersion; 1882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala found = true; 1892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!found) { 1942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 1952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 1962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *v = maxVersion; 1972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 1982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 1992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) { 2012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id); 2042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo->setTorchMode(enabled); 2072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 2082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 209067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yehstatus_t CameraProviderManager::setUpVendorTags() { 210067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // TODO (b/34275821): support aggregating vendor tags for more than one provider 211067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (auto& provider : mProviders) { 212067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh hardware::hidl_vec<VendorTagSection> vts; 213067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh Status status; 214067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh provider->mInterface->getVendorTags( 215067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh [&](auto s, const auto& vendorTagSecs) { 216067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh status = s; 217067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (s == Status::OK) { 218067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh vts = vendorTagSecs; 219067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 220067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh }); 221067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 222067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (status != Status::OK) { 223067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return mapToStatusT(status); 224067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 225067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 226067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh VendorTagDescriptor::clearGlobalVendorTagDescriptor(); 227067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 228067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Read all vendor tag definitions into a descriptor 229067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<VendorTagDescriptor> desc; 230067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh status_t res; 231067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/desc)) 232067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh != OK) { 233067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: Could not generate descriptor from vendor tag operations," 234067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "received error %s (%d). Camera clients will not be able to use" 235067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "vendor tags", __FUNCTION__, strerror(res), res); 236067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return res; 237067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 238067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 239067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set the global descriptor to use with camera metadata 240067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh VendorTagDescriptor::setAsGlobalVendorTagDescriptor(desc); 241067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 242067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return OK; 243067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh} 244067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 2450b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvalastatus_t CameraProviderManager::openSession(const std::string &id, 2460b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback, 2470b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*out*/ 2480b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session) { 2490b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2500b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2510b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2520b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, 2530b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*minVersion*/ {3,0}, /*maxVersion*/ {4,0}); 2540b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2550b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2560b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo); 2570b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2580b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala Status status; 2590b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala deviceInfo3->mInterface->open(callback, [&status, &session] 2600b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) { 2610b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala status = s; 2620b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (status == Status::OK) { 2630b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala *session = cameraSession; 2640b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala } 2650b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala }); 2660b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala return mapToStatusT(status); 2670b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala} 2680b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2690b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvalastatus_t CameraProviderManager::openSession(const std::string &id, 2700b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback, 2710b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*out*/ 2720b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala sp<hardware::camera::device::V1_0::ICameraDevice> *session) { 2730b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2740b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2750b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2760b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto deviceInfo = findDeviceInfoLocked(id, 2770b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala /*minVersion*/ {1,0}, /*maxVersion*/ {2,0}); 2780b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo == nullptr) return NAME_NOT_FOUND; 2790b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2800b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala auto *deviceInfo1 = static_cast<ProviderInfo::DeviceInfo1*>(deviceInfo); 2810b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2820b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala Status status = deviceInfo1->mInterface->open(callback); 2830b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (status == Status::OK) { 2840b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala *session = deviceInfo1->mInterface; 2850b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala } 2860b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala return mapToStatusT(status); 2870b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala} 2880b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2890b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala 2902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::onRegistration( 2912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& /*fqName*/, 2922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& name, 2932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool /*preexisting*/) { 2942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 2952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 2962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala addProvider(name); 2976540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh mProviderRegistered.notify_one(); 2982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Return<void>(); 2992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::dump(int fd, const Vector<String16>& args) { 3022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::lock_guard<std::mutex> lock(mInterfaceMutex); 3032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 3052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala provider->dump(fd, args); 3062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked( 3110b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala const std::string& id, 3120b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const { 3132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& provider : mProviders) { 3142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : provider->mDevices) { 3150b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala if (deviceInfo->mId == id && 3160b1cb14c804d7d4343fe91c78578da8db9a678d5Eino-Ville Talvala minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) { 3172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return deviceInfo.get(); 3182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 3222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::addProvider(const std::string& newProvider, bool expected) { 3262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (const auto& providerInfo : mProviders) { 3272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (providerInfo->mProviderName == newProvider) { 3282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL with name '%s' already registered", __FUNCTION__, 3292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala newProvider.c_str()); 3302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return ALREADY_EXISTS; 3312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<provider::V2_4::ICameraProvider> interface = 3342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mServiceProxy->getService(newProvider); 3352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (interface == nullptr) { 3372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (expected) { 3382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__, 3392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala newProvider.c_str()); 3402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 3412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 3422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Not guaranteed to be found, so not an error if it wasn't 3432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<ProviderInfo> providerInfo = 3482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala new ProviderInfo(newProvider, interface, this); 3492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = providerInfo->initialize(); 3502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 3512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return res; 3522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviders.push_back(providerInfo); 3552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::removeProvider(const std::string& provider) { 3602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto it = mProviders.begin(); it != mProviders.end(); it++) { 3612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if ((*it)->mProviderName == provider) { 3622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviders.erase(it); 3632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 3642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__, 3672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala provider.c_str()); 3682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 3692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala/**** Methods for ProviderInfo ****/ 3722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::ProviderInfo( 3752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &providerName, 3762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<provider::V2_4::ICameraProvider>& interface, 3772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraProviderManager *manager) : 3782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName(providerName), 3792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface), 3802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mManager(manager) { 3812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala (void) mManager; 3822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 3832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 3842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::initialize() { 3852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = parseProviderName(mProviderName, &mType, &mId); 3862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 3872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__); 3882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 3892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3906540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh ALOGI("Connecting to new camera provider: %s, isRemote? %d", 3916540509f9180bbaf9b0a76bc061ea3c0d7f8dbb8Yin-Chia Yeh mProviderName.c_str(), mInterface->isRemote()); 3922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status = mInterface->setCallback(this); 3932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 3942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to register callbacks with camera provider '%s'", 3952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 3962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 3972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 3982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // TODO: Register for hw binder death notifications as well 3992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get initial list of camera devices, if any 4012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::vector<std::string> devices; 4022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraIdList([&status, &devices]( 4032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status idStatus, 4042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) { 4052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = idStatus; 4062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status == Status::OK) { 4072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (size_t i = 0; i < cameraDeviceNames.size(); i++) { 4082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala devices.push_back(cameraDeviceNames[i]); 4092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } }); 4112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 4132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to query for camera devices from provider '%s'", 4142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mProviderName.c_str()); 4152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 4162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& device : devices) { 4192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = addDevice(device); 4202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 4212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)", 4222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, device.c_str(), strerror(-res), res); 4232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera provider %s ready with %zu camera devices", 4272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), mDevices.size()); 4282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 4302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst std::string& CameraProviderManager::ProviderInfo::getType() const { 4332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mType; 4342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name, 4372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) { 4382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Enumerating new camera device: %s", name.c_str()); 4402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t major, minor; 4422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string type, id; 4432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status_t res = parseDeviceName(name, &major, &minor, &type, &id); 4452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (res != OK) { 4462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return res; 4472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (type != mType) { 4492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__, 4502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala type.c_str(), mType.c_str()); 4512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (mManager->isValidDeviceLocked(id, major)) { 4542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__, 4552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), id.c_str(), major); 4562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::unique_ptr<DeviceInfo> deviceInfo; 4602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch (major) { 4612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case 1: 4622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo = initializeDeviceInfo<DeviceInfo1>(name, id, minor); 4632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 4642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case 3: 4652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, id, minor); 4662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 4672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala default: 4682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 4692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), major); 4702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 4712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo == nullptr) return BAD_VALUE; 4732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo->mStatus = initialStatus; 4742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDevices.push_back(std::move(deviceInfo)); 4762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (parsedId != nullptr) { 4782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *parsedId = id; 4792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 4812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 4822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const { 484d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, "== Camera Provider HAL %s (v2.4) static info: %zu devices: ==\n", 485d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala mProviderName.c_str(), mDevices.size()); 4862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 4872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& device : mDevices) { 488d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(), 489d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala device->mVersion.get_major(), device->mVersion.get_minor()); 490d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Resource cost: %d\n", device->mResourceCost.resourceCost); 491d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala if (device->mResourceCost.conflictingDevices.size() == 0) { 492d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Conflicting devices: None\n"); 493d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else { 494d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Conflicting devices:\n"); 4952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) { 496d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " %s\n", 4972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device->mResourceCost.conflictingDevices[i].c_str()); 4982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 4992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 500d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " API1 info:\n"); 501d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Has a flash unit: %s\n", 502d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala device->hasFlashUnit() ? "true" : "false"); 503d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala hardware::CameraInfo info; 504d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala status_t res = device->getCameraInfo(&info); 505d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala if (res != OK) { 506d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " <Error reading camera info: %s (%d)>\n", 507d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala strerror(-res), res); 508d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else { 509d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Facing: %s\n", 510d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front"); 511d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " Orientation: %d\n", info.orientation); 512d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } 513d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala CameraMetadata info2; 514d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala res = device->getCameraCharacteristics(&info2); 515d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala if (res == INVALID_OPERATION) { 516d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " API2 not directly supported\n"); 517d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else if (res != OK) { 518d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " <Error reading camera characteristics: %s (%d)>\n", 519d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala strerror(-res), res); 520d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } else { 521d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala dprintf(fd, " API2 camera characteristics:\n"); 522d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4); 523d00111e3b0c2ee59736fda992dd9ea24b23ef46aEino-Ville Talvala } 5242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 5262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange( 5292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& cameraDeviceName, 5302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraDeviceStatus newStatus) { 5312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<StatusListener> listener; 5322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string id; 5332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala { 53452778d448123c185fd30cd77e84659fab966d740Yin-Chia Yeh std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 5352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool known = false; 5362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : mDevices) { 5372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mName == cameraDeviceName) { 5382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(), 5392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus)); 5402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala deviceInfo->mStatus = newStatus; 5412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // TODO: Handle device removal (NOT_PRESENT) 5422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala id = deviceInfo->mId; 5432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala known = true; 5442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 5452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Previously unseen device; status must not be NOT_PRESENT 5482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!known) { 5492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (newStatus == CameraDeviceStatus::NOT_PRESENT) { 5502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.", 5512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), cameraDeviceName.c_str()); 5522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala addDevice(cameraDeviceName, newStatus, &id); 5552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener = mManager->mListener.promote(); 5572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Call without lock held to allow reentrancy into provider manager 5592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (listener != nullptr) { 5602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener->onDeviceStatusChanged(String8(id.c_str()), newStatus); 5612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalahardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange( 5662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const hardware::hidl_string& cameraDeviceName, 5672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala TorchModeStatus newStatus) { 5682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<StatusListener> listener; 5692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string id; 5702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala { 57152778d448123c185fd30cd77e84659fab966d740Yin-Chia Yeh std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex); 5722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool known = false; 5732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala for (auto& deviceInfo : mDevices) { 5742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (deviceInfo->mName == cameraDeviceName) { 5752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(), 5762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala torchStatusToString(newStatus)); 5772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala id = deviceInfo->mId; 5782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala known = true; 5792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 5802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!known) { 5832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.", 5842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mProviderName.c_str(), cameraDeviceName.c_str(), newStatus); 5852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener = mManager->mListener.promote(); 5882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Call without lock held to allow reentrancy into provider manager 5902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (listener != nullptr) { 5912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala listener->onTorchStatusChanged(String8(id.c_str()), newStatus); 5922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 5932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return hardware::Void(); 5942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 5952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 5972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class DeviceInfoT> 5982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastd::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo> 5992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraProviderManager::ProviderInfo::initializeDeviceInfo( 6002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &name, 6012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, uint16_t minorVersion) const { 6022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 6032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala auto cameraInterface = 6052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala getDeviceInterface<typename DeviceInfoT::InterfaceT>(name); 6062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (cameraInterface == nullptr) return nullptr; 6072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraResourceCost resourceCost; 6092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface->getResourceCost([&status, &resourceCost]( 6102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, CameraResourceCost cost) { 6112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 6122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala resourceCost = cost; 6132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__, 6162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 6172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 6182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return std::unique_ptr<DeviceInfo>( 6202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala new DeviceInfoT(name, id, minorVersion, resourceCost, cameraInterface)); 6212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class InterfaceT> 6242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<InterfaceT> 6252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface(const std::string &name) const { 6262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__, 6272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), InterfaceT::version.get_major()); 6282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 6292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<> 6322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<device::V1_0::ICameraDevice> 6332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface 6342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala <device::V1_0::ICameraDevice>(const std::string &name) const { 6352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 6362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<device::V1_0::ICameraDevice> cameraInterface; 6372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraDeviceInterface_V1_x(name, [&status, &cameraInterface]( 6382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, sp<device::V1_0::ICameraDevice> interface) { 6392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 6402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface = interface; 6412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 6442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 6452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 6462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return cameraInterface; 6482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<> 6512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalasp<device::V3_2::ICameraDevice> 6522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::getDeviceInterface 6532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala <device::V3_2::ICameraDevice>(const std::string &name) const { 6542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 6552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<device::V3_2::ICameraDevice> cameraInterface; 6562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface]( 6572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s, sp<device::V3_2::ICameraDevice> interface) { 6582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 6592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cameraInterface = interface; 6602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__, 6632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala name.c_str(), statusToString(status)); 6642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return nullptr; 6652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return cameraInterface; 6672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {} 6702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalatemplate<class InterfaceT> 6722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface, 6732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala bool enabled) { 6742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF); 6752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(s); 6762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 6772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo1::DeviceInfo1(const std::string& name, 6792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, 6802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t minorVersion, 6812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const CameraResourceCost& resourceCost, 6822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<InterfaceT> interface) : 6832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DeviceInfo(name, id, hardware::hidl_version{1, minorVersion}, resourceCost), 6842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface) { 6852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get default parameters and initialize flash unit availability 6862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Requires powering on the camera device 6872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status = mInterface->open(nullptr); 6882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 6892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to open camera device %s to check for a flash unit: %s (%d)", __FUNCTION__, 6902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mId.c_str(), CameraProviderManager::statusToString(status), status); 6912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return; 6922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 6932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getParameters([this](const hardware::hidl_string& parms) { 6942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDefaultParameters.unflatten(String8(parms.c_str())); 6952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 6962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 6972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const char *flashMode = 6982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mDefaultParameters.get(CameraParameters::KEY_SUPPORTED_FLASH_MODES); 6992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (flashMode && strstr(flashMode, CameraParameters::FLASH_MODE_TORCH)) { 7002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = true; 7012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 7022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = false; 7032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->close(); 7062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo1::~DeviceInfo1() {} 7092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo1::setTorchMode(bool enabled) { 7112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DeviceInfo::setTorchMode(mInterface, enabled); 7122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo1::getCameraInfo( 7152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo *info) const { 7162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (info == nullptr) return BAD_VALUE; 7172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 7192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device::V1_0::CameraInfo cInfo; 7202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraInfo([&status, &cInfo](Status s, device::V1_0::CameraInfo camInfo) { 7212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 7222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala cInfo = camInfo; 7232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 7242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 7252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return mapToStatusT(status); 7262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(cInfo.facing) { 7292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::BACK: 7302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 7312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 7322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::EXTERNAL: 7332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Map external to front for legacy API 7342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case device::V1_0::CameraFacing::FRONT: 7352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_FRONT; 7362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 7372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala default: 7382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("%s: Unknown camera facing: %d", __FUNCTION__, cInfo.facing); 7392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 7402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->orientation = cInfo.orientation; 7422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 7442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name, 7472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const std::string &id, 7482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t minorVersion, 7492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const CameraResourceCost& resourceCost, 7502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala sp<InterfaceT> interface) : 7512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala DeviceInfo(name, id, hardware::hidl_version{3, minorVersion}, resourceCost), 7522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface(interface) { 7532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Get camera characteristics and initialize flash unit availability 7542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala Status status; 7552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mInterface->getCameraCharacteristics([&status, this](Status s, 7562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala device::V3_2::CameraMetadata metadata) { 7572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala status = s; 7582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (s == Status::OK) { 7592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_t *buffer = 7602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala reinterpret_cast<camera_metadata_t*>(metadata.data()); 7612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics = buffer; 7622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala }); 7642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (status != Status::OK) { 7652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)", 7662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, mId.c_str(), CameraProviderManager::statusToString(status), status); 7672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return; 7682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_entry flashAvailable = 7702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE); 7712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (flashAvailable.count == 1 && 7722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) { 7732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = true; 7742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 7752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mHasFlashUnit = false; 7762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 7772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {} 7802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) { 7822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DeviceInfo::setTorchMode(mInterface, enabled); 7832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 7842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo( 7862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala hardware::CameraInfo *info) const { 7872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (info == nullptr) return BAD_VALUE; 7882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 7892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_ro_entry facing = 7902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_LENS_FACING); 7912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (facing.count == 1) { 7922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch (facing.data.u8[0]) { 7932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_BACK: 7942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_BACK; 7952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 7962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_EXTERNAL: 7972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Map external to front for legacy API 7982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case ANDROID_LENS_FACING_FRONT: 7992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->facing = hardware::CAMERA_FACING_FRONT; 8002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala break; 8012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 8032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__); 8042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 8052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala camera_metadata_ro_entry orientation = 8082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION); 8092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (orientation.count == 1) { 8102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala info->orientation = orientation.data.i32[0]; 8112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } else { 8122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__); 8132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return NAME_NOT_FOUND; 8142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 8172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics( 8202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala CameraMetadata *characteristics) const { 8212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (characteristics == nullptr) return BAD_VALUE; 8222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *characteristics = mCameraCharacteristics; 8242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 8252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name, 8282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string *type, uint32_t *id) { 8292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Format must be "<type>/<id>" 8302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. " \ 8312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "Should match '<type>/<id>' - " 8322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!type || !id) return INVALID_OPERATION; 8342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type slashIdx = name.find('/'); 8362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (slashIdx == std::string::npos || slashIdx == name.size() - 1) { 8372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have / separator between type and id", 8392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string typeVal = name.substr(0, slashIdx); 8442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala char *endPtr; 8462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala errno = 0; 8472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10); 8482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 8492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse provider id as an integer: %s (%d)", 8512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 8522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + name.size()) { 8552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "provider id has unexpected length", 8572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 8582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (idVal < 0) { 8612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "id is negative: %ld", 8632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), idVal); 8642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#undef ERROR_MSG_PREFIX 8682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *type = typeVal; 8702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *id = static_cast<uint32_t>(idVal); 8712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 8732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 8742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name, 8762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala uint16_t *major, uint16_t *minor, std::string *type, std::string *id) { 8772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Format must be "device@<major>.<minor>/<type>/<id>" 8792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \ 8812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "Should match 'device@<major>.<minor>/<type>/<id>' - " 8822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (!major || !minor || !type || !id) return INVALID_OPERATION; 8842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Verify starting prefix 8862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala const char expectedPrefix[] = "device@"; 8872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (name.find(expectedPrefix) != 0) { 8892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 8902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not start with '%s'", 8912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), expectedPrefix); 8922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 8932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 8942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 8952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Extract major/minor versions 8962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2; 8972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type dotIdx = name.find('.', atIdx); 8982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (dotIdx == std::string::npos) { 8992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have @<major>. version section", 9012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type typeSlashIdx = name.find('/', dotIdx); 9052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (typeSlashIdx == std::string::npos) { 9062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have .<minor>/ version section", 9082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala char *endPtr; 9132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala errno = 0; 9142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10); 9152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 9162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse major version: %s (%d)", 9182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 9192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + dotIdx) { 9222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "major version has unexpected length", 9242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10); 9282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (errno != 0) { 9292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "cannot parse minor version: %s (%d)", 9312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), strerror(errno), errno); 9322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (endPtr != name.c_str() + typeSlashIdx) { 9352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "minor version has unexpected length", 9372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) { 9412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "major/minor version is out of range of uint16_t: %ld.%ld", 9432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str(), majorVal, minorVal); 9442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Extract type and id 9482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1); 9502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (instanceSlashIdx == std::string::npos) { 9512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have /<type>/ component", 9532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9562f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1); 9572f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9582f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala if (instanceSlashIdx == name.size() - 1) { 9592f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGE(ERROR_MSG_PREFIX 9602f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala "does not have an /<id> component", 9612f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala __FUNCTION__, name.c_str()); 9622f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9632f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 9642f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala std::string idVal = name.substr(instanceSlashIdx + 1); 9652f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9662f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala#undef ERROR_MSG_PREFIX 9672f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9682f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *major = static_cast<uint16_t>(majorVal); 9692f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *minor = static_cast<uint16_t>(minorVal); 9702f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *type = typeVal; 9712f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala *id = idVal; 9722f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9732f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 9742f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9752f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9762f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9772f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9782f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville TalvalaCameraProviderManager::ProviderInfo::~ProviderInfo() { 9792f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // Destruction of ProviderInfo is only supposed to happen when the respective 9802f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala // CameraProvider interface dies, so do not unregister callbacks. 9812f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9822f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 9832f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 9842f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalastatus_t CameraProviderManager::mapToStatusT(const Status& s) { 9852f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 9862f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OK: 9872f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return OK; 9882f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::ILLEGAL_ARGUMENT: 9892f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return BAD_VALUE; 9902f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_IN_USE: 9912f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return -EBUSY; 9922f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::MAX_CAMERAS_IN_USE: 9932f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return -EUSERS; 9942f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::METHOD_NOT_SUPPORTED: 9952f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return UNKNOWN_TRANSACTION; 9962f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OPERATION_NOT_SUPPORTED: 9972f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 9982f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_DISCONNECTED: 9992f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return DEAD_OBJECT; 10002f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::INTERNAL_ERROR: 10012f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 10022f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10032f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL status code %d", s); 10042f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return INVALID_OPERATION; 10052f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10062f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10072f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::statusToString(const Status& s) { 10082f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 10092f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OK: 10102f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "OK"; 10112f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::ILLEGAL_ARGUMENT: 10122f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "ILLEGAL_ARGUMENT"; 10132f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_IN_USE: 10142f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "CAMERA_IN_USE"; 10152f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::MAX_CAMERAS_IN_USE: 10162f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "MAX_CAMERAS_IN_USE"; 10172f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::METHOD_NOT_SUPPORTED: 10182f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "METHOD_NOT_SUPPORTED"; 10192f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::OPERATION_NOT_SUPPORTED: 10202f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "OPERATION_NOT_SUPPORTED"; 10212f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::CAMERA_DISCONNECTED: 10222f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "CAMERA_DISCONNECTED"; 10232f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case Status::INTERNAL_ERROR: 10242f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "INTERNAL_ERROR"; 10252f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10262f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL status code %d", s); 10272f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_ERROR"; 10282f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10292f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10302f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) { 10312f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 10322f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::NOT_PRESENT: 10332f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "NOT_PRESENT"; 10342f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::PRESENT: 10352f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "PRESENT"; 10362f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case CameraDeviceStatus::ENUMERATING: 10372f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "ENUMERATING"; 10382f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10392f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL device status code %d", s); 10402f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_STATUS"; 10412f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10422f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 10432f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvalaconst char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) { 10442f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala switch(s) { 10452f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::NOT_AVAILABLE: 10462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "NOT_AVAILABLE"; 10472f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::AVAILABLE_OFF: 10482f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "AVAILABLE_OFF"; 10492f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala case TorchModeStatus::AVAILABLE_ON: 10502f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "AVAILABLE_ON"; 10512f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala } 10522f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala ALOGW("Unexpected HAL torch mode status code %d", s); 10532f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala return "UNKNOWN_STATUS"; 10542f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} 10552f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala 1056067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1057067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yehstatus_t HidlVendorTagDescriptor::createDescriptorFromHidl( 1058067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts, 1059067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh /*out*/ 1060067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<VendorTagDescriptor>& descriptor) { 1061067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1062067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int tagCount = 0; 1063067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1064067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t s = 0; s < vts.size(); s++) { 1065067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagCount += vts[s].tags.size(); 1066067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1067067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1068067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagCount < 0 || tagCount > INT32_MAX) { 1069067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount); 1070067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1071067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1072067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1073067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh Vector<uint32_t> tagArray; 1074067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount, 1075067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount); 1076067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1077067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1078067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor(); 1079067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagCount = tagCount; 1080067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1081067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh SortedVector<String8> sections; 1082067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh KeyedVector<uint32_t, String8> tagToSectionMap; 1083067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1084067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int idx = 0; 1085067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t s = 0; s < vts.size(); s++) { 1086067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const hardware::camera::common::V1_0::VendorTagSection& section = vts[s]; 1087067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const char *sectionName = section.sectionName.c_str(); 1088067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (sectionName == NULL) { 1089067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s); 1090067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1091067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1092067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh String8 sectionString(sectionName); 1093067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh sections.add(sectionString); 1094067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1095067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t j = 0; j < section.tags.size(); j++) { 1096067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh uint32_t tag = section.tags[j].tagId; 1097067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) { 1098067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag); 1099067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1100067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1101067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1102067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagArray.editItemAt(idx++) = section.tags[j].tagId; 1103067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1104067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh const char *tagName = section.tags[j].tagName.c_str(); 1105067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagName == NULL) { 1106067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag); 1107067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1108067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1109067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToNameMap.add(tag, String8(tagName)); 1110067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh tagToSectionMap.add(tag, sectionString); 1111067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1112067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh int tagType = (int) section.tags[j].tagType; 1113067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if (tagType < 0 || tagType >= NUM_TYPES) { 1114067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType); 1115067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return BAD_VALUE; 1116067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1117067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToTypeMap.add(tag, tagType); 1118067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1119067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1120067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1121067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mSections = sections; 1122067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1123067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh for (size_t i = 0; i < tagArray.size(); ++i) { 1124067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh uint32_t tag = tagArray[i]; 1125067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh String8 sectionString = tagToSectionMap.valueFor(tag); 1126067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1127067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set up tag to section index map 1128067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ssize_t index = sections.indexOf(sectionString); 1129067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index); 1130067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index)); 1131067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1132067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh // Set up reverse mapping 1133067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh ssize_t reverseIndex = -1; 1134067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) { 1135067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>(); 1136067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper); 1137067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1138067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag); 1139067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh } 1140067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1141067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh descriptor = desc; 1142067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh return OK; 1143067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh} 1144067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 1145067428c5a8429d711f94bf008debde29ac118849Yin-Chia Yeh 11462f09bac6632a5ee27ee14baa2aa1367f16b5b013Eino-Ville Talvala} // namespace android 1147