1*ec779b8eSAndroid Build Coastguard Worker /* 2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project 3*ec779b8eSAndroid Build Coastguard Worker * 4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*ec779b8eSAndroid Build Coastguard Worker * 8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*ec779b8eSAndroid Build Coastguard Worker * 10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License. 15*ec779b8eSAndroid Build Coastguard Worker */ 16*ec779b8eSAndroid Build Coastguard Worker 17*ec779b8eSAndroid Build Coastguard Worker #ifndef _ACAMERA_MANAGER_H 18*ec779b8eSAndroid Build Coastguard Worker #define _ACAMERA_MANAGER_H 19*ec779b8eSAndroid Build Coastguard Worker 20*ec779b8eSAndroid Build Coastguard Worker #include <camera/NdkCameraManager.h> 21*ec779b8eSAndroid Build Coastguard Worker 22*ec779b8eSAndroid Build Coastguard Worker #include <android-base/parseint.h> 23*ec779b8eSAndroid Build Coastguard Worker #include <android/companion/virtualnative/IVirtualDeviceManagerNative.h> 24*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/ICameraService.h> 25*ec779b8eSAndroid Build Coastguard Worker #include <android/hardware/BnCameraServiceListener.h> 26*ec779b8eSAndroid Build Coastguard Worker #include <camera/CameraMetadata.h> 27*ec779b8eSAndroid Build Coastguard Worker #include <binder/IServiceManager.h> 28*ec779b8eSAndroid Build Coastguard Worker #include <utils/StrongPointer.h> 29*ec779b8eSAndroid Build Coastguard Worker #include <utils/Mutex.h> 30*ec779b8eSAndroid Build Coastguard Worker 31*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/ALooper.h> 32*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AHandler.h> 33*ec779b8eSAndroid Build Coastguard Worker #include <media/stagefright/foundation/AMessage.h> 34*ec779b8eSAndroid Build Coastguard Worker 35*ec779b8eSAndroid Build Coastguard Worker #include <set> 36*ec779b8eSAndroid Build Coastguard Worker #include <map> 37*ec779b8eSAndroid Build Coastguard Worker 38*ec779b8eSAndroid Build Coastguard Worker namespace android { 39*ec779b8eSAndroid Build Coastguard Worker namespace acam { 40*ec779b8eSAndroid Build Coastguard Worker 41*ec779b8eSAndroid Build Coastguard Worker enum class DevicePolicy { 42*ec779b8eSAndroid Build Coastguard Worker DEVICE_POLICY_DEFAULT = 43*ec779b8eSAndroid Build Coastguard Worker ::android::companion::virtualnative::IVirtualDeviceManagerNative::DEVICE_POLICY_DEFAULT, 44*ec779b8eSAndroid Build Coastguard Worker DEVICE_POLICY_CUSTOM = 45*ec779b8eSAndroid Build Coastguard Worker ::android::companion::virtualnative::IVirtualDeviceManagerNative::DEVICE_POLICY_CUSTOM 46*ec779b8eSAndroid Build Coastguard Worker }; 47*ec779b8eSAndroid Build Coastguard Worker 48*ec779b8eSAndroid Build Coastguard Worker /** 49*ec779b8eSAndroid Build Coastguard Worker * Device context within which are cameras accessed. 50*ec779b8eSAndroid Build Coastguard Worker * 51*ec779b8eSAndroid Build Coastguard Worker * When constructed, the device id is set to id of virtual device corresponding to 52*ec779b8eSAndroid Build Coastguard Worker * caller's UID (or default device id if current app process is not running on virtual device). 53*ec779b8eSAndroid Build Coastguard Worker * 54*ec779b8eSAndroid Build Coastguard Worker * See getDeviceId() in Context.java for more context (no pun intented). 55*ec779b8eSAndroid Build Coastguard Worker */ 56*ec779b8eSAndroid Build Coastguard Worker struct DeviceContext { 57*ec779b8eSAndroid Build Coastguard Worker DeviceContext(); 58*ec779b8eSAndroid Build Coastguard Worker 59*ec779b8eSAndroid Build Coastguard Worker // Id of virtual device asociated with this context (or DEFAULT_DEVICE_ID = 0 in case 60*ec779b8eSAndroid Build Coastguard Worker // caller UID is not running on virtual device). 61*ec779b8eSAndroid Build Coastguard Worker int deviceId; 62*ec779b8eSAndroid Build Coastguard Worker // Device policy corresponding to VirtualDeviceParams.POLICY_TYPE_CAMERA: 63*ec779b8eSAndroid Build Coastguard Worker // 64*ec779b8eSAndroid Build Coastguard Worker // Can be either: 65*ec779b8eSAndroid Build Coastguard Worker // * (0) DEVICE_POLICY_DEFAULT - virtual devices have access to default device cameras. 66*ec779b8eSAndroid Build Coastguard Worker // * (1) DEVICE_POLICY_CUSTOM - virtual devices do not have access to default device cameras 67*ec779b8eSAndroid Build Coastguard Worker // and can only access virtual cameras owned by the same device. 68*ec779b8eSAndroid Build Coastguard Worker DevicePolicy policy; 69*ec779b8eSAndroid Build Coastguard Worker }; 70*ec779b8eSAndroid Build Coastguard Worker 71*ec779b8eSAndroid Build Coastguard Worker /** 72*ec779b8eSAndroid Build Coastguard Worker * Per-process singleton instance of CameraManger. Shared by all ACameraManager 73*ec779b8eSAndroid Build Coastguard Worker * instances. Created when first ACameraManager is created and destroyed when 74*ec779b8eSAndroid Build Coastguard Worker * all ACameraManager instances are deleted. 75*ec779b8eSAndroid Build Coastguard Worker * 76*ec779b8eSAndroid Build Coastguard Worker * TODO: maybe CameraManagerGlobal is better suited in libcameraclient? 77*ec779b8eSAndroid Build Coastguard Worker */ 78*ec779b8eSAndroid Build Coastguard Worker class CameraManagerGlobal final : public RefBase { 79*ec779b8eSAndroid Build Coastguard Worker public: 80*ec779b8eSAndroid Build Coastguard Worker static sp<CameraManagerGlobal> getInstance(); 81*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraService> getCameraService(); 82*ec779b8eSAndroid Build Coastguard Worker 83*ec779b8eSAndroid Build Coastguard Worker void registerAvailabilityCallback(const DeviceContext& context, 84*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_AvailabilityCallbacks* callback); 85*ec779b8eSAndroid Build Coastguard Worker void unregisterAvailabilityCallback(const DeviceContext& context, 86*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_AvailabilityCallbacks* callback); 87*ec779b8eSAndroid Build Coastguard Worker 88*ec779b8eSAndroid Build Coastguard Worker void registerExtendedAvailabilityCallback( 89*ec779b8eSAndroid Build Coastguard Worker const DeviceContext& context, 90*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_ExtendedAvailabilityCallbacks* callback); 91*ec779b8eSAndroid Build Coastguard Worker void unregisterExtendedAvailabilityCallback( 92*ec779b8eSAndroid Build Coastguard Worker const DeviceContext& context, 93*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_ExtendedAvailabilityCallbacks* callback); 94*ec779b8eSAndroid Build Coastguard Worker 95*ec779b8eSAndroid Build Coastguard Worker /** 96*ec779b8eSAndroid Build Coastguard Worker * Return camera IDs that support camera2 97*ec779b8eSAndroid Build Coastguard Worker */ 98*ec779b8eSAndroid Build Coastguard Worker void getCameraIdList(const DeviceContext& deviceContext, std::vector<std::string>* cameraIds); 99*ec779b8eSAndroid Build Coastguard Worker 100*ec779b8eSAndroid Build Coastguard Worker private: 101*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraService> mCameraService; 102*ec779b8eSAndroid Build Coastguard Worker const char* kCameraServiceName = "media.camera"; 103*ec779b8eSAndroid Build Coastguard Worker Mutex mLock; 104*ec779b8eSAndroid Build Coastguard Worker 105*ec779b8eSAndroid Build Coastguard Worker template <class T> 106*ec779b8eSAndroid Build Coastguard Worker void registerAvailCallback(const DeviceContext& deviceContext, const T* callback); 107*ec779b8eSAndroid Build Coastguard Worker 108*ec779b8eSAndroid Build Coastguard Worker bool setupVendorTags(sp<hardware::ICameraService> &cameraService); 109*ec779b8eSAndroid Build Coastguard Worker 110*ec779b8eSAndroid Build Coastguard Worker class DeathNotifier : public IBinder::DeathRecipient { 111*ec779b8eSAndroid Build Coastguard Worker public: DeathNotifier(CameraManagerGlobal * cm)112*ec779b8eSAndroid Build Coastguard Worker explicit DeathNotifier(CameraManagerGlobal* cm) : mCameraManager(cm) {} 113*ec779b8eSAndroid Build Coastguard Worker protected: 114*ec779b8eSAndroid Build Coastguard Worker // IBinder::DeathRecipient implementation 115*ec779b8eSAndroid Build Coastguard Worker virtual void binderDied(const wp<IBinder>& who); 116*ec779b8eSAndroid Build Coastguard Worker private: 117*ec779b8eSAndroid Build Coastguard Worker const wp<CameraManagerGlobal> mCameraManager; 118*ec779b8eSAndroid Build Coastguard Worker }; 119*ec779b8eSAndroid Build Coastguard Worker sp<DeathNotifier> mDeathNotifier; 120*ec779b8eSAndroid Build Coastguard Worker 121*ec779b8eSAndroid Build Coastguard Worker class CameraServiceListener final : public hardware::BnCameraServiceListener { 122*ec779b8eSAndroid Build Coastguard Worker public: CameraServiceListener(CameraManagerGlobal * cm)123*ec779b8eSAndroid Build Coastguard Worker explicit CameraServiceListener(CameraManagerGlobal* cm) : mCameraManager(cm) {} 124*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onStatusChanged(int32_t status, const std::string& cameraId, 125*ec779b8eSAndroid Build Coastguard Worker int32_t deviceId); 126*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onPhysicalCameraStatusChanged(int32_t status, 127*ec779b8eSAndroid Build Coastguard Worker const std::string& cameraId, const std::string& physicalCameraId, int32_t deviceId); 128*ec779b8eSAndroid Build Coastguard Worker 129*ec779b8eSAndroid Build Coastguard Worker // Torch API not implemented yet onTorchStatusChanged(int32_t,const std::string &,int32_t)130*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onTorchStatusChanged(int32_t, const std::string&, int32_t) { 131*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok(); 132*ec779b8eSAndroid Build Coastguard Worker } onTorchStrengthLevelChanged(const std::string &,int32_t,int32_t)133*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onTorchStrengthLevelChanged(const std::string&, int32_t, int32_t) { 134*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok(); 135*ec779b8eSAndroid Build Coastguard Worker } 136*ec779b8eSAndroid Build Coastguard Worker 137*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraAccessPrioritiesChanged(); onCameraOpened(const std::string &,const std::string &,int32_t)138*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraOpened(const std::string&, const std::string&, int32_t) { 139*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok(); 140*ec779b8eSAndroid Build Coastguard Worker } onCameraOpenedInSharedMode(const std::string &,const std::string &,int32_t,bool)141*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraOpenedInSharedMode(const std::string&, const std::string&, 142*ec779b8eSAndroid Build Coastguard Worker int32_t, bool) { 143*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok(); 144*ec779b8eSAndroid Build Coastguard Worker } onCameraClosed(const std::string &,int32_t)145*ec779b8eSAndroid Build Coastguard Worker virtual binder::Status onCameraClosed(const std::string&, int32_t) { 146*ec779b8eSAndroid Build Coastguard Worker return binder::Status::ok(); 147*ec779b8eSAndroid Build Coastguard Worker } 148*ec779b8eSAndroid Build Coastguard Worker 149*ec779b8eSAndroid Build Coastguard Worker private: 150*ec779b8eSAndroid Build Coastguard Worker const wp<CameraManagerGlobal> mCameraManager; 151*ec779b8eSAndroid Build Coastguard Worker }; 152*ec779b8eSAndroid Build Coastguard Worker sp<CameraServiceListener> mCameraServiceListener; 153*ec779b8eSAndroid Build Coastguard Worker 154*ec779b8eSAndroid Build Coastguard Worker // Wrapper of ACameraManager_AvailabilityCallbacks so we can store it in std::set 155*ec779b8eSAndroid Build Coastguard Worker struct Callback { CallbackCallback156*ec779b8eSAndroid Build Coastguard Worker explicit Callback(const DeviceContext& deviceContext, 157*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_AvailabilityCallbacks* callback) 158*ec779b8eSAndroid Build Coastguard Worker : mDeviceContext(deviceContext), 159*ec779b8eSAndroid Build Coastguard Worker mAvailable(callback->onCameraAvailable), 160*ec779b8eSAndroid Build Coastguard Worker mUnavailable(callback->onCameraUnavailable), 161*ec779b8eSAndroid Build Coastguard Worker mAccessPriorityChanged(nullptr), 162*ec779b8eSAndroid Build Coastguard Worker mPhysicalCamAvailable(nullptr), 163*ec779b8eSAndroid Build Coastguard Worker mPhysicalCamUnavailable(nullptr), 164*ec779b8eSAndroid Build Coastguard Worker mContext(callback->context) {} 165*ec779b8eSAndroid Build Coastguard Worker CallbackCallback166*ec779b8eSAndroid Build Coastguard Worker explicit Callback(const DeviceContext& deviceContext, 167*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_ExtendedAvailabilityCallbacks* callback) 168*ec779b8eSAndroid Build Coastguard Worker : mDeviceContext(deviceContext), 169*ec779b8eSAndroid Build Coastguard Worker mAvailable(callback->availabilityCallbacks.onCameraAvailable), 170*ec779b8eSAndroid Build Coastguard Worker mUnavailable(callback->availabilityCallbacks.onCameraUnavailable), 171*ec779b8eSAndroid Build Coastguard Worker mAccessPriorityChanged(callback->onCameraAccessPrioritiesChanged), 172*ec779b8eSAndroid Build Coastguard Worker mPhysicalCamAvailable(callback->onPhysicalCameraAvailable), 173*ec779b8eSAndroid Build Coastguard Worker mPhysicalCamUnavailable(callback->onPhysicalCameraUnavailable), 174*ec779b8eSAndroid Build Coastguard Worker mContext(callback->availabilityCallbacks.context) {} 175*ec779b8eSAndroid Build Coastguard Worker 176*ec779b8eSAndroid Build Coastguard Worker bool operator == (const Callback& other) const { 177*ec779b8eSAndroid Build Coastguard Worker return (mAvailable == other.mAvailable && mUnavailable == other.mUnavailable && 178*ec779b8eSAndroid Build Coastguard Worker mAccessPriorityChanged == other.mAccessPriorityChanged && 179*ec779b8eSAndroid Build Coastguard Worker mPhysicalCamAvailable == other.mPhysicalCamAvailable && 180*ec779b8eSAndroid Build Coastguard Worker mPhysicalCamUnavailable == other.mPhysicalCamUnavailable && 181*ec779b8eSAndroid Build Coastguard Worker mContext == other.mContext && 182*ec779b8eSAndroid Build Coastguard Worker mDeviceContext.deviceId == other.mDeviceContext.deviceId && 183*ec779b8eSAndroid Build Coastguard Worker mDeviceContext.policy == other.mDeviceContext.policy); 184*ec779b8eSAndroid Build Coastguard Worker } 185*ec779b8eSAndroid Build Coastguard Worker bool operator != (const Callback& other) const { 186*ec779b8eSAndroid Build Coastguard Worker return !(*this == other); 187*ec779b8eSAndroid Build Coastguard Worker } 188*ec779b8eSAndroid Build Coastguard Worker bool operator < (const Callback& other) const { 189*ec779b8eSAndroid Build Coastguard Worker #pragma GCC diagnostic push 190*ec779b8eSAndroid Build Coastguard Worker #pragma GCC diagnostic ignored "-Wordered-compare-function-pointers" 191*ec779b8eSAndroid Build Coastguard Worker if (*this == other) return false; 192*ec779b8eSAndroid Build Coastguard Worker if (mDeviceContext.deviceId != other.mDeviceContext.deviceId) { 193*ec779b8eSAndroid Build Coastguard Worker return mDeviceContext.deviceId < other.mDeviceContext.deviceId; 194*ec779b8eSAndroid Build Coastguard Worker } 195*ec779b8eSAndroid Build Coastguard Worker if (mContext != other.mContext) return mContext < other.mContext; 196*ec779b8eSAndroid Build Coastguard Worker if (mPhysicalCamAvailable != other.mPhysicalCamAvailable) { 197*ec779b8eSAndroid Build Coastguard Worker return mPhysicalCamAvailable < other.mPhysicalCamAvailable; 198*ec779b8eSAndroid Build Coastguard Worker } 199*ec779b8eSAndroid Build Coastguard Worker if (mPhysicalCamUnavailable != other.mPhysicalCamUnavailable) { 200*ec779b8eSAndroid Build Coastguard Worker return mPhysicalCamUnavailable < other.mPhysicalCamUnavailable; 201*ec779b8eSAndroid Build Coastguard Worker } 202*ec779b8eSAndroid Build Coastguard Worker if (mAccessPriorityChanged != other.mAccessPriorityChanged) { 203*ec779b8eSAndroid Build Coastguard Worker return mAccessPriorityChanged < other.mAccessPriorityChanged; 204*ec779b8eSAndroid Build Coastguard Worker } 205*ec779b8eSAndroid Build Coastguard Worker if (mAvailable != other.mAvailable) return mAvailable < other.mAvailable; 206*ec779b8eSAndroid Build Coastguard Worker return mUnavailable < other.mUnavailable; 207*ec779b8eSAndroid Build Coastguard Worker #pragma GCC diagnostic pop 208*ec779b8eSAndroid Build Coastguard Worker } 209*ec779b8eSAndroid Build Coastguard Worker bool operator > (const Callback& other) const { 210*ec779b8eSAndroid Build Coastguard Worker return (*this != other && !(*this < other)); 211*ec779b8eSAndroid Build Coastguard Worker } 212*ec779b8eSAndroid Build Coastguard Worker DeviceContext mDeviceContext; 213*ec779b8eSAndroid Build Coastguard Worker ACameraManager_AvailabilityCallback mAvailable; 214*ec779b8eSAndroid Build Coastguard Worker ACameraManager_AvailabilityCallback mUnavailable; 215*ec779b8eSAndroid Build Coastguard Worker ACameraManager_AccessPrioritiesChangedCallback mAccessPriorityChanged; 216*ec779b8eSAndroid Build Coastguard Worker ACameraManager_PhysicalCameraAvailabilityCallback mPhysicalCamAvailable; 217*ec779b8eSAndroid Build Coastguard Worker ACameraManager_PhysicalCameraAvailabilityCallback mPhysicalCamUnavailable; 218*ec779b8eSAndroid Build Coastguard Worker void* mContext; 219*ec779b8eSAndroid Build Coastguard Worker }; 220*ec779b8eSAndroid Build Coastguard Worker 221*ec779b8eSAndroid Build Coastguard Worker android::Condition mCallbacksCond; 222*ec779b8eSAndroid Build Coastguard Worker size_t mPendingCallbackCnt = 0; 223*ec779b8eSAndroid Build Coastguard Worker void onCallbackCalled(); 224*ec779b8eSAndroid Build Coastguard Worker void drainPendingCallbacksLocked(); 225*ec779b8eSAndroid Build Coastguard Worker 226*ec779b8eSAndroid Build Coastguard Worker std::set<Callback> mCallbacks; 227*ec779b8eSAndroid Build Coastguard Worker 228*ec779b8eSAndroid Build Coastguard Worker // definition of handler and message 229*ec779b8eSAndroid Build Coastguard Worker enum { 230*ec779b8eSAndroid Build Coastguard Worker kWhatSendSingleCallback, 231*ec779b8eSAndroid Build Coastguard Worker kWhatSendSingleAccessCallback, 232*ec779b8eSAndroid Build Coastguard Worker kWhatSendSinglePhysicalCameraCallback, 233*ec779b8eSAndroid Build Coastguard Worker }; 234*ec779b8eSAndroid Build Coastguard Worker static const char* kCameraIdKey; 235*ec779b8eSAndroid Build Coastguard Worker static const char* kPhysicalCameraIdKey; 236*ec779b8eSAndroid Build Coastguard Worker static const char* kCallbackFpKey; 237*ec779b8eSAndroid Build Coastguard Worker static const char* kContextKey; 238*ec779b8eSAndroid Build Coastguard Worker static const nsecs_t kCallbackDrainTimeout; 239*ec779b8eSAndroid Build Coastguard Worker class CallbackHandler : public AHandler { 240*ec779b8eSAndroid Build Coastguard Worker public: CallbackHandler(wp<CameraManagerGlobal> parent)241*ec779b8eSAndroid Build Coastguard Worker CallbackHandler(wp<CameraManagerGlobal> parent) : mParent(parent) {} 242*ec779b8eSAndroid Build Coastguard Worker void onMessageReceived(const sp<AMessage> &msg) override; 243*ec779b8eSAndroid Build Coastguard Worker 244*ec779b8eSAndroid Build Coastguard Worker private: 245*ec779b8eSAndroid Build Coastguard Worker wp<CameraManagerGlobal> mParent; 246*ec779b8eSAndroid Build Coastguard Worker void notifyParent(); 247*ec779b8eSAndroid Build Coastguard Worker void onMessageReceivedInternal(const sp<AMessage> &msg); 248*ec779b8eSAndroid Build Coastguard Worker }; 249*ec779b8eSAndroid Build Coastguard Worker sp<CallbackHandler> mHandler; 250*ec779b8eSAndroid Build Coastguard Worker sp<ALooper> mCbLooper; // Looper thread where callbacks actually happen on 251*ec779b8eSAndroid Build Coastguard Worker 252*ec779b8eSAndroid Build Coastguard Worker sp<hardware::ICameraService> getCameraServiceLocked(); 253*ec779b8eSAndroid Build Coastguard Worker void onCameraAccessPrioritiesChanged(); 254*ec779b8eSAndroid Build Coastguard Worker void onStatusChanged(int32_t status, int deviceId, const std::string& cameraId); 255*ec779b8eSAndroid Build Coastguard Worker void onStatusChangedLocked(int32_t status, int deviceId, const std::string& cameraId); 256*ec779b8eSAndroid Build Coastguard Worker void onStatusChanged(int32_t status, int deviceId, const std::string& cameraId, 257*ec779b8eSAndroid Build Coastguard Worker const std::string& physicalCameraId); 258*ec779b8eSAndroid Build Coastguard Worker void onStatusChangedLocked(int32_t status, int deviceId, const std::string& cameraId, 259*ec779b8eSAndroid Build Coastguard Worker const std::string& physicalCameraId); 260*ec779b8eSAndroid Build Coastguard Worker // Utils for status 261*ec779b8eSAndroid Build Coastguard Worker static bool validStatus(int32_t status); 262*ec779b8eSAndroid Build Coastguard Worker static bool isStatusAvailable(int32_t status); 263*ec779b8eSAndroid Build Coastguard Worker bool supportsCamera2ApiLocked(const std::string &cameraId); 264*ec779b8eSAndroid Build Coastguard Worker 265*ec779b8eSAndroid Build Coastguard Worker struct StatusAndHAL3Support { 266*ec779b8eSAndroid Build Coastguard Worker private: 267*ec779b8eSAndroid Build Coastguard Worker int32_t status = hardware::ICameraServiceListener::STATUS_NOT_PRESENT; 268*ec779b8eSAndroid Build Coastguard Worker mutable std::mutex mLock; 269*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> unavailablePhysicalIds; 270*ec779b8eSAndroid Build Coastguard Worker public: 271*ec779b8eSAndroid Build Coastguard Worker const bool supportsHAL3 = false; StatusAndHAL3SupportStatusAndHAL3Support272*ec779b8eSAndroid Build Coastguard Worker StatusAndHAL3Support(int32_t st, bool HAL3support): 273*ec779b8eSAndroid Build Coastguard Worker status(st), supportsHAL3(HAL3support) { }; 274*ec779b8eSAndroid Build Coastguard Worker StatusAndHAL3Support() = default; 275*ec779b8eSAndroid Build Coastguard Worker 276*ec779b8eSAndroid Build Coastguard Worker bool addUnavailablePhysicalId(const std::string& physicalCameraId); 277*ec779b8eSAndroid Build Coastguard Worker bool removeUnavailablePhysicalId(const std::string& physicalCameraId); 278*ec779b8eSAndroid Build Coastguard Worker int32_t getStatus(); 279*ec779b8eSAndroid Build Coastguard Worker void updateStatus(int32_t newStatus); 280*ec779b8eSAndroid Build Coastguard Worker std::set<std::string> getUnavailablePhysicalIds(); 281*ec779b8eSAndroid Build Coastguard Worker }; 282*ec779b8eSAndroid Build Coastguard Worker 283*ec779b8eSAndroid Build Coastguard Worker struct DeviceStatusMapKey { 284*ec779b8eSAndroid Build Coastguard Worker int deviceId; 285*ec779b8eSAndroid Build Coastguard Worker std::string cameraId; 286*ec779b8eSAndroid Build Coastguard Worker 287*ec779b8eSAndroid Build Coastguard Worker bool operator<(const DeviceStatusMapKey& other) const { 288*ec779b8eSAndroid Build Coastguard Worker if (deviceId != other.deviceId) { 289*ec779b8eSAndroid Build Coastguard Worker return deviceId < other.deviceId; 290*ec779b8eSAndroid Build Coastguard Worker } 291*ec779b8eSAndroid Build Coastguard Worker 292*ec779b8eSAndroid Build Coastguard Worker // The sort logic must match the logic in 293*ec779b8eSAndroid Build Coastguard Worker // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds 294*ec779b8eSAndroid Build Coastguard Worker uint32_t cameraIdUint = 0, otherCameraIdUint = 0; 295*ec779b8eSAndroid Build Coastguard Worker bool cameraIdIsUint = base::ParseUint(cameraId.c_str(), &cameraIdUint); 296*ec779b8eSAndroid Build Coastguard Worker bool otherCameraIdIsUint = base::ParseUint(other.cameraId.c_str(), &otherCameraIdUint); 297*ec779b8eSAndroid Build Coastguard Worker 298*ec779b8eSAndroid Build Coastguard Worker // Uint device IDs first 299*ec779b8eSAndroid Build Coastguard Worker if (cameraIdIsUint && otherCameraIdIsUint) { 300*ec779b8eSAndroid Build Coastguard Worker return cameraIdUint < otherCameraIdUint; 301*ec779b8eSAndroid Build Coastguard Worker } else if (cameraIdIsUint) { 302*ec779b8eSAndroid Build Coastguard Worker return true; 303*ec779b8eSAndroid Build Coastguard Worker } else if (otherCameraIdIsUint) { 304*ec779b8eSAndroid Build Coastguard Worker return false; 305*ec779b8eSAndroid Build Coastguard Worker } 306*ec779b8eSAndroid Build Coastguard Worker // Simple string compare if both id are not uint 307*ec779b8eSAndroid Build Coastguard Worker return cameraIdIsUint < otherCameraIdIsUint; 308*ec779b8eSAndroid Build Coastguard Worker } 309*ec779b8eSAndroid Build Coastguard Worker }; 310*ec779b8eSAndroid Build Coastguard Worker 311*ec779b8eSAndroid Build Coastguard Worker std::map<DeviceStatusMapKey, StatusAndHAL3Support> mDeviceStatusMap; 312*ec779b8eSAndroid Build Coastguard Worker 313*ec779b8eSAndroid Build Coastguard Worker // For the singleton instance 314*ec779b8eSAndroid Build Coastguard Worker static Mutex sLock; 315*ec779b8eSAndroid Build Coastguard Worker static wp<CameraManagerGlobal> sInstance; CameraManagerGlobal()316*ec779b8eSAndroid Build Coastguard Worker CameraManagerGlobal() {} 317*ec779b8eSAndroid Build Coastguard Worker ~CameraManagerGlobal(); 318*ec779b8eSAndroid Build Coastguard Worker }; 319*ec779b8eSAndroid Build Coastguard Worker 320*ec779b8eSAndroid Build Coastguard Worker } // namespace acam; 321*ec779b8eSAndroid Build Coastguard Worker } // namespace android; 322*ec779b8eSAndroid Build Coastguard Worker 323*ec779b8eSAndroid Build Coastguard Worker /** 324*ec779b8eSAndroid Build Coastguard Worker * ACameraManager opaque struct definition 325*ec779b8eSAndroid Build Coastguard Worker * Leave outside of android namespace because it's NDK struct 326*ec779b8eSAndroid Build Coastguard Worker */ 327*ec779b8eSAndroid Build Coastguard Worker struct ACameraManager { ACameraManagerACameraManager328*ec779b8eSAndroid Build Coastguard Worker ACameraManager() : mGlobalManager(android::acam::CameraManagerGlobal::getInstance()) {} 329*ec779b8eSAndroid Build Coastguard Worker camera_status_t getCameraIdList(ACameraIdList** cameraIdList); 330*ec779b8eSAndroid Build Coastguard Worker static void deleteCameraIdList(ACameraIdList* cameraIdList); 331*ec779b8eSAndroid Build Coastguard Worker 332*ec779b8eSAndroid Build Coastguard Worker camera_status_t getCameraCharacteristics( 333*ec779b8eSAndroid Build Coastguard Worker const char* cameraId, android::sp<ACameraMetadata>* characteristics); 334*ec779b8eSAndroid Build Coastguard Worker camera_status_t openCamera(const char* cameraId, bool sharedMode, 335*ec779b8eSAndroid Build Coastguard Worker ACameraDevice_StateCallbacks* callback, 336*ec779b8eSAndroid Build Coastguard Worker /*out*/ACameraDevice** device, /*out*/bool* primaryClient); 337*ec779b8eSAndroid Build Coastguard Worker void registerAvailabilityCallback(const ACameraManager_AvailabilityCallbacks* callback); 338*ec779b8eSAndroid Build Coastguard Worker void unregisterAvailabilityCallback(const ACameraManager_AvailabilityCallbacks* callback); 339*ec779b8eSAndroid Build Coastguard Worker void registerExtendedAvailabilityCallback( 340*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_ExtendedAvailabilityCallbacks* callback); 341*ec779b8eSAndroid Build Coastguard Worker void unregisterExtendedAvailabilityCallback( 342*ec779b8eSAndroid Build Coastguard Worker const ACameraManager_ExtendedAvailabilityCallbacks* callback); 343*ec779b8eSAndroid Build Coastguard Worker camera_status_t isCameraDeviceSharingSupported( 344*ec779b8eSAndroid Build Coastguard Worker const char* cameraId, bool* isSharingSupported); 345*ec779b8eSAndroid Build Coastguard Worker private: 346*ec779b8eSAndroid Build Coastguard Worker enum { 347*ec779b8eSAndroid Build Coastguard Worker kCameraIdListNotInit = -1 348*ec779b8eSAndroid Build Coastguard Worker }; 349*ec779b8eSAndroid Build Coastguard Worker android::Mutex mLock; 350*ec779b8eSAndroid Build Coastguard Worker android::sp<android::acam::CameraManagerGlobal> mGlobalManager; 351*ec779b8eSAndroid Build Coastguard Worker const android::acam::DeviceContext mDeviceContext; 352*ec779b8eSAndroid Build Coastguard Worker }; 353*ec779b8eSAndroid Build Coastguard Worker 354*ec779b8eSAndroid Build Coastguard Worker #endif //_ACAMERA_MANAGER_H 355