1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #define LOG_TAG "CameraProviderManager"
18 #define ATRACE_TAG ATRACE_TAG_CAMERA
19 //#define LOG_NDEBUG 0
20 
21 #include "CameraProviderManager.h"
22 
23 #include <android/hardware/camera/device/3.7/ICameraDevice.h>
24 
25 #include <algorithm>
26 #include <chrono>
27 #include "common/DepthPhotoProcessor.h"
28 #include <dlfcn.h>
29 #include <future>
30 #include <inttypes.h>
31 #include <android/hidl/manager/1.2/IServiceManager.h>
32 #include <hidl/ServiceManagement.h>
33 #include <functional>
34 #include <camera_metadata_hidden.h>
35 #include <android-base/parseint.h>
36 #include <android-base/logging.h>
37 #include <cutils/properties.h>
38 #include <hwbinder/IPCThreadState.h>
39 #include <utils/SessionConfigurationUtils.h>
40 #include <utils/Trace.h>
41 
42 #include "api2/HeicCompositeStream.h"
43 #include "device3/ZoomRatioMapper.h"
44 
45 namespace android {
46 
47 using namespace ::android::hardware::camera;
48 using namespace ::android::hardware::camera::common::V1_0;
49 using camera3::SessionConfigurationUtils;
50 using std::literals::chrono_literals::operator""s;
51 using hardware::camera2::utils::CameraIdAndSessionConfiguration;
52 using hardware::camera::provider::V2_7::CameraIdAndStreamCombination;
53 
54 namespace {
55 const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
56 } // anonymous namespace
57 
58 const float CameraProviderManager::kDepthARTolerance = .1f;
59 
60 CameraProviderManager::HardwareServiceInteractionProxy
61 CameraProviderManager::sHardwareServiceInteractionProxy{};
62 
~CameraProviderManager()63 CameraProviderManager::~CameraProviderManager() {
64 }
65 
66 hardware::hidl_vec<hardware::hidl_string>
listServices()67 CameraProviderManager::HardwareServiceInteractionProxy::listServices() {
68     hardware::hidl_vec<hardware::hidl_string> ret;
69     auto manager = hardware::defaultServiceManager1_2();
70     if (manager != nullptr) {
71         manager->listManifestByInterface(provider::V2_4::ICameraProvider::descriptor,
72                 [&ret](const hardware::hidl_vec<hardware::hidl_string> &registered) {
73                     ret = registered;
74                 });
75     }
76     return ret;
77 }
78 
initialize(wp<CameraProviderManager::StatusListener> listener,ServiceInteractionProxy * proxy)79 status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
80         ServiceInteractionProxy* proxy) {
81     std::lock_guard<std::mutex> lock(mInterfaceMutex);
82     if (proxy == nullptr) {
83         ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
84         return BAD_VALUE;
85     }
86     mListener = listener;
87     mServiceProxy = proxy;
88     mDeviceState = static_cast<hardware::hidl_bitfield<provider::V2_5::DeviceState>>(
89         provider::V2_5::DeviceState::NORMAL);
90 
91     // Registering will trigger notifications for all already-known providers
92     bool success = mServiceProxy->registerForNotifications(
93         /* instance name, empty means no filter */ "",
94         this);
95     if (!success) {
96         ALOGE("%s: Unable to register with hardware service manager for notifications "
97                 "about camera providers", __FUNCTION__);
98         return INVALID_OPERATION;
99     }
100 
101 
102     for (const auto& instance : mServiceProxy->listServices()) {
103         this->addProviderLocked(instance);
104     }
105 
106     IPCThreadState::self()->flushCommands();
107 
108     return OK;
109 }
110 
getCameraCount() const111 std::pair<int, int> CameraProviderManager::getCameraCount() const {
112     std::lock_guard<std::mutex> lock(mInterfaceMutex);
113     int systemCameraCount = 0;
114     int publicCameraCount = 0;
115     for (auto& provider : mProviders) {
116         for (auto &id : provider->mUniqueCameraIds) {
117             SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
118             if (getSystemCameraKindLocked(id, &deviceKind) != OK) {
119                 ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, id.c_str());
120                 continue;
121             }
122             switch(deviceKind) {
123                 case SystemCameraKind::PUBLIC:
124                     publicCameraCount++;
125                     break;
126                 case SystemCameraKind::SYSTEM_ONLY_CAMERA:
127                     systemCameraCount++;
128                     break;
129                 default:
130                     break;
131             }
132         }
133     }
134     return std::make_pair(systemCameraCount, publicCameraCount);
135 }
136 
getCameraDeviceIds() const137 std::vector<std::string> CameraProviderManager::getCameraDeviceIds() const {
138     std::lock_guard<std::mutex> lock(mInterfaceMutex);
139     std::vector<std::string> deviceIds;
140     for (auto& provider : mProviders) {
141         for (auto& id : provider->mUniqueCameraIds) {
142             deviceIds.push_back(id);
143         }
144     }
145     return deviceIds;
146 }
147 
collectDeviceIdsLocked(const std::vector<std::string> deviceIds,std::vector<std::string> & publicDeviceIds,std::vector<std::string> & systemDeviceIds) const148 void CameraProviderManager::collectDeviceIdsLocked(const std::vector<std::string> deviceIds,
149         std::vector<std::string>& publicDeviceIds,
150         std::vector<std::string>& systemDeviceIds) const {
151     for (auto &deviceId : deviceIds) {
152         SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
153         if (getSystemCameraKindLocked(deviceId, &deviceKind) != OK) {
154             ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, deviceId.c_str());
155             continue;
156         }
157         if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA) {
158             systemDeviceIds.push_back(deviceId);
159         } else {
160             publicDeviceIds.push_back(deviceId);
161         }
162     }
163 }
164 
getAPI1CompatibleCameraDeviceIds() const165 std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const {
166     std::lock_guard<std::mutex> lock(mInterfaceMutex);
167     std::vector<std::string> publicDeviceIds;
168     std::vector<std::string> systemDeviceIds;
169     std::vector<std::string> deviceIds;
170     for (auto& provider : mProviders) {
171         std::vector<std::string> providerDeviceIds = provider->mUniqueAPI1CompatibleCameraIds;
172         // Secure cameras should not be exposed through camera 1 api
173         providerDeviceIds.erase(std::remove_if(providerDeviceIds.begin(), providerDeviceIds.end(),
174                 [this](const std::string& s) {
175                 SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
176                 if (getSystemCameraKindLocked(s, &deviceKind) != OK) {
177                     ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, s.c_str());
178                     return true;
179                 }
180                 return deviceKind == SystemCameraKind::HIDDEN_SECURE_CAMERA;}),
181                 providerDeviceIds.end());
182         // API1 app doesn't handle logical and physical camera devices well. So
183         // for each camera facing, only take the first id advertised by HAL in
184         // all [logical, physical1, physical2, ...] id combos, and filter out the rest.
185         filterLogicalCameraIdsLocked(providerDeviceIds);
186         collectDeviceIdsLocked(providerDeviceIds, publicDeviceIds, systemDeviceIds);
187     }
188     auto sortFunc =
189             [](const std::string& a, const std::string& b) -> bool {
190                 uint32_t aUint = 0, bUint = 0;
191                 bool aIsUint = base::ParseUint(a, &aUint);
192                 bool bIsUint = base::ParseUint(b, &bUint);
193 
194                 // Uint device IDs first
195                 if (aIsUint && bIsUint) {
196                     return aUint < bUint;
197                 } else if (aIsUint) {
198                     return true;
199                 } else if (bIsUint) {
200                     return false;
201                 }
202                 // Simple string compare if both id are not uint
203                 return a < b;
204             };
205     // We put device ids for system cameras at the end since they will be pared
206     // off for processes not having system camera permissions.
207     std::sort(publicDeviceIds.begin(), publicDeviceIds.end(), sortFunc);
208     std::sort(systemDeviceIds.begin(), systemDeviceIds.end(), sortFunc);
209     deviceIds.insert(deviceIds.end(), publicDeviceIds.begin(), publicDeviceIds.end());
210     deviceIds.insert(deviceIds.end(), systemDeviceIds.begin(), systemDeviceIds.end());
211     return deviceIds;
212 }
213 
isValidDevice(const std::string & id,uint16_t majorVersion) const214 bool CameraProviderManager::isValidDevice(const std::string &id, uint16_t majorVersion) const {
215     std::lock_guard<std::mutex> lock(mInterfaceMutex);
216     return isValidDeviceLocked(id, majorVersion);
217 }
218 
isValidDeviceLocked(const std::string & id,uint16_t majorVersion) const219 bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const {
220     for (auto& provider : mProviders) {
221         for (auto& deviceInfo : provider->mDevices) {
222             if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion) {
223                 return true;
224             }
225         }
226     }
227     return false;
228 }
229 
hasFlashUnit(const std::string & id) const230 bool CameraProviderManager::hasFlashUnit(const std::string &id) const {
231     std::lock_guard<std::mutex> lock(mInterfaceMutex);
232 
233     auto deviceInfo = findDeviceInfoLocked(id);
234     if (deviceInfo == nullptr) return false;
235 
236     return deviceInfo->hasFlashUnit();
237 }
238 
supportNativeZoomRatio(const std::string & id) const239 bool CameraProviderManager::supportNativeZoomRatio(const std::string &id) const {
240     std::lock_guard<std::mutex> lock(mInterfaceMutex);
241 
242     auto deviceInfo = findDeviceInfoLocked(id);
243     if (deviceInfo == nullptr) return false;
244 
245     return deviceInfo->supportNativeZoomRatio();
246 }
247 
getResourceCost(const std::string & id,CameraResourceCost * cost) const248 status_t CameraProviderManager::getResourceCost(const std::string &id,
249         CameraResourceCost* cost) const {
250     std::lock_guard<std::mutex> lock(mInterfaceMutex);
251 
252     auto deviceInfo = findDeviceInfoLocked(id);
253     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
254 
255     *cost = deviceInfo->mResourceCost;
256     return OK;
257 }
258 
getCameraInfo(const std::string & id,hardware::CameraInfo * info) const259 status_t CameraProviderManager::getCameraInfo(const std::string &id,
260         hardware::CameraInfo* info) const {
261     std::lock_guard<std::mutex> lock(mInterfaceMutex);
262 
263     auto deviceInfo = findDeviceInfoLocked(id);
264     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
265 
266     return deviceInfo->getCameraInfo(info);
267 }
268 
isSessionConfigurationSupported(const std::string & id,const hardware::camera::device::V3_7::StreamConfiguration & configuration,bool * status) const269 status_t CameraProviderManager::isSessionConfigurationSupported(const std::string& id,
270         const hardware::camera::device::V3_7::StreamConfiguration &configuration,
271         bool *status /*out*/) const {
272     std::lock_guard<std::mutex> lock(mInterfaceMutex);
273     auto deviceInfo = findDeviceInfoLocked(id);
274     if (deviceInfo == nullptr) {
275         return NAME_NOT_FOUND;
276     }
277 
278     return deviceInfo->isSessionConfigurationSupported(configuration, status);
279 }
280 
getCameraCharacteristics(const std::string & id,bool overrideForPerfClass,CameraMetadata * characteristics) const281 status_t CameraProviderManager::getCameraCharacteristics(const std::string &id,
282         bool overrideForPerfClass, CameraMetadata* characteristics) const {
283     std::lock_guard<std::mutex> lock(mInterfaceMutex);
284     return getCameraCharacteristicsLocked(id, overrideForPerfClass, characteristics);
285 }
286 
getHighestSupportedVersion(const std::string & id,hardware::hidl_version * v)287 status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id,
288         hardware::hidl_version *v) {
289     std::lock_guard<std::mutex> lock(mInterfaceMutex);
290 
291     hardware::hidl_version maxVersion{0,0};
292     bool found = false;
293     for (auto& provider : mProviders) {
294         for (auto& deviceInfo : provider->mDevices) {
295             if (deviceInfo->mId == id) {
296                 if (deviceInfo->mVersion > maxVersion) {
297                     maxVersion = deviceInfo->mVersion;
298                     found = true;
299                 }
300             }
301         }
302     }
303     if (!found) {
304         return NAME_NOT_FOUND;
305     }
306     *v = maxVersion;
307     return OK;
308 }
309 
supportSetTorchMode(const std::string & id) const310 bool CameraProviderManager::supportSetTorchMode(const std::string &id) const {
311     std::lock_guard<std::mutex> lock(mInterfaceMutex);
312     for (auto& provider : mProviders) {
313         auto deviceInfo = findDeviceInfoLocked(id);
314         if (deviceInfo != nullptr) {
315             return provider->mSetTorchModeSupported;
316         }
317     }
318     return false;
319 }
320 
setTorchMode(const std::string & id,bool enabled)321 status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) {
322     std::lock_guard<std::mutex> lock(mInterfaceMutex);
323 
324     auto deviceInfo = findDeviceInfoLocked(id);
325     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
326 
327     // Pass the camera ID to start interface so that it will save it to the map of ICameraProviders
328     // that are currently in use.
329     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
330     if (parentProvider == nullptr) {
331         return DEAD_OBJECT;
332     }
333     const sp<provider::V2_4::ICameraProvider> interface = parentProvider->startProviderInterface();
334     if (interface == nullptr) {
335         return DEAD_OBJECT;
336     }
337     saveRef(DeviceMode::TORCH, deviceInfo->mId, interface);
338 
339     return deviceInfo->setTorchMode(enabled);
340 }
341 
setUpVendorTags()342 status_t CameraProviderManager::setUpVendorTags() {
343     sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
344 
345     for (auto& provider : mProviders) {
346         tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor);
347     }
348 
349     VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);
350 
351     return OK;
352 }
353 
notifyDeviceStateChange(hardware::hidl_bitfield<provider::V2_5::DeviceState> newState)354 status_t CameraProviderManager::notifyDeviceStateChange(
355         hardware::hidl_bitfield<provider::V2_5::DeviceState> newState) {
356     std::lock_guard<std::mutex> lock(mInterfaceMutex);
357     mDeviceState = newState;
358     status_t res = OK;
359     for (auto& provider : mProviders) {
360         ALOGV("%s: Notifying %s for new state 0x%" PRIx64,
361                 __FUNCTION__, provider->mProviderName.c_str(), newState);
362         // b/199240726 Camera providers can for example try to add/remove
363         // camera devices as part of the state change notification. Holding
364         // 'mInterfaceMutex' while calling 'notifyDeviceStateChange' can
365         // result in a recursive deadlock.
366         mInterfaceMutex.unlock();
367         status_t singleRes = provider->notifyDeviceStateChange(mDeviceState);
368         mInterfaceMutex.lock();
369         if (singleRes != OK) {
370             ALOGE("%s: Unable to notify provider %s about device state change",
371                     __FUNCTION__,
372                     provider->mProviderName.c_str());
373             res = singleRes;
374             // continue to do the rest of the providers instead of returning now
375         }
376         provider->notifyDeviceInfoStateChangeLocked(mDeviceState);
377     }
378     return res;
379 }
380 
openSession(const std::string & id,const sp<device::V3_2::ICameraDeviceCallback> & callback,sp<device::V3_2::ICameraDeviceSession> * session)381 status_t CameraProviderManager::openSession(const std::string &id,
382         const sp<device::V3_2::ICameraDeviceCallback>& callback,
383         /*out*/
384         sp<device::V3_2::ICameraDeviceSession> *session) {
385 
386     std::lock_guard<std::mutex> lock(mInterfaceMutex);
387 
388     auto deviceInfo = findDeviceInfoLocked(id,
389             /*minVersion*/ {3,0}, /*maxVersion*/ {4,0});
390     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
391 
392     auto *deviceInfo3 = static_cast<ProviderInfo::DeviceInfo3*>(deviceInfo);
393     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
394     if (parentProvider == nullptr) {
395         return DEAD_OBJECT;
396     }
397     const sp<provider::V2_4::ICameraProvider> provider = parentProvider->startProviderInterface();
398     if (provider == nullptr) {
399         return DEAD_OBJECT;
400     }
401     saveRef(DeviceMode::CAMERA, id, provider);
402 
403     Status status;
404     hardware::Return<void> ret;
405     auto interface = deviceInfo3->startDeviceInterface<
406             CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>();
407     if (interface == nullptr) {
408         return DEAD_OBJECT;
409     }
410 
411     ret = interface->open(callback, [&status, &session]
412             (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {
413                 status = s;
414                 if (status == Status::OK) {
415                     *session = cameraSession;
416                 }
417             });
418     if (!ret.isOk()) {
419         removeRef(DeviceMode::CAMERA, id);
420         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
421                 __FUNCTION__, id.c_str(), ret.description().c_str());
422         return DEAD_OBJECT;
423     }
424     return mapToStatusT(status);
425 }
426 
saveRef(DeviceMode usageType,const std::string & cameraId,sp<provider::V2_4::ICameraProvider> provider)427 void CameraProviderManager::saveRef(DeviceMode usageType, const std::string &cameraId,
428         sp<provider::V2_4::ICameraProvider> provider) {
429     if (!kEnableLazyHal) {
430         return;
431     }
432     ALOGV("Saving camera provider %s for camera device %s", provider->descriptor, cameraId.c_str());
433     std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock);
434     std::unordered_map<std::string, sp<provider::V2_4::ICameraProvider>> *primaryMap, *alternateMap;
435     if (usageType == DeviceMode::TORCH) {
436         primaryMap = &mTorchProviderByCameraId;
437         alternateMap = &mCameraProviderByCameraId;
438     } else {
439         primaryMap = &mCameraProviderByCameraId;
440         alternateMap = &mTorchProviderByCameraId;
441     }
442     auto id = cameraId.c_str();
443     (*primaryMap)[id] = provider;
444     auto search = alternateMap->find(id);
445     if (search != alternateMap->end()) {
446         ALOGW("%s: Camera device %s is using both torch mode and camera mode simultaneously. "
447                 "That should not be possible", __FUNCTION__, id);
448     }
449     ALOGV("%s: Camera device %s connected", __FUNCTION__, id);
450 }
451 
removeRef(DeviceMode usageType,const std::string & cameraId)452 void CameraProviderManager::removeRef(DeviceMode usageType, const std::string &cameraId) {
453     if (!kEnableLazyHal) {
454         return;
455     }
456     ALOGV("Removing camera device %s", cameraId.c_str());
457     std::unordered_map<std::string, sp<provider::V2_4::ICameraProvider>> *providerMap;
458     if (usageType == DeviceMode::TORCH) {
459         providerMap = &mTorchProviderByCameraId;
460     } else {
461         providerMap = &mCameraProviderByCameraId;
462     }
463     std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock);
464     auto search = providerMap->find(cameraId.c_str());
465     if (search != providerMap->end()) {
466         // Drop the reference to this ICameraProvider. This is safe to do immediately (without an
467         // added delay) because hwservicemanager guarantees to hold the reference for at least five
468         // more seconds.  We depend on this behavior so that if the provider is unreferenced and
469         // then referenced again quickly, we do not let the HAL exit and then need to immediately
470         // restart it. An example when this could happen is switching from a front-facing to a
471         // rear-facing camera. If the HAL were to exit during the camera switch, the camera could
472         // appear janky to the user.
473         providerMap->erase(cameraId.c_str());
474         IPCThreadState::self()->flushCommands();
475     } else {
476         ALOGE("%s: Asked to remove reference for camera %s, but no reference to it was found. This "
477                 "could mean removeRef was called twice for the same camera ID.", __FUNCTION__,
478                 cameraId.c_str());
479     }
480 }
481 
onRegistration(const hardware::hidl_string &,const hardware::hidl_string & name,bool preexisting)482 hardware::Return<void> CameraProviderManager::onRegistration(
483         const hardware::hidl_string& /*fqName*/,
484         const hardware::hidl_string& name,
485         bool preexisting) {
486     status_t res = OK;
487     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
488     {
489         std::lock_guard<std::mutex> lock(mInterfaceMutex);
490 
491         res = addProviderLocked(name, preexisting);
492     }
493 
494     sp<StatusListener> listener = getStatusListener();
495     if (nullptr != listener.get() && res == OK) {
496         listener->onNewProviderRegistered();
497     }
498 
499     IPCThreadState::self()->flushCommands();
500 
501     return hardware::Return<void>();
502 }
503 
dump(int fd,const Vector<String16> & args)504 status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) {
505     std::lock_guard<std::mutex> lock(mInterfaceMutex);
506 
507     for (auto& provider : mProviders) {
508         provider->dump(fd, args);
509     }
510     return OK;
511 }
512 
findDeviceInfoLocked(const std::string & id,hardware::hidl_version minVersion,hardware::hidl_version maxVersion) const513 CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked(
514         const std::string& id,
515         hardware::hidl_version minVersion, hardware::hidl_version maxVersion) const {
516     for (auto& provider : mProviders) {
517         for (auto& deviceInfo : provider->mDevices) {
518             if (deviceInfo->mId == id &&
519                     minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) {
520                 return deviceInfo.get();
521             }
522         }
523     }
524     return nullptr;
525 }
526 
getProviderTagIdLocked(const std::string & id,hardware::hidl_version minVersion,hardware::hidl_version maxVersion) const527 metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked(
528         const std::string& id, hardware::hidl_version minVersion,
529         hardware::hidl_version maxVersion) const {
530     metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID;
531 
532     std::lock_guard<std::mutex> lock(mInterfaceMutex);
533     for (auto& provider : mProviders) {
534         for (auto& deviceInfo : provider->mDevices) {
535             if (deviceInfo->mId == id &&
536                     minVersion <= deviceInfo->mVersion &&
537                     maxVersion >= deviceInfo->mVersion) {
538                 return provider->mProviderTagid;
539             }
540         }
541     }
542 
543     return ret;
544 }
545 
queryPhysicalCameraIds()546 void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() {
547     camera_metadata_entry_t entryCap;
548 
549     entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
550     for (size_t i = 0; i < entryCap.count; ++i) {
551         uint8_t capability = entryCap.data.u8[i];
552         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
553             mIsLogicalCamera = true;
554             break;
555         }
556     }
557     if (!mIsLogicalCamera) {
558         return;
559     }
560 
561     camera_metadata_entry_t entryIds = mCameraCharacteristics.find(
562             ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS);
563     const uint8_t* ids = entryIds.data.u8;
564     size_t start = 0;
565     for (size_t i = 0; i < entryIds.count; ++i) {
566         if (ids[i] == '\0') {
567             if (start != i) {
568                 mPhysicalIds.push_back((const char*)ids+start);
569             }
570             start = i+1;
571         }
572     }
573 }
574 
getSystemCameraKind()575 SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCameraKind() {
576     camera_metadata_entry_t entryCap;
577     entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
578     if (entryCap.count == 1 &&
579             entryCap.data.u8[0] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA) {
580         return SystemCameraKind::HIDDEN_SECURE_CAMERA;
581     }
582 
583     // Go through the capabilities and check if it has
584     // ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
585     for (size_t i = 0; i < entryCap.count; ++i) {
586         uint8_t capability = entryCap.data.u8[i];
587         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA) {
588             return SystemCameraKind::SYSTEM_ONLY_CAMERA;
589         }
590     }
591     return SystemCameraKind::PUBLIC;
592 }
593 
getSupportedSizes(const CameraMetadata & ch,uint32_t tag,android_pixel_format_t format,std::vector<std::tuple<size_t,size_t>> * sizes)594 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedSizes(
595         const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format,
596         std::vector<std::tuple<size_t, size_t>> *sizes/*out*/) {
597     if (sizes == nullptr) {
598         return;
599     }
600 
601     auto scalerDims = ch.find(tag);
602     if (scalerDims.count > 0) {
603         // Scaler entry contains 4 elements (format, width, height, type)
604         for (size_t i = 0; i < scalerDims.count; i += 4) {
605             if ((scalerDims.data.i32[i] == format) &&
606                     (scalerDims.data.i32[i+3] ==
607                      ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) {
608                 sizes->push_back(std::make_tuple(scalerDims.data.i32[i+1],
609                             scalerDims.data.i32[i+2]));
610             }
611         }
612     }
613 }
614 
getSupportedDurations(const CameraMetadata & ch,uint32_t tag,android_pixel_format_t format,const std::vector<std::tuple<size_t,size_t>> & sizes,std::vector<int64_t> * durations)615 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDurations(
616         const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format,
617         const std::vector<std::tuple<size_t, size_t>>& sizes,
618         std::vector<int64_t> *durations/*out*/) {
619     if (durations == nullptr) {
620         return;
621     }
622 
623     auto availableDurations = ch.find(tag);
624     if (availableDurations.count > 0) {
625         // Duration entry contains 4 elements (format, width, height, duration)
626         for (size_t i = 0; i < availableDurations.count; i += 4) {
627             for (const auto& size : sizes) {
628                 int64_t width = std::get<0>(size);
629                 int64_t height = std::get<1>(size);
630                 if ((availableDurations.data.i64[i] == format) &&
631                         (availableDurations.data.i64[i+1] == width) &&
632                         (availableDurations.data.i64[i+2] == height)) {
633                     durations->push_back(availableDurations.data.i64[i+3]);
634                 }
635             }
636         }
637     }
638 }
getSupportedDynamicDepthDurations(const std::vector<int64_t> & depthDurations,const std::vector<int64_t> & blobDurations,std::vector<int64_t> * dynamicDepthDurations)639 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthDurations(
640         const std::vector<int64_t>& depthDurations, const std::vector<int64_t>& blobDurations,
641         std::vector<int64_t> *dynamicDepthDurations /*out*/) {
642     if ((dynamicDepthDurations == nullptr) || (depthDurations.size() != blobDurations.size())) {
643         return;
644     }
645 
646     // Unfortunately there is no direct way to calculate the dynamic depth stream duration.
647     // Processing time on camera service side can vary greatly depending on multiple
648     // variables which are not under our control. Make a guesstimate by taking the maximum
649     // corresponding duration value from depth and blob.
650     auto depthDuration = depthDurations.begin();
651     auto blobDuration = blobDurations.begin();
652     dynamicDepthDurations->reserve(depthDurations.size());
653     while ((depthDuration != depthDurations.end()) && (blobDuration != blobDurations.end())) {
654         dynamicDepthDurations->push_back(std::max(*depthDuration, *blobDuration));
655         depthDuration++; blobDuration++;
656     }
657 }
658 
getSupportedDynamicDepthSizes(const std::vector<std::tuple<size_t,size_t>> & blobSizes,const std::vector<std::tuple<size_t,size_t>> & depthSizes,std::vector<std::tuple<size_t,size_t>> * dynamicDepthSizes,std::vector<std::tuple<size_t,size_t>> * internalDepthSizes)659 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthSizes(
660         const std::vector<std::tuple<size_t, size_t>>& blobSizes,
661         const std::vector<std::tuple<size_t, size_t>>& depthSizes,
662         std::vector<std::tuple<size_t, size_t>> *dynamicDepthSizes /*out*/,
663         std::vector<std::tuple<size_t, size_t>> *internalDepthSizes /*out*/) {
664     if (dynamicDepthSizes == nullptr || internalDepthSizes == nullptr) {
665         return;
666     }
667 
668     // The dynamic depth spec. does not mention how close the AR ratio should be.
669     // Try using something appropriate.
670     float ARTolerance = kDepthARTolerance;
671 
672     for (const auto& blobSize : blobSizes) {
673         float jpegAR = static_cast<float> (std::get<0>(blobSize)) /
674                 static_cast<float>(std::get<1>(blobSize));
675         bool found = false;
676         for (const auto& depthSize : depthSizes) {
677             if (depthSize == blobSize) {
678                 internalDepthSizes->push_back(depthSize);
679                 found = true;
680                 break;
681             } else {
682                 float depthAR = static_cast<float> (std::get<0>(depthSize)) /
683                     static_cast<float>(std::get<1>(depthSize));
684                 if (std::fabs(jpegAR - depthAR) <= ARTolerance) {
685                     internalDepthSizes->push_back(depthSize);
686                     found = true;
687                     break;
688                 }
689             }
690         }
691 
692         if (found) {
693             dynamicDepthSizes->push_back(blobSize);
694         }
695     }
696 }
697 
addDynamicDepthTags(bool maxResolution)698 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addDynamicDepthTags(
699         bool maxResolution) {
700     const int32_t depthExclTag = ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE;
701 
702     const int32_t scalerSizesTag =
703               SessionConfigurationUtils::getAppropriateModeTag(
704                       ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
705     const int32_t scalerMinFrameDurationsTag =
706             ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS;
707     const int32_t scalerStallDurationsTag =
708                  SessionConfigurationUtils::getAppropriateModeTag(
709                         ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, maxResolution);
710 
711     const int32_t depthSizesTag =
712             SessionConfigurationUtils::getAppropriateModeTag(
713                     ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, maxResolution);
714     const int32_t depthStallDurationsTag =
715             SessionConfigurationUtils::getAppropriateModeTag(
716                     ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS, maxResolution);
717     const int32_t depthMinFrameDurationsTag =
718             SessionConfigurationUtils::getAppropriateModeTag(
719                     ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS, maxResolution);
720 
721     const int32_t dynamicDepthSizesTag =
722             SessionConfigurationUtils::getAppropriateModeTag(
723                     ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS, maxResolution);
724     const int32_t dynamicDepthStallDurationsTag =
725             SessionConfigurationUtils::getAppropriateModeTag(
726                     ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS, maxResolution);
727     const int32_t dynamicDepthMinFrameDurationsTag =
728             SessionConfigurationUtils::getAppropriateModeTag(
729                  ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS, maxResolution);
730 
731     auto& c = mCameraCharacteristics;
732     std::vector<std::tuple<size_t, size_t>> supportedBlobSizes, supportedDepthSizes,
733             supportedDynamicDepthSizes, internalDepthSizes;
734     auto chTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
735     if (chTags.count == 0) {
736         ALOGE("%s: Supported camera characteristics is empty!", __FUNCTION__);
737         return BAD_VALUE;
738     }
739 
740     bool isDepthExclusivePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count,
741             depthExclTag) != (chTags.data.i32 + chTags.count);
742     bool isDepthSizePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count,
743             depthSizesTag) != (chTags.data.i32 + chTags.count);
744     if (!(isDepthExclusivePresent && isDepthSizePresent)) {
745         // No depth support, nothing more to do.
746         return OK;
747     }
748 
749     auto depthExclusiveEntry = c.find(depthExclTag);
750     if (depthExclusiveEntry.count > 0) {
751         if (depthExclusiveEntry.data.u8[0] != ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE_FALSE) {
752             // Depth support is exclusive, nothing more to do.
753             return OK;
754         }
755     } else {
756         ALOGE("%s: Advertised depth exclusive tag but value is not present!", __FUNCTION__);
757         return BAD_VALUE;
758     }
759 
760     getSupportedSizes(c, scalerSizesTag, HAL_PIXEL_FORMAT_BLOB,
761             &supportedBlobSizes);
762     getSupportedSizes(c, depthSizesTag, HAL_PIXEL_FORMAT_Y16, &supportedDepthSizes);
763     if (supportedBlobSizes.empty() || supportedDepthSizes.empty()) {
764         // Nothing to do in this case.
765         return OK;
766     }
767 
768     getSupportedDynamicDepthSizes(supportedBlobSizes, supportedDepthSizes,
769             &supportedDynamicDepthSizes, &internalDepthSizes);
770     if (supportedDynamicDepthSizes.empty()) {
771         // Nothing more to do.
772         return OK;
773     }
774 
775     std::vector<int32_t> dynamicDepthEntries;
776     for (const auto& it : supportedDynamicDepthSizes) {
777         int32_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(it)),
778                 static_cast<int32_t> (std::get<1>(it)),
779                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT };
780         dynamicDepthEntries.insert(dynamicDepthEntries.end(), entry, entry + 4);
781     }
782 
783     std::vector<int64_t> depthMinDurations, depthStallDurations;
784     std::vector<int64_t> blobMinDurations, blobStallDurations;
785     std::vector<int64_t> dynamicDepthMinDurations, dynamicDepthStallDurations;
786 
787     getSupportedDurations(c, depthMinFrameDurationsTag, HAL_PIXEL_FORMAT_Y16, internalDepthSizes,
788                           &depthMinDurations);
789     getSupportedDurations(c, scalerMinFrameDurationsTag, HAL_PIXEL_FORMAT_BLOB,
790                           supportedDynamicDepthSizes, &blobMinDurations);
791     if (blobMinDurations.empty() || depthMinDurations.empty() ||
792             (depthMinDurations.size() != blobMinDurations.size())) {
793         ALOGE("%s: Unexpected number of available depth min durations! %zu vs. %zu",
794                 __FUNCTION__, depthMinDurations.size(), blobMinDurations.size());
795         return BAD_VALUE;
796     }
797 
798     getSupportedDurations(c, depthStallDurationsTag, HAL_PIXEL_FORMAT_Y16, internalDepthSizes,
799             &depthStallDurations);
800     getSupportedDurations(c, scalerStallDurationsTag, HAL_PIXEL_FORMAT_BLOB,
801             supportedDynamicDepthSizes, &blobStallDurations);
802     if (blobStallDurations.empty() || depthStallDurations.empty() ||
803             (depthStallDurations.size() != blobStallDurations.size())) {
804         ALOGE("%s: Unexpected number of available depth stall durations! %zu vs. %zu",
805                 __FUNCTION__, depthStallDurations.size(), blobStallDurations.size());
806         return BAD_VALUE;
807     }
808 
809     getSupportedDynamicDepthDurations(depthMinDurations, blobMinDurations,
810             &dynamicDepthMinDurations);
811     getSupportedDynamicDepthDurations(depthStallDurations, blobStallDurations,
812             &dynamicDepthStallDurations);
813     if (dynamicDepthMinDurations.empty() || dynamicDepthStallDurations.empty() ||
814             (dynamicDepthMinDurations.size() != dynamicDepthStallDurations.size())) {
815         ALOGE("%s: Unexpected number of dynamic depth stall/min durations! %zu vs. %zu",
816                 __FUNCTION__, dynamicDepthMinDurations.size(), dynamicDepthStallDurations.size());
817         return BAD_VALUE;
818     }
819 
820     std::vector<int64_t> dynamicDepthMinDurationEntries;
821     auto itDuration = dynamicDepthMinDurations.begin();
822     auto itSize = supportedDynamicDepthSizes.begin();
823     while (itDuration != dynamicDepthMinDurations.end()) {
824         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)),
825                 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration};
826         dynamicDepthMinDurationEntries.insert(dynamicDepthMinDurationEntries.end(), entry,
827                 entry + 4);
828         itDuration++; itSize++;
829     }
830 
831     std::vector<int64_t> dynamicDepthStallDurationEntries;
832     itDuration = dynamicDepthStallDurations.begin();
833     itSize = supportedDynamicDepthSizes.begin();
834     while (itDuration != dynamicDepthStallDurations.end()) {
835         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)),
836                 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration};
837         dynamicDepthStallDurationEntries.insert(dynamicDepthStallDurationEntries.end(), entry,
838                 entry + 4);
839         itDuration++; itSize++;
840     }
841 
842     std::vector<int32_t> supportedChTags;
843     supportedChTags.reserve(chTags.count + 3);
844     supportedChTags.insert(supportedChTags.end(), chTags.data.i32,
845             chTags.data.i32 + chTags.count);
846     supportedChTags.push_back(dynamicDepthSizesTag);
847     supportedChTags.push_back(dynamicDepthMinFrameDurationsTag);
848     supportedChTags.push_back(dynamicDepthStallDurationsTag);
849     c.update(dynamicDepthSizesTag, dynamicDepthEntries.data(), dynamicDepthEntries.size());
850     c.update(dynamicDepthMinFrameDurationsTag, dynamicDepthMinDurationEntries.data(),
851             dynamicDepthMinDurationEntries.size());
852     c.update(dynamicDepthStallDurationsTag, dynamicDepthStallDurationEntries.data(),
853              dynamicDepthStallDurationEntries.size());
854     c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(),
855             supportedChTags.size());
856 
857     return OK;
858 }
859 
fixupMonochromeTags()860 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupMonochromeTags() {
861     status_t res = OK;
862     auto& c = mCameraCharacteristics;
863 
864     // Override static metadata for MONOCHROME camera with older device version
865     if (mVersion.get_major() == 3 && mVersion.get_minor() < 5) {
866         camera_metadata_entry cap = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
867         for (size_t i = 0; i < cap.count; i++) {
868             if (cap.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
869                 // ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
870                 uint8_t cfa = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO;
871                 res = c.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, &cfa, 1);
872                 if (res != OK) {
873                     ALOGE("%s: Failed to update COLOR_FILTER_ARRANGEMENT: %s (%d)",
874                           __FUNCTION__, strerror(-res), res);
875                     return res;
876                 }
877 
878                 // ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
879                 const std::vector<uint32_t> sKeys = {
880                         ANDROID_SENSOR_REFERENCE_ILLUMINANT1,
881                         ANDROID_SENSOR_REFERENCE_ILLUMINANT2,
882                         ANDROID_SENSOR_CALIBRATION_TRANSFORM1,
883                         ANDROID_SENSOR_CALIBRATION_TRANSFORM2,
884                         ANDROID_SENSOR_COLOR_TRANSFORM1,
885                         ANDROID_SENSOR_COLOR_TRANSFORM2,
886                         ANDROID_SENSOR_FORWARD_MATRIX1,
887                         ANDROID_SENSOR_FORWARD_MATRIX2,
888                 };
889                 res = removeAvailableKeys(c, sKeys,
890                         ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
891                 if (res != OK) {
892                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s (%d)",
893                             __FUNCTION__, strerror(-res), res);
894                     return res;
895                 }
896 
897                 // ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
898                 const std::vector<uint32_t> reqKeys = {
899                         ANDROID_COLOR_CORRECTION_MODE,
900                         ANDROID_COLOR_CORRECTION_TRANSFORM,
901                         ANDROID_COLOR_CORRECTION_GAINS,
902                 };
903                 res = removeAvailableKeys(c, reqKeys, ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS);
904                 if (res != OK) {
905                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_REQUEST_KEYS: %s (%d)",
906                             __FUNCTION__, strerror(-res), res);
907                     return res;
908                 }
909 
910                 // ANDROID_REQUEST_AVAILABLE_RESULT_KEYS
911                 const std::vector<uint32_t> resKeys = {
912                         ANDROID_SENSOR_GREEN_SPLIT,
913                         ANDROID_SENSOR_NEUTRAL_COLOR_POINT,
914                         ANDROID_COLOR_CORRECTION_MODE,
915                         ANDROID_COLOR_CORRECTION_TRANSFORM,
916                         ANDROID_COLOR_CORRECTION_GAINS,
917                 };
918                 res = removeAvailableKeys(c, resKeys, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS);
919                 if (res != OK) {
920                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_RESULT_KEYS: %s (%d)",
921                             __FUNCTION__, strerror(-res), res);
922                     return res;
923                 }
924 
925                 // ANDROID_SENSOR_BLACK_LEVEL_PATTERN
926                 camera_metadata_entry blEntry = c.find(ANDROID_SENSOR_BLACK_LEVEL_PATTERN);
927                 for (size_t j = 1; j < blEntry.count; j++) {
928                     blEntry.data.i32[j] = blEntry.data.i32[0];
929                 }
930             }
931         }
932     }
933     return res;
934 }
935 
addRotateCropTags()936 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addRotateCropTags() {
937     status_t res = OK;
938     auto& c = mCameraCharacteristics;
939 
940     auto availableRotateCropEntry = c.find(ANDROID_SCALER_AVAILABLE_ROTATE_AND_CROP_MODES);
941     if (availableRotateCropEntry.count == 0) {
942         uint8_t defaultAvailableRotateCropEntry = ANDROID_SCALER_ROTATE_AND_CROP_NONE;
943         res = c.update(ANDROID_SCALER_AVAILABLE_ROTATE_AND_CROP_MODES,
944                 &defaultAvailableRotateCropEntry, 1);
945     }
946     return res;
947 }
948 
addPreCorrectionActiveArraySize()949 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addPreCorrectionActiveArraySize() {
950     status_t res = OK;
951     auto& c = mCameraCharacteristics;
952 
953     auto activeArraySize = c.find(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
954     auto preCorrectionActiveArraySize = c.find(
955             ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
956     if (activeArraySize.count == 4 && preCorrectionActiveArraySize.count == 0) {
957         std::vector<int32_t> preCorrectionArray(
958                 activeArraySize.data.i32, activeArraySize.data.i32+4);
959         res = c.update(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE,
960                 preCorrectionArray.data(), 4);
961         if (res != OK) {
962             ALOGE("%s: Failed to add ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE: %s(%d)",
963                     __FUNCTION__, strerror(-res), res);
964             return res;
965         }
966     } else {
967         return res;
968     }
969 
970     auto charTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
971     bool hasPreCorrectionActiveArraySize = std::find(charTags.data.i32,
972             charTags.data.i32 + charTags.count,
973             ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE) !=
974             (charTags.data.i32 + charTags.count);
975     if (!hasPreCorrectionActiveArraySize) {
976         std::vector<int32_t> supportedCharTags;
977         supportedCharTags.reserve(charTags.count + 1);
978         supportedCharTags.insert(supportedCharTags.end(), charTags.data.i32,
979                 charTags.data.i32 + charTags.count);
980         supportedCharTags.push_back(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
981 
982         res = c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedCharTags.data(),
983                 supportedCharTags.size());
984         if (res != OK) {
985             ALOGE("%s: Failed to update ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s(%d)",
986                     __FUNCTION__, strerror(-res), res);
987             return res;
988         }
989     }
990 
991     return res;
992 }
993 
removeAvailableKeys(CameraMetadata & c,const std::vector<uint32_t> & keys,uint32_t keyTag)994 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::removeAvailableKeys(
995         CameraMetadata& c, const std::vector<uint32_t>& keys, uint32_t keyTag) {
996     status_t res = OK;
997 
998     camera_metadata_entry keysEntry = c.find(keyTag);
999     if (keysEntry.count == 0) {
1000         ALOGE("%s: Failed to find tag %u: %s (%d)", __FUNCTION__, keyTag, strerror(-res), res);
1001         return res;
1002     }
1003     std::vector<int32_t> vKeys;
1004     vKeys.reserve(keysEntry.count);
1005     for (size_t i = 0; i < keysEntry.count; i++) {
1006         if (std::find(keys.begin(), keys.end(), keysEntry.data.i32[i]) == keys.end()) {
1007             vKeys.push_back(keysEntry.data.i32[i]);
1008         }
1009     }
1010     res = c.update(keyTag, vKeys.data(), vKeys.size());
1011     return res;
1012 }
1013 
fillHeicStreamCombinations(std::vector<int32_t> * outputs,std::vector<int64_t> * durations,std::vector<int64_t> * stallDurations,const camera_metadata_entry & halStreamConfigs,const camera_metadata_entry & halStreamDurations)1014 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fillHeicStreamCombinations(
1015         std::vector<int32_t>* outputs,
1016         std::vector<int64_t>* durations,
1017         std::vector<int64_t>* stallDurations,
1018         const camera_metadata_entry& halStreamConfigs,
1019         const camera_metadata_entry& halStreamDurations) {
1020     if (outputs == nullptr || durations == nullptr || stallDurations == nullptr) {
1021         return BAD_VALUE;
1022     }
1023 
1024     static bool supportInMemoryTempFile =
1025             camera3::HeicCompositeStream::isInMemoryTempFileSupported();
1026     if (!supportInMemoryTempFile) {
1027         ALOGI("%s: No HEIC support due to absence of in memory temp file support",
1028                 __FUNCTION__);
1029         return OK;
1030     }
1031 
1032     for (size_t i = 0; i < halStreamConfigs.count; i += 4) {
1033         int32_t format = halStreamConfigs.data.i32[i];
1034         // Only IMPLEMENTATION_DEFINED and YUV_888 can be used to generate HEIC
1035         // image.
1036         if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
1037                 format != HAL_PIXEL_FORMAT_YCBCR_420_888) {
1038             continue;
1039         }
1040 
1041         bool sizeAvail = false;
1042         for (size_t j = 0; j < outputs->size(); j+= 4) {
1043             if ((*outputs)[j+1] == halStreamConfigs.data.i32[i+1] &&
1044                     (*outputs)[j+2] == halStreamConfigs.data.i32[i+2]) {
1045                 sizeAvail = true;
1046                 break;
1047             }
1048         }
1049         if (sizeAvail) continue;
1050 
1051         int64_t stall = 0;
1052         bool useHeic = false;
1053         bool useGrid = false;
1054         if (camera3::HeicCompositeStream::isSizeSupportedByHeifEncoder(
1055                 halStreamConfigs.data.i32[i+1], halStreamConfigs.data.i32[i+2],
1056                 &useHeic, &useGrid, &stall)) {
1057             if (useGrid != (format == HAL_PIXEL_FORMAT_YCBCR_420_888)) {
1058                 continue;
1059             }
1060 
1061             // HEIC configuration
1062             int32_t config[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
1063                     halStreamConfigs.data.i32[i+2], 0 /*isInput*/};
1064             outputs->insert(outputs->end(), config, config + 4);
1065 
1066             // HEIC minFrameDuration
1067             for (size_t j = 0; j < halStreamDurations.count; j += 4) {
1068                 if (halStreamDurations.data.i64[j] == format &&
1069                         halStreamDurations.data.i64[j+1] == halStreamConfigs.data.i32[i+1] &&
1070                         halStreamDurations.data.i64[j+2] == halStreamConfigs.data.i32[i+2]) {
1071                     int64_t duration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
1072                             halStreamConfigs.data.i32[i+2], halStreamDurations.data.i64[j+3]};
1073                     durations->insert(durations->end(), duration, duration+4);
1074                     break;
1075                 }
1076             }
1077 
1078             // HEIC stallDuration
1079             int64_t stallDuration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
1080                     halStreamConfigs.data.i32[i+2], stall};
1081             stallDurations->insert(stallDurations->end(), stallDuration, stallDuration+4);
1082         }
1083     }
1084     return OK;
1085 }
1086 
deriveHeicTags(bool maxResolution)1087 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveHeicTags(bool maxResolution) {
1088     int32_t scalerStreamSizesTag =
1089             SessionConfigurationUtils::getAppropriateModeTag(
1090                     ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
1091     int32_t scalerMinFrameDurationsTag =
1092             SessionConfigurationUtils::getAppropriateModeTag(
1093                     ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, maxResolution);
1094 
1095     int32_t heicStreamSizesTag =
1096             SessionConfigurationUtils::getAppropriateModeTag(
1097                     ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, maxResolution);
1098     int32_t heicMinFrameDurationsTag =
1099             SessionConfigurationUtils::getAppropriateModeTag(
1100                     ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS, maxResolution);
1101     int32_t heicStallDurationsTag =
1102             SessionConfigurationUtils::getAppropriateModeTag(
1103                     ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS, maxResolution);
1104 
1105     auto& c = mCameraCharacteristics;
1106 
1107     camera_metadata_entry halHeicSupport = c.find(ANDROID_HEIC_INFO_SUPPORTED);
1108     if (halHeicSupport.count > 1) {
1109         ALOGE("%s: Invalid entry count %zu for ANDROID_HEIC_INFO_SUPPORTED",
1110                 __FUNCTION__, halHeicSupport.count);
1111         return BAD_VALUE;
1112     } else if (halHeicSupport.count == 0 ||
1113             halHeicSupport.data.u8[0] == ANDROID_HEIC_INFO_SUPPORTED_FALSE) {
1114         // Camera HAL doesn't support mandatory stream combinations for HEIC.
1115         return OK;
1116     }
1117 
1118     camera_metadata_entry maxJpegAppsSegments =
1119             c.find(ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT);
1120     if (maxJpegAppsSegments.count != 1 || maxJpegAppsSegments.data.u8[0] == 0 ||
1121             maxJpegAppsSegments.data.u8[0] > 16) {
1122         ALOGE("%s: ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT must be within [1, 16]",
1123                 __FUNCTION__);
1124         return BAD_VALUE;
1125     }
1126 
1127     // Populate HEIC output configurations and its related min frame duration
1128     // and stall duration.
1129     std::vector<int32_t> heicOutputs;
1130     std::vector<int64_t> heicDurations;
1131     std::vector<int64_t> heicStallDurations;
1132 
1133     camera_metadata_entry halStreamConfigs = c.find(scalerStreamSizesTag);
1134     camera_metadata_entry minFrameDurations = c.find(scalerMinFrameDurationsTag);
1135 
1136     status_t res = fillHeicStreamCombinations(&heicOutputs, &heicDurations, &heicStallDurations,
1137             halStreamConfigs, minFrameDurations);
1138     if (res != OK) {
1139         ALOGE("%s: Failed to fill HEIC stream combinations: %s (%d)", __FUNCTION__,
1140                 strerror(-res), res);
1141         return res;
1142     }
1143 
1144     c.update(heicStreamSizesTag, heicOutputs.data(), heicOutputs.size());
1145     c.update(heicMinFrameDurationsTag, heicDurations.data(), heicDurations.size());
1146     c.update(heicStallDurationsTag, heicStallDurations.data(), heicStallDurations.size());
1147 
1148     return OK;
1149 }
1150 
isLogicalCameraLocked(const std::string & id,std::vector<std::string> * physicalCameraIds)1151 bool CameraProviderManager::isLogicalCameraLocked(const std::string& id,
1152         std::vector<std::string>* physicalCameraIds) {
1153     auto deviceInfo = findDeviceInfoLocked(id);
1154     if (deviceInfo == nullptr) return false;
1155 
1156     if (deviceInfo->mIsLogicalCamera && physicalCameraIds != nullptr) {
1157         *physicalCameraIds = deviceInfo->mPhysicalIds;
1158     }
1159     return deviceInfo->mIsLogicalCamera;
1160 }
1161 
isLogicalCamera(const std::string & id,std::vector<std::string> * physicalCameraIds)1162 bool CameraProviderManager::isLogicalCamera(const std::string& id,
1163         std::vector<std::string>* physicalCameraIds) {
1164     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1165     return isLogicalCameraLocked(id, physicalCameraIds);
1166 }
1167 
getSystemCameraKind(const std::string & id,SystemCameraKind * kind) const1168 status_t CameraProviderManager::getSystemCameraKind(const std::string& id,
1169         SystemCameraKind *kind) const {
1170     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1171     return getSystemCameraKindLocked(id, kind);
1172 }
1173 
getSystemCameraKindLocked(const std::string & id,SystemCameraKind * kind) const1174 status_t CameraProviderManager::getSystemCameraKindLocked(const std::string& id,
1175         SystemCameraKind *kind) const {
1176     auto deviceInfo = findDeviceInfoLocked(id);
1177     if (deviceInfo != nullptr) {
1178         *kind = deviceInfo->mSystemCameraKind;
1179         return OK;
1180     }
1181     // If this is a hidden physical camera, we should return what kind of
1182     // camera the enclosing logical camera is.
1183     auto isHiddenAndParent = isHiddenPhysicalCameraInternal(id);
1184     if (isHiddenAndParent.first) {
1185         LOG_ALWAYS_FATAL_IF(id == isHiddenAndParent.second->mId,
1186                 "%s: hidden physical camera id %s and enclosing logical camera id %s are the same",
1187                 __FUNCTION__, id.c_str(), isHiddenAndParent.second->mId.c_str());
1188         return getSystemCameraKindLocked(isHiddenAndParent.second->mId, kind);
1189     }
1190     // Neither a hidden physical camera nor a logical camera
1191     return NAME_NOT_FOUND;
1192 }
1193 
isHiddenPhysicalCamera(const std::string & cameraId) const1194 bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) const {
1195     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1196     return isHiddenPhysicalCameraInternal(cameraId).first;
1197 }
1198 
filterSmallJpegSizes(const std::string & cameraId)1199 status_t CameraProviderManager::filterSmallJpegSizes(const std::string& cameraId) {
1200     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1201     for (auto& provider : mProviders) {
1202         for (auto& deviceInfo : provider->mDevices) {
1203             if (deviceInfo->mId == cameraId) {
1204                 return deviceInfo->filterSmallJpegSizes();
1205             }
1206         }
1207     }
1208     return NAME_NOT_FOUND;
1209 }
1210 
1211 std::pair<bool, CameraProviderManager::ProviderInfo::DeviceInfo *>
isHiddenPhysicalCameraInternal(const std::string & cameraId) const1212 CameraProviderManager::isHiddenPhysicalCameraInternal(const std::string& cameraId) const {
1213     auto falseRet = std::make_pair(false, nullptr);
1214     for (auto& provider : mProviders) {
1215         for (auto& deviceInfo : provider->mDevices) {
1216             if (deviceInfo->mId == cameraId) {
1217                 // cameraId is found in public camera IDs advertised by the
1218                 // provider.
1219                 return falseRet;
1220             }
1221         }
1222     }
1223 
1224     for (auto& provider : mProviders) {
1225         for (auto& deviceInfo : provider->mDevices) {
1226             std::vector<std::string> physicalIds;
1227             if (deviceInfo->mIsLogicalCamera) {
1228                 if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
1229                         cameraId) != deviceInfo->mPhysicalIds.end()) {
1230                     int deviceVersion = HARDWARE_DEVICE_API_VERSION(
1231                             deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor());
1232                     if (deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) {
1233                         ALOGE("%s: Wrong deviceVersion %x for hiddenPhysicalCameraId %s",
1234                                 __FUNCTION__, deviceVersion, cameraId.c_str());
1235                         return falseRet;
1236                     } else {
1237                         return std::make_pair(true, deviceInfo.get());
1238                     }
1239                 }
1240             }
1241         }
1242     }
1243 
1244     return falseRet;
1245 }
1246 
tryToInitializeProviderLocked(const std::string & providerName,const sp<ProviderInfo> & providerInfo)1247 status_t CameraProviderManager::tryToInitializeProviderLocked(
1248         const std::string& providerName, const sp<ProviderInfo>& providerInfo) {
1249     sp<provider::V2_4::ICameraProvider> interface;
1250     interface = mServiceProxy->tryGetService(providerName);
1251 
1252     if (interface == nullptr) {
1253         // The interface may not be started yet. In that case, this is not a
1254         // fatal error.
1255         ALOGW("%s: Camera provider HAL '%s' is not actually available", __FUNCTION__,
1256                 providerName.c_str());
1257         return BAD_VALUE;
1258     }
1259 
1260     return providerInfo->initialize(interface, mDeviceState);
1261 }
1262 
addProviderLocked(const std::string & newProvider,bool preexisting)1263 status_t CameraProviderManager::addProviderLocked(const std::string& newProvider,
1264         bool preexisting) {
1265     // Several camera provider instances can be temporarily present.
1266     // Defer initialization of a new instance until the older instance is properly removed.
1267     auto providerInstance = newProvider + "-" + std::to_string(mProviderInstanceId);
1268     bool providerPresent = false;
1269     for (const auto& providerInfo : mProviders) {
1270         if (providerInfo->mProviderName == newProvider) {
1271             ALOGW("%s: Camera provider HAL with name '%s' already registered",
1272                     __FUNCTION__, newProvider.c_str());
1273             if (preexisting) {
1274                 return ALREADY_EXISTS;
1275             } else{
1276                 ALOGW("%s: The new provider instance will get initialized immediately after the"
1277                         " currently present instance is removed!", __FUNCTION__);
1278                 providerPresent = true;
1279                 break;
1280             }
1281         }
1282     }
1283 
1284     sp<ProviderInfo> providerInfo = new ProviderInfo(newProvider, providerInstance, this);
1285     if (!providerPresent) {
1286         status_t res = tryToInitializeProviderLocked(newProvider, providerInfo);
1287         if (res != OK) {
1288             return res;
1289         }
1290     }
1291 
1292     mProviders.push_back(providerInfo);
1293     mProviderInstanceId++;
1294 
1295     return OK;
1296 }
1297 
removeProvider(const std::string & provider)1298 status_t CameraProviderManager::removeProvider(const std::string& provider) {
1299     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
1300     std::unique_lock<std::mutex> lock(mInterfaceMutex);
1301     std::vector<String8> removedDeviceIds;
1302     status_t res = NAME_NOT_FOUND;
1303     std::string removedProviderName;
1304     for (auto it = mProviders.begin(); it != mProviders.end(); it++) {
1305         if ((*it)->mProviderInstance == provider) {
1306             removedDeviceIds.reserve((*it)->mDevices.size());
1307             for (auto& deviceInfo : (*it)->mDevices) {
1308                 removedDeviceIds.push_back(String8(deviceInfo->mId.c_str()));
1309             }
1310             removedProviderName = (*it)->mProviderName;
1311             mProviders.erase(it);
1312             res = OK;
1313             break;
1314         }
1315     }
1316     if (res != OK) {
1317         ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__,
1318                 provider.c_str());
1319     } else {
1320         // Check if there are any newer camera instances from the same provider and try to
1321         // initialize.
1322         for (const auto& providerInfo : mProviders) {
1323             if (providerInfo->mProviderName == removedProviderName) {
1324                 return tryToInitializeProviderLocked(removedProviderName, providerInfo);
1325             }
1326         }
1327 
1328         // Inform camera service of loss of presence for all the devices from this provider,
1329         // without lock held for reentrancy
1330         sp<StatusListener> listener = getStatusListener();
1331         if (listener != nullptr) {
1332             lock.unlock();
1333             for (auto& id : removedDeviceIds) {
1334                 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT);
1335             }
1336             lock.lock();
1337         }
1338 
1339     }
1340     return res;
1341 }
1342 
getStatusListener() const1343 sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const {
1344     return mListener.promote();
1345 }
1346 
1347 /**** Methods for ProviderInfo ****/
1348 
1349 
ProviderInfo(const std::string & providerName,const std::string & providerInstance,CameraProviderManager * manager)1350 CameraProviderManager::ProviderInfo::ProviderInfo(
1351         const std::string &providerName,
1352         const std::string &providerInstance,
1353         CameraProviderManager *manager) :
1354         mProviderName(providerName),
1355         mProviderInstance(providerInstance),
1356         mProviderTagid(generateVendorTagId(providerName)),
1357         mUniqueDeviceCount(0),
1358         mManager(manager) {
1359     (void) mManager;
1360 }
1361 
initialize(sp<provider::V2_4::ICameraProvider> & interface,hardware::hidl_bitfield<provider::V2_5::DeviceState> currentDeviceState)1362 status_t CameraProviderManager::ProviderInfo::initialize(
1363         sp<provider::V2_4::ICameraProvider>& interface,
1364         hardware::hidl_bitfield<provider::V2_5::DeviceState> currentDeviceState) {
1365     status_t res = parseProviderName(mProviderName, &mType, &mId);
1366     if (res != OK) {
1367         ALOGE("%s: Invalid provider name, ignoring", __FUNCTION__);
1368         return BAD_VALUE;
1369     }
1370     ALOGI("Connecting to new camera provider: %s, isRemote? %d",
1371             mProviderName.c_str(), interface->isRemote());
1372 
1373     // Determine minor version
1374     mMinorVersion = 4;
1375     auto cast2_6 = provider::V2_6::ICameraProvider::castFrom(interface);
1376     sp<provider::V2_6::ICameraProvider> interface2_6 = nullptr;
1377     if (cast2_6.isOk()) {
1378         interface2_6 = cast2_6;
1379         if (interface2_6 != nullptr) {
1380             mMinorVersion = 6;
1381         }
1382     }
1383     // We need to check again since cast2_6.isOk() succeeds even if the provider
1384     // version isn't actually 2.6.
1385     if (interface2_6 == nullptr){
1386         auto cast2_5 =
1387                 provider::V2_5::ICameraProvider::castFrom(interface);
1388         sp<provider::V2_5::ICameraProvider> interface2_5 = nullptr;
1389         if (cast2_5.isOk()) {
1390             interface2_5 = cast2_5;
1391             if (interface != nullptr) {
1392                 mMinorVersion = 5;
1393             }
1394         }
1395     } else {
1396         auto cast2_7 = provider::V2_7::ICameraProvider::castFrom(interface);
1397         if (cast2_7.isOk()) {
1398             sp<provider::V2_7::ICameraProvider> interface2_7 = cast2_7;
1399             if (interface2_7 != nullptr) {
1400                 mMinorVersion = 7;
1401             }
1402         }
1403     }
1404 
1405     // cameraDeviceStatusChange callbacks may be called (and causing new devices added)
1406     // before setCallback returns
1407     hardware::Return<Status> status = interface->setCallback(this);
1408     if (!status.isOk()) {
1409         ALOGE("%s: Transaction error setting up callbacks with camera provider '%s': %s",
1410                 __FUNCTION__, mProviderName.c_str(), status.description().c_str());
1411         return DEAD_OBJECT;
1412     }
1413     if (status != Status::OK) {
1414         ALOGE("%s: Unable to register callbacks with camera provider '%s'",
1415                 __FUNCTION__, mProviderName.c_str());
1416         return mapToStatusT(status);
1417     }
1418 
1419     hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
1420     if (!linked.isOk()) {
1421         ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
1422                 __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
1423         return DEAD_OBJECT;
1424     } else if (!linked) {
1425         ALOGW("%s: Unable to link to provider '%s' death notifications",
1426                 __FUNCTION__, mProviderName.c_str());
1427     }
1428 
1429     if (!kEnableLazyHal) {
1430         // Save HAL reference indefinitely
1431         mSavedInterface = interface;
1432     } else {
1433         mActiveInterface = interface;
1434     }
1435 
1436     ALOGV("%s: Setting device state for %s: 0x%" PRIx64,
1437             __FUNCTION__, mProviderName.c_str(), mDeviceState);
1438     notifyDeviceStateChange(currentDeviceState);
1439 
1440     res = setUpVendorTags();
1441     if (res != OK) {
1442         ALOGE("%s: Unable to set up vendor tags from provider '%s'",
1443                 __FUNCTION__, mProviderName.c_str());
1444         return res;
1445     }
1446 
1447     // Get initial list of camera devices, if any
1448     std::vector<std::string> devices;
1449     hardware::Return<void> ret = interface->getCameraIdList([&status, this, &devices](
1450             Status idStatus,
1451             const hardware::hidl_vec<hardware::hidl_string>& cameraDeviceNames) {
1452         status = idStatus;
1453         if (status == Status::OK) {
1454             for (auto& name : cameraDeviceNames) {
1455                 uint16_t major, minor;
1456                 std::string type, id;
1457                 status_t res = parseDeviceName(name, &major, &minor, &type, &id);
1458                 if (res != OK) {
1459                     ALOGE("%s: Error parsing deviceName: %s: %d", __FUNCTION__, name.c_str(), res);
1460                     status = Status::INTERNAL_ERROR;
1461                 } else {
1462                     devices.push_back(name);
1463                     mProviderPublicCameraIds.push_back(id);
1464                 }
1465             }
1466         } });
1467     if (!ret.isOk()) {
1468         ALOGE("%s: Transaction error in getting camera ID list from provider '%s': %s",
1469                 __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
1470         return DEAD_OBJECT;
1471     }
1472     if (status != Status::OK) {
1473         ALOGE("%s: Unable to query for camera devices from provider '%s'",
1474                 __FUNCTION__, mProviderName.c_str());
1475         return mapToStatusT(status);
1476     }
1477 
1478     // Get list of concurrent streaming camera device combinations
1479     if (mMinorVersion >= 6) {
1480         res = getConcurrentCameraIdsInternalLocked(interface2_6);
1481         if (res != OK) {
1482             return res;
1483         }
1484     }
1485 
1486     ret = interface->isSetTorchModeSupported(
1487         [this](auto status, bool supported) {
1488             if (status == Status::OK) {
1489                 mSetTorchModeSupported = supported;
1490             }
1491         });
1492     if (!ret.isOk()) {
1493         ALOGE("%s: Transaction error checking torch mode support '%s': %s",
1494                 __FUNCTION__, mProviderName.c_str(), ret.description().c_str());
1495         return DEAD_OBJECT;
1496     }
1497 
1498     mIsRemote = interface->isRemote();
1499 
1500     sp<StatusListener> listener = mManager->getStatusListener();
1501     for (auto& device : devices) {
1502         std::string id;
1503         status_t res = addDevice(device, common::V1_0::CameraDeviceStatus::PRESENT, &id);
1504         if (res != OK) {
1505             ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
1506                     __FUNCTION__, device.c_str(), strerror(-res), res);
1507             continue;
1508         }
1509     }
1510 
1511     ALOGI("Camera provider %s ready with %zu camera devices",
1512             mProviderName.c_str(), mDevices.size());
1513 
1514     // Process cached status callbacks
1515     std::unique_ptr<std::vector<CameraStatusInfoT>> cachedStatus =
1516             std::make_unique<std::vector<CameraStatusInfoT>>();
1517     {
1518         std::lock_guard<std::mutex> lock(mInitLock);
1519 
1520         for (auto& statusInfo : mCachedStatus) {
1521             std::string id, physicalId;
1522             status_t res = OK;
1523             if (statusInfo.isPhysicalCameraStatus) {
1524                 res = physicalCameraDeviceStatusChangeLocked(&id, &physicalId,
1525                     statusInfo.cameraId, statusInfo.physicalCameraId, statusInfo.status);
1526             } else {
1527                 res = cameraDeviceStatusChangeLocked(&id, statusInfo.cameraId, statusInfo.status);
1528             }
1529             if (res == OK) {
1530                 cachedStatus->emplace_back(statusInfo.isPhysicalCameraStatus,
1531                         id.c_str(), physicalId.c_str(), statusInfo.status);
1532             }
1533         }
1534         mCachedStatus.clear();
1535 
1536         mInitialized = true;
1537     }
1538 
1539     // The cached status change callbacks cannot be fired directly from this
1540     // function, due to same-thread deadlock trying to acquire mInterfaceMutex
1541     // twice.
1542     if (listener != nullptr) {
1543         mInitialStatusCallbackFuture = std::async(std::launch::async,
1544                 &CameraProviderManager::ProviderInfo::notifyInitialStatusChange, this,
1545                 listener, std::move(cachedStatus));
1546     }
1547 
1548     return OK;
1549 }
1550 
1551 const sp<provider::V2_4::ICameraProvider>
startProviderInterface()1552 CameraProviderManager::ProviderInfo::startProviderInterface() {
1553     ATRACE_CALL();
1554     ALOGV("Request to start camera provider: %s", mProviderName.c_str());
1555     if (mSavedInterface != nullptr) {
1556         return mSavedInterface;
1557     }
1558     if (!kEnableLazyHal) {
1559         ALOGE("Bad provider state! Should not be here on a non-lazy HAL!");
1560         return nullptr;
1561     }
1562 
1563     auto interface = mActiveInterface.promote();
1564     if (interface == nullptr) {
1565         ALOGI("Camera HAL provider needs restart, calling getService(%s)", mProviderName.c_str());
1566         interface = mManager->mServiceProxy->getService(mProviderName);
1567         interface->setCallback(this);
1568         hardware::Return<bool> linked = interface->linkToDeath(this, /*cookie*/ mId);
1569         if (!linked.isOk()) {
1570             ALOGE("%s: Transaction error in linking to camera provider '%s' death: %s",
1571                     __FUNCTION__, mProviderName.c_str(), linked.description().c_str());
1572             mManager->removeProvider(mProviderName);
1573             return nullptr;
1574         } else if (!linked) {
1575             ALOGW("%s: Unable to link to provider '%s' death notifications",
1576                     __FUNCTION__, mProviderName.c_str());
1577         }
1578         // Send current device state
1579         if (mMinorVersion >= 5) {
1580             auto castResult = provider::V2_5::ICameraProvider::castFrom(interface);
1581             if (castResult.isOk()) {
1582                 sp<provider::V2_5::ICameraProvider> interface_2_5 = castResult;
1583                 if (interface_2_5 != nullptr) {
1584                     ALOGV("%s: Initial device state for %s: 0x %" PRIx64,
1585                             __FUNCTION__, mProviderName.c_str(), mDeviceState);
1586                     interface_2_5->notifyDeviceStateChange(mDeviceState);
1587                 }
1588             }
1589         }
1590 
1591         mActiveInterface = interface;
1592     } else {
1593         ALOGV("Camera provider (%s) already in use. Re-using instance.", mProviderName.c_str());
1594     }
1595     return interface;
1596 }
1597 
getType() const1598 const std::string& CameraProviderManager::ProviderInfo::getType() const {
1599     return mType;
1600 }
1601 
addDevice(const std::string & name,CameraDeviceStatus initialStatus,std::string * parsedId)1602 status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
1603         CameraDeviceStatus initialStatus, /*out*/ std::string* parsedId) {
1604 
1605     ALOGI("Enumerating new camera device: %s", name.c_str());
1606 
1607     uint16_t major, minor;
1608     std::string type, id;
1609 
1610     status_t res = parseDeviceName(name, &major, &minor, &type, &id);
1611     if (res != OK) {
1612         return res;
1613     }
1614     if (type != mType) {
1615         ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__,
1616                 type.c_str(), mType.c_str());
1617         return BAD_VALUE;
1618     }
1619     if (mManager->isValidDeviceLocked(id, major)) {
1620         ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__,
1621                 name.c_str(), id.c_str(), major);
1622         return BAD_VALUE;
1623     }
1624 
1625     std::unique_ptr<DeviceInfo> deviceInfo;
1626     switch (major) {
1627         case 1:
1628             ALOGE("%s: Device %s: Unsupported HIDL device HAL major version %d:", __FUNCTION__,
1629                     name.c_str(), major);
1630             return BAD_VALUE;
1631         case 3:
1632             deviceInfo = initializeDeviceInfo<DeviceInfo3>(name, mProviderTagid,
1633                     id, minor);
1634             break;
1635         default:
1636             ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
1637                     name.c_str(), major);
1638             return BAD_VALUE;
1639     }
1640     if (deviceInfo == nullptr) return BAD_VALUE;
1641     deviceInfo->notifyDeviceStateChange(mDeviceState);
1642     deviceInfo->mStatus = initialStatus;
1643     bool isAPI1Compatible = deviceInfo->isAPI1Compatible();
1644 
1645     mDevices.push_back(std::move(deviceInfo));
1646 
1647     mUniqueCameraIds.insert(id);
1648     if (isAPI1Compatible) {
1649         // addDevice can be called more than once for the same camera id if HAL
1650         // supports openLegacy.
1651         if (std::find(mUniqueAPI1CompatibleCameraIds.begin(), mUniqueAPI1CompatibleCameraIds.end(),
1652                 id) == mUniqueAPI1CompatibleCameraIds.end()) {
1653             mUniqueAPI1CompatibleCameraIds.push_back(id);
1654         }
1655     }
1656 
1657     if (parsedId != nullptr) {
1658         *parsedId = id;
1659     }
1660     return OK;
1661 }
1662 
removeDevice(std::string id)1663 void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
1664     for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
1665         if ((*it)->mId == id) {
1666             mUniqueCameraIds.erase(id);
1667             if ((*it)->isAPI1Compatible()) {
1668                 mUniqueAPI1CompatibleCameraIds.erase(std::remove(
1669                         mUniqueAPI1CompatibleCameraIds.begin(),
1670                         mUniqueAPI1CompatibleCameraIds.end(), id));
1671             }
1672             mDevices.erase(it);
1673             break;
1674         }
1675     }
1676 }
1677 
dump(int fd,const Vector<String16> &) const1678 status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
1679     dprintf(fd, "== Camera Provider HAL %s (v2.%d, %s) static info: %zu devices: ==\n",
1680             mProviderInstance.c_str(),
1681             mMinorVersion,
1682             mIsRemote ? "remote" : "passthrough",
1683             mDevices.size());
1684 
1685     for (auto& device : mDevices) {
1686         dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(),
1687                 device->mVersion.get_major(), device->mVersion.get_minor());
1688         dprintf(fd, "  Resource cost: %d\n", device->mResourceCost.resourceCost);
1689         if (device->mResourceCost.conflictingDevices.size() == 0) {
1690             dprintf(fd, "  Conflicting devices: None\n");
1691         } else {
1692             dprintf(fd, "  Conflicting devices:\n");
1693             for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) {
1694                 dprintf(fd, "    %s\n",
1695                         device->mResourceCost.conflictingDevices[i].c_str());
1696             }
1697         }
1698         dprintf(fd, "  API1 info:\n");
1699         dprintf(fd, "    Has a flash unit: %s\n",
1700                 device->hasFlashUnit() ? "true" : "false");
1701         hardware::CameraInfo info;
1702         status_t res = device->getCameraInfo(&info);
1703         if (res != OK) {
1704             dprintf(fd, "   <Error reading camera info: %s (%d)>\n",
1705                     strerror(-res), res);
1706         } else {
1707             dprintf(fd, "    Facing: %s\n",
1708                     info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front");
1709             dprintf(fd, "    Orientation: %d\n", info.orientation);
1710         }
1711         CameraMetadata info2;
1712         res = device->getCameraCharacteristics(true /*overrideForPerfClass*/, &info2);
1713         if (res == INVALID_OPERATION) {
1714             dprintf(fd, "  API2 not directly supported\n");
1715         } else if (res != OK) {
1716             dprintf(fd, "  <Error reading camera characteristics: %s (%d)>\n",
1717                     strerror(-res), res);
1718         } else {
1719             dprintf(fd, "  API2 camera characteristics:\n");
1720             info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
1721         }
1722 
1723         // Dump characteristics of non-standalone physical camera
1724         if (device->mIsLogicalCamera) {
1725             for (auto& id : device->mPhysicalIds) {
1726                 // Skip if physical id is an independent camera
1727                 if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id)
1728                         != mProviderPublicCameraIds.end()) {
1729                     continue;
1730                 }
1731 
1732                 CameraMetadata physicalInfo;
1733                 status_t status = device->getPhysicalCameraCharacteristics(id, &physicalInfo);
1734                 if (status == OK) {
1735                     dprintf(fd, "  Physical camera %s characteristics:\n", id.c_str());
1736                     physicalInfo.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
1737                 }
1738             }
1739         }
1740 
1741         dprintf(fd, "== Camera HAL device %s (v%d.%d) dumpState: ==\n", device->mName.c_str(),
1742                 device->mVersion.get_major(), device->mVersion.get_minor());
1743         res = device->dumpState(fd);
1744         if (res != OK) {
1745             dprintf(fd, "   <Error dumping device %s state: %s (%d)>\n",
1746                     device->mName.c_str(), strerror(-res), res);
1747         }
1748     }
1749     return OK;
1750 }
1751 
getConcurrentCameraIdsInternalLocked(sp<provider::V2_6::ICameraProvider> & interface2_6)1752 status_t CameraProviderManager::ProviderInfo::getConcurrentCameraIdsInternalLocked(
1753         sp<provider::V2_6::ICameraProvider> &interface2_6) {
1754     if (interface2_6 == nullptr) {
1755         ALOGE("%s: null interface provided", __FUNCTION__);
1756         return BAD_VALUE;
1757     }
1758     Status status = Status::OK;
1759     hardware::Return<void> ret =
1760             interface2_6->getConcurrentStreamingCameraIds([&status, this](
1761             Status concurrentIdStatus, // TODO: Move all instances of hidl_string to 'using'
1762             const hardware::hidl_vec<hardware::hidl_vec<hardware::hidl_string>>&
1763                         cameraDeviceIdCombinations) {
1764             status = concurrentIdStatus;
1765             if (status == Status::OK) {
1766                 mConcurrentCameraIdCombinations.clear();
1767                 for (auto& combination : cameraDeviceIdCombinations) {
1768                     std::unordered_set<std::string> deviceIds;
1769                     for (auto &cameraDeviceId : combination) {
1770                         deviceIds.insert(cameraDeviceId.c_str());
1771                     }
1772                     mConcurrentCameraIdCombinations.push_back(std::move(deviceIds));
1773                 }
1774             } });
1775     if (!ret.isOk()) {
1776         ALOGE("%s: Transaction error in getting concurrent camera ID list from provider '%s'",
1777                 __FUNCTION__, mProviderName.c_str());
1778             return DEAD_OBJECT;
1779     }
1780     if (status != Status::OK) {
1781         ALOGE("%s: Unable to query for camera devices from provider '%s'",
1782                     __FUNCTION__, mProviderName.c_str());
1783         return mapToStatusT(status);
1784     }
1785     return OK;
1786 }
1787 
reCacheConcurrentStreamingCameraIdsLocked()1788 status_t CameraProviderManager::ProviderInfo::reCacheConcurrentStreamingCameraIdsLocked() {
1789     if (mMinorVersion < 6) {
1790       // Unsupported operation, nothing to do here
1791       return OK;
1792     }
1793     // Check if the provider is currently active - not going to start it up for this notification
1794     auto interface = mSavedInterface != nullptr ? mSavedInterface : mActiveInterface.promote();
1795     if (interface == nullptr) {
1796         ALOGE("%s: camera provider interface for %s is not valid", __FUNCTION__,
1797                 mProviderName.c_str());
1798         return INVALID_OPERATION;
1799     }
1800     auto castResult = provider::V2_6::ICameraProvider::castFrom(interface);
1801 
1802     if (castResult.isOk()) {
1803         sp<provider::V2_6::ICameraProvider> interface2_6 = castResult;
1804         if (interface2_6 != nullptr) {
1805             return getConcurrentCameraIdsInternalLocked(interface2_6);
1806         } else {
1807             // This should not happen since mMinorVersion >= 6
1808             ALOGE("%s: mMinorVersion was >= 6, but interface2_6 was nullptr", __FUNCTION__);
1809             return UNKNOWN_ERROR;
1810         }
1811     }
1812     return OK;
1813 }
1814 
1815 std::vector<std::unordered_set<std::string>>
getConcurrentCameraIdCombinations()1816 CameraProviderManager::ProviderInfo::getConcurrentCameraIdCombinations() {
1817     std::lock_guard<std::mutex> lock(mLock);
1818     return mConcurrentCameraIdCombinations;
1819 }
1820 
cameraDeviceStatusChange(const hardware::hidl_string & cameraDeviceName,CameraDeviceStatus newStatus)1821 hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusChange(
1822         const hardware::hidl_string& cameraDeviceName,
1823         CameraDeviceStatus newStatus) {
1824     sp<StatusListener> listener;
1825     std::string id;
1826     std::lock_guard<std::mutex> lock(mInitLock);
1827 
1828     if (!mInitialized) {
1829         mCachedStatus.emplace_back(false /*isPhysicalCameraStatus*/,
1830                 cameraDeviceName.c_str(), std::string().c_str(), newStatus);
1831         return hardware::Void();
1832     }
1833 
1834     {
1835         std::lock_guard<std::mutex> lock(mLock);
1836         if (OK != cameraDeviceStatusChangeLocked(&id, cameraDeviceName, newStatus)) {
1837             return hardware::Void();
1838         }
1839         listener = mManager->getStatusListener();
1840     }
1841 
1842     // Call without lock held to allow reentrancy into provider manager
1843     if (listener != nullptr) {
1844         listener->onDeviceStatusChanged(String8(id.c_str()), newStatus);
1845     }
1846 
1847     return hardware::Void();
1848 }
1849 
cameraDeviceStatusChangeLocked(std::string * id,const hardware::hidl_string & cameraDeviceName,CameraDeviceStatus newStatus)1850 status_t CameraProviderManager::ProviderInfo::cameraDeviceStatusChangeLocked(
1851         std::string* id, const hardware::hidl_string& cameraDeviceName,
1852         CameraDeviceStatus newStatus) {
1853     bool known = false;
1854     std::string cameraId;
1855     for (auto& deviceInfo : mDevices) {
1856         if (deviceInfo->mName == cameraDeviceName) {
1857             ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(),
1858                     deviceStatusToString(newStatus), deviceStatusToString(deviceInfo->mStatus));
1859             deviceInfo->mStatus = newStatus;
1860             // TODO: Handle device removal (NOT_PRESENT)
1861             cameraId = deviceInfo->mId;
1862             known = true;
1863             break;
1864         }
1865     }
1866     // Previously unseen device; status must not be NOT_PRESENT
1867     if (!known) {
1868         if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
1869             ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.",
1870                 mProviderName.c_str(), cameraDeviceName.c_str());
1871             return BAD_VALUE;
1872         }
1873         addDevice(cameraDeviceName, newStatus, &cameraId);
1874     } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
1875         removeDevice(cameraId);
1876     }
1877     if (reCacheConcurrentStreamingCameraIdsLocked() != OK) {
1878         ALOGE("%s: CameraProvider %s could not re-cache concurrent streaming camera id list ",
1879                   __FUNCTION__, mProviderName.c_str());
1880     }
1881     *id = cameraId;
1882     return OK;
1883 }
1884 
physicalCameraDeviceStatusChange(const hardware::hidl_string & cameraDeviceName,const hardware::hidl_string & physicalCameraDeviceName,CameraDeviceStatus newStatus)1885 hardware::Return<void> CameraProviderManager::ProviderInfo::physicalCameraDeviceStatusChange(
1886         const hardware::hidl_string& cameraDeviceName,
1887         const hardware::hidl_string& physicalCameraDeviceName,
1888         CameraDeviceStatus newStatus) {
1889     sp<StatusListener> listener;
1890     std::string id;
1891     std::string physicalId;
1892     std::lock_guard<std::mutex> lock(mInitLock);
1893 
1894     if (!mInitialized) {
1895         mCachedStatus.emplace_back(true /*isPhysicalCameraStatus*/, cameraDeviceName,
1896                 physicalCameraDeviceName, newStatus);
1897         return hardware::Void();
1898     }
1899 
1900     {
1901         std::lock_guard<std::mutex> lock(mLock);
1902 
1903         if (OK != physicalCameraDeviceStatusChangeLocked(&id, &physicalId, cameraDeviceName,
1904                 physicalCameraDeviceName, newStatus)) {
1905             return hardware::Void();
1906         }
1907 
1908         listener = mManager->getStatusListener();
1909     }
1910     // Call without lock held to allow reentrancy into provider manager
1911     if (listener != nullptr) {
1912         listener->onDeviceStatusChanged(String8(id.c_str()),
1913                 String8(physicalId.c_str()), newStatus);
1914     }
1915     return hardware::Void();
1916 }
1917 
physicalCameraDeviceStatusChangeLocked(std::string * id,std::string * physicalId,const hardware::hidl_string & cameraDeviceName,const hardware::hidl_string & physicalCameraDeviceName,CameraDeviceStatus newStatus)1918 status_t CameraProviderManager::ProviderInfo::physicalCameraDeviceStatusChangeLocked(
1919             std::string* id, std::string* physicalId,
1920             const hardware::hidl_string& cameraDeviceName,
1921             const hardware::hidl_string& physicalCameraDeviceName,
1922             CameraDeviceStatus newStatus) {
1923     bool known = false;
1924     std::string cameraId;
1925     for (auto& deviceInfo : mDevices) {
1926         if (deviceInfo->mName == cameraDeviceName) {
1927             cameraId = deviceInfo->mId;
1928             if (!deviceInfo->mIsLogicalCamera) {
1929                 ALOGE("%s: Invalid combination of camera id %s, physical id %s",
1930                         __FUNCTION__, cameraId.c_str(), physicalCameraDeviceName.c_str());
1931                 return BAD_VALUE;
1932             }
1933             if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
1934                     physicalCameraDeviceName) == deviceInfo->mPhysicalIds.end()) {
1935                 ALOGE("%s: Invalid combination of camera id %s, physical id %s",
1936                         __FUNCTION__, cameraId.c_str(), physicalCameraDeviceName.c_str());
1937                 return BAD_VALUE;
1938             }
1939             ALOGI("Camera device %s physical device %s status is now %s",
1940                     cameraDeviceName.c_str(), physicalCameraDeviceName.c_str(),
1941                     deviceStatusToString(newStatus));
1942             known = true;
1943             break;
1944         }
1945     }
1946     // Previously unseen device; status must not be NOT_PRESENT
1947     if (!known) {
1948         ALOGW("Camera provider %s says an unknown camera device %s-%s is not present. Curious.",
1949                 mProviderName.c_str(), cameraDeviceName.c_str(),
1950                 physicalCameraDeviceName.c_str());
1951         return BAD_VALUE;
1952     }
1953 
1954     *id = cameraId;
1955     *physicalId = physicalCameraDeviceName.c_str();
1956     return OK;
1957 }
1958 
torchModeStatusChange(const hardware::hidl_string & cameraDeviceName,TorchModeStatus newStatus)1959 hardware::Return<void> CameraProviderManager::ProviderInfo::torchModeStatusChange(
1960         const hardware::hidl_string& cameraDeviceName,
1961         TorchModeStatus newStatus) {
1962     sp<StatusListener> listener;
1963     std::string id;
1964     {
1965         std::lock_guard<std::mutex> lock(mManager->mStatusListenerMutex);
1966         bool known = false;
1967         for (auto& deviceInfo : mDevices) {
1968             if (deviceInfo->mName == cameraDeviceName) {
1969                 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(),
1970                         torchStatusToString(newStatus));
1971                 id = deviceInfo->mId;
1972                 known = true;
1973                 if (TorchModeStatus::AVAILABLE_ON != newStatus) {
1974                     mManager->removeRef(DeviceMode::TORCH, id);
1975                 }
1976                 break;
1977             }
1978         }
1979         if (!known) {
1980             ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.",
1981                     mProviderName.c_str(), cameraDeviceName.c_str(), newStatus);
1982             return hardware::Void();
1983         }
1984         listener = mManager->getStatusListener();
1985     }
1986     // Call without lock held to allow reentrancy into provider manager
1987     if (listener != nullptr) {
1988         listener->onTorchStatusChanged(String8(id.c_str()), newStatus);
1989     }
1990     return hardware::Void();
1991 }
1992 
serviceDied(uint64_t cookie,const wp<hidl::base::V1_0::IBase> & who)1993 void CameraProviderManager::ProviderInfo::serviceDied(uint64_t cookie,
1994         const wp<hidl::base::V1_0::IBase>& who) {
1995     (void) who;
1996     ALOGI("Camera provider '%s' has died; removing it", mProviderInstance.c_str());
1997     if (cookie != mId) {
1998         ALOGW("%s: Unexpected serviceDied cookie %" PRIu64 ", expected %" PRIu32,
1999                 __FUNCTION__, cookie, mId);
2000     }
2001     mManager->removeProvider(mProviderInstance);
2002 }
2003 
setUpVendorTags()2004 status_t CameraProviderManager::ProviderInfo::setUpVendorTags() {
2005     if (mVendorTagDescriptor != nullptr)
2006         return OK;
2007 
2008     hardware::hidl_vec<VendorTagSection> vts;
2009     Status status;
2010     hardware::Return<void> ret;
2011     const sp<provider::V2_4::ICameraProvider> interface = startProviderInterface();
2012     if (interface == nullptr) {
2013         return DEAD_OBJECT;
2014     }
2015     ret = interface->getVendorTags(
2016         [&](auto s, const auto& vendorTagSecs) {
2017             status = s;
2018             if (s == Status::OK) {
2019                 vts = vendorTagSecs;
2020             }
2021     });
2022     if (!ret.isOk()) {
2023         ALOGE("%s: Transaction error getting vendor tags from provider '%s': %s",
2024                 __FUNCTION__, mProviderName.c_str(), ret.description().c_str());
2025         return DEAD_OBJECT;
2026     }
2027     if (status != Status::OK) {
2028         return mapToStatusT(status);
2029     }
2030 
2031     // Read all vendor tag definitions into a descriptor
2032     status_t res;
2033     if ((res = HidlVendorTagDescriptor::createDescriptorFromHidl(vts, /*out*/mVendorTagDescriptor))
2034             != OK) {
2035         ALOGE("%s: Could not generate descriptor from vendor tag operations,"
2036                 "received error %s (%d). Camera clients will not be able to use"
2037                 "vendor tags", __FUNCTION__, strerror(res), res);
2038         return res;
2039     }
2040 
2041     return OK;
2042 }
2043 
notifyDeviceInfoStateChangeLocked(hardware::hidl_bitfield<provider::V2_5::DeviceState> newDeviceState)2044 void CameraProviderManager::ProviderInfo::notifyDeviceInfoStateChangeLocked(
2045         hardware::hidl_bitfield<provider::V2_5::DeviceState> newDeviceState) {
2046     std::lock_guard<std::mutex> lock(mLock);
2047     for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
2048         (*it)->notifyDeviceStateChange(newDeviceState);
2049     }
2050 }
2051 
notifyDeviceStateChange(hardware::hidl_bitfield<provider::V2_5::DeviceState> newDeviceState)2052 status_t CameraProviderManager::ProviderInfo::notifyDeviceStateChange(
2053         hardware::hidl_bitfield<provider::V2_5::DeviceState> newDeviceState) {
2054     mDeviceState = newDeviceState;
2055     if (mMinorVersion >= 5) {
2056         // Check if the provider is currently active - not going to start it up for this notification
2057         auto interface = mSavedInterface != nullptr ? mSavedInterface : mActiveInterface.promote();
2058         if (interface != nullptr) {
2059             // Send current device state
2060             auto castResult = provider::V2_5::ICameraProvider::castFrom(interface);
2061             if (castResult.isOk()) {
2062                 sp<provider::V2_5::ICameraProvider> interface_2_5 = castResult;
2063                 if (interface_2_5 != nullptr) {
2064                     interface_2_5->notifyDeviceStateChange(mDeviceState);
2065                 }
2066             }
2067         }
2068     }
2069     return OK;
2070 }
2071 
isConcurrentSessionConfigurationSupported(const hardware::hidl_vec<CameraIdAndStreamCombination> & halCameraIdsAndStreamCombinations,bool * isSupported)2072 status_t CameraProviderManager::ProviderInfo::isConcurrentSessionConfigurationSupported(
2073         const hardware::hidl_vec<CameraIdAndStreamCombination> &halCameraIdsAndStreamCombinations,
2074         bool *isSupported) {
2075     status_t res = OK;
2076     if (mMinorVersion >= 6) {
2077         // Check if the provider is currently active - not going to start it up for this notification
2078         auto interface = mSavedInterface != nullptr ? mSavedInterface : mActiveInterface.promote();
2079         if (interface == nullptr) {
2080             // TODO: This might be some other problem
2081             return INVALID_OPERATION;
2082         }
2083         auto castResult2_6 = provider::V2_6::ICameraProvider::castFrom(interface);
2084         auto castResult2_7 = provider::V2_7::ICameraProvider::castFrom(interface);
2085         Status callStatus;
2086         auto cb =
2087                 [&isSupported, &callStatus](Status s, bool supported) {
2088                       callStatus = s;
2089                       *isSupported = supported; };
2090 
2091         ::android::hardware::Return<void> ret;
2092         sp<provider::V2_7::ICameraProvider> interface_2_7;
2093         sp<provider::V2_6::ICameraProvider> interface_2_6;
2094         if (mMinorVersion >= 7 && castResult2_7.isOk()) {
2095             interface_2_7 = castResult2_7;
2096             if (interface_2_7 != nullptr) {
2097                 ret = interface_2_7->isConcurrentStreamCombinationSupported_2_7(
2098                         halCameraIdsAndStreamCombinations, cb);
2099             }
2100         } else if (mMinorVersion == 6 && castResult2_6.isOk()) {
2101             interface_2_6 = castResult2_6;
2102             if (interface_2_6 != nullptr) {
2103                 hardware::hidl_vec<provider::V2_6::CameraIdAndStreamCombination>
2104                         halCameraIdsAndStreamCombinations_2_6;
2105                 size_t numStreams = halCameraIdsAndStreamCombinations.size();
2106                 halCameraIdsAndStreamCombinations_2_6.resize(numStreams);
2107                 for (size_t i = 0; i < numStreams; i++) {
2108                     using namespace camera3;
2109                     auto const& combination = halCameraIdsAndStreamCombinations[i];
2110                     halCameraIdsAndStreamCombinations_2_6[i].cameraId = combination.cameraId;
2111                     bool success =
2112                             SessionConfigurationUtils::convertHALStreamCombinationFromV37ToV34(
2113                                     halCameraIdsAndStreamCombinations_2_6[i].streamConfiguration,
2114                                     combination.streamConfiguration);
2115                     if (!success) {
2116                         *isSupported = false;
2117                         return OK;
2118                     }
2119                 }
2120                 ret = interface_2_6->isConcurrentStreamCombinationSupported(
2121                         halCameraIdsAndStreamCombinations_2_6, cb);
2122             }
2123         }
2124 
2125         if (interface_2_7 != nullptr || interface_2_6 != nullptr) {
2126             if (ret.isOk()) {
2127                 switch (callStatus) {
2128                     case Status::OK:
2129                         // Expected case, do nothing.
2130                         res = OK;
2131                         break;
2132                     case Status::METHOD_NOT_SUPPORTED:
2133                         res = INVALID_OPERATION;
2134                         break;
2135                     default:
2136                         ALOGE("%s: Session configuration query failed: %d", __FUNCTION__,
2137                                   callStatus);
2138                         res = UNKNOWN_ERROR;
2139                 }
2140             } else {
2141                 ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, ret.description().c_str());
2142                 res = UNKNOWN_ERROR;
2143             }
2144             return res;
2145         }
2146     }
2147     // unsupported operation
2148     return INVALID_OPERATION;
2149 }
2150 
notifyInitialStatusChange(sp<StatusListener> listener,std::unique_ptr<std::vector<CameraStatusInfoT>> cachedStatus)2151 void CameraProviderManager::ProviderInfo::notifyInitialStatusChange(
2152         sp<StatusListener> listener,
2153         std::unique_ptr<std::vector<CameraStatusInfoT>> cachedStatus) {
2154     for (auto& statusInfo : *cachedStatus) {
2155         if (statusInfo.isPhysicalCameraStatus) {
2156             listener->onDeviceStatusChanged(String8(statusInfo.cameraId.c_str()),
2157                     String8(statusInfo.physicalCameraId.c_str()), statusInfo.status);
2158         } else {
2159             listener->onDeviceStatusChanged(
2160                     String8(statusInfo.cameraId.c_str()), statusInfo.status);
2161         }
2162     }
2163 }
2164 
2165 template<class DeviceInfoT>
2166 std::unique_ptr<CameraProviderManager::ProviderInfo::DeviceInfo>
initializeDeviceInfo(const std::string & name,const metadata_vendor_id_t tagId,const std::string & id,uint16_t minorVersion)2167     CameraProviderManager::ProviderInfo::initializeDeviceInfo(
2168         const std::string &name, const metadata_vendor_id_t tagId,
2169         const std::string &id, uint16_t minorVersion) {
2170     Status status;
2171 
2172     auto cameraInterface =
2173             startDeviceInterface<typename DeviceInfoT::InterfaceT>(name);
2174     if (cameraInterface == nullptr) return nullptr;
2175 
2176     CameraResourceCost resourceCost;
2177     cameraInterface->getResourceCost([&status, &resourceCost](
2178         Status s, CameraResourceCost cost) {
2179                 status = s;
2180                 resourceCost = cost;
2181             });
2182     if (status != Status::OK) {
2183         ALOGE("%s: Unable to obtain resource costs for camera device %s: %s", __FUNCTION__,
2184                 name.c_str(), statusToString(status));
2185         return nullptr;
2186     }
2187 
2188     for (auto& conflictName : resourceCost.conflictingDevices) {
2189         uint16_t major, minor;
2190         std::string type, id;
2191         status_t res = parseDeviceName(conflictName, &major, &minor, &type, &id);
2192         if (res != OK) {
2193             ALOGE("%s: Failed to parse conflicting device %s", __FUNCTION__, conflictName.c_str());
2194             return nullptr;
2195         }
2196         conflictName = id;
2197     }
2198 
2199     return std::unique_ptr<DeviceInfo>(
2200         new DeviceInfoT(name, tagId, id, minorVersion, resourceCost, this,
2201                 mProviderPublicCameraIds, cameraInterface));
2202 }
2203 
2204 template<class InterfaceT>
2205 sp<InterfaceT>
startDeviceInterface(const std::string & name)2206 CameraProviderManager::ProviderInfo::startDeviceInterface(const std::string &name) {
2207     ALOGE("%s: Device %s: Unknown HIDL device HAL major version %d:", __FUNCTION__,
2208             name.c_str(), InterfaceT::version.get_major());
2209     return nullptr;
2210 }
2211 
2212 template<>
2213 sp<device::V3_2::ICameraDevice>
2214 CameraProviderManager::ProviderInfo::startDeviceInterface
2215         <device::V3_2::ICameraDevice>(const std::string &name) {
2216     Status status;
2217     sp<device::V3_2::ICameraDevice> cameraInterface;
2218     hardware::Return<void> ret;
2219     const sp<provider::V2_4::ICameraProvider> interface = startProviderInterface();
2220     if (interface == nullptr) {
2221         return nullptr;
2222     }
2223     ret = interface->getCameraDeviceInterface_V3_x(name, [&status, &cameraInterface](
__anon72e089840c02( Status s, sp<device::V3_2::ICameraDevice> interface) 2224         Status s, sp<device::V3_2::ICameraDevice> interface) {
2225                 status = s;
2226                 cameraInterface = interface;
2227             });
2228     if (!ret.isOk()) {
2229         ALOGE("%s: Transaction error trying to obtain interface for camera device %s: %s",
2230                 __FUNCTION__, name.c_str(), ret.description().c_str());
2231         return nullptr;
2232     }
2233     if (status != Status::OK) {
2234         ALOGE("%s: Unable to obtain interface for camera device %s: %s", __FUNCTION__,
2235                 name.c_str(), statusToString(status));
2236         return nullptr;
2237     }
2238     return cameraInterface;
2239 }
2240 
~DeviceInfo()2241 CameraProviderManager::ProviderInfo::DeviceInfo::~DeviceInfo() {}
2242 
2243 template<class InterfaceT>
startDeviceInterface()2244 sp<InterfaceT> CameraProviderManager::ProviderInfo::DeviceInfo::startDeviceInterface() {
2245     sp<InterfaceT> device;
2246     ATRACE_CALL();
2247     if (mSavedInterface == nullptr) {
2248         sp<ProviderInfo> parentProvider = mParentProvider.promote();
2249         if (parentProvider != nullptr) {
2250             device = parentProvider->startDeviceInterface<InterfaceT>(mName);
2251         }
2252     } else {
2253         device = (InterfaceT *) mSavedInterface.get();
2254     }
2255     return device;
2256 }
2257 
2258 template<class InterfaceT>
setTorchMode(InterfaceT & interface,bool enabled)2259 status_t CameraProviderManager::ProviderInfo::DeviceInfo::setTorchMode(InterfaceT& interface,
2260         bool enabled) {
2261     Status s = interface->setTorchMode(enabled ? TorchMode::ON : TorchMode::OFF);
2262     return mapToStatusT(s);
2263 }
2264 
DeviceInfo3(const std::string & name,const metadata_vendor_id_t tagId,const std::string & id,uint16_t minorVersion,const CameraResourceCost & resourceCost,sp<ProviderInfo> parentProvider,const std::vector<std::string> & publicCameraIds,sp<InterfaceT> interface)2265 CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name,
2266         const metadata_vendor_id_t tagId, const std::string &id,
2267         uint16_t minorVersion,
2268         const CameraResourceCost& resourceCost,
2269         sp<ProviderInfo> parentProvider,
2270         const std::vector<std::string>& publicCameraIds,
2271         sp<InterfaceT> interface) :
2272         DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion},
2273                    publicCameraIds, resourceCost, parentProvider) {
2274     // Get camera characteristics and initialize flash unit availability
2275     Status status;
2276     hardware::Return<void> ret;
2277     ret = interface->getCameraCharacteristics([&status, this](Status s,
__anon72e089840d02(Status s, device::V3_2::CameraMetadata metadata) 2278                     device::V3_2::CameraMetadata metadata) {
2279                 status = s;
2280                 if (s == Status::OK) {
2281                     camera_metadata_t *buffer =
2282                             reinterpret_cast<camera_metadata_t*>(metadata.data());
2283                     size_t expectedSize = metadata.size();
2284                     int res = validate_camera_metadata_structure(buffer, &expectedSize);
2285                     if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
2286                         set_camera_metadata_vendor_id(buffer, mProviderTagid);
2287                         mCameraCharacteristics = buffer;
2288                     } else {
2289                         ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
2290                         status = Status::INTERNAL_ERROR;
2291                     }
2292                 }
2293             });
2294     if (!ret.isOk()) {
2295         ALOGE("%s: Transaction error getting camera characteristics for device %s"
2296                 " to check for a flash unit: %s", __FUNCTION__, id.c_str(),
2297                 ret.description().c_str());
2298         return;
2299     }
2300     if (status != Status::OK) {
2301         ALOGE("%s: Unable to get camera characteristics for device %s: %s (%d)",
2302                 __FUNCTION__, id.c_str(), CameraProviderManager::statusToString(status), status);
2303         return;
2304     }
2305 
2306     if (mCameraCharacteristics.exists(ANDROID_INFO_DEVICE_STATE_ORIENTATIONS)) {
2307         const auto &stateMap = mCameraCharacteristics.find(ANDROID_INFO_DEVICE_STATE_ORIENTATIONS);
2308         if ((stateMap.count > 0) && ((stateMap.count % 2) == 0)) {
2309             for (size_t i = 0; i < stateMap.count; i += 2) {
2310                 mDeviceStateOrientationMap.emplace(stateMap.data.i64[i], stateMap.data.i64[i+1]);
2311             }
2312         } else {
2313             ALOGW("%s: Invalid ANDROID_INFO_DEVICE_STATE_ORIENTATIONS map size: %zu", __FUNCTION__,
2314                     stateMap.count);
2315         }
2316     }
2317 
2318     mSystemCameraKind = getSystemCameraKind();
2319 
2320     status_t res = fixupMonochromeTags();
2321     if (OK != res) {
2322         ALOGE("%s: Unable to fix up monochrome tags based for older HAL version: %s (%d)",
2323                 __FUNCTION__, strerror(-res), res);
2324         return;
2325     }
2326     auto stat = addDynamicDepthTags();
2327     if (OK != stat) {
2328         ALOGE("%s: Failed appending dynamic depth tags: %s (%d)", __FUNCTION__, strerror(-stat),
2329                 stat);
2330     }
2331     res = deriveHeicTags();
2332     if (OK != res) {
2333         ALOGE("%s: Unable to derive HEIC tags based on camera and media capabilities: %s (%d)",
2334                 __FUNCTION__, strerror(-res), res);
2335     }
2336 
2337     if (SessionConfigurationUtils::isUltraHighResolutionSensor(mCameraCharacteristics)) {
2338         status_t status = addDynamicDepthTags(/*maxResolution*/true);
2339         if (OK != status) {
2340             ALOGE("%s: Failed appending dynamic depth tags for maximum resolution mode: %s (%d)",
2341                     __FUNCTION__, strerror(-status), status);
2342         }
2343 
2344         status = deriveHeicTags(/*maxResolution*/true);
2345         if (OK != status) {
2346             ALOGE("%s: Unable to derive HEIC tags based on camera and media capabilities for"
2347                     "maximum resolution mode: %s (%d)", __FUNCTION__, strerror(-status), status);
2348         }
2349     }
2350 
2351     res = addRotateCropTags();
2352     if (OK != res) {
2353         ALOGE("%s: Unable to add default SCALER_ROTATE_AND_CROP tags: %s (%d)", __FUNCTION__,
2354                 strerror(-res), res);
2355     }
2356     res = addPreCorrectionActiveArraySize();
2357     if (OK != res) {
2358         ALOGE("%s: Unable to add PRE_CORRECTION_ACTIVE_ARRAY_SIZE: %s (%d)", __FUNCTION__,
2359                 strerror(-res), res);
2360     }
2361     res = camera3::ZoomRatioMapper::overrideZoomRatioTags(
2362             &mCameraCharacteristics, &mSupportNativeZoomRatio);
2363     if (OK != res) {
2364         ALOGE("%s: Unable to override zoomRatio related tags: %s (%d)",
2365                 __FUNCTION__, strerror(-res), res);
2366     }
2367 
2368     camera_metadata_entry flashAvailable =
2369             mCameraCharacteristics.find(ANDROID_FLASH_INFO_AVAILABLE);
2370     if (flashAvailable.count == 1 &&
2371             flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE) {
2372         mHasFlashUnit = true;
2373     } else {
2374         mHasFlashUnit = false;
2375     }
2376 
2377     queryPhysicalCameraIds();
2378 
2379     // Get physical camera characteristics if applicable
2380     auto castResult = device::V3_5::ICameraDevice::castFrom(interface);
2381     if (!castResult.isOk()) {
2382         ALOGV("%s: Unable to convert ICameraDevice instance to version 3.5", __FUNCTION__);
2383         return;
2384     }
2385     sp<device::V3_5::ICameraDevice> interface_3_5 = castResult;
2386     if (interface_3_5 == nullptr) {
2387         ALOGE("%s: Converted ICameraDevice instance to nullptr", __FUNCTION__);
2388         return;
2389     }
2390 
2391     if (mIsLogicalCamera) {
2392         for (auto& id : mPhysicalIds) {
2393             if (std::find(mPublicCameraIds.begin(), mPublicCameraIds.end(), id) !=
2394                     mPublicCameraIds.end()) {
2395                 continue;
2396             }
2397 
2398             hardware::hidl_string hidlId(id);
2399             ret = interface_3_5->getPhysicalCameraCharacteristics(hidlId,
__anon72e089840e02(Status s, device::V3_2::CameraMetadata metadata) 2400                     [&status, &id, this](Status s, device::V3_2::CameraMetadata metadata) {
2401                 status = s;
2402                 if (s == Status::OK) {
2403                     camera_metadata_t *buffer =
2404                             reinterpret_cast<camera_metadata_t*>(metadata.data());
2405                     size_t expectedSize = metadata.size();
2406                     int res = validate_camera_metadata_structure(buffer, &expectedSize);
2407                     if (res == OK || res == CAMERA_METADATA_VALIDATION_SHIFTED) {
2408                         set_camera_metadata_vendor_id(buffer, mProviderTagid);
2409                         mPhysicalCameraCharacteristics[id] = buffer;
2410                     } else {
2411                         ALOGE("%s: Malformed camera metadata received from HAL", __FUNCTION__);
2412                         status = Status::INTERNAL_ERROR;
2413                     }
2414                 }
2415             });
2416 
2417             if (!ret.isOk()) {
2418                 ALOGE("%s: Transaction error getting physical camera %s characteristics for %s: %s",
2419                         __FUNCTION__, id.c_str(), id.c_str(), ret.description().c_str());
2420                 return;
2421             }
2422             if (status != Status::OK) {
2423                 ALOGE("%s: Unable to get physical camera %s characteristics for device %s: %s (%d)",
2424                         __FUNCTION__, id.c_str(), mId.c_str(),
2425                         CameraProviderManager::statusToString(status), status);
2426                 return;
2427             }
2428 
2429             res = camera3::ZoomRatioMapper::overrideZoomRatioTags(
2430                     &mPhysicalCameraCharacteristics[id], &mSupportNativeZoomRatio);
2431             if (OK != res) {
2432                 ALOGE("%s: Unable to override zoomRatio related tags: %s (%d)",
2433                         __FUNCTION__, strerror(-res), res);
2434             }
2435         }
2436     }
2437 
2438     if (!kEnableLazyHal) {
2439         // Save HAL reference indefinitely
2440         mSavedInterface = interface;
2441     }
2442 }
2443 
~DeviceInfo3()2444 CameraProviderManager::ProviderInfo::DeviceInfo3::~DeviceInfo3() {}
2445 
notifyDeviceStateChange(hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> newState)2446 void CameraProviderManager::ProviderInfo::DeviceInfo3::notifyDeviceStateChange(
2447         hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> newState) {
2448 
2449     if (!mDeviceStateOrientationMap.empty() &&
2450             (mDeviceStateOrientationMap.find(newState) != mDeviceStateOrientationMap.end())) {
2451         mCameraCharacteristics.update(ANDROID_SENSOR_ORIENTATION,
2452                 &mDeviceStateOrientationMap[newState], 1);
2453     }
2454 }
2455 
setTorchMode(bool enabled)2456 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::setTorchMode(bool enabled) {
2457     return setTorchModeForDevice<InterfaceT>(enabled);
2458 }
2459 
getCameraInfo(hardware::CameraInfo * info) const2460 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo(
2461         hardware::CameraInfo *info) const {
2462     if (info == nullptr) return BAD_VALUE;
2463 
2464     camera_metadata_ro_entry facing =
2465             mCameraCharacteristics.find(ANDROID_LENS_FACING);
2466     if (facing.count == 1) {
2467         switch (facing.data.u8[0]) {
2468             case ANDROID_LENS_FACING_BACK:
2469                 info->facing = hardware::CAMERA_FACING_BACK;
2470                 break;
2471             case ANDROID_LENS_FACING_EXTERNAL:
2472                 // Map external to front for legacy API
2473             case ANDROID_LENS_FACING_FRONT:
2474                 info->facing = hardware::CAMERA_FACING_FRONT;
2475                 break;
2476         }
2477     } else {
2478         ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__);
2479         return NAME_NOT_FOUND;
2480     }
2481 
2482     camera_metadata_ro_entry orientation =
2483             mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION);
2484     if (orientation.count == 1) {
2485         info->orientation = orientation.data.i32[0];
2486     } else {
2487         ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__);
2488         return NAME_NOT_FOUND;
2489     }
2490 
2491     return OK;
2492 }
isAPI1Compatible() const2493 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const {
2494     // Do not advertise NIR cameras to API1 camera app.
2495     camera_metadata_ro_entry cfa = mCameraCharacteristics.find(
2496             ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT);
2497     if (cfa.count == 1 && cfa.data.u8[0] == ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR) {
2498         return false;
2499     }
2500 
2501     bool isBackwardCompatible = false;
2502     camera_metadata_ro_entry_t caps = mCameraCharacteristics.find(
2503             ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
2504     for (size_t i = 0; i < caps.count; i++) {
2505         if (caps.data.u8[i] ==
2506                 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) {
2507             isBackwardCompatible = true;
2508             break;
2509         }
2510     }
2511 
2512     return isBackwardCompatible;
2513 }
2514 
dumpState(int fd)2515 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::dumpState(int fd) {
2516     native_handle_t* handle = native_handle_create(1,0);
2517     handle->data[0] = fd;
2518     const sp<InterfaceT> interface = startDeviceInterface<InterfaceT>();
2519     if (interface == nullptr) {
2520         return DEAD_OBJECT;
2521     }
2522     auto ret = interface->dumpState(handle);
2523     native_handle_delete(handle);
2524     if (!ret.isOk()) {
2525         return INVALID_OPERATION;
2526     }
2527     return OK;
2528 }
2529 
getCameraCharacteristics(bool overrideForPerfClass,CameraMetadata * characteristics) const2530 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
2531         bool overrideForPerfClass, CameraMetadata *characteristics) const {
2532     if (characteristics == nullptr) return BAD_VALUE;
2533 
2534     if (!overrideForPerfClass && mCameraCharNoPCOverride != nullptr) {
2535         *characteristics = *mCameraCharNoPCOverride;
2536     } else {
2537         *characteristics = mCameraCharacteristics;
2538     }
2539 
2540     return OK;
2541 }
2542 
getPhysicalCameraCharacteristics(const std::string & physicalCameraId,CameraMetadata * characteristics) const2543 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraCharacteristics(
2544         const std::string& physicalCameraId, CameraMetadata *characteristics) const {
2545     if (characteristics == nullptr) return BAD_VALUE;
2546     if (mPhysicalCameraCharacteristics.find(physicalCameraId) ==
2547             mPhysicalCameraCharacteristics.end()) {
2548         return NAME_NOT_FOUND;
2549     }
2550 
2551     *characteristics = mPhysicalCameraCharacteristics.at(physicalCameraId);
2552     return OK;
2553 }
2554 
isSessionConfigurationSupported(const hardware::camera::device::V3_7::StreamConfiguration & configuration,bool * status)2555 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::isSessionConfigurationSupported(
2556         const hardware::camera::device::V3_7::StreamConfiguration &configuration,
2557         bool *status /*out*/) {
2558 
2559     const sp<CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT> interface =
2560             this->startDeviceInterface<CameraProviderManager::ProviderInfo::DeviceInfo3::InterfaceT>();
2561     if (interface == nullptr) {
2562         return DEAD_OBJECT;
2563     }
2564     auto castResult_3_5 = device::V3_5::ICameraDevice::castFrom(interface);
2565     sp<hardware::camera::device::V3_5::ICameraDevice> interface_3_5 = castResult_3_5;
2566     auto castResult_3_7 = device::V3_7::ICameraDevice::castFrom(interface);
2567     sp<hardware::camera::device::V3_7::ICameraDevice> interface_3_7 = castResult_3_7;
2568 
2569     status_t res;
2570     Status callStatus;
2571     ::android::hardware::Return<void> ret;
2572     auto halCb =
2573             [&callStatus, &status] (Status s, bool combStatus) {
2574                 callStatus = s;
2575                 *status = combStatus;
2576             };
2577     if (interface_3_7 != nullptr) {
2578         ret = interface_3_7->isStreamCombinationSupported_3_7(configuration, halCb);
2579     } else if (interface_3_5 != nullptr) {
2580         hardware::camera::device::V3_4::StreamConfiguration configuration_3_4;
2581         bool success = SessionConfigurationUtils::convertHALStreamCombinationFromV37ToV34(
2582                 configuration_3_4, configuration);
2583         if (!success) {
2584             *status = false;
2585             return OK;
2586         }
2587         ret = interface_3_5->isStreamCombinationSupported(configuration_3_4, halCb);
2588     } else {
2589         return INVALID_OPERATION;
2590     }
2591     if (ret.isOk()) {
2592         switch (callStatus) {
2593             case Status::OK:
2594                 // Expected case, do nothing.
2595                 res = OK;
2596                 break;
2597             case Status::METHOD_NOT_SUPPORTED:
2598                 res = INVALID_OPERATION;
2599                 break;
2600             default:
2601                 ALOGE("%s: Session configuration query failed: %d", __FUNCTION__, callStatus);
2602                 res = UNKNOWN_ERROR;
2603         }
2604     } else {
2605         ALOGE("%s: Unexpected binder error: %s", __FUNCTION__, ret.description().c_str());
2606         res = UNKNOWN_ERROR;
2607     }
2608 
2609     return res;
2610 }
2611 
filterSmallJpegSizes()2612 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::filterSmallJpegSizes() {
2613     int32_t thresholdW = SessionConfigurationUtils::PERF_CLASS_JPEG_THRESH_W;
2614     int32_t thresholdH = SessionConfigurationUtils::PERF_CLASS_JPEG_THRESH_H;
2615 
2616     if (mCameraCharNoPCOverride != nullptr) return OK;
2617 
2618     mCameraCharNoPCOverride = std::make_unique<CameraMetadata>(mCameraCharacteristics);
2619 
2620     // Remove small JPEG sizes from available stream configurations
2621     size_t largeJpegCount = 0;
2622     std::vector<int32_t> newStreamConfigs;
2623     camera_metadata_entry streamConfigs =
2624             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
2625     for (size_t i = 0; i < streamConfigs.count; i += 4) {
2626         if ((streamConfigs.data.i32[i] == HAL_PIXEL_FORMAT_BLOB) && (streamConfigs.data.i32[i+3] ==
2627                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) {
2628             if (streamConfigs.data.i32[i+1] < thresholdW  ||
2629                     streamConfigs.data.i32[i+2] < thresholdH) {
2630                 continue;
2631             } else {
2632                 largeJpegCount ++;
2633             }
2634         }
2635         newStreamConfigs.insert(newStreamConfigs.end(), streamConfigs.data.i32 + i,
2636                 streamConfigs.data.i32 + i + 4);
2637     }
2638     if (newStreamConfigs.size() == 0 || largeJpegCount == 0) {
2639         return BAD_VALUE;
2640     }
2641 
2642     // Remove small JPEG sizes from available min frame durations
2643     largeJpegCount = 0;
2644     std::vector<int64_t> newMinDurations;
2645     camera_metadata_entry minDurations =
2646             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
2647     for (size_t i = 0; i < minDurations.count; i += 4) {
2648         if (minDurations.data.i64[i] == HAL_PIXEL_FORMAT_BLOB) {
2649             if (minDurations.data.i64[i+1] < thresholdW ||
2650                     minDurations.data.i64[i+2] < thresholdH) {
2651                 continue;
2652             } else {
2653                 largeJpegCount++;
2654             }
2655         }
2656         newMinDurations.insert(newMinDurations.end(), minDurations.data.i64 + i,
2657                 minDurations.data.i64 + i + 4);
2658     }
2659     if (newMinDurations.size() == 0 || largeJpegCount == 0) {
2660         return BAD_VALUE;
2661     }
2662 
2663     // Remove small JPEG sizes from available stall durations
2664     largeJpegCount = 0;
2665     std::vector<int64_t> newStallDurations;
2666     camera_metadata_entry stallDurations =
2667             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
2668     for (size_t i = 0; i < stallDurations.count; i += 4) {
2669         if (stallDurations.data.i64[i] == HAL_PIXEL_FORMAT_BLOB) {
2670             if (stallDurations.data.i64[i+1] < thresholdW ||
2671                     stallDurations.data.i64[i+2] < thresholdH) {
2672                 continue;
2673             } else {
2674                 largeJpegCount++;
2675             }
2676         }
2677         newStallDurations.insert(newStallDurations.end(), stallDurations.data.i64 + i,
2678                 stallDurations.data.i64 + i + 4);
2679     }
2680     if (newStallDurations.size() == 0 || largeJpegCount == 0) {
2681         return BAD_VALUE;
2682     }
2683 
2684     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
2685             newStreamConfigs.data(), newStreamConfigs.size());
2686     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
2687             newMinDurations.data(), newMinDurations.size());
2688     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
2689             newStallDurations.data(), newStallDurations.size());
2690 
2691     // Re-generate metadata tags that have dependencies on BLOB sizes
2692     auto res = addDynamicDepthTags();
2693     if (OK != res) {
2694         ALOGE("%s: Failed to append dynamic depth tags: %s (%d)", __FUNCTION__,
2695                 strerror(-res), res);
2696         // Allow filtering of small JPEG sizes to succeed even if dynamic depth
2697         // tags fail to generate.
2698     }
2699 
2700     return OK;
2701 }
2702 
parseProviderName(const std::string & name,std::string * type,uint32_t * id)2703 status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name,
2704         std::string *type, uint32_t *id) {
2705     // Format must be "<type>/<id>"
2706 #define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. "       \
2707     "Should match '<type>/<id>' - "
2708 
2709     if (!type || !id) return INVALID_OPERATION;
2710 
2711     std::string::size_type slashIdx = name.find('/');
2712     if (slashIdx == std::string::npos || slashIdx == name.size() - 1) {
2713         ALOGE(ERROR_MSG_PREFIX
2714                 "does not have / separator between type and id",
2715                 __FUNCTION__, name.c_str());
2716         return BAD_VALUE;
2717     }
2718 
2719     std::string typeVal = name.substr(0, slashIdx);
2720 
2721     char *endPtr;
2722     errno = 0;
2723     long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10);
2724     if (errno != 0) {
2725         ALOGE(ERROR_MSG_PREFIX
2726                 "cannot parse provider id as an integer: %s (%d)",
2727                 __FUNCTION__, name.c_str(), strerror(errno), errno);
2728         return BAD_VALUE;
2729     }
2730     if (endPtr != name.c_str() + name.size()) {
2731         ALOGE(ERROR_MSG_PREFIX
2732                 "provider id has unexpected length",
2733                 __FUNCTION__, name.c_str());
2734         return BAD_VALUE;
2735     }
2736     if (idVal < 0) {
2737         ALOGE(ERROR_MSG_PREFIX
2738                 "id is negative: %ld",
2739                 __FUNCTION__, name.c_str(), idVal);
2740         return BAD_VALUE;
2741     }
2742 
2743 #undef ERROR_MSG_PREFIX
2744 
2745     *type = typeVal;
2746     *id = static_cast<uint32_t>(idVal);
2747 
2748     return OK;
2749 }
2750 
generateVendorTagId(const std::string & name)2751 metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId(
2752         const std::string &name) {
2753     metadata_vendor_id_t ret = std::hash<std::string> {} (name);
2754     // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value
2755     if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) {
2756         ret = 0;
2757     }
2758 
2759     return ret;
2760 }
2761 
parseDeviceName(const std::string & name,uint16_t * major,uint16_t * minor,std::string * type,std::string * id)2762 status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name,
2763         uint16_t *major, uint16_t *minor, std::string *type, std::string *id) {
2764 
2765     // Format must be "device@<major>.<minor>/<type>/<id>"
2766 
2767 #define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \
2768     "Should match 'device@<major>.<minor>/<type>/<id>' - "
2769 
2770     if (!major || !minor || !type || !id) return INVALID_OPERATION;
2771 
2772     // Verify starting prefix
2773     const char expectedPrefix[] = "device@";
2774 
2775     if (name.find(expectedPrefix) != 0) {
2776         ALOGE(ERROR_MSG_PREFIX
2777                 "does not start with '%s'",
2778                 __FUNCTION__, name.c_str(), expectedPrefix);
2779         return BAD_VALUE;
2780     }
2781 
2782     // Extract major/minor versions
2783     constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2;
2784     std::string::size_type dotIdx = name.find('.', atIdx);
2785     if (dotIdx == std::string::npos) {
2786         ALOGE(ERROR_MSG_PREFIX
2787                 "does not have @<major>. version section",
2788                 __FUNCTION__, name.c_str());
2789         return BAD_VALUE;
2790     }
2791     std::string::size_type typeSlashIdx = name.find('/', dotIdx);
2792     if (typeSlashIdx == std::string::npos) {
2793         ALOGE(ERROR_MSG_PREFIX
2794                 "does not have .<minor>/ version section",
2795                 __FUNCTION__, name.c_str());
2796         return BAD_VALUE;
2797     }
2798 
2799     char *endPtr;
2800     errno = 0;
2801     long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10);
2802     if (errno != 0) {
2803         ALOGE(ERROR_MSG_PREFIX
2804                 "cannot parse major version: %s (%d)",
2805                 __FUNCTION__, name.c_str(), strerror(errno), errno);
2806         return BAD_VALUE;
2807     }
2808     if (endPtr != name.c_str() + dotIdx) {
2809         ALOGE(ERROR_MSG_PREFIX
2810                 "major version has unexpected length",
2811                 __FUNCTION__, name.c_str());
2812         return BAD_VALUE;
2813     }
2814     long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10);
2815     if (errno != 0) {
2816         ALOGE(ERROR_MSG_PREFIX
2817                 "cannot parse minor version: %s (%d)",
2818                 __FUNCTION__, name.c_str(), strerror(errno), errno);
2819         return BAD_VALUE;
2820     }
2821     if (endPtr != name.c_str() + typeSlashIdx) {
2822         ALOGE(ERROR_MSG_PREFIX
2823                 "minor version has unexpected length",
2824                 __FUNCTION__, name.c_str());
2825         return BAD_VALUE;
2826     }
2827     if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) {
2828         ALOGE(ERROR_MSG_PREFIX
2829                 "major/minor version is out of range of uint16_t: %ld.%ld",
2830                 __FUNCTION__, name.c_str(), majorVal, minorVal);
2831         return BAD_VALUE;
2832     }
2833 
2834     // Extract type and id
2835 
2836     std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1);
2837     if (instanceSlashIdx == std::string::npos) {
2838         ALOGE(ERROR_MSG_PREFIX
2839                 "does not have /<type>/ component",
2840                 __FUNCTION__, name.c_str());
2841         return BAD_VALUE;
2842     }
2843     std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1);
2844 
2845     if (instanceSlashIdx == name.size() - 1) {
2846         ALOGE(ERROR_MSG_PREFIX
2847                 "does not have an /<id> component",
2848                 __FUNCTION__, name.c_str());
2849         return BAD_VALUE;
2850     }
2851     std::string idVal = name.substr(instanceSlashIdx + 1);
2852 
2853 #undef ERROR_MSG_PREFIX
2854 
2855     *major = static_cast<uint16_t>(majorVal);
2856     *minor = static_cast<uint16_t>(minorVal);
2857     *type = typeVal;
2858     *id = idVal;
2859 
2860     return OK;
2861 }
2862 
2863 
2864 
~ProviderInfo()2865 CameraProviderManager::ProviderInfo::~ProviderInfo() {
2866     if (mInitialStatusCallbackFuture.valid()) {
2867         mInitialStatusCallbackFuture.wait();
2868     }
2869     // Destruction of ProviderInfo is only supposed to happen when the respective
2870     // CameraProvider interface dies, so do not unregister callbacks.
2871 }
2872 
mapToStatusT(const Status & s)2873 status_t CameraProviderManager::mapToStatusT(const Status& s)  {
2874     switch(s) {
2875         case Status::OK:
2876             return OK;
2877         case Status::ILLEGAL_ARGUMENT:
2878             return BAD_VALUE;
2879         case Status::CAMERA_IN_USE:
2880             return -EBUSY;
2881         case Status::MAX_CAMERAS_IN_USE:
2882             return -EUSERS;
2883         case Status::METHOD_NOT_SUPPORTED:
2884             return UNKNOWN_TRANSACTION;
2885         case Status::OPERATION_NOT_SUPPORTED:
2886             return INVALID_OPERATION;
2887         case Status::CAMERA_DISCONNECTED:
2888             return DEAD_OBJECT;
2889         case Status::INTERNAL_ERROR:
2890             return INVALID_OPERATION;
2891     }
2892     ALOGW("Unexpected HAL status code %d", s);
2893     return INVALID_OPERATION;
2894 }
2895 
statusToString(const Status & s)2896 const char* CameraProviderManager::statusToString(const Status& s) {
2897     switch(s) {
2898         case Status::OK:
2899             return "OK";
2900         case Status::ILLEGAL_ARGUMENT:
2901             return "ILLEGAL_ARGUMENT";
2902         case Status::CAMERA_IN_USE:
2903             return "CAMERA_IN_USE";
2904         case Status::MAX_CAMERAS_IN_USE:
2905             return "MAX_CAMERAS_IN_USE";
2906         case Status::METHOD_NOT_SUPPORTED:
2907             return "METHOD_NOT_SUPPORTED";
2908         case Status::OPERATION_NOT_SUPPORTED:
2909             return "OPERATION_NOT_SUPPORTED";
2910         case Status::CAMERA_DISCONNECTED:
2911             return "CAMERA_DISCONNECTED";
2912         case Status::INTERNAL_ERROR:
2913             return "INTERNAL_ERROR";
2914     }
2915     ALOGW("Unexpected HAL status code %d", s);
2916     return "UNKNOWN_ERROR";
2917 }
2918 
deviceStatusToString(const CameraDeviceStatus & s)2919 const char* CameraProviderManager::deviceStatusToString(const CameraDeviceStatus& s) {
2920     switch(s) {
2921         case CameraDeviceStatus::NOT_PRESENT:
2922             return "NOT_PRESENT";
2923         case CameraDeviceStatus::PRESENT:
2924             return "PRESENT";
2925         case CameraDeviceStatus::ENUMERATING:
2926             return "ENUMERATING";
2927     }
2928     ALOGW("Unexpected HAL device status code %d", s);
2929     return "UNKNOWN_STATUS";
2930 }
2931 
torchStatusToString(const TorchModeStatus & s)2932 const char* CameraProviderManager::torchStatusToString(const TorchModeStatus& s) {
2933     switch(s) {
2934         case TorchModeStatus::NOT_AVAILABLE:
2935             return "NOT_AVAILABLE";
2936         case TorchModeStatus::AVAILABLE_OFF:
2937             return "AVAILABLE_OFF";
2938         case TorchModeStatus::AVAILABLE_ON:
2939             return "AVAILABLE_ON";
2940     }
2941     ALOGW("Unexpected HAL torch mode status code %d", s);
2942     return "UNKNOWN_STATUS";
2943 }
2944 
2945 
createDescriptorFromHidl(const hardware::hidl_vec<common::V1_0::VendorTagSection> & vts,sp<VendorTagDescriptor> & descriptor)2946 status_t HidlVendorTagDescriptor::createDescriptorFromHidl(
2947         const hardware::hidl_vec<common::V1_0::VendorTagSection>& vts,
2948         /*out*/
2949         sp<VendorTagDescriptor>& descriptor) {
2950 
2951     int tagCount = 0;
2952 
2953     for (size_t s = 0; s < vts.size(); s++) {
2954         tagCount += vts[s].tags.size();
2955     }
2956 
2957     if (tagCount < 0 || tagCount > INT32_MAX) {
2958         ALOGE("%s: tag count %d from vendor tag sections is invalid.", __FUNCTION__, tagCount);
2959         return BAD_VALUE;
2960     }
2961 
2962     Vector<uint32_t> tagArray;
2963     LOG_ALWAYS_FATAL_IF(tagArray.resize(tagCount) != tagCount,
2964             "%s: too many (%u) vendor tags defined.", __FUNCTION__, tagCount);
2965 
2966 
2967     sp<HidlVendorTagDescriptor> desc = new HidlVendorTagDescriptor();
2968     desc->mTagCount = tagCount;
2969 
2970     SortedVector<String8> sections;
2971     KeyedVector<uint32_t, String8> tagToSectionMap;
2972 
2973     int idx = 0;
2974     for (size_t s = 0; s < vts.size(); s++) {
2975         const common::V1_0::VendorTagSection& section = vts[s];
2976         const char *sectionName = section.sectionName.c_str();
2977         if (sectionName == NULL) {
2978             ALOGE("%s: no section name defined for vendor tag section %zu.", __FUNCTION__, s);
2979             return BAD_VALUE;
2980         }
2981         String8 sectionString(sectionName);
2982         sections.add(sectionString);
2983 
2984         for (size_t j = 0; j < section.tags.size(); j++) {
2985             uint32_t tag = section.tags[j].tagId;
2986             if (tag < CAMERA_METADATA_VENDOR_TAG_BOUNDARY) {
2987                 ALOGE("%s: vendor tag %d not in vendor tag section.", __FUNCTION__, tag);
2988                 return BAD_VALUE;
2989             }
2990 
2991             tagArray.editItemAt(idx++) = section.tags[j].tagId;
2992 
2993             const char *tagName = section.tags[j].tagName.c_str();
2994             if (tagName == NULL) {
2995                 ALOGE("%s: no tag name defined for vendor tag %d.", __FUNCTION__, tag);
2996                 return BAD_VALUE;
2997             }
2998             desc->mTagToNameMap.add(tag, String8(tagName));
2999             tagToSectionMap.add(tag, sectionString);
3000 
3001             int tagType = (int) section.tags[j].tagType;
3002             if (tagType < 0 || tagType >= NUM_TYPES) {
3003                 ALOGE("%s: tag type %d from vendor ops does not exist.", __FUNCTION__, tagType);
3004                 return BAD_VALUE;
3005             }
3006             desc->mTagToTypeMap.add(tag, tagType);
3007         }
3008     }
3009 
3010     desc->mSections = sections;
3011 
3012     for (size_t i = 0; i < tagArray.size(); ++i) {
3013         uint32_t tag = tagArray[i];
3014         String8 sectionString = tagToSectionMap.valueFor(tag);
3015 
3016         // Set up tag to section index map
3017         ssize_t index = sections.indexOf(sectionString);
3018         LOG_ALWAYS_FATAL_IF(index < 0, "index %zd must be non-negative", index);
3019         desc->mTagToSectionMap.add(tag, static_cast<uint32_t>(index));
3020 
3021         // Set up reverse mapping
3022         ssize_t reverseIndex = -1;
3023         if ((reverseIndex = desc->mReverseMapping.indexOfKey(sectionString)) < 0) {
3024             KeyedVector<String8, uint32_t>* nameMapper = new KeyedVector<String8, uint32_t>();
3025             reverseIndex = desc->mReverseMapping.add(sectionString, nameMapper);
3026         }
3027         desc->mReverseMapping[reverseIndex]->add(desc->mTagToNameMap.valueFor(tag), tag);
3028     }
3029 
3030     descriptor = std::move(desc);
3031     return OK;
3032 }
3033 
3034 // Expects to have mInterfaceMutex locked
3035 std::vector<std::unordered_set<std::string>>
getConcurrentCameraIds() const3036 CameraProviderManager::getConcurrentCameraIds() const {
3037     std::vector<std::unordered_set<std::string>> deviceIdCombinations;
3038     std::lock_guard<std::mutex> lock(mInterfaceMutex);
3039     for (auto &provider : mProviders) {
3040         for (auto &combinations : provider->getConcurrentCameraIdCombinations()) {
3041             deviceIdCombinations.push_back(combinations);
3042         }
3043     }
3044     return deviceIdCombinations;
3045 }
3046 
convertToHALStreamCombinationAndCameraIdsLocked(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::set<std::string> & perfClassPrimaryCameraIds,int targetSdkVersion,hardware::hidl_vec<CameraIdAndStreamCombination> * halCameraIdsAndStreamCombinations,bool * earlyExit)3047 status_t CameraProviderManager::convertToHALStreamCombinationAndCameraIdsLocked(
3048         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
3049         const std::set<std::string>& perfClassPrimaryCameraIds,
3050         int targetSdkVersion,
3051         hardware::hidl_vec<CameraIdAndStreamCombination> *halCameraIdsAndStreamCombinations,
3052         bool *earlyExit) {
3053     binder::Status bStatus = binder::Status::ok();
3054     std::vector<CameraIdAndStreamCombination> halCameraIdsAndStreamsV;
3055     bool shouldExit = false;
3056     status_t res = OK;
3057     for (auto &cameraIdAndSessionConfig : cameraIdsAndSessionConfigs) {
3058         const std::string& cameraId = cameraIdAndSessionConfig.mCameraId;
3059         hardware::camera::device::V3_7::StreamConfiguration streamConfiguration;
3060         CameraMetadata deviceInfo;
3061         bool overrideForPerfClass =
3062                 SessionConfigurationUtils::targetPerfClassPrimaryCamera(
3063                         perfClassPrimaryCameraIds, cameraId, targetSdkVersion);
3064         res = getCameraCharacteristicsLocked(cameraId, overrideForPerfClass, &deviceInfo);
3065         if (res != OK) {
3066             return res;
3067         }
3068         camera3::metadataGetter getMetadata =
3069                 [this](const String8 &id, bool overrideForPerfClass) {
3070                     CameraMetadata physicalDeviceInfo;
3071                     getCameraCharacteristicsLocked(id.string(), overrideForPerfClass,
3072                                                    &physicalDeviceInfo);
3073                     return physicalDeviceInfo;
3074                 };
3075         std::vector<std::string> physicalCameraIds;
3076         isLogicalCameraLocked(cameraId, &physicalCameraIds);
3077         bStatus =
3078             SessionConfigurationUtils::convertToHALStreamCombination(
3079                     cameraIdAndSessionConfig.mSessionConfiguration,
3080                     String8(cameraId.c_str()), deviceInfo, getMetadata,
3081                     physicalCameraIds, streamConfiguration,
3082                     overrideForPerfClass, &shouldExit);
3083         if (!bStatus.isOk()) {
3084             ALOGE("%s: convertToHALStreamCombination failed", __FUNCTION__);
3085             return INVALID_OPERATION;
3086         }
3087         if (shouldExit) {
3088             *earlyExit = true;
3089             return OK;
3090         }
3091         CameraIdAndStreamCombination halCameraIdAndStream;
3092         halCameraIdAndStream.cameraId = cameraId;
3093         halCameraIdAndStream.streamConfiguration = streamConfiguration;
3094         halCameraIdsAndStreamsV.push_back(halCameraIdAndStream);
3095     }
3096     *halCameraIdsAndStreamCombinations = halCameraIdsAndStreamsV;
3097     return OK;
3098 }
3099 
3100 // Checks if the containing vector of sets has any set that contains all of the
3101 // camera ids in cameraIdsAndSessionConfigs.
checkIfSetContainsAll(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::vector<std::unordered_set<std::string>> & containingSets)3102 static bool checkIfSetContainsAll(
3103         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
3104         const std::vector<std::unordered_set<std::string>> &containingSets) {
3105     for (auto &containingSet : containingSets) {
3106         bool didHaveAll = true;
3107         for (auto &cameraIdAndSessionConfig : cameraIdsAndSessionConfigs) {
3108             if (containingSet.find(cameraIdAndSessionConfig.mCameraId) == containingSet.end()) {
3109                 // a camera id doesn't belong to this set, keep looking in other
3110                 // sets
3111                 didHaveAll = false;
3112                 break;
3113             }
3114         }
3115         if (didHaveAll) {
3116             // found a set that has all camera ids, lets return;
3117             return true;
3118         }
3119     }
3120     return false;
3121 }
3122 
isConcurrentSessionConfigurationSupported(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::set<std::string> & perfClassPrimaryCameraIds,int targetSdkVersion,bool * isSupported)3123 status_t CameraProviderManager::isConcurrentSessionConfigurationSupported(
3124         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
3125         const std::set<std::string>& perfClassPrimaryCameraIds,
3126         int targetSdkVersion, bool *isSupported) {
3127     std::lock_guard<std::mutex> lock(mInterfaceMutex);
3128     // Check if all the devices are a subset of devices advertised by the
3129     // same provider through getConcurrentStreamingCameraIds()
3130     // TODO: we should also do a findDeviceInfoLocked here ?
3131     for (auto &provider : mProviders) {
3132         if (checkIfSetContainsAll(cameraIdsAndSessionConfigs,
3133                 provider->getConcurrentCameraIdCombinations())) {
3134             // For each camera device in cameraIdsAndSessionConfigs collect
3135             // the streamConfigs and create the HAL
3136             // CameraIdAndStreamCombination, exit early if needed
3137             hardware::hidl_vec<CameraIdAndStreamCombination> halCameraIdsAndStreamCombinations;
3138             bool knowUnsupported = false;
3139             status_t res = convertToHALStreamCombinationAndCameraIdsLocked(
3140                     cameraIdsAndSessionConfigs, perfClassPrimaryCameraIds,
3141                     targetSdkVersion, &halCameraIdsAndStreamCombinations, &knowUnsupported);
3142             if (res != OK) {
3143                 ALOGE("%s unable to convert session configurations provided to HAL stream"
3144                       "combinations", __FUNCTION__);
3145                 return res;
3146             }
3147             if (knowUnsupported) {
3148                 // We got to know the streams aren't valid before doing the HAL
3149                 // call itself.
3150                 *isSupported = false;
3151                 return OK;
3152             }
3153             return provider->isConcurrentSessionConfigurationSupported(
3154                     halCameraIdsAndStreamCombinations, isSupported);
3155         }
3156     }
3157     *isSupported = false;
3158     //The set of camera devices were not found
3159     return INVALID_OPERATION;
3160 }
3161 
getCameraCharacteristicsLocked(const std::string & id,bool overrideForPerfClass,CameraMetadata * characteristics) const3162 status_t CameraProviderManager::getCameraCharacteristicsLocked(const std::string &id,
3163         bool overrideForPerfClass, CameraMetadata* characteristics) const {
3164     auto deviceInfo = findDeviceInfoLocked(id, /*minVersion*/ {3,0}, /*maxVersion*/ {5,0});
3165     if (deviceInfo != nullptr) {
3166         return deviceInfo->getCameraCharacteristics(overrideForPerfClass, characteristics);
3167     }
3168 
3169     // Find hidden physical camera characteristics
3170     for (auto& provider : mProviders) {
3171         for (auto& deviceInfo : provider->mDevices) {
3172             status_t res = deviceInfo->getPhysicalCameraCharacteristics(id, characteristics);
3173             if (res != NAME_NOT_FOUND) return res;
3174         }
3175     }
3176 
3177     return NAME_NOT_FOUND;
3178 }
3179 
filterLogicalCameraIdsLocked(std::vector<std::string> & deviceIds) const3180 void CameraProviderManager::filterLogicalCameraIdsLocked(
3181         std::vector<std::string>& deviceIds) const
3182 {
3183     // Map between camera facing and camera IDs related to logical camera.
3184     std::map<int, std::unordered_set<std::string>> idCombos;
3185 
3186     // Collect all logical and its underlying physical camera IDs for each
3187     // facing.
3188     for (auto& deviceId : deviceIds) {
3189         auto deviceInfo = findDeviceInfoLocked(deviceId);
3190         if (deviceInfo == nullptr) continue;
3191 
3192         if (!deviceInfo->mIsLogicalCamera) {
3193             continue;
3194         }
3195 
3196         // combo contains the ids of a logical camera and its physical cameras
3197         std::vector<std::string> combo = deviceInfo->mPhysicalIds;
3198         combo.push_back(deviceId);
3199 
3200         hardware::CameraInfo info;
3201         status_t res = deviceInfo->getCameraInfo(&info);
3202         if (res != OK) {
3203             ALOGE("%s: Error reading camera info: %s (%d)", __FUNCTION__, strerror(-res), res);
3204             continue;
3205         }
3206         idCombos[info.facing].insert(combo.begin(), combo.end());
3207     }
3208 
3209     // Only expose one camera ID per facing for all logical and underlying
3210     // physical camera IDs.
3211     for (auto& r : idCombos) {
3212         auto& removedIds = r.second;
3213         for (auto& id : deviceIds) {
3214             auto foundId = std::find(removedIds.begin(), removedIds.end(), id);
3215             if (foundId == removedIds.end()) {
3216                 continue;
3217             }
3218 
3219             removedIds.erase(foundId);
3220             break;
3221         }
3222         deviceIds.erase(std::remove_if(deviceIds.begin(), deviceIds.end(),
3223                 [&removedIds](const std::string& s) {
3224                 return removedIds.find(s) != removedIds.end();}),
3225                 deviceIds.end());
3226     }
3227 }
3228 
3229 } // namespace android
3230