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