xref: /aosp_15_r20/frameworks/av/camera/ndk/impl/ACameraManager.h (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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