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 <aidl/android/hardware/camera/device/ICameraDevice.h>
24 
25 #include <algorithm>
26 #include <chrono>
27 #include "common/DepthPhotoProcessor.h"
28 #include "hidl/HidlProviderInfo.h"
29 #include "aidl/AidlProviderInfo.h"
30 #include <dlfcn.h>
31 #include <future>
32 #include <inttypes.h>
33 #include <android/binder_manager.h>
34 #include <android/hidl/manager/1.2/IServiceManager.h>
35 #include <hidl/ServiceManagement.h>
36 #include <functional>
37 #include <camera_metadata_hidden.h>
38 #include <android-base/parseint.h>
39 #include <android-base/logging.h>
40 #include <cutils/properties.h>
41 #include <hwbinder/IPCThreadState.h>
42 #include <utils/Trace.h>
43 
44 #include "api2/HeicCompositeStream.h"
45 #include "device3/ZoomRatioMapper.h"
46 
47 namespace android {
48 
49 using namespace ::android::hardware::camera;
50 using namespace ::android::camera3;
51 using android::hardware::camera::common::V1_0::Status;
52 using namespace camera3::SessionConfigurationUtils;
53 using std::literals::chrono_literals::operator""s;
54 using hardware::camera2::utils::CameraIdAndSessionConfiguration;
55 
56 namespace {
57 const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
58 const std::string kExternalProviderName = "external/0";
59 } // anonymous namespace
60 
61 const float CameraProviderManager::kDepthARTolerance = .1f;
62 
63 CameraProviderManager::HidlServiceInteractionProxyImpl
64 CameraProviderManager::sHidlServiceInteractionProxy{};
65 
~CameraProviderManager()66 CameraProviderManager::~CameraProviderManager() {
67 }
68 
FrameworkTorchStatusToString(const TorchModeStatus & s)69 const char* FrameworkTorchStatusToString(const TorchModeStatus& s) {
70     switch (s) {
71         case TorchModeStatus::NOT_AVAILABLE:
72             return "NOT_AVAILABLE";
73         case TorchModeStatus::AVAILABLE_OFF:
74             return "AVAILABLE_OFF";
75         case TorchModeStatus::AVAILABLE_ON:
76             return "AVAILABLE_ON";
77     }
78     ALOGW("Unexpected HAL torch mode status code %d", s);
79     return "UNKNOWN_STATUS";
80 }
81 
FrameworkDeviceStatusToString(const CameraDeviceStatus & s)82 const char* FrameworkDeviceStatusToString(const CameraDeviceStatus& s) {
83     switch (s) {
84         case CameraDeviceStatus::NOT_PRESENT:
85             return "NOT_PRESENT";
86         case CameraDeviceStatus::PRESENT:
87             return "PRESENT";
88         case CameraDeviceStatus::ENUMERATING:
89             return "ENUMERATING";
90     }
91     ALOGW("Unexpected HAL device status code %d", s);
92     return "UNKNOWN_STATUS";
93 }
94 
95 hardware::hidl_vec<hardware::hidl_string>
listServices()96 CameraProviderManager::HidlServiceInteractionProxyImpl::listServices() {
97     hardware::hidl_vec<hardware::hidl_string> ret;
98     auto manager = hardware::defaultServiceManager1_2();
99     if (manager != nullptr) {
100         manager->listManifestByInterface(provider::V2_4::ICameraProvider::descriptor,
101                 [&ret](const hardware::hidl_vec<hardware::hidl_string> ®istered) {
102                     ret = registered;
103                 });
104     }
105     return ret;
106 }
107 
tryToInitAndAddHidlProvidersLocked(HidlServiceInteractionProxy * hidlProxy)108 status_t CameraProviderManager::tryToInitAndAddHidlProvidersLocked(
109         HidlServiceInteractionProxy *hidlProxy) {
110     mHidlServiceProxy = hidlProxy;
111     // Registering will trigger notifications for all already-known providers
112     bool success = mHidlServiceProxy->registerForNotifications(
113         /* instance name, empty means no filter */ "",
114         this);
115     if (!success) {
116         ALOGE("%s: Unable to register with hardware service manager for notifications "
117                 "about camera providers", __FUNCTION__);
118         return INVALID_OPERATION;
119     }
120 
121     for (const auto& instance : mHidlServiceProxy->listServices()) {
122         this->addHidlProviderLocked(instance);
123     }
124     return OK;
125 }
126 
getFullAidlProviderName(const std::string instance)127 static std::string getFullAidlProviderName(const std::string instance) {
128     std::string aidlHalServiceDescriptor =
129             std::string(aidl::android::hardware::camera::provider::ICameraProvider::descriptor);
130    return aidlHalServiceDescriptor + "/" + instance;
131 }
132 
tryToAddAidlProvidersLocked()133 status_t CameraProviderManager::tryToAddAidlProvidersLocked() {
134     const char * aidlHalServiceDescriptor =
135             aidl::android::hardware::camera::provider::ICameraProvider::descriptor;
136     auto sm = defaultServiceManager();
137     auto aidlProviders = sm->getDeclaredInstances(
138             String16(aidlHalServiceDescriptor));
139     for (const auto &aidlInstance : aidlProviders) {
140         std::string aidlServiceName =
141                 getFullAidlProviderName(std::string(String8(aidlInstance).c_str()));
142         auto res = sm->registerForNotifications(String16(aidlServiceName.c_str()), this);
143         if (res != OK) {
144             ALOGE("%s Unable to register for notifications with AIDL service manager",
145                     __FUNCTION__);
146             return res;
147         }
148         addAidlProviderLocked(aidlServiceName);
149     }
150     return OK;
151 }
152 
initialize(wp<CameraProviderManager::StatusListener> listener,HidlServiceInteractionProxy * hidlProxy)153 status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
154         HidlServiceInteractionProxy* hidlProxy) {
155     std::lock_guard<std::mutex> lock(mInterfaceMutex);
156     if (hidlProxy == nullptr) {
157         ALOGE("%s: No valid service interaction proxy provided", __FUNCTION__);
158         return BAD_VALUE;
159     }
160     mListener = listener;
161     mDeviceState = 0;
162     auto res = tryToInitAndAddHidlProvidersLocked(hidlProxy);
163     if (res != OK) {
164         // Logging done in called function;
165         return res;
166     }
167     res = tryToAddAidlProvidersLocked();
168 
169     IPCThreadState::self()->flushCommands();
170 
171     return res;
172 }
173 
getCameraCount() const174 std::pair<int, int> CameraProviderManager::getCameraCount() const {
175     std::lock_guard<std::mutex> lock(mInterfaceMutex);
176     int systemCameraCount = 0;
177     int publicCameraCount = 0;
178     for (auto& provider : mProviders) {
179         for (auto &id : provider->mUniqueCameraIds) {
180             SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
181             if (getSystemCameraKindLocked(id, &deviceKind) != OK) {
182                 ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, id.c_str());
183                 continue;
184             }
185             switch(deviceKind) {
186                 case SystemCameraKind::PUBLIC:
187                     publicCameraCount++;
188                     break;
189                 case SystemCameraKind::SYSTEM_ONLY_CAMERA:
190                     systemCameraCount++;
191                     break;
192                 default:
193                     break;
194             }
195         }
196     }
197     return std::make_pair(systemCameraCount, publicCameraCount);
198 }
199 
getCameraDeviceIds(std::unordered_map<std::string,std::set<std::string>> * unavailablePhysicalIds) const200 std::vector<std::string> CameraProviderManager::getCameraDeviceIds(std::unordered_map<
201             std::string, std::set<std::string>>* unavailablePhysicalIds) const {
202     std::lock_guard<std::mutex> lock(mInterfaceMutex);
203     std::vector<std::string> deviceIds;
204     for (auto& provider : mProviders) {
205         for (auto& id : provider->mUniqueCameraIds) {
206             deviceIds.push_back(id);
207             if (unavailablePhysicalIds != nullptr &&
208                     provider->mUnavailablePhysicalCameras.count(id) > 0) {
209                 (*unavailablePhysicalIds)[id] = provider->mUnavailablePhysicalCameras.at(id);
210             }
211         }
212     }
213     return deviceIds;
214 }
215 
collectDeviceIdsLocked(const std::vector<std::string> deviceIds,std::vector<std::string> & publicDeviceIds,std::vector<std::string> & systemDeviceIds) const216 void CameraProviderManager::collectDeviceIdsLocked(const std::vector<std::string> deviceIds,
217         std::vector<std::string>& publicDeviceIds,
218         std::vector<std::string>& systemDeviceIds) const {
219     for (auto &deviceId : deviceIds) {
220         SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
221         if (getSystemCameraKindLocked(deviceId, &deviceKind) != OK) {
222             ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, deviceId.c_str());
223             continue;
224         }
225         if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA) {
226             systemDeviceIds.push_back(deviceId);
227         } else {
228             publicDeviceIds.push_back(deviceId);
229         }
230     }
231 }
232 
getAPI1CompatibleCameraDeviceIds() const233 std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const {
234     std::lock_guard<std::mutex> lock(mInterfaceMutex);
235     std::vector<std::string> publicDeviceIds;
236     std::vector<std::string> systemDeviceIds;
237     std::vector<std::string> deviceIds;
238     for (auto& provider : mProviders) {
239         std::vector<std::string> providerDeviceIds = provider->mUniqueAPI1CompatibleCameraIds;
240         // Secure cameras should not be exposed through camera 1 api
241         providerDeviceIds.erase(std::remove_if(providerDeviceIds.begin(), providerDeviceIds.end(),
242                 [this](const std::string& s) {
243                 SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
244                 if (getSystemCameraKindLocked(s, &deviceKind) != OK) {
245                     ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, s.c_str());
246                     return true;
247                 }
248                 return deviceKind == SystemCameraKind::HIDDEN_SECURE_CAMERA;}),
249                 providerDeviceIds.end());
250         // API1 app doesn't handle logical and physical camera devices well. So
251         // for each camera facing, only take the first id advertised by HAL in
252         // all [logical, physical1, physical2, ...] id combos, and filter out the rest.
253         filterLogicalCameraIdsLocked(providerDeviceIds);
254         collectDeviceIdsLocked(providerDeviceIds, publicDeviceIds, systemDeviceIds);
255     }
256     auto sortFunc =
257             [](const std::string& a, const std::string& b) -> bool {
258                 uint32_t aUint = 0, bUint = 0;
259                 bool aIsUint = base::ParseUint(a, &aUint);
260                 bool bIsUint = base::ParseUint(b, &bUint);
261 
262                 // Uint device IDs first
263                 if (aIsUint && bIsUint) {
264                     return aUint < bUint;
265                 } else if (aIsUint) {
266                     return true;
267                 } else if (bIsUint) {
268                     return false;
269                 }
270                 // Simple string compare if both id are not uint
271                 return a < b;
272             };
273     // We put device ids for system cameras at the end since they will be pared
274     // off for processes not having system camera permissions.
275     std::sort(publicDeviceIds.begin(), publicDeviceIds.end(), sortFunc);
276     std::sort(systemDeviceIds.begin(), systemDeviceIds.end(), sortFunc);
277     deviceIds.insert(deviceIds.end(), publicDeviceIds.begin(), publicDeviceIds.end());
278     deviceIds.insert(deviceIds.end(), systemDeviceIds.begin(), systemDeviceIds.end());
279     return deviceIds;
280 }
281 
isValidDeviceLocked(const std::string & id,uint16_t majorVersion,IPCTransport transport) const282 bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion,
283         IPCTransport transport) const {
284     for (auto& provider : mProviders) {
285         IPCTransport providerTransport = provider->getIPCTransport();
286         for (auto& deviceInfo : provider->mDevices) {
287             if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion &&
288                     transport == providerTransport) {
289                 return true;
290             }
291         }
292     }
293     return false;
294 }
295 
hasFlashUnit(const std::string & id) const296 bool CameraProviderManager::hasFlashUnit(const std::string &id) const {
297     std::lock_guard<std::mutex> lock(mInterfaceMutex);
298 
299     auto deviceInfo = findDeviceInfoLocked(id);
300     if (deviceInfo == nullptr) return false;
301 
302     return deviceInfo->hasFlashUnit();
303 }
304 
supportNativeZoomRatio(const std::string & id) const305 bool CameraProviderManager::supportNativeZoomRatio(const std::string &id) const {
306     std::lock_guard<std::mutex> lock(mInterfaceMutex);
307 
308     auto deviceInfo = findDeviceInfoLocked(id);
309     if (deviceInfo == nullptr) return false;
310 
311     return deviceInfo->supportNativeZoomRatio();
312 }
313 
getResourceCost(const std::string & id,CameraResourceCost * cost) const314 status_t CameraProviderManager::getResourceCost(const std::string &id,
315         CameraResourceCost* cost) const {
316     std::lock_guard<std::mutex> lock(mInterfaceMutex);
317 
318     auto deviceInfo = findDeviceInfoLocked(id);
319     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
320 
321     *cost = deviceInfo->mResourceCost;
322     return OK;
323 }
324 
getCameraInfo(const std::string & id,bool overrideToPortrait,int * portraitRotation,hardware::CameraInfo * info) const325 status_t CameraProviderManager::getCameraInfo(const std::string &id,
326         bool overrideToPortrait, int *portraitRotation, hardware::CameraInfo* info) const {
327     std::lock_guard<std::mutex> lock(mInterfaceMutex);
328 
329     auto deviceInfo = findDeviceInfoLocked(id);
330     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
331 
332     return deviceInfo->getCameraInfo(overrideToPortrait, portraitRotation, info);
333 }
334 
isSessionConfigurationSupported(const std::string & id,const SessionConfiguration & configuration,bool overrideForPerfClass,metadataGetter getMetadata,bool * status) const335 status_t CameraProviderManager::isSessionConfigurationSupported(const std::string& id,
336         const SessionConfiguration &configuration, bool overrideForPerfClass,
337         metadataGetter getMetadata, bool *status /*out*/) const {
338     std::lock_guard<std::mutex> lock(mInterfaceMutex);
339     auto deviceInfo = findDeviceInfoLocked(id);
340     if (deviceInfo == nullptr) {
341         return NAME_NOT_FOUND;
342     }
343 
344     return deviceInfo->isSessionConfigurationSupported(configuration,
345             overrideForPerfClass, getMetadata, status);
346 }
347 
getCameraIdIPCTransport(const std::string & id,IPCTransport * providerTransport) const348 status_t CameraProviderManager::getCameraIdIPCTransport(const std::string &id,
349         IPCTransport *providerTransport) const {
350     std::lock_guard<std::mutex> lock(mInterfaceMutex);
351     auto deviceInfo = findDeviceInfoLocked(id);
352     if (deviceInfo == nullptr) {
353         return NAME_NOT_FOUND;
354     }
355     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
356     if (parentProvider == nullptr) {
357         return DEAD_OBJECT;
358     }
359     *providerTransport = parentProvider->getIPCTransport();
360     return OK;
361 }
362 
getCameraCharacteristics(const std::string & id,bool overrideForPerfClass,CameraMetadata * characteristics,bool overrideToPortrait) const363 status_t CameraProviderManager::getCameraCharacteristics(const std::string &id,
364         bool overrideForPerfClass, CameraMetadata* characteristics,
365         bool overrideToPortrait) const {
366     std::lock_guard<std::mutex> lock(mInterfaceMutex);
367     return getCameraCharacteristicsLocked(id, overrideForPerfClass, characteristics,
368             overrideToPortrait);
369 }
370 
getHighestSupportedVersion(const std::string & id,hardware::hidl_version * v,IPCTransport * transport)371 status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id,
372         hardware::hidl_version *v, IPCTransport *transport) {
373     if (v == nullptr || transport == nullptr) {
374         return BAD_VALUE;
375     }
376     std::lock_guard<std::mutex> lock(mInterfaceMutex);
377 
378     hardware::hidl_version maxVersion{0,0};
379     bool found = false;
380     IPCTransport providerTransport = IPCTransport::INVALID;
381     for (auto& provider : mProviders) {
382         for (auto& deviceInfo : provider->mDevices) {
383             if (deviceInfo->mId == id) {
384                 if (deviceInfo->mVersion > maxVersion) {
385                     maxVersion = deviceInfo->mVersion;
386                     providerTransport = provider->getIPCTransport();
387                     found = true;
388                 }
389             }
390         }
391     }
392     if (!found || providerTransport == IPCTransport::INVALID) {
393         return NAME_NOT_FOUND;
394     }
395     *v = maxVersion;
396     *transport = providerTransport;
397     return OK;
398 }
399 
getTorchStrengthLevel(const std::string & id,int32_t * torchStrength)400 status_t CameraProviderManager::getTorchStrengthLevel(const std::string &id,
401         int32_t* torchStrength /*out*/) {
402     std::lock_guard<std::mutex> lock(mInterfaceMutex);
403 
404     auto deviceInfo = findDeviceInfoLocked(id);
405     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
406 
407     return deviceInfo->getTorchStrengthLevel(torchStrength);
408 }
409 
turnOnTorchWithStrengthLevel(const std::string & id,int32_t torchStrength)410 status_t CameraProviderManager::turnOnTorchWithStrengthLevel(const std::string &id,
411         int32_t torchStrength) {
412     std::lock_guard<std::mutex> lock(mInterfaceMutex);
413 
414     auto deviceInfo = findDeviceInfoLocked(id);
415     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
416 
417     return deviceInfo->turnOnTorchWithStrengthLevel(torchStrength);
418 }
419 
shouldSkipTorchStrengthUpdate(const std::string & id,int32_t torchStrength) const420 bool CameraProviderManager::shouldSkipTorchStrengthUpdate(const std::string &id,
421         int32_t torchStrength) const {
422     std::lock_guard<std::mutex> lock(mInterfaceMutex);
423 
424     auto deviceInfo = findDeviceInfoLocked(id);
425     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
426 
427     if (deviceInfo->mTorchStrengthLevel == torchStrength) {
428         ALOGV("%s: Skipping torch strength level updates prev_level: %d, new_level: %d",
429                 __FUNCTION__, deviceInfo->mTorchStrengthLevel, torchStrength);
430         return true;
431     }
432     return false;
433 }
434 
getTorchDefaultStrengthLevel(const std::string & id) const435 int32_t CameraProviderManager::getTorchDefaultStrengthLevel(const std::string &id) const {
436     std::lock_guard<std::mutex> lock(mInterfaceMutex);
437 
438     auto deviceInfo = findDeviceInfoLocked(id);
439     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
440 
441     return deviceInfo->mTorchDefaultStrengthLevel;
442 }
443 
supportSetTorchMode(const std::string & id) const444 bool CameraProviderManager::supportSetTorchMode(const std::string &id) const {
445     std::lock_guard<std::mutex> lock(mInterfaceMutex);
446     for (auto& provider : mProviders) {
447         for (auto& deviceInfo : provider->mDevices) {
448             if (deviceInfo->mId == id) {
449                 return provider->mSetTorchModeSupported;
450             }
451         }
452     }
453     return false;
454 }
455 
456 template <class ProviderInfoType, class HalCameraProviderType>
setTorchModeT(sp<ProviderInfo> & parentProvider,std::shared_ptr<HalCameraProvider> * halCameraProvider)457 status_t CameraProviderManager::setTorchModeT(sp<ProviderInfo> &parentProvider,
458         std::shared_ptr<HalCameraProvider> *halCameraProvider) {
459     if (halCameraProvider == nullptr) {
460         return BAD_VALUE;
461     }
462     ProviderInfoType *idlProviderInfo = static_cast<ProviderInfoType *>(parentProvider.get());
463     auto idlInterface = idlProviderInfo->startProviderInterface();
464     if (idlInterface == nullptr) {
465         return DEAD_OBJECT;
466     }
467     *halCameraProvider =
468             std::make_shared<HalCameraProviderType>(idlInterface, idlInterface->descriptor);
469     return OK;
470 }
471 
setTorchMode(const std::string & id,bool enabled)472 status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) {
473     std::lock_guard<std::mutex> lock(mInterfaceMutex);
474 
475     auto deviceInfo = findDeviceInfoLocked(id);
476     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
477 
478     // Pass the camera ID to start interface so that it will save it to the map of ICameraProviders
479     // that are currently in use.
480     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
481     if (parentProvider == nullptr) {
482         return DEAD_OBJECT;
483     }
484     std::shared_ptr<HalCameraProvider> halCameraProvider = nullptr;
485     IPCTransport providerTransport = parentProvider->getIPCTransport();
486     status_t res = OK;
487     if (providerTransport == IPCTransport::HIDL) {
488         res = setTorchModeT<HidlProviderInfo, HidlHalCameraProvider>(parentProvider,
489                 &halCameraProvider);
490         if (res != OK) {
491             return res;
492         }
493     } else if (providerTransport == IPCTransport::AIDL) {
494         res = setTorchModeT<AidlProviderInfo, AidlHalCameraProvider>(parentProvider,
495                 &halCameraProvider);
496         if (res != OK) {
497             return res;
498         }
499     } else {
500         ALOGE("%s Invalid provider transport", __FUNCTION__);
501         return INVALID_OPERATION;
502     }
503     saveRef(DeviceMode::TORCH, deviceInfo->mId, halCameraProvider);
504 
505     return deviceInfo->setTorchMode(enabled);
506 }
507 
setUpVendorTags()508 status_t CameraProviderManager::setUpVendorTags() {
509     sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
510 
511     for (auto& provider : mProviders) {
512         tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor);
513     }
514 
515     VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);
516 
517     return OK;
518 }
519 
startExternalLazyProvider() const520 sp<CameraProviderManager::ProviderInfo> CameraProviderManager::startExternalLazyProvider() const {
521     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
522     std::lock_guard<std::mutex> lock(mInterfaceMutex);
523 
524     for (const auto& providerInfo : mProviders) {
525         if (providerInfo->isExternalLazyHAL()) {
526             if (!providerInfo->successfullyStartedProviderInterface()) {
527                 return nullptr;
528             } else {
529                 return providerInfo;
530             }
531         }
532     }
533     return nullptr;
534 }
535 
notifyUsbDeviceEvent(int32_t eventId,const std::string & usbDeviceId)536 status_t CameraProviderManager::notifyUsbDeviceEvent(int32_t eventId,
537                                                      const std::string& usbDeviceId) {
538     if (!kEnableLazyHal) {
539         return OK;
540     }
541 
542     ALOGV("notifySystemEvent: %d usbDeviceId : %s", eventId, usbDeviceId.c_str());
543 
544     if (eventId == android::hardware::ICameraService::EVENT_USB_DEVICE_ATTACHED) {
545         sp<ProviderInfo> externalProvider = startExternalLazyProvider();
546         if (externalProvider != nullptr) {
547             auto usbDevices = mExternalUsbDevicesForProvider.first;
548             usbDevices.push_back(usbDeviceId);
549             mExternalUsbDevicesForProvider = {usbDevices, externalProvider};
550         }
551     } else if (eventId
552           == android::hardware::ICameraService::EVENT_USB_DEVICE_DETACHED) {
553         usbDeviceDetached(usbDeviceId);
554     }
555 
556     return OK;
557 }
558 
usbDeviceDetached(const std::string & usbDeviceId)559 status_t CameraProviderManager::usbDeviceDetached(const std::string &usbDeviceId) {
560     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
561     std::lock_guard<std::mutex> interfaceLock(mInterfaceMutex);
562 
563     auto usbDevices = mExternalUsbDevicesForProvider.first;
564     auto foundId = std::find(usbDevices.begin(), usbDevices.end(), usbDeviceId);
565     if (foundId != usbDevices.end()) {
566         sp<ProviderInfo> providerInfo = mExternalUsbDevicesForProvider.second;
567         if (providerInfo == nullptr) {
568               ALOGE("%s No valid external provider for USB device: %s",
569                     __FUNCTION__,
570                     usbDeviceId.c_str());
571               mExternalUsbDevicesForProvider = {std::vector<std::string>(), nullptr};
572               return DEAD_OBJECT;
573         } else {
574             mInterfaceMutex.unlock();
575             providerInfo->removeAllDevices();
576             mInterfaceMutex.lock();
577             mExternalUsbDevicesForProvider = {std::vector<std::string>(), nullptr};
578         }
579     } else {
580         return DEAD_OBJECT;
581     }
582     return OK;
583 }
584 
notifyDeviceStateChange(int64_t newState)585 status_t CameraProviderManager::notifyDeviceStateChange(int64_t newState) {
586     std::lock_guard<std::mutex> lock(mInterfaceMutex);
587     mDeviceState = newState;
588     status_t res = OK;
589     for (auto& provider : mProviders) {
590         ALOGV("%s: Notifying %s for new state 0x%" PRIx64,
591                 __FUNCTION__, provider->mProviderName.c_str(), newState);
592         // b/199240726 Camera providers can for example try to add/remove
593         // camera devices as part of the state change notification. Holding
594         // 'mInterfaceMutex' while calling 'notifyDeviceStateChange' can
595         // result in a recursive deadlock.
596         mInterfaceMutex.unlock();
597         status_t singleRes = provider->notifyDeviceStateChange(mDeviceState);
598         mInterfaceMutex.lock();
599         if (singleRes != OK) {
600             ALOGE("%s: Unable to notify provider %s about device state change",
601                     __FUNCTION__,
602                     provider->mProviderName.c_str());
603             res = singleRes;
604             // continue to do the rest of the providers instead of returning now
605         }
606         provider->notifyDeviceInfoStateChangeLocked(mDeviceState);
607     }
608     return res;
609 }
610 
openAidlSession(const std::string & id,const std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceCallback> & callback,std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> * session)611 status_t CameraProviderManager::openAidlSession(const std::string &id,
612         const std::shared_ptr<
613                 aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback,
614         /*out*/
615         std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> *session) {
616 
617     std::lock_guard<std::mutex> lock(mInterfaceMutex);
618 
619     auto deviceInfo = findDeviceInfoLocked(id);
620     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
621 
622     auto *aidlDeviceInfo3 = static_cast<AidlProviderInfo::AidlDeviceInfo3*>(deviceInfo);
623     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
624     if (parentProvider == nullptr) {
625         return DEAD_OBJECT;
626     }
627     auto provider =
628             static_cast<AidlProviderInfo *>(parentProvider.get())->startProviderInterface();
629     if (provider == nullptr) {
630         return DEAD_OBJECT;
631     }
632     std::shared_ptr<HalCameraProvider> halCameraProvider =
633             std::make_shared<AidlHalCameraProvider>(provider, provider->descriptor);
634     saveRef(DeviceMode::CAMERA, id, halCameraProvider);
635 
636     auto interface = aidlDeviceInfo3->startDeviceInterface();
637     if (interface == nullptr) {
638         removeRef(DeviceMode::CAMERA, id);
639         return DEAD_OBJECT;
640     }
641 
642     auto ret = interface->open(callback, session);
643     if (!ret.isOk()) {
644         removeRef(DeviceMode::CAMERA, id);
645         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
646                 __FUNCTION__, id.c_str(), ret.getMessage());
647         return AidlProviderInfo::mapToStatusT(ret);
648     }
649     return OK;
650 }
651 
openAidlInjectionSession(const std::string & id,const std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceCallback> & callback,std::shared_ptr<aidl::android::hardware::camera::device::ICameraInjectionSession> * session)652 status_t CameraProviderManager::openAidlInjectionSession(const std::string &id,
653         const std::shared_ptr<
654                 aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback,
655         /*out*/
656         std::shared_ptr<
657                 aidl::android::hardware::camera::device::ICameraInjectionSession> *session) {
658 
659     std::lock_guard<std::mutex> lock(mInterfaceMutex);
660 
661     auto deviceInfo = findDeviceInfoLocked(id);
662     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
663 
664     auto *aidlDeviceInfo3 = static_cast<AidlProviderInfo::AidlDeviceInfo3*>(deviceInfo);
665     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
666     if (parentProvider == nullptr) {
667         return DEAD_OBJECT;
668     }
669     auto provider =
670             static_cast<AidlProviderInfo *>(parentProvider.get())->startProviderInterface();
671     if (provider == nullptr) {
672         return DEAD_OBJECT;
673     }
674     std::shared_ptr<HalCameraProvider> halCameraProvider =
675             std::make_shared<AidlHalCameraProvider>(provider, provider->descriptor);
676     saveRef(DeviceMode::CAMERA, id, halCameraProvider);
677 
678     auto interface = aidlDeviceInfo3->startDeviceInterface();
679     if (interface == nullptr) {
680         return DEAD_OBJECT;
681     }
682 
683     auto ret = interface->openInjectionSession(callback, session);
684     if (!ret.isOk()) {
685         removeRef(DeviceMode::CAMERA, id);
686         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
687                 __FUNCTION__, id.c_str(), ret.getMessage());
688         return DEAD_OBJECT;
689     }
690     return OK;
691 }
692 
openHidlSession(const std::string & id,const sp<device::V3_2::ICameraDeviceCallback> & callback,sp<device::V3_2::ICameraDeviceSession> * session)693 status_t CameraProviderManager::openHidlSession(const std::string &id,
694         const sp<device::V3_2::ICameraDeviceCallback>& callback,
695         /*out*/
696         sp<device::V3_2::ICameraDeviceSession> *session) {
697 
698     std::lock_guard<std::mutex> lock(mInterfaceMutex);
699 
700     auto deviceInfo = findDeviceInfoLocked(id);
701     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
702 
703     auto *hidlDeviceInfo3 = static_cast<HidlProviderInfo::HidlDeviceInfo3*>(deviceInfo);
704     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
705     if (parentProvider == nullptr) {
706         return DEAD_OBJECT;
707     }
708     const sp<provider::V2_4::ICameraProvider> provider =
709             static_cast<HidlProviderInfo *>(parentProvider.get())->startProviderInterface();
710     if (provider == nullptr) {
711         return DEAD_OBJECT;
712     }
713     std::shared_ptr<HalCameraProvider> halCameraProvider =
714             std::make_shared<HidlHalCameraProvider>(provider, provider->descriptor);
715     saveRef(DeviceMode::CAMERA, id, halCameraProvider);
716 
717     Status status;
718     hardware::Return<void> ret;
719     auto interface = hidlDeviceInfo3->startDeviceInterface();
720     if (interface == nullptr) {
721         return DEAD_OBJECT;
722     }
723 
724     ret = interface->open(callback, [&status, &session]
725             (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {
726                 status = s;
727                 if (status == Status::OK) {
728                     *session = cameraSession;
729                 }
730             });
731     if (!ret.isOk()) {
732         removeRef(DeviceMode::CAMERA, id);
733         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
734                 __FUNCTION__, id.c_str(), ret.description().c_str());
735         return DEAD_OBJECT;
736     }
737     return HidlProviderInfo::mapToStatusT(status);
738 }
739 
saveRef(DeviceMode usageType,const std::string & cameraId,std::shared_ptr<HalCameraProvider> provider)740 void CameraProviderManager::saveRef(DeviceMode usageType, const std::string &cameraId,
741         std::shared_ptr<HalCameraProvider> provider) {
742     if (!kEnableLazyHal) {
743         return;
744     }
745     ALOGV("Saving camera provider %s for camera device %s", provider->mDescriptor.c_str(),
746               cameraId.c_str());
747     std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock);
748     std::unordered_map<std::string, std::shared_ptr<HalCameraProvider>> *primaryMap, *alternateMap;
749     if (usageType == DeviceMode::TORCH) {
750         primaryMap = &mTorchProviderByCameraId;
751         alternateMap = &mCameraProviderByCameraId;
752     } else {
753         primaryMap = &mCameraProviderByCameraId;
754         alternateMap = &mTorchProviderByCameraId;
755     }
756     auto id = cameraId.c_str();
757     (*primaryMap)[id] = provider;
758     auto search = alternateMap->find(id);
759     if (search != alternateMap->end()) {
760         ALOGW("%s: Camera device %s is using both torch mode and camera mode simultaneously. "
761                 "That should not be possible", __FUNCTION__, id);
762     }
763     ALOGV("%s: Camera device %s connected", __FUNCTION__, id);
764 }
765 
removeRef(DeviceMode usageType,const std::string & cameraId)766 void CameraProviderManager::removeRef(DeviceMode usageType, const std::string &cameraId) {
767     if (!kEnableLazyHal) {
768         return;
769     }
770     ALOGV("Removing camera device %s", cameraId.c_str());
771     std::unordered_map<std::string, std::shared_ptr<HalCameraProvider>> *providerMap;
772     if (usageType == DeviceMode::TORCH) {
773         providerMap = &mTorchProviderByCameraId;
774     } else {
775         providerMap = &mCameraProviderByCameraId;
776     }
777     std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock);
778     auto search = providerMap->find(cameraId.c_str());
779     if (search != providerMap->end()) {
780         // Drop the reference to this ICameraProvider. This is safe to do immediately (without an
781         // added delay) because hwservicemanager guarantees to hold the reference for at least five
782         // more seconds.  We depend on this behavior so that if the provider is unreferenced and
783         // then referenced again quickly, we do not let the HAL exit and then need to immediately
784         // restart it. An example when this could happen is switching from a front-facing to a
785         // rear-facing camera. If the HAL were to exit during the camera switch, the camera could
786         // appear janky to the user.
787         providerMap->erase(cameraId.c_str());
788         IPCThreadState::self()->flushCommands();
789     } else {
790         ALOGE("%s: Asked to remove reference for camera %s, but no reference to it was found. This "
791                 "could mean removeRef was called twice for the same camera ID.", __FUNCTION__,
792                 cameraId.c_str());
793     }
794 }
795 
796 // We ignore sp<IBinder> param here since we need std::shared_ptr<...> which
797 // will be retrieved through the ndk api through addAidlProviderLocked ->
798 // tryToInitializeAidlProvider.
onServiceRegistration(const String16 & name,const sp<IBinder> &)799 void CameraProviderManager::onServiceRegistration(const String16 &name, const sp<IBinder>&) {
800     status_t res = OK;
801     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
802     {
803         std::lock_guard<std::mutex> lock(mInterfaceMutex);
804 
805         res = addAidlProviderLocked(String8(name).c_str());
806     }
807 
808     sp<StatusListener> listener = getStatusListener();
809     if (nullptr != listener.get() && res == OK) {
810         listener->onNewProviderRegistered();
811     }
812 
813     IPCThreadState::self()->flushCommands();
814 }
815 
onRegistration(const hardware::hidl_string &,const hardware::hidl_string & name,bool preexisting)816 hardware::Return<void> CameraProviderManager::onRegistration(
817         const hardware::hidl_string& /*fqName*/,
818         const hardware::hidl_string& name,
819         bool preexisting) {
820     status_t res = OK;
821     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
822     {
823         std::lock_guard<std::mutex> lock(mInterfaceMutex);
824 
825         res = addHidlProviderLocked(name, preexisting);
826     }
827 
828     sp<StatusListener> listener = getStatusListener();
829     if (nullptr != listener.get() && res == OK) {
830         listener->onNewProviderRegistered();
831     }
832 
833     IPCThreadState::self()->flushCommands();
834 
835     return hardware::Return<void>();
836 }
837 
dump(int fd,const Vector<String16> & args)838 status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) {
839     std::lock_guard<std::mutex> lock(mInterfaceMutex);
840 
841     for (auto& provider : mProviders) {
842         provider->dump(fd, args);
843     }
844     return OK;
845 }
846 
initializeProviderInfoCommon(const std::vector<std::string> & devices)847 void CameraProviderManager::ProviderInfo::initializeProviderInfoCommon(
848         const std::vector<std::string> &devices) {
849     for (auto& device : devices) {
850         std::string id;
851         status_t res = addDevice(device, CameraDeviceStatus::PRESENT, &id);
852         if (res != OK) {
853             ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
854                     __FUNCTION__, device.c_str(), strerror(-res), res);
855             continue;
856         }
857     }
858 
859     ALOGI("Camera provider %s ready with %zu camera devices",
860             mProviderName.c_str(), mDevices.size());
861 
862     // Process cached status callbacks
863     {
864         std::lock_guard<std::mutex> lock(mInitLock);
865 
866         for (auto& statusInfo : mCachedStatus) {
867             std::string id, physicalId;
868             if (statusInfo.isPhysicalCameraStatus) {
869                 physicalCameraDeviceStatusChangeLocked(&id, &physicalId,
870                     statusInfo.cameraId, statusInfo.physicalCameraId, statusInfo.status);
871             } else {
872                 cameraDeviceStatusChangeLocked(&id, statusInfo.cameraId, statusInfo.status);
873             }
874         }
875         mCachedStatus.clear();
876 
877         mInitialized = true;
878     }
879 }
880 
findDeviceInfoLocked(const std::string & id) const881 CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked(
882         const std::string& id) const {
883     for (auto& provider : mProviders) {
884         using hardware::hidl_version;
885         IPCTransport transport = provider->getIPCTransport();
886         // AIDL min version starts at major: 1 minor: 1
887         hidl_version minVersion =
888                 (transport == IPCTransport::HIDL) ? hidl_version{3, 2} : hidl_version{1, 1} ;
889         hidl_version maxVersion =
890                 (transport == IPCTransport::HIDL) ? hidl_version{3, 7} : hidl_version{1000, 0};
891 
892         for (auto& deviceInfo : provider->mDevices) {
893             if (deviceInfo->mId == id &&
894                     minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) {
895                 return deviceInfo.get();
896             }
897         }
898     }
899     return nullptr;
900 }
901 
getProviderTagIdLocked(const std::string & id) const902 metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked(
903         const std::string& id) const {
904     metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID;
905 
906     std::lock_guard<std::mutex> lock(mInterfaceMutex);
907     for (auto& provider : mProviders) {
908         for (auto& deviceInfo : provider->mDevices) {
909             if (deviceInfo->mId == id) {
910                 return provider->mProviderTagid;
911             }
912         }
913     }
914 
915     return ret;
916 }
917 
queryPhysicalCameraIds()918 void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() {
919     camera_metadata_entry_t entryCap;
920 
921     entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
922     for (size_t i = 0; i < entryCap.count; ++i) {
923         uint8_t capability = entryCap.data.u8[i];
924         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
925             mIsLogicalCamera = true;
926             break;
927         }
928     }
929     if (!mIsLogicalCamera) {
930         return;
931     }
932 
933     camera_metadata_entry_t entryIds = mCameraCharacteristics.find(
934             ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS);
935     const uint8_t* ids = entryIds.data.u8;
936     size_t start = 0;
937     for (size_t i = 0; i < entryIds.count; ++i) {
938         if (ids[i] == '\0') {
939             if (start != i) {
940                 mPhysicalIds.push_back((const char*)ids+start);
941             }
942             start = i+1;
943         }
944     }
945 }
946 
getSystemCameraKind()947 SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCameraKind() {
948     camera_metadata_entry_t entryCap;
949     entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
950     if (entryCap.count == 1 &&
951             entryCap.data.u8[0] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA) {
952         return SystemCameraKind::HIDDEN_SECURE_CAMERA;
953     }
954 
955     // Go through the capabilities and check if it has
956     // ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
957     for (size_t i = 0; i < entryCap.count; ++i) {
958         uint8_t capability = entryCap.data.u8[i];
959         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA) {
960             return SystemCameraKind::SYSTEM_ONLY_CAMERA;
961         }
962     }
963     return SystemCameraKind::PUBLIC;
964 }
965 
getSupportedSizes(const CameraMetadata & ch,uint32_t tag,android_pixel_format_t format,std::vector<std::tuple<size_t,size_t>> * sizes)966 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedSizes(
967         const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format,
968         std::vector<std::tuple<size_t, size_t>> *sizes/*out*/) {
969     if (sizes == nullptr) {
970         return;
971     }
972 
973     auto scalerDims = ch.find(tag);
974     if (scalerDims.count > 0) {
975         // Scaler entry contains 4 elements (format, width, height, type)
976         for (size_t i = 0; i < scalerDims.count; i += 4) {
977             if ((scalerDims.data.i32[i] == format) &&
978                     (scalerDims.data.i32[i+3] ==
979                      ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) {
980                 sizes->push_back(std::make_tuple(scalerDims.data.i32[i+1],
981                             scalerDims.data.i32[i+2]));
982             }
983         }
984     }
985 }
986 
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)987 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDurations(
988         const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format,
989         const std::vector<std::tuple<size_t, size_t>>& sizes,
990         std::vector<int64_t> *durations/*out*/) {
991     if (durations == nullptr) {
992         return;
993     }
994 
995     auto availableDurations = ch.find(tag);
996     if (availableDurations.count > 0) {
997         // Duration entry contains 4 elements (format, width, height, duration)
998         for (size_t i = 0; i < availableDurations.count; i += 4) {
999             for (const auto& size : sizes) {
1000                 int64_t width = std::get<0>(size);
1001                 int64_t height = std::get<1>(size);
1002                 if ((availableDurations.data.i64[i] == format) &&
1003                         (availableDurations.data.i64[i+1] == width) &&
1004                         (availableDurations.data.i64[i+2] == height)) {
1005                     durations->push_back(availableDurations.data.i64[i+3]);
1006                 }
1007             }
1008         }
1009     }
1010 }
getSupportedDynamicDepthDurations(const std::vector<int64_t> & depthDurations,const std::vector<int64_t> & blobDurations,std::vector<int64_t> * dynamicDepthDurations)1011 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthDurations(
1012         const std::vector<int64_t>& depthDurations, const std::vector<int64_t>& blobDurations,
1013         std::vector<int64_t> *dynamicDepthDurations /*out*/) {
1014     if ((dynamicDepthDurations == nullptr) || (depthDurations.size() != blobDurations.size())) {
1015         return;
1016     }
1017 
1018     // Unfortunately there is no direct way to calculate the dynamic depth stream duration.
1019     // Processing time on camera service side can vary greatly depending on multiple
1020     // variables which are not under our control. Make a guesstimate by taking the maximum
1021     // corresponding duration value from depth and blob.
1022     auto depthDuration = depthDurations.begin();
1023     auto blobDuration = blobDurations.begin();
1024     dynamicDepthDurations->reserve(depthDurations.size());
1025     while ((depthDuration != depthDurations.end()) && (blobDuration != blobDurations.end())) {
1026         dynamicDepthDurations->push_back(std::max(*depthDuration, *blobDuration));
1027         depthDuration++; blobDuration++;
1028     }
1029 }
1030 
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)1031 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthSizes(
1032         const std::vector<std::tuple<size_t, size_t>>& blobSizes,
1033         const std::vector<std::tuple<size_t, size_t>>& depthSizes,
1034         std::vector<std::tuple<size_t, size_t>> *dynamicDepthSizes /*out*/,
1035         std::vector<std::tuple<size_t, size_t>> *internalDepthSizes /*out*/) {
1036     if (dynamicDepthSizes == nullptr || internalDepthSizes == nullptr) {
1037         return;
1038     }
1039 
1040     // The dynamic depth spec. does not mention how close the AR ratio should be.
1041     // Try using something appropriate.
1042     float ARTolerance = kDepthARTolerance;
1043 
1044     for (const auto& blobSize : blobSizes) {
1045         float jpegAR = static_cast<float> (std::get<0>(blobSize)) /
1046                 static_cast<float>(std::get<1>(blobSize));
1047         bool found = false;
1048         for (const auto& depthSize : depthSizes) {
1049             if (depthSize == blobSize) {
1050                 internalDepthSizes->push_back(depthSize);
1051                 found = true;
1052                 break;
1053             } else {
1054                 float depthAR = static_cast<float> (std::get<0>(depthSize)) /
1055                     static_cast<float>(std::get<1>(depthSize));
1056                 if (std::fabs(jpegAR - depthAR) <= ARTolerance) {
1057                     internalDepthSizes->push_back(depthSize);
1058                     found = true;
1059                     break;
1060                 }
1061             }
1062         }
1063 
1064         if (found) {
1065             dynamicDepthSizes->push_back(blobSize);
1066         }
1067     }
1068 }
1069 
addDynamicDepthTags(bool maxResolution)1070 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addDynamicDepthTags(
1071         bool maxResolution) {
1072     const int32_t depthExclTag = ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE;
1073 
1074     const int32_t scalerSizesTag =
1075               SessionConfigurationUtils::getAppropriateModeTag(
1076                       ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
1077     const int32_t scalerMinFrameDurationsTag =
1078             ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS;
1079     const int32_t scalerStallDurationsTag =
1080                  SessionConfigurationUtils::getAppropriateModeTag(
1081                         ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, maxResolution);
1082 
1083     const int32_t depthSizesTag =
1084             SessionConfigurationUtils::getAppropriateModeTag(
1085                     ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, maxResolution);
1086     const int32_t depthStallDurationsTag =
1087             SessionConfigurationUtils::getAppropriateModeTag(
1088                     ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS, maxResolution);
1089     const int32_t depthMinFrameDurationsTag =
1090             SessionConfigurationUtils::getAppropriateModeTag(
1091                     ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS, maxResolution);
1092 
1093     const int32_t dynamicDepthSizesTag =
1094             SessionConfigurationUtils::getAppropriateModeTag(
1095                     ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS, maxResolution);
1096     const int32_t dynamicDepthStallDurationsTag =
1097             SessionConfigurationUtils::getAppropriateModeTag(
1098                     ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS, maxResolution);
1099     const int32_t dynamicDepthMinFrameDurationsTag =
1100             SessionConfigurationUtils::getAppropriateModeTag(
1101                  ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS, maxResolution);
1102 
1103     auto& c = mCameraCharacteristics;
1104     std::vector<std::tuple<size_t, size_t>> supportedBlobSizes, supportedDepthSizes,
1105             supportedDynamicDepthSizes, internalDepthSizes;
1106     auto chTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1107     if (chTags.count == 0) {
1108         ALOGE("%s: Supported camera characteristics is empty!", __FUNCTION__);
1109         return BAD_VALUE;
1110     }
1111 
1112     bool isDepthExclusivePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count,
1113             depthExclTag) != (chTags.data.i32 + chTags.count);
1114     bool isDepthSizePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count,
1115             depthSizesTag) != (chTags.data.i32 + chTags.count);
1116     if (!(isDepthExclusivePresent && isDepthSizePresent)) {
1117         // No depth support, nothing more to do.
1118         return OK;
1119     }
1120 
1121     auto depthExclusiveEntry = c.find(depthExclTag);
1122     if (depthExclusiveEntry.count > 0) {
1123         if (depthExclusiveEntry.data.u8[0] != ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE_FALSE) {
1124             // Depth support is exclusive, nothing more to do.
1125             return OK;
1126         }
1127     } else {
1128         ALOGE("%s: Advertised depth exclusive tag but value is not present!", __FUNCTION__);
1129         return BAD_VALUE;
1130     }
1131 
1132     getSupportedSizes(c, scalerSizesTag, HAL_PIXEL_FORMAT_BLOB,
1133             &supportedBlobSizes);
1134     getSupportedSizes(c, depthSizesTag, HAL_PIXEL_FORMAT_Y16, &supportedDepthSizes);
1135     if (supportedBlobSizes.empty() || supportedDepthSizes.empty()) {
1136         // Nothing to do in this case.
1137         return OK;
1138     }
1139 
1140     getSupportedDynamicDepthSizes(supportedBlobSizes, supportedDepthSizes,
1141             &supportedDynamicDepthSizes, &internalDepthSizes);
1142     if (supportedDynamicDepthSizes.empty()) {
1143         // Nothing more to do.
1144         return OK;
1145     }
1146 
1147     std::vector<int32_t> dynamicDepthEntries;
1148     for (const auto& it : supportedDynamicDepthSizes) {
1149         int32_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(it)),
1150                 static_cast<int32_t> (std::get<1>(it)),
1151                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT };
1152         dynamicDepthEntries.insert(dynamicDepthEntries.end(), entry, entry + 4);
1153     }
1154 
1155     std::vector<int64_t> depthMinDurations, depthStallDurations;
1156     std::vector<int64_t> blobMinDurations, blobStallDurations;
1157     std::vector<int64_t> dynamicDepthMinDurations, dynamicDepthStallDurations;
1158 
1159     getSupportedDurations(c, depthMinFrameDurationsTag, HAL_PIXEL_FORMAT_Y16, internalDepthSizes,
1160                           &depthMinDurations);
1161     getSupportedDurations(c, scalerMinFrameDurationsTag, HAL_PIXEL_FORMAT_BLOB,
1162                           supportedDynamicDepthSizes, &blobMinDurations);
1163     if (blobMinDurations.empty() || depthMinDurations.empty() ||
1164             (depthMinDurations.size() != blobMinDurations.size())) {
1165         ALOGE("%s: Unexpected number of available depth min durations! %zu vs. %zu",
1166                 __FUNCTION__, depthMinDurations.size(), blobMinDurations.size());
1167         return BAD_VALUE;
1168     }
1169 
1170     getSupportedDurations(c, depthStallDurationsTag, HAL_PIXEL_FORMAT_Y16, internalDepthSizes,
1171             &depthStallDurations);
1172     getSupportedDurations(c, scalerStallDurationsTag, HAL_PIXEL_FORMAT_BLOB,
1173             supportedDynamicDepthSizes, &blobStallDurations);
1174     if (blobStallDurations.empty() || depthStallDurations.empty() ||
1175             (depthStallDurations.size() != blobStallDurations.size())) {
1176         ALOGE("%s: Unexpected number of available depth stall durations! %zu vs. %zu",
1177                 __FUNCTION__, depthStallDurations.size(), blobStallDurations.size());
1178         return BAD_VALUE;
1179     }
1180 
1181     getSupportedDynamicDepthDurations(depthMinDurations, blobMinDurations,
1182             &dynamicDepthMinDurations);
1183     getSupportedDynamicDepthDurations(depthStallDurations, blobStallDurations,
1184             &dynamicDepthStallDurations);
1185     if (dynamicDepthMinDurations.empty() || dynamicDepthStallDurations.empty() ||
1186             (dynamicDepthMinDurations.size() != dynamicDepthStallDurations.size())) {
1187         ALOGE("%s: Unexpected number of dynamic depth stall/min durations! %zu vs. %zu",
1188                 __FUNCTION__, dynamicDepthMinDurations.size(), dynamicDepthStallDurations.size());
1189         return BAD_VALUE;
1190     }
1191 
1192     std::vector<int64_t> dynamicDepthMinDurationEntries;
1193     auto itDuration = dynamicDepthMinDurations.begin();
1194     auto itSize = supportedDynamicDepthSizes.begin();
1195     while (itDuration != dynamicDepthMinDurations.end()) {
1196         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)),
1197                 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration};
1198         dynamicDepthMinDurationEntries.insert(dynamicDepthMinDurationEntries.end(), entry,
1199                 entry + 4);
1200         itDuration++; itSize++;
1201     }
1202 
1203     std::vector<int64_t> dynamicDepthStallDurationEntries;
1204     itDuration = dynamicDepthStallDurations.begin();
1205     itSize = supportedDynamicDepthSizes.begin();
1206     while (itDuration != dynamicDepthStallDurations.end()) {
1207         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)),
1208                 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration};
1209         dynamicDepthStallDurationEntries.insert(dynamicDepthStallDurationEntries.end(), entry,
1210                 entry + 4);
1211         itDuration++; itSize++;
1212     }
1213 
1214     std::vector<int32_t> supportedChTags;
1215     supportedChTags.reserve(chTags.count + 3);
1216     supportedChTags.insert(supportedChTags.end(), chTags.data.i32,
1217             chTags.data.i32 + chTags.count);
1218     supportedChTags.push_back(dynamicDepthSizesTag);
1219     supportedChTags.push_back(dynamicDepthMinFrameDurationsTag);
1220     supportedChTags.push_back(dynamicDepthStallDurationsTag);
1221     c.update(dynamicDepthSizesTag, dynamicDepthEntries.data(), dynamicDepthEntries.size());
1222     c.update(dynamicDepthMinFrameDurationsTag, dynamicDepthMinDurationEntries.data(),
1223             dynamicDepthMinDurationEntries.size());
1224     c.update(dynamicDepthStallDurationsTag, dynamicDepthStallDurationEntries.data(),
1225              dynamicDepthStallDurationEntries.size());
1226     c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(),
1227             supportedChTags.size());
1228 
1229     return OK;
1230 }
1231 
fixupTorchStrengthTags()1232 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupTorchStrengthTags() {
1233     status_t res = OK;
1234     auto& c = mCameraCharacteristics;
1235     auto flashInfoStrengthDefaultLevelEntry = c.find(ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL);
1236     if (flashInfoStrengthDefaultLevelEntry.count == 0) {
1237         int32_t flashInfoStrengthDefaultLevel = 1;
1238         res = c.update(ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL,
1239                 &flashInfoStrengthDefaultLevel, 1);
1240         if (res != OK) {
1241             ALOGE("%s: Failed to update ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL: %s (%d)",
1242                     __FUNCTION__,strerror(-res), res);
1243             return res;
1244         }
1245     }
1246     auto flashInfoStrengthMaximumLevelEntry = c.find(ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL);
1247     if (flashInfoStrengthMaximumLevelEntry.count == 0) {
1248         int32_t flashInfoStrengthMaximumLevel = 1;
1249         res = c.update(ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL,
1250                 &flashInfoStrengthMaximumLevel, 1);
1251         if (res != OK) {
1252             ALOGE("%s: Failed to update ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL: %s (%d)",
1253                     __FUNCTION__,strerror(-res), res);
1254             return res;
1255         }
1256     }
1257     return res;
1258 }
1259 
fixupMonochromeTags()1260 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupMonochromeTags() {
1261     status_t res = OK;
1262     auto& c = mCameraCharacteristics;
1263     sp<ProviderInfo> parentProvider = mParentProvider.promote();
1264     if (parentProvider == nullptr) {
1265         return DEAD_OBJECT;
1266     }
1267     IPCTransport ipcTransport = parentProvider->getIPCTransport();
1268     // Override static metadata for MONOCHROME camera with older device version
1269     if (ipcTransport == IPCTransport::HIDL &&
1270             (mVersion.get_major() == 3 && mVersion.get_minor() < 5)) {
1271         camera_metadata_entry cap = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1272         for (size_t i = 0; i < cap.count; i++) {
1273             if (cap.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
1274                 // ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
1275                 uint8_t cfa = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO;
1276                 res = c.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, &cfa, 1);
1277                 if (res != OK) {
1278                     ALOGE("%s: Failed to update COLOR_FILTER_ARRANGEMENT: %s (%d)",
1279                           __FUNCTION__, strerror(-res), res);
1280                     return res;
1281                 }
1282 
1283                 // ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
1284                 const std::vector<uint32_t> sKeys = {
1285                         ANDROID_SENSOR_REFERENCE_ILLUMINANT1,
1286                         ANDROID_SENSOR_REFERENCE_ILLUMINANT2,
1287                         ANDROID_SENSOR_CALIBRATION_TRANSFORM1,
1288                         ANDROID_SENSOR_CALIBRATION_TRANSFORM2,
1289                         ANDROID_SENSOR_COLOR_TRANSFORM1,
1290                         ANDROID_SENSOR_COLOR_TRANSFORM2,
1291                         ANDROID_SENSOR_FORWARD_MATRIX1,
1292                         ANDROID_SENSOR_FORWARD_MATRIX2,
1293                 };
1294                 res = removeAvailableKeys(c, sKeys,
1295                         ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1296                 if (res != OK) {
1297                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s (%d)",
1298                             __FUNCTION__, strerror(-res), res);
1299                     return res;
1300                 }
1301 
1302                 // ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
1303                 const std::vector<uint32_t> reqKeys = {
1304                         ANDROID_COLOR_CORRECTION_MODE,
1305                         ANDROID_COLOR_CORRECTION_TRANSFORM,
1306                         ANDROID_COLOR_CORRECTION_GAINS,
1307                 };
1308                 res = removeAvailableKeys(c, reqKeys, ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS);
1309                 if (res != OK) {
1310                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_REQUEST_KEYS: %s (%d)",
1311                             __FUNCTION__, strerror(-res), res);
1312                     return res;
1313                 }
1314 
1315                 // ANDROID_REQUEST_AVAILABLE_RESULT_KEYS
1316                 const std::vector<uint32_t> resKeys = {
1317                         ANDROID_SENSOR_GREEN_SPLIT,
1318                         ANDROID_SENSOR_NEUTRAL_COLOR_POINT,
1319                         ANDROID_COLOR_CORRECTION_MODE,
1320                         ANDROID_COLOR_CORRECTION_TRANSFORM,
1321                         ANDROID_COLOR_CORRECTION_GAINS,
1322                 };
1323                 res = removeAvailableKeys(c, resKeys, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS);
1324                 if (res != OK) {
1325                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_RESULT_KEYS: %s (%d)",
1326                             __FUNCTION__, strerror(-res), res);
1327                     return res;
1328                 }
1329 
1330                 // ANDROID_SENSOR_BLACK_LEVEL_PATTERN
1331                 camera_metadata_entry blEntry = c.find(ANDROID_SENSOR_BLACK_LEVEL_PATTERN);
1332                 for (size_t j = 1; j < blEntry.count; j++) {
1333                     blEntry.data.i32[j] = blEntry.data.i32[0];
1334                 }
1335             }
1336         }
1337     }
1338     return res;
1339 }
1340 
addRotateCropTags()1341 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addRotateCropTags() {
1342     status_t res = OK;
1343     auto& c = mCameraCharacteristics;
1344 
1345     auto availableRotateCropEntry = c.find(ANDROID_SCALER_AVAILABLE_ROTATE_AND_CROP_MODES);
1346     if (availableRotateCropEntry.count == 0) {
1347         uint8_t defaultAvailableRotateCropEntry = ANDROID_SCALER_ROTATE_AND_CROP_NONE;
1348         res = c.update(ANDROID_SCALER_AVAILABLE_ROTATE_AND_CROP_MODES,
1349                 &defaultAvailableRotateCropEntry, 1);
1350     }
1351     return res;
1352 }
1353 
addPreCorrectionActiveArraySize()1354 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addPreCorrectionActiveArraySize() {
1355     status_t res = OK;
1356     auto& c = mCameraCharacteristics;
1357 
1358     auto activeArraySize = c.find(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
1359     auto preCorrectionActiveArraySize = c.find(
1360             ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
1361     if (activeArraySize.count == 4 && preCorrectionActiveArraySize.count == 0) {
1362         std::vector<int32_t> preCorrectionArray(
1363                 activeArraySize.data.i32, activeArraySize.data.i32+4);
1364         res = c.update(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE,
1365                 preCorrectionArray.data(), 4);
1366         if (res != OK) {
1367             ALOGE("%s: Failed to add ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE: %s(%d)",
1368                     __FUNCTION__, strerror(-res), res);
1369             return res;
1370         }
1371     } else {
1372         return res;
1373     }
1374 
1375     auto charTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1376     bool hasPreCorrectionActiveArraySize = std::find(charTags.data.i32,
1377             charTags.data.i32 + charTags.count,
1378             ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE) !=
1379             (charTags.data.i32 + charTags.count);
1380     if (!hasPreCorrectionActiveArraySize) {
1381         std::vector<int32_t> supportedCharTags;
1382         supportedCharTags.reserve(charTags.count + 1);
1383         supportedCharTags.insert(supportedCharTags.end(), charTags.data.i32,
1384                 charTags.data.i32 + charTags.count);
1385         supportedCharTags.push_back(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
1386 
1387         res = c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedCharTags.data(),
1388                 supportedCharTags.size());
1389         if (res != OK) {
1390             ALOGE("%s: Failed to update ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s(%d)",
1391                     __FUNCTION__, strerror(-res), res);
1392             return res;
1393         }
1394     }
1395 
1396     return res;
1397 }
1398 
addReadoutTimestampTag(bool readoutTimestampSupported)1399 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addReadoutTimestampTag(
1400         bool readoutTimestampSupported) {
1401     status_t res = OK;
1402     auto& c = mCameraCharacteristics;
1403 
1404     auto entry = c.find(ANDROID_SENSOR_READOUT_TIMESTAMP);
1405     if (entry.count != 0) {
1406         ALOGE("%s: CameraCharacteristics must not contain ANDROID_SENSOR_READOUT_TIMESTAMP!",
1407                 __FUNCTION__);
1408     }
1409 
1410     uint8_t readoutTimestamp = ANDROID_SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED;
1411     if (readoutTimestampSupported) {
1412         readoutTimestamp = ANDROID_SENSOR_READOUT_TIMESTAMP_HARDWARE;
1413     }
1414 
1415     res = c.update(ANDROID_SENSOR_READOUT_TIMESTAMP, &readoutTimestamp, 1);
1416 
1417     return res;
1418 }
1419 
removeAvailableKeys(CameraMetadata & c,const std::vector<uint32_t> & keys,uint32_t keyTag)1420 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::removeAvailableKeys(
1421         CameraMetadata& c, const std::vector<uint32_t>& keys, uint32_t keyTag) {
1422     status_t res = OK;
1423 
1424     camera_metadata_entry keysEntry = c.find(keyTag);
1425     if (keysEntry.count == 0) {
1426         ALOGE("%s: Failed to find tag %u: %s (%d)", __FUNCTION__, keyTag, strerror(-res), res);
1427         return res;
1428     }
1429     std::vector<int32_t> vKeys;
1430     vKeys.reserve(keysEntry.count);
1431     for (size_t i = 0; i < keysEntry.count; i++) {
1432         if (std::find(keys.begin(), keys.end(), keysEntry.data.i32[i]) == keys.end()) {
1433             vKeys.push_back(keysEntry.data.i32[i]);
1434         }
1435     }
1436     res = c.update(keyTag, vKeys.data(), vKeys.size());
1437     return res;
1438 }
1439 
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)1440 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fillHeicStreamCombinations(
1441         std::vector<int32_t>* outputs,
1442         std::vector<int64_t>* durations,
1443         std::vector<int64_t>* stallDurations,
1444         const camera_metadata_entry& halStreamConfigs,
1445         const camera_metadata_entry& halStreamDurations) {
1446     if (outputs == nullptr || durations == nullptr || stallDurations == nullptr) {
1447         return BAD_VALUE;
1448     }
1449 
1450     static bool supportInMemoryTempFile =
1451             camera3::HeicCompositeStream::isInMemoryTempFileSupported();
1452     if (!supportInMemoryTempFile) {
1453         ALOGI("%s: No HEIC support due to absence of in memory temp file support",
1454                 __FUNCTION__);
1455         return OK;
1456     }
1457 
1458     for (size_t i = 0; i < halStreamConfigs.count; i += 4) {
1459         int32_t format = halStreamConfigs.data.i32[i];
1460         // Only IMPLEMENTATION_DEFINED and YUV_888 can be used to generate HEIC
1461         // image.
1462         if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
1463                 format != HAL_PIXEL_FORMAT_YCBCR_420_888) {
1464             continue;
1465         }
1466 
1467         bool sizeAvail = false;
1468         for (size_t j = 0; j < outputs->size(); j+= 4) {
1469             if ((*outputs)[j+1] == halStreamConfigs.data.i32[i+1] &&
1470                     (*outputs)[j+2] == halStreamConfigs.data.i32[i+2]) {
1471                 sizeAvail = true;
1472                 break;
1473             }
1474         }
1475         if (sizeAvail) continue;
1476 
1477         int64_t stall = 0;
1478         bool useHeic = false;
1479         bool useGrid = false;
1480         if (camera3::HeicCompositeStream::isSizeSupportedByHeifEncoder(
1481                 halStreamConfigs.data.i32[i+1], halStreamConfigs.data.i32[i+2],
1482                 &useHeic, &useGrid, &stall)) {
1483             if (useGrid != (format == HAL_PIXEL_FORMAT_YCBCR_420_888)) {
1484                 continue;
1485             }
1486 
1487             // HEIC configuration
1488             int32_t config[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
1489                     halStreamConfigs.data.i32[i+2], 0 /*isInput*/};
1490             outputs->insert(outputs->end(), config, config + 4);
1491 
1492             // HEIC minFrameDuration
1493             for (size_t j = 0; j < halStreamDurations.count; j += 4) {
1494                 if (halStreamDurations.data.i64[j] == format &&
1495                         halStreamDurations.data.i64[j+1] == halStreamConfigs.data.i32[i+1] &&
1496                         halStreamDurations.data.i64[j+2] == halStreamConfigs.data.i32[i+2]) {
1497                     int64_t duration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
1498                             halStreamConfigs.data.i32[i+2], halStreamDurations.data.i64[j+3]};
1499                     durations->insert(durations->end(), duration, duration+4);
1500                     break;
1501                 }
1502             }
1503 
1504             // HEIC stallDuration
1505             int64_t stallDuration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
1506                     halStreamConfigs.data.i32[i+2], stall};
1507             stallDurations->insert(stallDurations->end(), stallDuration, stallDuration+4);
1508         }
1509     }
1510     return OK;
1511 }
1512 
deriveHeicTags(bool maxResolution)1513 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveHeicTags(bool maxResolution) {
1514     int32_t scalerStreamSizesTag =
1515             SessionConfigurationUtils::getAppropriateModeTag(
1516                     ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
1517     int32_t scalerMinFrameDurationsTag =
1518             SessionConfigurationUtils::getAppropriateModeTag(
1519                     ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, maxResolution);
1520 
1521     int32_t heicStreamSizesTag =
1522             SessionConfigurationUtils::getAppropriateModeTag(
1523                     ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, maxResolution);
1524     int32_t heicMinFrameDurationsTag =
1525             SessionConfigurationUtils::getAppropriateModeTag(
1526                     ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS, maxResolution);
1527     int32_t heicStallDurationsTag =
1528             SessionConfigurationUtils::getAppropriateModeTag(
1529                     ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS, maxResolution);
1530 
1531     auto& c = mCameraCharacteristics;
1532 
1533     camera_metadata_entry halHeicSupport = c.find(ANDROID_HEIC_INFO_SUPPORTED);
1534     if (halHeicSupport.count > 1) {
1535         ALOGE("%s: Invalid entry count %zu for ANDROID_HEIC_INFO_SUPPORTED",
1536                 __FUNCTION__, halHeicSupport.count);
1537         return BAD_VALUE;
1538     } else if (halHeicSupport.count == 0 ||
1539             halHeicSupport.data.u8[0] == ANDROID_HEIC_INFO_SUPPORTED_FALSE) {
1540         // Camera HAL doesn't support mandatory stream combinations for HEIC.
1541         return OK;
1542     }
1543 
1544     camera_metadata_entry maxJpegAppsSegments =
1545             c.find(ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT);
1546     if (maxJpegAppsSegments.count != 1 || maxJpegAppsSegments.data.u8[0] == 0 ||
1547             maxJpegAppsSegments.data.u8[0] > 16) {
1548         ALOGE("%s: ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT must be within [1, 16]",
1549                 __FUNCTION__);
1550         return BAD_VALUE;
1551     }
1552 
1553     // Populate HEIC output configurations and its related min frame duration
1554     // and stall duration.
1555     std::vector<int32_t> heicOutputs;
1556     std::vector<int64_t> heicDurations;
1557     std::vector<int64_t> heicStallDurations;
1558 
1559     camera_metadata_entry halStreamConfigs = c.find(scalerStreamSizesTag);
1560     camera_metadata_entry minFrameDurations = c.find(scalerMinFrameDurationsTag);
1561 
1562     status_t res = fillHeicStreamCombinations(&heicOutputs, &heicDurations, &heicStallDurations,
1563             halStreamConfigs, minFrameDurations);
1564     if (res != OK) {
1565         ALOGE("%s: Failed to fill HEIC stream combinations: %s (%d)", __FUNCTION__,
1566                 strerror(-res), res);
1567         return res;
1568     }
1569 
1570     c.update(heicStreamSizesTag, heicOutputs.data(), heicOutputs.size());
1571     c.update(heicMinFrameDurationsTag, heicDurations.data(), heicDurations.size());
1572     c.update(heicStallDurationsTag, heicStallDurations.data(), heicStallDurations.size());
1573 
1574     return OK;
1575 }
1576 
isLogicalCameraLocked(const std::string & id,std::vector<std::string> * physicalCameraIds)1577 bool CameraProviderManager::isLogicalCameraLocked(const std::string& id,
1578         std::vector<std::string>* physicalCameraIds) {
1579     auto deviceInfo = findDeviceInfoLocked(id);
1580     if (deviceInfo == nullptr) return false;
1581 
1582     if (deviceInfo->mIsLogicalCamera && physicalCameraIds != nullptr) {
1583         *physicalCameraIds = deviceInfo->mPhysicalIds;
1584     }
1585     return deviceInfo->mIsLogicalCamera;
1586 }
1587 
isLogicalCamera(const std::string & id,std::vector<std::string> * physicalCameraIds)1588 bool CameraProviderManager::isLogicalCamera(const std::string& id,
1589         std::vector<std::string>* physicalCameraIds) {
1590     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1591     return isLogicalCameraLocked(id, physicalCameraIds);
1592 }
1593 
getSystemCameraKind(const std::string & id,SystemCameraKind * kind) const1594 status_t CameraProviderManager::getSystemCameraKind(const std::string& id,
1595         SystemCameraKind *kind) const {
1596     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1597     return getSystemCameraKindLocked(id, kind);
1598 }
1599 
getSystemCameraKindLocked(const std::string & id,SystemCameraKind * kind) const1600 status_t CameraProviderManager::getSystemCameraKindLocked(const std::string& id,
1601         SystemCameraKind *kind) const {
1602     auto deviceInfo = findDeviceInfoLocked(id);
1603     if (deviceInfo != nullptr) {
1604         *kind = deviceInfo->mSystemCameraKind;
1605         return OK;
1606     }
1607     // If this is a hidden physical camera, we should return what kind of
1608     // camera the enclosing logical camera is.
1609     auto isHiddenAndParent = isHiddenPhysicalCameraInternal(id);
1610     if (isHiddenAndParent.first) {
1611         LOG_ALWAYS_FATAL_IF(id == isHiddenAndParent.second->mId,
1612                 "%s: hidden physical camera id %s and enclosing logical camera id %s are the same",
1613                 __FUNCTION__, id.c_str(), isHiddenAndParent.second->mId.c_str());
1614         return getSystemCameraKindLocked(isHiddenAndParent.second->mId, kind);
1615     }
1616     // Neither a hidden physical camera nor a logical camera
1617     return NAME_NOT_FOUND;
1618 }
1619 
isHiddenPhysicalCamera(const std::string & cameraId) const1620 bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) const {
1621     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1622     return isHiddenPhysicalCameraInternal(cameraId).first;
1623 }
1624 
filterSmallJpegSizes(const std::string & cameraId)1625 status_t CameraProviderManager::filterSmallJpegSizes(const std::string& cameraId) {
1626     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1627     for (auto& provider : mProviders) {
1628         for (auto& deviceInfo : provider->mDevices) {
1629             if (deviceInfo->mId == cameraId) {
1630                 return deviceInfo->filterSmallJpegSizes();
1631             }
1632         }
1633     }
1634     return NAME_NOT_FOUND;
1635 }
1636 
1637 std::pair<bool, CameraProviderManager::ProviderInfo::DeviceInfo *>
isHiddenPhysicalCameraInternal(const std::string & cameraId) const1638 CameraProviderManager::isHiddenPhysicalCameraInternal(const std::string& cameraId) const {
1639     auto falseRet = std::make_pair(false, nullptr);
1640     for (auto& provider : mProviders) {
1641         for (auto& deviceInfo : provider->mDevices) {
1642             if (deviceInfo->mId == cameraId) {
1643                 // cameraId is found in public camera IDs advertised by the
1644                 // provider.
1645                 return falseRet;
1646             }
1647         }
1648     }
1649 
1650     for (auto& provider : mProviders) {
1651         IPCTransport transport = provider->getIPCTransport();
1652         for (auto& deviceInfo : provider->mDevices) {
1653             std::vector<std::string> physicalIds;
1654             if (deviceInfo->mIsLogicalCamera) {
1655                 if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
1656                         cameraId) != deviceInfo->mPhysicalIds.end()) {
1657                     int deviceVersion = HARDWARE_DEVICE_API_VERSION(
1658                             deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor());
1659                     if (transport == IPCTransport::HIDL &&
1660                             deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) {
1661                         ALOGE("%s: Wrong deviceVersion %x for hiddenPhysicalCameraId %s",
1662                                 __FUNCTION__, deviceVersion, cameraId.c_str());
1663                         return falseRet;
1664                     } else {
1665                         return std::make_pair(true, deviceInfo.get());
1666                     }
1667                 }
1668             }
1669         }
1670     }
1671 
1672     return falseRet;
1673 }
1674 
tryToInitializeAidlProviderLocked(const std::string & providerName,const sp<ProviderInfo> & providerInfo)1675 status_t CameraProviderManager::tryToInitializeAidlProviderLocked(
1676         const std::string& providerName, const sp<ProviderInfo>& providerInfo) {
1677     using aidl::android::hardware::camera::provider::ICameraProvider;
1678     std::shared_ptr<ICameraProvider> interface =
1679             ICameraProvider::fromBinder(ndk::SpAIBinder(
1680                     AServiceManager_getService(providerName.c_str())));
1681 
1682     if (interface == nullptr) {
1683         ALOGW("%s: AIDL Camera provider HAL '%s' is not actually available", __FUNCTION__,
1684                 providerName.c_str());
1685         return BAD_VALUE;
1686     }
1687 
1688     AidlProviderInfo *aidlProviderInfo = static_cast<AidlProviderInfo *>(providerInfo.get());
1689     return aidlProviderInfo->initializeAidlProvider(interface, mDeviceState);
1690 }
1691 
tryToInitializeHidlProviderLocked(const std::string & providerName,const sp<ProviderInfo> & providerInfo)1692 status_t CameraProviderManager::tryToInitializeHidlProviderLocked(
1693         const std::string& providerName, const sp<ProviderInfo>& providerInfo) {
1694     sp<provider::V2_4::ICameraProvider> interface;
1695     interface = mHidlServiceProxy->tryGetService(providerName);
1696 
1697     if (interface == nullptr) {
1698         // The interface may not be started yet. In that case, this is not a
1699         // fatal error.
1700         ALOGW("%s: HIDL Camera provider HAL '%s' is not actually available", __FUNCTION__,
1701                 providerName.c_str());
1702         return BAD_VALUE;
1703     }
1704 
1705     HidlProviderInfo *hidlProviderInfo = static_cast<HidlProviderInfo *>(providerInfo.get());
1706     return hidlProviderInfo->initializeHidlProvider(interface, mDeviceState);
1707 }
1708 
addAidlProviderLocked(const std::string & newProvider)1709 status_t CameraProviderManager::addAidlProviderLocked(const std::string& newProvider) {
1710     // Several camera provider instances can be temporarily present.
1711     // Defer initialization of a new instance until the older instance is properly removed.
1712     auto providerInstance = newProvider + "-" + std::to_string(mProviderInstanceId);
1713     bool providerPresent = false;
1714     bool preexisting =
1715             (mAidlProviderWithBinders.find(newProvider) != mAidlProviderWithBinders.end());
1716 
1717     // We need to use the extracted provider name here since 'newProvider' has
1718     // the fully qualified name of the provider service in case of AIDL. We want
1719     // just instance name.
1720     using aidl::android::hardware::camera::provider::ICameraProvider;
1721     std::string extractedProviderName =
1722             newProvider.substr(std::string(ICameraProvider::descriptor).size() + 1);
1723     for (const auto& providerInfo : mProviders) {
1724         if (providerInfo->mProviderName == extractedProviderName) {
1725             ALOGW("%s: Camera provider HAL with name '%s' already registered",
1726                     __FUNCTION__, newProvider.c_str());
1727             // Do not add new instances for lazy HAL external provider or aidl
1728             // binders previously seen.
1729             if (preexisting || providerInfo->isExternalLazyHAL()) {
1730                 return ALREADY_EXISTS;
1731             } else {
1732                 ALOGW("%s: The new provider instance will get initialized immediately after the"
1733                         " currently present instance is removed!", __FUNCTION__);
1734                 providerPresent = true;
1735                 break;
1736             }
1737         }
1738     }
1739 
1740     sp<AidlProviderInfo> providerInfo =
1741             new AidlProviderInfo(extractedProviderName, providerInstance, this);
1742 
1743     if (!providerPresent) {
1744         status_t res = tryToInitializeAidlProviderLocked(newProvider, providerInfo);
1745         if (res != OK) {
1746             return res;
1747         }
1748         mAidlProviderWithBinders.emplace(newProvider);
1749     }
1750 
1751     mProviders.push_back(providerInfo);
1752     mProviderInstanceId++;
1753 
1754     return OK;
1755 }
1756 
addHidlProviderLocked(const std::string & newProvider,bool preexisting)1757 status_t CameraProviderManager::addHidlProviderLocked(const std::string& newProvider,
1758         bool preexisting) {
1759     // Several camera provider instances can be temporarily present.
1760     // Defer initialization of a new instance until the older instance is properly removed.
1761     auto providerInstance = newProvider + "-" + std::to_string(mProviderInstanceId);
1762     bool providerPresent = false;
1763     for (const auto& providerInfo : mProviders) {
1764         if (providerInfo->mProviderName == newProvider) {
1765             ALOGW("%s: Camera provider HAL with name '%s' already registered",
1766                     __FUNCTION__, newProvider.c_str());
1767             // Do not add new instances for lazy HAL external provider
1768             if (preexisting || providerInfo->isExternalLazyHAL()) {
1769                 return ALREADY_EXISTS;
1770             } else {
1771                 ALOGW("%s: The new provider instance will get initialized immediately after the"
1772                         " currently present instance is removed!", __FUNCTION__);
1773                 providerPresent = true;
1774                 break;
1775             }
1776         }
1777     }
1778 
1779     sp<HidlProviderInfo> providerInfo = new HidlProviderInfo(newProvider, providerInstance, this);
1780     if (!providerPresent) {
1781         status_t res = tryToInitializeHidlProviderLocked(newProvider, providerInfo);
1782         if (res != OK) {
1783             return res;
1784         }
1785     }
1786 
1787     mProviders.push_back(providerInfo);
1788     mProviderInstanceId++;
1789 
1790     return OK;
1791 }
1792 
removeProvider(const std::string & provider)1793 status_t CameraProviderManager::removeProvider(const std::string& provider) {
1794     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
1795     std::unique_lock<std::mutex> lock(mInterfaceMutex);
1796     std::vector<String8> removedDeviceIds;
1797     status_t res = NAME_NOT_FOUND;
1798     std::string removedProviderName;
1799     for (auto it = mProviders.begin(); it != mProviders.end(); it++) {
1800         if ((*it)->mProviderInstance == provider) {
1801             removedDeviceIds.reserve((*it)->mDevices.size());
1802             for (auto& deviceInfo : (*it)->mDevices) {
1803                 removedDeviceIds.push_back(String8(deviceInfo->mId.c_str()));
1804             }
1805             removedProviderName = (*it)->mProviderName;
1806             mProviders.erase(it);
1807             res = OK;
1808             break;
1809         }
1810     }
1811     if (res != OK) {
1812         ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__,
1813                 provider.c_str());
1814     } else {
1815         // Check if there are any newer camera instances from the same provider and try to
1816         // initialize.
1817         for (const auto& providerInfo : mProviders) {
1818             if (providerInfo->mProviderName == removedProviderName) {
1819                 IPCTransport providerTransport = providerInfo->getIPCTransport();
1820                 std::string removedAidlProviderName = getFullAidlProviderName(removedProviderName);
1821                 switch(providerTransport) {
1822                     case IPCTransport::HIDL:
1823                         return tryToInitializeHidlProviderLocked(removedProviderName, providerInfo);
1824                     case IPCTransport::AIDL:
1825                         return tryToInitializeAidlProviderLocked(removedAidlProviderName,
1826                                 providerInfo);
1827                     default:
1828                         ALOGE("%s Unsupported Transport %d", __FUNCTION__, providerTransport);
1829                 }
1830             }
1831         }
1832 
1833         // Inform camera service of loss of presence for all the devices from this provider,
1834         // without lock held for reentrancy
1835         sp<StatusListener> listener = getStatusListener();
1836         if (listener != nullptr) {
1837             lock.unlock();
1838             for (auto& id : removedDeviceIds) {
1839                 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT);
1840             }
1841             lock.lock();
1842         }
1843 
1844     }
1845     return res;
1846 }
1847 
getStatusListener() const1848 sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const {
1849     return mListener.promote();
1850 }
1851 /**** Methods for ProviderInfo ****/
1852 
1853 
ProviderInfo(const std::string & providerName,const std::string & providerInstance,CameraProviderManager * manager)1854 CameraProviderManager::ProviderInfo::ProviderInfo(
1855         const std::string &providerName,
1856         const std::string &providerInstance,
1857         CameraProviderManager *manager) :
1858         mProviderName(providerName),
1859         mProviderInstance(providerInstance),
1860         mProviderTagid(generateVendorTagId(providerName)),
1861         mUniqueDeviceCount(0),
1862         mManager(manager) {
1863     (void) mManager;
1864 }
1865 
getType() const1866 const std::string& CameraProviderManager::ProviderInfo::getType() const {
1867     return mType;
1868 }
1869 
addDevice(const std::string & name,CameraDeviceStatus initialStatus,std::string * parsedId)1870 status_t CameraProviderManager::ProviderInfo::addDevice(
1871         const std::string& name, CameraDeviceStatus initialStatus,
1872         /*out*/ std::string* parsedId) {
1873 
1874     ALOGI("Enumerating new camera device: %s", name.c_str());
1875 
1876     uint16_t major, minor;
1877     std::string type, id;
1878     IPCTransport transport = getIPCTransport();
1879 
1880     status_t res = parseDeviceName(name, &major, &minor, &type, &id);
1881     if (res != OK) {
1882         return res;
1883     }
1884 
1885     if (type != mType) {
1886         ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__,
1887                 type.c_str(), mType.c_str());
1888         return BAD_VALUE;
1889     }
1890     if (mManager->isValidDeviceLocked(id, major, transport)) {
1891         ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__,
1892                 name.c_str(), id.c_str(), major);
1893         return BAD_VALUE;
1894     }
1895 
1896     std::unique_ptr<DeviceInfo> deviceInfo;
1897     switch (transport) {
1898         case IPCTransport::HIDL:
1899             switch (major) {
1900                 case 3:
1901                     break;
1902                 default:
1903                     ALOGE("%s: Device %s: Unsupported HIDL device HAL major version %d:",
1904                           __FUNCTION__,  name.c_str(), major);
1905                     return BAD_VALUE;
1906             }
1907             break;
1908         case IPCTransport::AIDL:
1909             if (major != 1) {
1910                 ALOGE("%s: Device %s: Unsupported AIDL device HAL major version %d:", __FUNCTION__,
1911                         name.c_str(), major);
1912                 return BAD_VALUE;
1913             }
1914             break;
1915         default:
1916             ALOGE("%s Invalid transport %d", __FUNCTION__, transport);
1917             return BAD_VALUE;
1918     }
1919 
1920     deviceInfo = initializeDeviceInfo(name, mProviderTagid, id, minor);
1921     if (deviceInfo == nullptr) return BAD_VALUE;
1922     deviceInfo->notifyDeviceStateChange(getDeviceState());
1923     deviceInfo->mStatus = initialStatus;
1924     bool isAPI1Compatible = deviceInfo->isAPI1Compatible();
1925 
1926     mDevices.push_back(std::move(deviceInfo));
1927 
1928     mUniqueCameraIds.insert(id);
1929     if (isAPI1Compatible) {
1930         // addDevice can be called more than once for the same camera id if HAL
1931         // supports openLegacy.
1932         if (std::find(mUniqueAPI1CompatibleCameraIds.begin(), mUniqueAPI1CompatibleCameraIds.end(),
1933                 id) == mUniqueAPI1CompatibleCameraIds.end()) {
1934             mUniqueAPI1CompatibleCameraIds.push_back(id);
1935         }
1936     }
1937 
1938     if (parsedId != nullptr) {
1939         *parsedId = id;
1940     }
1941     return OK;
1942 }
1943 
removeDevice(std::string id)1944 void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
1945     for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
1946         if ((*it)->mId == id) {
1947             mUniqueCameraIds.erase(id);
1948             mUnavailablePhysicalCameras.erase(id);
1949             if ((*it)->isAPI1Compatible()) {
1950                 mUniqueAPI1CompatibleCameraIds.erase(std::remove(
1951                     mUniqueAPI1CompatibleCameraIds.begin(),
1952                     mUniqueAPI1CompatibleCameraIds.end(), id));
1953             }
1954 
1955             // Remove reference to camera provider to avoid pointer leak when
1956             // unplugging external camera while in use with lazy HALs
1957             mManager->removeRef(DeviceMode::CAMERA, id);
1958             mManager->removeRef(DeviceMode::TORCH, id);
1959 
1960             mDevices.erase(it);
1961             break;
1962         }
1963     }
1964 }
1965 
removeAllDevices()1966 void CameraProviderManager::ProviderInfo::removeAllDevices() {
1967     std::lock_guard<std::mutex> lock(mLock);
1968 
1969     auto itDevices = mDevices.begin();
1970     while (itDevices != mDevices.end()) {
1971         std::string id = (*itDevices)->mId;
1972         std::string deviceName = (*itDevices)->mName;
1973         removeDevice(id);
1974         // device was removed, reset iterator
1975         itDevices = mDevices.begin();
1976 
1977         //notify CameraService of status change
1978         sp<StatusListener> listener = mManager->getStatusListener();
1979         if (listener != nullptr) {
1980             mLock.unlock();
1981             ALOGV("%s: notify device not_present: %s",
1982                   __FUNCTION__,
1983                   deviceName.c_str());
1984             listener->onDeviceStatusChanged(String8(id.c_str()),
1985                                             CameraDeviceStatus::NOT_PRESENT);
1986             mLock.lock();
1987         }
1988     }
1989 }
1990 
isExternalLazyHAL() const1991 bool CameraProviderManager::ProviderInfo::isExternalLazyHAL() const {
1992     return kEnableLazyHal && (mProviderName == kExternalProviderName);
1993 }
1994 
dump(int fd,const Vector<String16> &) const1995 status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
1996     dprintf(fd, "== Camera Provider HAL %s (v2.%d, %s) static info: %zu devices: ==\n",
1997             mProviderInstance.c_str(),
1998             mMinorVersion,
1999             mIsRemote ? "remote" : "passthrough",
2000             mDevices.size());
2001 
2002     for (auto& device : mDevices) {
2003         dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(),
2004                 device->mVersion.get_major(), device->mVersion.get_minor());
2005         dprintf(fd, "  Resource cost: %d\n", device->mResourceCost.resourceCost);
2006         if (device->mResourceCost.conflictingDevices.size() == 0) {
2007             dprintf(fd, "  Conflicting devices: None\n");
2008         } else {
2009             dprintf(fd, "  Conflicting devices:\n");
2010             for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) {
2011                 dprintf(fd, "    %s\n",
2012                         device->mResourceCost.conflictingDevices[i].c_str());
2013             }
2014         }
2015         dprintf(fd, "  API1 info:\n");
2016         dprintf(fd, "    Has a flash unit: %s\n",
2017                 device->hasFlashUnit() ? "true" : "false");
2018         hardware::CameraInfo info;
2019         int portraitRotation;
2020         status_t res = device->getCameraInfo(/*overrideToPortrait*/false, &portraitRotation,
2021                 &info);
2022         if (res != OK) {
2023             dprintf(fd, "   <Error reading camera info: %s (%d)>\n",
2024                     strerror(-res), res);
2025         } else {
2026             dprintf(fd, "    Facing: %s\n",
2027                     info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front");
2028             dprintf(fd, "    Orientation: %d\n", info.orientation);
2029         }
2030         CameraMetadata info2;
2031         res = device->getCameraCharacteristics(true /*overrideForPerfClass*/, &info2,
2032                 /*overrideToPortrait*/false);
2033         if (res == INVALID_OPERATION) {
2034             dprintf(fd, "  API2 not directly supported\n");
2035         } else if (res != OK) {
2036             dprintf(fd, "  <Error reading camera characteristics: %s (%d)>\n",
2037                     strerror(-res), res);
2038         } else {
2039             dprintf(fd, "  API2 camera characteristics:\n");
2040             info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
2041         }
2042 
2043         // Dump characteristics of non-standalone physical camera
2044         if (device->mIsLogicalCamera) {
2045             for (auto& id : device->mPhysicalIds) {
2046                 // Skip if physical id is an independent camera
2047                 if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id)
2048                         != mProviderPublicCameraIds.end()) {
2049                     continue;
2050                 }
2051 
2052                 CameraMetadata physicalInfo;
2053                 status_t status = device->getPhysicalCameraCharacteristics(id, &physicalInfo);
2054                 if (status == OK) {
2055                     dprintf(fd, "  Physical camera %s characteristics:\n", id.c_str());
2056                     physicalInfo.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
2057                 }
2058             }
2059         }
2060 
2061         dprintf(fd, "== Camera HAL device %s (v%d.%d) dumpState: ==\n", device->mName.c_str(),
2062                 device->mVersion.get_major(), device->mVersion.get_minor());
2063         res = device->dumpState(fd);
2064         if (res != OK) {
2065             dprintf(fd, "   <Error dumping device %s state: %s (%d)>\n",
2066                     device->mName.c_str(), strerror(-res), res);
2067         }
2068     }
2069     return OK;
2070 }
2071 
2072 std::vector<std::unordered_set<std::string>>
getConcurrentCameraIdCombinations()2073 CameraProviderManager::ProviderInfo::getConcurrentCameraIdCombinations() {
2074     std::lock_guard<std::mutex> lock(mLock);
2075     return mConcurrentCameraIdCombinations;
2076 }
2077 
cameraDeviceStatusChangeInternal(const std::string & cameraDeviceName,CameraDeviceStatus newStatus)2078 void CameraProviderManager::ProviderInfo::cameraDeviceStatusChangeInternal(
2079         const std::string& cameraDeviceName, CameraDeviceStatus newStatus) {
2080     sp<StatusListener> listener;
2081     std::string id;
2082     std::lock_guard<std::mutex> lock(mInitLock);
2083     CameraDeviceStatus internalNewStatus = newStatus;
2084     if (!mInitialized) {
2085         mCachedStatus.emplace_back(false /*isPhysicalCameraStatus*/,
2086                 cameraDeviceName.c_str(), std::string().c_str(),
2087                 internalNewStatus);
2088         return;
2089     }
2090 
2091     {
2092         std::lock_guard<std::mutex> lock(mLock);
2093         if (OK != cameraDeviceStatusChangeLocked(&id, cameraDeviceName, newStatus)) {
2094             return;
2095         }
2096         listener = mManager->getStatusListener();
2097     }
2098 
2099     // Call without lock held to allow reentrancy into provider manager
2100     if (listener != nullptr) {
2101         listener->onDeviceStatusChanged(String8(id.c_str()), internalNewStatus);
2102     }
2103 }
2104 
cameraDeviceStatusChangeLocked(std::string * id,const std::string & cameraDeviceName,CameraDeviceStatus newStatus)2105 status_t CameraProviderManager::ProviderInfo::cameraDeviceStatusChangeLocked(
2106         std::string* id, const std::string& cameraDeviceName,
2107         CameraDeviceStatus newStatus) {
2108     bool known = false;
2109     std::string cameraId;
2110     for (auto& deviceInfo : mDevices) {
2111         if (deviceInfo->mName == cameraDeviceName) {
2112             Mutex::Autolock l(deviceInfo->mDeviceAvailableLock);
2113             ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(),
2114                     FrameworkDeviceStatusToString(newStatus),
2115                     FrameworkDeviceStatusToString(deviceInfo->mStatus));
2116             deviceInfo->mStatus = newStatus;
2117             // TODO: Handle device removal (NOT_PRESENT)
2118             cameraId = deviceInfo->mId;
2119             known = true;
2120             deviceInfo->mIsDeviceAvailable =
2121                 (newStatus == CameraDeviceStatus::PRESENT);
2122             deviceInfo->mDeviceAvailableSignal.signal();
2123             break;
2124         }
2125     }
2126     // Previously unseen device; status must not be NOT_PRESENT
2127     if (!known) {
2128         if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
2129             ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.",
2130                 mProviderName.c_str(), cameraDeviceName.c_str());
2131             return BAD_VALUE;
2132         }
2133         addDevice(cameraDeviceName, newStatus, &cameraId);
2134     } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
2135         removeDevice(cameraId);
2136     } else if (isExternalLazyHAL()) {
2137         // Do not notify CameraService for PRESENT->PRESENT (lazy HAL restart)
2138         // because NOT_AVAILABLE is set on CameraService::connect and a PRESENT
2139         // notif. would overwrite it
2140         return BAD_VALUE;
2141     }
2142 
2143     if (reCacheConcurrentStreamingCameraIdsLocked() != OK) {
2144         ALOGE("%s: CameraProvider %s could not re-cache concurrent streaming camera id list ",
2145                   __FUNCTION__, mProviderName.c_str());
2146     }
2147     *id = cameraId;
2148     return OK;
2149 }
2150 
physicalCameraDeviceStatusChangeInternal(const std::string & cameraDeviceName,const std::string & physicalCameraDeviceName,CameraDeviceStatus newStatus)2151 void CameraProviderManager::ProviderInfo::physicalCameraDeviceStatusChangeInternal(
2152         const std::string& cameraDeviceName,
2153         const std::string& physicalCameraDeviceName,
2154         CameraDeviceStatus newStatus) {
2155     sp<StatusListener> listener;
2156     std::string id;
2157     std::string physicalId;
2158     std::lock_guard<std::mutex> lock(mInitLock);
2159     if (!mInitialized) {
2160         mCachedStatus.emplace_back(true /*isPhysicalCameraStatus*/, cameraDeviceName,
2161                 physicalCameraDeviceName, newStatus);
2162         return;
2163     }
2164 
2165     {
2166         std::lock_guard<std::mutex> lock(mLock);
2167 
2168         if (OK != physicalCameraDeviceStatusChangeLocked(&id, &physicalId, cameraDeviceName,
2169                 physicalCameraDeviceName, newStatus)) {
2170             return;
2171         }
2172 
2173         listener = mManager->getStatusListener();
2174     }
2175     // Call without lock held to allow reentrancy into provider manager
2176     if (listener != nullptr) {
2177         listener->onDeviceStatusChanged(String8(id.c_str()),
2178                 String8(physicalId.c_str()), newStatus);
2179     }
2180     return;
2181 }
2182 
physicalCameraDeviceStatusChangeLocked(std::string * id,std::string * physicalId,const std::string & cameraDeviceName,const std::string & physicalCameraDeviceName,CameraDeviceStatus newStatus)2183 status_t CameraProviderManager::ProviderInfo::physicalCameraDeviceStatusChangeLocked(
2184             std::string* id, std::string* physicalId,
2185             const std::string& cameraDeviceName,
2186             const std::string& physicalCameraDeviceName,
2187             CameraDeviceStatus newStatus) {
2188     bool known = false;
2189     std::string cameraId;
2190     for (auto& deviceInfo : mDevices) {
2191         if (deviceInfo->mName == cameraDeviceName) {
2192             cameraId = deviceInfo->mId;
2193             if (!deviceInfo->mIsLogicalCamera) {
2194                 ALOGE("%s: Invalid combination of camera id %s, physical id %s",
2195                         __FUNCTION__, cameraId.c_str(), physicalCameraDeviceName.c_str());
2196                 return BAD_VALUE;
2197             }
2198             if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
2199                     physicalCameraDeviceName) == deviceInfo->mPhysicalIds.end()) {
2200                 ALOGE("%s: Invalid combination of camera id %s, physical id %s",
2201                         __FUNCTION__, cameraId.c_str(), physicalCameraDeviceName.c_str());
2202                 return BAD_VALUE;
2203             }
2204             ALOGI("Camera device %s physical device %s status is now %s",
2205                     cameraDeviceName.c_str(), physicalCameraDeviceName.c_str(),
2206                     FrameworkDeviceStatusToString(newStatus));
2207             known = true;
2208             break;
2209         }
2210     }
2211     // Previously unseen device; status must not be NOT_PRESENT
2212     if (!known) {
2213         ALOGW("Camera provider %s says an unknown camera device %s-%s is not present. Curious.",
2214                 mProviderName.c_str(), cameraDeviceName.c_str(),
2215                 physicalCameraDeviceName.c_str());
2216         return BAD_VALUE;
2217     }
2218 
2219     if (mUnavailablePhysicalCameras.count(cameraId) == 0) {
2220         mUnavailablePhysicalCameras.emplace(cameraId, std::set<std::string>{});
2221     }
2222     if (newStatus != CameraDeviceStatus::PRESENT) {
2223         mUnavailablePhysicalCameras[cameraId].insert(physicalCameraDeviceName);
2224     } else {
2225         mUnavailablePhysicalCameras[cameraId].erase(physicalCameraDeviceName);
2226     }
2227 
2228     *id = cameraId;
2229     *physicalId = physicalCameraDeviceName.c_str();
2230     return OK;
2231 }
2232 
torchModeStatusChangeInternal(const std::string & cameraDeviceName,TorchModeStatus newStatus)2233 void CameraProviderManager::ProviderInfo::torchModeStatusChangeInternal(
2234         const std::string& cameraDeviceName,
2235         TorchModeStatus newStatus) {
2236     sp<StatusListener> listener;
2237     SystemCameraKind systemCameraKind = SystemCameraKind::PUBLIC;
2238     std::string id;
2239     bool known = false;
2240     {
2241         // Hold mLock for accessing mDevices
2242         std::lock_guard<std::mutex> lock(mLock);
2243         for (auto& deviceInfo : mDevices) {
2244             if (deviceInfo->mName == cameraDeviceName) {
2245                 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(),
2246                         FrameworkTorchStatusToString(newStatus));
2247                 id = deviceInfo->mId;
2248                 known = true;
2249                 systemCameraKind = deviceInfo->mSystemCameraKind;
2250                 if (TorchModeStatus::AVAILABLE_ON != newStatus) {
2251                     mManager->removeRef(CameraProviderManager::DeviceMode::TORCH, id);
2252                 }
2253                 break;
2254             }
2255         }
2256         if (!known) {
2257             ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.",
2258                     mProviderName.c_str(), cameraDeviceName.c_str(), newStatus);
2259             return;
2260         }
2261         // no lock needed since listener is set up only once during
2262         // CameraProviderManager initialization and then never changed till it is
2263         // destructed.
2264         listener = mManager->getStatusListener();
2265      }
2266     // Call without lock held to allow reentrancy into provider manager
2267     // The problem with holding mLock here is that we
2268     // might be limiting re-entrancy : CameraService::onTorchStatusChanged calls
2269     // back into CameraProviderManager which might try to hold mLock again (eg:
2270     // findDeviceInfo, which should be holding mLock while iterating through
2271     // each provider's devices).
2272     if (listener != nullptr) {
2273         listener->onTorchStatusChanged(String8(id.c_str()), newStatus, systemCameraKind);
2274     }
2275     return;
2276 }
2277 
notifyDeviceInfoStateChangeLocked(int64_t newDeviceState)2278 void CameraProviderManager::ProviderInfo::notifyDeviceInfoStateChangeLocked(
2279         int64_t newDeviceState) {
2280     std::lock_guard<std::mutex> lock(mLock);
2281     for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
2282         (*it)->notifyDeviceStateChange(newDeviceState);
2283     }
2284 }
2285 
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)2286 CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name,
2287         const metadata_vendor_id_t tagId, const std::string &id,
2288         uint16_t minorVersion,
2289         const CameraResourceCost& resourceCost,
2290         sp<ProviderInfo> parentProvider,
2291         const std::vector<std::string>& publicCameraIds) :
2292         DeviceInfo(name, tagId, id, hardware::hidl_version{3, minorVersion},
2293                    publicCameraIds, resourceCost, parentProvider) { }
2294 
notifyDeviceStateChange(int64_t newState)2295 void CameraProviderManager::ProviderInfo::DeviceInfo3::notifyDeviceStateChange(int64_t newState) {
2296     if (!mDeviceStateOrientationMap.empty() &&
2297             (mDeviceStateOrientationMap.find(newState) != mDeviceStateOrientationMap.end())) {
2298         mCameraCharacteristics.update(ANDROID_SENSOR_ORIENTATION,
2299                 &mDeviceStateOrientationMap[newState], 1);
2300     }
2301 }
2302 
getCameraInfo(bool overrideToPortrait,int * portraitRotation,hardware::CameraInfo * info) const2303 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo(
2304         bool overrideToPortrait, int *portraitRotation,
2305         hardware::CameraInfo *info) const {
2306     if (info == nullptr) return BAD_VALUE;
2307 
2308     camera_metadata_ro_entry facing =
2309             mCameraCharacteristics.find(ANDROID_LENS_FACING);
2310     if (facing.count == 1) {
2311         switch (facing.data.u8[0]) {
2312             case ANDROID_LENS_FACING_BACK:
2313                 info->facing = hardware::CAMERA_FACING_BACK;
2314                 break;
2315             case ANDROID_LENS_FACING_EXTERNAL:
2316                 // Map external to front for legacy API
2317             case ANDROID_LENS_FACING_FRONT:
2318                 info->facing = hardware::CAMERA_FACING_FRONT;
2319                 break;
2320         }
2321     } else {
2322         ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__);
2323         return NAME_NOT_FOUND;
2324     }
2325 
2326     camera_metadata_ro_entry orientation =
2327             mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION);
2328     if (orientation.count == 1) {
2329         info->orientation = orientation.data.i32[0];
2330     } else {
2331         ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__);
2332         return NAME_NOT_FOUND;
2333     }
2334 
2335     if (overrideToPortrait && (info->orientation == 0 || info->orientation == 180)) {
2336         *portraitRotation = 90;
2337         if (info->facing == hardware::CAMERA_FACING_FRONT) {
2338             info->orientation = (360 + info->orientation - 90) % 360;
2339         } else {
2340             info->orientation = (360 + info->orientation + 90) % 360;
2341         }
2342     } else {
2343         *portraitRotation = 0;
2344     }
2345 
2346     return OK;
2347 }
isAPI1Compatible() const2348 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const {
2349     // Do not advertise NIR cameras to API1 camera app.
2350     camera_metadata_ro_entry cfa = mCameraCharacteristics.find(
2351             ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT);
2352     if (cfa.count == 1 && cfa.data.u8[0] == ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR) {
2353         return false;
2354     }
2355 
2356     bool isBackwardCompatible = false;
2357     camera_metadata_ro_entry_t caps = mCameraCharacteristics.find(
2358             ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
2359     for (size_t i = 0; i < caps.count; i++) {
2360         if (caps.data.u8[i] ==
2361                 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) {
2362             isBackwardCompatible = true;
2363             break;
2364         }
2365     }
2366 
2367     return isBackwardCompatible;
2368 }
2369 
getCameraCharacteristics(bool overrideForPerfClass,CameraMetadata * characteristics,bool overrideToPortrait)2370 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
2371         bool overrideForPerfClass, CameraMetadata *characteristics, bool overrideToPortrait) {
2372     if (characteristics == nullptr) return BAD_VALUE;
2373 
2374     if (!overrideForPerfClass && mCameraCharNoPCOverride != nullptr) {
2375         *characteristics = *mCameraCharNoPCOverride;
2376     } else {
2377         *characteristics = mCameraCharacteristics;
2378     }
2379 
2380     if (overrideToPortrait) {
2381         const auto &lensFacingEntry = characteristics->find(ANDROID_LENS_FACING);
2382         const auto &sensorOrientationEntry = characteristics->find(ANDROID_SENSOR_ORIENTATION);
2383         uint8_t lensFacing = lensFacingEntry.data.u8[0];
2384         if (lensFacingEntry.count > 0 && sensorOrientationEntry.count > 0) {
2385             int32_t sensorOrientation = sensorOrientationEntry.data.i32[0];
2386             int32_t newSensorOrientation = sensorOrientation;
2387 
2388             if (sensorOrientation == 0 || sensorOrientation == 180) {
2389                 if (lensFacing == ANDROID_LENS_FACING_FRONT) {
2390                     newSensorOrientation = (360 + sensorOrientation - 90) % 360;
2391                 } else if (lensFacing == ANDROID_LENS_FACING_BACK) {
2392                     newSensorOrientation = (360 + sensorOrientation + 90) % 360;
2393                 }
2394             }
2395 
2396             if (newSensorOrientation != sensorOrientation) {
2397                 ALOGV("%s: Update ANDROID_SENSOR_ORIENTATION for lens facing %d "
2398                         "from %d to %d", __FUNCTION__, lensFacing, sensorOrientation,
2399                         newSensorOrientation);
2400                 characteristics->update(ANDROID_SENSOR_ORIENTATION, &newSensorOrientation, 1);
2401             }
2402         }
2403 
2404         if (characteristics->exists(ANDROID_INFO_DEVICE_STATE_ORIENTATIONS)) {
2405             ALOGV("%s: Erasing ANDROID_INFO_DEVICE_STATE_ORIENTATIONS for lens facing %d",
2406                     __FUNCTION__, lensFacing);
2407             characteristics->erase(ANDROID_INFO_DEVICE_STATE_ORIENTATIONS);
2408         }
2409     }
2410 
2411     return OK;
2412 }
2413 
getPhysicalCameraCharacteristics(const std::string & physicalCameraId,CameraMetadata * characteristics) const2414 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraCharacteristics(
2415         const std::string& physicalCameraId, CameraMetadata *characteristics) const {
2416     if (characteristics == nullptr) return BAD_VALUE;
2417     if (mPhysicalCameraCharacteristics.find(physicalCameraId) ==
2418             mPhysicalCameraCharacteristics.end()) {
2419         return NAME_NOT_FOUND;
2420     }
2421 
2422     *characteristics = mPhysicalCameraCharacteristics.at(physicalCameraId);
2423     return OK;
2424 }
2425 
filterSmallJpegSizes()2426 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::filterSmallJpegSizes() {
2427     int32_t thresholdW = SessionConfigurationUtils::PERF_CLASS_JPEG_THRESH_W;
2428     int32_t thresholdH = SessionConfigurationUtils::PERF_CLASS_JPEG_THRESH_H;
2429 
2430     if (mCameraCharNoPCOverride != nullptr) return OK;
2431 
2432     mCameraCharNoPCOverride = std::make_unique<CameraMetadata>(mCameraCharacteristics);
2433 
2434     // Remove small JPEG sizes from available stream configurations
2435     size_t largeJpegCount = 0;
2436     std::vector<int32_t> newStreamConfigs;
2437     camera_metadata_entry streamConfigs =
2438             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
2439     for (size_t i = 0; i < streamConfigs.count; i += 4) {
2440         if ((streamConfigs.data.i32[i] == HAL_PIXEL_FORMAT_BLOB) && (streamConfigs.data.i32[i+3] ==
2441                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) {
2442             if (streamConfigs.data.i32[i+1] * streamConfigs.data.i32[i+2] <
2443                     thresholdW * thresholdH) {
2444                 continue;
2445             } else {
2446                 largeJpegCount ++;
2447             }
2448         }
2449         newStreamConfigs.insert(newStreamConfigs.end(), streamConfigs.data.i32 + i,
2450                 streamConfigs.data.i32 + i + 4);
2451     }
2452     if (newStreamConfigs.size() == 0 || largeJpegCount == 0) {
2453         return BAD_VALUE;
2454     }
2455 
2456     // Remove small JPEG sizes from available min frame durations
2457     largeJpegCount = 0;
2458     std::vector<int64_t> newMinDurations;
2459     camera_metadata_entry minDurations =
2460             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
2461     for (size_t i = 0; i < minDurations.count; i += 4) {
2462         if (minDurations.data.i64[i] == HAL_PIXEL_FORMAT_BLOB) {
2463             if ((int32_t)minDurations.data.i64[i+1] * (int32_t)minDurations.data.i64[i+2] <
2464                     thresholdW * thresholdH) {
2465                 continue;
2466             } else {
2467                 largeJpegCount++;
2468             }
2469         }
2470         newMinDurations.insert(newMinDurations.end(), minDurations.data.i64 + i,
2471                 minDurations.data.i64 + i + 4);
2472     }
2473     if (newMinDurations.size() == 0 || largeJpegCount == 0) {
2474         return BAD_VALUE;
2475     }
2476 
2477     // Remove small JPEG sizes from available stall durations
2478     largeJpegCount = 0;
2479     std::vector<int64_t> newStallDurations;
2480     camera_metadata_entry stallDurations =
2481             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
2482     for (size_t i = 0; i < stallDurations.count; i += 4) {
2483         if (stallDurations.data.i64[i] == HAL_PIXEL_FORMAT_BLOB) {
2484             if ((int32_t)stallDurations.data.i64[i+1] * (int32_t)stallDurations.data.i64[i+2] <
2485                     thresholdW * thresholdH) {
2486                 continue;
2487             } else {
2488                 largeJpegCount++;
2489             }
2490         }
2491         newStallDurations.insert(newStallDurations.end(), stallDurations.data.i64 + i,
2492                 stallDurations.data.i64 + i + 4);
2493     }
2494     if (newStallDurations.size() == 0 || largeJpegCount == 0) {
2495         return BAD_VALUE;
2496     }
2497 
2498     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
2499             newStreamConfigs.data(), newStreamConfigs.size());
2500     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
2501             newMinDurations.data(), newMinDurations.size());
2502     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
2503             newStallDurations.data(), newStallDurations.size());
2504 
2505     // Re-generate metadata tags that have dependencies on BLOB sizes
2506     auto res = addDynamicDepthTags();
2507     if (OK != res) {
2508         ALOGE("%s: Failed to append dynamic depth tags: %s (%d)", __FUNCTION__,
2509                 strerror(-res), res);
2510         // Allow filtering of small JPEG sizes to succeed even if dynamic depth
2511         // tags fail to generate.
2512     }
2513 
2514     return OK;
2515 }
2516 
parseProviderName(const std::string & name,std::string * type,uint32_t * id)2517 status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name,
2518         std::string *type, uint32_t *id) {
2519     // Format must be "<type>/<id>"
2520 #define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. "       \
2521     "Should match '<type>/<id>' - "
2522 
2523     if (!type || !id) return INVALID_OPERATION;
2524 
2525     std::string::size_type slashIdx = name.find('/');
2526     if (slashIdx == std::string::npos || slashIdx == name.size() - 1) {
2527         ALOGE(ERROR_MSG_PREFIX
2528                 "does not have / separator between type and id",
2529                 __FUNCTION__, name.c_str());
2530         return BAD_VALUE;
2531     }
2532 
2533     std::string typeVal = name.substr(0, slashIdx);
2534 
2535     char *endPtr;
2536     errno = 0;
2537     long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10);
2538     if (errno != 0) {
2539         ALOGE(ERROR_MSG_PREFIX
2540                 "cannot parse provider id as an integer: %s (%d)",
2541                 __FUNCTION__, name.c_str(), strerror(errno), errno);
2542         return BAD_VALUE;
2543     }
2544     if (endPtr != name.c_str() + name.size()) {
2545         ALOGE(ERROR_MSG_PREFIX
2546                 "provider id has unexpected length",
2547                 __FUNCTION__, name.c_str());
2548         return BAD_VALUE;
2549     }
2550     if (idVal < 0) {
2551         ALOGE(ERROR_MSG_PREFIX
2552                 "id is negative: %ld",
2553                 __FUNCTION__, name.c_str(), idVal);
2554         return BAD_VALUE;
2555     }
2556 
2557 #undef ERROR_MSG_PREFIX
2558 
2559     *type = typeVal;
2560     *id = static_cast<uint32_t>(idVal);
2561 
2562     return OK;
2563 }
2564 
generateVendorTagId(const std::string & name)2565 metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId(
2566         const std::string &name) {
2567     metadata_vendor_id_t ret = std::hash<std::string> {} (name);
2568     // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value
2569     if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) {
2570         ret = 0;
2571     }
2572 
2573     return ret;
2574 }
2575 
parseDeviceName(const std::string & name,uint16_t * major,uint16_t * minor,std::string * type,std::string * id)2576 status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name,
2577         uint16_t *major, uint16_t *minor, std::string *type, std::string *id) {
2578 
2579     // Format must be "device@<major>.<minor>/<type>/<id>"
2580 
2581 #define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \
2582     "Should match 'device@<major>.<minor>/<type>/<id>' - "
2583 
2584     if (!major || !minor || !type || !id) return INVALID_OPERATION;
2585 
2586     // Verify starting prefix
2587     const char expectedPrefix[] = "device@";
2588 
2589     if (name.find(expectedPrefix) != 0) {
2590         ALOGE(ERROR_MSG_PREFIX
2591                 "does not start with '%s'",
2592                 __FUNCTION__, name.c_str(), expectedPrefix);
2593         return BAD_VALUE;
2594     }
2595 
2596     // Extract major/minor versions
2597     constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2;
2598     std::string::size_type dotIdx = name.find('.', atIdx);
2599     if (dotIdx == std::string::npos) {
2600         ALOGE(ERROR_MSG_PREFIX
2601                 "does not have @<major>. version section",
2602                 __FUNCTION__, name.c_str());
2603         return BAD_VALUE;
2604     }
2605     std::string::size_type typeSlashIdx = name.find('/', dotIdx);
2606     if (typeSlashIdx == std::string::npos) {
2607         ALOGE(ERROR_MSG_PREFIX
2608                 "does not have .<minor>/ version section",
2609                 __FUNCTION__, name.c_str());
2610         return BAD_VALUE;
2611     }
2612 
2613     char *endPtr;
2614     errno = 0;
2615     long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10);
2616     if (errno != 0) {
2617         ALOGE(ERROR_MSG_PREFIX
2618                 "cannot parse major version: %s (%d)",
2619                 __FUNCTION__, name.c_str(), strerror(errno), errno);
2620         return BAD_VALUE;
2621     }
2622     if (endPtr != name.c_str() + dotIdx) {
2623         ALOGE(ERROR_MSG_PREFIX
2624                 "major version has unexpected length",
2625                 __FUNCTION__, name.c_str());
2626         return BAD_VALUE;
2627     }
2628     long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10);
2629     if (errno != 0) {
2630         ALOGE(ERROR_MSG_PREFIX
2631                 "cannot parse minor version: %s (%d)",
2632                 __FUNCTION__, name.c_str(), strerror(errno), errno);
2633         return BAD_VALUE;
2634     }
2635     if (endPtr != name.c_str() + typeSlashIdx) {
2636         ALOGE(ERROR_MSG_PREFIX
2637                 "minor version has unexpected length",
2638                 __FUNCTION__, name.c_str());
2639         return BAD_VALUE;
2640     }
2641     if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) {
2642         ALOGE(ERROR_MSG_PREFIX
2643                 "major/minor version is out of range of uint16_t: %ld.%ld",
2644                 __FUNCTION__, name.c_str(), majorVal, minorVal);
2645         return BAD_VALUE;
2646     }
2647 
2648     // Extract type and id
2649 
2650     std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1);
2651     if (instanceSlashIdx == std::string::npos) {
2652         ALOGE(ERROR_MSG_PREFIX
2653                 "does not have /<type>/ component",
2654                 __FUNCTION__, name.c_str());
2655         return BAD_VALUE;
2656     }
2657     std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1);
2658 
2659     if (instanceSlashIdx == name.size() - 1) {
2660         ALOGE(ERROR_MSG_PREFIX
2661                 "does not have an /<id> component",
2662                 __FUNCTION__, name.c_str());
2663         return BAD_VALUE;
2664     }
2665     std::string idVal = name.substr(instanceSlashIdx + 1);
2666 
2667 #undef ERROR_MSG_PREFIX
2668 
2669     *major = static_cast<uint16_t>(majorVal);
2670     *minor = static_cast<uint16_t>(minorVal);
2671     *type = typeVal;
2672     *id = idVal;
2673 
2674     return OK;
2675 }
2676 
~ProviderInfo()2677 CameraProviderManager::ProviderInfo::~ProviderInfo() {
2678     // Destruction of ProviderInfo is only supposed to happen when the respective
2679     // CameraProvider interface dies, so do not unregister callbacks.
2680 }
2681 
2682 // Expects to have mInterfaceMutex locked
2683 std::vector<std::unordered_set<std::string>>
getConcurrentCameraIds() const2684 CameraProviderManager::getConcurrentCameraIds() const {
2685     std::vector<std::unordered_set<std::string>> deviceIdCombinations;
2686     std::lock_guard<std::mutex> lock(mInterfaceMutex);
2687     for (auto &provider : mProviders) {
2688         for (auto &combinations : provider->getConcurrentCameraIdCombinations()) {
2689             deviceIdCombinations.push_back(combinations);
2690         }
2691     }
2692     return deviceIdCombinations;
2693 }
2694 
2695 // Checks if the containing vector of sets has any set that contains all of the
2696 // camera ids in cameraIdsAndSessionConfigs.
checkIfSetContainsAll(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::vector<std::unordered_set<std::string>> & containingSets)2697 static bool checkIfSetContainsAll(
2698         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
2699         const std::vector<std::unordered_set<std::string>> &containingSets) {
2700     for (auto &containingSet : containingSets) {
2701         bool didHaveAll = true;
2702         for (auto &cameraIdAndSessionConfig : cameraIdsAndSessionConfigs) {
2703             if (containingSet.find(cameraIdAndSessionConfig.mCameraId) == containingSet.end()) {
2704                 // a camera id doesn't belong to this set, keep looking in other
2705                 // sets
2706                 didHaveAll = false;
2707                 break;
2708             }
2709         }
2710         if (didHaveAll) {
2711             // found a set that has all camera ids, lets return;
2712             return true;
2713         }
2714     }
2715     return false;
2716 }
2717 
isConcurrentSessionConfigurationSupported(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::set<std::string> & perfClassPrimaryCameraIds,int targetSdkVersion,bool * isSupported)2718 status_t CameraProviderManager::isConcurrentSessionConfigurationSupported(
2719         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
2720         const std::set<std::string>& perfClassPrimaryCameraIds,
2721         int targetSdkVersion, bool *isSupported) {
2722     std::lock_guard<std::mutex> lock(mInterfaceMutex);
2723     // Check if all the devices are a subset of devices advertised by the
2724     // same provider through getConcurrentStreamingCameraIds()
2725     // TODO: we should also do a findDeviceInfoLocked here ?
2726     for (auto &provider : mProviders) {
2727         if (checkIfSetContainsAll(cameraIdsAndSessionConfigs,
2728                 provider->getConcurrentCameraIdCombinations())) {
2729             return provider->isConcurrentSessionConfigurationSupported(
2730                     cameraIdsAndSessionConfigs, perfClassPrimaryCameraIds, targetSdkVersion,
2731                     isSupported);
2732         }
2733     }
2734     *isSupported = false;
2735     //The set of camera devices were not found
2736     return INVALID_OPERATION;
2737 }
2738 
getCameraCharacteristicsLocked(const std::string & id,bool overrideForPerfClass,CameraMetadata * characteristics,bool overrideToPortrait) const2739 status_t CameraProviderManager::getCameraCharacteristicsLocked(const std::string &id,
2740         bool overrideForPerfClass, CameraMetadata* characteristics,
2741         bool overrideToPortrait) const {
2742     auto deviceInfo = findDeviceInfoLocked(id);
2743     if (deviceInfo != nullptr) {
2744         return deviceInfo->getCameraCharacteristics(overrideForPerfClass, characteristics,
2745                 overrideToPortrait);
2746     }
2747 
2748     // Find hidden physical camera characteristics
2749     for (auto& provider : mProviders) {
2750         for (auto& deviceInfo : provider->mDevices) {
2751             status_t res = deviceInfo->getPhysicalCameraCharacteristics(id, characteristics);
2752             if (res != NAME_NOT_FOUND) return res;
2753         }
2754     }
2755 
2756     return NAME_NOT_FOUND;
2757 }
2758 
filterLogicalCameraIdsLocked(std::vector<std::string> & deviceIds) const2759 void CameraProviderManager::filterLogicalCameraIdsLocked(
2760         std::vector<std::string>& deviceIds) const
2761 {
2762     // Map between camera facing and camera IDs related to logical camera.
2763     std::map<int, std::unordered_set<std::string>> idCombos;
2764 
2765     // Collect all logical and its underlying physical camera IDs for each
2766     // facing.
2767     for (auto& deviceId : deviceIds) {
2768         auto deviceInfo = findDeviceInfoLocked(deviceId);
2769         if (deviceInfo == nullptr) continue;
2770 
2771         if (!deviceInfo->mIsLogicalCamera) {
2772             continue;
2773         }
2774 
2775         // combo contains the ids of a logical camera and its physical cameras
2776         std::vector<std::string> combo = deviceInfo->mPhysicalIds;
2777         combo.push_back(deviceId);
2778 
2779         hardware::CameraInfo info;
2780         int portraitRotation;
2781         status_t res = deviceInfo->getCameraInfo(/*overrideToPortrait*/false, &portraitRotation,
2782                 &info);
2783         if (res != OK) {
2784             ALOGE("%s: Error reading camera info: %s (%d)", __FUNCTION__, strerror(-res), res);
2785             continue;
2786         }
2787         idCombos[info.facing].insert(combo.begin(), combo.end());
2788     }
2789 
2790     // Only expose one camera ID per facing for all logical and underlying
2791     // physical camera IDs.
2792     for (auto& r : idCombos) {
2793         auto& removedIds = r.second;
2794         for (auto& id : deviceIds) {
2795             auto foundId = std::find(removedIds.begin(), removedIds.end(), id);
2796             if (foundId == removedIds.end()) {
2797                 continue;
2798             }
2799 
2800             removedIds.erase(foundId);
2801             break;
2802         }
2803         deviceIds.erase(std::remove_if(deviceIds.begin(), deviceIds.end(),
2804                 [&removedIds](const std::string& s) {
2805                 return removedIds.find(s) != removedIds.end();}),
2806                 deviceIds.end());
2807     }
2808 }
2809 
2810 } // namespace android
2811