xref: /aosp_15_r20/frameworks/av/services/camera/libcameraservice/common/CameraProviderManager.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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 #include "system/camera_metadata.h"
18 #include "system/graphics-base-v1.0.h"
19 #include "system/graphics-base-v1.1.h"
20 #define LOG_TAG "CameraProviderManager"
21 #define ATRACE_TAG ATRACE_TAG_CAMERA
22 //#define LOG_NDEBUG 0
23 
24 #include "CameraProviderManager.h"
25 
26 #include <aidl/android/hardware/camera/device/ICameraDevice.h>
27 
28 #include <algorithm>
29 #include <chrono>
30 #include "common/DepthPhotoProcessor.h"
31 #include "hidl/HidlProviderInfo.h"
32 #include "aidl/AidlProviderInfo.h"
33 #include <dlfcn.h>
34 #include <future>
35 #include <inttypes.h>
36 #include <android_companion_virtualdevice_flags.h>
37 #include <android_companion_virtualdevice_build_flags.h>
38 #include <android/binder_libbinder.h>
39 #include <android/binder_manager.h>
40 #include <android/hidl/manager/1.2/IServiceManager.h>
41 #include <hidl/ServiceManagement.h>
42 #include <com_android_internal_camera_flags.h>
43 #include <com_android_window_flags.h>
44 #include <functional>
45 #include <camera_metadata_hidden.h>
46 #include <android-base/parseint.h>
47 #include <android-base/logging.h>
48 #include <cutils/properties.h>
49 #include <hwbinder/IPCThreadState.h>
50 #include <utils/Trace.h>
51 #include <ui/PublicFormat.h>
52 #include <camera/StringUtils.h>
53 
54 #include "api2/HeicCompositeStream.h"
55 #include "device3/ZoomRatioMapper.h"
56 #include "utils/Utils.h"
57 
58 namespace android {
59 
60 using namespace ::android::hardware::camera;
61 using namespace ::android::camera3;
62 using android::hardware::camera::common::V1_0::Status;
63 using namespace camera3::SessionConfigurationUtils;
64 using std::literals::chrono_literals::operator""s;
65 using hardware::camera2::utils::CameraIdAndSessionConfiguration;
66 using hardware::camera2::params::OutputConfiguration;
67 
68 namespace flags = com::android::internal::camera::flags;
69 namespace vd_flags = android::companion::virtualdevice::flags;
70 namespace wm_flags = com::android::window::flags;
71 
72 namespace {
73 const bool kEnableLazyHal(property_get_bool("ro.camera.enableLazyHal", false));
74 const std::string kExternalProviderName = "external/0";
75 const std::string kVirtualProviderName = "virtual/0";
76 } // anonymous namespace
77 
78 const float CameraProviderManager::kDepthARTolerance = .1f;
79 const bool CameraProviderManager::kFrameworkJpegRDisabled =
80         property_get_bool("ro.camera.disableJpegR", false);
81 const bool CameraProviderManager::kFrameworkHeicUltraHDRDisabled =
82     property_get_bool("ro.camera.disableHeicUltraHDR", false);
83 const bool CameraProviderManager::kFrameworkHeicAllowSWCodecs =
84     property_get_bool("ro.camera.enableSWHEVC", false);
85 
86 CameraProviderManager::HidlServiceInteractionProxyImpl
87 CameraProviderManager::sHidlServiceInteractionProxy{};
88 CameraProviderManager::AidlServiceInteractionProxyImpl
89 CameraProviderManager::sAidlServiceInteractionProxy{};
90 
~CameraProviderManager()91 CameraProviderManager::~CameraProviderManager() {
92 }
93 
FrameworkTorchStatusToString(const TorchModeStatus & s)94 const char* FrameworkTorchStatusToString(const TorchModeStatus& s) {
95     switch (s) {
96         case TorchModeStatus::NOT_AVAILABLE:
97             return "NOT_AVAILABLE";
98         case TorchModeStatus::AVAILABLE_OFF:
99             return "AVAILABLE_OFF";
100         case TorchModeStatus::AVAILABLE_ON:
101             return "AVAILABLE_ON";
102     }
103     ALOGW("Unexpected HAL torch mode status code %d", eToI(s));
104     return "UNKNOWN_STATUS";
105 }
106 
FrameworkDeviceStatusToString(const CameraDeviceStatus & s)107 const char* FrameworkDeviceStatusToString(const CameraDeviceStatus& s) {
108     switch (s) {
109         case CameraDeviceStatus::NOT_PRESENT:
110             return "NOT_PRESENT";
111         case CameraDeviceStatus::PRESENT:
112             return "PRESENT";
113         case CameraDeviceStatus::ENUMERATING:
114             return "ENUMERATING";
115     }
116     ALOGW("Unexpected HAL device status code %d", eToI(s));
117     return "UNKNOWN_STATUS";
118 }
119 
120 hardware::hidl_vec<hardware::hidl_string>
listServices()121 CameraProviderManager::HidlServiceInteractionProxyImpl::listServices() {
122     hardware::hidl_vec<hardware::hidl_string> ret;
123     auto manager = hardware::defaultServiceManager1_2();
124     if (manager != nullptr) {
125         manager->listManifestByInterface(provider::V2_4::ICameraProvider::descriptor,
126                 [&ret](const hardware::hidl_vec<hardware::hidl_string> &registered) {
127                     ret = registered;
128                 });
129     }
130     return ret;
131 }
132 
tryToInitAndAddHidlProvidersLocked(HidlServiceInteractionProxy * hidlProxy)133 status_t CameraProviderManager::tryToInitAndAddHidlProvidersLocked(
134         HidlServiceInteractionProxy *hidlProxy) {
135     mHidlServiceProxy = hidlProxy;
136     // Registering will trigger notifications for all already-known providers
137     bool success = mHidlServiceProxy->registerForNotifications(
138         /* instance name, empty means no filter */ "",
139         this);
140     if (!success) {
141         ALOGE("%s: Unable to register with hardware service manager for notifications "
142                 "about camera providers", __FUNCTION__);
143         return INVALID_OPERATION;
144     }
145 
146     for (const auto& instance : mHidlServiceProxy->listServices()) {
147         this->addHidlProviderLocked(instance);
148     }
149     return OK;
150 }
151 
152 std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider>
getService(const std::string & serviceName)153 CameraProviderManager::AidlServiceInteractionProxyImpl::getService(
154         const std::string& serviceName) {
155     using aidl::android::hardware::camera::provider::ICameraProvider;
156 
157     AIBinder* binder = nullptr;
158     binder = AServiceManager_waitForService(serviceName.c_str());
159 
160     if (binder == nullptr) {
161         ALOGE("%s: AIDL Camera provider HAL '%s' is not actually available, despite waiting "
162               "indefinitely?", __FUNCTION__, serviceName.c_str());
163         return nullptr;
164     }
165     std::shared_ptr<ICameraProvider> interface =
166             ICameraProvider::fromBinder(ndk::SpAIBinder(binder));
167 
168     return interface;
169 }
170 
171 std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider>
tryGetService(const std::string & serviceName)172 CameraProviderManager::AidlServiceInteractionProxyImpl::tryGetService(
173         const std::string& serviceName) {
174     using aidl::android::hardware::camera::provider::ICameraProvider;
175 
176     std::shared_ptr<ICameraProvider> interface = ICameraProvider::fromBinder(
177                     ndk::SpAIBinder(AServiceManager_checkService(serviceName.c_str())));
178     if (interface == nullptr) {
179         ALOGD("%s: AIDL Camera provider HAL '%s' is not actually available", __FUNCTION__,
180               serviceName.c_str());
181         return nullptr;
182     }
183 
184     return interface;
185 }
186 
getFullAidlProviderName(const std::string instance)187 static std::string getFullAidlProviderName(const std::string instance) {
188     std::string aidlHalServiceDescriptor =
189             std::string(aidl::android::hardware::camera::provider::ICameraProvider::descriptor);
190    return aidlHalServiceDescriptor + "/" + instance;
191 }
192 
tryToAddAidlProvidersLocked()193 status_t CameraProviderManager::tryToAddAidlProvidersLocked() {
194     const char * aidlHalServiceDescriptor =
195             aidl::android::hardware::camera::provider::ICameraProvider::descriptor;
196     auto sm = defaultServiceManager();
197     auto aidlProviders = sm->getDeclaredInstances(
198             String16(aidlHalServiceDescriptor));
199 
200     if (isVirtualCameraHalEnabled()) {
201         // Virtual Camera provider is not declared in the VINTF manifest so we
202         // manually add it if the binary is present.
203         aidlProviders.push_back(String16(kVirtualProviderName.c_str()));
204     }
205 
206     for (const auto &aidlInstance : aidlProviders) {
207         std::string aidlServiceName =
208                 getFullAidlProviderName(toStdString(aidlInstance));
209         auto res = sm->registerForNotifications(String16(aidlServiceName.c_str()), this);
210         if (res != OK) {
211             ALOGE("%s Unable to register for notifications with AIDL service manager",
212                     __FUNCTION__);
213             return res;
214         }
215         addAidlProviderLocked(aidlServiceName);
216     }
217     return OK;
218 }
219 
initialize(wp<CameraProviderManager::StatusListener> listener,HidlServiceInteractionProxy * hidlProxy,AidlServiceInteractionProxy * aidlProxy)220 status_t CameraProviderManager::initialize(wp<CameraProviderManager::StatusListener> listener,
221         HidlServiceInteractionProxy* hidlProxy, AidlServiceInteractionProxy* aidlProxy) {
222     std::lock_guard<std::mutex> lock(mInterfaceMutex);
223     if (hidlProxy == nullptr) {
224         ALOGE("%s: No valid service Hidl interaction proxy provided", __FUNCTION__);
225         return BAD_VALUE;
226     }
227 
228     if (aidlProxy == nullptr) {
229         ALOGE("%s: No valid service Aidl interaction proxy provided", __FUNCTION__);
230         return BAD_VALUE;
231     }
232     mAidlServiceProxy = aidlProxy;
233 
234     mListener = listener;
235     mDeviceState = 0;
236     auto res = tryToInitAndAddHidlProvidersLocked(hidlProxy);
237     if (res != OK) {
238         // Logging done in called function;
239         return res;
240     }
241     res = tryToAddAidlProvidersLocked();
242 
243     IPCThreadState::self()->flushCommands();
244 
245     return res;
246 }
247 
getCameraCount() const248 std::pair<int, int> CameraProviderManager::getCameraCount() const {
249     std::lock_guard<std::mutex> lock(mInterfaceMutex);
250     int systemCameraCount = 0;
251     int publicCameraCount = 0;
252     for (auto& provider : mProviders) {
253         for (auto &id : provider->mUniqueCameraIds) {
254             SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
255             if (getSystemCameraKindLocked(id, &deviceKind) != OK) {
256                 ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, id.c_str());
257                 continue;
258             }
259             switch(deviceKind) {
260                 case SystemCameraKind::PUBLIC:
261                     publicCameraCount++;
262                     break;
263                 case SystemCameraKind::SYSTEM_ONLY_CAMERA:
264                     systemCameraCount++;
265                     break;
266                 default:
267                     break;
268             }
269         }
270     }
271     return std::make_pair(systemCameraCount, publicCameraCount);
272 }
273 
getCameraDeviceIds(std::unordered_map<std::string,std::set<std::string>> * unavailablePhysicalIds) const274 std::vector<std::string> CameraProviderManager::getCameraDeviceIds(std::unordered_map<
275             std::string, std::set<std::string>>* unavailablePhysicalIds) const {
276     std::lock_guard<std::mutex> lock(mInterfaceMutex);
277     std::vector<std::string> deviceIds;
278     for (auto& provider : mProviders) {
279         for (auto& id : provider->mUniqueCameraIds) {
280             deviceIds.push_back(id);
281             if (unavailablePhysicalIds != nullptr &&
282                     provider->mUnavailablePhysicalCameras.count(id) > 0) {
283                 (*unavailablePhysicalIds)[id] = provider->mUnavailablePhysicalCameras.at(id);
284             }
285         }
286     }
287     return deviceIds;
288 }
289 
collectDeviceIdsLocked(const std::vector<std::string> deviceIds,std::vector<std::string> & publicDeviceIds,std::vector<std::string> & systemDeviceIds) const290 void CameraProviderManager::collectDeviceIdsLocked(const std::vector<std::string> deviceIds,
291         std::vector<std::string>& publicDeviceIds,
292         std::vector<std::string>& systemDeviceIds) const {
293     for (auto &deviceId : deviceIds) {
294         SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
295         if (getSystemCameraKindLocked(deviceId, &deviceKind) != OK) {
296             ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, deviceId.c_str());
297             continue;
298         }
299         if (deviceKind == SystemCameraKind::SYSTEM_ONLY_CAMERA) {
300             systemDeviceIds.push_back(deviceId);
301         } else {
302             publicDeviceIds.push_back(deviceId);
303         }
304     }
305 }
306 
getAPI1CompatibleCameraDeviceIds() const307 std::vector<std::string> CameraProviderManager::getAPI1CompatibleCameraDeviceIds() const {
308     std::lock_guard<std::mutex> lock(mInterfaceMutex);
309     std::vector<std::string> publicDeviceIds;
310     std::vector<std::string> systemDeviceIds;
311     std::vector<std::string> deviceIds;
312     for (auto& provider : mProviders) {
313         std::vector<std::string> providerDeviceIds = provider->mUniqueAPI1CompatibleCameraIds;
314         // Secure cameras should not be exposed through camera 1 api
315         providerDeviceIds.erase(std::remove_if(providerDeviceIds.begin(), providerDeviceIds.end(),
316                 [this](const std::string& s) {
317                 SystemCameraKind deviceKind = SystemCameraKind::PUBLIC;
318                 if (getSystemCameraKindLocked(s, &deviceKind) != OK) {
319                     ALOGE("%s: Invalid camera id %s, skipping", __FUNCTION__, s.c_str());
320                     return true;
321                 }
322                 return deviceKind == SystemCameraKind::HIDDEN_SECURE_CAMERA;}),
323                 providerDeviceIds.end());
324         // API1 app doesn't handle logical and physical camera devices well. So
325         // for each camera facing, only take the first id advertised by HAL in
326         // all [logical, physical1, physical2, ...] id combos, and filter out the rest.
327         filterLogicalCameraIdsLocked(providerDeviceIds);
328         collectDeviceIdsLocked(providerDeviceIds, publicDeviceIds, systemDeviceIds);
329     }
330     auto sortFunc =
331             [](const std::string& a, const std::string& b) -> bool {
332                 uint32_t aUint = 0, bUint = 0;
333                 bool aIsUint = base::ParseUint(a, &aUint);
334                 bool bIsUint = base::ParseUint(b, &bUint);
335 
336                 // Uint device IDs first
337                 if (aIsUint && bIsUint) {
338                     return aUint < bUint;
339                 } else if (aIsUint) {
340                     return true;
341                 } else if (bIsUint) {
342                     return false;
343                 }
344                 // Simple string compare if both id are not uint
345                 return a < b;
346             };
347     // We put device ids for system cameras at the end since they will be pared
348     // off for processes not having system camera permissions.
349     std::sort(publicDeviceIds.begin(), publicDeviceIds.end(), sortFunc);
350     std::sort(systemDeviceIds.begin(), systemDeviceIds.end(), sortFunc);
351     deviceIds.insert(deviceIds.end(), publicDeviceIds.begin(), publicDeviceIds.end());
352     deviceIds.insert(deviceIds.end(), systemDeviceIds.begin(), systemDeviceIds.end());
353     return deviceIds;
354 }
355 
isValidDeviceLocked(const std::string & id,uint16_t majorVersion,IPCTransport transport) const356 bool CameraProviderManager::isValidDeviceLocked(const std::string &id, uint16_t majorVersion,
357         IPCTransport transport) const {
358     for (auto& provider : mProviders) {
359         IPCTransport providerTransport = provider->getIPCTransport();
360         for (auto& deviceInfo : provider->mDevices) {
361             if (deviceInfo->mId == id && deviceInfo->mVersion.get_major() == majorVersion &&
362                     transport == providerTransport) {
363                 return true;
364             }
365         }
366     }
367     return false;
368 }
369 
hasFlashUnit(const std::string & id) const370 bool CameraProviderManager::hasFlashUnit(const std::string &id) const {
371     std::lock_guard<std::mutex> lock(mInterfaceMutex);
372 
373     auto deviceInfo = findDeviceInfoLocked(id);
374     if (deviceInfo == nullptr) return false;
375 
376     return deviceInfo->hasFlashUnit();
377 }
378 
supportNativeZoomRatio(const std::string & id) const379 bool CameraProviderManager::supportNativeZoomRatio(const std::string &id) const {
380     std::lock_guard<std::mutex> lock(mInterfaceMutex);
381 
382     auto deviceInfo = findDeviceInfoLocked(id);
383     if (deviceInfo == nullptr) return false;
384 
385     return deviceInfo->supportNativeZoomRatio();
386 }
387 
isCompositeJpegRDisabled(const std::string & id) const388 bool CameraProviderManager::isCompositeJpegRDisabled(const std::string &id) const {
389     std::lock_guard<std::mutex> lock(mInterfaceMutex);
390     return isCompositeJpegRDisabledLocked(id);
391 }
392 
isCompositeJpegRDisabledLocked(const std::string & id) const393 bool CameraProviderManager::isCompositeJpegRDisabledLocked(const std::string &id) const {
394     auto deviceInfo = findDeviceInfoLocked(id);
395     if (deviceInfo == nullptr) return false;
396 
397     return deviceInfo->isCompositeJpegRDisabled();
398 }
399 
getResourceCost(const std::string & id,CameraResourceCost * cost) const400 status_t CameraProviderManager::getResourceCost(const std::string &id,
401         CameraResourceCost* cost) const {
402     std::lock_guard<std::mutex> lock(mInterfaceMutex);
403 
404     auto deviceInfo = findDeviceInfoLocked(id);
405     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
406 
407     *cost = deviceInfo->mResourceCost;
408     return OK;
409 }
410 
getCameraInfo(const std::string & id,int rotationOverride,int * portraitRotation,hardware::CameraInfo * info) const411 status_t CameraProviderManager::getCameraInfo(const std::string &id,
412          int rotationOverride, int *portraitRotation,
413          hardware::CameraInfo* info) const {
414     std::lock_guard<std::mutex> lock(mInterfaceMutex);
415 
416     auto deviceInfo = findDeviceInfoLocked(id);
417     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
418 
419     return deviceInfo->getCameraInfo(rotationOverride, portraitRotation, info);
420 }
421 
isSessionConfigurationSupported(const std::string & id,const SessionConfiguration & configuration,bool overrideForPerfClass,bool checkSessionParams,bool * status) const422 status_t CameraProviderManager::isSessionConfigurationSupported(const std::string& id,
423         const SessionConfiguration &configuration, bool overrideForPerfClass,
424         bool checkSessionParams, bool *status /*out*/) const {
425     std::lock_guard<std::mutex> lock(mInterfaceMutex);
426     auto deviceInfo = findDeviceInfoLocked(id);
427     if (deviceInfo == nullptr) {
428         return NAME_NOT_FOUND;
429     }
430 
431     metadataGetter getMetadata = [this](const std::string &id,
432             bool overrideForPerfClass) {
433         CameraMetadata metadata;
434         this->getCameraCharacteristicsLocked(id, overrideForPerfClass,
435                                              &metadata,
436                                              hardware::ICameraService::ROTATION_OVERRIDE_NONE);
437         return metadata;
438     };
439     return deviceInfo->isSessionConfigurationSupported(configuration,
440             overrideForPerfClass, getMetadata, checkSessionParams, status);
441 }
442 
createDefaultRequest(const std::string & cameraId,camera_request_template_t templateId,CameraMetadata * metadata) const443 status_t  CameraProviderManager::createDefaultRequest(const std::string& cameraId,
444         camera_request_template_t templateId,
445         CameraMetadata* metadata) const {
446     ATRACE_CALL();
447     if (templateId <= 0 || templateId >= CAMERA_TEMPLATE_COUNT) {
448         return BAD_VALUE;
449     }
450 
451     std::lock_guard<std::mutex> lock(mInterfaceMutex);
452     auto deviceInfo = findDeviceInfoLocked(cameraId);
453     if (deviceInfo == nullptr) {
454         return NAME_NOT_FOUND;
455     }
456 
457     status_t res = deviceInfo->createDefaultRequest(templateId,
458             metadata);
459 
460     if (res == BAD_VALUE) {
461         ALOGI("%s: template %d is not supported on this camera device",
462               __FUNCTION__, templateId);
463         return res;
464     } else if (res != OK) {
465         ALOGE("Unable to construct request template %d: %s (%d)",
466                 templateId, strerror(-res), res);
467         return res;
468     }
469 
470     return OK;
471 }
472 
getSessionCharacteristics(const std::string & id,const SessionConfiguration & configuration,bool overrideForPerfClass,int rotationOverride,CameraMetadata * sessionCharacteristics) const473 status_t CameraProviderManager::getSessionCharacteristics(
474         const std::string& id, const SessionConfiguration& configuration, bool overrideForPerfClass,
475         int rotationOverride, CameraMetadata* sessionCharacteristics /*out*/) const {
476     std::lock_guard<std::mutex> lock(mInterfaceMutex);
477     auto deviceInfo = findDeviceInfoLocked(id);
478     if (deviceInfo == nullptr) {
479         return NAME_NOT_FOUND;
480     }
481 
482     metadataGetter getMetadata = [this, rotationOverride](const std::string& id,
483                                                             bool overrideForPerfClass) {
484         CameraMetadata metadata;
485         status_t ret = this->getCameraCharacteristicsLocked(id, overrideForPerfClass, &metadata,
486                                                             rotationOverride);
487         if (ret != OK) {
488             ALOGE("%s: Could not get CameraCharacteristics for device %s", __FUNCTION__,
489                   id.c_str());
490         }
491         return metadata;
492     };
493 
494     return deviceInfo->getSessionCharacteristics(configuration,
495             overrideForPerfClass, getMetadata, sessionCharacteristics);
496 }
497 
getCameraIdIPCTransport(const std::string & id,IPCTransport * providerTransport) const498 status_t CameraProviderManager::getCameraIdIPCTransport(const std::string &id,
499         IPCTransport *providerTransport) const {
500     std::lock_guard<std::mutex> lock(mInterfaceMutex);
501     auto deviceInfo = findDeviceInfoLocked(id);
502     if (deviceInfo == nullptr) {
503         return NAME_NOT_FOUND;
504     }
505     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
506     if (parentProvider == nullptr) {
507         return DEAD_OBJECT;
508     }
509     *providerTransport = parentProvider->getIPCTransport();
510     return OK;
511 }
512 
getCameraCharacteristics(const std::string & id,bool overrideForPerfClass,CameraMetadata * characteristics,int rotationOverride) const513 status_t CameraProviderManager::getCameraCharacteristics(const std::string &id,
514         bool overrideForPerfClass, CameraMetadata* characteristics,
515         int rotationOverride) const {
516     std::lock_guard<std::mutex> lock(mInterfaceMutex);
517     return getCameraCharacteristicsLocked(id, overrideForPerfClass, characteristics,
518             rotationOverride);
519 }
520 
getHighestSupportedVersion(const std::string & id,hardware::hidl_version * v,IPCTransport * transport)521 status_t CameraProviderManager::getHighestSupportedVersion(const std::string &id,
522         hardware::hidl_version *v, IPCTransport *transport) {
523     if (v == nullptr || transport == nullptr) {
524         return BAD_VALUE;
525     }
526     std::lock_guard<std::mutex> lock(mInterfaceMutex);
527 
528     hardware::hidl_version maxVersion{0,0};
529     bool found = false;
530     IPCTransport providerTransport = IPCTransport::INVALID;
531     for (auto& provider : mProviders) {
532         for (auto& deviceInfo : provider->mDevices) {
533             if (deviceInfo->mId == id) {
534                 if (deviceInfo->mVersion > maxVersion) {
535                     maxVersion = deviceInfo->mVersion;
536                     providerTransport = provider->getIPCTransport();
537                     found = true;
538                 }
539             }
540         }
541     }
542     if (!found || providerTransport == IPCTransport::INVALID) {
543         return NAME_NOT_FOUND;
544     }
545     *v = maxVersion;
546     *transport = providerTransport;
547     return OK;
548 }
549 
getTorchStrengthLevel(const std::string & id,int32_t * torchStrength)550 status_t CameraProviderManager::getTorchStrengthLevel(const std::string &id,
551         int32_t* torchStrength /*out*/) {
552     std::lock_guard<std::mutex> lock(mInterfaceMutex);
553 
554     auto deviceInfo = findDeviceInfoLocked(id);
555     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
556 
557     return deviceInfo->getTorchStrengthLevel(torchStrength);
558 }
559 
turnOnTorchWithStrengthLevel(const std::string & id,int32_t torchStrength)560 status_t CameraProviderManager::turnOnTorchWithStrengthLevel(const std::string &id,
561         int32_t torchStrength) {
562     std::lock_guard<std::mutex> lock(mInterfaceMutex);
563 
564     auto deviceInfo = findDeviceInfoLocked(id);
565     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
566 
567     return deviceInfo->turnOnTorchWithStrengthLevel(torchStrength);
568 }
569 
shouldSkipTorchStrengthUpdate(const std::string & id,int32_t torchStrength) const570 bool CameraProviderManager::shouldSkipTorchStrengthUpdate(const std::string &id,
571         int32_t torchStrength) const {
572     std::lock_guard<std::mutex> lock(mInterfaceMutex);
573 
574     auto deviceInfo = findDeviceInfoLocked(id);
575     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
576 
577     if (deviceInfo->mTorchStrengthLevel == torchStrength) {
578         ALOGV("%s: Skipping torch strength level updates prev_level: %d, new_level: %d",
579                 __FUNCTION__, deviceInfo->mTorchStrengthLevel, torchStrength);
580         return true;
581     }
582     return false;
583 }
584 
getTorchDefaultStrengthLevel(const std::string & id) const585 int32_t CameraProviderManager::getTorchDefaultStrengthLevel(const std::string &id) const {
586     std::lock_guard<std::mutex> lock(mInterfaceMutex);
587 
588     auto deviceInfo = findDeviceInfoLocked(id);
589     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
590 
591     return deviceInfo->mTorchDefaultStrengthLevel;
592 }
593 
supportSetTorchMode(const std::string & id) const594 bool CameraProviderManager::supportSetTorchMode(const std::string &id) const {
595     std::lock_guard<std::mutex> lock(mInterfaceMutex);
596     for (auto& provider : mProviders) {
597         for (auto& deviceInfo : provider->mDevices) {
598             if (deviceInfo->mId == id) {
599                 return provider->mSetTorchModeSupported;
600             }
601         }
602     }
603     return false;
604 }
605 
606 template <class ProviderInfoType, class HalCameraProviderType>
setTorchModeT(sp<ProviderInfo> & parentProvider,std::shared_ptr<HalCameraProvider> * halCameraProvider)607 status_t CameraProviderManager::setTorchModeT(sp<ProviderInfo> &parentProvider,
608         std::shared_ptr<HalCameraProvider> *halCameraProvider) {
609     if (halCameraProvider == nullptr) {
610         return BAD_VALUE;
611     }
612     ProviderInfoType *idlProviderInfo = static_cast<ProviderInfoType *>(parentProvider.get());
613     auto idlInterface = idlProviderInfo->startProviderInterface();
614     if (idlInterface == nullptr) {
615         return DEAD_OBJECT;
616     }
617     *halCameraProvider =
618             std::make_shared<HalCameraProviderType>(idlInterface, idlInterface->descriptor);
619     return OK;
620 }
621 
setTorchMode(const std::string & id,bool enabled)622 status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled) {
623     std::lock_guard<std::mutex> lock(mInterfaceMutex);
624 
625     auto deviceInfo = findDeviceInfoLocked(id);
626     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
627 
628     // Pass the camera ID to start interface so that it will save it to the map of ICameraProviders
629     // that are currently in use.
630     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
631     if (parentProvider == nullptr) {
632         return DEAD_OBJECT;
633     }
634     std::shared_ptr<HalCameraProvider> halCameraProvider = nullptr;
635     IPCTransport providerTransport = parentProvider->getIPCTransport();
636     status_t res = OK;
637     if (providerTransport == IPCTransport::HIDL) {
638         res = setTorchModeT<HidlProviderInfo, HidlHalCameraProvider>(parentProvider,
639                 &halCameraProvider);
640         if (res != OK) {
641             return res;
642         }
643     } else if (providerTransport == IPCTransport::AIDL) {
644         res = setTorchModeT<AidlProviderInfo, AidlHalCameraProvider>(parentProvider,
645                 &halCameraProvider);
646         if (res != OK) {
647             return res;
648         }
649     } else {
650         ALOGE("%s Invalid provider transport", __FUNCTION__);
651         return INVALID_OPERATION;
652     }
653     saveRef(DeviceMode::TORCH, deviceInfo->mId, halCameraProvider);
654 
655     return deviceInfo->setTorchMode(enabled);
656 }
657 
setUpVendorTags()658 status_t CameraProviderManager::setUpVendorTags() {
659     sp<VendorTagDescriptorCache> tagCache = new VendorTagDescriptorCache();
660 
661     for (auto& provider : mProviders) {
662         tagCache->addVendorDescriptor(provider->mProviderTagid, provider->mVendorTagDescriptor);
663     }
664 
665     VendorTagDescriptorCache::setAsGlobalVendorTagCache(tagCache);
666 
667     return OK;
668 }
669 
startExternalLazyProvider() const670 sp<CameraProviderManager::ProviderInfo> CameraProviderManager::startExternalLazyProvider() const {
671     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
672     std::lock_guard<std::mutex> lock(mInterfaceMutex);
673 
674     for (const auto& providerInfo : mProviders) {
675         if (providerInfo->isExternalLazyHAL()) {
676             if (!providerInfo->successfullyStartedProviderInterface()) {
677                 return nullptr;
678             } else {
679                 return providerInfo;
680             }
681         }
682     }
683     return nullptr;
684 }
685 
notifyUsbDeviceEvent(int32_t eventId,const std::string & usbDeviceId)686 status_t CameraProviderManager::notifyUsbDeviceEvent(int32_t eventId,
687                                                      const std::string& usbDeviceId) {
688     if (!kEnableLazyHal) {
689         return OK;
690     }
691 
692     ALOGV("notifySystemEvent: %d usbDeviceId : %s", eventId, usbDeviceId.c_str());
693 
694     if (eventId == android::hardware::ICameraService::EVENT_USB_DEVICE_ATTACHED) {
695         sp<ProviderInfo> externalProvider = startExternalLazyProvider();
696         if (externalProvider != nullptr) {
697             auto usbDevices = mExternalUsbDevicesForProvider.first;
698             usbDevices.push_back(usbDeviceId);
699             mExternalUsbDevicesForProvider = {usbDevices, externalProvider};
700         }
701     } else if (eventId
702           == android::hardware::ICameraService::EVENT_USB_DEVICE_DETACHED) {
703         usbDeviceDetached(usbDeviceId);
704     }
705 
706     return OK;
707 }
708 
usbDeviceDetached(const std::string & usbDeviceId)709 status_t CameraProviderManager::usbDeviceDetached(const std::string &usbDeviceId) {
710     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
711     std::lock_guard<std::mutex> interfaceLock(mInterfaceMutex);
712 
713     auto usbDevices = mExternalUsbDevicesForProvider.first;
714     auto foundId = std::find(usbDevices.begin(), usbDevices.end(), usbDeviceId);
715     if (foundId != usbDevices.end()) {
716         sp<ProviderInfo> providerInfo = mExternalUsbDevicesForProvider.second;
717         if (providerInfo == nullptr) {
718               ALOGE("%s No valid external provider for USB device: %s",
719                     __FUNCTION__,
720                     usbDeviceId.c_str());
721               mExternalUsbDevicesForProvider = {std::vector<std::string>(), nullptr};
722               return DEAD_OBJECT;
723         } else {
724             mInterfaceMutex.unlock();
725             providerInfo->removeAllDevices();
726             mInterfaceMutex.lock();
727             mExternalUsbDevicesForProvider = {std::vector<std::string>(), nullptr};
728         }
729     } else {
730         return DEAD_OBJECT;
731     }
732     return OK;
733 }
734 
notifyDeviceStateChange(int64_t newState)735 status_t CameraProviderManager::notifyDeviceStateChange(int64_t newState) {
736     std::lock_guard<std::mutex> lock(mInterfaceMutex);
737     mDeviceState = newState;
738     status_t res = OK;
739     // Make a copy of mProviders because we unlock mInterfaceMutex temporarily
740     // within the loop. It's possible that during the time mInterfaceMutex is
741     // unlocked, mProviders has changed.
742     auto providers = mProviders;
743     for (auto& provider : providers) {
744         ALOGV("%s: Notifying %s for new state 0x%" PRIx64,
745                 __FUNCTION__, provider->mProviderName.c_str(), newState);
746         // b/199240726 Camera providers can for example try to add/remove
747         // camera devices as part of the state change notification. Holding
748         // 'mInterfaceMutex' while calling 'notifyDeviceStateChange' can
749         // result in a recursive deadlock.
750         mInterfaceMutex.unlock();
751         status_t singleRes = provider->notifyDeviceStateChange(mDeviceState);
752         mInterfaceMutex.lock();
753         if (singleRes != OK) {
754             ALOGE("%s: Unable to notify provider %s about device state change",
755                     __FUNCTION__,
756                     provider->mProviderName.c_str());
757             res = singleRes;
758             // continue to do the rest of the providers instead of returning now
759         }
760         provider->notifyDeviceInfoStateChangeLocked(mDeviceState);
761     }
762     return res;
763 }
764 
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)765 status_t CameraProviderManager::openAidlSession(const std::string &id,
766         const std::shared_ptr<
767                 aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback,
768         /*out*/
769         std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> *session) {
770 
771     std::lock_guard<std::mutex> lock(mInterfaceMutex);
772 
773     auto deviceInfo = findDeviceInfoLocked(id);
774     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
775 
776     auto *aidlDeviceInfo3 = static_cast<AidlProviderInfo::AidlDeviceInfo3*>(deviceInfo);
777     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
778     if (parentProvider == nullptr) {
779         return DEAD_OBJECT;
780     }
781     auto provider =
782             static_cast<AidlProviderInfo *>(parentProvider.get())->startProviderInterface();
783     if (provider == nullptr) {
784         return DEAD_OBJECT;
785     }
786     std::shared_ptr<HalCameraProvider> halCameraProvider =
787             std::make_shared<AidlHalCameraProvider>(provider, provider->descriptor);
788     saveRef(DeviceMode::CAMERA, id, halCameraProvider);
789 
790     auto interface = aidlDeviceInfo3->startDeviceInterface();
791     if (interface == nullptr) {
792         removeRef(DeviceMode::CAMERA, id);
793         return DEAD_OBJECT;
794     }
795 
796     auto ret = interface->open(callback, session);
797     if (!ret.isOk()) {
798         removeRef(DeviceMode::CAMERA, id);
799         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
800                 __FUNCTION__, id.c_str(), ret.getMessage());
801         return AidlProviderInfo::mapToStatusT(ret);
802     }
803     return OK;
804 }
805 
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)806 status_t CameraProviderManager::openAidlInjectionSession(const std::string &id,
807         const std::shared_ptr<
808                 aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback,
809         /*out*/
810         std::shared_ptr<
811                 aidl::android::hardware::camera::device::ICameraInjectionSession> *session) {
812 
813     std::lock_guard<std::mutex> lock(mInterfaceMutex);
814 
815     auto deviceInfo = findDeviceInfoLocked(id);
816     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
817 
818     auto *aidlDeviceInfo3 = static_cast<AidlProviderInfo::AidlDeviceInfo3*>(deviceInfo);
819     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
820     if (parentProvider == nullptr) {
821         return DEAD_OBJECT;
822     }
823     auto provider =
824             static_cast<AidlProviderInfo *>(parentProvider.get())->startProviderInterface();
825     if (provider == nullptr) {
826         return DEAD_OBJECT;
827     }
828     std::shared_ptr<HalCameraProvider> halCameraProvider =
829             std::make_shared<AidlHalCameraProvider>(provider, provider->descriptor);
830     saveRef(DeviceMode::CAMERA, id, halCameraProvider);
831 
832     auto interface = aidlDeviceInfo3->startDeviceInterface();
833     if (interface == nullptr) {
834         return DEAD_OBJECT;
835     }
836 
837     auto ret = interface->openInjectionSession(callback, session);
838     if (!ret.isOk()) {
839         removeRef(DeviceMode::CAMERA, id);
840         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
841                 __FUNCTION__, id.c_str(), ret.getMessage());
842         return DEAD_OBJECT;
843     }
844     return OK;
845 }
846 
openHidlSession(const std::string & id,const sp<device::V3_2::ICameraDeviceCallback> & callback,sp<device::V3_2::ICameraDeviceSession> * session)847 status_t CameraProviderManager::openHidlSession(const std::string &id,
848         const sp<device::V3_2::ICameraDeviceCallback>& callback,
849         /*out*/
850         sp<device::V3_2::ICameraDeviceSession> *session) {
851 
852     std::lock_guard<std::mutex> lock(mInterfaceMutex);
853 
854     auto deviceInfo = findDeviceInfoLocked(id);
855     if (deviceInfo == nullptr) return NAME_NOT_FOUND;
856 
857     auto *hidlDeviceInfo3 = static_cast<HidlProviderInfo::HidlDeviceInfo3*>(deviceInfo);
858     sp<ProviderInfo> parentProvider = deviceInfo->mParentProvider.promote();
859     if (parentProvider == nullptr) {
860         return DEAD_OBJECT;
861     }
862     const sp<provider::V2_4::ICameraProvider> provider =
863             static_cast<HidlProviderInfo *>(parentProvider.get())->startProviderInterface();
864     if (provider == nullptr) {
865         return DEAD_OBJECT;
866     }
867     std::shared_ptr<HalCameraProvider> halCameraProvider =
868             std::make_shared<HidlHalCameraProvider>(provider, provider->descriptor);
869     saveRef(DeviceMode::CAMERA, id, halCameraProvider);
870 
871     Status status;
872     hardware::Return<void> ret;
873     auto interface = hidlDeviceInfo3->startDeviceInterface();
874     if (interface == nullptr) {
875         return DEAD_OBJECT;
876     }
877 
878     ret = interface->open(callback, [&status, &session]
879             (Status s, const sp<device::V3_2::ICameraDeviceSession>& cameraSession) {
880                 status = s;
881                 if (status == Status::OK) {
882                     *session = cameraSession;
883                 }
884             });
885     if (!ret.isOk()) {
886         removeRef(DeviceMode::CAMERA, id);
887         ALOGE("%s: Transaction error opening a session for camera device %s: %s",
888                 __FUNCTION__, id.c_str(), ret.description().c_str());
889         return DEAD_OBJECT;
890     }
891     return HidlProviderInfo::mapToStatusT(status);
892 }
893 
saveRef(DeviceMode usageType,const std::string & cameraId,std::shared_ptr<HalCameraProvider> provider)894 void CameraProviderManager::saveRef(DeviceMode usageType, const std::string &cameraId,
895         std::shared_ptr<HalCameraProvider> provider) {
896     if (!kEnableLazyHal) {
897         return;
898     }
899     ALOGV("Saving camera provider %s for camera device %s", provider->mDescriptor.c_str(),
900               cameraId.c_str());
901     std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock);
902     std::unordered_map<std::string, std::shared_ptr<HalCameraProvider>> *primaryMap, *alternateMap;
903     if (usageType == DeviceMode::TORCH) {
904         primaryMap = &mTorchProviderByCameraId;
905         alternateMap = &mCameraProviderByCameraId;
906     } else {
907         primaryMap = &mCameraProviderByCameraId;
908         alternateMap = &mTorchProviderByCameraId;
909     }
910 
911     (*primaryMap)[cameraId] = provider;
912     auto search = alternateMap->find(cameraId);
913     if (search != alternateMap->end()) {
914         ALOGW("%s: Camera device %s is using both torch mode and camera mode simultaneously. "
915                 "That should not be possible", __FUNCTION__, cameraId.c_str());
916     }
917     ALOGV("%s: Camera device %s connected", __FUNCTION__, cameraId.c_str());
918 }
919 
removeRef(DeviceMode usageType,const std::string & cameraId)920 void CameraProviderManager::removeRef(DeviceMode usageType, const std::string &cameraId) {
921     if (!kEnableLazyHal) {
922         return;
923     }
924     ALOGV("Removing camera device %s", cameraId.c_str());
925     std::unordered_map<std::string, std::shared_ptr<HalCameraProvider>> *providerMap;
926     if (usageType == DeviceMode::TORCH) {
927         providerMap = &mTorchProviderByCameraId;
928     } else {
929         providerMap = &mCameraProviderByCameraId;
930     }
931     std::lock_guard<std::mutex> lock(mProviderInterfaceMapLock);
932     auto search = providerMap->find(cameraId);
933     if (search != providerMap->end()) {
934         // Drop the reference to this ICameraProvider. This is safe to do immediately (without an
935         // added delay) because hwservicemanager guarantees to hold the reference for at least five
936         // more seconds.  We depend on this behavior so that if the provider is unreferenced and
937         // then referenced again quickly, we do not let the HAL exit and then need to immediately
938         // restart it. An example when this could happen is switching from a front-facing to a
939         // rear-facing camera. If the HAL were to exit during the camera switch, the camera could
940         // appear janky to the user.
941         providerMap->erase(cameraId);
942         IPCThreadState::self()->flushCommands();
943     } else {
944         ALOGE("%s: Asked to remove reference for camera %s, but no reference to it was found. This "
945                 "could mean removeRef was called twice for the same camera ID.", __FUNCTION__,
946                 cameraId.c_str());
947     }
948 }
949 
950 // We ignore sp<IBinder> param here since we need std::shared_ptr<...> which
951 // will be retrieved through the ndk api through addAidlProviderLocked ->
952 // tryToInitializeAidlProvider.
onServiceRegistration(const String16 & name,const sp<IBinder> &)953 void CameraProviderManager::onServiceRegistration(const String16 &name, const sp<IBinder>&) {
954     status_t res = OK;
955     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
956     {
957         std::lock_guard<std::mutex> lock(mInterfaceMutex);
958 
959         res = addAidlProviderLocked(toStdString(name));
960     }
961 
962     sp<StatusListener> listener = getStatusListener();
963     if (nullptr != listener.get() && res == OK) {
964         listener->onNewProviderRegistered();
965     }
966 
967     IPCThreadState::self()->flushCommands();
968 }
969 
onRegistration(const hardware::hidl_string &,const hardware::hidl_string & name,bool preexisting)970 hardware::Return<void> CameraProviderManager::onRegistration(
971         const hardware::hidl_string& /*fqName*/,
972         const hardware::hidl_string& name,
973         bool preexisting) {
974     status_t res = OK;
975     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
976     {
977         std::lock_guard<std::mutex> lock(mInterfaceMutex);
978 
979         res = addHidlProviderLocked(name, preexisting);
980     }
981 
982     sp<StatusListener> listener = getStatusListener();
983     if (nullptr != listener.get() && res == OK) {
984         listener->onNewProviderRegistered();
985     }
986 
987     IPCThreadState::self()->flushCommands();
988 
989     return hardware::Return<void>();
990 }
991 
dump(int fd,const Vector<String16> & args)992 status_t CameraProviderManager::dump(int fd, const Vector<String16>& args) {
993     std::lock_guard<std::mutex> lock(mInterfaceMutex);
994 
995     for (auto& provider : mProviders) {
996         provider->dump(fd, args);
997     }
998     return OK;
999 }
1000 
initializeProviderInfoCommon(const std::vector<std::string> & devices)1001 void CameraProviderManager::ProviderInfo::initializeProviderInfoCommon(
1002         const std::vector<std::string> &devices) {
1003     for (auto& device : devices) {
1004         std::string id;
1005         status_t res = addDevice(device, CameraDeviceStatus::PRESENT, &id);
1006         if (res != OK) {
1007             ALOGE("%s: Unable to enumerate camera device '%s': %s (%d)",
1008                     __FUNCTION__, device.c_str(), strerror(-res), res);
1009             continue;
1010         }
1011     }
1012 
1013     ALOGI("Camera provider %s ready with %zu camera devices",
1014             mProviderName.c_str(), mDevices.size());
1015 
1016     // Process cached status callbacks
1017     {
1018         std::lock_guard<std::mutex> lock(mInitLock);
1019 
1020         for (auto& statusInfo : mCachedStatus) {
1021             std::string id, physicalId;
1022             if (statusInfo.isPhysicalCameraStatus) {
1023                 physicalCameraDeviceStatusChangeLocked(&id, &physicalId,
1024                     statusInfo.cameraId, statusInfo.physicalCameraId, statusInfo.status);
1025             } else {
1026                 cameraDeviceStatusChangeLocked(&id, statusInfo.cameraId, statusInfo.status);
1027             }
1028         }
1029         mCachedStatus.clear();
1030 
1031         mInitialized = true;
1032     }
1033 }
1034 
findDeviceInfoLocked(const std::string & id) const1035 CameraProviderManager::ProviderInfo::DeviceInfo* CameraProviderManager::findDeviceInfoLocked(
1036         const std::string& id) const {
1037     for (auto& provider : mProviders) {
1038         using hardware::hidl_version;
1039         IPCTransport transport = provider->getIPCTransport();
1040         // AIDL min version starts at major: 1 minor: 1
1041         hidl_version minVersion =
1042                 (transport == IPCTransport::HIDL) ? hidl_version{3, 2} : hidl_version{1, 1} ;
1043         hidl_version maxVersion =
1044                 (transport == IPCTransport::HIDL) ? hidl_version{3, 7} : hidl_version{1000, 0};
1045 
1046         for (auto& deviceInfo : provider->mDevices) {
1047             if (deviceInfo->mId == id &&
1048                     minVersion <= deviceInfo->mVersion && maxVersion >= deviceInfo->mVersion) {
1049                 return deviceInfo.get();
1050             }
1051         }
1052     }
1053     return nullptr;
1054 }
1055 
getProviderTagIdLocked(const std::string & id) const1056 metadata_vendor_id_t CameraProviderManager::getProviderTagIdLocked(
1057         const std::string& id) const {
1058     metadata_vendor_id_t ret = CAMERA_METADATA_INVALID_VENDOR_ID;
1059 
1060     std::lock_guard<std::mutex> lock(mInterfaceMutex);
1061     for (auto& provider : mProviders) {
1062         for (auto& deviceInfo : provider->mDevices) {
1063             if (deviceInfo->mId == id) {
1064                 return provider->mProviderTagid;
1065             }
1066         }
1067     }
1068 
1069     return ret;
1070 }
1071 
queryPhysicalCameraIds()1072 void CameraProviderManager::ProviderInfo::DeviceInfo3::queryPhysicalCameraIds() {
1073     camera_metadata_entry_t entryCap;
1074 
1075     entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1076     for (size_t i = 0; i < entryCap.count; ++i) {
1077         uint8_t capability = entryCap.data.u8[i];
1078         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_LOGICAL_MULTI_CAMERA) {
1079             mIsLogicalCamera = true;
1080             break;
1081         }
1082     }
1083     if (!mIsLogicalCamera) {
1084         return;
1085     }
1086 
1087     camera_metadata_entry_t entryIds = mCameraCharacteristics.find(
1088             ANDROID_LOGICAL_MULTI_CAMERA_PHYSICAL_IDS);
1089     const uint8_t* ids = entryIds.data.u8;
1090     size_t start = 0;
1091     for (size_t i = 0; i < entryIds.count; ++i) {
1092         if (ids[i] == '\0') {
1093             if (start != i) {
1094                 mPhysicalIds.push_back((const char*)ids+start);
1095             }
1096             start = i+1;
1097         }
1098     }
1099 }
1100 
getSystemCameraKind()1101 SystemCameraKind CameraProviderManager::ProviderInfo::DeviceInfo3::getSystemCameraKind() {
1102     camera_metadata_entry_t entryCap;
1103     entryCap = mCameraCharacteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1104     if (entryCap.count == 1 &&
1105             entryCap.data.u8[0] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA) {
1106         return SystemCameraKind::HIDDEN_SECURE_CAMERA;
1107     }
1108 
1109     // Go through the capabilities and check if it has
1110     // ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
1111     for (size_t i = 0; i < entryCap.count; ++i) {
1112         uint8_t capability = entryCap.data.u8[i];
1113         if (capability == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA) {
1114             return SystemCameraKind::SYSTEM_ONLY_CAMERA;
1115         }
1116     }
1117     return SystemCameraKind::PUBLIC;
1118 }
1119 
getSupportedSizes(const CameraMetadata & ch,uint32_t tag,android_pixel_format_t format,std::vector<std::tuple<size_t,size_t>> * sizes)1120 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedSizes(
1121         const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format,
1122         std::vector<std::tuple<size_t, size_t>> *sizes/*out*/) {
1123     if (sizes == nullptr) {
1124         return;
1125     }
1126 
1127     auto scalerDims = ch.find(tag);
1128     if (scalerDims.count > 0) {
1129         // Scaler entry contains 4 elements (format, width, height, type)
1130         for (size_t i = 0; i < scalerDims.count; i += 4) {
1131             if ((scalerDims.data.i32[i] == format) &&
1132                     (scalerDims.data.i32[i+3] ==
1133                      ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) {
1134                 sizes->push_back(std::make_tuple(scalerDims.data.i32[i+1],
1135                             scalerDims.data.i32[i+2]));
1136             }
1137         }
1138     }
1139 }
1140 
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)1141 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDurations(
1142         const CameraMetadata& ch, uint32_t tag, android_pixel_format_t format,
1143         const std::vector<std::tuple<size_t, size_t>>& sizes,
1144         std::vector<int64_t> *durations/*out*/) {
1145     if (durations == nullptr) {
1146         return;
1147     }
1148 
1149     auto availableDurations = ch.find(tag);
1150     if (availableDurations.count > 0) {
1151         // Duration entry contains 4 elements (format, width, height, duration)
1152         for (const auto& size : sizes) {
1153             int64_t width = std::get<0>(size);
1154             int64_t height = std::get<1>(size);
1155             for (size_t i = 0; i < availableDurations.count; i += 4) {
1156                 if ((availableDurations.data.i64[i] == format) &&
1157                         (availableDurations.data.i64[i+1] == width) &&
1158                         (availableDurations.data.i64[i+2] == height)) {
1159                     durations->push_back(availableDurations.data.i64[i+3]);
1160                     break;
1161                 }
1162             }
1163         }
1164     }
1165 }
1166 
getSupportedDynamicDepthDurations(const std::vector<int64_t> & depthDurations,const std::vector<int64_t> & blobDurations,std::vector<int64_t> * dynamicDepthDurations)1167 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthDurations(
1168         const std::vector<int64_t>& depthDurations, const std::vector<int64_t>& blobDurations,
1169         std::vector<int64_t> *dynamicDepthDurations /*out*/) {
1170     if ((dynamicDepthDurations == nullptr) || (depthDurations.size() != blobDurations.size())) {
1171         return;
1172     }
1173 
1174     // Unfortunately there is no direct way to calculate the dynamic depth stream duration.
1175     // Processing time on camera service side can vary greatly depending on multiple
1176     // variables which are not under our control. Make a guesstimate by taking the maximum
1177     // corresponding duration value from depth and blob.
1178     auto depthDuration = depthDurations.begin();
1179     auto blobDuration = blobDurations.begin();
1180     dynamicDepthDurations->reserve(depthDurations.size());
1181     while ((depthDuration != depthDurations.end()) && (blobDuration != blobDurations.end())) {
1182         dynamicDepthDurations->push_back(std::max(*depthDuration, *blobDuration));
1183         depthDuration++; blobDuration++;
1184     }
1185 }
1186 
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)1187 void CameraProviderManager::ProviderInfo::DeviceInfo3::getSupportedDynamicDepthSizes(
1188         const std::vector<std::tuple<size_t, size_t>>& blobSizes,
1189         const std::vector<std::tuple<size_t, size_t>>& depthSizes,
1190         std::vector<std::tuple<size_t, size_t>> *dynamicDepthSizes /*out*/,
1191         std::vector<std::tuple<size_t, size_t>> *internalDepthSizes /*out*/) {
1192     if (dynamicDepthSizes == nullptr || internalDepthSizes == nullptr) {
1193         return;
1194     }
1195 
1196     // The dynamic depth spec. does not mention how close the AR ratio should be.
1197     // Try using something appropriate.
1198     float ARTolerance = kDepthARTolerance;
1199 
1200     for (const auto& blobSize : blobSizes) {
1201         float jpegAR = static_cast<float> (std::get<0>(blobSize)) /
1202                 static_cast<float>(std::get<1>(blobSize));
1203         bool found = false;
1204         for (const auto& depthSize : depthSizes) {
1205             if (depthSize == blobSize) {
1206                 internalDepthSizes->push_back(depthSize);
1207                 found = true;
1208                 break;
1209             } else {
1210                 float depthAR = static_cast<float> (std::get<0>(depthSize)) /
1211                     static_cast<float>(std::get<1>(depthSize));
1212                 if (std::fabs(jpegAR - depthAR) <= ARTolerance) {
1213                     internalDepthSizes->push_back(depthSize);
1214                     found = true;
1215                     break;
1216                 }
1217             }
1218         }
1219 
1220         if (found) {
1221             dynamicDepthSizes->push_back(blobSize);
1222         }
1223     }
1224 }
1225 
isConcurrentDynamicRangeCaptureSupported(const CameraMetadata & deviceInfo,int64_t profile,int64_t concurrentProfile)1226 bool CameraProviderManager::isConcurrentDynamicRangeCaptureSupported(
1227         const CameraMetadata& deviceInfo, int64_t profile, int64_t concurrentProfile) {
1228     auto entry = deviceInfo.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1229     if (entry.count == 0) {
1230         return false;
1231     }
1232 
1233     const auto it = std::find(entry.data.u8, entry.data.u8 + entry.count,
1234             ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT);
1235     if (it == entry.data.u8 + entry.count) {
1236         return false;
1237     }
1238 
1239     entry = deviceInfo.find(ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP);
1240     if (entry.count == 0 || ((entry.count % 3) != 0)) {
1241         return false;
1242     }
1243 
1244     for (size_t i = 0; i < entry.count; i += 3) {
1245         if (entry.data.i64[i] == profile) {
1246             if ((entry.data.i64[i+1] == 0) || (entry.data.i64[i+1] & concurrentProfile)) {
1247                 return true;
1248             }
1249         }
1250     }
1251 
1252     return false;
1253 }
1254 
deriveHeicUltraHDRTags(bool maxResolution)1255 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveHeicUltraHDRTags(
1256         bool maxResolution) {
1257     if (!flags::camera_heif_gainmap() || kFrameworkHeicUltraHDRDisabled ||
1258             mCompositeHeicUltraHDRDisabled ||
1259             !camera3::HeicCompositeStream::isInMemoryTempFileSupported()) {
1260         return OK;
1261     }
1262 
1263     const int32_t scalerSizesTag =
1264               SessionConfigurationUtils::getAppropriateModeTag(
1265                       ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
1266     const int32_t scalerMinFrameDurationsTag = SessionConfigurationUtils::getAppropriateModeTag(
1267             ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, maxResolution);
1268     const int32_t scalerStallDurationsTag =
1269                  SessionConfigurationUtils::getAppropriateModeTag(
1270                         ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, maxResolution);
1271 
1272     const int32_t heicUltraHDRSizesTag =
1273             SessionConfigurationUtils::getAppropriateModeTag(
1274                     ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS, maxResolution);
1275     const int32_t heicUltraHDRStallDurationsTag =
1276             SessionConfigurationUtils::getAppropriateModeTag(
1277                     ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STALL_DURATIONS, maxResolution);
1278     const int32_t heicUltraHDRFrameDurationsTag =
1279             SessionConfigurationUtils::getAppropriateModeTag(
1280                  ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_MIN_FRAME_DURATIONS, maxResolution);
1281 
1282     auto& c = mCameraCharacteristics;
1283     std::vector<std::tuple<size_t, size_t>> supportedP010Sizes, filteredSizes;
1284     auto capabilities = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1285     if (capabilities.count == 0) {
1286         ALOGE("%s: Supported camera capabilities is empty!", __FUNCTION__);
1287         return BAD_VALUE;
1288     }
1289 
1290     auto end = capabilities.data.u8 + capabilities.count;
1291     bool isTenBitOutputSupported = std::find(capabilities.data.u8, end,
1292             ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) != end;
1293     if (!isTenBitOutputSupported) {
1294         // No 10-bit support, nothing more to do.
1295         return OK;
1296     }
1297 
1298     getSupportedSizes(c, scalerSizesTag,
1299             static_cast<android_pixel_format_t>(HAL_PIXEL_FORMAT_YCBCR_P010), &supportedP010Sizes);
1300     auto it = supportedP010Sizes.begin();
1301     if (supportedP010Sizes.empty()) {
1302         // Nothing to do in this case.
1303         return OK;
1304     }
1305 
1306     std::vector<int32_t> heicUltraHDREntries;
1307     int64_t stall = 0;
1308     bool useHeic = false;
1309     bool useGrid = false;
1310     for (const auto& it : supportedP010Sizes) {
1311         int32_t width = std::get<0>(it);
1312         int32_t height = std::get<1>(it);
1313         int32_t gainmapWidth = std::get<0>(it) / HeicCompositeStream::kGainmapScale;
1314         int32_t gainmapHeight = std::get<1>(it) / HeicCompositeStream::kGainmapScale;
1315         // Support gainmap sizes that are sufficiently aligned so CPU specific copy
1316         // optimizations can be utilized without side effects.
1317         if (((gainmapWidth % 64) == 0) && ((gainmapHeight % 2) == 0) &&
1318                 camera3::HeicCompositeStream::isSizeSupportedByHeifEncoder(width, height,
1319                     &useHeic, &useGrid, &stall, nullptr /*hevcName*/,
1320                     kFrameworkHeicAllowSWCodecs) &&
1321                 camera3::HeicCompositeStream::isSizeSupportedByHeifEncoder(gainmapWidth,
1322                     gainmapHeight, &useHeic, &useGrid, &stall, nullptr /*hevcName*/,
1323                     kFrameworkHeicAllowSWCodecs)) {
1324             int32_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(it)),
1325                     static_cast<int32_t> (std::get<1>(it)),
1326                     ANDROID_HEIC_AVAILABLE_HEIC_ULTRA_HDR_STREAM_CONFIGURATIONS_OUTPUT };
1327             heicUltraHDREntries.insert(heicUltraHDREntries.end(), entry, entry + 4);
1328             filteredSizes.push_back(it);
1329         }
1330     }
1331 
1332     std::vector<int64_t> heicUltraHDRMinDurations, heicUltraHDRStallDurations;
1333     auto ret = deriveBlobDurationEntries(c, maxResolution, filteredSizes,
1334                                          &heicUltraHDRStallDurations, &heicUltraHDRMinDurations);
1335     if (ret != OK) {
1336         return ret;
1337     }
1338 
1339     return insertStreamConfigTags(heicUltraHDRSizesTag, heicUltraHDRFrameDurationsTag,
1340                                   heicUltraHDRStallDurationsTag, heicUltraHDREntries,
1341                                   heicUltraHDRMinDurations, heicUltraHDRStallDurations, &c);
1342 }
1343 
insertStreamConfigTags(int32_t sizeTag,int32_t minFrameDurationTag,int32_t stallDurationTag,const std::vector<int32_t> & sizeEntries,const std::vector<int64_t> & minFrameDurationEntries,const std::vector<int64_t> & stallDurationEntries,CameraMetadata * c)1344 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::insertStreamConfigTags(
1345         int32_t sizeTag, int32_t minFrameDurationTag, int32_t stallDurationTag,
1346         const std::vector<int32_t>& sizeEntries,
1347         const std::vector<int64_t>& minFrameDurationEntries,
1348         const std::vector<int64_t>& stallDurationEntries, CameraMetadata* c /*out*/) {
1349     std::vector<int32_t> supportedChTags;
1350     auto chTags = c->find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1351     if (chTags.count == 0) {
1352         ALOGE("%s: No supported camera characteristics keys!", __FUNCTION__);
1353         return BAD_VALUE;
1354     }
1355     supportedChTags.reserve(chTags.count + 3);
1356     supportedChTags.insert(supportedChTags.end(), chTags.data.i32, chTags.data.i32 + chTags.count);
1357     supportedChTags.push_back(sizeTag);
1358     supportedChTags.push_back(minFrameDurationTag);
1359     supportedChTags.push_back(stallDurationTag);
1360     c->update(sizeTag, sizeEntries.data(), sizeEntries.size());
1361     c->update(minFrameDurationTag, minFrameDurationEntries.data(), minFrameDurationEntries.size());
1362     c->update(stallDurationTag, stallDurationEntries.data(), stallDurationEntries.size());
1363     c->update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(),
1364               supportedChTags.size());
1365 
1366     return OK;
1367 }
1368 
deriveBlobDurationEntries(const CameraMetadata & c,bool maxResolution,const std::vector<std::tuple<size_t,size_t>> & filteredSizes,std::vector<int64_t> * filteredStallDurations,std::vector<int64_t> * filteredMinDurations)1369 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveBlobDurationEntries(
1370         const CameraMetadata& c, bool maxResolution,
1371         const std::vector<std::tuple<size_t, size_t>>& filteredSizes,
1372         std::vector<int64_t>* filteredStallDurations /*out*/,
1373         std::vector<int64_t>* filteredMinDurations /*out*/) {
1374     std::vector<int64_t> blobMinDurations, blobStallDurations;
1375     const int32_t scalerMinFrameDurationsTag = SessionConfigurationUtils::getAppropriateModeTag(
1376             ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, maxResolution);
1377     const int32_t scalerStallDurationsTag = SessionConfigurationUtils::getAppropriateModeTag(
1378             ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, maxResolution);
1379     // We use the jpeg stall and min frame durations to approximate the respective Heic UltraHDR
1380     // durations.
1381     getSupportedDurations(c, scalerMinFrameDurationsTag, HAL_PIXEL_FORMAT_BLOB, filteredSizes,
1382                           &blobMinDurations);
1383     getSupportedDurations(c, scalerStallDurationsTag, HAL_PIXEL_FORMAT_BLOB, filteredSizes,
1384                           &blobStallDurations);
1385     if (blobStallDurations.empty() || blobMinDurations.empty() ||
1386         filteredSizes.size() != blobMinDurations.size() ||
1387         blobMinDurations.size() != blobStallDurations.size()) {
1388         ALOGE("%s: Unexpected number of available blob durations! %zu vs. %zu with "
1389               "filteredSizes size: %zu",
1390               __FUNCTION__, blobMinDurations.size(), blobStallDurations.size(),
1391               filteredSizes.size());
1392         return BAD_VALUE;
1393     }
1394 
1395     auto itDuration = blobMinDurations.begin();
1396     auto itSize = filteredSizes.begin();
1397     while (itDuration != blobMinDurations.end()) {
1398         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t>(std::get<0>(*itSize)),
1399                             static_cast<int32_t>(std::get<1>(*itSize)), *itDuration};
1400         filteredMinDurations->insert(filteredMinDurations->end(), entry, entry + 4);
1401         itDuration++;
1402         itSize++;
1403     }
1404 
1405     itDuration = blobStallDurations.begin();
1406     itSize = filteredSizes.begin();
1407     while (itDuration != blobStallDurations.end()) {
1408         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t>(std::get<0>(*itSize)),
1409                             static_cast<int32_t>(std::get<1>(*itSize)), *itDuration};
1410         filteredStallDurations->insert(filteredStallDurations->end(), entry, entry + 4);
1411         itDuration++;
1412         itSize++;
1413     }
1414 
1415     return OK;
1416 }
1417 
deriveJpegRTags(bool maxResolution)1418 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveJpegRTags(bool maxResolution) {
1419     if (kFrameworkJpegRDisabled || mCompositeJpegRDisabled) {
1420         return OK;
1421     }
1422 
1423     const int32_t scalerSizesTag =
1424               SessionConfigurationUtils::getAppropriateModeTag(
1425                       ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
1426     const int32_t scalerMinFrameDurationsTag = SessionConfigurationUtils::getAppropriateModeTag(
1427             ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, maxResolution);
1428     const int32_t scalerStallDurationsTag =
1429                  SessionConfigurationUtils::getAppropriateModeTag(
1430                         ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, maxResolution);
1431 
1432     const int32_t jpegRSizesTag =
1433             SessionConfigurationUtils::getAppropriateModeTag(
1434                     ANDROID_JPEGR_AVAILABLE_JPEG_R_STREAM_CONFIGURATIONS, maxResolution);
1435     const int32_t jpegRStallDurationsTag =
1436             SessionConfigurationUtils::getAppropriateModeTag(
1437                     ANDROID_JPEGR_AVAILABLE_JPEG_R_STALL_DURATIONS, maxResolution);
1438     const int32_t jpegRMinFrameDurationsTag =
1439             SessionConfigurationUtils::getAppropriateModeTag(
1440                  ANDROID_JPEGR_AVAILABLE_JPEG_R_MIN_FRAME_DURATIONS, maxResolution);
1441 
1442     auto& c = mCameraCharacteristics;
1443     std::vector<std::tuple<size_t, size_t>> supportedP010Sizes, supportedBlobSizes;
1444     auto capabilities = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1445     if (capabilities.count == 0) {
1446         ALOGE("%s: Supported camera capabilities is empty!", __FUNCTION__);
1447         return BAD_VALUE;
1448     }
1449 
1450     auto end = capabilities.data.u8 + capabilities.count;
1451     bool isTenBitOutputSupported = std::find(capabilities.data.u8, end,
1452             ANDROID_REQUEST_AVAILABLE_CAPABILITIES_DYNAMIC_RANGE_TEN_BIT) != end;
1453     if (!isTenBitOutputSupported) {
1454         // No 10-bit support, nothing more to do.
1455         return OK;
1456     }
1457 
1458     if (!isConcurrentDynamicRangeCaptureSupported(c,
1459                 ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_HLG10,
1460                 ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD) &&
1461             !property_get_bool("ro.camera.enableCompositeAPI0JpegR", false)) {
1462         // API0, P010 only Jpeg/R support is meant to be used only as a reference due to possible
1463         // impact on quality and performance.
1464         // This data path will be turned off by default and individual device builds must enable
1465         // 'ro.camera.enableCompositeAPI0JpegR' in order to experiment using it.
1466         mCompositeJpegRDisabled = true;
1467         return OK;
1468     }
1469 
1470     getSupportedSizes(c, scalerSizesTag,
1471             static_cast<android_pixel_format_t>(HAL_PIXEL_FORMAT_BLOB), &supportedBlobSizes);
1472     getSupportedSizes(c, scalerSizesTag,
1473             static_cast<android_pixel_format_t>(HAL_PIXEL_FORMAT_YCBCR_P010), &supportedP010Sizes);
1474     auto it = supportedP010Sizes.begin();
1475     while (it != supportedP010Sizes.end()) {
1476         if (std::find(supportedBlobSizes.begin(), supportedBlobSizes.end(), *it) ==
1477                 supportedBlobSizes.end()) {
1478             it = supportedP010Sizes.erase(it);
1479         } else {
1480             it++;
1481         }
1482     }
1483     if (supportedP010Sizes.empty()) {
1484         // Nothing to do in this case.
1485         return OK;
1486     }
1487 
1488     std::vector<int32_t> jpegREntries;
1489     for (const auto& it : supportedP010Sizes) {
1490         int32_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(it)),
1491                 static_cast<int32_t> (std::get<1>(it)),
1492                 ANDROID_JPEGR_AVAILABLE_JPEG_R_STREAM_CONFIGURATIONS_OUTPUT };
1493         jpegREntries.insert(jpegREntries.end(), entry, entry + 4);
1494     }
1495 
1496     std::vector<int64_t> jpegRMinDurations, jpegRStallDurations;
1497     auto ret = deriveBlobDurationEntries(c, maxResolution, supportedP010Sizes, &jpegRStallDurations,
1498                                          &jpegRMinDurations);
1499     if (ret != OK) {
1500         return ret;
1501     }
1502 
1503     ret = insertStreamConfigTags(jpegRSizesTag, jpegRMinFrameDurationsTag, jpegRStallDurationsTag,
1504                                  jpegREntries, jpegRMinDurations, jpegRStallDurations, &c);
1505     if (ret != OK) {
1506         return ret;
1507     }
1508 
1509     auto colorSpaces = c.find(ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP);
1510     if (colorSpaces.count > 0 && !maxResolution) {
1511         bool displayP3Support = false;
1512         int64_t dynamicRange = ANDROID_REQUEST_AVAILABLE_DYNAMIC_RANGE_PROFILES_MAP_STANDARD;
1513         for (size_t i = 0; i < colorSpaces.count; i += 3) {
1514             auto colorSpace = colorSpaces.data.i64[i];
1515             auto format = colorSpaces.data.i64[i+1];
1516             bool formatMatch = (format == static_cast<int64_t>(PublicFormat::JPEG)) ||
1517                     (format == static_cast<int64_t>(PublicFormat::UNKNOWN));
1518             bool colorSpaceMatch =
1519                 colorSpace == ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_DISPLAY_P3;
1520             if (formatMatch && colorSpaceMatch) {
1521                 displayP3Support = true;
1522             }
1523 
1524             // Jpeg/R will support the same dynamic range profiles as P010
1525             if (format == static_cast<int64_t>(PublicFormat::YCBCR_P010)) {
1526                 dynamicRange |= colorSpaces.data.i64[i+2];
1527             }
1528         }
1529         if (displayP3Support) {
1530             std::vector<int64_t> supportedColorSpaces;
1531             // Jpeg/R must support the default system as well ase display P3 color space
1532             supportedColorSpaces.reserve(colorSpaces.count + 3*2);
1533             supportedColorSpaces.insert(supportedColorSpaces.end(), colorSpaces.data.i64,
1534                     colorSpaces.data.i64 + colorSpaces.count);
1535 
1536             supportedColorSpaces.push_back(static_cast<int64_t>(
1537                     ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_SRGB));
1538             supportedColorSpaces.push_back(static_cast<int64_t>(PublicFormat::JPEG_R));
1539             supportedColorSpaces.push_back(dynamicRange);
1540 
1541             supportedColorSpaces.push_back(static_cast<int64_t>(
1542                     ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_DISPLAY_P3));
1543             supportedColorSpaces.push_back(static_cast<int64_t>(PublicFormat::JPEG_R));
1544             supportedColorSpaces.push_back(dynamicRange);
1545             c.update(ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP,
1546                     supportedColorSpaces.data(), supportedColorSpaces.size());
1547         }
1548     }
1549 
1550     return OK;
1551 }
1552 
addDynamicDepthTags(bool maxResolution)1553 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addDynamicDepthTags(
1554         bool maxResolution) {
1555     const int32_t depthExclTag = ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE;
1556 
1557     const int32_t scalerSizesTag =
1558               SessionConfigurationUtils::getAppropriateModeTag(
1559                       ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
1560     const int32_t scalerMinFrameDurationsTag =
1561             ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS;
1562     const int32_t scalerStallDurationsTag =
1563                  SessionConfigurationUtils::getAppropriateModeTag(
1564                         ANDROID_SCALER_AVAILABLE_STALL_DURATIONS, maxResolution);
1565 
1566     const int32_t depthSizesTag =
1567             SessionConfigurationUtils::getAppropriateModeTag(
1568                     ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS, maxResolution);
1569     const int32_t depthStallDurationsTag =
1570             SessionConfigurationUtils::getAppropriateModeTag(
1571                     ANDROID_DEPTH_AVAILABLE_DEPTH_STALL_DURATIONS, maxResolution);
1572     const int32_t depthMinFrameDurationsTag =
1573             SessionConfigurationUtils::getAppropriateModeTag(
1574                     ANDROID_DEPTH_AVAILABLE_DEPTH_MIN_FRAME_DURATIONS, maxResolution);
1575 
1576     const int32_t dynamicDepthSizesTag =
1577             SessionConfigurationUtils::getAppropriateModeTag(
1578                     ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STREAM_CONFIGURATIONS, maxResolution);
1579     const int32_t dynamicDepthStallDurationsTag =
1580             SessionConfigurationUtils::getAppropriateModeTag(
1581                     ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_STALL_DURATIONS, maxResolution);
1582     const int32_t dynamicDepthMinFrameDurationsTag =
1583             SessionConfigurationUtils::getAppropriateModeTag(
1584                  ANDROID_DEPTH_AVAILABLE_DYNAMIC_DEPTH_MIN_FRAME_DURATIONS, maxResolution);
1585 
1586     auto& c = mCameraCharacteristics;
1587     std::vector<std::tuple<size_t, size_t>> supportedBlobSizes, supportedDepthSizes,
1588             supportedDynamicDepthSizes, internalDepthSizes;
1589     auto chTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1590     if (chTags.count == 0) {
1591         ALOGE("%s: Supported camera characteristics is empty!", __FUNCTION__);
1592         return BAD_VALUE;
1593     }
1594 
1595     bool isDepthExclusivePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count,
1596             depthExclTag) != (chTags.data.i32 + chTags.count);
1597     bool isDepthSizePresent = std::find(chTags.data.i32, chTags.data.i32 + chTags.count,
1598             depthSizesTag) != (chTags.data.i32 + chTags.count);
1599     if (!(isDepthExclusivePresent && isDepthSizePresent)) {
1600         // No depth support, nothing more to do.
1601         return OK;
1602     }
1603 
1604     auto depthExclusiveEntry = c.find(depthExclTag);
1605     if (depthExclusiveEntry.count > 0) {
1606         if (depthExclusiveEntry.data.u8[0] != ANDROID_DEPTH_DEPTH_IS_EXCLUSIVE_FALSE) {
1607             // Depth support is exclusive, nothing more to do.
1608             return OK;
1609         }
1610     } else {
1611         ALOGE("%s: Advertised depth exclusive tag but value is not present!", __FUNCTION__);
1612         return BAD_VALUE;
1613     }
1614 
1615     getSupportedSizes(c, scalerSizesTag, HAL_PIXEL_FORMAT_BLOB,
1616             &supportedBlobSizes);
1617     getSupportedSizes(c, depthSizesTag, HAL_PIXEL_FORMAT_Y16, &supportedDepthSizes);
1618     if (supportedBlobSizes.empty() || supportedDepthSizes.empty()) {
1619         // Nothing to do in this case.
1620         return OK;
1621     }
1622 
1623     getSupportedDynamicDepthSizes(supportedBlobSizes, supportedDepthSizes,
1624             &supportedDynamicDepthSizes, &internalDepthSizes);
1625     if (supportedDynamicDepthSizes.empty()) {
1626         // Nothing more to do.
1627         return OK;
1628     }
1629 
1630     std::vector<int32_t> dynamicDepthEntries;
1631     for (const auto& it : supportedDynamicDepthSizes) {
1632         int32_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(it)),
1633                 static_cast<int32_t> (std::get<1>(it)),
1634                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT };
1635         dynamicDepthEntries.insert(dynamicDepthEntries.end(), entry, entry + 4);
1636     }
1637 
1638     std::vector<int64_t> depthMinDurations, depthStallDurations;
1639     std::vector<int64_t> blobMinDurations, blobStallDurations;
1640     std::vector<int64_t> dynamicDepthMinDurations, dynamicDepthStallDurations;
1641 
1642     getSupportedDurations(c, depthMinFrameDurationsTag, HAL_PIXEL_FORMAT_Y16, internalDepthSizes,
1643                           &depthMinDurations);
1644     getSupportedDurations(c, scalerMinFrameDurationsTag, HAL_PIXEL_FORMAT_BLOB,
1645                           supportedDynamicDepthSizes, &blobMinDurations);
1646     if (blobMinDurations.empty() || depthMinDurations.empty() ||
1647             (depthMinDurations.size() != blobMinDurations.size())) {
1648         ALOGE("%s: Unexpected number of available depth min durations! %zu vs. %zu",
1649                 __FUNCTION__, depthMinDurations.size(), blobMinDurations.size());
1650         return BAD_VALUE;
1651     }
1652 
1653     getSupportedDurations(c, depthStallDurationsTag, HAL_PIXEL_FORMAT_Y16, internalDepthSizes,
1654             &depthStallDurations);
1655     getSupportedDurations(c, scalerStallDurationsTag, HAL_PIXEL_FORMAT_BLOB,
1656             supportedDynamicDepthSizes, &blobStallDurations);
1657     if (blobStallDurations.empty() || depthStallDurations.empty() ||
1658             (depthStallDurations.size() != blobStallDurations.size())) {
1659         ALOGE("%s: Unexpected number of available depth stall durations! %zu vs. %zu",
1660                 __FUNCTION__, depthStallDurations.size(), blobStallDurations.size());
1661         return BAD_VALUE;
1662     }
1663 
1664     getSupportedDynamicDepthDurations(depthMinDurations, blobMinDurations,
1665             &dynamicDepthMinDurations);
1666     getSupportedDynamicDepthDurations(depthStallDurations, blobStallDurations,
1667             &dynamicDepthStallDurations);
1668     if (dynamicDepthMinDurations.empty() || dynamicDepthStallDurations.empty() ||
1669             (dynamicDepthMinDurations.size() != dynamicDepthStallDurations.size())) {
1670         ALOGE("%s: Unexpected number of dynamic depth stall/min durations! %zu vs. %zu",
1671                 __FUNCTION__, dynamicDepthMinDurations.size(), dynamicDepthStallDurations.size());
1672         return BAD_VALUE;
1673     }
1674 
1675     std::vector<int64_t> dynamicDepthMinDurationEntries;
1676     auto itDuration = dynamicDepthMinDurations.begin();
1677     auto itSize = supportedDynamicDepthSizes.begin();
1678     while (itDuration != dynamicDepthMinDurations.end()) {
1679         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)),
1680                 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration};
1681         dynamicDepthMinDurationEntries.insert(dynamicDepthMinDurationEntries.end(), entry,
1682                 entry + 4);
1683         itDuration++; itSize++;
1684     }
1685 
1686     std::vector<int64_t> dynamicDepthStallDurationEntries;
1687     itDuration = dynamicDepthStallDurations.begin();
1688     itSize = supportedDynamicDepthSizes.begin();
1689     while (itDuration != dynamicDepthStallDurations.end()) {
1690         int64_t entry[4] = {HAL_PIXEL_FORMAT_BLOB, static_cast<int32_t> (std::get<0>(*itSize)),
1691                 static_cast<int32_t> (std::get<1>(*itSize)), *itDuration};
1692         dynamicDepthStallDurationEntries.insert(dynamicDepthStallDurationEntries.end(), entry,
1693                 entry + 4);
1694         itDuration++; itSize++;
1695     }
1696 
1697     std::vector<int32_t> supportedChTags;
1698     supportedChTags.reserve(chTags.count + 3);
1699     supportedChTags.insert(supportedChTags.end(), chTags.data.i32,
1700             chTags.data.i32 + chTags.count);
1701     supportedChTags.push_back(dynamicDepthSizesTag);
1702     supportedChTags.push_back(dynamicDepthMinFrameDurationsTag);
1703     supportedChTags.push_back(dynamicDepthStallDurationsTag);
1704     c.update(dynamicDepthSizesTag, dynamicDepthEntries.data(), dynamicDepthEntries.size());
1705     c.update(dynamicDepthMinFrameDurationsTag, dynamicDepthMinDurationEntries.data(),
1706             dynamicDepthMinDurationEntries.size());
1707     c.update(dynamicDepthStallDurationsTag, dynamicDepthStallDurationEntries.data(),
1708              dynamicDepthStallDurationEntries.size());
1709     c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(),
1710             supportedChTags.size());
1711 
1712     return OK;
1713 }
1714 
fixupTorchStrengthTags()1715 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupTorchStrengthTags() {
1716     status_t res = OK;
1717     auto& c = mCameraCharacteristics;
1718     auto flashInfoStrengthDefaultLevelEntry = c.find(ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL);
1719     if (flashInfoStrengthDefaultLevelEntry.count == 0) {
1720         int32_t flashInfoStrengthDefaultLevel = 1;
1721         res = c.update(ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL,
1722                 &flashInfoStrengthDefaultLevel, 1);
1723         if (res != OK) {
1724             ALOGE("%s: Failed to update ANDROID_FLASH_INFO_STRENGTH_DEFAULT_LEVEL: %s (%d)",
1725                     __FUNCTION__,strerror(-res), res);
1726             return res;
1727         }
1728     }
1729     auto flashInfoStrengthMaximumLevelEntry = c.find(ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL);
1730     if (flashInfoStrengthMaximumLevelEntry.count == 0) {
1731         int32_t flashInfoStrengthMaximumLevel = 1;
1732         res = c.update(ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL,
1733                 &flashInfoStrengthMaximumLevel, 1);
1734         if (res != OK) {
1735             ALOGE("%s: Failed to update ANDROID_FLASH_INFO_STRENGTH_MAXIMUM_LEVEL: %s (%d)",
1736                     __FUNCTION__,strerror(-res), res);
1737             return res;
1738         }
1739     }
1740     return res;
1741 }
1742 
1743 
fixupManualFlashStrengthControlTags(CameraMetadata & ch)1744 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupManualFlashStrengthControlTags(
1745             CameraMetadata& ch) {
1746     status_t res = OK;
1747     auto flashSingleStrengthMaxLevelEntry = ch.find(ANDROID_FLASH_SINGLE_STRENGTH_MAX_LEVEL);
1748     if (flashSingleStrengthMaxLevelEntry.count == 0) {
1749         int32_t flashSingleStrengthMaxLevel = 1;
1750         res = ch.update(ANDROID_FLASH_SINGLE_STRENGTH_MAX_LEVEL,
1751                 &flashSingleStrengthMaxLevel, 1);
1752         if (res != OK) {
1753             ALOGE("%s: Failed to update ANDROID_FLASH_SINGLE_STRENGTH_MAX_LEVEL: %s (%d)",
1754                     __FUNCTION__,strerror(-res), res);
1755             return res;
1756         }
1757     }
1758     auto flashSingleStrengthDefaultLevelEntry = ch.find(
1759             ANDROID_FLASH_SINGLE_STRENGTH_DEFAULT_LEVEL);
1760     if (flashSingleStrengthDefaultLevelEntry.count == 0) {
1761         int32_t flashSingleStrengthDefaultLevel = 1;
1762         res = ch.update(ANDROID_FLASH_SINGLE_STRENGTH_DEFAULT_LEVEL,
1763                 &flashSingleStrengthDefaultLevel, 1);
1764         if (res != OK) {
1765             ALOGE("%s: Failed to update ANDROID_FLASH_SINGLE_STRENGTH_DEFAULT_LEVEL: %s (%d)",
1766                     __FUNCTION__,strerror(-res), res);
1767             return res;
1768         }
1769     }
1770     auto flashTorchStrengthMaxLevelEntry = ch.find(ANDROID_FLASH_TORCH_STRENGTH_MAX_LEVEL);
1771     if (flashTorchStrengthMaxLevelEntry.count == 0) {
1772         int32_t flashTorchStrengthMaxLevel = 1;
1773         res = ch.update(ANDROID_FLASH_TORCH_STRENGTH_MAX_LEVEL,
1774                 &flashTorchStrengthMaxLevel, 1);
1775         if (res != OK) {
1776             ALOGE("%s: Failed to update ANDROID_FLASH_TORCH_STRENGTH_MAX_LEVEL: %s (%d)",
1777                     __FUNCTION__,strerror(-res), res);
1778             return res;
1779         }
1780     }
1781     auto flashTorchStrengthDefaultLevelEntry = ch.find(ANDROID_FLASH_TORCH_STRENGTH_DEFAULT_LEVEL);
1782     if (flashTorchStrengthDefaultLevelEntry.count == 0) {
1783         int32_t flashTorchStrengthDefaultLevel = 1;
1784         res = ch.update(ANDROID_FLASH_TORCH_STRENGTH_DEFAULT_LEVEL,
1785                 &flashTorchStrengthDefaultLevel, 1);
1786         if (res != OK) {
1787             ALOGE("%s: Failed to update ANDROID_FLASH_TORCH_STRENGTH_DEFAULT_LEVEL: %s (%d)",
1788                     __FUNCTION__,strerror(-res), res);
1789             return res;
1790         }
1791     }
1792     return res;
1793 }
1794 
fixupMonochromeTags()1795 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fixupMonochromeTags() {
1796     status_t res = OK;
1797     auto& c = mCameraCharacteristics;
1798     sp<ProviderInfo> parentProvider = mParentProvider.promote();
1799     if (parentProvider == nullptr) {
1800         return DEAD_OBJECT;
1801     }
1802     IPCTransport ipcTransport = parentProvider->getIPCTransport();
1803     // Override static metadata for MONOCHROME camera with older device version
1804     if (ipcTransport == IPCTransport::HIDL &&
1805             (mVersion.get_major() == 3 && mVersion.get_minor() < 5)) {
1806         camera_metadata_entry cap = c.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
1807         for (size_t i = 0; i < cap.count; i++) {
1808             if (cap.data.u8[i] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_MONOCHROME) {
1809                 // ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT
1810                 uint8_t cfa = ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_MONO;
1811                 res = c.update(ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT, &cfa, 1);
1812                 if (res != OK) {
1813                     ALOGE("%s: Failed to update COLOR_FILTER_ARRANGEMENT: %s (%d)",
1814                           __FUNCTION__, strerror(-res), res);
1815                     return res;
1816                 }
1817 
1818                 // ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS
1819                 const std::vector<uint32_t> sKeys = {
1820                         ANDROID_SENSOR_REFERENCE_ILLUMINANT1,
1821                         ANDROID_SENSOR_REFERENCE_ILLUMINANT2,
1822                         ANDROID_SENSOR_CALIBRATION_TRANSFORM1,
1823                         ANDROID_SENSOR_CALIBRATION_TRANSFORM2,
1824                         ANDROID_SENSOR_COLOR_TRANSFORM1,
1825                         ANDROID_SENSOR_COLOR_TRANSFORM2,
1826                         ANDROID_SENSOR_FORWARD_MATRIX1,
1827                         ANDROID_SENSOR_FORWARD_MATRIX2,
1828                 };
1829                 res = removeAvailableKeys(c, sKeys,
1830                         ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1831                 if (res != OK) {
1832                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s (%d)",
1833                             __FUNCTION__, strerror(-res), res);
1834                     return res;
1835                 }
1836 
1837                 // ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS
1838                 const std::vector<uint32_t> reqKeys = {
1839                         ANDROID_COLOR_CORRECTION_MODE,
1840                         ANDROID_COLOR_CORRECTION_TRANSFORM,
1841                         ANDROID_COLOR_CORRECTION_GAINS,
1842                 };
1843                 res = removeAvailableKeys(c, reqKeys, ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS);
1844                 if (res != OK) {
1845                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_REQUEST_KEYS: %s (%d)",
1846                             __FUNCTION__, strerror(-res), res);
1847                     return res;
1848                 }
1849 
1850                 // ANDROID_REQUEST_AVAILABLE_RESULT_KEYS
1851                 const std::vector<uint32_t> resKeys = {
1852                         ANDROID_SENSOR_GREEN_SPLIT,
1853                         ANDROID_SENSOR_NEUTRAL_COLOR_POINT,
1854                         ANDROID_COLOR_CORRECTION_MODE,
1855                         ANDROID_COLOR_CORRECTION_TRANSFORM,
1856                         ANDROID_COLOR_CORRECTION_GAINS,
1857                 };
1858                 res = removeAvailableKeys(c, resKeys, ANDROID_REQUEST_AVAILABLE_RESULT_KEYS);
1859                 if (res != OK) {
1860                     ALOGE("%s: Failed to update REQUEST_AVAILABLE_RESULT_KEYS: %s (%d)",
1861                             __FUNCTION__, strerror(-res), res);
1862                     return res;
1863                 }
1864 
1865                 // ANDROID_SENSOR_BLACK_LEVEL_PATTERN
1866                 camera_metadata_entry blEntry = c.find(ANDROID_SENSOR_BLACK_LEVEL_PATTERN);
1867                 for (size_t j = 1; j < blEntry.count; j++) {
1868                     blEntry.data.i32[j] = blEntry.data.i32[0];
1869                 }
1870             }
1871         }
1872     }
1873     return res;
1874 }
1875 
addRotateCropTags()1876 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addRotateCropTags() {
1877     status_t res = OK;
1878     auto& c = mCameraCharacteristics;
1879 
1880     auto availableRotateCropEntry = c.find(ANDROID_SCALER_AVAILABLE_ROTATE_AND_CROP_MODES);
1881     if (availableRotateCropEntry.count == 0) {
1882         uint8_t defaultAvailableRotateCropEntry = ANDROID_SCALER_ROTATE_AND_CROP_NONE;
1883         res = c.update(ANDROID_SCALER_AVAILABLE_ROTATE_AND_CROP_MODES,
1884                 &defaultAvailableRotateCropEntry, 1);
1885     }
1886     return res;
1887 }
1888 
addAutoframingTags()1889 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addAutoframingTags() {
1890     status_t res = OK;
1891     auto& c = mCameraCharacteristics;
1892 
1893     auto availableAutoframingEntry = c.find(ANDROID_CONTROL_AUTOFRAMING_AVAILABLE);
1894     if (availableAutoframingEntry.count == 0) {
1895         uint8_t  defaultAutoframingEntry = ANDROID_CONTROL_AUTOFRAMING_AVAILABLE_FALSE;
1896         res = c.update(ANDROID_CONTROL_AUTOFRAMING_AVAILABLE,
1897                 &defaultAutoframingEntry, 1);
1898     }
1899     return res;
1900 }
1901 
addAePriorityModeTags()1902 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addAePriorityModeTags() {
1903     status_t res = OK;
1904     auto& c = mCameraCharacteristics;
1905 
1906     auto entry = c.find(ANDROID_CONTROL_AE_AVAILABLE_PRIORITY_MODES);
1907     if (entry.count != 0) {
1908         return res;
1909     }
1910 
1911     std::vector<int32_t> supportedChTags;
1912     auto chTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1913     if (chTags.count == 0) {
1914         ALOGE("%s: No supported camera characteristics keys!", __FUNCTION__);
1915         return BAD_VALUE;
1916     }
1917 
1918     std::vector<uint8_t> aePriorityAvailableModes = {
1919             ANDROID_CONTROL_AE_PRIORITY_MODE_OFF };
1920     supportedChTags.reserve(chTags.count + 1);
1921     supportedChTags.insert(supportedChTags.end(), chTags.data.i32,
1922             chTags.data.i32 + chTags.count);
1923     supportedChTags.push_back(ANDROID_CONTROL_AE_AVAILABLE_PRIORITY_MODES);
1924     c.update(ANDROID_CONTROL_AE_AVAILABLE_PRIORITY_MODES,
1925             aePriorityAvailableModes.data(), aePriorityAvailableModes.size());
1926     c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(),
1927              supportedChTags.size());
1928 
1929     return res;
1930 }
1931 
addPreCorrectionActiveArraySize()1932 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addPreCorrectionActiveArraySize() {
1933     status_t res = OK;
1934     auto& c = mCameraCharacteristics;
1935 
1936     auto activeArraySize = c.find(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE);
1937     auto preCorrectionActiveArraySize = c.find(
1938             ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
1939     if (activeArraySize.count == 4 && preCorrectionActiveArraySize.count == 0) {
1940         std::vector<int32_t> preCorrectionArray(
1941                 activeArraySize.data.i32, activeArraySize.data.i32+4);
1942         res = c.update(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE,
1943                 preCorrectionArray.data(), 4);
1944         if (res != OK) {
1945             ALOGE("%s: Failed to add ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE: %s(%d)",
1946                     __FUNCTION__, strerror(-res), res);
1947             return res;
1948         }
1949     } else {
1950         return res;
1951     }
1952 
1953     auto charTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
1954     bool hasPreCorrectionActiveArraySize = std::find(charTags.data.i32,
1955             charTags.data.i32 + charTags.count,
1956             ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE) !=
1957             (charTags.data.i32 + charTags.count);
1958     if (!hasPreCorrectionActiveArraySize) {
1959         std::vector<int32_t> supportedCharTags;
1960         supportedCharTags.reserve(charTags.count + 1);
1961         supportedCharTags.insert(supportedCharTags.end(), charTags.data.i32,
1962                 charTags.data.i32 + charTags.count);
1963         supportedCharTags.push_back(ANDROID_SENSOR_INFO_PRE_CORRECTION_ACTIVE_ARRAY_SIZE);
1964 
1965         res = c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedCharTags.data(),
1966                 supportedCharTags.size());
1967         if (res != OK) {
1968             ALOGE("%s: Failed to update ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS: %s(%d)",
1969                     __FUNCTION__, strerror(-res), res);
1970             return res;
1971         }
1972     }
1973 
1974     return res;
1975 }
1976 
addReadoutTimestampTag(bool readoutTimestampSupported)1977 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addReadoutTimestampTag(
1978         bool readoutTimestampSupported) {
1979     status_t res = OK;
1980     auto& c = mCameraCharacteristics;
1981 
1982     auto entry = c.find(ANDROID_SENSOR_READOUT_TIMESTAMP);
1983     if (entry.count == 0) {
1984         uint8_t defaultReadoutTimestamp = readoutTimestampSupported ?
1985                                           ANDROID_SENSOR_READOUT_TIMESTAMP_HARDWARE :
1986                                           ANDROID_SENSOR_READOUT_TIMESTAMP_NOT_SUPPORTED;
1987         res = c.update(ANDROID_SENSOR_READOUT_TIMESTAMP, &defaultReadoutTimestamp, 1);
1988     }
1989 
1990     return res;
1991 }
1992 
addColorCorrectionAvailableModesTag(CameraMetadata & c)1993 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addColorCorrectionAvailableModesTag(
1994             CameraMetadata& c) {
1995     status_t res = OK;
1996 
1997     // The COLOR_CORRECTION_AVAILABLE_MODES key advertises the
1998     // supported color correction modes. Previously, if color correction was
1999     // supported (COLOR_CORRECTION_MODE was not null), it was assumed
2000     // that all existing options, TRANSFORM_MATRIX, FAST, and HIGH_QUALITY, were supported.
2001     // However, a new optional mode, CCT, has been introduced. To indicate
2002     // whether CCT is supported, the camera device must now explicitly list all
2003     // available modes using the COLOR_CORRECTION_AVAILABLE_MODES key.
2004     // If the camera device doesn't set COLOR_CORRECTION_AVAILABLE_MODES,
2005     // this code falls back to checking for the COLOR_CORRECTION_MODE key.
2006     // If present, this adds the required supported modes TRANSFORM_MATRIX,
2007     // FAST, HIGH_QUALITY.
2008     auto entry = c.find(ANDROID_COLOR_CORRECTION_AVAILABLE_MODES);
2009     if (entry.count != 0) {
2010         return res;
2011     }
2012 
2013     auto reqKeys = c.find(ANDROID_REQUEST_AVAILABLE_REQUEST_KEYS);
2014     if (reqKeys.count == 0) {
2015         ALOGE("%s: No supported camera request keys!", __FUNCTION__);
2016         return BAD_VALUE;
2017     }
2018 
2019     bool colorCorrectionModeAvailable = false;
2020     for (size_t i = 0; i < reqKeys.count; i++) {
2021         if (reqKeys.data.i32[i] == ANDROID_COLOR_CORRECTION_MODE) {
2022             colorCorrectionModeAvailable = true;
2023             break;
2024         }
2025     }
2026 
2027     if (!colorCorrectionModeAvailable) {
2028         return res;
2029     }
2030 
2031     std::vector<int32_t> supportedChTags;
2032     auto chTags = c.find(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS);
2033     if (chTags.count == 0) {
2034         ALOGE("%s: No supported camera characteristics keys!", __FUNCTION__);
2035         return BAD_VALUE;
2036     }
2037 
2038     std::vector<uint8_t> colorCorrectionAvailableModes = {
2039             ANDROID_COLOR_CORRECTION_MODE_TRANSFORM_MATRIX,
2040             ANDROID_COLOR_CORRECTION_MODE_FAST,
2041             ANDROID_COLOR_CORRECTION_MODE_HIGH_QUALITY };
2042     supportedChTags.reserve(chTags.count + 1);
2043     supportedChTags.insert(supportedChTags.end(), chTags.data.i32,
2044             chTags.data.i32 + chTags.count);
2045     supportedChTags.push_back(ANDROID_COLOR_CORRECTION_AVAILABLE_MODES);
2046     c.update(ANDROID_COLOR_CORRECTION_AVAILABLE_MODES,
2047             colorCorrectionAvailableModes.data(), colorCorrectionAvailableModes.size());
2048     c.update(ANDROID_REQUEST_AVAILABLE_CHARACTERISTICS_KEYS, supportedChTags.data(),
2049              supportedChTags.size());
2050 
2051     return res;
2052 }
2053 
addSessionConfigQueryVersionTag()2054 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addSessionConfigQueryVersionTag() {
2055     sp<ProviderInfo> parentProvider = mParentProvider.promote();
2056     if (parentProvider == nullptr) {
2057         return DEAD_OBJECT;
2058     }
2059 
2060     int versionCode = ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION_UPSIDE_DOWN_CAKE;
2061     IPCTransport ipcTransport = parentProvider->getIPCTransport();
2062     auto& c = mCameraCharacteristics;
2063     status_t res = OK;
2064     if (ipcTransport != IPCTransport::AIDL) {
2065         res = c.update(ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION, &versionCode, 1);
2066         mSessionConfigQueryVersion = versionCode;
2067         return res;
2068     }
2069 
2070     int deviceVersion = HARDWARE_DEVICE_API_VERSION(mVersion.get_major(), mVersion.get_minor());
2071     if (deviceVersion == CAMERA_DEVICE_API_VERSION_1_3) {
2072         versionCode = ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION_VANILLA_ICE_CREAM;
2073     } else if (deviceVersion >= CAMERA_DEVICE_API_VERSION_1_4) {
2074         if (flags::feature_combination_baklava()) {
2075             versionCode = ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION_BAKLAVA;
2076         } else {
2077             versionCode = ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION_VANILLA_ICE_CREAM;
2078         }
2079     }
2080     res = c.update(ANDROID_INFO_SESSION_CONFIGURATION_QUERY_VERSION, &versionCode, 1);
2081     mSessionConfigQueryVersion = versionCode;
2082     return res;
2083 }
2084 
isAutomotiveDevice()2085 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAutomotiveDevice() {
2086     // Checks the property ro.hardware.type and returns true if it is
2087     // automotive.
2088     char value[PROPERTY_VALUE_MAX] = {0};
2089     property_get("ro.hardware.type", value, "");
2090     return strncmp(value, "automotive", PROPERTY_VALUE_MAX) == 0;
2091 }
2092 
addSharedSessionConfigurationTags()2093 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::addSharedSessionConfigurationTags() {
2094     status_t res = OK;
2095     if (flags::camera_multi_client()) {
2096         const int32_t sharedColorSpaceTag = ANDROID_SHARED_SESSION_COLOR_SPACE;
2097         const int32_t sharedOutputConfigurationsTag = ANDROID_SHARED_SESSION_OUTPUT_CONFIGURATIONS;
2098         auto& c = mCameraCharacteristics;
2099         uint8_t colorSpace = 0;
2100 
2101         res = c.update(sharedColorSpaceTag, &colorSpace, 1);
2102 
2103         // ToDo: b/372321187 Hardcoding the shared session configuration. Update the code to
2104         // take these values from XML instead.
2105         std::vector<int64_t> sharedOutputConfigEntries;
2106         int64_t surfaceType1 =  OutputConfiguration::SURFACE_TYPE_IMAGE_READER;
2107         int64_t width = 1280;
2108         int64_t height = 800;
2109         int64_t format1 = HAL_PIXEL_FORMAT_RGBA_8888;
2110         int64_t mirrorMode = OutputConfiguration::MIRROR_MODE_AUTO;
2111         int64_t timestampBase = OutputConfiguration::TIMESTAMP_BASE_DEFAULT;
2112         int64_t usage1 = 3;
2113         int64_t dataspace = 0;
2114         int64_t useReadoutTimestamp = 0;
2115         int64_t streamUseCase = ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT;
2116         int64_t physicalCamIdLen = 0;
2117 
2118         // Stream 1 configuration hardcoded
2119         sharedOutputConfigEntries.push_back(surfaceType1);
2120         sharedOutputConfigEntries.push_back(width);
2121         sharedOutputConfigEntries.push_back(height);
2122         sharedOutputConfigEntries.push_back(format1);
2123         sharedOutputConfigEntries.push_back(mirrorMode);
2124         sharedOutputConfigEntries.push_back(useReadoutTimestamp);
2125         sharedOutputConfigEntries.push_back(timestampBase);
2126         sharedOutputConfigEntries.push_back(dataspace);
2127         sharedOutputConfigEntries.push_back(usage1);
2128         sharedOutputConfigEntries.push_back(streamUseCase);
2129         sharedOutputConfigEntries.push_back(physicalCamIdLen);
2130 
2131         // Stream 2 configuration hardcoded
2132         int64_t surfaceType2 =  OutputConfiguration::SURFACE_TYPE_SURFACE_VIEW;
2133         int64_t format2 = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
2134         int64_t usage2 = 0;
2135 
2136         sharedOutputConfigEntries.push_back(surfaceType2);
2137         sharedOutputConfigEntries.push_back(width);
2138         sharedOutputConfigEntries.push_back(height);
2139         sharedOutputConfigEntries.push_back(format2);
2140         sharedOutputConfigEntries.push_back(mirrorMode);
2141         sharedOutputConfigEntries.push_back(useReadoutTimestamp);
2142         sharedOutputConfigEntries.push_back(timestampBase);
2143         sharedOutputConfigEntries.push_back(dataspace);
2144         sharedOutputConfigEntries.push_back(usage2);
2145         sharedOutputConfigEntries.push_back(streamUseCase);
2146         sharedOutputConfigEntries.push_back(physicalCamIdLen);
2147 
2148         res = c.update(sharedOutputConfigurationsTag, sharedOutputConfigEntries.data(),
2149                 sharedOutputConfigEntries.size());
2150     }
2151     return res;
2152 }
2153 
removeAvailableKeys(CameraMetadata & c,const std::vector<uint32_t> & keys,uint32_t keyTag)2154 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::removeAvailableKeys(
2155         CameraMetadata& c, const std::vector<uint32_t>& keys, uint32_t keyTag) {
2156     status_t res = OK;
2157 
2158     camera_metadata_entry keysEntry = c.find(keyTag);
2159     if (keysEntry.count == 0) {
2160         ALOGE("%s: Failed to find tag %u: %s (%d)", __FUNCTION__, keyTag, strerror(-res), res);
2161         return res;
2162     }
2163     std::vector<int32_t> vKeys;
2164     vKeys.reserve(keysEntry.count);
2165     for (size_t i = 0; i < keysEntry.count; i++) {
2166         if (std::find(keys.begin(), keys.end(), keysEntry.data.i32[i]) == keys.end()) {
2167             vKeys.push_back(keysEntry.data.i32[i]);
2168         }
2169     }
2170     res = c.update(keyTag, vKeys.data(), vKeys.size());
2171     return res;
2172 }
2173 
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)2174 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::fillHeicStreamCombinations(
2175         std::vector<int32_t>* outputs,
2176         std::vector<int64_t>* durations,
2177         std::vector<int64_t>* stallDurations,
2178         const camera_metadata_entry& halStreamConfigs,
2179         const camera_metadata_entry& halStreamDurations) {
2180     if (outputs == nullptr || durations == nullptr || stallDurations == nullptr) {
2181         return BAD_VALUE;
2182     }
2183 
2184     static bool supportInMemoryTempFile =
2185             camera3::HeicCompositeStream::isInMemoryTempFileSupported();
2186     if (!supportInMemoryTempFile) {
2187         ALOGI("%s: No HEIC support due to absence of in memory temp file support",
2188                 __FUNCTION__);
2189         return OK;
2190     }
2191 
2192     for (size_t i = 0; i < halStreamConfigs.count; i += 4) {
2193         int32_t format = halStreamConfigs.data.i32[i];
2194         // Only IMPLEMENTATION_DEFINED and YUV_888 can be used to generate HEIC
2195         // image.
2196         if (format != HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
2197                 format != HAL_PIXEL_FORMAT_YCBCR_420_888) {
2198             continue;
2199         }
2200 
2201         bool sizeAvail = false;
2202         for (size_t j = 0; j < outputs->size(); j+= 4) {
2203             if ((*outputs)[j+1] == halStreamConfigs.data.i32[i+1] &&
2204                     (*outputs)[j+2] == halStreamConfigs.data.i32[i+2]) {
2205                 sizeAvail = true;
2206                 break;
2207             }
2208         }
2209         if (sizeAvail) continue;
2210 
2211         int64_t stall = 0;
2212         bool useHeic = false;
2213         bool useGrid = false;
2214         if (camera3::HeicCompositeStream::isSizeSupportedByHeifEncoder(
2215                 halStreamConfigs.data.i32[i+1], halStreamConfigs.data.i32[i+2],
2216                 &useHeic, &useGrid, &stall, nullptr /*hevcName*/, kFrameworkHeicAllowSWCodecs)) {
2217             if (useGrid != (format == HAL_PIXEL_FORMAT_YCBCR_420_888)) {
2218                 continue;
2219             }
2220 
2221             // HEIC configuration
2222             int32_t config[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
2223                     halStreamConfigs.data.i32[i+2], 0 /*isInput*/};
2224             outputs->insert(outputs->end(), config, config + 4);
2225 
2226             // HEIC minFrameDuration
2227             for (size_t j = 0; j < halStreamDurations.count; j += 4) {
2228                 if (halStreamDurations.data.i64[j] == format &&
2229                         halStreamDurations.data.i64[j+1] == halStreamConfigs.data.i32[i+1] &&
2230                         halStreamDurations.data.i64[j+2] == halStreamConfigs.data.i32[i+2]) {
2231                     int64_t duration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
2232                             halStreamConfigs.data.i32[i+2], halStreamDurations.data.i64[j+3]};
2233                     durations->insert(durations->end(), duration, duration+4);
2234                     break;
2235                 }
2236             }
2237 
2238             // HEIC stallDuration
2239             int64_t stallDuration[] = {HAL_PIXEL_FORMAT_BLOB, halStreamConfigs.data.i32[i+1],
2240                     halStreamConfigs.data.i32[i+2], stall};
2241             stallDurations->insert(stallDurations->end(), stallDuration, stallDuration+4);
2242         }
2243     }
2244     return OK;
2245 }
2246 
deriveHeicTags(bool maxResolution)2247 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::deriveHeicTags(bool maxResolution) {
2248     int32_t scalerStreamSizesTag =
2249             SessionConfigurationUtils::getAppropriateModeTag(
2250                     ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS, maxResolution);
2251     int32_t scalerMinFrameDurationsTag =
2252             SessionConfigurationUtils::getAppropriateModeTag(
2253                     ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS, maxResolution);
2254 
2255     int32_t heicStreamSizesTag =
2256             SessionConfigurationUtils::getAppropriateModeTag(
2257                     ANDROID_HEIC_AVAILABLE_HEIC_STREAM_CONFIGURATIONS, maxResolution);
2258     int32_t heicMinFrameDurationsTag =
2259             SessionConfigurationUtils::getAppropriateModeTag(
2260                     ANDROID_HEIC_AVAILABLE_HEIC_MIN_FRAME_DURATIONS, maxResolution);
2261     int32_t heicStallDurationsTag =
2262             SessionConfigurationUtils::getAppropriateModeTag(
2263                     ANDROID_HEIC_AVAILABLE_HEIC_STALL_DURATIONS, maxResolution);
2264 
2265     auto& c = mCameraCharacteristics;
2266 
2267     camera_metadata_entry halHeicSupport = c.find(ANDROID_HEIC_INFO_SUPPORTED);
2268     if (halHeicSupport.count > 1) {
2269         ALOGE("%s: Invalid entry count %zu for ANDROID_HEIC_INFO_SUPPORTED",
2270                 __FUNCTION__, halHeicSupport.count);
2271         return BAD_VALUE;
2272     } else if (halHeicSupport.count == 0 ||
2273             halHeicSupport.data.u8[0] == ANDROID_HEIC_INFO_SUPPORTED_FALSE) {
2274         // Camera HAL doesn't support mandatory stream combinations for HEIC.
2275         return OK;
2276     }
2277 
2278     camera_metadata_entry maxJpegAppsSegments =
2279             c.find(ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT);
2280     if (maxJpegAppsSegments.count != 1 || maxJpegAppsSegments.data.u8[0] == 0 ||
2281             maxJpegAppsSegments.data.u8[0] > 16) {
2282         ALOGE("%s: ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT must be within [1, 16]",
2283                 __FUNCTION__);
2284         return BAD_VALUE;
2285     }
2286 
2287     // Populate HEIC output configurations and its related min frame duration
2288     // and stall duration.
2289     std::vector<int32_t> heicOutputs;
2290     std::vector<int64_t> heicDurations;
2291     std::vector<int64_t> heicStallDurations;
2292 
2293     camera_metadata_entry halStreamConfigs = c.find(scalerStreamSizesTag);
2294     camera_metadata_entry minFrameDurations = c.find(scalerMinFrameDurationsTag);
2295 
2296     status_t res = fillHeicStreamCombinations(&heicOutputs, &heicDurations, &heicStallDurations,
2297             halStreamConfigs, minFrameDurations);
2298     if (res != OK) {
2299         ALOGE("%s: Failed to fill HEIC stream combinations: %s (%d)", __FUNCTION__,
2300                 strerror(-res), res);
2301         return res;
2302     }
2303 
2304     c.update(heicStreamSizesTag, heicOutputs.data(), heicOutputs.size());
2305     c.update(heicMinFrameDurationsTag, heicDurations.data(), heicDurations.size());
2306     c.update(heicStallDurationsTag, heicStallDurations.data(), heicStallDurations.size());
2307 
2308     return OK;
2309 }
2310 
isLogicalCameraLocked(const std::string & id,std::vector<std::string> * physicalCameraIds)2311 bool CameraProviderManager::isLogicalCameraLocked(const std::string& id,
2312         std::vector<std::string>* physicalCameraIds) {
2313     auto deviceInfo = findDeviceInfoLocked(id);
2314     if (deviceInfo == nullptr) return false;
2315 
2316     if (deviceInfo->mIsLogicalCamera && physicalCameraIds != nullptr) {
2317         *physicalCameraIds = deviceInfo->mPhysicalIds;
2318     }
2319     return deviceInfo->mIsLogicalCamera;
2320 }
2321 
isLogicalCamera(const std::string & id,std::vector<std::string> * physicalCameraIds)2322 bool CameraProviderManager::isLogicalCamera(const std::string& id,
2323         std::vector<std::string>* physicalCameraIds) {
2324     std::lock_guard<std::mutex> lock(mInterfaceMutex);
2325     return isLogicalCameraLocked(id, physicalCameraIds);
2326 }
2327 
getSystemCameraKind(const std::string & id,SystemCameraKind * kind) const2328 status_t CameraProviderManager::getSystemCameraKind(const std::string& id,
2329         SystemCameraKind *kind) const {
2330     std::lock_guard<std::mutex> lock(mInterfaceMutex);
2331     return getSystemCameraKindLocked(id, kind);
2332 }
2333 
getSystemCameraKindLocked(const std::string & id,SystemCameraKind * kind) const2334 status_t CameraProviderManager::getSystemCameraKindLocked(const std::string& id,
2335         SystemCameraKind *kind) const {
2336     auto deviceInfo = findDeviceInfoLocked(id);
2337     if (deviceInfo != nullptr) {
2338         *kind = deviceInfo->mSystemCameraKind;
2339         return OK;
2340     }
2341     // If this is a hidden physical camera, we should return what kind of
2342     // camera the enclosing logical camera is.
2343     auto isHiddenAndParent = isHiddenPhysicalCameraInternal(id);
2344     if (isHiddenAndParent.first) {
2345         LOG_ALWAYS_FATAL_IF(id == isHiddenAndParent.second->mId,
2346                 "%s: hidden physical camera id %s and enclosing logical camera id %s are the same",
2347                 __FUNCTION__, id.c_str(), isHiddenAndParent.second->mId.c_str());
2348         return getSystemCameraKindLocked(isHiddenAndParent.second->mId, kind);
2349     }
2350     // Neither a hidden physical camera nor a logical camera
2351     return NAME_NOT_FOUND;
2352 }
2353 
isHiddenPhysicalCamera(const std::string & cameraId) const2354 bool CameraProviderManager::isHiddenPhysicalCamera(const std::string& cameraId) const {
2355     std::lock_guard<std::mutex> lock(mInterfaceMutex);
2356     return isHiddenPhysicalCameraInternal(cameraId).first;
2357 }
2358 
filterSmallJpegSizes(const std::string & cameraId)2359 status_t CameraProviderManager::filterSmallJpegSizes(const std::string& cameraId) {
2360     std::lock_guard<std::mutex> lock(mInterfaceMutex);
2361     for (auto& provider : mProviders) {
2362         for (auto& deviceInfo : provider->mDevices) {
2363             if (deviceInfo->mId == cameraId) {
2364                 return deviceInfo->filterSmallJpegSizes();
2365             }
2366         }
2367     }
2368     return NAME_NOT_FOUND;
2369 }
2370 
2371 std::pair<bool, CameraProviderManager::ProviderInfo::DeviceInfo *>
isHiddenPhysicalCameraInternal(const std::string & cameraId) const2372 CameraProviderManager::isHiddenPhysicalCameraInternal(const std::string& cameraId) const {
2373     auto falseRet = std::make_pair(false, nullptr);
2374     for (auto& provider : mProviders) {
2375         for (auto& deviceInfo : provider->mDevices) {
2376             if (deviceInfo->mId == cameraId) {
2377                 // cameraId is found in public camera IDs advertised by the
2378                 // provider.
2379                 return falseRet;
2380             }
2381         }
2382     }
2383 
2384     for (auto& provider : mProviders) {
2385         IPCTransport transport = provider->getIPCTransport();
2386         for (auto& deviceInfo : provider->mDevices) {
2387             std::vector<std::string> physicalIds;
2388             if (deviceInfo->mIsLogicalCamera) {
2389                 if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
2390                         cameraId) != deviceInfo->mPhysicalIds.end()) {
2391                     int deviceVersion = HARDWARE_DEVICE_API_VERSION(
2392                             deviceInfo->mVersion.get_major(), deviceInfo->mVersion.get_minor());
2393                     if (transport == IPCTransport::HIDL &&
2394                             deviceVersion < CAMERA_DEVICE_API_VERSION_3_5) {
2395                         ALOGE("%s: Wrong deviceVersion %x for hiddenPhysicalCameraId %s",
2396                                 __FUNCTION__, deviceVersion, cameraId.c_str());
2397                         return falseRet;
2398                     } else {
2399                         return std::make_pair(true, deviceInfo.get());
2400                     }
2401                 }
2402             }
2403         }
2404     }
2405 
2406     return falseRet;
2407 }
2408 
tryToInitializeAidlProviderLocked(const std::string & providerName,const sp<ProviderInfo> & providerInfo)2409 status_t CameraProviderManager::tryToInitializeAidlProviderLocked(
2410         const std::string& providerName, const sp<ProviderInfo>& providerInfo) {
2411     using aidl::android::hardware::camera::provider::ICameraProvider;
2412 
2413     // Only get remote instance if already running. Lazy Providers will be woken up later.
2414     std::shared_ptr<ICameraProvider> interface = mAidlServiceProxy->tryGetService(providerName);
2415 
2416     if (interface == nullptr) {
2417         ALOGW("%s: AIDL Camera provider HAL '%s' is not actually available", __FUNCTION__,
2418                 providerName.c_str());
2419         return BAD_VALUE;
2420     }
2421 
2422     AidlProviderInfo *aidlProviderInfo = static_cast<AidlProviderInfo *>(providerInfo.get());
2423     status_t res = aidlProviderInfo->initializeAidlProvider(interface, mDeviceState);
2424 
2425     if (flags::enable_hal_abort_from_cameraservicewatchdog()) {
2426         pid_t pid = 0;
2427 
2428         if (AIBinder_toPlatformBinder(interface->asBinder().get())->getDebugPid(&pid) == OK
2429                 && res == OK) {
2430             std::lock_guard<std::mutex> lock(mProviderPidMapLock);
2431             mProviderPidMap[providerInfo->mProviderInstance] = pid;
2432         }
2433     }
2434 
2435     return res;
2436 }
2437 
tryToInitializeHidlProviderLocked(const std::string & providerName,const sp<ProviderInfo> & providerInfo)2438 status_t CameraProviderManager::tryToInitializeHidlProviderLocked(
2439         const std::string& providerName, const sp<ProviderInfo>& providerInfo) {
2440     sp<provider::V2_4::ICameraProvider> interface;
2441     interface = mHidlServiceProxy->tryGetService(providerName);
2442 
2443     if (interface == nullptr) {
2444         // The interface may not be started yet. In that case, this is not a
2445         // fatal error.
2446         ALOGW("%s: HIDL Camera provider HAL '%s' is not actually available", __FUNCTION__,
2447                 providerName.c_str());
2448         return BAD_VALUE;
2449     }
2450 
2451     HidlProviderInfo *hidlProviderInfo = static_cast<HidlProviderInfo *>(providerInfo.get());
2452     status_t res = hidlProviderInfo->initializeHidlProvider(interface, mDeviceState);
2453 
2454     if (flags::enable_hal_abort_from_cameraservicewatchdog()) {
2455         pid_t pid = 0;
2456 
2457         auto ret = interface->getDebugInfo([&pid](
2458                 const ::android::hidl::base::V1_0::DebugInfo& info) {
2459             pid = info.pid;
2460         });
2461 
2462         if (ret.isOk() && res == OK) {
2463             std::lock_guard<std::mutex> lock(mProviderPidMapLock);
2464             mProviderPidMap[providerInfo->mProviderInstance] = pid;
2465         }
2466     }
2467 
2468     return res;
2469 }
2470 
addAidlProviderLocked(const std::string & newProvider)2471 status_t CameraProviderManager::addAidlProviderLocked(const std::string& newProvider) {
2472     // Several camera provider instances can be temporarily present.
2473     // Defer initialization of a new instance until the older instance is properly removed.
2474     auto providerInstance = newProvider + "-" + std::to_string(mProviderInstanceId);
2475     bool providerPresent = false;
2476     bool preexisting =
2477             (mAidlProviderWithBinders.find(newProvider) != mAidlProviderWithBinders.end());
2478     using aidl::android::hardware::camera::provider::ICameraProvider;
2479 
2480     // 'newProvider' has the fully qualified name of the provider service in case of AIDL.
2481     // ProviderInfo::mProviderName also has the fully qualified name - so we just compare them
2482     // here.
2483     std::string providerNameUsed = newProvider;
2484 
2485     for (const auto& providerInfo : mProviders) {
2486         if (providerInfo->mProviderName == providerNameUsed) {
2487             ALOGW("%s: Camera provider HAL with name '%s' already registered",
2488                     __FUNCTION__, newProvider.c_str());
2489             // Do not add new instances for lazy HAL external provider or aidl
2490             // binders previously seen.
2491             if (preexisting || providerInfo->isExternalLazyHAL()) {
2492                 return ALREADY_EXISTS;
2493             } else {
2494                 ALOGW("%s: The new provider instance will get initialized immediately after the"
2495                         " currently present instance is removed!", __FUNCTION__);
2496                 providerPresent = true;
2497                 break;
2498             }
2499         }
2500     }
2501 
2502     sp<AidlProviderInfo> providerInfo =
2503             new AidlProviderInfo(providerNameUsed, providerInstance, this);
2504 
2505     if (!providerPresent) {
2506         status_t res = tryToInitializeAidlProviderLocked(newProvider, providerInfo);
2507         if (res != OK) {
2508             return res;
2509         }
2510         mAidlProviderWithBinders.emplace(newProvider);
2511     }
2512 
2513     mProviders.push_back(providerInfo);
2514     mProviderInstanceId++;
2515 
2516     return OK;
2517 }
2518 
addHidlProviderLocked(const std::string & newProvider,bool preexisting)2519 status_t CameraProviderManager::addHidlProviderLocked(const std::string& newProvider,
2520         bool preexisting) {
2521     // Several camera provider instances can be temporarily present.
2522     // Defer initialization of a new instance until the older instance is properly removed.
2523     auto providerInstance = newProvider + "-" + std::to_string(mProviderInstanceId);
2524     bool providerPresent = false;
2525     for (const auto& providerInfo : mProviders) {
2526         if (providerInfo->mProviderName == newProvider) {
2527             ALOGW("%s: Camera provider HAL with name '%s' already registered",
2528                     __FUNCTION__, newProvider.c_str());
2529             // Do not add new instances for lazy HAL external provider
2530             if (preexisting || providerInfo->isExternalLazyHAL()) {
2531                 return ALREADY_EXISTS;
2532             } else {
2533                 ALOGW("%s: The new provider instance will get initialized immediately after the"
2534                         " currently present instance is removed!", __FUNCTION__);
2535                 providerPresent = true;
2536                 break;
2537             }
2538         }
2539     }
2540 
2541     sp<HidlProviderInfo> providerInfo = new HidlProviderInfo(newProvider, providerInstance, this);
2542     if (!providerPresent) {
2543         status_t res = tryToInitializeHidlProviderLocked(newProvider, providerInfo);
2544         if (res != OK) {
2545             return res;
2546         }
2547     }
2548 
2549     mProviders.push_back(providerInfo);
2550     mProviderInstanceId++;
2551 
2552     return OK;
2553 }
2554 
removeProvider(const std::string & provider)2555 status_t CameraProviderManager::removeProvider(const std::string& provider) {
2556     std::lock_guard<std::mutex> providerLock(mProviderLifecycleLock);
2557     std::unique_lock<std::mutex> lock(mInterfaceMutex);
2558     std::vector<std::string> removedDeviceIds;
2559     status_t res = NAME_NOT_FOUND;
2560     std::string removedProviderName;
2561     for (auto it = mProviders.begin(); it != mProviders.end(); it++) {
2562         if ((*it)->mProviderInstance == provider) {
2563             removedDeviceIds.reserve((*it)->mDevices.size());
2564             for (auto& deviceInfo : (*it)->mDevices) {
2565                 removedDeviceIds.push_back(deviceInfo->mId);
2566             }
2567             removedProviderName = (*it)->mProviderName;
2568             mProviders.erase(it);
2569             res = OK;
2570             break;
2571         }
2572     }
2573     if (res != OK) {
2574         ALOGW("%s: Camera provider HAL with name '%s' is not registered", __FUNCTION__,
2575                 provider.c_str());
2576     } else {
2577         if (flags::enable_hal_abort_from_cameraservicewatchdog()) {
2578             {
2579                 std::lock_guard<std::mutex> pidLock(mProviderPidMapLock);
2580                 mProviderPidMap.erase(provider);
2581             }
2582         }
2583 
2584         // Check if there are any newer camera instances from the same provider and try to
2585         // initialize.
2586         for (const auto& providerInfo : mProviders) {
2587             if (providerInfo->mProviderName == removedProviderName) {
2588                 IPCTransport providerTransport = providerInfo->getIPCTransport();
2589                 switch(providerTransport) {
2590                     case IPCTransport::HIDL:
2591                         return tryToInitializeHidlProviderLocked(removedProviderName, providerInfo);
2592                     case IPCTransport::AIDL:
2593                         return tryToInitializeAidlProviderLocked(removedProviderName,
2594                                 providerInfo);
2595                     default:
2596                         ALOGE("%s Unsupported Transport %d", __FUNCTION__, eToI(providerTransport));
2597                 }
2598             }
2599         }
2600 
2601         // Inform camera service of loss of presence for all the devices from this provider,
2602         // without lock held for reentrancy
2603         sp<StatusListener> listener = getStatusListener();
2604         if (listener != nullptr) {
2605             lock.unlock();
2606             for (auto& id : removedDeviceIds) {
2607                 listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT);
2608             }
2609             lock.lock();
2610         }
2611 
2612     }
2613     return res;
2614 }
2615 
getStatusListener() const2616 sp<CameraProviderManager::StatusListener> CameraProviderManager::getStatusListener() const {
2617     return mListener.promote();
2618 }
2619 /**** Methods for ProviderInfo ****/
2620 
2621 
ProviderInfo(const std::string & providerName,const std::string & providerInstance,CameraProviderManager * manager)2622 CameraProviderManager::ProviderInfo::ProviderInfo(
2623         const std::string &providerName,
2624         const std::string &providerInstance,
2625         [[maybe_unused]] CameraProviderManager *manager) :
2626         mProviderName(providerName),
2627         mProviderInstance(providerInstance),
2628         mProviderTagid(generateVendorTagId(providerName)),
2629         mUniqueDeviceCount(0),
2630         mManager(manager) {
2631 }
2632 
getType() const2633 const std::string& CameraProviderManager::ProviderInfo::getType() const {
2634     return mType;
2635 }
2636 
addDevice(const std::string & name,CameraDeviceStatus initialStatus,std::string * parsedId)2637 status_t CameraProviderManager::ProviderInfo::addDevice(
2638         const std::string& name, CameraDeviceStatus initialStatus,
2639         /*out*/ std::string* parsedId) {
2640 
2641     ALOGI("Enumerating new camera device: %s", name.c_str());
2642 
2643     uint16_t major, minor;
2644     std::string type, id;
2645     IPCTransport transport = getIPCTransport();
2646 
2647     status_t res = parseDeviceName(name, &major, &minor, &type, &id);
2648     if (res != OK) {
2649         return res;
2650     }
2651 
2652     if (type != mType) {
2653         ALOGE("%s: Device type %s does not match provider type %s", __FUNCTION__,
2654                 type.c_str(), mType.c_str());
2655         return BAD_VALUE;
2656     }
2657     if (mManager->isValidDeviceLocked(id, major, transport)) {
2658         ALOGE("%s: Device %s: ID %s is already in use for device major version %d", __FUNCTION__,
2659                 name.c_str(), id.c_str(), major);
2660         return BAD_VALUE;
2661     }
2662 
2663     std::unique_ptr<DeviceInfo> deviceInfo;
2664     switch (transport) {
2665         case IPCTransport::HIDL:
2666             switch (major) {
2667                 case 3:
2668                     break;
2669                 default:
2670                     ALOGE("%s: Device %s: Unsupported HIDL device HAL major version %d:",
2671                           __FUNCTION__,  name.c_str(), major);
2672                     return BAD_VALUE;
2673             }
2674             break;
2675         case IPCTransport::AIDL:
2676             if (major != 1) {
2677                 ALOGE("%s: Device %s: Unsupported AIDL device HAL major version %d:", __FUNCTION__,
2678                         name.c_str(), major);
2679                 return BAD_VALUE;
2680             }
2681             break;
2682         default:
2683             ALOGE("%s Invalid transport %d", __FUNCTION__, eToI(transport));
2684             return BAD_VALUE;
2685     }
2686 
2687     deviceInfo = initializeDeviceInfo(name, mProviderTagid, id, minor);
2688     if (deviceInfo == nullptr) return BAD_VALUE;
2689     deviceInfo->notifyDeviceStateChange(getDeviceState());
2690     deviceInfo->mStatus = initialStatus;
2691     bool isAPI1Compatible = deviceInfo->isAPI1Compatible();
2692 
2693     mDevices.push_back(std::move(deviceInfo));
2694 
2695     mUniqueCameraIds.insert(id);
2696     if (isAPI1Compatible) {
2697         // addDevice can be called more than once for the same camera id if HAL
2698         // supports openLegacy.
2699         if (std::find(mUniqueAPI1CompatibleCameraIds.begin(), mUniqueAPI1CompatibleCameraIds.end(),
2700                 id) == mUniqueAPI1CompatibleCameraIds.end()) {
2701             mUniqueAPI1CompatibleCameraIds.push_back(id);
2702         }
2703     }
2704 
2705     if (parsedId != nullptr) {
2706         *parsedId = id;
2707     }
2708     return OK;
2709 }
2710 
removeDevice(const std::string & id)2711 void CameraProviderManager::ProviderInfo::removeDevice(const std::string &id) {
2712     for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
2713         if ((*it)->mId == id) {
2714             mUniqueCameraIds.erase(id);
2715             mUnavailablePhysicalCameras.erase(id);
2716             if ((*it)->isAPI1Compatible()) {
2717                 mUniqueAPI1CompatibleCameraIds.erase(std::remove(
2718                     mUniqueAPI1CompatibleCameraIds.begin(),
2719                     mUniqueAPI1CompatibleCameraIds.end(), id));
2720             }
2721 
2722             // Remove reference to camera provider to avoid pointer leak when
2723             // unplugging external camera while in use with lazy HALs
2724             mManager->removeRef(DeviceMode::CAMERA, id);
2725             mManager->removeRef(DeviceMode::TORCH, id);
2726 
2727             mDevices.erase(it);
2728             break;
2729         }
2730     }
2731 }
2732 
removeAllDevices()2733 void CameraProviderManager::ProviderInfo::removeAllDevices() {
2734     std::lock_guard<std::mutex> lock(mLock);
2735 
2736     auto itDevices = mDevices.begin();
2737     while (itDevices != mDevices.end()) {
2738         std::string id = (*itDevices)->mId;
2739         std::string deviceName = (*itDevices)->mName;
2740         removeDevice(id);
2741         // device was removed, reset iterator
2742         itDevices = mDevices.begin();
2743 
2744         //notify CameraService of status change
2745         sp<StatusListener> listener = mManager->getStatusListener();
2746         if (listener != nullptr) {
2747             mLock.unlock();
2748             ALOGV("%s: notify device not_present: %s",
2749                   __FUNCTION__,
2750                   deviceName.c_str());
2751             listener->onDeviceStatusChanged(id, CameraDeviceStatus::NOT_PRESENT);
2752             mLock.lock();
2753         }
2754     }
2755 }
2756 
isExternalLazyHAL() const2757 bool CameraProviderManager::ProviderInfo::isExternalLazyHAL() const {
2758     std::string providerName = mProviderName;
2759     if (getIPCTransport() == IPCTransport::AIDL) {
2760         using aidl::android::hardware::camera::provider::ICameraProvider;
2761         providerName =
2762                 mProviderName.substr(std::string(ICameraProvider::descriptor).size() + 1);
2763     }
2764     return kEnableLazyHal && (providerName == kExternalProviderName);
2765 }
2766 
getProviderPids()2767 std::set<pid_t> CameraProviderManager::getProviderPids() {
2768     std::set<pid_t> pids;
2769 
2770     if (flags::enable_hal_abort_from_cameraservicewatchdog()) {
2771         std::lock_guard<std::mutex> lock(mProviderPidMapLock);
2772 
2773         std::transform(mProviderPidMap.begin(), mProviderPidMap.end(),
2774                     std::inserter(pids, pids.begin()),
2775                     [](std::pair<const std::string, pid_t>& entry) { return entry.second; });
2776     }
2777 
2778     return pids;
2779 }
2780 
dump(int fd,const Vector<String16> &) const2781 status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
2782     dprintf(fd, "== Camera Provider HAL %s (v2.%d, %s) static info: %zu devices: ==\n",
2783             mProviderInstance.c_str(),
2784             mMinorVersion,
2785             mIsRemote ? "remote" : "passthrough",
2786             mDevices.size());
2787 
2788     for (auto& device : mDevices) {
2789         dprintf(fd, "== Camera HAL device %s (v%d.%d) static information: ==\n", device->mName.c_str(),
2790                 device->mVersion.get_major(), device->mVersion.get_minor());
2791         dprintf(fd, "  Resource cost: %d\n", device->mResourceCost.resourceCost);
2792         if (device->mResourceCost.conflictingDevices.size() == 0) {
2793             dprintf(fd, "  Conflicting devices: None\n");
2794         } else {
2795             dprintf(fd, "  Conflicting devices:\n");
2796             for (size_t i = 0; i < device->mResourceCost.conflictingDevices.size(); i++) {
2797                 dprintf(fd, "    %s\n",
2798                         device->mResourceCost.conflictingDevices[i].c_str());
2799             }
2800         }
2801         dprintf(fd, "  API1 info:\n");
2802         dprintf(fd, "    Has a flash unit: %s\n",
2803                 device->hasFlashUnit() ? "true" : "false");
2804         hardware::CameraInfo info;
2805         int portraitRotation;
2806         status_t res = device->getCameraInfo(
2807                 /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
2808                 &portraitRotation, &info);
2809         if (res != OK) {
2810             dprintf(fd, "   <Error reading camera info: %s (%d)>\n",
2811                     strerror(-res), res);
2812         } else {
2813             dprintf(fd, "    Facing: %s\n",
2814                     info.facing == hardware::CAMERA_FACING_BACK ? "Back" : "Front");
2815             dprintf(fd, "    Orientation: %d\n", info.orientation);
2816         }
2817         CameraMetadata info2;
2818         res = device->getCameraCharacteristics(true /*overrideForPerfClass*/, &info2,
2819                 hardware::ICameraService::ROTATION_OVERRIDE_NONE);
2820         if (res == INVALID_OPERATION) {
2821             dprintf(fd, "  API2 not directly supported\n");
2822         } else if (res != OK) {
2823             dprintf(fd, "  <Error reading camera characteristics: %s (%d)>\n",
2824                     strerror(-res), res);
2825         } else {
2826             dprintf(fd, "  API2 camera characteristics:\n");
2827             info2.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
2828         }
2829 
2830         // Dump characteristics of non-standalone physical camera
2831         if (device->mIsLogicalCamera) {
2832             for (auto& id : device->mPhysicalIds) {
2833                 // Skip if physical id is an independent camera
2834                 if (std::find(mProviderPublicCameraIds.begin(), mProviderPublicCameraIds.end(), id)
2835                         != mProviderPublicCameraIds.end()) {
2836                     continue;
2837                 }
2838 
2839                 CameraMetadata physicalInfo;
2840                 status_t status = device->getPhysicalCameraCharacteristics(id, &physicalInfo);
2841                 if (status == OK) {
2842                     dprintf(fd, "  Physical camera %s characteristics:\n", id.c_str());
2843                     physicalInfo.dump(fd, /*verbosity*/ 2, /*indentation*/ 4);
2844                 }
2845             }
2846         }
2847 
2848         dprintf(fd, "== Camera HAL device %s (v%d.%d) dumpState: ==\n", device->mName.c_str(),
2849                 device->mVersion.get_major(), device->mVersion.get_minor());
2850         res = device->dumpState(fd);
2851         if (res != OK) {
2852             dprintf(fd, "   <Error dumping device %s state: %s (%d)>\n",
2853                     device->mName.c_str(), strerror(-res), res);
2854         }
2855     }
2856     return OK;
2857 }
2858 
2859 std::vector<std::unordered_set<std::string>>
getConcurrentCameraIdCombinations()2860 CameraProviderManager::ProviderInfo::getConcurrentCameraIdCombinations() {
2861     std::lock_guard<std::mutex> lock(mLock);
2862     return mConcurrentCameraIdCombinations;
2863 }
2864 
cameraDeviceStatusChangeInternal(const std::string & cameraDeviceName,CameraDeviceStatus newStatus)2865 void CameraProviderManager::ProviderInfo::cameraDeviceStatusChangeInternal(
2866         const std::string& cameraDeviceName, CameraDeviceStatus newStatus) {
2867     sp<StatusListener> listener;
2868     std::string id;
2869     std::lock_guard<std::mutex> lock(mInitLock);
2870     CameraDeviceStatus internalNewStatus = newStatus;
2871     if (!mInitialized) {
2872         mCachedStatus.emplace_back(false /*isPhysicalCameraStatus*/,
2873                 cameraDeviceName, std::string(), internalNewStatus);
2874         return;
2875     }
2876 
2877     {
2878         std::lock_guard<std::mutex> lock(mLock);
2879         if (OK != cameraDeviceStatusChangeLocked(&id, cameraDeviceName, newStatus)) {
2880             return;
2881         }
2882         listener = mManager->getStatusListener();
2883     }
2884 
2885     // Call without lock held to allow reentrancy into provider manager
2886     if (listener != nullptr) {
2887         listener->onDeviceStatusChanged(id, internalNewStatus);
2888     }
2889 }
2890 
cameraDeviceStatusChangeLocked(std::string * id,const std::string & cameraDeviceName,CameraDeviceStatus newStatus)2891 status_t CameraProviderManager::ProviderInfo::cameraDeviceStatusChangeLocked(
2892         std::string* id, const std::string& cameraDeviceName,
2893         CameraDeviceStatus newStatus) {
2894     bool known = false;
2895     std::string cameraId;
2896     for (auto& deviceInfo : mDevices) {
2897         if (deviceInfo->mName == cameraDeviceName) {
2898             Mutex::Autolock l(deviceInfo->mDeviceAvailableLock);
2899             ALOGI("Camera device %s status is now %s, was %s", cameraDeviceName.c_str(),
2900                     FrameworkDeviceStatusToString(newStatus),
2901                     FrameworkDeviceStatusToString(deviceInfo->mStatus));
2902             deviceInfo->mStatus = newStatus;
2903             // TODO: Handle device removal (NOT_PRESENT)
2904             cameraId = deviceInfo->mId;
2905             known = true;
2906             deviceInfo->mIsDeviceAvailable =
2907                 (newStatus == CameraDeviceStatus::PRESENT);
2908             deviceInfo->mDeviceAvailableSignal.signal();
2909             break;
2910         }
2911     }
2912     // Previously unseen device; status must not be NOT_PRESENT
2913     if (!known) {
2914         if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
2915             ALOGW("Camera provider %s says an unknown camera device %s is not present. Curious.",
2916                 mProviderName.c_str(), cameraDeviceName.c_str());
2917             return BAD_VALUE;
2918         }
2919         addDevice(cameraDeviceName, newStatus, &cameraId);
2920     } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
2921         removeDevice(cameraId);
2922     } else if (isExternalLazyHAL()) {
2923         // Do not notify CameraService for PRESENT->PRESENT (lazy HAL restart)
2924         // because NOT_AVAILABLE is set on CameraService::connect and a PRESENT
2925         // notif. would overwrite it
2926         return BAD_VALUE;
2927     }
2928 
2929     if (reCacheConcurrentStreamingCameraIdsLocked() != OK) {
2930         ALOGE("%s: CameraProvider %s could not re-cache concurrent streaming camera id list ",
2931                   __FUNCTION__, mProviderName.c_str());
2932     }
2933     *id = cameraId;
2934     return OK;
2935 }
2936 
physicalCameraDeviceStatusChangeInternal(const std::string & cameraDeviceName,const std::string & physicalCameraDeviceName,CameraDeviceStatus newStatus)2937 void CameraProviderManager::ProviderInfo::physicalCameraDeviceStatusChangeInternal(
2938         const std::string& cameraDeviceName,
2939         const std::string& physicalCameraDeviceName,
2940         CameraDeviceStatus newStatus) {
2941     sp<StatusListener> listener;
2942     std::string id;
2943     std::string physicalId;
2944     std::lock_guard<std::mutex> lock(mInitLock);
2945     if (!mInitialized) {
2946         mCachedStatus.emplace_back(true /*isPhysicalCameraStatus*/, cameraDeviceName,
2947                 physicalCameraDeviceName, newStatus);
2948         return;
2949     }
2950 
2951     {
2952         std::lock_guard<std::mutex> lock(mLock);
2953 
2954         if (OK != physicalCameraDeviceStatusChangeLocked(&id, &physicalId, cameraDeviceName,
2955                 physicalCameraDeviceName, newStatus)) {
2956             return;
2957         }
2958 
2959         listener = mManager->getStatusListener();
2960     }
2961     // Call without lock held to allow reentrancy into provider manager
2962     if (listener != nullptr) {
2963         listener->onDeviceStatusChanged(id, physicalId, newStatus);
2964     }
2965     return;
2966 }
2967 
physicalCameraDeviceStatusChangeLocked(std::string * id,std::string * physicalId,const std::string & cameraDeviceName,const std::string & physicalCameraDeviceName,CameraDeviceStatus newStatus)2968 status_t CameraProviderManager::ProviderInfo::physicalCameraDeviceStatusChangeLocked(
2969             std::string* id, std::string* physicalId,
2970             const std::string& cameraDeviceName,
2971             const std::string& physicalCameraDeviceName,
2972             CameraDeviceStatus newStatus) {
2973     bool known = false;
2974     std::string cameraId;
2975     for (auto& deviceInfo : mDevices) {
2976         if (deviceInfo->mName == cameraDeviceName) {
2977             cameraId = deviceInfo->mId;
2978             if (!deviceInfo->mIsLogicalCamera) {
2979                 ALOGE("%s: Invalid combination of camera id %s, physical id %s",
2980                         __FUNCTION__, cameraId.c_str(), physicalCameraDeviceName.c_str());
2981                 return BAD_VALUE;
2982             }
2983             if (std::find(deviceInfo->mPhysicalIds.begin(), deviceInfo->mPhysicalIds.end(),
2984                     physicalCameraDeviceName) == deviceInfo->mPhysicalIds.end()) {
2985                 ALOGE("%s: Invalid combination of camera id %s, physical id %s",
2986                         __FUNCTION__, cameraId.c_str(), physicalCameraDeviceName.c_str());
2987                 return BAD_VALUE;
2988             }
2989             ALOGI("Camera device %s physical device %s status is now %s",
2990                     cameraDeviceName.c_str(), physicalCameraDeviceName.c_str(),
2991                     FrameworkDeviceStatusToString(newStatus));
2992             known = true;
2993             break;
2994         }
2995     }
2996     // Previously unseen device; status must not be NOT_PRESENT
2997     if (!known) {
2998         ALOGW("Camera provider %s says an unknown camera device %s-%s is not present. Curious.",
2999                 mProviderName.c_str(), cameraDeviceName.c_str(),
3000                 physicalCameraDeviceName.c_str());
3001         return BAD_VALUE;
3002     }
3003 
3004     if (mUnavailablePhysicalCameras.count(cameraId) == 0) {
3005         mUnavailablePhysicalCameras.emplace(cameraId, std::set<std::string>{});
3006     }
3007     if (newStatus != CameraDeviceStatus::PRESENT) {
3008         mUnavailablePhysicalCameras[cameraId].insert(physicalCameraDeviceName);
3009     } else {
3010         mUnavailablePhysicalCameras[cameraId].erase(physicalCameraDeviceName);
3011     }
3012 
3013     *id = cameraId;
3014     *physicalId = physicalCameraDeviceName;
3015     return OK;
3016 }
3017 
torchModeStatusChangeInternal(const std::string & cameraDeviceName,TorchModeStatus newStatus)3018 void CameraProviderManager::ProviderInfo::torchModeStatusChangeInternal(
3019         const std::string& cameraDeviceName,
3020         TorchModeStatus newStatus) {
3021     sp<StatusListener> listener;
3022     SystemCameraKind systemCameraKind = SystemCameraKind::PUBLIC;
3023     std::string id;
3024     bool known = false;
3025     {
3026         // Hold mLock for accessing mDevices
3027         std::lock_guard<std::mutex> lock(mLock);
3028         for (auto& deviceInfo : mDevices) {
3029             if (deviceInfo->mName == cameraDeviceName) {
3030                 ALOGI("Camera device %s torch status is now %s", cameraDeviceName.c_str(),
3031                         FrameworkTorchStatusToString(newStatus));
3032                 id = deviceInfo->mId;
3033                 known = true;
3034                 systemCameraKind = deviceInfo->mSystemCameraKind;
3035                 if (TorchModeStatus::AVAILABLE_ON != newStatus) {
3036                     mManager->removeRef(CameraProviderManager::DeviceMode::TORCH, id);
3037                 }
3038                 break;
3039             }
3040         }
3041         if (!known) {
3042             ALOGW("Camera provider %s says an unknown camera %s now has torch status %d. Curious.",
3043                 mProviderName.c_str(), cameraDeviceName.c_str(), eToI(newStatus));
3044             return;
3045         }
3046         // no lock needed since listener is set up only once during
3047         // CameraProviderManager initialization and then never changed till it is
3048         // destructed.
3049         listener = mManager->getStatusListener();
3050      }
3051     // Call without lock held to allow reentrancy into provider manager
3052     // The problem with holding mLock here is that we
3053     // might be limiting re-entrancy : CameraService::onTorchStatusChanged calls
3054     // back into CameraProviderManager which might try to hold mLock again (eg:
3055     // findDeviceInfo, which should be holding mLock while iterating through
3056     // each provider's devices).
3057     if (listener != nullptr) {
3058         listener->onTorchStatusChanged(id, newStatus, systemCameraKind);
3059     }
3060     return;
3061 }
3062 
notifyDeviceInfoStateChangeLocked(int64_t newDeviceState)3063 void CameraProviderManager::ProviderInfo::notifyDeviceInfoStateChangeLocked(
3064         int64_t newDeviceState) {
3065     std::lock_guard<std::mutex> lock(mLock);
3066     for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
3067         (*it)->notifyDeviceStateChange(newDeviceState);
3068     }
3069 }
3070 
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)3071 CameraProviderManager::ProviderInfo::DeviceInfo3::DeviceInfo3(const std::string& name,
3072         const metadata_vendor_id_t tagId, const std::string &id,
3073         uint16_t minorVersion,
3074         const CameraResourceCost& resourceCost,
3075         sp<ProviderInfo> parentProvider,
3076         const std::vector<std::string>& publicCameraIds) :
3077         DeviceInfo(name, tagId, id,
3078                    hardware::hidl_version{
3079                         static_cast<uint16_t >(
3080                                 parentProvider->getIPCTransport() == IPCTransport::HIDL ? 3 : 1),
3081                                 minorVersion},
3082                    publicCameraIds, resourceCost, parentProvider) { }
3083 
notifyDeviceStateChange(int64_t newState)3084 void CameraProviderManager::ProviderInfo::DeviceInfo3::notifyDeviceStateChange(int64_t newState) {
3085     if (!mDeviceStateOrientationMap.empty() &&
3086             (mDeviceStateOrientationMap.find(newState) != mDeviceStateOrientationMap.end())) {
3087         mCameraCharacteristics.update(ANDROID_SENSOR_ORIENTATION,
3088                 &mDeviceStateOrientationMap[newState], 1);
3089         if (mCameraCharNoPCOverride.get() != nullptr) {
3090             mCameraCharNoPCOverride->update(ANDROID_SENSOR_ORIENTATION,
3091                 &mDeviceStateOrientationMap[newState], 1);
3092         }
3093     }
3094 }
3095 
getCameraInfo(int rotationOverride,int * portraitRotation,hardware::CameraInfo * info) const3096 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraInfo(
3097         int rotationOverride, int *portraitRotation,
3098         hardware::CameraInfo *info) const {
3099     if (info == nullptr) return BAD_VALUE;
3100 
3101     bool freeform_compat_enabled = wm_flags::enable_camera_compat_for_desktop_windowing();
3102     if (!freeform_compat_enabled &&
3103             rotationOverride > hardware::ICameraService::ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT) {
3104         ALOGW("Camera compat freeform flag disabled but rotation override is %d", rotationOverride);
3105     }
3106     camera_metadata_ro_entry facing =
3107             mCameraCharacteristics.find(ANDROID_LENS_FACING);
3108     if (facing.count == 1) {
3109         switch (facing.data.u8[0]) {
3110             case ANDROID_LENS_FACING_BACK:
3111                 info->facing = hardware::CAMERA_FACING_BACK;
3112                 break;
3113             case ANDROID_LENS_FACING_EXTERNAL:
3114                 // Map external to front for legacy API
3115             case ANDROID_LENS_FACING_FRONT:
3116                 info->facing = hardware::CAMERA_FACING_FRONT;
3117                 break;
3118         }
3119     } else {
3120         ALOGE("%s: Unable to find android.lens.facing static metadata", __FUNCTION__);
3121         return NAME_NOT_FOUND;
3122     }
3123 
3124     camera_metadata_ro_entry orientation =
3125             mCameraCharacteristics.find(ANDROID_SENSOR_ORIENTATION);
3126     if (orientation.count == 1) {
3127         info->orientation = orientation.data.i32[0];
3128     } else {
3129         ALOGE("%s: Unable to find android.sensor.orientation static metadata", __FUNCTION__);
3130         return NAME_NOT_FOUND;
3131     }
3132 
3133     if (rotationOverride == hardware::ICameraService::ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT
3134             && (info->orientation == 0 || info->orientation == 180)) {
3135         *portraitRotation = 90;
3136         if (info->facing == hardware::CAMERA_FACING_FRONT) {
3137             info->orientation = (360 + info->orientation - 90) % 360;
3138         } else {
3139             info->orientation = (360 + info->orientation + 90) % 360;
3140         }
3141     } else if (freeform_compat_enabled &&
3142             rotationOverride == hardware::ICameraService::ROTATION_OVERRIDE_ROTATION_ONLY
3143             && (info->orientation == 90 || info->orientation == 270)) {
3144         *portraitRotation = info->facing == hardware::CAMERA_FACING_BACK ? 90 : 270;
3145     } else {
3146         *portraitRotation = 0;
3147     }
3148 
3149     return OK;
3150 }
isAPI1Compatible() const3151 bool CameraProviderManager::ProviderInfo::DeviceInfo3::isAPI1Compatible() const {
3152     // Do not advertise NIR cameras to API1 camera app.
3153     camera_metadata_ro_entry cfa = mCameraCharacteristics.find(
3154             ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT);
3155     if (cfa.count == 1 && cfa.data.u8[0] == ANDROID_SENSOR_INFO_COLOR_FILTER_ARRANGEMENT_NIR) {
3156         return false;
3157     }
3158 
3159     bool isBackwardCompatible = false;
3160     camera_metadata_ro_entry_t caps = mCameraCharacteristics.find(
3161             ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
3162     for (size_t i = 0; i < caps.count; i++) {
3163         if (caps.data.u8[i] ==
3164                 ANDROID_REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE) {
3165             isBackwardCompatible = true;
3166             break;
3167         }
3168     }
3169 
3170     return isBackwardCompatible;
3171 }
3172 
getCameraCharacteristics(bool overrideForPerfClass,CameraMetadata * characteristics,int rotationOverride)3173 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getCameraCharacteristics(
3174         bool overrideForPerfClass, CameraMetadata *characteristics,
3175         int rotationOverride) {
3176     if (characteristics == nullptr) return BAD_VALUE;
3177 
3178     if (!overrideForPerfClass && mCameraCharNoPCOverride != nullptr) {
3179         *characteristics = *mCameraCharNoPCOverride;
3180     } else {
3181         *characteristics = mCameraCharacteristics;
3182     }
3183 
3184     if (rotationOverride == hardware::ICameraService::ROTATION_OVERRIDE_OVERRIDE_TO_PORTRAIT) {
3185         const auto &lensFacingEntry = characteristics->find(ANDROID_LENS_FACING);
3186         const auto &sensorOrientationEntry = characteristics->find(ANDROID_SENSOR_ORIENTATION);
3187         uint8_t lensFacing = lensFacingEntry.data.u8[0];
3188         if (lensFacingEntry.count > 0 && sensorOrientationEntry.count > 0) {
3189             int32_t sensorOrientation = sensorOrientationEntry.data.i32[0];
3190             int32_t newSensorOrientation = sensorOrientation;
3191 
3192             if (sensorOrientation == 0 || sensorOrientation == 180) {
3193                 if (lensFacing == ANDROID_LENS_FACING_FRONT) {
3194                     newSensorOrientation = (360 + sensorOrientation - 90) % 360;
3195                 } else if (lensFacing == ANDROID_LENS_FACING_BACK) {
3196                     newSensorOrientation = (360 + sensorOrientation + 90) % 360;
3197                 }
3198             }
3199 
3200             if (newSensorOrientation != sensorOrientation) {
3201                 ALOGV("%s: Update ANDROID_SENSOR_ORIENTATION for lens facing %d "
3202                         "from %d to %d", __FUNCTION__, lensFacing, sensorOrientation,
3203                         newSensorOrientation);
3204                 characteristics->update(ANDROID_SENSOR_ORIENTATION, &newSensorOrientation, 1);
3205             }
3206         }
3207 
3208         if (characteristics->exists(ANDROID_INFO_DEVICE_STATE_ORIENTATIONS)) {
3209             ALOGV("%s: Erasing ANDROID_INFO_DEVICE_STATE_ORIENTATIONS for lens facing %d",
3210                     __FUNCTION__, lensFacing);
3211             characteristics->erase(ANDROID_INFO_DEVICE_STATE_ORIENTATIONS);
3212         }
3213     }
3214 
3215     return OK;
3216 }
3217 
getPhysicalCameraCharacteristics(const std::string & physicalCameraId,CameraMetadata * characteristics) const3218 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::getPhysicalCameraCharacteristics(
3219         const std::string& physicalCameraId, CameraMetadata *characteristics) const {
3220     if (characteristics == nullptr) return BAD_VALUE;
3221     if (mPhysicalCameraCharacteristics.find(physicalCameraId) ==
3222             mPhysicalCameraCharacteristics.end()) {
3223         return NAME_NOT_FOUND;
3224     }
3225 
3226     *characteristics = mPhysicalCameraCharacteristics.at(physicalCameraId);
3227     return OK;
3228 }
3229 
filterSmallJpegSizes()3230 status_t CameraProviderManager::ProviderInfo::DeviceInfo3::filterSmallJpegSizes() {
3231     int32_t thresholdW = SessionConfigurationUtils::PERF_CLASS_JPEG_THRESH_W;
3232     int32_t thresholdH = SessionConfigurationUtils::PERF_CLASS_JPEG_THRESH_H;
3233 
3234     if (mCameraCharNoPCOverride != nullptr) return OK;
3235 
3236     mCameraCharNoPCOverride = std::make_unique<CameraMetadata>(mCameraCharacteristics);
3237 
3238     // Remove small JPEG sizes from available stream configurations
3239     size_t largeJpegCount = 0;
3240     std::vector<int32_t> newStreamConfigs;
3241     camera_metadata_entry streamConfigs =
3242             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
3243     for (size_t i = 0; i < streamConfigs.count; i += 4) {
3244         if ((streamConfigs.data.i32[i] == HAL_PIXEL_FORMAT_BLOB) && (streamConfigs.data.i32[i+3] ==
3245                 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT)) {
3246             if (streamConfigs.data.i32[i+1] * streamConfigs.data.i32[i+2] <
3247                     thresholdW * thresholdH) {
3248                 continue;
3249             } else {
3250                 largeJpegCount ++;
3251             }
3252         }
3253         newStreamConfigs.insert(newStreamConfigs.end(), streamConfigs.data.i32 + i,
3254                 streamConfigs.data.i32 + i + 4);
3255     }
3256     if (newStreamConfigs.size() == 0 || largeJpegCount == 0) {
3257         return BAD_VALUE;
3258     }
3259 
3260     // Remove small JPEG sizes from available min frame durations
3261     largeJpegCount = 0;
3262     std::vector<int64_t> newMinDurations;
3263     camera_metadata_entry minDurations =
3264             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
3265     for (size_t i = 0; i < minDurations.count; i += 4) {
3266         if (minDurations.data.i64[i] == HAL_PIXEL_FORMAT_BLOB) {
3267             if ((int32_t)minDurations.data.i64[i+1] * (int32_t)minDurations.data.i64[i+2] <
3268                     thresholdW * thresholdH) {
3269                 continue;
3270             } else {
3271                 largeJpegCount++;
3272             }
3273         }
3274         newMinDurations.insert(newMinDurations.end(), minDurations.data.i64 + i,
3275                 minDurations.data.i64 + i + 4);
3276     }
3277     if (newMinDurations.size() == 0 || largeJpegCount == 0) {
3278         return BAD_VALUE;
3279     }
3280 
3281     // Remove small JPEG sizes from available stall durations
3282     largeJpegCount = 0;
3283     std::vector<int64_t> newStallDurations;
3284     camera_metadata_entry stallDurations =
3285             mCameraCharacteristics.find(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS);
3286     for (size_t i = 0; i < stallDurations.count; i += 4) {
3287         if (stallDurations.data.i64[i] == HAL_PIXEL_FORMAT_BLOB) {
3288             if ((int32_t)stallDurations.data.i64[i+1] * (int32_t)stallDurations.data.i64[i+2] <
3289                     thresholdW * thresholdH) {
3290                 continue;
3291             } else {
3292                 largeJpegCount++;
3293             }
3294         }
3295         newStallDurations.insert(newStallDurations.end(), stallDurations.data.i64 + i,
3296                 stallDurations.data.i64 + i + 4);
3297     }
3298     if (newStallDurations.size() == 0 || largeJpegCount == 0) {
3299         return BAD_VALUE;
3300     }
3301 
3302     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
3303             newStreamConfigs.data(), newStreamConfigs.size());
3304     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS,
3305             newMinDurations.data(), newMinDurations.size());
3306     mCameraCharacteristics.update(ANDROID_SCALER_AVAILABLE_STALL_DURATIONS,
3307             newStallDurations.data(), newStallDurations.size());
3308 
3309     // Re-generate metadata tags that have dependencies on BLOB sizes
3310     auto res = addDynamicDepthTags();
3311     if (OK != res) {
3312         ALOGE("%s: Failed to append dynamic depth tags: %s (%d)", __FUNCTION__,
3313                 strerror(-res), res);
3314         // Allow filtering of small JPEG sizes to succeed even if dynamic depth
3315         // tags fail to generate.
3316     }
3317 
3318     return OK;
3319 }
3320 
parseProviderName(const std::string & name,std::string * type,uint32_t * id)3321 status_t CameraProviderManager::ProviderInfo::parseProviderName(const std::string& name,
3322         std::string *type, uint32_t *id) {
3323     // Format must be "<type>/<id>"
3324 #define ERROR_MSG_PREFIX "%s: Invalid provider name '%s'. "       \
3325     "Should match '<type>/<id>' - "
3326 
3327     if (!type || !id) return INVALID_OPERATION;
3328 
3329     std::string::size_type slashIdx = name.find('/');
3330     if (slashIdx == std::string::npos || slashIdx == name.size() - 1) {
3331         ALOGE(ERROR_MSG_PREFIX
3332                 "does not have / separator between type and id",
3333                 __FUNCTION__, name.c_str());
3334         return BAD_VALUE;
3335     }
3336 
3337     std::string typeVal = name.substr(0, slashIdx);
3338 
3339     char *endPtr;
3340     errno = 0;
3341     long idVal = strtol(name.c_str() + slashIdx + 1, &endPtr, 10);
3342     if (errno != 0) {
3343         ALOGE(ERROR_MSG_PREFIX
3344                 "cannot parse provider id as an integer: %s (%d)",
3345                 __FUNCTION__, name.c_str(), strerror(errno), errno);
3346         return BAD_VALUE;
3347     }
3348     if (endPtr != name.c_str() + name.size()) {
3349         ALOGE(ERROR_MSG_PREFIX
3350                 "provider id has unexpected length",
3351                 __FUNCTION__, name.c_str());
3352         return BAD_VALUE;
3353     }
3354     if (idVal < 0) {
3355         ALOGE(ERROR_MSG_PREFIX
3356                 "id is negative: %ld",
3357                 __FUNCTION__, name.c_str(), idVal);
3358         return BAD_VALUE;
3359     }
3360 
3361 #undef ERROR_MSG_PREFIX
3362 
3363     *type = typeVal;
3364     *id = static_cast<uint32_t>(idVal);
3365 
3366     return OK;
3367 }
3368 
generateVendorTagId(const std::string & name)3369 metadata_vendor_id_t CameraProviderManager::ProviderInfo::generateVendorTagId(
3370         const std::string &name) {
3371     metadata_vendor_id_t ret = std::hash<std::string> {} (name);
3372     // CAMERA_METADATA_INVALID_VENDOR_ID is not a valid hash value
3373     if (CAMERA_METADATA_INVALID_VENDOR_ID == ret) {
3374         ret = 0;
3375     }
3376 
3377     return ret;
3378 }
3379 
parseDeviceName(const std::string & name,uint16_t * major,uint16_t * minor,std::string * type,std::string * id)3380 status_t CameraProviderManager::ProviderInfo::parseDeviceName(const std::string& name,
3381         uint16_t *major, uint16_t *minor, std::string *type, std::string *id) {
3382 
3383     // Format must be "device@<major>.<minor>/<type>/<id>"
3384 
3385 #define ERROR_MSG_PREFIX "%s: Invalid device name '%s'. " \
3386     "Should match 'device@<major>.<minor>/<type>/<id>' - "
3387 
3388     if (!major || !minor || !type || !id) return INVALID_OPERATION;
3389 
3390     // Verify starting prefix
3391     const char expectedPrefix[] = "device@";
3392 
3393     if (name.find(expectedPrefix) != 0) {
3394         ALOGE(ERROR_MSG_PREFIX
3395                 "does not start with '%s'",
3396                 __FUNCTION__, name.c_str(), expectedPrefix);
3397         return BAD_VALUE;
3398     }
3399 
3400     // Extract major/minor versions
3401     constexpr std::string::size_type atIdx = sizeof(expectedPrefix) - 2;
3402     std::string::size_type dotIdx = name.find('.', atIdx);
3403     if (dotIdx == std::string::npos) {
3404         ALOGE(ERROR_MSG_PREFIX
3405                 "does not have @<major>. version section",
3406                 __FUNCTION__, name.c_str());
3407         return BAD_VALUE;
3408     }
3409     std::string::size_type typeSlashIdx = name.find('/', dotIdx);
3410     if (typeSlashIdx == std::string::npos) {
3411         ALOGE(ERROR_MSG_PREFIX
3412                 "does not have .<minor>/ version section",
3413                 __FUNCTION__, name.c_str());
3414         return BAD_VALUE;
3415     }
3416 
3417     char *endPtr;
3418     errno = 0;
3419     long majorVal = strtol(name.c_str() + atIdx + 1, &endPtr, 10);
3420     if (errno != 0) {
3421         ALOGE(ERROR_MSG_PREFIX
3422                 "cannot parse major version: %s (%d)",
3423                 __FUNCTION__, name.c_str(), strerror(errno), errno);
3424         return BAD_VALUE;
3425     }
3426     if (endPtr != name.c_str() + dotIdx) {
3427         ALOGE(ERROR_MSG_PREFIX
3428                 "major version has unexpected length",
3429                 __FUNCTION__, name.c_str());
3430         return BAD_VALUE;
3431     }
3432     long minorVal = strtol(name.c_str() + dotIdx + 1, &endPtr, 10);
3433     if (errno != 0) {
3434         ALOGE(ERROR_MSG_PREFIX
3435                 "cannot parse minor version: %s (%d)",
3436                 __FUNCTION__, name.c_str(), strerror(errno), errno);
3437         return BAD_VALUE;
3438     }
3439     if (endPtr != name.c_str() + typeSlashIdx) {
3440         ALOGE(ERROR_MSG_PREFIX
3441                 "minor version has unexpected length",
3442                 __FUNCTION__, name.c_str());
3443         return BAD_VALUE;
3444     }
3445     if (majorVal < 0 || majorVal > UINT16_MAX || minorVal < 0 || minorVal > UINT16_MAX) {
3446         ALOGE(ERROR_MSG_PREFIX
3447                 "major/minor version is out of range of uint16_t: %ld.%ld",
3448                 __FUNCTION__, name.c_str(), majorVal, minorVal);
3449         return BAD_VALUE;
3450     }
3451 
3452     // Extract type and id
3453 
3454     std::string::size_type instanceSlashIdx = name.find('/', typeSlashIdx + 1);
3455     if (instanceSlashIdx == std::string::npos) {
3456         ALOGE(ERROR_MSG_PREFIX
3457                 "does not have /<type>/ component",
3458                 __FUNCTION__, name.c_str());
3459         return BAD_VALUE;
3460     }
3461     std::string typeVal = name.substr(typeSlashIdx + 1, instanceSlashIdx - typeSlashIdx - 1);
3462 
3463     if (instanceSlashIdx == name.size() - 1) {
3464         ALOGE(ERROR_MSG_PREFIX
3465                 "does not have an /<id> component",
3466                 __FUNCTION__, name.c_str());
3467         return BAD_VALUE;
3468     }
3469     std::string idVal = name.substr(instanceSlashIdx + 1);
3470 
3471 #undef ERROR_MSG_PREFIX
3472 
3473     *major = static_cast<uint16_t>(majorVal);
3474     *minor = static_cast<uint16_t>(minorVal);
3475     *type = typeVal;
3476     *id = idVal;
3477 
3478     return OK;
3479 }
3480 
~ProviderInfo()3481 CameraProviderManager::ProviderInfo::~ProviderInfo() {
3482     // Destruction of ProviderInfo is only supposed to happen when the respective
3483     // CameraProvider interface dies, so do not unregister callbacks.
3484 }
3485 
3486 // Expects to have mInterfaceMutex locked
3487 std::vector<std::unordered_set<std::string>>
getConcurrentCameraIds() const3488 CameraProviderManager::getConcurrentCameraIds() const {
3489     std::vector<std::unordered_set<std::string>> deviceIdCombinations;
3490     std::lock_guard<std::mutex> lock(mInterfaceMutex);
3491     for (auto &provider : mProviders) {
3492         for (auto &combinations : provider->getConcurrentCameraIdCombinations()) {
3493             deviceIdCombinations.push_back(combinations);
3494         }
3495     }
3496     return deviceIdCombinations;
3497 }
3498 
3499 // Checks if the containing vector of sets has any set that contains all of the
3500 // camera ids in cameraIdsAndSessionConfigs.
checkIfSetContainsAll(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::vector<std::unordered_set<std::string>> & containingSets)3501 static bool checkIfSetContainsAll(
3502         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
3503         const std::vector<std::unordered_set<std::string>> &containingSets) {
3504     for (auto &containingSet : containingSets) {
3505         bool didHaveAll = true;
3506         for (auto &cameraIdAndSessionConfig : cameraIdsAndSessionConfigs) {
3507             if (containingSet.find(cameraIdAndSessionConfig.mCameraId) == containingSet.end()) {
3508                 // a camera id doesn't belong to this set, keep looking in other
3509                 // sets
3510                 didHaveAll = false;
3511                 break;
3512             }
3513         }
3514         if (didHaveAll) {
3515             // found a set that has all camera ids, lets return;
3516             return true;
3517         }
3518     }
3519     return false;
3520 }
3521 
isConcurrentSessionConfigurationSupported(const std::vector<CameraIdAndSessionConfiguration> & cameraIdsAndSessionConfigs,const std::set<std::string> & perfClassPrimaryCameraIds,int targetSdkVersion,bool * isSupported)3522 status_t CameraProviderManager::isConcurrentSessionConfigurationSupported(
3523         const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs,
3524         const std::set<std::string>& perfClassPrimaryCameraIds,
3525         int targetSdkVersion, bool *isSupported) {
3526     std::lock_guard<std::mutex> lock(mInterfaceMutex);
3527     // Check if all the devices are a subset of devices advertised by the
3528     // same provider through getConcurrentStreamingCameraIds()
3529     // TODO: we should also do a findDeviceInfoLocked here ?
3530     for (auto &provider : mProviders) {
3531         if (checkIfSetContainsAll(cameraIdsAndSessionConfigs,
3532                 provider->getConcurrentCameraIdCombinations())) {
3533             return provider->isConcurrentSessionConfigurationSupported(
3534                     cameraIdsAndSessionConfigs, perfClassPrimaryCameraIds, targetSdkVersion,
3535                     isSupported);
3536         }
3537     }
3538     *isSupported = false;
3539     //The set of camera devices were not found
3540     return INVALID_OPERATION;
3541 }
3542 
getCameraCharacteristicsLocked(const std::string & id,bool overrideForPerfClass,CameraMetadata * characteristics,int rotationOverride) const3543 status_t CameraProviderManager::getCameraCharacteristicsLocked(const std::string &id,
3544         bool overrideForPerfClass, CameraMetadata* characteristics,
3545         int rotationOverride) const {
3546     auto deviceInfo = findDeviceInfoLocked(id);
3547     if (deviceInfo != nullptr) {
3548         return deviceInfo->getCameraCharacteristics(overrideForPerfClass, characteristics,
3549                 rotationOverride);
3550     }
3551 
3552     // Find hidden physical camera characteristics
3553     for (auto& provider : mProviders) {
3554         for (auto& deviceInfo : provider->mDevices) {
3555             status_t res = deviceInfo->getPhysicalCameraCharacteristics(id, characteristics);
3556             if (res != NAME_NOT_FOUND) return res;
3557         }
3558     }
3559 
3560     return NAME_NOT_FOUND;
3561 }
3562 
filterLogicalCameraIdsLocked(std::vector<std::string> & deviceIds) const3563 void CameraProviderManager::filterLogicalCameraIdsLocked(
3564         std::vector<std::string>& deviceIds) const
3565 {
3566     // Map between camera facing and camera IDs related to logical camera.
3567     std::map<int, std::unordered_set<std::string>> idCombos;
3568 
3569     // Collect all logical and its underlying physical camera IDs for each
3570     // facing.
3571     for (auto& deviceId : deviceIds) {
3572         auto deviceInfo = findDeviceInfoLocked(deviceId);
3573         if (deviceInfo == nullptr) continue;
3574 
3575         if (!deviceInfo->mIsLogicalCamera) {
3576             continue;
3577         }
3578 
3579         // combo contains the ids of a logical camera and its physical cameras
3580         std::vector<std::string> combo = deviceInfo->mPhysicalIds;
3581         combo.push_back(deviceId);
3582 
3583         hardware::CameraInfo info;
3584         int portraitRotation;
3585         status_t res = deviceInfo->getCameraInfo(
3586                 /*rotationOverride*/hardware::ICameraService::ROTATION_OVERRIDE_NONE,
3587                 &portraitRotation, &info);
3588         if (res != OK) {
3589             ALOGE("%s: Error reading camera info: %s (%d)", __FUNCTION__, strerror(-res), res);
3590             continue;
3591         }
3592         idCombos[info.facing].insert(combo.begin(), combo.end());
3593     }
3594 
3595     // Only expose one camera ID per facing for all logical and underlying
3596     // physical camera IDs.
3597     for (auto& r : idCombos) {
3598         auto& removedIds = r.second;
3599         for (auto& id : deviceIds) {
3600             auto foundId = std::find(removedIds.begin(), removedIds.end(), id);
3601             if (foundId == removedIds.end()) {
3602                 continue;
3603             }
3604 
3605             removedIds.erase(foundId);
3606             break;
3607         }
3608         deviceIds.erase(std::remove_if(deviceIds.begin(), deviceIds.end(),
3609                 [&removedIds](const std::string& s) {
3610                 return removedIds.find(s) != removedIds.end();}),
3611                 deviceIds.end());
3612     }
3613 }
3614 
isVirtualCameraHalEnabled()3615 bool CameraProviderManager::isVirtualCameraHalEnabled() {
3616     return vd_flags::virtual_camera_service_discovery() &&
3617            vd_flags::virtual_camera_service_build_flag();
3618 }
3619 
3620 } // namespace android
3621