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> ®istered) {
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