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