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 #ifndef ANDROID_SERVERS_CAMERA_CAMERAPROVIDER_H 18 #define ANDROID_SERVERS_CAMERA_CAMERAPROVIDER_H 19 20 #include <vector> 21 #include <unordered_map> 22 #include <unordered_set> 23 #include <set> 24 #include <string> 25 #include <mutex> 26 27 #include <camera/camera2/ConcurrentCamera.h> 28 #include <camera/CameraParameters2.h> 29 #include <camera/CameraMetadata.h> 30 #include <camera/CameraBase.h> 31 #include <utils/Condition.h> 32 #include <utils/Errors.h> 33 #include <android/hardware/ICameraService.h> 34 #include <utils/IPCTransport.h> 35 #include <utils/SessionConfigurationUtils.h> 36 #include <aidl/android/hardware/camera/provider/ICameraProvider.h> 37 #include <android/hardware/camera/common/1.0/types.h> 38 #include <android/hardware/camera/provider/2.5/ICameraProvider.h> 39 #include <android/hardware/camera/provider/2.6/ICameraProviderCallback.h> 40 #include <android/hardware/camera/provider/2.6/ICameraProvider.h> 41 #include <android/hardware/camera/provider/2.7/ICameraProvider.h> 42 #include <android/hardware/camera/device/3.7/types.h> 43 #include <android/hidl/manager/1.0/IServiceNotification.h> 44 #include <binder/IServiceManager.h> 45 #include <camera/VendorTagDescriptor.h> 46 47 #include "config/SharedSessionConfigUtils.h" 48 49 namespace android { 50 51 using hardware::camera2::utils::CameraIdAndSessionConfiguration; 52 53 enum class CameraDeviceStatus : uint32_t { 54 NOT_PRESENT = 0, 55 PRESENT = 1, 56 ENUMERATING = 2 57 }; 58 59 enum class TorchModeStatus : uint32_t { 60 NOT_AVAILABLE = 0, 61 AVAILABLE_OFF = 1, 62 AVAILABLE_ON = 2 63 }; 64 65 struct CameraResourceCost { 66 uint32_t resourceCost; 67 std::vector<std::string> conflictingDevices; 68 }; 69 70 enum SystemCameraKind { 71 /** 72 * These camera devices are visible to all apps and system components alike 73 */ 74 PUBLIC = 0, 75 76 /** 77 * These camera devices are visible only to processes having the 78 * android.permission.SYSTEM_CAMERA permission. They are not exposed to 3P 79 * apps. 80 */ 81 SYSTEM_ONLY_CAMERA, 82 83 /** 84 * These camera devices are visible only to HAL clients (that try to connect 85 * on a hwbinder thread). 86 */ 87 HIDDEN_SECURE_CAMERA 88 }; 89 90 #define CAMERA_DEVICE_API_VERSION_1_0 HARDWARE_DEVICE_API_VERSION(1, 0) 91 #define CAMERA_DEVICE_API_VERSION_1_2 HARDWARE_DEVICE_API_VERSION(1, 2) 92 #define CAMERA_DEVICE_API_VERSION_1_3 HARDWARE_DEVICE_API_VERSION(1, 3) 93 #define CAMERA_DEVICE_API_VERSION_3_0 HARDWARE_DEVICE_API_VERSION(3, 0) 94 #define CAMERA_DEVICE_API_VERSION_3_1 HARDWARE_DEVICE_API_VERSION(3, 1) 95 #define CAMERA_DEVICE_API_VERSION_3_2 HARDWARE_DEVICE_API_VERSION(3, 2) 96 #define CAMERA_DEVICE_API_VERSION_3_3 HARDWARE_DEVICE_API_VERSION(3, 3) 97 #define CAMERA_DEVICE_API_VERSION_3_4 HARDWARE_DEVICE_API_VERSION(3, 4) 98 #define CAMERA_DEVICE_API_VERSION_3_5 HARDWARE_DEVICE_API_VERSION(3, 5) 99 #define CAMERA_DEVICE_API_VERSION_3_6 HARDWARE_DEVICE_API_VERSION(3, 6) 100 #define CAMERA_DEVICE_API_VERSION_3_7 HARDWARE_DEVICE_API_VERSION(3, 7) 101 102 /** 103 * The vendor tag descriptor class that takes HIDL/AIDL vendor tag information as 104 * input. Not part of VendorTagDescriptor class because that class is used 105 * in AIDL generated sources which don't have access to AIDL / HIDL headers. 106 */ 107 class IdlVendorTagDescriptor : public VendorTagDescriptor { 108 public: 109 /** 110 * Create a VendorTagDescriptor object from the HIDL/AIDL VendorTagSection 111 * vector. 112 * 113 * Returns OK on success, or a negative error code. 114 */ 115 template <class VendorTagSectionVectorType, class VendorTagSectionType> 116 static status_t createDescriptorFromIdl( 117 const VendorTagSectionVectorType& vts, 118 /*out*/ 119 sp<VendorTagDescriptor>& descriptor); 120 }; 121 122 /** 123 * A manager for all camera providers available on an Android device. 124 * 125 * Responsible for enumerating providers and the individual camera devices 126 * they export, both at startup and as providers and devices are added/removed. 127 * 128 * Provides methods for requesting information about individual devices and for 129 * opening them for active use. 130 * 131 */ 132 class CameraProviderManager : virtual public hidl::manager::V1_0::IServiceNotification, 133 public virtual IServiceManager::LocalRegistrationCallback { 134 public: 135 // needs to be made friend strict since HidlProviderInfo needs to inherit 136 // from CameraProviderManager::ProviderInfo which isn't a public member. 137 friend struct HidlProviderInfo; 138 friend struct AidlProviderInfo; 139 ~CameraProviderManager(); 140 141 // Tiny proxy for the static methods in a HIDL interface that communicate with the hardware 142 // service manager, to be replacable in unit tests with a fake. 143 struct HidlServiceInteractionProxy { 144 virtual bool registerForNotifications( 145 const std::string &serviceName, 146 const sp<hidl::manager::V1_0::IServiceNotification> 147 ¬ification) = 0; 148 // Will not wait for service to start if it's not already running 149 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> tryGetService( 150 const std::string &serviceName) = 0; 151 // Will block for service if it exists but isn't running 152 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService( 153 const std::string &serviceName) = 0; 154 virtual hardware::hidl_vec<hardware::hidl_string> listServices() = 0; ~HidlServiceInteractionProxyHidlServiceInteractionProxy155 virtual ~HidlServiceInteractionProxy() {} 156 }; 157 158 // Standard use case - call into the normal generated static methods which invoke 159 // the real hardware service manager 160 struct HidlServiceInteractionProxyImpl : public HidlServiceInteractionProxy { registerForNotificationsHidlServiceInteractionProxyImpl161 virtual bool registerForNotifications( 162 const std::string &serviceName, 163 const sp<hidl::manager::V1_0::IServiceNotification> 164 ¬ification) override { 165 return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications( 166 serviceName, notification); 167 } tryGetServiceHidlServiceInteractionProxyImpl168 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> tryGetService( 169 const std::string &serviceName) override { 170 return hardware::camera::provider::V2_4::ICameraProvider::tryGetService(serviceName); 171 } getServiceHidlServiceInteractionProxyImpl172 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService( 173 const std::string &serviceName) override { 174 return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName); 175 } 176 177 virtual hardware::hidl_vec<hardware::hidl_string> listServices() override; 178 }; 179 180 // Proxy to inject fake services in test. 181 class AidlServiceInteractionProxy { 182 public: 183 // Returns the Aidl service with the given serviceName. Will wait indefinitely 184 // for the service to come up if not running. 185 virtual std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider> 186 getService(const std::string& serviceName) = 0; 187 188 // Attempts to get an already running AIDL service of the given serviceName. 189 // Returns nullptr immediately if service is not running. 190 virtual std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider> 191 tryGetService(const std::string& serviceName) = 0; 192 193 virtual ~AidlServiceInteractionProxy() = default; 194 }; 195 196 // Standard use case - call into the normal static methods which invoke 197 // the real service manager 198 class AidlServiceInteractionProxyImpl : public AidlServiceInteractionProxy { 199 public: 200 virtual std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider> 201 getService(const std::string& serviceName) override; 202 203 virtual std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider> 204 tryGetService(const std::string& serviceName) override; 205 }; 206 207 /** 208 * Listener interface for device/torch status changes 209 */ 210 struct StatusListener : virtual public RefBase { ~StatusListenerStatusListener211 ~StatusListener() {} 212 213 virtual void onDeviceStatusChanged(const std::string &cameraId, 214 CameraDeviceStatus newStatus) = 0; 215 virtual void onDeviceStatusChanged(const std::string &cameraId, 216 const std::string &physicalCameraId, 217 CameraDeviceStatus newStatus) = 0; 218 virtual void onTorchStatusChanged(const std::string &cameraId, 219 TorchModeStatus newStatus, 220 SystemCameraKind kind) = 0; 221 virtual void onTorchStatusChanged(const std::string &cameraId, 222 TorchModeStatus newStatus) = 0; 223 virtual void onNewProviderRegistered() = 0; 224 }; 225 226 /** 227 * Represents the mode a camera device is currently in 228 */ 229 enum class DeviceMode { 230 TORCH, 231 CAMERA 232 }; 233 234 /** 235 * Initialize the manager and give it a status listener; optionally accepts a service 236 * interaction proxy. 237 * 238 * The default proxy communicates via the hardware service manager; alternate proxies can be 239 * used for testing. The lifetime of the proxy must exceed the lifetime of the manager. 240 */ 241 status_t initialize(wp<StatusListener> listener, 242 HidlServiceInteractionProxy* hidlProxy = &sHidlServiceInteractionProxy, 243 AidlServiceInteractionProxy* aidlProxy = &sAidlServiceInteractionProxy); 244 245 status_t getCameraIdIPCTransport(const std::string &id, 246 IPCTransport *providerTransport) const; 247 248 /** 249 * Retrieve the total number of available cameras. 250 * This value may change dynamically as cameras are added or removed. 251 */ 252 std::pair<int, int> getCameraCount() const; 253 254 /** 255 * Upon the function return, if unavailablePhysicalIds is not nullptr, it 256 * will contain all of the unavailable physical camera Ids represented in 257 * the form of: 258 * {[logicalCamera, {physicalCamera1, physicalCamera2, ...}], ...}. 259 */ 260 std::vector<std::string> getCameraDeviceIds(std::unordered_map< 261 std::string, std::set<std::string>>* unavailablePhysicalIds = nullptr) const; 262 263 /** 264 * Retrieve the number of API1 compatible cameras; these are internal and 265 * backwards-compatible. This is the set of cameras that will be 266 * accessible via the old camera API. 267 * The return value may change dynamically due to external camera hotplug. 268 */ 269 std::vector<std::string> getAPI1CompatibleCameraDeviceIds() const; 270 271 /** 272 * Return true if a device with a given ID has a flash unit. Returns false 273 * for devices that are unknown. 274 */ 275 bool hasFlashUnit(const std::string &id) const; 276 277 /** 278 * Return true if the camera device has native zoom ratio support. 279 */ 280 bool supportNativeZoomRatio(const std::string &id) const; 281 282 /** 283 * Return true if the camera device has no composite Jpeg/R support. 284 */ 285 bool isCompositeJpegRDisabled(const std::string &id) const; 286 287 /** 288 * Return true if the camera device has no composite HEIC support. 289 */ 290 bool isCompositeHeicDisabled(const std::string &id) const; 291 292 /** 293 * Return true if the camera device has no composite HEIC Ultra HDR support. 294 */ 295 bool isCompositeHeicUltraHDRDisabled(const std::string &id) const; 296 297 /** 298 * Return the resource cost of this camera device 299 */ 300 status_t getResourceCost(const std::string &id, 301 CameraResourceCost* cost) const; 302 303 /** 304 * Return the old camera API camera info 305 */ 306 status_t getCameraInfo(const std::string &id, 307 int rotationOverride, int *portraitRotation, 308 hardware::CameraInfo* info) const; 309 310 /** 311 * Return API2 camera characteristics - returns NAME_NOT_FOUND if a device ID does 312 * not have a v3 or newer HAL version. 313 */ 314 status_t getCameraCharacteristics(const std::string &id, 315 bool overrideForPerfClass, CameraMetadata* characteristics, 316 int rotationOverride) const; 317 318 status_t isConcurrentSessionConfigurationSupported( 319 const std::vector<hardware::camera2::utils::CameraIdAndSessionConfiguration> 320 &cameraIdsAndSessionConfigs, 321 const std::set<std::string>& perfClassPrimaryCameraIds, 322 int targetSdkVersion, bool *isSupported); 323 324 std::vector<std::unordered_set<std::string>> getConcurrentCameraIds() const; 325 326 /** 327 * Create a default capture request metadata for a camera and a specific 328 * template. 329 */ 330 status_t createDefaultRequest(const std::string& id, 331 camera3::camera_request_template_t templateId, 332 hardware::camera2::impl::CameraMetadataNative* request) const; 333 /** 334 * Check for device support of specific stream combination. 335 */ 336 status_t isSessionConfigurationSupported(const std::string& id, 337 const SessionConfiguration &configuration, 338 bool overrideForPerfClass, bool checkSessionParams, 339 bool *status /*out*/) const; 340 341 /** 342 * Get session characteristics for a particular session. 343 */ 344 status_t getSessionCharacteristics(const std::string& id, 345 const SessionConfiguration &configuration, 346 bool overrideForPerfClass, 347 int rotationOverride, 348 CameraMetadata* sessionCharacteristics /*out*/) const; 349 350 /** 351 * Return the highest supported device interface version for this ID 352 */ 353 status_t getHighestSupportedVersion(const std::string &id, 354 hardware::hidl_version *v, IPCTransport *transport); 355 356 /** 357 * Check if a given camera device support setTorchMode API. 358 */ 359 bool supportSetTorchMode(const std::string &id) const; 360 361 /** 362 * Check if torch strength update should be skipped or not. 363 */ 364 bool shouldSkipTorchStrengthUpdate(const std::string &id, int32_t torchStrength) const; 365 366 /** 367 * Return the default torch strength level if the torch strength control 368 * feature is supported. 369 */ 370 int32_t getTorchDefaultStrengthLevel(const std::string &id) const; 371 372 /** 373 * Turn on or off the flashlight on a given camera device. 374 * May fail if the device does not support this API, is in active use, or if the device 375 * doesn't exist, etc. 376 */ 377 status_t setTorchMode(const std::string &id, bool enabled); 378 379 /** 380 * Change the brightness level of the flash unit associated with the cameraId and 381 * set it to the value in torchStrength. 382 * If the torch is OFF and torchStrength > 0, the torch will be turned ON with the 383 * specified strength level. If the torch is ON, only the brightness level will be 384 * changed. 385 * 386 * This operation will fail if the device does not have flash unit, has flash unit 387 * but does not support this API, torchStrength is invalid or if the device doesn't 388 * exist etc. 389 */ 390 status_t turnOnTorchWithStrengthLevel(const std::string &id, int32_t torchStrength); 391 392 /** 393 * Return the torch strength level of this camera device. 394 */ 395 status_t getTorchStrengthLevel(const std::string &id, int32_t* torchStrength); 396 397 /** 398 * Setup vendor tags for all registered providers 399 */ 400 status_t setUpVendorTags(); 401 402 /** 403 * Inform registered providers about a device state change, such as folding or unfolding 404 */ 405 status_t notifyDeviceStateChange(int64_t newState); 406 407 status_t openAidlSession(const std::string &id, 408 const std::shared_ptr< 409 aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback, 410 /*out*/ 411 std::shared_ptr<aidl::android::hardware::camera::device::ICameraDeviceSession> *session); 412 413 status_t openAidlInjectionSession(const std::string &id, 414 const std::shared_ptr< 415 aidl::android::hardware::camera::device::ICameraDeviceCallback>& callback, 416 /*out*/ 417 std::shared_ptr<aidl::android::hardware::camera::device::ICameraInjectionSession> *session); 418 419 /** 420 * Open an active session to a camera device. 421 * 422 * This fully powers on the camera device hardware, and returns a handle to a 423 * session to be used for hardware configuration and operation. 424 */ 425 status_t openHidlSession(const std::string &id, 426 const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback, 427 /*out*/ 428 sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session); 429 430 /** 431 * Notify that the camera or torch is no longer being used by a camera client 432 */ 433 void removeRef(DeviceMode usageType, const std::string &cameraId); 434 435 /** 436 * IServiceNotification::onRegistration 437 * Invoked by the hardware service manager when a new camera provider is registered 438 */ 439 virtual hardware::Return<void> onRegistration(const hardware::hidl_string& fqName, 440 const hardware::hidl_string& name, 441 bool preexisting) override; 442 443 // LocalRegistrationCallback::onServiceRegistration 444 virtual void onServiceRegistration(const String16& name, const sp<IBinder> &binder) override; 445 446 /* 447 * Return list of provider pid 448 */ 449 std::set<pid_t> getProviderPids(); 450 451 /** 452 * Dump out information about available providers and devices 453 */ 454 status_t dump(int fd, const Vector<String16>& args); 455 456 /** 457 * Conversion methods between HAL Status and status_t and strings 458 */ 459 static status_t mapToStatusT(const hardware::camera::common::V1_0::Status& s); 460 static const char* statusToString(const hardware::camera::common::V1_0::Status& s); 461 462 /* 463 * Return provider type for a specific device. 464 */ 465 metadata_vendor_id_t getProviderTagIdLocked(const std::string& id) const; 466 467 /* 468 * Check if a camera is a logical camera. And if yes, return 469 * the physical camera ids. 470 */ 471 bool isLogicalCamera(const std::string& id, std::vector<std::string>* physicalCameraIds); 472 473 status_t getSystemCameraKind(const std::string& id, SystemCameraKind *kind) const; 474 bool isHiddenPhysicalCamera(const std::string& cameraId) const; 475 476 status_t filterSmallJpegSizes(const std::string& cameraId); 477 478 status_t notifyUsbDeviceEvent(int32_t eventId, const std::string &usbDeviceId); 479 480 static bool isConcurrentDynamicRangeCaptureSupported(const CameraMetadata& deviceInfo, 481 int64_t profile, int64_t concurrentProfile); 482 483 static const float kDepthARTolerance; 484 static const bool kFrameworkJpegRDisabled; 485 static const bool kFrameworkHeicUltraHDRDisabled; 486 static const bool kFrameworkHeicAllowSWCodecs; 487 488 private: 489 // All private members, unless otherwise noted, expect mInterfaceMutex to be locked before use 490 mutable std::mutex mInterfaceMutex; 491 492 wp<StatusListener> mListener; 493 HidlServiceInteractionProxy* mHidlServiceProxy; 494 AidlServiceInteractionProxy* mAidlServiceProxy; 495 496 // Current overall Android device physical status 497 int64_t mDeviceState; 498 499 // mProviderLifecycleLock is locked during onRegistration and removeProvider 500 mutable std::mutex mProviderLifecycleLock; 501 502 static HidlServiceInteractionProxyImpl sHidlServiceInteractionProxy; 503 static AidlServiceInteractionProxyImpl sAidlServiceInteractionProxy; 504 505 struct HalCameraProvider { 506 // Empty parent struct for storing either aidl / hidl camera provider reference HalCameraProviderHalCameraProvider507 HalCameraProvider(const char *descriptor) : mDescriptor(descriptor) { }; ~HalCameraProviderHalCameraProvider508 virtual ~HalCameraProvider() {}; 509 std::string mDescriptor; 510 }; 511 512 struct HidlHalCameraProvider : public HalCameraProvider { HidlHalCameraProviderHidlHalCameraProvider513 HidlHalCameraProvider( 514 const sp<hardware::camera::provider::V2_4::ICameraProvider> &provider, 515 const char *descriptor) : 516 HalCameraProvider(descriptor), mCameraProvider(provider) { }; 517 private: 518 sp<hardware::camera::provider::V2_4::ICameraProvider> mCameraProvider; 519 }; 520 521 struct AidlHalCameraProvider : public HalCameraProvider { AidlHalCameraProviderAidlHalCameraProvider522 AidlHalCameraProvider( 523 const std::shared_ptr< 524 aidl::android::hardware::camera::provider::ICameraProvider> &provider, 525 const char *descriptor) : 526 HalCameraProvider(descriptor), mCameraProvider(provider) { }; 527 private: 528 std::shared_ptr<aidl::android::hardware::camera::provider::ICameraProvider> mCameraProvider; 529 }; 530 531 532 // Mapping from CameraDevice IDs to CameraProviders. This map is used to keep the 533 // ICameraProvider alive while it is in use by the camera with the given ID for camera 534 // capabilities 535 std::unordered_map<std::string, std::shared_ptr<HalCameraProvider>> 536 mCameraProviderByCameraId; 537 538 // Mapping from CameraDevice IDs to CameraProviders. This map is used to keep the 539 // ICameraProvider alive while it is in use by the camera with the given ID for torch 540 // capabilities 541 std::unordered_map<std::string, std::shared_ptr<HalCameraProvider>> 542 mTorchProviderByCameraId; 543 544 // Lock for accessing mCameraProviderByCameraId and mTorchProviderByCameraId 545 std::mutex mProviderInterfaceMapLock; 546 struct ProviderInfo : public virtual RefBase { 547 friend struct HidlProviderInfo; 548 friend struct AidlProviderInfo; 549 const std::string mProviderName; 550 const std::string mProviderInstance; 551 const metadata_vendor_id_t mProviderTagid; 552 int32_t mMinorVersion; 553 sp<VendorTagDescriptor> mVendorTagDescriptor; 554 bool mSetTorchModeSupported; 555 bool mIsRemote; 556 557 ProviderInfo(const std::string &providerName, const std::string &providerInstance, 558 CameraProviderManager *manager); 559 ~ProviderInfo(); 560 561 virtual IPCTransport getIPCTransport() const = 0; 562 563 const std::string& getType() const; 564 565 status_t dump(int fd, const Vector<String16>& args) const; 566 567 void initializeProviderInfoCommon(const std::vector<std::string> &devices); 568 /** 569 * Setup vendor tags for this provider 570 */ 571 virtual status_t setUpVendorTags() = 0; 572 573 /** 574 * Notify provider about top-level device physical state changes 575 * 576 * Note that 'mInterfaceMutex' should not be held when calling this method. 577 * It is possible for camera providers to add/remove devices and try to 578 * acquire it. 579 */ 580 virtual status_t notifyDeviceStateChange(int64_t newDeviceState) = 0; 581 582 virtual bool successfullyStartedProviderInterface() = 0; 583 584 virtual int64_t getDeviceState() = 0; 585 586 std::vector<std::unordered_set<std::string>> getConcurrentCameraIdCombinations(); 587 588 /** 589 * Notify 'DeviceInfo' instanced about top-level device physical state changes 590 * 591 * Note that 'mInterfaceMutex' should be held when calling this method. 592 */ 593 void notifyDeviceInfoStateChangeLocked(int64_t newDeviceState); 594 595 /** 596 * Query the camera provider for concurrent stream configuration support 597 */ 598 virtual status_t isConcurrentSessionConfigurationSupported( 599 const std::vector<CameraIdAndSessionConfiguration> &cameraIdsAndSessionConfigs, 600 const std::set<std::string>& perfClassPrimaryCameraIds, 601 int targetSdkVersion, bool *isSupported) = 0; 602 603 /** 604 * Remove all devices associated with this provider and notify listeners 605 * with NOT_PRESENT state. 606 */ 607 void removeAllDevices(); 608 609 /** 610 * Provider is an external lazy HAL 611 */ 612 bool isExternalLazyHAL() const; 613 614 // Basic device information, common to all camera devices 615 struct DeviceInfo { 616 const std::string mName; // Full instance name 617 const std::string mId; // ID section of full name 618 //Both hidl and aidl DeviceInfos. Aidl deviceInfos get {3, 8} to 619 //start off. 620 const hardware::hidl_version mVersion; 621 const metadata_vendor_id_t mProviderTagid; 622 bool mIsLogicalCamera; 623 std::vector<std::string> mPhysicalIds; 624 hardware::CameraInfo mInfo; 625 SystemCameraKind mSystemCameraKind = SystemCameraKind::PUBLIC; 626 627 const CameraResourceCost mResourceCost; 628 629 CameraDeviceStatus mStatus; 630 631 wp<ProviderInfo> mParentProvider; 632 // Torch strength default, maximum levels if the torch strength control 633 // feature is supported. 634 int32_t mTorchStrengthLevel; 635 int32_t mTorchMaximumStrengthLevel; 636 int32_t mTorchDefaultStrengthLevel; 637 638 // Wait for lazy HALs to confirm device availability 639 static const nsecs_t kDeviceAvailableTimeout = 2000e6; // 2000 ms 640 Mutex mDeviceAvailableLock; 641 Condition mDeviceAvailableSignal; 642 bool mIsDeviceAvailable = true; 643 hasFlashUnitProviderInfo::DeviceInfo644 bool hasFlashUnit() const { return mHasFlashUnit; } supportNativeZoomRatioProviderInfo::DeviceInfo645 bool supportNativeZoomRatio() const { return mSupportNativeZoomRatio; } isCompositeJpegRDisabledProviderInfo::DeviceInfo646 bool isCompositeJpegRDisabled() const { return mCompositeJpegRDisabled; } isCompositeHeicDisabledProviderInfo::DeviceInfo647 bool isCompositeHeicDisabled() const { return mCompositeHeicDisabled; } isCompositeHeicUltraHDRDisabledProviderInfo::DeviceInfo648 bool isCompositeHeicUltraHDRDisabled() const { return mCompositeHeicUltraHDRDisabled; } 649 virtual status_t setTorchMode(bool enabled) = 0; 650 virtual status_t turnOnTorchWithStrengthLevel(int32_t torchStrength) = 0; 651 virtual status_t getTorchStrengthLevel(int32_t *torchStrength) = 0; 652 virtual status_t getCameraInfo( 653 int rotationOverride, 654 int *portraitRotation, 655 hardware::CameraInfo *info) const = 0; 656 virtual bool isAPI1Compatible() const = 0; 657 virtual status_t dumpState(int fd) = 0; getCameraCharacteristicsProviderInfo::DeviceInfo658 virtual status_t getCameraCharacteristics( 659 [[maybe_unused]] bool overrideForPerfClass, 660 [[maybe_unused]] CameraMetadata *characteristics, 661 [[maybe_unused]] int rotationOverride) { 662 return INVALID_OPERATION; 663 } getPhysicalCameraCharacteristicsProviderInfo::DeviceInfo664 virtual status_t getPhysicalCameraCharacteristics( 665 [[maybe_unused]] const std::string& physicalCameraId, 666 [[maybe_unused]] CameraMetadata *characteristics) const { 667 return INVALID_OPERATION; 668 } 669 isSessionConfigurationSupportedProviderInfo::DeviceInfo670 virtual status_t isSessionConfigurationSupported( 671 const SessionConfiguration &/*configuration*/, 672 bool /*overrideForPerfClass*/, 673 camera3::metadataGetter /*getMetadata*/, 674 bool /*checkSessionParams*/, 675 bool * /*status*/) { 676 return INVALID_OPERATION; 677 } 678 getSessionCharacteristicsProviderInfo::DeviceInfo679 virtual status_t getSessionCharacteristics( 680 const SessionConfiguration &/*configuration*/, 681 bool /*overrideForPerfClass*/, 682 camera3::metadataGetter /*getMetadata*/, CameraMetadata* /*outChars*/) { 683 return INVALID_OPERATION; 684 } 685 686 virtual status_t filterSmallJpegSizes() = 0; notifyDeviceStateChangeProviderInfo::DeviceInfo687 virtual void notifyDeviceStateChange(int64_t /*newState*/) {} createDefaultRequestProviderInfo::DeviceInfo688 virtual status_t createDefaultRequest( 689 camera3::camera_request_template_t /*templateId*/, 690 CameraMetadata* /*metadata*/) { 691 return INVALID_OPERATION; 692 } 693 DeviceInfoProviderInfo::DeviceInfo694 DeviceInfo(const std::string& name, const metadata_vendor_id_t tagId, 695 const std::string &id, const hardware::hidl_version& version, 696 const std::vector<std::string>& publicCameraIds, 697 const CameraResourceCost& resourceCost, 698 sp<ProviderInfo> parentProvider) : 699 mName(name), mId(id), mVersion(version), mProviderTagid(tagId), 700 mIsLogicalCamera(false), mResourceCost(resourceCost), 701 mStatus(CameraDeviceStatus::PRESENT), 702 mParentProvider(parentProvider), mTorchStrengthLevel(0), 703 mTorchMaximumStrengthLevel(0), mTorchDefaultStrengthLevel(0), 704 mHasFlashUnit(false), mSupportNativeZoomRatio(false), 705 mPublicCameraIds(publicCameraIds), mCompositeJpegRDisabled(false), 706 mCompositeHeicDisabled(false), mCompositeHeicUltraHDRDisabled(false) {} ~DeviceInfoProviderInfo::DeviceInfo707 virtual ~DeviceInfo() {} 708 protected: 709 710 bool mHasFlashUnit; // const after constructor 711 bool mSupportNativeZoomRatio; // const after constructor 712 const std::vector<std::string>& mPublicCameraIds; 713 bool mCompositeJpegRDisabled; 714 bool mCompositeHeicDisabled; 715 bool mCompositeHeicUltraHDRDisabled; 716 }; 717 std::vector<std::unique_ptr<DeviceInfo>> mDevices; 718 std::unordered_set<std::string> mUniqueCameraIds; 719 std::unordered_map<std::string, std::set<std::string>> mUnavailablePhysicalCameras; 720 int mUniqueDeviceCount; 721 std::vector<std::string> mUniqueAPI1CompatibleCameraIds; 722 // The initial public camera IDs published by the camera provider. 723 // Currently logical multi-camera is not supported for hot-plug camera. 724 // And we use this list to keep track of initial public camera IDs 725 // advertised by the provider, and to distinguish against "hidden" 726 // physical camera IDs. 727 std::vector<std::string> mProviderPublicCameraIds; 728 729 // HALv3-specific camera fields, including the actual device interface 730 struct DeviceInfo3 : public DeviceInfo { 731 732 virtual status_t setTorchMode(bool enabled) = 0; 733 virtual status_t turnOnTorchWithStrengthLevel(int32_t torchStrength) = 0; 734 virtual status_t getTorchStrengthLevel(int32_t *torchStrength) = 0; 735 virtual status_t getCameraInfo( 736 int rotationOverride, 737 int *portraitRotation, 738 hardware::CameraInfo *info) const override; 739 virtual bool isAPI1Compatible() const override; 740 virtual status_t dumpState(int fd) = 0; 741 virtual status_t getCameraCharacteristics( 742 bool overrideForPerfClass, 743 CameraMetadata *characteristics, 744 int rotationOverride) override; 745 virtual status_t getPhysicalCameraCharacteristics(const std::string& physicalCameraId, 746 CameraMetadata *characteristics) const override; 747 virtual status_t filterSmallJpegSizes() override; 748 virtual void notifyDeviceStateChange( 749 int64_t newState) override; 750 751 DeviceInfo3(const std::string& name, const metadata_vendor_id_t tagId, 752 const std::string &id, uint16_t minorVersion, 753 const CameraResourceCost& resourceCost, 754 sp<ProviderInfo> parentProvider, 755 const std::vector<std::string>& publicCameraIds); ~DeviceInfo3ProviderInfo::DeviceInfo3756 virtual ~DeviceInfo3() {}; 757 protected: 758 // Modified by derived transport specific (hidl / aidl) class 759 CameraMetadata mCameraCharacteristics; 760 // Map device states to sensor orientations 761 std::unordered_map<int64_t, int32_t> mDeviceStateOrientationMap; 762 // A copy of mCameraCharacteristics without performance class 763 // override 764 std::unique_ptr<CameraMetadata> mCameraCharNoPCOverride; 765 // Only contains characteristics for hidden physical cameras, 766 // not for public physical cameras. 767 std::unordered_map<std::string, CameraMetadata> mPhysicalCameraCharacteristics; 768 // Value filled in from addSessionConfigQueryVersionTag. 769 // Cached to make lookups faster 770 int mSessionConfigQueryVersion = 0; 771 772 void queryPhysicalCameraIds(); 773 SystemCameraKind getSystemCameraKind(); 774 status_t fixupMonochromeTags(); 775 status_t fixupTorchStrengthTags(); 776 status_t fixupManualFlashStrengthControlTags(CameraMetadata& ch); 777 status_t addDynamicDepthTags(bool maxResolution = false); 778 status_t deriveHeicTags(bool maxResolution = false); 779 status_t deriveJpegRTags(bool maxResolution = false); 780 status_t deriveHeicUltraHDRTags(bool maxResolution = false); 781 status_t deriveBlobDurationEntries( 782 const CameraMetadata& c, bool maxResolution, 783 const std::vector<std::tuple<size_t, size_t>>& filteredSizes, 784 std::vector<int64_t>* filteredStallDurations /*out*/, 785 std::vector<int64_t>* filteredMinDurations /*out*/); 786 status_t insertStreamConfigTags(int32_t sizeTag, int32_t minFrameDurationTag, 787 int32_t stallDurationTag, 788 const std::vector<int32_t>& sizeEntries, 789 const std::vector<int64_t>& minFrameDurationEntries, 790 const std::vector<int64_t>& stallDurationEntries, 791 CameraMetadata* c /*out*/); 792 status_t addRotateCropTags(); 793 status_t addAutoframingTags(); 794 status_t addPreCorrectionActiveArraySize(); 795 status_t addReadoutTimestampTag(bool readoutTimestampSupported = true); 796 status_t addColorCorrectionAvailableModesTag(CameraMetadata& ch); 797 status_t addAePriorityModeTags(); 798 status_t addSessionConfigQueryVersionTag(); 799 status_t addSharedSessionConfigurationTags(const std::string &cameraId); 800 bool isAutomotiveDevice(); 801 802 static void getSupportedSizes(const CameraMetadata& ch, uint32_t tag, 803 android_pixel_format_t format, 804 std::vector<std::tuple<size_t, size_t>> *sizes /*out*/); 805 static void getSupportedDurations( const CameraMetadata& ch, uint32_t tag, 806 android_pixel_format_t format, 807 const std::vector<std::tuple<size_t, size_t>>& sizes, 808 std::vector<int64_t> *durations/*out*/); 809 static void getSupportedDynamicDepthDurations( 810 const std::vector<int64_t>& depthDurations, 811 const std::vector<int64_t>& blobDurations, 812 std::vector<int64_t> *dynamicDepthDurations /*out*/); 813 static void getSupportedDynamicDepthSizes( 814 const std::vector<std::tuple<size_t, size_t>>& blobSizes, 815 const std::vector<std::tuple<size_t, size_t>>& depthSizes, 816 std::vector<std::tuple<size_t, size_t>> *dynamicDepthSizes /*out*/, 817 std::vector<std::tuple<size_t, size_t>> *internalDepthSizes /*out*/); 818 status_t removeAvailableKeys(CameraMetadata& c, const std::vector<uint32_t>& keys, 819 uint32_t keyTag); 820 status_t fillHeicStreamCombinations(std::vector<int32_t>* outputs, 821 std::vector<int64_t>* durations, 822 std::vector<int64_t>* stallDurations, 823 const camera_metadata_entry& halStreamConfigs, 824 const camera_metadata_entry& halStreamDurations); 825 }; 826 protected: 827 std::string mType; 828 uint32_t mId; 829 830 std::mutex mLock; 831 832 CameraProviderManager *mManager; 833 834 struct CameraStatusInfoT { 835 bool isPhysicalCameraStatus = false; 836 std::string cameraId; 837 std::string physicalCameraId; 838 CameraDeviceStatus status; CameraStatusInfoTProviderInfo::CameraStatusInfoT839 CameraStatusInfoT(bool isForPhysicalCamera, const std::string& id, 840 const std::string& physicalId, 841 CameraDeviceStatus s) : 842 isPhysicalCameraStatus(isForPhysicalCamera), cameraId(id), 843 physicalCameraId(physicalId), status(s) {} 844 }; 845 846 // Lock to synchronize between initialize() and camera status callbacks 847 std::mutex mInitLock; 848 bool mInitialized = false; 849 std::vector<CameraStatusInfoT> mCachedStatus; 850 // End of scope for mInitLock 851 852 std::unique_ptr<ProviderInfo::DeviceInfo> 853 virtual initializeDeviceInfo( 854 const std::string &name, const metadata_vendor_id_t tagId, 855 const std::string &id, uint16_t minorVersion) = 0; 856 857 virtual status_t reCacheConcurrentStreamingCameraIdsLocked() = 0; 858 859 std::vector<std::unordered_set<std::string>> mConcurrentCameraIdCombinations; 860 861 // Parse provider instance name for type and id 862 static status_t parseProviderName(const std::string& name, 863 std::string *type, uint32_t *id); 864 865 // Parse device instance name for device version, type, and id. 866 static status_t parseDeviceName(const std::string& name, 867 uint16_t *major, uint16_t *minor, std::string *type, std::string *id); 868 869 // Generate vendor tag id 870 static metadata_vendor_id_t generateVendorTagId(const std::string &name); 871 872 status_t addDevice( 873 const std::string& name, CameraDeviceStatus initialStatus, 874 /*out*/ std::string* parsedId); 875 876 void cameraDeviceStatusChangeInternal(const std::string& cameraDeviceName, 877 CameraDeviceStatus newStatus); 878 879 status_t cameraDeviceStatusChangeLocked( 880 std::string* id, const std::string& cameraDeviceName, 881 CameraDeviceStatus newStatus); 882 883 void physicalCameraDeviceStatusChangeInternal(const std::string& cameraDeviceName, 884 const std::string& physicalCameraDeviceName, 885 CameraDeviceStatus newStatus); 886 887 status_t physicalCameraDeviceStatusChangeLocked( 888 std::string* id, std::string* physicalId, 889 const std::string& cameraDeviceName, 890 const std::string& physicalCameraDeviceName, 891 CameraDeviceStatus newStatus); 892 893 void torchModeStatusChangeInternal(const std::string& cameraDeviceName, 894 TorchModeStatus newStatus); 895 896 void removeDevice(const std::string &id); 897 898 }; 899 900 template <class ProviderInfoType, class HalCameraProviderType> 901 status_t setTorchModeT(sp<ProviderInfo> &parentProvider, 902 std::shared_ptr<HalCameraProvider> *halCameraProvider); 903 904 // Try to get hidl provider services declared. Expects mInterfaceMutex to be 905 // locked. Also registers for hidl provider service notifications. 906 status_t tryToInitAndAddHidlProvidersLocked(HidlServiceInteractionProxy *hidlProxy); 907 908 // Try to get aidl provider services declared. Expects mInterfaceMutex to be 909 // locked. Also registers for aidl provider service notifications. 910 status_t tryToAddAidlProvidersLocked(); 911 912 /** 913 * Save the ICameraProvider while it is being used by a camera or torch client 914 */ 915 void saveRef(DeviceMode usageType, const std::string &cameraId, 916 std::shared_ptr<HalCameraProvider> provider); 917 918 // Utility to find a DeviceInfo by ID; pointer is only valid while mInterfaceMutex is held 919 // and the calling code doesn't mutate the list of providers or their lists of devices. 920 // No guarantees on the order of traversal 921 ProviderInfo::DeviceInfo* findDeviceInfoLocked(const std::string& id) const; 922 923 bool isCompositeJpegRDisabledLocked(const std::string &id) const; 924 bool isCompositeHeicDisabledLocked(const std::string &id) const; 925 bool isCompositeHeicUltraHDRDisabledLocked(const std::string &id) const; 926 927 // Map external providers to USB devices in order to handle USB hotplug 928 // events for lazy HALs 929 std::pair<std::vector<std::string>, sp<ProviderInfo>> 930 mExternalUsbDevicesForProvider; 931 sp<ProviderInfo> startExternalLazyProvider() const; 932 933 status_t addHidlProviderLocked(const std::string& newProvider, bool preexisting = false); 934 935 status_t addAidlProviderLocked(const std::string& newProvider); 936 937 status_t tryToInitializeHidlProviderLocked(const std::string& providerName, 938 const sp<ProviderInfo>& providerInfo); 939 940 status_t tryToInitializeAidlProviderLocked(const std::string& providerName, 941 const sp<ProviderInfo>& providerInfo); 942 943 bool isLogicalCameraLocked(const std::string& id, std::vector<std::string>* physicalCameraIds); 944 945 // No method corresponding to the same provider / member belonging to the 946 // same provider should be used after this method is called since it'll lead 947 // to invalid memory access (especially since this is called by ProviderInfo methods on hal 948 // service death). 949 status_t removeProvider(const std::string& provider); 950 sp<StatusListener> getStatusListener() const; 951 952 bool isValidDeviceLocked(const std::string &id, uint16_t majorVersion, 953 IPCTransport transport) const; 954 955 size_t mProviderInstanceId = 0; 956 std::vector<sp<ProviderInfo>> mProviders; 957 // Provider names of AIDL providers with retrieved binders. 958 std::set<std::string> mAidlProviderWithBinders; 959 960 std::mutex mProviderPidMapLock; 961 std::map<std::string, pid_t> mProviderPidMap; 962 963 static const char* deviceStatusToString( 964 const hardware::camera::common::V1_0::CameraDeviceStatus&); 965 static const char* torchStatusToString( 966 const hardware::camera::common::V1_0::TorchModeStatus&); 967 968 status_t getCameraCharacteristicsLocked(const std::string &id, bool overrideForPerfClass, 969 CameraMetadata* characteristics, int rotationOverride) const; 970 void filterLogicalCameraIdsLocked(std::vector<std::string>& deviceIds) const; 971 972 status_t getSystemCameraKindLocked(const std::string& id, SystemCameraKind *kind) const; 973 std::pair<bool, ProviderInfo::DeviceInfo *> isHiddenPhysicalCameraInternal( 974 const std::string& cameraId) const; 975 976 void collectDeviceIdsLocked(const std::vector<std::string> deviceIds, 977 std::vector<std::string>& normalDeviceIds, 978 std::vector<std::string>& systemCameraDeviceIds) const; 979 980 status_t usbDeviceDetached(const std::string &usbDeviceId); 981 982 static bool isVirtualCameraHalEnabled(); 983 }; 984 985 } // namespace android 986 987 #endif 988