Home | History | Annotate | Download | only in client2
      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/Compat.h>
     23 #include <utils/Errors.h>
     24 #include <utils/KeyedVector.h>
     25 #include <utils/Mutex.h>
     26 #include <utils/String8.h>
     27 #include <utils/Vector.h>
     28 
     29 #include <camera/CameraParameters.h>
     30 #include <camera/CameraParameters2.h>
     31 #include <camera/CameraMetadata.h>
     32 
     33 namespace android {
     34 namespace camera2 {
     35 
     36 /**
     37  * Current camera state; this is the full state of the Camera under the old
     38  * camera API (contents of the CameraParameters2 object in a more-efficient
     39  * format, plus other state). The enum values are mostly based off the
     40  * corresponding camera2 enums, not the camera1 strings. A few are defined here
     41  * if they don't cleanly map to camera2 values.
     42  */
     43 struct Parameters {
     44     /**
     45      * Parameters and other state
     46      */
     47     int cameraId;
     48     int cameraFacing;
     49 
     50     int previewWidth, previewHeight;
     51     int32_t previewFpsRange[2];
     52     int previewFormat;
     53 
     54     int previewTransform; // set by CAMERA_CMD_SET_DISPLAY_ORIENTATION
     55 
     56     int pictureWidth, pictureHeight;
     57     // Store the picture size before they are overriden by video snapshot
     58     int pictureWidthLastSet, pictureHeightLastSet;
     59     bool pictureSizeOverriden;
     60 
     61     int32_t jpegThumbSize[2];
     62     uint8_t jpegQuality, jpegThumbQuality;
     63     int32_t jpegRotation;
     64 
     65     bool gpsEnabled;
     66     double gpsCoordinates[3];
     67     int64_t gpsTimestamp;
     68     String8 gpsProcessingMethod;
     69 
     70     uint8_t wbMode;
     71     uint8_t effectMode;
     72     uint8_t antibandingMode;
     73     uint8_t sceneMode;
     74 
     75     enum flashMode_t {
     76         FLASH_MODE_OFF = 0,
     77         FLASH_MODE_AUTO,
     78         FLASH_MODE_ON,
     79         FLASH_MODE_TORCH,
     80         FLASH_MODE_RED_EYE = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE,
     81         FLASH_MODE_INVALID = -1
     82     } flashMode;
     83 
     84     enum focusMode_t {
     85         FOCUS_MODE_AUTO = ANDROID_CONTROL_AF_MODE_AUTO,
     86         FOCUS_MODE_MACRO = ANDROID_CONTROL_AF_MODE_MACRO,
     87         FOCUS_MODE_CONTINUOUS_VIDEO = ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO,
     88         FOCUS_MODE_CONTINUOUS_PICTURE = ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE,
     89         FOCUS_MODE_EDOF = ANDROID_CONTROL_AF_MODE_EDOF,
     90         FOCUS_MODE_INFINITY,
     91         FOCUS_MODE_FIXED,
     92         FOCUS_MODE_INVALID = -1
     93     } focusMode;
     94 
     95     uint8_t focusState; // Latest focus state from HAL
     96 
     97     // For use with triggerAfWithAuto quirk
     98     focusMode_t shadowFocusMode;
     99 
    100     struct Area {
    101         int left, top, right, bottom;
    102         int weight;
    103         Area() {}
    104         Area(int left, int top, int right, int bottom, int weight):
    105                 left(left), top(top), right(right), bottom(bottom),
    106                 weight(weight) {}
    107         bool isEmpty() const {
    108             return (left == 0) && (top == 0) && (right == 0) && (bottom == 0);
    109         }
    110     };
    111     Vector<Area> focusingAreas;
    112 
    113     struct Size {
    114         int32_t width;
    115         int32_t height;
    116     };
    117 
    118     struct FpsRange {
    119         int32_t low;
    120         int32_t high;
    121     };
    122 
    123     int32_t exposureCompensation;
    124     bool autoExposureLock;
    125     bool autoExposureLockAvailable;
    126     bool autoWhiteBalanceLock;
    127     bool autoWhiteBalanceLockAvailable;
    128 
    129     // 3A region types, for use with ANDROID_CONTROL_MAX_REGIONS
    130     enum region_t {
    131         REGION_AE = 0,
    132         REGION_AWB,
    133         REGION_AF,
    134         NUM_REGION // Number of region types
    135     } region;
    136 
    137     Vector<Area> meteringAreas;
    138 
    139     int zoom;
    140     bool zoomAvailable;
    141 
    142     int videoWidth, videoHeight, videoFormat;
    143     android_dataspace videoDataSpace;
    144 
    145     bool recordingHint;
    146     bool videoStabilization;
    147 
    148     CameraParameters2 params;
    149     String8 paramsFlattened;
    150 
    151     // These parameters are also part of the camera API-visible state, but not
    152     // directly listed in Camera.Parameters
    153     // One of ICamera::VIDEO_BUFFER_MODE_*
    154     int32_t videoBufferMode;
    155     bool playShutterSound;
    156     bool enableFaceDetect;
    157 
    158     bool enableFocusMoveMessages;
    159     int afTriggerCounter;
    160     int afStateCounter;
    161     int currentAfTriggerId;
    162     bool afInMotion;
    163 
    164     int precaptureTriggerCounter;
    165 
    166     int takePictureCounter;
    167 
    168     uint32_t previewCallbackFlags;
    169     bool previewCallbackOneShot;
    170     bool previewCallbackSurface;
    171 
    172     bool allowZslMode;
    173     // Whether the jpeg stream is slower than 30FPS and can slow down preview.
    174     // When slowJpegMode is true, allowZslMode must be false to avoid slowing down preview.
    175     bool slowJpegMode;
    176     // Whether ZSL reprocess is supported by the device.
    177     bool isZslReprocessPresent;
    178     // Whether the device supports enableZsl.
    179     bool isDeviceZslSupported;
    180     // Whether the device supports geometric distortion correction
    181     bool isDistortionCorrectionSupported;
    182 
    183     // Overall camera state
    184     enum State {
    185         DISCONNECTED,
    186         STOPPED,
    187         WAITING_FOR_PREVIEW_WINDOW,
    188         PREVIEW,
    189         RECORD,
    190         STILL_CAPTURE,
    191         VIDEO_SNAPSHOT
    192     } state;
    193 
    194     // Number of zoom steps to simulate
    195     static const unsigned int NUM_ZOOM_STEPS = 100;
    196     // Max preview size allowed
    197     // This is set to a 1:1 value to allow for any aspect ratio that has
    198     // a max long side of 1920 pixels
    199     static const unsigned int MAX_PREVIEW_WIDTH = 1920;
    200     static const unsigned int MAX_PREVIEW_HEIGHT = 1920;
    201     // Initial max preview/recording size bound
    202     static const int MAX_INITIAL_PREVIEW_WIDTH = 1920;
    203     static const int MAX_INITIAL_PREVIEW_HEIGHT = 1080;
    204     // Aspect ratio tolerance
    205     static const CONSTEXPR float ASPECT_RATIO_TOLERANCE = 0.001;
    206     // Threshold for slow jpeg mode
    207     static const int64_t kSlowJpegModeThreshold = 33400000LL; // 33.4 ms
    208     // Margin for checking FPS
    209     static const int32_t FPS_MARGIN = 1;
    210     // Max FPS for default parameters
    211     static const int32_t MAX_DEFAULT_FPS = 30;
    212     // Minimum FPS for a size to be listed in supported preview/video sizes
    213     // Set to slightly less than 30.0 to have some tolerance margin
    214     static constexpr double MIN_PREVIEW_RECORD_FPS = 29.97;
    215     // Maximum frame duration for a size to be listed in supported preview/video sizes
    216     static constexpr int64_t MAX_PREVIEW_RECORD_DURATION_NS = 1e9 / MIN_PREVIEW_RECORD_FPS;
    217 
    218     // Full static camera info, object owned by someone else, such as
    219     // Camera2Device.
    220     const CameraMetadata *info;
    221 
    222     // Fast-access static device information; this is a subset of the
    223     // information available through the staticInfo() method, used for
    224     // frequently-accessed values or values that have to be calculated from the
    225     // static information.
    226     struct DeviceInfo {
    227         int32_t arrayWidth;
    228         int32_t arrayHeight;
    229         int32_t bestStillCaptureFpsRange[2];
    230         uint8_t bestFaceDetectMode;
    231         int32_t maxFaces;
    232         struct OverrideModes {
    233             flashMode_t flashMode;
    234             uint8_t     wbMode;
    235             focusMode_t focusMode;
    236             OverrideModes():
    237                     flashMode(FLASH_MODE_INVALID),
    238                     wbMode(ANDROID_CONTROL_AWB_MODE_OFF),
    239                     focusMode(FOCUS_MODE_INVALID) {
    240             }
    241         };
    242         DefaultKeyedVector<uint8_t, OverrideModes> sceneModeOverrides;
    243         bool isExternalCamera;
    244         float minFocalLength;
    245         bool useFlexibleYuv;
    246         Size maxJpegSize;
    247         Size maxZslSize;
    248     } fastInfo;
    249 
    250     // Quirks information; these are short-lived flags to enable workarounds for
    251     // incomplete HAL implementations
    252     struct Quirks {
    253         bool triggerAfWithAuto;
    254         bool useZslFormat;
    255         bool meteringCropRegion;
    256         bool partialResults;
    257     } quirks;
    258 
    259     /**
    260      * Parameter manipulation and setup methods
    261      */
    262 
    263     Parameters(int cameraId, int cameraFacing);
    264     ~Parameters();
    265 
    266     // Sets up default parameters
    267     status_t initialize(const CameraMetadata *info, int deviceVersion);
    268 
    269     // Build fast-access device static info from static info
    270     status_t buildFastInfo();
    271     // Query for quirks from static info
    272     status_t buildQuirks();
    273 
    274     // Get entry from camera static characteristics information. min/maxCount
    275     // are used for error checking the number of values in the entry. 0 for
    276     // max/minCount means to do no bounds check in that direction. In case of
    277     // error, the entry data pointer is null and the count is 0.
    278     camera_metadata_ro_entry_t staticInfo(uint32_t tag,
    279             size_t minCount=0, size_t maxCount=0, bool required=true) const;
    280 
    281     // Validate and update camera parameters based on new settings
    282     status_t set(const String8 &paramString);
    283 
    284     // Retrieve the current settings
    285     String8 get() const;
    286 
    287     // Update passed-in request for common parameters
    288     status_t updateRequest(CameraMetadata *request) const;
    289 
    290     // Add/update JPEG entries in metadata
    291     status_t updateRequestJpeg(CameraMetadata *request) const;
    292 
    293     /* Helper functions to override jpeg size for video snapshot */
    294     // Override jpeg size by video size. Called during startRecording.
    295     status_t overrideJpegSizeByVideoSize();
    296     // Recover overridden jpeg size.  Called during stopRecording.
    297     status_t recoverOverriddenJpegSize();
    298     // if video snapshot size is currently overridden
    299     bool isJpegSizeOverridden();
    300     // whether zero shutter lag should be used for non-recording operation
    301     bool useZeroShutterLag() const;
    302 
    303     // Calculate the crop region rectangle, either tightly about the preview
    304     // resolution, or a region just based on the active array; both take
    305     // into account the current zoom level.
    306     struct CropRegion {
    307         float left;
    308         float top;
    309         float width;
    310         float height;
    311     };
    312     CropRegion calculateCropRegion(bool previewOnly) const;
    313 
    314     // Calculate the field of view of the high-resolution JPEG capture
    315     status_t calculatePictureFovs(float *horizFov, float *vertFov) const;
    316 
    317     // Static methods for debugging and converting between camera1 and camera2
    318     // parameters
    319 
    320     static const char *getStateName(State state);
    321 
    322     static int formatStringToEnum(const char *format);
    323     static const char *formatEnumToString(int format);
    324 
    325     static int wbModeStringToEnum(const char *wbMode);
    326     static const char* wbModeEnumToString(uint8_t wbMode);
    327     static int effectModeStringToEnum(const char *effectMode);
    328     static int abModeStringToEnum(const char *abMode);
    329     static int sceneModeStringToEnum(const char *sceneMode);
    330     static flashMode_t flashModeStringToEnum(const char *flashMode);
    331     static const char* flashModeEnumToString(flashMode_t flashMode);
    332     static focusMode_t focusModeStringToEnum(const char *focusMode);
    333     static const char* focusModeEnumToString(focusMode_t focusMode);
    334 
    335     static status_t parseAreas(const char *areasCStr,
    336             Vector<Area> *areas);
    337 
    338     enum AreaKind
    339     {
    340         AREA_KIND_FOCUS,
    341         AREA_KIND_METERING
    342     };
    343     status_t validateAreas(const Vector<Area> &areas,
    344                                   size_t maxRegions,
    345                                   AreaKind areaKind) const;
    346     static bool boolFromString(const char *boolStr);
    347 
    348     // Map from camera orientation + facing to gralloc transform enum
    349     static int degToTransform(int degrees, bool mirror);
    350 
    351     // API specifies FPS ranges are done in fixed point integer, with LSB = 0.001.
    352     // Note that this doesn't apply to the (deprecated) single FPS value.
    353     static const int kFpsToApiScale = 1000;
    354 
    355     // Transform from (-1000,-1000)-(1000,1000) normalized coords from camera
    356     // API to HAL3 (0,0)-(activePixelArray.width/height) coordinates
    357     int normalizedXToArray(int x) const;
    358     int normalizedYToArray(int y) const;
    359 
    360     // Transform from HAL3 (0,0)-(activePixelArray.width/height) coordinates to
    361     // (-1000,-1000)-(1000,1000) normalized coordinates given a scaler crop
    362     // region.
    363     int arrayXToNormalizedWithCrop(int x, const CropRegion &scalerCrop) const;
    364     int arrayYToNormalizedWithCrop(int y, const CropRegion &scalerCrop) const;
    365 
    366     struct Range {
    367         int min;
    368         int max;
    369     };
    370 
    371     int32_t fpsFromRange(int32_t min, int32_t max) const;
    372 
    373 private:
    374 
    375     // Convert from viewfinder crop-region relative array coordinates
    376     // to HAL3 sensor array coordinates
    377     int cropXToArray(int x) const;
    378     int cropYToArray(int y) const;
    379 
    380     // Convert from camera API (-1000,1000)-(1000,1000) normalized coords
    381     // to viewfinder crop-region relative array coordinates
    382     int normalizedXToCrop(int x) const;
    383     int normalizedYToCrop(int y) const;
    384 
    385     // Given a scaler crop region, calculate preview crop region based on
    386     // preview aspect ratio.
    387     CropRegion calculatePreviewCrop(const CropRegion &scalerCrop) const;
    388 
    389     Vector<Size> availablePreviewSizes;
    390     Vector<Size> availableVideoSizes;
    391     // Get size list (that are no larger than limit) from static metadata.
    392     // This method filtered size with minFrameDuration < MAX_PREVIEW_RECORD_DURATION_NS
    393     status_t getFilteredSizes(Size limit, Vector<Size> *sizes);
    394     // Get max size (from the size array) that matches the given aspect ratio.
    395     Size getMaxSizeForRatio(float ratio, const int32_t* sizeArray, size_t count);
    396 
    397     // Helper function for overriding jpeg size for video snapshot
    398     // Check if overridden jpeg size needs to be updated after Parameters::set.
    399     // The behavior of this function is tailored to the implementation of Parameters::set.
    400     // Do not use this function for other purpose.
    401     status_t updateOverriddenJpegSize();
    402 
    403     struct StreamConfiguration {
    404         int32_t format;
    405         int32_t width;
    406         int32_t height;
    407         int32_t isInput;
    408     };
    409 
    410     // Helper function extract available stream configuration
    411     // Only valid since device HAL version 3.2
    412     // returns an empty Vector if device HAL version does support it
    413     Vector<StreamConfiguration> getStreamConfigurations();
    414 
    415     // Helper function to get minimum frame duration for a jpeg size
    416     // return -1 if input jpeg size cannot be found in supported size list
    417     int64_t getJpegStreamMinFrameDurationNs(Parameters::Size size);
    418 
    419     // Helper function to get minimum frame duration for a size/format combination
    420     // return -1 if input size/format combination cannot be found.
    421     int64_t getMinFrameDurationNs(Parameters::Size size, int format);
    422 
    423     // Helper function to check if a given fps is supported by all the sizes with
    424     // the same format.
    425     // return true if the device doesn't support min frame duration metadata tag.
    426     bool isFpsSupported(const Vector<Size> &size, int format, int32_t fps);
    427 
    428     // Helper function to get non-duplicated available output formats
    429     SortedVector<int32_t> getAvailableOutputFormats();
    430     // Helper function to get available output jpeg sizes
    431     Vector<Size> getAvailableJpegSizes();
    432     // Helper function to get maximum size in input Size vector.
    433     // The maximum size is defined by comparing width first, when width ties comparing height.
    434     Size getMaxSize(const Vector<Size>& sizes);
    435 
    436     int mDeviceVersion;
    437 };
    438 
    439 // This class encapsulates the Parameters class so that it can only be accessed
    440 // by constructing a Lock object, which locks the SharedParameter's mutex.
    441 class SharedParameters {
    442   public:
    443     SharedParameters(int cameraId, int cameraFacing):
    444             mParameters(cameraId, cameraFacing) {
    445     }
    446 
    447     template<typename S, typename P>
    448     class BaseLock {
    449       public:
    450         explicit BaseLock(S &p):
    451                 mParameters(p.mParameters),
    452                 mSharedParameters(p) {
    453             mSharedParameters.mLock.lock();
    454         }
    455 
    456         ~BaseLock() {
    457             mSharedParameters.mLock.unlock();
    458         }
    459         P &mParameters;
    460       private:
    461         // Disallow copying, default construction
    462         BaseLock();
    463         BaseLock(const BaseLock &);
    464         BaseLock &operator=(const BaseLock &);
    465         S &mSharedParameters;
    466     };
    467     typedef BaseLock<SharedParameters, Parameters> Lock;
    468     typedef BaseLock<const SharedParameters, const Parameters> ReadLock;
    469 
    470     // Access static info, read-only and immutable, so no lock needed
    471     camera_metadata_ro_entry_t staticInfo(uint32_t tag,
    472             size_t minCount=0, size_t maxCount=0) const {
    473         return mParameters.staticInfo(tag, minCount, maxCount);
    474     }
    475 
    476     // Only use for dumping or other debugging
    477     const Parameters &unsafeAccess() {
    478         return mParameters;
    479     }
    480   private:
    481     Parameters mParameters;
    482     mutable Mutex mLock;
    483 };
    484 
    485 
    486 }; // namespace camera2
    487 }; // namespace android
    488 
    489 #endif
    490