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 <string> 24 #include <mutex> 25 26 #include <camera/CameraParameters2.h> 27 #include <camera/CameraMetadata.h> 28 #include <camera/CameraBase.h> 29 #include <utils/Errors.h> 30 #include <android/hardware/camera/common/1.0/types.h> 31 #include <android/hardware/camera/provider/2.5/ICameraProvider.h> 32 #include <android/hardware/camera/device/3.4/ICameraDeviceSession.h> 33 #include <android/hidl/manager/1.0/IServiceNotification.h> 34 #include <camera/VendorTagDescriptor.h> 35 36 namespace android { 37 38 /** 39 * The vendor tag descriptor class that takes HIDL vendor tag information as 40 * input. Not part of VendorTagDescriptor class because that class is used 41 * in AIDL generated sources which don't have access to HIDL headers. 42 */ 43 class HidlVendorTagDescriptor : public VendorTagDescriptor { 44 public: 45 /** 46 * Create a VendorTagDescriptor object from the HIDL VendorTagSection 47 * vector. 48 * 49 * Returns OK on success, or a negative error code. 50 */ 51 static status_t createDescriptorFromHidl( 52 const hardware::hidl_vec<hardware::camera::common::V1_0::VendorTagSection>& vts, 53 /*out*/ 54 sp<VendorTagDescriptor>& descriptor); 55 }; 56 57 /** 58 * A manager for all camera providers available on an Android device. 59 * 60 * Responsible for enumerating providers and the individual camera devices 61 * they export, both at startup and as providers and devices are added/removed. 62 * 63 * Provides methods for requesting information about individual devices and for 64 * opening them for active use. 65 * 66 */ 67 class CameraProviderManager : virtual public hidl::manager::V1_0::IServiceNotification { 68 public: 69 70 ~CameraProviderManager(); 71 72 // Tiny proxy for the static methods in a HIDL interface that communicate with the hardware 73 // service manager, to be replacable in unit tests with a fake. 74 struct ServiceInteractionProxy { 75 virtual bool registerForNotifications( 76 const std::string &serviceName, 77 const sp<hidl::manager::V1_0::IServiceNotification> 78 ¬ification) = 0; 79 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService( 80 const std::string &serviceName) = 0; ~ServiceInteractionProxyServiceInteractionProxy81 virtual ~ServiceInteractionProxy() {} 82 }; 83 84 // Standard use case - call into the normal generated static methods which invoke 85 // the real hardware service manager 86 struct HardwareServiceInteractionProxy : public ServiceInteractionProxy { registerForNotificationsHardwareServiceInteractionProxy87 virtual bool registerForNotifications( 88 const std::string &serviceName, 89 const sp<hidl::manager::V1_0::IServiceNotification> 90 ¬ification) override { 91 return hardware::camera::provider::V2_4::ICameraProvider::registerForNotifications( 92 serviceName, notification); 93 } getServiceHardwareServiceInteractionProxy94 virtual sp<hardware::camera::provider::V2_4::ICameraProvider> getService( 95 const std::string &serviceName) override { 96 return hardware::camera::provider::V2_4::ICameraProvider::getService(serviceName); 97 } 98 }; 99 100 /** 101 * Listener interface for device/torch status changes 102 */ 103 struct StatusListener : virtual public RefBase { ~StatusListenerStatusListener104 ~StatusListener() {} 105 106 virtual void onDeviceStatusChanged(const String8 &cameraId, 107 hardware::camera::common::V1_0::CameraDeviceStatus newStatus) = 0; 108 virtual void onTorchStatusChanged(const String8 &cameraId, 109 hardware::camera::common::V1_0::TorchModeStatus newStatus) = 0; 110 virtual void onNewProviderRegistered() = 0; 111 }; 112 113 /** 114 * Represents the mode a camera device is currently in 115 */ 116 enum class DeviceMode { 117 TORCH, 118 CAMERA 119 }; 120 121 /** 122 * Initialize the manager and give it a status listener; optionally accepts a service 123 * interaction proxy. 124 * 125 * The default proxy communicates via the hardware service manager; alternate proxies can be 126 * used for testing. The lifetime of the proxy must exceed the lifetime of the manager. 127 */ 128 status_t initialize(wp<StatusListener> listener, 129 ServiceInteractionProxy *proxy = &sHardwareServiceInteractionProxy); 130 131 /** 132 * Retrieve the total number of available cameras. This value may change dynamically as cameras 133 * are added or removed. 134 */ 135 int getCameraCount() const; 136 137 std::vector<std::string> getCameraDeviceIds() const; 138 139 /** 140 * Retrieve the number of API1 compatible cameras; these are internal and 141 * backwards-compatible. This is the set of cameras that will be 142 * accessible via the old camera API. 143 * The return value may change dynamically due to external camera hotplug. 144 */ 145 std::vector<std::string> getAPI1CompatibleCameraDeviceIds() const; 146 147 /** 148 * Return true if a device with a given ID and major version exists 149 */ 150 bool isValidDevice(const std::string &id, uint16_t majorVersion) const; 151 152 /** 153 * Return true if a device with a given ID has a flash unit. Returns false 154 * for devices that are unknown. 155 */ 156 bool hasFlashUnit(const std::string &id) const; 157 158 /** 159 * Return the resource cost of this camera device 160 */ 161 status_t getResourceCost(const std::string &id, 162 hardware::camera::common::V1_0::CameraResourceCost* cost) const; 163 164 /** 165 * Return the old camera API camera info 166 */ 167 status_t getCameraInfo(const std::string &id, 168 hardware::CameraInfo* info) const; 169 170 /** 171 * Return API2 camera characteristics - returns NAME_NOT_FOUND if a device ID does 172 * not have a v3 or newer HAL version. 173 */ 174 status_t getCameraCharacteristics(const std::string &id, 175 CameraMetadata* characteristics) const; 176 177 /** 178 * Check for device support of specific stream combination. 179 */ 180 status_t isSessionConfigurationSupported(const std::string& id, 181 const hardware::camera::device::V3_4::StreamConfiguration &configuration, 182 bool *status /*out*/) const; 183 184 /** 185 * Return the highest supported device interface version for this ID 186 */ 187 status_t getHighestSupportedVersion(const std::string &id, 188 hardware::hidl_version *v); 189 190 /** 191 * Check if a given camera device support setTorchMode API. 192 */ 193 bool supportSetTorchMode(const std::string &id) const; 194 195 /** 196 * Turn on or off the flashlight on a given camera device. 197 * May fail if the device does not support this API, is in active use, or if the device 198 * doesn't exist, etc. 199 */ 200 status_t setTorchMode(const std::string &id, bool enabled); 201 202 /** 203 * Setup vendor tags for all registered providers 204 */ 205 status_t setUpVendorTags(); 206 207 /** 208 * Inform registered providers about a device state change, such as folding or unfolding 209 */ 210 status_t notifyDeviceStateChange( 211 android::hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> newState); 212 213 /** 214 * Open an active session to a camera device. 215 * 216 * This fully powers on the camera device hardware, and returns a handle to a 217 * session to be used for hardware configuration and operation. 218 */ 219 status_t openSession(const std::string &id, 220 const sp<hardware::camera::device::V3_2::ICameraDeviceCallback>& callback, 221 /*out*/ 222 sp<hardware::camera::device::V3_2::ICameraDeviceSession> *session); 223 224 status_t openSession(const std::string &id, 225 const sp<hardware::camera::device::V1_0::ICameraDeviceCallback>& callback, 226 /*out*/ 227 sp<hardware::camera::device::V1_0::ICameraDevice> *session); 228 229 /** 230 * Save the ICameraProvider while it is being used by a camera or torch client 231 */ 232 void saveRef(DeviceMode usageType, const std::string &cameraId, 233 sp<hardware::camera::provider::V2_4::ICameraProvider> provider); 234 235 /** 236 * Notify that the camera or torch is no longer being used by a camera client 237 */ 238 void removeRef(DeviceMode usageType, const std::string &cameraId); 239 240 /** 241 * IServiceNotification::onRegistration 242 * Invoked by the hardware service manager when a new camera provider is registered 243 */ 244 virtual hardware::Return<void> onRegistration(const hardware::hidl_string& fqName, 245 const hardware::hidl_string& name, 246 bool preexisting) override; 247 248 /** 249 * Dump out information about available providers and devices 250 */ 251 status_t dump(int fd, const Vector<String16>& args); 252 253 /** 254 * Conversion methods between HAL Status and status_t and strings 255 */ 256 static status_t mapToStatusT(const hardware::camera::common::V1_0::Status& s); 257 static const char* statusToString(const hardware::camera::common::V1_0::Status& s); 258 259 /* 260 * Return provider type for a specific device. 261 */ 262 metadata_vendor_id_t getProviderTagIdLocked(const std::string& id, 263 hardware::hidl_version minVersion = hardware::hidl_version{0,0}, 264 hardware::hidl_version maxVersion = hardware::hidl_version{1000,0}) const; 265 266 /* 267 * Check if a camera is a logical camera. And if yes, return 268 * the physical camera ids. 269 */ 270 bool isLogicalCamera(const std::string& id, std::vector<std::string>* physicalCameraIds); 271 272 bool isPublicallyHiddenSecureCamera(const std::string& id); 273 bool isHiddenPhysicalCamera(const std::string& cameraId); 274 275 static const float kDepthARTolerance; 276 private: 277 // All private members, unless otherwise noted, expect mInterfaceMutex to be locked before use 278 mutable std::mutex mInterfaceMutex; 279 280 // the status listener update callbacks will lock mStatusMutex 281 mutable std::mutex mStatusListenerMutex; 282 wp<StatusListener> mListener; 283 ServiceInteractionProxy* mServiceProxy; 284 285 // Current overall Android device physical status 286 android::hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> mDeviceState; 287 288 // mProviderLifecycleLock is locked during onRegistration and removeProvider 289 mutable std::mutex mProviderLifecycleLock; 290 291 static HardwareServiceInteractionProxy sHardwareServiceInteractionProxy; 292 293 // Mapping from CameraDevice IDs to CameraProviders. This map is used to keep the 294 // ICameraProvider alive while it is in use by the camera with the given ID for camera 295 // capabilities 296 std::unordered_map<std::string, sp<hardware::camera::provider::V2_4::ICameraProvider>> 297 mCameraProviderByCameraId; 298 299 // Mapping from CameraDevice IDs to CameraProviders. This map is used to keep the 300 // ICameraProvider alive while it is in use by the camera with the given ID for torch 301 // capabilities 302 std::unordered_map<std::string, sp<hardware::camera::provider::V2_4::ICameraProvider>> 303 mTorchProviderByCameraId; 304 305 // Lock for accessing mCameraProviderByCameraId and mTorchProviderByCameraId 306 std::mutex mProviderInterfaceMapLock; 307 308 struct ProviderInfo : 309 virtual public hardware::camera::provider::V2_4::ICameraProviderCallback, 310 virtual public hardware::hidl_death_recipient 311 { 312 const std::string mProviderName; 313 const metadata_vendor_id_t mProviderTagid; 314 int mMinorVersion; 315 sp<VendorTagDescriptor> mVendorTagDescriptor; 316 bool mSetTorchModeSupported; 317 bool mIsRemote; 318 319 // Current overall Android device physical status 320 hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> mDeviceState; 321 322 // This pointer is used to keep a reference to the ICameraProvider that was last accessed. 323 wp<hardware::camera::provider::V2_4::ICameraProvider> mActiveInterface; 324 325 sp<hardware::camera::provider::V2_4::ICameraProvider> mSavedInterface; 326 327 ProviderInfo(const std::string &providerName, 328 CameraProviderManager *manager); 329 ~ProviderInfo(); 330 331 status_t initialize(sp<hardware::camera::provider::V2_4::ICameraProvider>& interface, 332 hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> 333 currentDeviceState); 334 335 const sp<hardware::camera::provider::V2_4::ICameraProvider> startProviderInterface(); 336 337 const std::string& getType() const; 338 339 status_t addDevice(const std::string& name, 340 hardware::camera::common::V1_0::CameraDeviceStatus initialStatus = 341 hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT, 342 /*out*/ std::string *parsedId = nullptr); 343 344 status_t dump(int fd, const Vector<String16>& args) const; 345 346 // ICameraProviderCallbacks interface - these lock the parent mInterfaceMutex 347 virtual hardware::Return<void> cameraDeviceStatusChange( 348 const hardware::hidl_string& cameraDeviceName, 349 hardware::camera::common::V1_0::CameraDeviceStatus newStatus) override; 350 virtual hardware::Return<void> torchModeStatusChange( 351 const hardware::hidl_string& cameraDeviceName, 352 hardware::camera::common::V1_0::TorchModeStatus newStatus) override; 353 354 // hidl_death_recipient interface - this locks the parent mInterfaceMutex 355 virtual void serviceDied(uint64_t cookie, const wp<hidl::base::V1_0::IBase>& who) override; 356 357 /** 358 * Setup vendor tags for this provider 359 */ 360 status_t setUpVendorTags(); 361 362 /** 363 * Notify provider about top-level device physical state changes 364 */ 365 status_t notifyDeviceStateChange( 366 hardware::hidl_bitfield<hardware::camera::provider::V2_5::DeviceState> 367 newDeviceState); 368 369 // Basic device information, common to all camera devices 370 struct DeviceInfo { 371 const std::string mName; // Full instance name 372 const std::string mId; // ID section of full name 373 const hardware::hidl_version mVersion; 374 const metadata_vendor_id_t mProviderTagid; 375 bool mIsLogicalCamera; 376 std::vector<std::string> mPhysicalIds; 377 hardware::CameraInfo mInfo; 378 sp<IBase> mSavedInterface; 379 bool mIsPublicallyHiddenSecureCamera = false; 380 381 const hardware::camera::common::V1_0::CameraResourceCost mResourceCost; 382 383 hardware::camera::common::V1_0::CameraDeviceStatus mStatus; 384 385 sp<ProviderInfo> mParentProvider; 386 hasFlashUnitProviderInfo::DeviceInfo387 bool hasFlashUnit() const { return mHasFlashUnit; } 388 virtual status_t setTorchMode(bool enabled) = 0; 389 virtual status_t getCameraInfo(hardware::CameraInfo *info) const = 0; 390 virtual bool isAPI1Compatible() const = 0; 391 virtual status_t dumpState(int fd) = 0; getCameraCharacteristicsProviderInfo::DeviceInfo392 virtual status_t getCameraCharacteristics(CameraMetadata *characteristics) const { 393 (void) characteristics; 394 return INVALID_OPERATION; 395 } getPhysicalCameraCharacteristicsProviderInfo::DeviceInfo396 virtual status_t getPhysicalCameraCharacteristics(const std::string& physicalCameraId, 397 CameraMetadata *characteristics) const { 398 (void) physicalCameraId; 399 (void) characteristics; 400 return INVALID_OPERATION; 401 } 402 isSessionConfigurationSupportedProviderInfo::DeviceInfo403 virtual status_t isSessionConfigurationSupported( 404 const hardware::camera::device::V3_4::StreamConfiguration &/*configuration*/, 405 bool * /*status*/) { 406 return INVALID_OPERATION; 407 } 408 409 template<class InterfaceT> 410 sp<InterfaceT> startDeviceInterface(); 411 DeviceInfoProviderInfo::DeviceInfo412 DeviceInfo(const std::string& name, const metadata_vendor_id_t tagId, 413 const std::string &id, const hardware::hidl_version& version, 414 const std::vector<std::string>& publicCameraIds, 415 const hardware::camera::common::V1_0::CameraResourceCost& resourceCost, 416 sp<ProviderInfo> parentProvider) : 417 mName(name), mId(id), mVersion(version), mProviderTagid(tagId), 418 mIsLogicalCamera(false), mResourceCost(resourceCost), 419 mStatus(hardware::camera::common::V1_0::CameraDeviceStatus::PRESENT), 420 mParentProvider(parentProvider), mHasFlashUnit(false), 421 mPublicCameraIds(publicCameraIds) {} 422 virtual ~DeviceInfo(); 423 protected: 424 bool mHasFlashUnit; 425 const std::vector<std::string>& mPublicCameraIds; 426 427 template<class InterfaceT> 428 static status_t setTorchMode(InterfaceT& interface, bool enabled); 429 430 template<class InterfaceT> setTorchModeForDeviceProviderInfo::DeviceInfo431 status_t setTorchModeForDevice(bool enabled) { 432 // Don't save the ICameraProvider interface here because we assume that this was 433 // called from CameraProviderManager::setTorchMode(), which does save it. 434 const sp<InterfaceT> interface = startDeviceInterface<InterfaceT>(); 435 return DeviceInfo::setTorchMode(interface, enabled); 436 } 437 }; 438 std::vector<std::unique_ptr<DeviceInfo>> mDevices; 439 std::unordered_set<std::string> mUniqueCameraIds; 440 int mUniqueDeviceCount; 441 std::vector<std::string> mUniqueAPI1CompatibleCameraIds; 442 // The initial public camera IDs published by the camera provider. 443 // Currently logical multi-camera is not supported for hot-plug camera. 444 // And we use this list to keep track of initial public camera IDs 445 // advertised by the provider, and to distinguish against "hidden" 446 // physical camera IDs. 447 std::vector<std::string> mProviderPublicCameraIds; 448 449 // HALv1-specific camera fields, including the actual device interface 450 struct DeviceInfo1 : public DeviceInfo { 451 typedef hardware::camera::device::V1_0::ICameraDevice InterfaceT; 452 453 virtual status_t setTorchMode(bool enabled) override; 454 virtual status_t getCameraInfo(hardware::CameraInfo *info) const override; 455 //In case of Device1Info assume that we are always API1 compatible isAPI1CompatibleProviderInfo::DeviceInfo1456 virtual bool isAPI1Compatible() const override { return true; } 457 virtual status_t dumpState(int fd) override; 458 DeviceInfo1(const std::string& name, const metadata_vendor_id_t tagId, 459 const std::string &id, uint16_t minorVersion, 460 const hardware::camera::common::V1_0::CameraResourceCost& resourceCost, 461 sp<ProviderInfo> parentProvider, 462 const std::vector<std::string>& publicCameraIds, 463 sp<InterfaceT> interface); 464 virtual ~DeviceInfo1(); 465 private: 466 CameraParameters2 mDefaultParameters; 467 status_t cacheCameraInfo(sp<InterfaceT> interface); 468 }; 469 470 // HALv3-specific camera fields, including the actual device interface 471 struct DeviceInfo3 : public DeviceInfo { 472 typedef hardware::camera::device::V3_2::ICameraDevice InterfaceT; 473 474 virtual status_t setTorchMode(bool enabled) override; 475 virtual status_t getCameraInfo(hardware::CameraInfo *info) const override; 476 virtual bool isAPI1Compatible() const override; 477 virtual status_t dumpState(int fd) override; 478 virtual status_t getCameraCharacteristics( 479 CameraMetadata *characteristics) const override; 480 virtual status_t getPhysicalCameraCharacteristics(const std::string& physicalCameraId, 481 CameraMetadata *characteristics) const override; 482 virtual status_t isSessionConfigurationSupported( 483 const hardware::camera::device::V3_4::StreamConfiguration &configuration, 484 bool *status /*out*/) 485 override; 486 487 DeviceInfo3(const std::string& name, const metadata_vendor_id_t tagId, 488 const std::string &id, uint16_t minorVersion, 489 const hardware::camera::common::V1_0::CameraResourceCost& resourceCost, 490 sp<ProviderInfo> parentProvider, 491 const std::vector<std::string>& publicCameraIds, sp<InterfaceT> interface); 492 virtual ~DeviceInfo3(); 493 private: 494 CameraMetadata mCameraCharacteristics; 495 std::unordered_map<std::string, CameraMetadata> mPhysicalCameraCharacteristics; 496 void queryPhysicalCameraIds(); 497 bool isPublicallyHiddenSecureCamera(); 498 status_t fixupMonochromeTags(); 499 status_t addDynamicDepthTags(); 500 static void getSupportedSizes(const CameraMetadata& ch, uint32_t tag, 501 android_pixel_format_t format, 502 std::vector<std::tuple<size_t, size_t>> *sizes /*out*/); 503 void getSupportedDurations( const CameraMetadata& ch, uint32_t tag, 504 android_pixel_format_t format, 505 const std::vector<std::tuple<size_t, size_t>>& sizes, 506 std::vector<int64_t> *durations/*out*/); 507 void getSupportedDynamicDepthDurations(const std::vector<int64_t>& depthDurations, 508 const std::vector<int64_t>& blobDurations, 509 std::vector<int64_t> *dynamicDepthDurations /*out*/); 510 static bool isDepthPhotoLibraryPresent(); 511 static void getSupportedDynamicDepthSizes( 512 const std::vector<std::tuple<size_t, size_t>>& blobSizes, 513 const std::vector<std::tuple<size_t, size_t>>& depthSizes, 514 std::vector<std::tuple<size_t, size_t>> *dynamicDepthSizes /*out*/, 515 std::vector<std::tuple<size_t, size_t>> *internalDepthSizes /*out*/); 516 status_t removeAvailableKeys(CameraMetadata& c, const std::vector<uint32_t>& keys, 517 uint32_t keyTag); 518 status_t fillHeicStreamCombinations(std::vector<int32_t>* outputs, 519 std::vector<int64_t>* durations, 520 std::vector<int64_t>* stallDurations, 521 const camera_metadata_entry& halStreamConfigs, 522 const camera_metadata_entry& halStreamDurations); 523 status_t deriveHeicTags(); 524 }; 525 526 private: 527 std::string mType; 528 uint32_t mId; 529 530 std::mutex mLock; 531 532 CameraProviderManager *mManager; 533 534 bool mInitialized = false; 535 536 // Templated method to instantiate the right kind of DeviceInfo and call the 537 // right CameraProvider getCameraDeviceInterface_* method. 538 template<class DeviceInfoT> 539 std::unique_ptr<DeviceInfo> initializeDeviceInfo(const std::string &name, 540 const metadata_vendor_id_t tagId, const std::string &id, 541 uint16_t minorVersion); 542 543 // Helper for initializeDeviceInfo to use the right CameraProvider get method. 544 template<class InterfaceT> 545 sp<InterfaceT> startDeviceInterface(const std::string &name); 546 547 // Parse provider instance name for type and id 548 static status_t parseProviderName(const std::string& name, 549 std::string *type, uint32_t *id); 550 551 // Parse device instance name for device version, type, and id. 552 static status_t parseDeviceName(const std::string& name, 553 uint16_t *major, uint16_t *minor, std::string *type, std::string *id); 554 555 // Generate vendor tag id 556 static metadata_vendor_id_t generateVendorTagId(const std::string &name); 557 558 void removeDevice(std::string id); 559 }; 560 561 // Utility to find a DeviceInfo by ID; pointer is only valid while mInterfaceMutex is held 562 // and the calling code doesn't mutate the list of providers or their lists of devices. 563 // Finds the first device of the given ID that falls within the requested version range 564 // minVersion <= deviceVersion < maxVersion 565 // No guarantees on the order of traversal 566 ProviderInfo::DeviceInfo* findDeviceInfoLocked(const std::string& id, 567 hardware::hidl_version minVersion = hardware::hidl_version{0,0}, 568 hardware::hidl_version maxVersion = hardware::hidl_version{1000,0}) const; 569 570 status_t addProviderLocked(const std::string& newProvider, bool expected = true); 571 572 status_t removeProvider(const std::string& provider); 573 sp<StatusListener> getStatusListener() const; 574 575 bool isValidDeviceLocked(const std::string &id, uint16_t majorVersion) const; 576 577 std::vector<sp<ProviderInfo>> mProviders; 578 579 void addProviderToMap( 580 const std::string &cameraId, 581 sp<hardware::camera::provider::V2_4::ICameraProvider> provider, 582 bool isTorchUsage); 583 void removeCameraIdFromMap( 584 std::unordered_map<std::string, sp<hardware::camera::provider::V2_4::ICameraProvider>> &map, 585 const std::string &cameraId); 586 587 static const char* deviceStatusToString( 588 const hardware::camera::common::V1_0::CameraDeviceStatus&); 589 static const char* torchStatusToString( 590 const hardware::camera::common::V1_0::TorchModeStatus&); 591 592 status_t getCameraCharacteristicsLocked(const std::string &id, 593 CameraMetadata* characteristics) const; 594 void filterLogicalCameraIdsLocked(std::vector<std::string>& deviceIds) const; 595 }; 596 597 } // namespace android 598 599 #endif 600