1 /* 2 * Copyright (C) 2012 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_CAMERA2PARAMETERS_H 18 #define ANDROID_SERVERS_CAMERA_CAMERA2PARAMETERS_H 19 20 #include <system/graphics.h> 21 22 #include <utils/Errors.h> 23 #include <utils/Mutex.h> 24 #include <utils/String8.h> 25 #include <utils/Vector.h> 26 #include <utils/KeyedVector.h> 27 #include <camera/CameraParameters.h> 28 29 #include "CameraMetadata.h" 30 31 namespace android { 32 namespace camera2 { 33 34 /** 35 * Current camera state; this is the full state of the Camera under the old 36 * camera API (contents of the CameraParameters object in a more-efficient 37 * format, plus other state). The enum values are mostly based off the 38 * corresponding camera2 enums, not the camera1 strings. A few are defined here 39 * if they don't cleanly map to camera2 values. 40 */ 41 struct Parameters { 42 /** 43 * Parameters and other state 44 */ 45 int cameraId; 46 int cameraFacing; 47 48 int previewWidth, previewHeight; 49 int32_t previewFpsRange[2]; 50 int previewFps; // deprecated, here only for tracking changes 51 int previewFormat; 52 53 int previewTransform; // set by CAMERA_CMD_SET_DISPLAY_ORIENTATION 54 55 int pictureWidth, pictureHeight; 56 57 int32_t jpegThumbSize[2]; 58 int32_t jpegQuality, jpegThumbQuality; 59 int32_t jpegRotation; 60 61 bool gpsEnabled; 62 double gpsCoordinates[3]; 63 int64_t gpsTimestamp; 64 String8 gpsProcessingMethod; 65 66 uint8_t wbMode; 67 uint8_t effectMode; 68 uint8_t antibandingMode; 69 uint8_t sceneMode; 70 71 enum flashMode_t { 72 FLASH_MODE_OFF = 0, 73 FLASH_MODE_AUTO, 74 FLASH_MODE_ON, 75 FLASH_MODE_TORCH, 76 FLASH_MODE_RED_EYE = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE, 77 FLASH_MODE_INVALID = -1 78 } flashMode; 79 80 enum focusMode_t { 81 FOCUS_MODE_AUTO = ANDROID_CONTROL_AF_AUTO, 82 FOCUS_MODE_MACRO = ANDROID_CONTROL_AF_MACRO, 83 FOCUS_MODE_CONTINUOUS_VIDEO = ANDROID_CONTROL_AF_CONTINUOUS_VIDEO, 84 FOCUS_MODE_CONTINUOUS_PICTURE = ANDROID_CONTROL_AF_CONTINUOUS_PICTURE, 85 FOCUS_MODE_EDOF = ANDROID_CONTROL_AF_EDOF, 86 FOCUS_MODE_INFINITY, 87 FOCUS_MODE_FIXED, 88 FOCUS_MODE_INVALID = -1 89 } focusMode; 90 91 uint8_t focusState; // Latest focus state from HAL 92 93 // For use with triggerAfWithAuto quirk 94 focusMode_t shadowFocusMode; 95 96 struct Area { 97 int left, top, right, bottom; 98 int weight; AreaParameters::Area99 Area() {} AreaParameters::Area100 Area(int left, int top, int right, int bottom, int weight): 101 left(left), top(top), right(right), bottom(bottom), 102 weight(weight) {} isEmptyParameters::Area103 bool isEmpty() const { 104 return (left == 0) && (top == 0) && (right == 0) && (bottom == 0); 105 } 106 }; 107 Vector<Area> focusingAreas; 108 109 int32_t exposureCompensation; 110 bool autoExposureLock; 111 bool autoWhiteBalanceLock; 112 113 Vector<Area> meteringAreas; 114 115 int zoom; 116 117 int videoWidth, videoHeight; 118 119 bool recordingHint; 120 bool videoStabilization; 121 122 enum lightFxMode_t { 123 LIGHTFX_NONE = 0, 124 LIGHTFX_LOWLIGHT, 125 LIGHTFX_HDR 126 } lightFx; 127 128 CameraParameters params; 129 String8 paramsFlattened; 130 131 // These parameters are also part of the camera API-visible state, but not 132 // directly listed in Camera.Parameters 133 bool storeMetadataInBuffers; 134 bool playShutterSound; 135 bool enableFaceDetect; 136 137 bool enableFocusMoveMessages; 138 int afTriggerCounter; 139 int currentAfTriggerId; 140 bool afInMotion; 141 142 int precaptureTriggerCounter; 143 144 uint32_t previewCallbackFlags; 145 bool previewCallbackOneShot; 146 147 bool zslMode; 148 149 // Overall camera state 150 enum State { 151 DISCONNECTED, 152 STOPPED, 153 WAITING_FOR_PREVIEW_WINDOW, 154 PREVIEW, 155 RECORD, 156 STILL_CAPTURE, 157 VIDEO_SNAPSHOT 158 } state; 159 160 // Number of zoom steps to simulate 161 static const unsigned int NUM_ZOOM_STEPS = 30; 162 163 // Full static camera info, object owned by someone else, such as 164 // Camera2Device. 165 const CameraMetadata *info; 166 167 // Fast-access static device information; this is a subset of the 168 // information available through the staticInfo() method, used for 169 // frequently-accessed values or values that have to be calculated from the 170 // static information. 171 struct DeviceInfo { 172 int32_t arrayWidth; 173 int32_t arrayHeight; 174 uint8_t bestFaceDetectMode; 175 int32_t maxFaces; 176 struct OverrideModes { 177 flashMode_t flashMode; 178 uint8_t wbMode; 179 focusMode_t focusMode; OverrideModesParameters::DeviceInfo::OverrideModes180 OverrideModes(): 181 flashMode(FLASH_MODE_INVALID), 182 wbMode(ANDROID_CONTROL_AWB_OFF), 183 focusMode(FOCUS_MODE_INVALID) { 184 } 185 }; 186 DefaultKeyedVector<uint8_t, OverrideModes> sceneModeOverrides; 187 } fastInfo; 188 189 // Quirks information; these are short-lived flags to enable workarounds for 190 // incomplete HAL implementations 191 struct Quirks { 192 bool triggerAfWithAuto; 193 bool useZslFormat; 194 bool meteringCropRegion; 195 } quirks; 196 197 /** 198 * Parameter manipulation and setup methods 199 */ 200 201 Parameters(int cameraId, int cameraFacing); 202 ~Parameters(); 203 204 // Sets up default parameters 205 status_t initialize(const CameraMetadata *info); 206 207 // Build fast-access device static info from static info 208 status_t buildFastInfo(); 209 // Query for quirks from static info 210 status_t buildQuirks(); 211 212 // Get entry from camera static characteristics information. min/maxCount 213 // are used for error checking the number of values in the entry. 0 for 214 // max/minCount means to do no bounds check in that direction. In case of 215 // error, the entry data pointer is null and the count is 0. 216 camera_metadata_ro_entry_t staticInfo(uint32_t tag, 217 size_t minCount=0, size_t maxCount=0) const; 218 219 // Validate and update camera parameters based on new settings 220 status_t set(const String8 ¶mString); 221 222 // Retrieve the current settings 223 String8 get() const; 224 225 // Update passed-in request for common parameters 226 status_t updateRequest(CameraMetadata *request) const; 227 228 // Add/update JPEG entries in metadata 229 status_t updateRequestJpeg(CameraMetadata *request) const; 230 231 // Calculate the crop region rectangle based on current stream sizes 232 struct CropRegion { 233 float left; 234 float top; 235 float width; 236 float height; 237 238 enum Outputs { 239 OUTPUT_PREVIEW = 0x01, 240 OUTPUT_VIDEO = 0x02, 241 OUTPUT_JPEG_THUMBNAIL = 0x04, 242 OUTPUT_PICTURE = 0x08, 243 }; 244 }; 245 CropRegion calculateCropRegion(CropRegion::Outputs outputs) const; 246 247 // Static methods for debugging and converting between camera1 and camera2 248 // parameters 249 250 static const char *getStateName(State state); 251 252 static int formatStringToEnum(const char *format); 253 static const char *formatEnumToString(int format); 254 255 static int wbModeStringToEnum(const char *wbMode); 256 static const char* wbModeEnumToString(uint8_t wbMode); 257 static int effectModeStringToEnum(const char *effectMode); 258 static int abModeStringToEnum(const char *abMode); 259 static int sceneModeStringToEnum(const char *sceneMode); 260 static flashMode_t flashModeStringToEnum(const char *flashMode); 261 static const char* flashModeEnumToString(flashMode_t flashMode); 262 static focusMode_t focusModeStringToEnum(const char *focusMode); 263 static const char* focusModeEnumToString(focusMode_t focusMode); 264 static status_t parseAreas(const char *areasCStr, 265 Vector<Area> *areas); 266 267 enum AreaKind 268 { 269 AREA_KIND_FOCUS, 270 AREA_KIND_METERING 271 }; 272 status_t validateAreas(const Vector<Area> &areas, 273 size_t maxRegions, 274 AreaKind areaKind) const; 275 static bool boolFromString(const char *boolStr); 276 277 // Map from camera orientation + facing to gralloc transform enum 278 static int degToTransform(int degrees, bool mirror); 279 280 // API specifies FPS ranges are done in fixed point integer, with LSB = 0.001. 281 // Note that this doesn't apply to the (deprecated) single FPS value. 282 static const int kFpsToApiScale = 1000; 283 284 // Transform between (-1000,-1000)-(1000,1000) normalized coords from camera 285 // API and HAL2 (0,0)-(activePixelArray.width/height) coordinates 286 int arrayXToNormalized(int width) const; 287 int arrayYToNormalized(int height) const; 288 int normalizedXToArray(int x) const; 289 int normalizedYToArray(int y) const; 290 291 struct Range { 292 int min; 293 int max; 294 }; 295 296 int32_t fpsFromRange(int32_t min, int32_t max) const; 297 298 private: 299 300 // Convert between HAL2 sensor array coordinates and 301 // viewfinder crop-region relative array coordinates 302 int cropXToArray(int x) const; 303 int cropYToArray(int y) const; 304 int arrayXToCrop(int x) const; 305 int arrayYToCrop(int y) const; 306 307 // Convert between viewfinder crop-region relative array coordinates 308 // and camera API (-1000,1000)-(1000,1000) normalized coords 309 int cropXToNormalized(int x) const; 310 int cropYToNormalized(int y) const; 311 int normalizedXToCrop(int x) const; 312 int normalizedYToCrop(int y) const; 313 }; 314 315 // This class encapsulates the Parameters class so that it can only be accessed 316 // by constructing a Lock object, which locks the SharedParameter's mutex. 317 class SharedParameters { 318 public: SharedParameters(int cameraId,int cameraFacing)319 SharedParameters(int cameraId, int cameraFacing): 320 mParameters(cameraId, cameraFacing) { 321 } 322 323 template<typename S, typename P> 324 class BaseLock { 325 public: BaseLock(S & p)326 BaseLock(S &p): 327 mParameters(p.mParameters), 328 mSharedParameters(p) { 329 mSharedParameters.mLock.lock(); 330 } 331 ~BaseLock()332 ~BaseLock() { 333 mSharedParameters.mLock.unlock(); 334 } 335 P &mParameters; 336 private: 337 // Disallow copying, default construction 338 BaseLock(); 339 BaseLock(const BaseLock &); 340 BaseLock &operator=(const BaseLock &); 341 S &mSharedParameters; 342 }; 343 typedef BaseLock<SharedParameters, Parameters> Lock; 344 typedef BaseLock<const SharedParameters, const Parameters> ReadLock; 345 346 // Access static info, read-only and immutable, so no lock needed 347 camera_metadata_ro_entry_t staticInfo(uint32_t tag, 348 size_t minCount=0, size_t maxCount=0) const { 349 return mParameters.staticInfo(tag, minCount, maxCount); 350 } 351 352 // Only use for dumping or other debugging unsafeAccess()353 const Parameters &unsafeAccess() { 354 return mParameters; 355 } 356 private: 357 Parameters mParameters; 358 mutable Mutex mLock; 359 }; 360 361 362 }; // namespace camera2 363 }; // namespace android 364 365 #endif 366