• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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                 &notification) = 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                 &notification) 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