xref: /aosp_15_r20/frameworks/av/services/camera/libcameraservice/CameraFlashlight.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 ANDROID_SERVERS_CAMERA_CAMERAFLASHLIGHT_H
18*ec779b8eSAndroid Build Coastguard Worker #define ANDROID_SERVERS_CAMERA_CAMERAFLASHLIGHT_H
19*ec779b8eSAndroid Build Coastguard Worker 
20*ec779b8eSAndroid Build Coastguard Worker #include <string>
21*ec779b8eSAndroid Build Coastguard Worker #include <gui/GLConsumer.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <gui/Surface.h>
23*ec779b8eSAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
24*ec779b8eSAndroid Build Coastguard Worker #include <utils/SortedVector.h>
25*ec779b8eSAndroid Build Coastguard Worker #include "common/CameraProviderManager.h"
26*ec779b8eSAndroid Build Coastguard Worker #include "common/CameraDeviceBase.h"
27*ec779b8eSAndroid Build Coastguard Worker 
28*ec779b8eSAndroid Build Coastguard Worker namespace android {
29*ec779b8eSAndroid Build Coastguard Worker 
30*ec779b8eSAndroid Build Coastguard Worker /**
31*ec779b8eSAndroid Build Coastguard Worker  * FlashControlBase is a base class for flash control. It defines the functions
32*ec779b8eSAndroid Build Coastguard Worker  * that a flash control for each camera module/device version should implement.
33*ec779b8eSAndroid Build Coastguard Worker  */
34*ec779b8eSAndroid Build Coastguard Worker class FlashControlBase : public virtual VirtualLightRefBase {
35*ec779b8eSAndroid Build Coastguard Worker     public:
36*ec779b8eSAndroid Build Coastguard Worker         virtual ~FlashControlBase();
37*ec779b8eSAndroid Build Coastguard Worker 
38*ec779b8eSAndroid Build Coastguard Worker         // Whether a camera device has a flash unit. Calling this function may
39*ec779b8eSAndroid Build Coastguard Worker         // cause the torch mode to be turned off in HAL v1 devices. If
40*ec779b8eSAndroid Build Coastguard Worker         // previously-on torch mode is turned off,
41*ec779b8eSAndroid Build Coastguard Worker         // callbacks.torch_mode_status_change() should be invoked.
42*ec779b8eSAndroid Build Coastguard Worker         virtual status_t hasFlashUnit(const std::string& cameraId,
43*ec779b8eSAndroid Build Coastguard Worker                     bool *hasFlash) = 0;
44*ec779b8eSAndroid Build Coastguard Worker 
45*ec779b8eSAndroid Build Coastguard Worker         // set the torch mode to on or off.
46*ec779b8eSAndroid Build Coastguard Worker         virtual status_t setTorchMode(const std::string& cameraId,
47*ec779b8eSAndroid Build Coastguard Worker                     bool enabled) = 0;
48*ec779b8eSAndroid Build Coastguard Worker 
49*ec779b8eSAndroid Build Coastguard Worker         // Change the brightness level of the torch. If the torch is OFF and
50*ec779b8eSAndroid Build Coastguard Worker         // torchStrength >= 1, then the torch will also be turned ON.
51*ec779b8eSAndroid Build Coastguard Worker         virtual status_t turnOnTorchWithStrengthLevel(const std::string& cameraId,
52*ec779b8eSAndroid Build Coastguard Worker                     int32_t torchStrength) = 0;
53*ec779b8eSAndroid Build Coastguard Worker 
54*ec779b8eSAndroid Build Coastguard Worker         // Returns the torch strength level.
55*ec779b8eSAndroid Build Coastguard Worker         virtual status_t getTorchStrengthLevel(const std::string& cameraId,
56*ec779b8eSAndroid Build Coastguard Worker                 int32_t* torchStrength) = 0;
57*ec779b8eSAndroid Build Coastguard Worker };
58*ec779b8eSAndroid Build Coastguard Worker 
59*ec779b8eSAndroid Build Coastguard Worker /**
60*ec779b8eSAndroid Build Coastguard Worker  * CameraFlashlight can be used by camera service to control flashflight.
61*ec779b8eSAndroid Build Coastguard Worker  */
62*ec779b8eSAndroid Build Coastguard Worker class CameraFlashlight : public virtual VirtualLightRefBase {
63*ec779b8eSAndroid Build Coastguard Worker     public:
64*ec779b8eSAndroid Build Coastguard Worker         CameraFlashlight(sp<CameraProviderManager> providerManager,
65*ec779b8eSAndroid Build Coastguard Worker                 CameraProviderManager::StatusListener* callbacks);
66*ec779b8eSAndroid Build Coastguard Worker         virtual ~CameraFlashlight();
67*ec779b8eSAndroid Build Coastguard Worker 
68*ec779b8eSAndroid Build Coastguard Worker         // Find all flash units. This must be called before other methods. All
69*ec779b8eSAndroid Build Coastguard Worker         // camera devices must be closed when it's called because HAL v1 devices
70*ec779b8eSAndroid Build Coastguard Worker         // need to be opened to query available flash modes.
71*ec779b8eSAndroid Build Coastguard Worker         status_t findFlashUnits();
72*ec779b8eSAndroid Build Coastguard Worker 
73*ec779b8eSAndroid Build Coastguard Worker         // Whether a camera device has a flash unit. Before findFlashUnits() is
74*ec779b8eSAndroid Build Coastguard Worker         // called, this function always returns false.
75*ec779b8eSAndroid Build Coastguard Worker         bool hasFlashUnit(const std::string& cameraId);
76*ec779b8eSAndroid Build Coastguard Worker 
77*ec779b8eSAndroid Build Coastguard Worker         // set the torch mode to on or off.
78*ec779b8eSAndroid Build Coastguard Worker         status_t setTorchMode(const std::string& cameraId, bool enabled);
79*ec779b8eSAndroid Build Coastguard Worker 
80*ec779b8eSAndroid Build Coastguard Worker         // Change the torch strength level of the flash unit in torch mode.
81*ec779b8eSAndroid Build Coastguard Worker         status_t turnOnTorchWithStrengthLevel(const std::string& cameraId, int32_t torchStrength);
82*ec779b8eSAndroid Build Coastguard Worker 
83*ec779b8eSAndroid Build Coastguard Worker         // Get the torch strength level
84*ec779b8eSAndroid Build Coastguard Worker         status_t getTorchStrengthLevel(const std::string& cameraId, int32_t* torchStrength);
85*ec779b8eSAndroid Build Coastguard Worker 
86*ec779b8eSAndroid Build Coastguard Worker         // Notify CameraFlashlight that camera service is going to open a camera
87*ec779b8eSAndroid Build Coastguard Worker         // device. CameraFlashlight will free the resources that may cause the
88*ec779b8eSAndroid Build Coastguard Worker         // camera open to fail. Camera service must call this function before
89*ec779b8eSAndroid Build Coastguard Worker         // opening a camera device.
90*ec779b8eSAndroid Build Coastguard Worker         status_t prepareDeviceOpen(const std::string& cameraId);
91*ec779b8eSAndroid Build Coastguard Worker 
92*ec779b8eSAndroid Build Coastguard Worker         // Notify CameraFlashlight that camera service has closed a camera
93*ec779b8eSAndroid Build Coastguard Worker         // device. CameraFlashlight may invoke callbacks for torch mode
94*ec779b8eSAndroid Build Coastguard Worker         // available depending on the implementation.
95*ec779b8eSAndroid Build Coastguard Worker         status_t deviceClosed(const std::string& cameraId);
96*ec779b8eSAndroid Build Coastguard Worker 
97*ec779b8eSAndroid Build Coastguard Worker     private:
98*ec779b8eSAndroid Build Coastguard Worker         // create flashlight control based on camera module API and camera
99*ec779b8eSAndroid Build Coastguard Worker         // device API versions.
100*ec779b8eSAndroid Build Coastguard Worker         status_t createFlashlightControl(const std::string& cameraId);
101*ec779b8eSAndroid Build Coastguard Worker 
102*ec779b8eSAndroid Build Coastguard Worker         // mLock should be locked.
103*ec779b8eSAndroid Build Coastguard Worker         bool hasFlashUnitLocked(const std::string& cameraId);
104*ec779b8eSAndroid Build Coastguard Worker 
105*ec779b8eSAndroid Build Coastguard Worker         // Check if flash control is in backward compatible mode (simulated torch API by
106*ec779b8eSAndroid Build Coastguard Worker         // opening cameras)
107*ec779b8eSAndroid Build Coastguard Worker         bool isBackwardCompatibleMode(const std::string& cameraId);
108*ec779b8eSAndroid Build Coastguard Worker 
109*ec779b8eSAndroid Build Coastguard Worker         sp<FlashControlBase> mFlashControl;
110*ec779b8eSAndroid Build Coastguard Worker 
111*ec779b8eSAndroid Build Coastguard Worker         sp<CameraProviderManager> mProviderManager;
112*ec779b8eSAndroid Build Coastguard Worker 
113*ec779b8eSAndroid Build Coastguard Worker         CameraProviderManager::StatusListener* mCallbacks;
114*ec779b8eSAndroid Build Coastguard Worker         SortedVector<std::string> mOpenedCameraIds;
115*ec779b8eSAndroid Build Coastguard Worker 
116*ec779b8eSAndroid Build Coastguard Worker         // camera id -> if it has a flash unit
117*ec779b8eSAndroid Build Coastguard Worker         KeyedVector<std::string, bool> mHasFlashlightMap;
118*ec779b8eSAndroid Build Coastguard Worker         bool mFlashlightMapInitialized;
119*ec779b8eSAndroid Build Coastguard Worker 
120*ec779b8eSAndroid Build Coastguard Worker         Mutex mLock; // protect CameraFlashlight API
121*ec779b8eSAndroid Build Coastguard Worker };
122*ec779b8eSAndroid Build Coastguard Worker 
123*ec779b8eSAndroid Build Coastguard Worker /**
124*ec779b8eSAndroid Build Coastguard Worker  * Flash control for camera provider v2.4 and above.
125*ec779b8eSAndroid Build Coastguard Worker  */
126*ec779b8eSAndroid Build Coastguard Worker class ProviderFlashControl : public FlashControlBase {
127*ec779b8eSAndroid Build Coastguard Worker     public:
128*ec779b8eSAndroid Build Coastguard Worker         ProviderFlashControl(sp<CameraProviderManager> providerManager);
129*ec779b8eSAndroid Build Coastguard Worker         virtual ~ProviderFlashControl();
130*ec779b8eSAndroid Build Coastguard Worker 
131*ec779b8eSAndroid Build Coastguard Worker         // FlashControlBase
132*ec779b8eSAndroid Build Coastguard Worker         status_t hasFlashUnit(const std::string& cameraId, bool *hasFlash);
133*ec779b8eSAndroid Build Coastguard Worker         status_t setTorchMode(const std::string& cameraId, bool enabled);
134*ec779b8eSAndroid Build Coastguard Worker         status_t turnOnTorchWithStrengthLevel(const std::string& cameraId, int32_t torchStrength);
135*ec779b8eSAndroid Build Coastguard Worker         status_t getTorchStrengthLevel(const std::string& cameraId, int32_t* torchStrength);
136*ec779b8eSAndroid Build Coastguard Worker 
137*ec779b8eSAndroid Build Coastguard Worker     private:
138*ec779b8eSAndroid Build Coastguard Worker         sp<CameraProviderManager> mProviderManager;
139*ec779b8eSAndroid Build Coastguard Worker 
140*ec779b8eSAndroid Build Coastguard Worker         Mutex mLock;
141*ec779b8eSAndroid Build Coastguard Worker };
142*ec779b8eSAndroid Build Coastguard Worker 
143*ec779b8eSAndroid Build Coastguard Worker } // namespace android
144*ec779b8eSAndroid Build Coastguard Worker 
145*ec779b8eSAndroid Build Coastguard Worker #endif
146