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