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 #define LOG_TAG "Camera2-Parameters"
     18 #define ATRACE_TAG ATRACE_TAG_CAMERA
     19 // #define LOG_NDEBUG 0
     20 
     21 #include <utils/Log.h>
     22 #include <utils/Trace.h>
     23 #include <utils/Vector.h>
     24 #include <utils/SortedVector.h>
     25 
     26 #include <math.h>
     27 #include <stdlib.h>
     28 #include <cutils/properties.h>
     29 
     30 #include "Parameters.h"
     31 #include "system/camera.h"
     32 #include "hardware/camera_common.h"
     33 #include <android/hardware/ICamera.h>
     34 #include <media/MediaProfiles.h>
     35 #include <media/mediarecorder.h>
     36 
     37 namespace android {
     38 namespace camera2 {
     39 
     40 Parameters::Parameters(int cameraId,
     41         int cameraFacing) :
     42         cameraId(cameraId),
     43         cameraFacing(cameraFacing),
     44         info(NULL),
     45         mDefaultSceneMode(ANDROID_CONTROL_SCENE_MODE_DISABLED) {
     46 }
     47 
     48 Parameters::~Parameters() {
     49 }
     50 
     51 status_t Parameters::initialize(CameraDeviceBase *device, int deviceVersion) {
     52     status_t res;
     53     if (device == nullptr) {
     54         ALOGE("%s: device is null!", __FUNCTION__);
     55         return BAD_VALUE;
     56     }
     57 
     58     const CameraMetadata& info = device->info();
     59     if (info.entryCount() == 0) {
     60         ALOGE("%s: No static information provided!", __FUNCTION__);
     61         return BAD_VALUE;
     62     }
     63     Parameters::info = &info;
     64     mDeviceVersion = deviceVersion;
     65 
     66     res = buildFastInfo(device);
     67     if (res != OK) return res;
     68 
     69     res = buildQuirks();
     70     if (res != OK) return res;
     71 
     72     Size maxPreviewSize = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
     73     // Treat the H.264 max size as the max supported video size.
     74     MediaProfiles *videoEncoderProfiles = MediaProfiles::getInstance();
     75     Vector<video_encoder> encoders = videoEncoderProfiles->getVideoEncoders();
     76     int32_t maxVideoWidth = 0;
     77     int32_t maxVideoHeight = 0;
     78     for (size_t i = 0; i < encoders.size(); i++) {
     79         int width = videoEncoderProfiles->getVideoEncoderParamByName(
     80                 "enc.vid.width.max", encoders[i]);
     81         int height = videoEncoderProfiles->getVideoEncoderParamByName(
     82                 "enc.vid.height.max", encoders[i]);
     83         // Treat width/height separately here to handle the case where different
     84         // profile might report max size of different aspect ratio
     85         if (width > maxVideoWidth) {
     86             maxVideoWidth = width;
     87         }
     88         if (height > maxVideoHeight) {
     89             maxVideoHeight = height;
     90         }
     91     }
     92     // This is just an upper bound and may not be an actually valid video size
     93     Size videoSizeUpperBound = {maxVideoWidth, maxVideoHeight};
     94 
     95     if (fastInfo.supportsPreferredConfigs) {
     96         maxPreviewSize = getMaxSize(getPreferredPreviewSizes());
     97         videoSizeUpperBound = getMaxSize(getPreferredVideoSizes());
     98     }
     99 
    100     res = getFilteredSizes(maxPreviewSize, &availablePreviewSizes);
    101     if (res != OK) return res;
    102     res = getFilteredSizes(videoSizeUpperBound, &availableVideoSizes);
    103     if (res != OK) return res;
    104 
    105     // Select initial preview and video size that's under the initial bound and
    106     // on the list of both preview and recording sizes
    107     previewWidth = 0;
    108     previewHeight = 0;
    109     for (size_t i = 0 ; i < availablePreviewSizes.size(); i++) {
    110         int newWidth = availablePreviewSizes[i].width;
    111         int newHeight = availablePreviewSizes[i].height;
    112         if (newWidth >= previewWidth && newHeight >= previewHeight &&
    113                 newWidth <= MAX_INITIAL_PREVIEW_WIDTH &&
    114                 newHeight <= MAX_INITIAL_PREVIEW_HEIGHT) {
    115             for (size_t j = 0; j < availableVideoSizes.size(); j++) {
    116                 if (availableVideoSizes[j].width == newWidth &&
    117                         availableVideoSizes[j].height == newHeight) {
    118                     previewWidth = newWidth;
    119                     previewHeight = newHeight;
    120                 }
    121             }
    122         }
    123     }
    124     if (previewWidth == 0) {
    125         ALOGE("%s: No initial preview size can be found!", __FUNCTION__);
    126         return BAD_VALUE;
    127     }
    128     videoWidth = previewWidth;
    129     videoHeight = previewHeight;
    130 
    131     params.setPreviewSize(previewWidth, previewHeight);
    132     params.setVideoSize(videoWidth, videoHeight);
    133     params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
    134             String8::format("%dx%d",
    135                     previewWidth, previewHeight));
    136     {
    137         String8 supportedPreviewSizes;
    138         for (size_t i = 0; i < availablePreviewSizes.size(); i++) {
    139             if (i != 0) supportedPreviewSizes += ",";
    140             supportedPreviewSizes += String8::format("%dx%d",
    141                     availablePreviewSizes[i].width,
    142                     availablePreviewSizes[i].height);
    143         }
    144         ALOGV("Supported preview sizes are: %s", supportedPreviewSizes.string());
    145         params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
    146                 supportedPreviewSizes);
    147 
    148         String8 supportedVideoSizes;
    149         for (size_t i = 0; i < availableVideoSizes.size(); i++) {
    150             if (i != 0) supportedVideoSizes += ",";
    151             supportedVideoSizes += String8::format("%dx%d",
    152                     availableVideoSizes[i].width,
    153                     availableVideoSizes[i].height);
    154         }
    155         ALOGV("Supported video sizes are: %s", supportedVideoSizes.string());
    156         params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
    157                 supportedVideoSizes);
    158     }
    159 
    160     camera_metadata_ro_entry_t availableFpsRanges =
    161         staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
    162     if (!availableFpsRanges.count) return NO_INIT;
    163 
    164     previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
    165     params.set(CameraParameters::KEY_PREVIEW_FORMAT,
    166             formatEnumToString(previewFormat)); // NV21
    167 
    168     previewTransform = degToTransform(0,
    169             cameraFacing == CAMERA_FACING_FRONT);
    170 
    171     {
    172         String8 supportedPreviewFormats;
    173         SortedVector<int32_t> outputFormats = getAvailableOutputFormats();
    174         bool addComma = false;
    175         for (size_t i=0; i < outputFormats.size(); i++) {
    176             if (addComma) supportedPreviewFormats += ",";
    177             addComma = true;
    178             switch (outputFormats[i]) {
    179             case HAL_PIXEL_FORMAT_YCbCr_422_SP:
    180                 supportedPreviewFormats +=
    181                     CameraParameters::PIXEL_FORMAT_YUV422SP;
    182                 break;
    183             case HAL_PIXEL_FORMAT_YCrCb_420_SP:
    184                 supportedPreviewFormats +=
    185                     CameraParameters::PIXEL_FORMAT_YUV420SP;
    186                 break;
    187             case HAL_PIXEL_FORMAT_YCbCr_422_I:
    188                 supportedPreviewFormats +=
    189                     CameraParameters::PIXEL_FORMAT_YUV422I;
    190                 break;
    191             case HAL_PIXEL_FORMAT_YV12:
    192                 supportedPreviewFormats +=
    193                     CameraParameters::PIXEL_FORMAT_YUV420P;
    194                 break;
    195             case HAL_PIXEL_FORMAT_RGB_565:
    196                 supportedPreviewFormats +=
    197                     CameraParameters::PIXEL_FORMAT_RGB565;
    198                 break;
    199             case HAL_PIXEL_FORMAT_RGBA_8888:
    200                 supportedPreviewFormats +=
    201                     CameraParameters::PIXEL_FORMAT_RGBA8888;
    202                 break;
    203             case HAL_PIXEL_FORMAT_YCbCr_420_888:
    204                 // Flexible YUV allows both YV12 and NV21
    205                 supportedPreviewFormats +=
    206                     CameraParameters::PIXEL_FORMAT_YUV420P;
    207                 supportedPreviewFormats += ",";
    208                 supportedPreviewFormats +=
    209                     CameraParameters::PIXEL_FORMAT_YUV420SP;
    210                 break;
    211             // Not advertizing JPEG, RAW16, etc, for preview formats
    212             case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
    213             case HAL_PIXEL_FORMAT_RAW16:
    214             case HAL_PIXEL_FORMAT_BLOB:
    215                 addComma = false;
    216                 break;
    217 
    218             default:
    219                 ALOGW("%s: Camera %d: Unknown preview format: %x",
    220                         __FUNCTION__, cameraId, outputFormats[i]);
    221                 addComma = false;
    222                 break;
    223             }
    224         }
    225         params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
    226                 supportedPreviewFormats);
    227     }
    228 
    229     previewFpsRange[0] = fastInfo.bestStillCaptureFpsRange[0];
    230     previewFpsRange[1] = fastInfo.bestStillCaptureFpsRange[1];
    231 
    232     // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
    233     // still have to do something sane for them
    234 
    235     // NOTE: Not scaled like FPS range values are.
    236     int previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]);
    237     params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
    238             previewFps);
    239 
    240     // PREVIEW_FPS_RANGE
    241     // -- Order matters. Set range after single value to so that a roundtrip
    242     //    of setParameters(getParameters()) would keep the FPS range in higher
    243     //    order.
    244     params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
    245             String8::format("%d,%d",
    246                     previewFpsRange[0] * kFpsToApiScale,
    247                     previewFpsRange[1] * kFpsToApiScale));
    248 
    249     {
    250         String8 supportedPreviewFpsRange;
    251         for (size_t i=0; i < availableFpsRanges.count; i += 2) {
    252             if (!isFpsSupported(availablePreviewSizes,
    253                 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, availableFpsRanges.data.i32[i+1])) {
    254                 continue;
    255             }
    256             if (supportedPreviewFpsRange.length() > 0) {
    257                 supportedPreviewFpsRange += ",";
    258             }
    259             supportedPreviewFpsRange += String8::format("(%d,%d)",
    260                     availableFpsRanges.data.i32[i] * kFpsToApiScale,
    261                     availableFpsRanges.data.i32[i+1] * kFpsToApiScale);
    262         }
    263         params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
    264                 supportedPreviewFpsRange);
    265     }
    266 
    267     {
    268         SortedVector<int32_t> sortedPreviewFrameRates;
    269 
    270         String8 supportedPreviewFrameRates;
    271         for (size_t i=0; i < availableFpsRanges.count; i += 2) {
    272             // from the [min, max] fps range use the max value
    273             int fps = fpsFromRange(availableFpsRanges.data.i32[i],
    274                                    availableFpsRanges.data.i32[i+1]);
    275             if (!isFpsSupported(availablePreviewSizes,
    276                     HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, fps)) {
    277                 continue;
    278             }
    279             // de-dupe frame rates
    280             if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) {
    281                 sortedPreviewFrameRates.add(fps);
    282             }
    283             else {
    284                 continue;
    285             }
    286 
    287             if (sortedPreviewFrameRates.size() > 1) {
    288                 supportedPreviewFrameRates += ",";
    289             }
    290 
    291             supportedPreviewFrameRates += String8::format("%d",
    292                     fps);
    293 
    294             ALOGV("%s: Supported preview frame rates: %s",
    295                     __FUNCTION__, supportedPreviewFrameRates.string());
    296         }
    297         params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
    298                 supportedPreviewFrameRates);
    299     }
    300 
    301     Vector<Size> availableJpegSizes = getAvailableJpegSizes();
    302     if (!availableJpegSizes.size()) return NO_INIT;
    303 
    304     pictureWidth = availableJpegSizes[0].width;
    305     pictureHeight = availableJpegSizes[0].height;
    306     if (fastInfo.supportsPreferredConfigs) {
    307         Size suggestedJpegSize = getMaxSize(getPreferredJpegSizes());
    308         pictureWidth = suggestedJpegSize.width;
    309         pictureHeight = suggestedJpegSize.height;
    310     }
    311     pictureWidthLastSet = pictureWidth;
    312     pictureHeightLastSet = pictureHeight;
    313     pictureSizeOverriden = false;
    314 
    315     params.setPictureSize(pictureWidth,
    316             pictureHeight);
    317 
    318     {
    319         String8 supportedPictureSizes;
    320         for (size_t i=0; i < availableJpegSizes.size(); i++) {
    321             if (i != 0) supportedPictureSizes += ",";
    322             supportedPictureSizes += String8::format("%dx%d",
    323                     availableJpegSizes[i].width,
    324                     availableJpegSizes[i].height);
    325         }
    326         params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
    327                 supportedPictureSizes);
    328     }
    329 
    330     params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
    331     params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
    332             CameraParameters::PIXEL_FORMAT_JPEG);
    333 
    334     camera_metadata_ro_entry_t availableJpegThumbnailSizes =
    335         staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
    336     if (!availableJpegThumbnailSizes.count) return NO_INIT;
    337 
    338     // Pick the largest thumbnail size that matches still image aspect ratio.
    339     ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0,
    340             "Invalid picture size, %d x %d", pictureWidth, pictureHeight);
    341     float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight;
    342     Size thumbnailSize =
    343             getMaxSizeForRatio(
    344                     picAspectRatio,
    345                     &availableJpegThumbnailSizes.data.i32[0],
    346                     availableJpegThumbnailSizes.count);
    347     jpegThumbSize[0] = thumbnailSize.width;
    348     jpegThumbSize[1] = thumbnailSize.height;
    349 
    350     params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
    351             jpegThumbSize[0]);
    352     params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
    353             jpegThumbSize[1]);
    354 
    355     {
    356         String8 supportedJpegThumbSizes;
    357         for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
    358             if (i != 0) supportedJpegThumbSizes += ",";
    359             supportedJpegThumbSizes += String8::format("%dx%d",
    360                     availableJpegThumbnailSizes.data.i32[i],
    361                     availableJpegThumbnailSizes.data.i32[i+1]);
    362         }
    363         params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
    364                 supportedJpegThumbSizes);
    365     }
    366 
    367     jpegThumbQuality = 90;
    368     params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
    369             jpegThumbQuality);
    370     jpegQuality = 90;
    371     params.set(CameraParameters::KEY_JPEG_QUALITY,
    372             jpegQuality);
    373     jpegRotation = 0;
    374     params.set(CameraParameters::KEY_ROTATION,
    375             jpegRotation);
    376 
    377     gpsEnabled = false;
    378     gpsCoordinates[0] = 0.0;
    379     gpsCoordinates[1] = 0.0;
    380     gpsCoordinates[2] = 0.0;
    381     gpsTimestamp = 0;
    382     gpsProcessingMethod = "unknown";
    383     // GPS fields in CameraParameters are not set by implementation
    384 
    385     wbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
    386     params.set(CameraParameters::KEY_WHITE_BALANCE,
    387             CameraParameters::WHITE_BALANCE_AUTO);
    388 
    389     camera_metadata_ro_entry_t availableWhiteBalanceModes =
    390         staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
    391     if (!availableWhiteBalanceModes.count) {
    392         params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
    393                 CameraParameters::WHITE_BALANCE_AUTO);
    394     } else {
    395         String8 supportedWhiteBalance;
    396         bool addComma = false;
    397         for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
    398             if (addComma) supportedWhiteBalance += ",";
    399             addComma = true;
    400             switch (availableWhiteBalanceModes.data.u8[i]) {
    401             case ANDROID_CONTROL_AWB_MODE_AUTO:
    402                 supportedWhiteBalance +=
    403                     CameraParameters::WHITE_BALANCE_AUTO;
    404                 break;
    405             case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
    406                 supportedWhiteBalance +=
    407                     CameraParameters::WHITE_BALANCE_INCANDESCENT;
    408                 break;
    409             case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
    410                 supportedWhiteBalance +=
    411                     CameraParameters::WHITE_BALANCE_FLUORESCENT;
    412                 break;
    413             case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
    414                 supportedWhiteBalance +=
    415                     CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
    416                 break;
    417             case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
    418                 supportedWhiteBalance +=
    419                     CameraParameters::WHITE_BALANCE_DAYLIGHT;
    420                 break;
    421             case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
    422                 supportedWhiteBalance +=
    423                     CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
    424                 break;
    425             case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
    426                 supportedWhiteBalance +=
    427                     CameraParameters::WHITE_BALANCE_TWILIGHT;
    428                 break;
    429             case ANDROID_CONTROL_AWB_MODE_SHADE:
    430                 supportedWhiteBalance +=
    431                     CameraParameters::WHITE_BALANCE_SHADE;
    432                 break;
    433             // Skipping values not mappable to v1 API
    434             case ANDROID_CONTROL_AWB_MODE_OFF:
    435                 addComma = false;
    436                 break;
    437             default:
    438                 ALOGW("%s: Camera %d: Unknown white balance value: %d",
    439                         __FUNCTION__, cameraId,
    440                         availableWhiteBalanceModes.data.u8[i]);
    441                 addComma = false;
    442                 break;
    443             }
    444         }
    445         params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
    446                 supportedWhiteBalance);
    447     }
    448 
    449     effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
    450     params.set(CameraParameters::KEY_EFFECT,
    451             CameraParameters::EFFECT_NONE);
    452 
    453     camera_metadata_ro_entry_t availableEffects =
    454         staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false);
    455     if (!availableEffects.count) {
    456         params.set(CameraParameters::KEY_SUPPORTED_EFFECTS,
    457                 CameraParameters::EFFECT_NONE);
    458     } else {
    459         String8 supportedEffects;
    460         bool addComma = false;
    461         for (size_t i=0; i < availableEffects.count; i++) {
    462             if (addComma) supportedEffects += ",";
    463             addComma = true;
    464             switch (availableEffects.data.u8[i]) {
    465                 case ANDROID_CONTROL_EFFECT_MODE_OFF:
    466                     supportedEffects +=
    467                         CameraParameters::EFFECT_NONE;
    468                     break;
    469                 case ANDROID_CONTROL_EFFECT_MODE_MONO:
    470                     supportedEffects +=
    471                         CameraParameters::EFFECT_MONO;
    472                     break;
    473                 case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE:
    474                     supportedEffects +=
    475                         CameraParameters::EFFECT_NEGATIVE;
    476                     break;
    477                 case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE:
    478                     supportedEffects +=
    479                         CameraParameters::EFFECT_SOLARIZE;
    480                     break;
    481                 case ANDROID_CONTROL_EFFECT_MODE_SEPIA:
    482                     supportedEffects +=
    483                         CameraParameters::EFFECT_SEPIA;
    484                     break;
    485                 case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE:
    486                     supportedEffects +=
    487                         CameraParameters::EFFECT_POSTERIZE;
    488                     break;
    489                 case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD:
    490                     supportedEffects +=
    491                         CameraParameters::EFFECT_WHITEBOARD;
    492                     break;
    493                 case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD:
    494                     supportedEffects +=
    495                         CameraParameters::EFFECT_BLACKBOARD;
    496                     break;
    497                 case ANDROID_CONTROL_EFFECT_MODE_AQUA:
    498                     supportedEffects +=
    499                         CameraParameters::EFFECT_AQUA;
    500                     break;
    501                 default:
    502                     ALOGW("%s: Camera %d: Unknown effect value: %d",
    503                         __FUNCTION__, cameraId, availableEffects.data.u8[i]);
    504                     addComma = false;
    505                     break;
    506             }
    507         }
    508         params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
    509     }
    510 
    511     antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
    512     params.set(CameraParameters::KEY_ANTIBANDING,
    513             CameraParameters::ANTIBANDING_AUTO);
    514 
    515     camera_metadata_ro_entry_t availableAntibandingModes =
    516         staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false);
    517     if (!availableAntibandingModes.count) {
    518         params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
    519                 CameraParameters::ANTIBANDING_OFF);
    520     } else {
    521         String8 supportedAntibanding;
    522         bool addComma = false;
    523         for (size_t i=0; i < availableAntibandingModes.count; i++) {
    524             if (addComma) supportedAntibanding += ",";
    525             addComma = true;
    526             switch (availableAntibandingModes.data.u8[i]) {
    527                 case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF:
    528                     supportedAntibanding +=
    529                         CameraParameters::ANTIBANDING_OFF;
    530                     break;
    531                 case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ:
    532                     supportedAntibanding +=
    533                         CameraParameters::ANTIBANDING_50HZ;
    534                     break;
    535                 case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ:
    536                     supportedAntibanding +=
    537                         CameraParameters::ANTIBANDING_60HZ;
    538                     break;
    539                 case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO:
    540                     supportedAntibanding +=
    541                         CameraParameters::ANTIBANDING_AUTO;
    542                     break;
    543                 default:
    544                     ALOGW("%s: Camera %d: Unknown antibanding value: %d",
    545                         __FUNCTION__, cameraId,
    546                             availableAntibandingModes.data.u8[i]);
    547                     addComma = false;
    548                     break;
    549             }
    550         }
    551         params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
    552                 supportedAntibanding);
    553     }
    554 
    555     sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
    556     params.set(CameraParameters::KEY_SCENE_MODE,
    557             CameraParameters::SCENE_MODE_AUTO);
    558 
    559     camera_metadata_ro_entry_t availableSceneModes =
    560         staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
    561     if (!availableSceneModes.count) {
    562         params.remove(CameraParameters::KEY_SCENE_MODE);
    563     } else {
    564         String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
    565         bool addComma = true;
    566         bool noSceneModes = false;
    567         for (size_t i=0; i < availableSceneModes.count; i++) {
    568             if (addComma) supportedSceneModes += ",";
    569             addComma = true;
    570             switch (availableSceneModes.data.u8[i]) {
    571                 case ANDROID_CONTROL_SCENE_MODE_DISABLED:
    572                     noSceneModes = true;
    573                     break;
    574                 case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
    575                     // Face priority can be used as alternate default if supported.
    576                     // Per API contract it shouldn't override the user set flash,
    577                     // white balance and focus modes.
    578                     mDefaultSceneMode = availableSceneModes.data.u8[i];
    579                     // Not in old API
    580                     addComma = false;
    581                     break;
    582                 case ANDROID_CONTROL_SCENE_MODE_ACTION:
    583                     supportedSceneModes +=
    584                         CameraParameters::SCENE_MODE_ACTION;
    585                     break;
    586                 case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
    587                     supportedSceneModes +=
    588                         CameraParameters::SCENE_MODE_PORTRAIT;
    589                     break;
    590                 case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
    591                     supportedSceneModes +=
    592                         CameraParameters::SCENE_MODE_LANDSCAPE;
    593                     break;
    594                 case ANDROID_CONTROL_SCENE_MODE_NIGHT:
    595                     supportedSceneModes +=
    596                         CameraParameters::SCENE_MODE_NIGHT;
    597                     break;
    598                 case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
    599                     supportedSceneModes +=
    600                         CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
    601                     break;
    602                 case ANDROID_CONTROL_SCENE_MODE_THEATRE:
    603                     supportedSceneModes +=
    604                         CameraParameters::SCENE_MODE_THEATRE;
    605                     break;
    606                 case ANDROID_CONTROL_SCENE_MODE_BEACH:
    607                     supportedSceneModes +=
    608                         CameraParameters::SCENE_MODE_BEACH;
    609                     break;
    610                 case ANDROID_CONTROL_SCENE_MODE_SNOW:
    611                     supportedSceneModes +=
    612                         CameraParameters::SCENE_MODE_SNOW;
    613                     break;
    614                 case ANDROID_CONTROL_SCENE_MODE_SUNSET:
    615                     supportedSceneModes +=
    616                         CameraParameters::SCENE_MODE_SUNSET;
    617                     break;
    618                 case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
    619                     supportedSceneModes +=
    620                         CameraParameters::SCENE_MODE_STEADYPHOTO;
    621                     break;
    622                 case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
    623                     supportedSceneModes +=
    624                         CameraParameters::SCENE_MODE_FIREWORKS;
    625                     break;
    626                 case ANDROID_CONTROL_SCENE_MODE_SPORTS:
    627                     supportedSceneModes +=
    628                         CameraParameters::SCENE_MODE_SPORTS;
    629                     break;
    630                 case ANDROID_CONTROL_SCENE_MODE_PARTY:
    631                     supportedSceneModes +=
    632                         CameraParameters::SCENE_MODE_PARTY;
    633                     break;
    634                 case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
    635                     supportedSceneModes +=
    636                         CameraParameters::SCENE_MODE_CANDLELIGHT;
    637                     break;
    638                 case ANDROID_CONTROL_SCENE_MODE_BARCODE:
    639                     supportedSceneModes +=
    640                         CameraParameters::SCENE_MODE_BARCODE;
    641                     break;
    642                 case ANDROID_CONTROL_SCENE_MODE_HDR:
    643                     supportedSceneModes +=
    644                         CameraParameters::SCENE_MODE_HDR;
    645                     break;
    646                 default:
    647                     ALOGW("%s: Camera %d: Unknown scene mode value: %d",
    648                         __FUNCTION__, cameraId,
    649                             availableSceneModes.data.u8[i]);
    650                     addComma = false;
    651                     break;
    652             }
    653         }
    654         if (!noSceneModes) {
    655             params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
    656                     supportedSceneModes);
    657         } else {
    658             params.remove(CameraParameters::KEY_SCENE_MODE);
    659         }
    660     }
    661 
    662     bool isFlashAvailable = false;
    663     camera_metadata_ro_entry_t flashAvailable =
    664         staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false);
    665     if (flashAvailable.count) {
    666         isFlashAvailable = flashAvailable.data.u8[0];
    667     }
    668 
    669     camera_metadata_ro_entry_t availableAeModes =
    670         staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false);
    671 
    672     flashMode = Parameters::FLASH_MODE_OFF;
    673     if (isFlashAvailable) {
    674         params.set(CameraParameters::KEY_FLASH_MODE,
    675                 CameraParameters::FLASH_MODE_OFF);
    676 
    677         String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
    678         supportedFlashModes = supportedFlashModes +
    679             "," + CameraParameters::FLASH_MODE_AUTO +
    680             "," + CameraParameters::FLASH_MODE_ON +
    681             "," + CameraParameters::FLASH_MODE_TORCH;
    682         for (size_t i=0; i < availableAeModes.count; i++) {
    683             if (availableAeModes.data.u8[i] ==
    684                     ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
    685                 supportedFlashModes = supportedFlashModes + "," +
    686                     CameraParameters::FLASH_MODE_RED_EYE;
    687                 break;
    688             }
    689         }
    690         params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
    691                 supportedFlashModes);
    692     } else {
    693         // No flash means null flash mode and supported flash modes keys, so
    694         // remove them just to be safe
    695         params.remove(CameraParameters::KEY_FLASH_MODE);
    696         params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
    697     }
    698 
    699     camera_metadata_ro_entry_t minFocusDistance =
    700         staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false);
    701 
    702     camera_metadata_ro_entry_t availableAfModes =
    703         staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false);
    704 
    705     if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) {
    706         // Fixed-focus lens
    707         focusMode = Parameters::FOCUS_MODE_FIXED;
    708         params.set(CameraParameters::KEY_FOCUS_MODE,
    709                 CameraParameters::FOCUS_MODE_FIXED);
    710         params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
    711                 CameraParameters::FOCUS_MODE_FIXED);
    712     } else {
    713         focusMode = Parameters::FOCUS_MODE_AUTO;
    714         params.set(CameraParameters::KEY_FOCUS_MODE,
    715                 CameraParameters::FOCUS_MODE_AUTO);
    716         String8 supportedFocusModes;
    717         bool addComma = false;
    718         camera_metadata_ro_entry_t focusDistanceCalibration =
    719             staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false);
    720 
    721         if (focusDistanceCalibration.count &&
    722                 focusDistanceCalibration.data.u8[0] !=
    723                 ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) {
    724             supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY;
    725             addComma = true;
    726         }
    727 
    728         for (size_t i=0; i < availableAfModes.count; i++) {
    729             if (addComma) supportedFocusModes += ",";
    730             addComma = true;
    731             switch (availableAfModes.data.u8[i]) {
    732                 case ANDROID_CONTROL_AF_MODE_AUTO:
    733                     supportedFocusModes +=
    734                         CameraParameters::FOCUS_MODE_AUTO;
    735                     break;
    736                 case ANDROID_CONTROL_AF_MODE_MACRO:
    737                     supportedFocusModes +=
    738                         CameraParameters::FOCUS_MODE_MACRO;
    739                     break;
    740                 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
    741                     supportedFocusModes +=
    742                         CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
    743                     break;
    744                 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
    745                     supportedFocusModes +=
    746                         CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
    747                     break;
    748                 case ANDROID_CONTROL_AF_MODE_EDOF:
    749                     supportedFocusModes +=
    750                         CameraParameters::FOCUS_MODE_EDOF;
    751                     break;
    752                 // Not supported in old API
    753                 case ANDROID_CONTROL_AF_MODE_OFF:
    754                     addComma = false;
    755                     break;
    756                 default:
    757                     ALOGW("%s: Camera %d: Unknown AF mode value: %d",
    758                         __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
    759                     addComma = false;
    760                     break;
    761             }
    762         }
    763         params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
    764                 supportedFocusModes);
    765     }
    766     focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
    767     shadowFocusMode = FOCUS_MODE_INVALID;
    768 
    769     aeState = ANDROID_CONTROL_AE_STATE_INACTIVE;
    770     camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS,
    771             Parameters::NUM_REGION, Parameters::NUM_REGION);
    772     if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT;
    773 
    774     int32_t maxNumFocusAreas = 0;
    775     if (focusMode != Parameters::FOCUS_MODE_FIXED) {
    776         maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF];
    777     }
    778     params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas);
    779     params.set(CameraParameters::KEY_FOCUS_AREAS,
    780             "(0,0,0,0,0)");
    781     focusingAreas.clear();
    782     focusingAreas.add(Parameters::Area(0,0,0,0,0));
    783 
    784     params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, fastInfo.defaultFocalLength);
    785 
    786     float horizFov, vertFov;
    787     res = calculatePictureFovs(&horizFov, &vertFov);
    788     if (res != OK) {
    789         ALOGE("%s: Can't calculate field of views!", __FUNCTION__);
    790         return res;
    791     }
    792 
    793     params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
    794     params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
    795 
    796     exposureCompensation = 0;
    797     params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
    798                 exposureCompensation);
    799 
    800     camera_metadata_ro_entry_t exposureCompensationRange =
    801         staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2);
    802     if (!exposureCompensationRange.count) return NO_INIT;
    803 
    804     params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
    805             exposureCompensationRange.data.i32[1]);
    806     params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
    807             exposureCompensationRange.data.i32[0]);
    808 
    809     camera_metadata_ro_entry_t exposureCompensationStep =
    810         staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1);
    811     if (!exposureCompensationStep.count) return NO_INIT;
    812 
    813     params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
    814             (float)exposureCompensationStep.data.r[0].numerator /
    815             exposureCompensationStep.data.r[0].denominator);
    816 
    817     autoExposureLock = false;
    818     autoExposureLockAvailable = false;
    819     camera_metadata_ro_entry_t exposureLockAvailable =
    820         staticInfo(ANDROID_CONTROL_AE_LOCK_AVAILABLE, 1, 1);
    821     if ((0 < exposureLockAvailable.count) &&
    822             (ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE ==
    823                     exposureLockAvailable.data.u8[0])) {
    824         params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
    825                 CameraParameters::FALSE);
    826         params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
    827                    CameraParameters::TRUE);
    828         autoExposureLockAvailable = true;
    829     } else {
    830         params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
    831                    CameraParameters::FALSE);
    832     }
    833 
    834     autoWhiteBalanceLock = false;
    835     autoWhiteBalanceLockAvailable = false;
    836     camera_metadata_ro_entry_t whitebalanceLockAvailable =
    837         staticInfo(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, 1, 1);
    838     if ((0 < whitebalanceLockAvailable.count) &&
    839             (ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE ==
    840                     whitebalanceLockAvailable.data.u8[0])) {
    841         params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
    842                 CameraParameters::FALSE);
    843         params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
    844                 CameraParameters::TRUE);
    845         autoWhiteBalanceLockAvailable = true;
    846     } else {
    847         params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
    848                 CameraParameters::FALSE);
    849     }
    850 
    851     meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
    852     params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
    853             max3aRegions.data.i32[Parameters::REGION_AE]);
    854     params.set(CameraParameters::KEY_METERING_AREAS,
    855             "(0,0,0,0,0)");
    856 
    857     zoom = 0;
    858     zoomAvailable = false;
    859     camera_metadata_ro_entry_t maxDigitalZoom =
    860         staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1);
    861     if (!maxDigitalZoom.count) return NO_INIT;
    862 
    863     if (fabs(maxDigitalZoom.data.f[0] - 1.f) > 0.00001f) {
    864         params.set(CameraParameters::KEY_ZOOM, zoom);
    865         params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
    866 
    867         {
    868             String8 zoomRatios;
    869             float zoom = 1.f;
    870             float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
    871                     (NUM_ZOOM_STEPS-1);
    872             bool addComma = false;
    873             for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
    874                 if (addComma) zoomRatios += ",";
    875                 addComma = true;
    876                 zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
    877                 zoom += zoomIncrement;
    878             }
    879             params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
    880         }
    881 
    882         params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
    883                 CameraParameters::TRUE);
    884         zoomAvailable = true;
    885     } else {
    886         params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
    887                 CameraParameters::FALSE);
    888     }
    889     params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
    890             CameraParameters::FALSE);
    891 
    892     params.set(CameraParameters::KEY_FOCUS_DISTANCES,
    893             "Infinity,Infinity,Infinity");
    894 
    895     params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
    896             fastInfo.maxFaces);
    897     params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
    898             0);
    899 
    900     params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
    901             CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
    902 
    903     recordingHint = false;
    904     params.set(CameraParameters::KEY_RECORDING_HINT,
    905             CameraParameters::FALSE);
    906 
    907     params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
    908             CameraParameters::TRUE);
    909 
    910     videoStabilization = false;
    911     params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
    912             CameraParameters::FALSE);
    913 
    914     camera_metadata_ro_entry_t availableVideoStabilizationModes =
    915         staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
    916                 false);
    917 
    918     if (availableVideoStabilizationModes.count > 1) {
    919         params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
    920                 CameraParameters::TRUE);
    921     } else {
    922         params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
    923                 CameraParameters::FALSE);
    924     }
    925 
    926     // Set up initial state for non-Camera.Parameters state variables
    927     videoFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
    928     videoDataSpace = HAL_DATASPACE_V0_BT709;
    929     videoBufferMode = hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV;
    930     playShutterSound = true;
    931     enableFaceDetect = false;
    932 
    933     enableFocusMoveMessages = false;
    934     afTriggerCounter = 1;
    935     afStateCounter = 0;
    936     currentAfTriggerId = -1;
    937     afInMotion = false;
    938 
    939     precaptureTriggerCounter = 1;
    940 
    941     takePictureCounter = 0;
    942 
    943     previewCallbackFlags = 0;
    944     previewCallbackOneShot = false;
    945     previewCallbackSurface = false;
    946 
    947     Size maxJpegSize = getMaxSize(getAvailableJpegSizes());
    948     int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(maxJpegSize);
    949 
    950     slowJpegMode = false;
    951     if (minFrameDurationNs > kSlowJpegModeThreshold) {
    952         slowJpegMode = true;
    953         // Slow jpeg devices does not support video snapshot without
    954         // slowing down preview.
    955         // TODO: support video size video snapshot only?
    956         params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
    957             CameraParameters::FALSE);
    958     }
    959 
    960     isZslReprocessPresent = false;
    961     camera_metadata_ro_entry_t availableCapabilities =
    962         staticInfo(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
    963     if (0 < availableCapabilities.count) {
    964         const uint8_t *caps = availableCapabilities.data.u8;
    965         for (size_t i = 0; i < availableCapabilities.count; i++) {
    966             if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ==
    967                     caps[i]) {
    968                 isZslReprocessPresent = true;
    969                 break;
    970             }
    971         }
    972     }
    973 
    974     isDistortionCorrectionSupported = false;
    975     camera_metadata_ro_entry_t distortionCorrectionModes =
    976             staticInfo(ANDROID_DISTORTION_CORRECTION_AVAILABLE_MODES);
    977     for (size_t i = 0; i < distortionCorrectionModes.count; i++) {
    978         if (distortionCorrectionModes.data.u8[i] !=
    979                 ANDROID_DISTORTION_CORRECTION_MODE_OFF) {
    980             isDistortionCorrectionSupported = true;
    981             break;
    982         }
    983     }
    984 
    985     if (isDeviceZslSupported || slowJpegMode ||
    986             property_get_bool("camera.disable_zsl_mode", false)) {
    987         ALOGI("Camera %d: Disabling ZSL mode", cameraId);
    988         allowZslMode = false;
    989     } else {
    990         allowZslMode = isZslReprocessPresent;
    991     }
    992 
    993     ALOGI("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode);
    994 
    995     state = STOPPED;
    996 
    997     paramsFlattened = params.flatten();
    998 
    999     return OK;
   1000 }
   1001 
   1002 String8 Parameters::get() const {
   1003     return paramsFlattened;
   1004 }
   1005 
   1006 status_t Parameters::buildFastInfo(CameraDeviceBase *device) {
   1007 
   1008     camera_metadata_ro_entry_t activeArraySize =
   1009         staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4);
   1010     if (!activeArraySize.count) return NO_INIT;
   1011     int32_t arrayWidth;
   1012     int32_t arrayHeight;
   1013     if (activeArraySize.count == 2) {
   1014         ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!",
   1015                 __FUNCTION__, cameraId);
   1016         arrayWidth = activeArraySize.data.i32[0];
   1017         arrayHeight = activeArraySize.data.i32[1];
   1018     } else if (activeArraySize.count == 4) {
   1019         arrayWidth = activeArraySize.data.i32[2];
   1020         arrayHeight = activeArraySize.data.i32[3];
   1021     } else return NO_INIT;
   1022 
   1023     fastInfo.supportsPreferredConfigs =
   1024         info->exists(ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS);
   1025 
   1026     // We'll set the target FPS range for still captures to be as wide
   1027     // as possible to give the HAL maximum latitude for exposure selection
   1028     camera_metadata_ro_entry_t availableFpsRanges =
   1029         staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
   1030     if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) {
   1031         return NO_INIT;
   1032     }
   1033 
   1034     // Get supported preview fps ranges, up to default maximum.
   1035     Vector<Size> supportedPreviewSizes;
   1036     Vector<FpsRange> supportedPreviewFpsRanges;
   1037     Size previewSizeBound = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
   1038     if (fastInfo.supportsPreferredConfigs) {
   1039         previewSizeBound = getMaxSize(getPreferredPreviewSizes());
   1040     }
   1041     status_t res = getFilteredSizes(previewSizeBound, &supportedPreviewSizes);
   1042     if (res != OK) return res;
   1043     for (size_t i=0; i < availableFpsRanges.count; i += 2) {
   1044         if (!isFpsSupported(supportedPreviewSizes,
   1045                 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, availableFpsRanges.data.i32[i+1]) ||
   1046                 availableFpsRanges.data.i32[i+1] > MAX_DEFAULT_FPS) {
   1047             continue;
   1048         }
   1049         FpsRange fpsRange = {availableFpsRanges.data.i32[i], availableFpsRanges.data.i32[i+1]};
   1050         supportedPreviewFpsRanges.add(fpsRange);
   1051     }
   1052     if (supportedPreviewFpsRanges.size() == 0) {
   1053         ALOGE("Supported preview fps range is empty");
   1054         return NO_INIT;
   1055     }
   1056 
   1057     int32_t bestStillCaptureFpsRange[2] = {
   1058         supportedPreviewFpsRanges[0].low, supportedPreviewFpsRanges[0].high
   1059     };
   1060     int32_t curRange =
   1061             bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0];
   1062     for (size_t i = 1; i < supportedPreviewFpsRanges.size(); i ++) {
   1063         int32_t nextRange =
   1064                 supportedPreviewFpsRanges[i].high -
   1065                 supportedPreviewFpsRanges[i].low;
   1066         if ( (nextRange > curRange) ||       // Maximize size of FPS range first
   1067                 (nextRange == curRange &&    // Then minimize low-end FPS
   1068                  bestStillCaptureFpsRange[0] > supportedPreviewFpsRanges[i].low)) {
   1069 
   1070             bestStillCaptureFpsRange[0] = supportedPreviewFpsRanges[i].low;
   1071             bestStillCaptureFpsRange[1] = supportedPreviewFpsRanges[i].high;
   1072             curRange = nextRange;
   1073         }
   1074     }
   1075 
   1076     camera_metadata_ro_entry_t availableFaceDetectModes =
   1077         staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0,
   1078                 false);
   1079 
   1080     uint8_t bestFaceDetectMode =
   1081         ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
   1082     for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
   1083         switch (availableFaceDetectModes.data.u8[i]) {
   1084             case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF:
   1085                 break;
   1086             case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE:
   1087                 if (bestFaceDetectMode !=
   1088                         ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
   1089                     bestFaceDetectMode =
   1090                         ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE;
   1091                 }
   1092                 break;
   1093             case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL:
   1094                 bestFaceDetectMode =
   1095                     ANDROID_STATISTICS_FACE_DETECT_MODE_FULL;
   1096                 break;
   1097             default:
   1098                 ALOGE("%s: Camera %d: Unknown face detect mode %d:",
   1099                         __FUNCTION__, cameraId,
   1100                         availableFaceDetectModes.data.u8[i]);
   1101                 return NO_INIT;
   1102         }
   1103     }
   1104 
   1105     int32_t maxFaces = 0;
   1106     camera_metadata_ro_entry_t maxFacesDetected =
   1107         staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false);
   1108     if (maxFacesDetected.count) {
   1109         maxFaces = maxFacesDetected.data.i32[0];
   1110     }
   1111 
   1112     camera_metadata_ro_entry_t availableSceneModes =
   1113         staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
   1114     camera_metadata_ro_entry_t sceneModeOverrides =
   1115         staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false);
   1116     camera_metadata_ro_entry_t minFocusDistance =
   1117         staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false);
   1118     bool fixedLens = minFocusDistance.count == 0 ||
   1119         minFocusDistance.data.f[0] == 0;
   1120 
   1121     camera_metadata_ro_entry_t focusDistanceCalibration =
   1122             staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0,
   1123                     false);
   1124     bool canFocusInfinity = (focusDistanceCalibration.count &&
   1125             focusDistanceCalibration.data.u8[0] !=
   1126             ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED);
   1127 
   1128     res = getDefaultFocalLength(device);
   1129     if (res != OK) return res;
   1130 
   1131     SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
   1132     if (!availableFormats.size()) return NO_INIT;
   1133 
   1134     if (sceneModeOverrides.count > 0) {
   1135         // sceneModeOverrides is defined to have 3 entries for each scene mode,
   1136         // which are AE, AWB, and AF override modes the HAL wants for that scene
   1137         // mode.
   1138         const size_t kModesPerSceneMode = 3;
   1139         if (sceneModeOverrides.count !=
   1140                 availableSceneModes.count * kModesPerSceneMode) {
   1141             ALOGE("%s: Camera %d: Scene mode override list is an "
   1142                     "unexpected size: %zu (expected %zu)", __FUNCTION__,
   1143                     cameraId, sceneModeOverrides.count,
   1144                     availableSceneModes.count * kModesPerSceneMode);
   1145             return NO_INIT;
   1146         }
   1147         for (size_t i = 0; i < availableSceneModes.count; i++) {
   1148             DeviceInfo::OverrideModes modes;
   1149             uint8_t aeMode =
   1150                     sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0];
   1151             switch(aeMode) {
   1152                 case ANDROID_CONTROL_AE_MODE_ON:
   1153                     modes.flashMode = FLASH_MODE_OFF;
   1154                     break;
   1155                 case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
   1156                     modes.flashMode = FLASH_MODE_AUTO;
   1157                     break;
   1158                 case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
   1159                     modes.flashMode = FLASH_MODE_ON;
   1160                     break;
   1161                 case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
   1162                     modes.flashMode = FLASH_MODE_RED_EYE;
   1163                     break;
   1164                 default:
   1165                     ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__,
   1166                             aeMode);
   1167                     modes.flashMode = FLASH_MODE_INVALID;
   1168                     break;
   1169             }
   1170             modes.wbMode =
   1171                     sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1];
   1172             uint8_t afMode =
   1173                     sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2];
   1174             switch(afMode) {
   1175                 case ANDROID_CONTROL_AF_MODE_OFF:
   1176                     if (!fixedLens && !canFocusInfinity) {
   1177                         ALOGE("%s: Camera %d: Scene mode override lists asks for"
   1178                                 " fixed focus on a device with focuser but not"
   1179                                 " calibrated for infinity focus", __FUNCTION__,
   1180                                 cameraId);
   1181                         return NO_INIT;
   1182                     }
   1183                     modes.focusMode = fixedLens ?
   1184                             FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY;
   1185                     break;
   1186                 case ANDROID_CONTROL_AF_MODE_AUTO:
   1187                 case ANDROID_CONTROL_AF_MODE_MACRO:
   1188                 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
   1189                 case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
   1190                 case ANDROID_CONTROL_AF_MODE_EDOF:
   1191                     modes.focusMode = static_cast<focusMode_t>(afMode);
   1192                     break;
   1193                 default:
   1194                     ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__,
   1195                             afMode);
   1196                     modes.focusMode = FOCUS_MODE_INVALID;
   1197                     break;
   1198             }
   1199             fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i],
   1200                     modes);
   1201         }
   1202     }
   1203 
   1204     fastInfo.arrayWidth = arrayWidth;
   1205     fastInfo.arrayHeight = arrayHeight;
   1206     fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0];
   1207     fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1];
   1208     fastInfo.bestFaceDetectMode = bestFaceDetectMode;
   1209     fastInfo.maxFaces = maxFaces;
   1210 
   1211     // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888
   1212     fastInfo.useFlexibleYuv = false;
   1213     for (size_t i = 0; i < availableFormats.size(); i++) {
   1214         if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) {
   1215             fastInfo.useFlexibleYuv = true;
   1216             break;
   1217         }
   1218     }
   1219     ALOGV("Camera %d: Flexible YUV %s supported",
   1220             cameraId, fastInfo.useFlexibleYuv ? "is" : "is not");
   1221 
   1222     fastInfo.maxJpegSize = getMaxSize(getAvailableJpegSizes());
   1223 
   1224     isZslReprocessPresent = false;
   1225     camera_metadata_ro_entry_t availableCapabilities =
   1226         staticInfo(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
   1227     if (0 < availableCapabilities.count) {
   1228         const uint8_t *caps = availableCapabilities.data.u8;
   1229         for (size_t i = 0; i < availableCapabilities.count; i++) {
   1230             if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ==
   1231                     caps[i]) {
   1232                 isZslReprocessPresent = true;
   1233                 break;
   1234             }
   1235         }
   1236     }
   1237     if (isZslReprocessPresent) {
   1238         Vector<StreamConfiguration> scs = getStreamConfigurations();
   1239         Size maxPrivInputSize = {0, 0};
   1240         for (const auto& sc : scs) {
   1241             if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT &&
   1242                     sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
   1243                 if (sc.width * sc.height > maxPrivInputSize.width * maxPrivInputSize.height) {
   1244                     maxPrivInputSize = {sc.width, sc.height};
   1245                 }
   1246             }
   1247         }
   1248         fastInfo.maxZslSize = maxPrivInputSize;
   1249     } else {
   1250         fastInfo.maxZslSize = {0, 0};
   1251     }
   1252 
   1253     return OK;
   1254 }
   1255 
   1256 status_t Parameters::buildQuirks() {
   1257     camera_metadata_ro_entry_t entry;
   1258     entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO);
   1259     quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1);
   1260     ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled",
   1261             cameraId);
   1262 
   1263     entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT);
   1264     quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1);
   1265     ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled",
   1266             cameraId);
   1267 
   1268     entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION);
   1269     quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1);
   1270     ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion"
   1271                 " enabled", cameraId);
   1272 
   1273     entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT);
   1274     quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1);
   1275     ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult"
   1276                 " enabled", cameraId);
   1277 
   1278     return OK;
   1279 }
   1280 
   1281 camera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
   1282         size_t minCount, size_t maxCount, bool required) const {
   1283     camera_metadata_ro_entry_t entry = info->find(tag);
   1284     const camera_metadata_t *metaBuffer = info->getAndLock();
   1285 
   1286     if (CC_UNLIKELY( entry.count == 0 ) && required) {
   1287         const char* tagSection = get_local_camera_metadata_section_name(tag,
   1288                 metaBuffer);
   1289         if (tagSection == NULL) tagSection = "<unknown>";
   1290         const char* tagName = get_local_camera_metadata_tag_name(tag,
   1291                 metaBuffer);
   1292         if (tagName == NULL) tagName = "<unknown>";
   1293 
   1294         ALOGE("Error finding static metadata entry '%s.%s' (%x)",
   1295                 tagSection, tagName, tag);
   1296     } else if (CC_UNLIKELY(
   1297             (minCount != 0 && entry.count < minCount) ||
   1298             (maxCount != 0 && entry.count > maxCount) ) ) {
   1299         const char* tagSection = get_local_camera_metadata_section_name(tag,
   1300                 metaBuffer);
   1301         if (tagSection == NULL) tagSection = "<unknown>";
   1302         const char* tagName = get_local_camera_metadata_tag_name(tag,
   1303                 metaBuffer);
   1304         if (tagName == NULL) tagName = "<unknown>";
   1305         ALOGE("Malformed static metadata entry '%s.%s' (%x):"
   1306                 "Expected between %zu and %zu values, but got %zu values",
   1307                 tagSection, tagName, tag, minCount, maxCount, entry.count);
   1308     }
   1309     info->unlock(metaBuffer);
   1310 
   1311     return entry;
   1312 }
   1313 
   1314 status_t Parameters::set(const String8& paramString) {
   1315     status_t res;
   1316 
   1317     CameraParameters2 newParams(paramString);
   1318 
   1319     // TODO: Currently ignoring any changes to supposedly read-only parameters
   1320     // such as supported preview sizes, etc. Should probably produce an error if
   1321     // they're changed.
   1322 
   1323     /** Extract and verify new parameters */
   1324 
   1325     size_t i;
   1326 
   1327     Parameters validatedParams(*this);
   1328 
   1329     // PREVIEW_SIZE
   1330     newParams.getPreviewSize(&validatedParams.previewWidth,
   1331             &validatedParams.previewHeight);
   1332 
   1333     if (validatedParams.previewWidth != previewWidth ||
   1334             validatedParams.previewHeight != previewHeight) {
   1335         if (state >= PREVIEW) {
   1336             ALOGE("%s: Preview size cannot be updated when preview "
   1337                     "is active! (Currently %d x %d, requested %d x %d",
   1338                     __FUNCTION__,
   1339                     previewWidth, previewHeight,
   1340                     validatedParams.previewWidth, validatedParams.previewHeight);
   1341             return BAD_VALUE;
   1342         }
   1343         for (i = 0; i < availablePreviewSizes.size(); i++) {
   1344             if ((availablePreviewSizes[i].width ==
   1345                     validatedParams.previewWidth) &&
   1346                 (availablePreviewSizes[i].height ==
   1347                     validatedParams.previewHeight)) break;
   1348         }
   1349         if (i == availablePreviewSizes.size()) {
   1350             ALOGE("%s: Requested preview size %d x %d is not supported",
   1351                     __FUNCTION__, validatedParams.previewWidth,
   1352                     validatedParams.previewHeight);
   1353             return BAD_VALUE;
   1354         }
   1355     }
   1356 
   1357     // RECORDING_HINT (always supported)
   1358     validatedParams.recordingHint = boolFromString(
   1359         newParams.get(CameraParameters::KEY_RECORDING_HINT) );
   1360     IF_ALOGV() { // Avoid unused variable warning
   1361         bool recordingHintChanged =
   1362                 validatedParams.recordingHint != recordingHint;
   1363         if (recordingHintChanged) {
   1364             ALOGV("%s: Recording hint changed to %d",
   1365                   __FUNCTION__, validatedParams.recordingHint);
   1366         }
   1367     }
   1368 
   1369     // PREVIEW_FPS_RANGE
   1370 
   1371     /**
   1372      * Use the single FPS value if it was set later than the range.
   1373      * Otherwise, use the range value.
   1374      */
   1375     bool fpsUseSingleValue;
   1376     {
   1377         const char *fpsRange, *fpsSingle;
   1378 
   1379         fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE);
   1380         fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
   1381 
   1382         /**
   1383          * Pick either the range or the single key if only one was set.
   1384          *
   1385          * If both are set, pick the one that has greater set order.
   1386          */
   1387         if (fpsRange == NULL && fpsSingle == NULL) {
   1388             ALOGE("%s: FPS was not set. One of %s or %s must be set.",
   1389                   __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE,
   1390                   CameraParameters::KEY_PREVIEW_FPS_RANGE);
   1391             return BAD_VALUE;
   1392         } else if (fpsRange == NULL) {
   1393             fpsUseSingleValue = true;
   1394             ALOGV("%s: FPS range not set, using FPS single value",
   1395                   __FUNCTION__);
   1396         } else if (fpsSingle == NULL) {
   1397             fpsUseSingleValue = false;
   1398             ALOGV("%s: FPS single not set, using FPS range value",
   1399                   __FUNCTION__);
   1400         } else {
   1401             int fpsKeyOrder;
   1402             res = newParams.compareSetOrder(
   1403                     CameraParameters::KEY_PREVIEW_FRAME_RATE,
   1404                     CameraParameters::KEY_PREVIEW_FPS_RANGE,
   1405                     &fpsKeyOrder);
   1406             LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys");
   1407 
   1408             fpsUseSingleValue = (fpsKeyOrder > 0);
   1409 
   1410         }
   1411 
   1412         ALOGV("%s: Preview FPS value is used from '%s'",
   1413               __FUNCTION__, fpsUseSingleValue ? "single" : "range");
   1414     }
   1415     newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
   1416             &validatedParams.previewFpsRange[1]);
   1417 
   1418     validatedParams.previewFpsRange[0] /= kFpsToApiScale;
   1419     validatedParams.previewFpsRange[1] /= kFpsToApiScale;
   1420 
   1421     // Ignore the FPS range if the FPS single has higher precedence
   1422     if (!fpsUseSingleValue) {
   1423         ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__,
   1424                 validatedParams.previewFpsRange[0],
   1425                 validatedParams.previewFpsRange[1]);
   1426 
   1427         camera_metadata_ro_entry_t availablePreviewFpsRanges =
   1428             staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
   1429         for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
   1430             if ((availablePreviewFpsRanges.data.i32[i] ==
   1431                     validatedParams.previewFpsRange[0]) &&
   1432                 (availablePreviewFpsRanges.data.i32[i+1] ==
   1433                     validatedParams.previewFpsRange[1]) ) {
   1434                 break;
   1435             }
   1436         }
   1437         if (i == availablePreviewFpsRanges.count) {
   1438             ALOGE("%s: Requested preview FPS range %d - %d is not supported",
   1439                 __FUNCTION__, validatedParams.previewFpsRange[0],
   1440                     validatedParams.previewFpsRange[1]);
   1441             return BAD_VALUE;
   1442         }
   1443     }
   1444 
   1445     // PREVIEW_FORMAT
   1446     validatedParams.previewFormat =
   1447             formatStringToEnum(newParams.getPreviewFormat());
   1448     if (validatedParams.previewFormat != previewFormat) {
   1449         if (state >= PREVIEW) {
   1450             ALOGE("%s: Preview format cannot be updated when preview "
   1451                     "is active!", __FUNCTION__);
   1452             return BAD_VALUE;
   1453         }
   1454         SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
   1455         // If using flexible YUV, always support NV21/YV12. Otherwise, check
   1456         // HAL's list.
   1457         if (! (fastInfo.useFlexibleYuv &&
   1458                 (validatedParams.previewFormat ==
   1459                         HAL_PIXEL_FORMAT_YCrCb_420_SP ||
   1460                  validatedParams.previewFormat ==
   1461                         HAL_PIXEL_FORMAT_YV12) ) ) {
   1462             // Not using flexible YUV format, so check explicitly
   1463             for (i = 0; i < availableFormats.size(); i++) {
   1464                 if (availableFormats[i] == validatedParams.previewFormat) break;
   1465             }
   1466             if (i == availableFormats.size()) {
   1467                 ALOGE("%s: Requested preview format %s (0x%x) is not supported",
   1468                         __FUNCTION__, newParams.getPreviewFormat(),
   1469                         validatedParams.previewFormat);
   1470                 return BAD_VALUE;
   1471             }
   1472         }
   1473     }
   1474 
   1475     // PREVIEW_FRAME_RATE Deprecated
   1476     // - Use only if the single FPS value was set later than the FPS range
   1477     if (fpsUseSingleValue) {
   1478         int previewFps = newParams.getPreviewFrameRate();
   1479         ALOGV("%s: Preview FPS single value requested: %d",
   1480               __FUNCTION__, previewFps);
   1481         {
   1482             camera_metadata_ro_entry_t availableFrameRates =
   1483                 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
   1484             /**
   1485               * If recording hint is set, find the range that encompasses
   1486               * previewFps with the largest min index.
   1487               *
   1488               * If recording hint is not set, find the range with previewFps
   1489               * with the smallest min index.
   1490               *
   1491               * Either way, in case of multiple ranges, break the tie by
   1492               * selecting the smaller range.
   1493               *
   1494               * Always select range within 30fps if one exists.
   1495               */
   1496 
   1497             // all ranges which have previewFps
   1498             Vector<Range> candidateRanges;
   1499             Vector<Range> candidateFastRanges;
   1500             for (i = 0; i < availableFrameRates.count; i+=2) {
   1501                 Range r = {
   1502                             availableFrameRates.data.i32[i],
   1503                             availableFrameRates.data.i32[i+1]
   1504                 };
   1505                 if (!isFpsSupported(availablePreviewSizes,
   1506                         HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, r.max)) {
   1507                     continue;
   1508                 }
   1509 
   1510                 if (r.min <= previewFps && previewFps <= r.max) {
   1511                     if (r.max <= MAX_DEFAULT_FPS) {
   1512                         candidateRanges.push(r);
   1513                     } else {
   1514                         candidateFastRanges.push(r);
   1515                     }
   1516                 }
   1517             }
   1518             if (candidateRanges.isEmpty() && candidateFastRanges.isEmpty()) {
   1519                 ALOGE("%s: Requested preview frame rate %d is not supported",
   1520                         __FUNCTION__, previewFps);
   1521                 return BAD_VALUE;
   1522             }
   1523 
   1524             // most applicable range with targetFps
   1525             Vector<Range>& ranges =
   1526                     candidateRanges.size() > 0 ? candidateRanges : candidateFastRanges;
   1527             Range bestRange = ranges[0];
   1528             for (i = 1; i < ranges.size(); ++i) {
   1529                 Range r = ranges[i];
   1530                 // Find by largest minIndex in recording mode
   1531                 if (validatedParams.recordingHint) {
   1532                     if (r.min > bestRange.min) {
   1533                         bestRange = r;
   1534                     }
   1535                     else if (r.min == bestRange.min && r.max < bestRange.max) {
   1536                         bestRange = r;
   1537                     }
   1538                 }
   1539                 // Find by smallest minIndex in preview mode
   1540                 else {
   1541                     if (r.min < bestRange.min) {
   1542                         bestRange = r;
   1543                     }
   1544                     else if (r.min == bestRange.min && r.max < bestRange.max) {
   1545                         bestRange = r;
   1546                     }
   1547                 }
   1548             }
   1549 
   1550             validatedParams.previewFpsRange[0] =
   1551                     bestRange.min;
   1552             validatedParams.previewFpsRange[1] =
   1553                     bestRange.max;
   1554 
   1555             ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d",
   1556                 __FUNCTION__,
   1557                 validatedParams.previewFpsRange[0],
   1558                 validatedParams.previewFpsRange[1],
   1559                 validatedParams.recordingHint);
   1560         }
   1561     }
   1562 
   1563     /**
   1564      * Update Preview FPS and Preview FPS ranges based on
   1565      * what we actually set.
   1566      *
   1567      * This updates the API-visible (Camera.Parameters#getParameters) values of
   1568      * the FPS fields, not only the internal versions.
   1569      *
   1570      * Order matters: The value that was set last takes precedence.
   1571      * - If the client does a setParameters(getParameters()) we retain
   1572      *   the same order for preview FPS.
   1573      */
   1574     if (!fpsUseSingleValue) {
   1575         // Set fps single, then fps range (range wins)
   1576         newParams.setPreviewFrameRate(
   1577                 fpsFromRange(/*min*/validatedParams.previewFpsRange[0],
   1578                              /*max*/validatedParams.previewFpsRange[1]));
   1579         newParams.setPreviewFpsRange(
   1580                 validatedParams.previewFpsRange[0] * kFpsToApiScale,
   1581                 validatedParams.previewFpsRange[1] * kFpsToApiScale);
   1582     } else {
   1583         // Set fps range, then fps single (single wins)
   1584         newParams.setPreviewFpsRange(
   1585                 validatedParams.previewFpsRange[0] * kFpsToApiScale,
   1586                 validatedParams.previewFpsRange[1] * kFpsToApiScale);
   1587         // Set this to the same value, but with higher priority
   1588         newParams.setPreviewFrameRate(
   1589                 newParams.getPreviewFrameRate());
   1590     }
   1591 
   1592     // PICTURE_SIZE
   1593     newParams.getPictureSize(&validatedParams.pictureWidth,
   1594             &validatedParams.pictureHeight);
   1595     if (validatedParams.pictureWidth != pictureWidth ||
   1596             validatedParams.pictureHeight != pictureHeight) {
   1597         Vector<Size> availablePictureSizes = getAvailableJpegSizes();
   1598         for (i = 0; i < availablePictureSizes.size(); i++) {
   1599             if ((availablePictureSizes[i].width ==
   1600                     validatedParams.pictureWidth) &&
   1601                 (availablePictureSizes[i].height ==
   1602                     validatedParams.pictureHeight)) break;
   1603         }
   1604         if (i == availablePictureSizes.size()) {
   1605             ALOGE("%s: Requested picture size %d x %d is not supported",
   1606                     __FUNCTION__, validatedParams.pictureWidth,
   1607                     validatedParams.pictureHeight);
   1608             return BAD_VALUE;
   1609         }
   1610     }
   1611 
   1612     // JPEG_THUMBNAIL_WIDTH/HEIGHT
   1613     validatedParams.jpegThumbSize[0] =
   1614             newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
   1615     validatedParams.jpegThumbSize[1] =
   1616             newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
   1617     if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
   1618             validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
   1619         camera_metadata_ro_entry_t availableJpegThumbSizes =
   1620             staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
   1621         for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
   1622             if ((availableJpegThumbSizes.data.i32[i] ==
   1623                     validatedParams.jpegThumbSize[0]) &&
   1624                 (availableJpegThumbSizes.data.i32[i+1] ==
   1625                     validatedParams.jpegThumbSize[1])) break;
   1626         }
   1627         if (i == availableJpegThumbSizes.count) {
   1628             ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
   1629                     __FUNCTION__, validatedParams.jpegThumbSize[0],
   1630                     validatedParams.jpegThumbSize[1]);
   1631             return BAD_VALUE;
   1632         }
   1633     }
   1634 
   1635     // JPEG_THUMBNAIL_QUALITY
   1636     int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
   1637     // also makes sure quality fits in uint8_t
   1638     if (quality < 0 || quality > 100) {
   1639         ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
   1640                 __FUNCTION__, quality);
   1641         return BAD_VALUE;
   1642     }
   1643     validatedParams.jpegThumbQuality = quality;
   1644 
   1645     // JPEG_QUALITY
   1646     quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
   1647     // also makes sure quality fits in uint8_t
   1648     if (quality < 0 || quality > 100) {
   1649         ALOGE("%s: Requested JPEG quality %d is not supported",
   1650                 __FUNCTION__, quality);
   1651         return BAD_VALUE;
   1652     }
   1653     validatedParams.jpegQuality = quality;
   1654 
   1655     // ROTATION
   1656     validatedParams.jpegRotation =
   1657             newParams.getInt(CameraParameters::KEY_ROTATION);
   1658     if (validatedParams.jpegRotation != 0 &&
   1659             validatedParams.jpegRotation != 90 &&
   1660             validatedParams.jpegRotation != 180 &&
   1661             validatedParams.jpegRotation != 270) {
   1662         ALOGE("%s: Requested picture rotation angle %d is not supported",
   1663                 __FUNCTION__, validatedParams.jpegRotation);
   1664         return BAD_VALUE;
   1665     }
   1666 
   1667     // GPS
   1668 
   1669     const char *gpsLatStr =
   1670             newParams.get(CameraParameters::KEY_GPS_LATITUDE);
   1671     if (gpsLatStr != NULL) {
   1672         const char *gpsLongStr =
   1673                 newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
   1674         const char *gpsAltitudeStr =
   1675                 newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
   1676         const char *gpsTimeStr =
   1677                 newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
   1678         const char *gpsProcMethodStr =
   1679                 newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
   1680         if (gpsLongStr == NULL ||
   1681                 gpsAltitudeStr == NULL ||
   1682                 gpsTimeStr == NULL ||
   1683                 gpsProcMethodStr == NULL) {
   1684             ALOGE("%s: Incomplete set of GPS parameters provided",
   1685                     __FUNCTION__);
   1686             return BAD_VALUE;
   1687         }
   1688         char *endPtr;
   1689         errno = 0;
   1690         validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
   1691         if (errno || endPtr == gpsLatStr) {
   1692             ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
   1693             return BAD_VALUE;
   1694         }
   1695         errno = 0;
   1696         validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
   1697         if (errno || endPtr == gpsLongStr) {
   1698             ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
   1699             return BAD_VALUE;
   1700         }
   1701         errno = 0;
   1702         validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
   1703         if (errno || endPtr == gpsAltitudeStr) {
   1704             ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
   1705                     gpsAltitudeStr);
   1706             return BAD_VALUE;
   1707         }
   1708         errno = 0;
   1709         validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
   1710         if (errno || endPtr == gpsTimeStr) {
   1711             ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
   1712             return BAD_VALUE;
   1713         }
   1714         validatedParams.gpsProcessingMethod = gpsProcMethodStr;
   1715 
   1716         validatedParams.gpsEnabled = true;
   1717     } else {
   1718         validatedParams.gpsEnabled = false;
   1719     }
   1720 
   1721     // EFFECT
   1722     validatedParams.effectMode = effectModeStringToEnum(
   1723         newParams.get(CameraParameters::KEY_EFFECT) );
   1724     if (validatedParams.effectMode != effectMode) {
   1725         camera_metadata_ro_entry_t availableEffectModes =
   1726             staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
   1727         for (i = 0; i < availableEffectModes.count; i++) {
   1728             if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
   1729         }
   1730         if (i == availableEffectModes.count) {
   1731             ALOGE("%s: Requested effect mode \"%s\" is not supported",
   1732                     __FUNCTION__,
   1733                     newParams.get(CameraParameters::KEY_EFFECT) );
   1734             return BAD_VALUE;
   1735         }
   1736     }
   1737 
   1738     // ANTIBANDING
   1739     validatedParams.antibandingMode = abModeStringToEnum(
   1740         newParams.get(CameraParameters::KEY_ANTIBANDING) );
   1741     if (validatedParams.antibandingMode != antibandingMode) {
   1742         camera_metadata_ro_entry_t availableAbModes =
   1743             staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
   1744         for (i = 0; i < availableAbModes.count; i++) {
   1745             if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
   1746                 break;
   1747         }
   1748         if (i == availableAbModes.count) {
   1749             ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
   1750                     __FUNCTION__,
   1751                     newParams.get(CameraParameters::KEY_ANTIBANDING));
   1752             return BAD_VALUE;
   1753         }
   1754     }
   1755 
   1756     // SCENE_MODE
   1757     validatedParams.sceneMode = sceneModeStringToEnum(
   1758         newParams.get(CameraParameters::KEY_SCENE_MODE), mDefaultSceneMode);
   1759     if (validatedParams.sceneMode != sceneMode &&
   1760             validatedParams.sceneMode !=
   1761             ANDROID_CONTROL_SCENE_MODE_DISABLED) {
   1762         camera_metadata_ro_entry_t availableSceneModes =
   1763             staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
   1764         for (i = 0; i < availableSceneModes.count; i++) {
   1765             if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
   1766                 break;
   1767         }
   1768         if (i == availableSceneModes.count) {
   1769             ALOGE("%s: Requested scene mode \"%s\" is not supported",
   1770                     __FUNCTION__,
   1771                     newParams.get(CameraParameters::KEY_SCENE_MODE));
   1772             return BAD_VALUE;
   1773         }
   1774     }
   1775     bool sceneModeSet =
   1776             validatedParams.sceneMode != mDefaultSceneMode;
   1777 
   1778     // FLASH_MODE
   1779     if (sceneModeSet) {
   1780         validatedParams.flashMode =
   1781                 fastInfo.sceneModeOverrides.
   1782                         valueFor(validatedParams.sceneMode).flashMode;
   1783     } else {
   1784         validatedParams.flashMode = FLASH_MODE_INVALID;
   1785     }
   1786     if (validatedParams.flashMode == FLASH_MODE_INVALID) {
   1787         validatedParams.flashMode = flashModeStringToEnum(
   1788             newParams.get(CameraParameters::KEY_FLASH_MODE) );
   1789     }
   1790 
   1791     if (validatedParams.flashMode != flashMode) {
   1792         camera_metadata_ro_entry_t flashAvailable =
   1793             staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1);
   1794         bool isFlashAvailable =
   1795                 flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE;
   1796         if (!isFlashAvailable &&
   1797                 validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
   1798             ALOGE("%s: Requested flash mode \"%s\" is not supported: "
   1799                     "No flash on device", __FUNCTION__,
   1800                     newParams.get(CameraParameters::KEY_FLASH_MODE));
   1801             return BAD_VALUE;
   1802         } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
   1803             camera_metadata_ro_entry_t availableAeModes =
   1804                 staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
   1805             for (i = 0; i < availableAeModes.count; i++) {
   1806                 if (validatedParams.flashMode == availableAeModes.data.u8[i])
   1807                     break;
   1808             }
   1809             if (i == availableAeModes.count) {
   1810                 ALOGE("%s: Requested flash mode \"%s\" is not supported",
   1811                         __FUNCTION__,
   1812                         newParams.get(CameraParameters::KEY_FLASH_MODE));
   1813                 return BAD_VALUE;
   1814             }
   1815         } else if (validatedParams.flashMode == -1) {
   1816             ALOGE("%s: Requested flash mode \"%s\" is unknown",
   1817                     __FUNCTION__,
   1818                     newParams.get(CameraParameters::KEY_FLASH_MODE));
   1819             return BAD_VALUE;
   1820         }
   1821         // Update in case of override, but only if flash is supported
   1822         if (isFlashAvailable) {
   1823             newParams.set(CameraParameters::KEY_FLASH_MODE,
   1824                     flashModeEnumToString(validatedParams.flashMode));
   1825         }
   1826     }
   1827 
   1828     // WHITE_BALANCE
   1829     if (sceneModeSet) {
   1830         validatedParams.wbMode =
   1831                 fastInfo.sceneModeOverrides.
   1832                         valueFor(validatedParams.sceneMode).wbMode;
   1833     } else {
   1834         validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF;
   1835     }
   1836     if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
   1837         validatedParams.wbMode = wbModeStringToEnum(
   1838             newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
   1839     }
   1840     if (validatedParams.wbMode != wbMode) {
   1841         camera_metadata_ro_entry_t availableWbModes =
   1842             staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
   1843         for (i = 0; i < availableWbModes.count; i++) {
   1844             if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
   1845         }
   1846         if (i == availableWbModes.count) {
   1847             ALOGE("%s: Requested white balance mode %s is not supported",
   1848                     __FUNCTION__,
   1849                     newParams.get(CameraParameters::KEY_WHITE_BALANCE));
   1850             return BAD_VALUE;
   1851         }
   1852         // Update in case of override
   1853         newParams.set(CameraParameters::KEY_WHITE_BALANCE,
   1854                 wbModeEnumToString(validatedParams.wbMode));
   1855     }
   1856 
   1857     // FOCUS_MODE
   1858     if (sceneModeSet) {
   1859         validatedParams.focusMode =
   1860                 fastInfo.sceneModeOverrides.
   1861                         valueFor(validatedParams.sceneMode).focusMode;
   1862     } else {
   1863         validatedParams.focusMode = FOCUS_MODE_INVALID;
   1864     }
   1865     if (validatedParams.focusMode == FOCUS_MODE_INVALID) {
   1866         validatedParams.focusMode = focusModeStringToEnum(
   1867                 newParams.get(CameraParameters::KEY_FOCUS_MODE) );
   1868     }
   1869     if (validatedParams.focusMode != focusMode) {
   1870         validatedParams.currentAfTriggerId = -1;
   1871         if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
   1872             camera_metadata_ro_entry_t minFocusDistance =
   1873                 staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0,
   1874                         false);
   1875             if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) {
   1876                 ALOGE("%s: Requested focus mode \"%s\" is not available: "
   1877                         "fixed focus lens",
   1878                         __FUNCTION__,
   1879                         newParams.get(CameraParameters::KEY_FOCUS_MODE));
   1880                 return BAD_VALUE;
   1881             } else if (validatedParams.focusMode !=
   1882                     Parameters::FOCUS_MODE_INFINITY) {
   1883                 camera_metadata_ro_entry_t availableFocusModes =
   1884                     staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
   1885                 for (i = 0; i < availableFocusModes.count; i++) {
   1886                     if (validatedParams.focusMode ==
   1887                             availableFocusModes.data.u8[i]) break;
   1888                 }
   1889                 if (i == availableFocusModes.count) {
   1890                     ALOGE("%s: Requested focus mode \"%s\" is not supported",
   1891                             __FUNCTION__,
   1892                             newParams.get(CameraParameters::KEY_FOCUS_MODE));
   1893                     return BAD_VALUE;
   1894                 }
   1895             }
   1896         }
   1897         validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
   1898         // Always reset shadow focus mode to avoid reverting settings
   1899         validatedParams.shadowFocusMode = FOCUS_MODE_INVALID;
   1900         // Update in case of override
   1901         newParams.set(CameraParameters::KEY_FOCUS_MODE,
   1902                 focusModeEnumToString(validatedParams.focusMode));
   1903     } else {
   1904         validatedParams.currentAfTriggerId = currentAfTriggerId;
   1905     }
   1906 
   1907     // FOCUS_AREAS
   1908     res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
   1909             &validatedParams.focusingAreas);
   1910     size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
   1911               Parameters::NUM_REGION, Parameters::NUM_REGION).
   1912               data.i32[Parameters::REGION_AF];
   1913     if (res == OK) res = validateAreas(validatedParams.focusingAreas,
   1914             maxAfRegions, AREA_KIND_FOCUS);
   1915     if (res != OK) {
   1916         ALOGE("%s: Requested focus areas are malformed: %s",
   1917                 __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
   1918         return BAD_VALUE;
   1919     }
   1920 
   1921     // EXPOSURE_COMPENSATION
   1922     validatedParams.exposureCompensation =
   1923         newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
   1924     camera_metadata_ro_entry_t exposureCompensationRange =
   1925         staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE);
   1926     if ((validatedParams.exposureCompensation <
   1927             exposureCompensationRange.data.i32[0]) ||
   1928         (validatedParams.exposureCompensation >
   1929             exposureCompensationRange.data.i32[1])) {
   1930         ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
   1931                 __FUNCTION__, validatedParams.exposureCompensation);
   1932         return BAD_VALUE;
   1933     }
   1934 
   1935     if (autoExposureLockAvailable) {
   1936         validatedParams.autoExposureLock = boolFromString(
   1937             newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
   1938     } else if (nullptr !=
   1939             newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)){
   1940         ALOGE("%s: Requested auto exposure lock is not supported",
   1941               __FUNCTION__);
   1942         return BAD_VALUE;
   1943     }
   1944 
   1945     if (autoWhiteBalanceLockAvailable) {
   1946         validatedParams.autoWhiteBalanceLock = boolFromString(
   1947                 newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
   1948     } else if (nullptr !=
   1949            newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) {
   1950         ALOGE("%s: Requested auto whitebalance lock is not supported",
   1951               __FUNCTION__);
   1952         return BAD_VALUE;
   1953     }
   1954 
   1955     // METERING_AREAS
   1956     size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
   1957             Parameters::NUM_REGION, Parameters::NUM_REGION).
   1958             data.i32[Parameters::REGION_AE];
   1959     res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
   1960             &validatedParams.meteringAreas);
   1961     if (res == OK) {
   1962         res = validateAreas(validatedParams.meteringAreas, maxAeRegions,
   1963                             AREA_KIND_METERING);
   1964     }
   1965     if (res != OK) {
   1966         ALOGE("%s: Requested metering areas are malformed: %s",
   1967                 __FUNCTION__,
   1968                 newParams.get(CameraParameters::KEY_METERING_AREAS));
   1969         return BAD_VALUE;
   1970     }
   1971 
   1972     // ZOOM
   1973     if (zoomAvailable) {
   1974         validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
   1975         if (validatedParams.zoom < 0
   1976                     || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) {
   1977             ALOGE("%s: Requested zoom level %d is not supported",
   1978                     __FUNCTION__, validatedParams.zoom);
   1979             return BAD_VALUE;
   1980         }
   1981     }
   1982 
   1983     // VIDEO_SIZE
   1984     newParams.getVideoSize(&validatedParams.videoWidth,
   1985             &validatedParams.videoHeight);
   1986     if (validatedParams.videoWidth != videoWidth ||
   1987             validatedParams.videoHeight != videoHeight) {
   1988         if (state == RECORD) {
   1989             ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)"
   1990                     " when recording is active! Ignore the size update!",
   1991                     __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth,
   1992                     validatedParams.videoHeight);
   1993             validatedParams.videoWidth = videoWidth;
   1994             validatedParams.videoHeight = videoHeight;
   1995             newParams.setVideoSize(videoWidth, videoHeight);
   1996         } else {
   1997             for (i = 0; i < availableVideoSizes.size(); i++) {
   1998                 if ((availableVideoSizes[i].width ==
   1999                         validatedParams.videoWidth) &&
   2000                     (availableVideoSizes[i].height ==
   2001                         validatedParams.videoHeight)) break;
   2002             }
   2003             if (i == availableVideoSizes.size()) {
   2004                 ALOGE("%s: Requested video size %d x %d is not supported",
   2005                         __FUNCTION__, validatedParams.videoWidth,
   2006                         validatedParams.videoHeight);
   2007                 return BAD_VALUE;
   2008             }
   2009         }
   2010     }
   2011 
   2012     // VIDEO_STABILIZATION
   2013     validatedParams.videoStabilization = boolFromString(
   2014         newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
   2015     camera_metadata_ro_entry_t availableVideoStabilizationModes =
   2016         staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
   2017                 false);
   2018     if (validatedParams.videoStabilization &&
   2019             availableVideoStabilizationModes.count == 1) {
   2020         ALOGE("%s: Video stabilization not supported", __FUNCTION__);
   2021     }
   2022 
   2023     /** Update internal parameters */
   2024 
   2025     *this = validatedParams;
   2026     updateOverriddenJpegSize();
   2027 
   2028     /** Update external parameters calculated from the internal ones */
   2029 
   2030     // HORIZONTAL/VERTICAL FIELD OF VIEW
   2031     float horizFov, vertFov;
   2032     res = calculatePictureFovs(&horizFov, &vertFov);
   2033     if (res != OK) {
   2034         ALOGE("%s: Can't calculate FOVs", __FUNCTION__);
   2035         // continue so parameters are at least consistent
   2036     }
   2037     newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
   2038             horizFov);
   2039     newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE,
   2040             vertFov);
   2041     ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov);
   2042 
   2043     // Need to flatten again in case of overrides
   2044     paramsFlattened = newParams.flatten();
   2045     params = newParams;
   2046 
   2047     slowJpegMode = false;
   2048     Size pictureSize = { pictureWidth, pictureHeight };
   2049     int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(pictureSize);
   2050     if (previewFpsRange[1] > 1e9/minFrameDurationNs + FPS_MARGIN) {
   2051         slowJpegMode = true;
   2052     }
   2053     if (isDeviceZslSupported || slowJpegMode ||
   2054             property_get_bool("camera.disable_zsl_mode", false)) {
   2055         allowZslMode = false;
   2056     } else {
   2057         allowZslMode = isZslReprocessPresent;
   2058     }
   2059     ALOGV("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode);
   2060 
   2061     return OK;
   2062 }
   2063 
   2064 status_t Parameters::updateRequest(CameraMetadata *request) const {
   2065     ATRACE_CALL();
   2066     status_t res;
   2067 
   2068     /**
   2069      * Mixin default important security values
   2070      * - android.led.transmit = defaulted ON
   2071      */
   2072     camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS,
   2073                                                   /*minimumCount*/0,
   2074                                                   /*maximumCount*/0,
   2075                                                   /*required*/false);
   2076     for(size_t i = 0; i < entry.count; ++i) {
   2077         uint8_t led = entry.data.u8[i];
   2078 
   2079         switch(led) {
   2080             // Transmit LED is unconditionally on when using
   2081             // the android.hardware.Camera API
   2082             case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
   2083                 uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
   2084                 res = request->update(ANDROID_LED_TRANSMIT,
   2085                                       &transmitDefault, 1);
   2086                 if (res != OK) return res;
   2087                 break;
   2088             }
   2089         }
   2090     }
   2091 
   2092     /**
   2093      * Construct metadata from parameters
   2094      */
   2095 
   2096     uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
   2097     res = request->update(ANDROID_REQUEST_METADATA_MODE,
   2098             &metadataMode, 1);
   2099     if (res != OK) return res;
   2100 
   2101     camera_metadata_entry_t intent =
   2102             request->find(ANDROID_CONTROL_CAPTURE_INTENT);
   2103 
   2104     if (intent.count == 0) return BAD_VALUE;
   2105 
   2106     uint8_t distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_OFF;
   2107     if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) {
   2108         res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
   2109                 fastInfo.bestStillCaptureFpsRange, 2);
   2110         distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_HIGH_QUALITY;
   2111     } else {
   2112         res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
   2113                 previewFpsRange, 2);
   2114         distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_FAST;
   2115     }
   2116     if (res != OK) return res;
   2117 
   2118     if (isDistortionCorrectionSupported) {
   2119         res = request->update(ANDROID_DISTORTION_CORRECTION_MODE,
   2120                 &distortionMode, 1);
   2121         if (res != OK) return res;
   2122     }
   2123 
   2124     if (autoWhiteBalanceLockAvailable) {
   2125         uint8_t reqWbLock = autoWhiteBalanceLock ?
   2126                 ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
   2127         res = request->update(ANDROID_CONTROL_AWB_LOCK,
   2128                 &reqWbLock, 1);
   2129     }
   2130 
   2131     res = request->update(ANDROID_CONTROL_EFFECT_MODE,
   2132             &effectMode, 1);
   2133     if (res != OK) return res;
   2134     res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
   2135             &antibandingMode, 1);
   2136     if (res != OK) return res;
   2137 
   2138     // android.hardware.Camera requires that when face detect is enabled, the
   2139     // camera is in a face-priority mode. HAL3.x splits this into separate parts
   2140     // (face detection statistics and face priority scene mode). Map from other
   2141     // to the other.
   2142     bool sceneModeActive =
   2143             sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
   2144     uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO;
   2145     if (enableFaceDetect || sceneModeActive) {
   2146         reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE;
   2147     }
   2148     res = request->update(ANDROID_CONTROL_MODE,
   2149             &reqControlMode, 1);
   2150     if (res != OK) return res;
   2151 
   2152     uint8_t reqSceneMode =
   2153             sceneModeActive ? sceneMode :
   2154             enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY :
   2155             mDefaultSceneMode;
   2156     res = request->update(ANDROID_CONTROL_SCENE_MODE,
   2157             &reqSceneMode, 1);
   2158     if (res != OK) return res;
   2159 
   2160     uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF;
   2161     uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF;
   2162     switch (flashMode) {
   2163         case Parameters::FLASH_MODE_OFF:
   2164             reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break;
   2165         case Parameters::FLASH_MODE_AUTO:
   2166             reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break;
   2167         case Parameters::FLASH_MODE_ON:
   2168             reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break;
   2169         case Parameters::FLASH_MODE_TORCH:
   2170             reqAeMode = ANDROID_CONTROL_AE_MODE_ON;
   2171             reqFlashMode = ANDROID_FLASH_MODE_TORCH;
   2172             break;
   2173         case Parameters::FLASH_MODE_RED_EYE:
   2174             reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break;
   2175         default:
   2176             ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
   2177                     cameraId, flashMode);
   2178                 return BAD_VALUE;
   2179     }
   2180     res = request->update(ANDROID_FLASH_MODE,
   2181             &reqFlashMode, 1);
   2182     if (res != OK) return res;
   2183     res = request->update(ANDROID_CONTROL_AE_MODE,
   2184             &reqAeMode, 1);
   2185     if (res != OK) return res;
   2186 
   2187     if (autoExposureLockAvailable) {
   2188         uint8_t reqAeLock = autoExposureLock ?
   2189                 ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
   2190         res = request->update(ANDROID_CONTROL_AE_LOCK,
   2191                 &reqAeLock, 1);
   2192         if (res != OK) return res;
   2193     }
   2194 
   2195     res = request->update(ANDROID_CONTROL_AWB_MODE,
   2196             &wbMode, 1);
   2197     if (res != OK) return res;
   2198 
   2199     float reqFocusDistance = 0; // infinity focus in diopters
   2200     uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
   2201     switch (focusMode) {
   2202         case Parameters::FOCUS_MODE_AUTO:
   2203         case Parameters::FOCUS_MODE_MACRO:
   2204         case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
   2205         case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
   2206         case Parameters::FOCUS_MODE_EDOF:
   2207             reqFocusMode = focusMode;
   2208             break;
   2209         case Parameters::FOCUS_MODE_INFINITY:
   2210         case Parameters::FOCUS_MODE_FIXED:
   2211             reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
   2212             break;
   2213         default:
   2214                 ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
   2215                         cameraId, focusMode);
   2216                 return BAD_VALUE;
   2217     }
   2218     res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
   2219             &reqFocusDistance, 1);
   2220     if (res != OK) return res;
   2221     res = request->update(ANDROID_CONTROL_AF_MODE,
   2222             &reqFocusMode, 1);
   2223     if (res != OK) return res;
   2224 
   2225     size_t reqFocusingAreasSize = focusingAreas.size() * 5;
   2226     int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize];
   2227     for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) {
   2228         if (focusingAreas[j].weight != 0) {
   2229             reqFocusingAreas[i + 0] =
   2230                     normalizedXToArray(focusingAreas[j].left);
   2231             reqFocusingAreas[i + 1] =
   2232                     normalizedYToArray(focusingAreas[j].top);
   2233             reqFocusingAreas[i + 2] =
   2234                     normalizedXToArray(focusingAreas[j].right);
   2235             reqFocusingAreas[i + 3] =
   2236                     normalizedYToArray(focusingAreas[j].bottom);
   2237         } else {
   2238             reqFocusingAreas[i + 0] = 0;
   2239             reqFocusingAreas[i + 1] = 0;
   2240             reqFocusingAreas[i + 2] = 0;
   2241             reqFocusingAreas[i + 3] = 0;
   2242         }
   2243         reqFocusingAreas[i + 4] = focusingAreas[j].weight;
   2244     }
   2245     res = request->update(ANDROID_CONTROL_AF_REGIONS,
   2246             reqFocusingAreas, reqFocusingAreasSize);
   2247     if (res != OK) return res;
   2248     delete[] reqFocusingAreas;
   2249 
   2250     res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
   2251             &exposureCompensation, 1);
   2252     if (res != OK) return res;
   2253 
   2254     size_t reqMeteringAreasSize = meteringAreas.size() * 5;
   2255     int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize];
   2256     for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) {
   2257         if (meteringAreas[j].weight != 0) {
   2258             reqMeteringAreas[i + 0] =
   2259                 normalizedXToArray(meteringAreas[j].left);
   2260             reqMeteringAreas[i + 1] =
   2261                 normalizedYToArray(meteringAreas[j].top);
   2262             reqMeteringAreas[i + 2] =
   2263                 normalizedXToArray(meteringAreas[j].right);
   2264             reqMeteringAreas[i + 3] =
   2265                 normalizedYToArray(meteringAreas[j].bottom);
   2266             // Requested size may be zero by rounding error with/without zooming.
   2267             // The ae regions should be at least 1 if metering width/height is not zero.
   2268             if (reqMeteringAreas[i + 0] == reqMeteringAreas[i + 2]) {
   2269                 reqMeteringAreas[i + 2]++;
   2270             }
   2271             if (reqMeteringAreas[i + 1] == reqMeteringAreas[i + 3]) {
   2272                 reqMeteringAreas[i + 3]++;
   2273             }
   2274         } else {
   2275             reqMeteringAreas[i + 0] = 0;
   2276             reqMeteringAreas[i + 1] = 0;
   2277             reqMeteringAreas[i + 2] = 0;
   2278             reqMeteringAreas[i + 3] = 0;
   2279         }
   2280         reqMeteringAreas[i + 4] = meteringAreas[j].weight;
   2281     }
   2282     res = request->update(ANDROID_CONTROL_AE_REGIONS,
   2283             reqMeteringAreas, reqMeteringAreasSize);
   2284     if (res != OK) return res;
   2285 
   2286     // Set awb regions to be the same as the metering regions if allowed
   2287     size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
   2288             Parameters::NUM_REGION, Parameters::NUM_REGION).
   2289             data.i32[Parameters::REGION_AWB];
   2290     if (maxAwbRegions > 0) {
   2291         if (maxAwbRegions >= meteringAreas.size()) {
   2292             res = request->update(ANDROID_CONTROL_AWB_REGIONS,
   2293                     reqMeteringAreas, reqMeteringAreasSize);
   2294         } else {
   2295             // Ensure the awb regions are zeroed if the region count is too high.
   2296             int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0};
   2297             res = request->update(ANDROID_CONTROL_AWB_REGIONS,
   2298                     zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t));
   2299         }
   2300         if (res != OK) return res;
   2301     }
   2302 
   2303     delete[] reqMeteringAreas;
   2304 
   2305     CropRegion crop = calculateCropRegion(/*previewOnly*/ false);
   2306     int32_t reqCropRegion[4] = {
   2307         static_cast<int32_t>(crop.left),
   2308         static_cast<int32_t>(crop.top),
   2309         static_cast<int32_t>(crop.width),
   2310         static_cast<int32_t>(crop.height)
   2311     };
   2312     res = request->update(ANDROID_SCALER_CROP_REGION,
   2313             reqCropRegion, 4);
   2314     if (res != OK) return res;
   2315 
   2316     uint8_t reqVstabMode = videoStabilization ?
   2317             ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON :
   2318             ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
   2319     res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
   2320             &reqVstabMode, 1);
   2321     if (res != OK) return res;
   2322 
   2323     uint8_t reqFaceDetectMode = enableFaceDetect ?
   2324             fastInfo.bestFaceDetectMode :
   2325             (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
   2326     res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE,
   2327             &reqFaceDetectMode, 1);
   2328     if (res != OK) return res;
   2329 
   2330     return OK;
   2331 }
   2332 
   2333 status_t Parameters::updateRequestJpeg(CameraMetadata *request) const {
   2334     status_t res;
   2335 
   2336     res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE,
   2337             jpegThumbSize, 2);
   2338     if (res != OK) return res;
   2339     res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY,
   2340             &jpegThumbQuality, 1);
   2341     if (res != OK) return res;
   2342     res = request->update(ANDROID_JPEG_QUALITY,
   2343             &jpegQuality, 1);
   2344     if (res != OK) return res;
   2345     res = request->update(
   2346             ANDROID_JPEG_ORIENTATION,
   2347             &jpegRotation, 1);
   2348     if (res != OK) return res;
   2349 
   2350     if (gpsEnabled) {
   2351         res = request->update(
   2352                 ANDROID_JPEG_GPS_COORDINATES,
   2353                 gpsCoordinates, 3);
   2354         if (res != OK) return res;
   2355         res = request->update(
   2356                 ANDROID_JPEG_GPS_TIMESTAMP,
   2357                 &gpsTimestamp, 1);
   2358         if (res != OK) return res;
   2359         res = request->update(
   2360                 ANDROID_JPEG_GPS_PROCESSING_METHOD,
   2361                 gpsProcessingMethod);
   2362         if (res != OK) return res;
   2363     } else {
   2364         res = request->erase(ANDROID_JPEG_GPS_COORDINATES);
   2365         if (res != OK) return res;
   2366         res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP);
   2367         if (res != OK) return res;
   2368         res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
   2369         if (res != OK) return res;
   2370     }
   2371     return OK;
   2372 }
   2373 
   2374 status_t Parameters::overrideJpegSizeByVideoSize() {
   2375     if (pictureSizeOverriden) {
   2376         ALOGV("Picture size has been overridden. Skip overriding");
   2377         return OK;
   2378     }
   2379 
   2380     pictureSizeOverriden = true;
   2381     pictureWidthLastSet = pictureWidth;
   2382     pictureHeightLastSet = pictureHeight;
   2383     pictureWidth = videoWidth;
   2384     pictureHeight = videoHeight;
   2385     // This change of picture size is invisible to app layer.
   2386     // Do not update app visible params
   2387     return OK;
   2388 }
   2389 
   2390 status_t Parameters::updateOverriddenJpegSize() {
   2391     if (!pictureSizeOverriden) {
   2392         ALOGV("Picture size has not been overridden. Skip checking");
   2393         return OK;
   2394     }
   2395 
   2396     pictureWidthLastSet = pictureWidth;
   2397     pictureHeightLastSet = pictureHeight;
   2398 
   2399     if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) {
   2400         // Picture size is now smaller than video size. No need to override anymore
   2401         return recoverOverriddenJpegSize();
   2402     }
   2403 
   2404     pictureWidth = videoWidth;
   2405     pictureHeight = videoHeight;
   2406 
   2407     return OK;
   2408 }
   2409 
   2410 status_t Parameters::recoverOverriddenJpegSize() {
   2411     if (!pictureSizeOverriden) {
   2412         ALOGV("Picture size has not been overridden. Skip recovering");
   2413         return OK;
   2414     }
   2415     pictureSizeOverriden = false;
   2416     pictureWidth = pictureWidthLastSet;
   2417     pictureHeight = pictureHeightLastSet;
   2418     return OK;
   2419 }
   2420 
   2421 bool Parameters::isJpegSizeOverridden() {
   2422     return pictureSizeOverriden;
   2423 }
   2424 
   2425 bool Parameters::useZeroShutterLag() const {
   2426     // If ZSL mode is disabled, don't use it
   2427     if (!allowZslMode) return false;
   2428     // If recording hint is enabled, don't do ZSL
   2429     if (recordingHint) return false;
   2430     // If still capture size is no bigger than preview or video size,
   2431     // don't do ZSL
   2432     if (pictureWidth <= previewWidth || pictureHeight <= previewHeight ||
   2433             pictureWidth <= videoWidth || pictureHeight <= videoHeight) {
   2434         return false;
   2435     }
   2436     // If still capture size is less than quarter of max, don't do ZSL
   2437     if ((pictureWidth * pictureHeight) <
   2438             (fastInfo.maxJpegSize.width * fastInfo.maxJpegSize.height / 4) ) {
   2439         return false;
   2440     }
   2441     return true;
   2442 }
   2443 
   2444 status_t Parameters::getDefaultFocalLength(CameraDeviceBase *device) {
   2445     if (device == nullptr) {
   2446         ALOGE("%s: Camera device is nullptr", __FUNCTION__);
   2447         return BAD_VALUE;
   2448     }
   2449 
   2450     camera_metadata_ro_entry_t hwLevel = staticInfo(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL);
   2451     if (!hwLevel.count) return NO_INIT;
   2452     fastInfo.isExternalCamera =
   2453             hwLevel.data.u8[0] == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL;
   2454 
   2455     camera_metadata_ro_entry_t availableFocalLengths =
   2456         staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, /*required*/false);
   2457     if (!availableFocalLengths.count && !fastInfo.isExternalCamera) return NO_INIT;
   2458 
   2459     // Find focal length in PREVIEW template to use as default focal length.
   2460     if (fastInfo.isExternalCamera) {
   2461         fastInfo.defaultFocalLength = -1.0;
   2462     } else {
   2463         // Find smallest (widest-angle) focal length to use as basis of still
   2464         // picture FOV reporting.
   2465         fastInfo.defaultFocalLength = availableFocalLengths.data.f[0];
   2466         for (size_t i = 1; i < availableFocalLengths.count; i++) {
   2467             if (fastInfo.defaultFocalLength > availableFocalLengths.data.f[i]) {
   2468                 fastInfo.defaultFocalLength = availableFocalLengths.data.f[i];
   2469             }
   2470         }
   2471 
   2472         // Use focal length in preview template if it exists
   2473         CameraMetadata previewTemplate;
   2474         status_t res = device->createDefaultRequest(CAMERA3_TEMPLATE_PREVIEW, &previewTemplate);
   2475         if (res != OK) {
   2476             ALOGE("%s: Failed to create default PREVIEW request: %s (%d)",
   2477                     __FUNCTION__, strerror(-res), res);
   2478             return res;
   2479         }
   2480         camera_metadata_entry entry = previewTemplate.find(ANDROID_LENS_FOCAL_LENGTH);
   2481         if (entry.count != 0) {
   2482             fastInfo.defaultFocalLength = entry.data.f[0];
   2483         }
   2484     }
   2485     return OK;
   2486 }
   2487 
   2488 const char* Parameters::getStateName(State state) {
   2489 #define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
   2490     switch(state) {
   2491         CASE_ENUM_TO_CHAR(DISCONNECTED)
   2492         CASE_ENUM_TO_CHAR(STOPPED)
   2493         CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
   2494         CASE_ENUM_TO_CHAR(PREVIEW)
   2495         CASE_ENUM_TO_CHAR(RECORD)
   2496         CASE_ENUM_TO_CHAR(STILL_CAPTURE)
   2497         CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
   2498         default:
   2499             return "Unknown state!";
   2500             break;
   2501     }
   2502 #undef CASE_ENUM_TO_CHAR
   2503 }
   2504 
   2505 int Parameters::formatStringToEnum(const char *format) {
   2506     return CameraParameters::previewFormatToEnum(format);
   2507 }
   2508 
   2509 const char* Parameters::formatEnumToString(int format) {
   2510     const char *fmt;
   2511     switch(format) {
   2512         case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
   2513             fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
   2514             break;
   2515         case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
   2516             fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
   2517             break;
   2518         case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
   2519             fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
   2520             break;
   2521         case HAL_PIXEL_FORMAT_YV12:        // YV12
   2522             fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
   2523             break;
   2524         case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
   2525             fmt = CameraParameters::PIXEL_FORMAT_RGB565;
   2526             break;
   2527         case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
   2528             fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
   2529             break;
   2530         case HAL_PIXEL_FORMAT_RAW16:
   2531             ALOGW("Raw sensor preview format requested.");
   2532             fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
   2533             break;
   2534         default:
   2535             ALOGE("%s: Unknown preview format: %x",
   2536                     __FUNCTION__,  format);
   2537             fmt = NULL;
   2538             break;
   2539     }
   2540     return fmt;
   2541 }
   2542 
   2543 int Parameters::wbModeStringToEnum(const char *wbMode) {
   2544     return
   2545         !wbMode ?
   2546             ANDROID_CONTROL_AWB_MODE_AUTO :
   2547         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
   2548             ANDROID_CONTROL_AWB_MODE_AUTO :
   2549         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
   2550             ANDROID_CONTROL_AWB_MODE_INCANDESCENT :
   2551         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
   2552             ANDROID_CONTROL_AWB_MODE_FLUORESCENT :
   2553         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
   2554             ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT :
   2555         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
   2556             ANDROID_CONTROL_AWB_MODE_DAYLIGHT :
   2557         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
   2558             ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT :
   2559         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
   2560             ANDROID_CONTROL_AWB_MODE_TWILIGHT :
   2561         !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
   2562             ANDROID_CONTROL_AWB_MODE_SHADE :
   2563         -1;
   2564 }
   2565 
   2566 const char* Parameters::wbModeEnumToString(uint8_t wbMode) {
   2567     switch (wbMode) {
   2568         case ANDROID_CONTROL_AWB_MODE_AUTO:
   2569             return CameraParameters::WHITE_BALANCE_AUTO;
   2570         case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
   2571             return CameraParameters::WHITE_BALANCE_INCANDESCENT;
   2572         case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
   2573             return CameraParameters::WHITE_BALANCE_FLUORESCENT;
   2574         case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
   2575             return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
   2576         case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
   2577             return CameraParameters::WHITE_BALANCE_DAYLIGHT;
   2578         case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
   2579             return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
   2580         case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
   2581             return CameraParameters::WHITE_BALANCE_TWILIGHT;
   2582         case ANDROID_CONTROL_AWB_MODE_SHADE:
   2583             return CameraParameters::WHITE_BALANCE_SHADE;
   2584         default:
   2585             ALOGE("%s: Unknown AWB mode enum: %d",
   2586                     __FUNCTION__, wbMode);
   2587             return "unknown";
   2588     }
   2589 }
   2590 
   2591 int Parameters::effectModeStringToEnum(const char *effectMode) {
   2592     return
   2593         !effectMode ?
   2594             ANDROID_CONTROL_EFFECT_MODE_OFF :
   2595         !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
   2596             ANDROID_CONTROL_EFFECT_MODE_OFF :
   2597         !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
   2598             ANDROID_CONTROL_EFFECT_MODE_MONO :
   2599         !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
   2600             ANDROID_CONTROL_EFFECT_MODE_NEGATIVE :
   2601         !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
   2602             ANDROID_CONTROL_EFFECT_MODE_SOLARIZE :
   2603         !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
   2604             ANDROID_CONTROL_EFFECT_MODE_SEPIA :
   2605         !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
   2606             ANDROID_CONTROL_EFFECT_MODE_POSTERIZE :
   2607         !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
   2608             ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD :
   2609         !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
   2610             ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD :
   2611         !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
   2612             ANDROID_CONTROL_EFFECT_MODE_AQUA :
   2613         -1;
   2614 }
   2615 
   2616 int Parameters::abModeStringToEnum(const char *abMode) {
   2617     return
   2618         !abMode ?
   2619             ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
   2620         !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
   2621             ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
   2622         !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
   2623             ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF :
   2624         !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
   2625             ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ :
   2626         !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
   2627             ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ :
   2628         -1;
   2629 }
   2630 
   2631 int Parameters::sceneModeStringToEnum(const char *sceneMode, uint8_t defaultSceneMode) {
   2632     return
   2633         !sceneMode ?
   2634             defaultSceneMode :
   2635         !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
   2636             defaultSceneMode :
   2637         !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
   2638             ANDROID_CONTROL_SCENE_MODE_ACTION :
   2639         !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
   2640             ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
   2641         !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
   2642             ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
   2643         !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
   2644             ANDROID_CONTROL_SCENE_MODE_NIGHT :
   2645         !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
   2646             ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
   2647         !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
   2648             ANDROID_CONTROL_SCENE_MODE_THEATRE :
   2649         !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
   2650             ANDROID_CONTROL_SCENE_MODE_BEACH :
   2651         !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
   2652             ANDROID_CONTROL_SCENE_MODE_SNOW :
   2653         !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
   2654             ANDROID_CONTROL_SCENE_MODE_SUNSET :
   2655         !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
   2656             ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
   2657         !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
   2658             ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
   2659         !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
   2660             ANDROID_CONTROL_SCENE_MODE_SPORTS :
   2661         !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
   2662             ANDROID_CONTROL_SCENE_MODE_PARTY :
   2663         !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
   2664             ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
   2665         !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
   2666             ANDROID_CONTROL_SCENE_MODE_BARCODE:
   2667         !strcmp(sceneMode, CameraParameters::SCENE_MODE_HDR) ?
   2668             ANDROID_CONTROL_SCENE_MODE_HDR:
   2669         -1;
   2670 }
   2671 
   2672 Parameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
   2673         const char *flashMode) {
   2674     return
   2675         !flashMode ?
   2676             Parameters::FLASH_MODE_OFF :
   2677         !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
   2678             Parameters::FLASH_MODE_OFF :
   2679         !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
   2680             Parameters::FLASH_MODE_AUTO :
   2681         !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
   2682             Parameters::FLASH_MODE_ON :
   2683         !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
   2684             Parameters::FLASH_MODE_RED_EYE :
   2685         !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
   2686             Parameters::FLASH_MODE_TORCH :
   2687         Parameters::FLASH_MODE_INVALID;
   2688 }
   2689 
   2690 const char *Parameters::flashModeEnumToString(flashMode_t flashMode) {
   2691     switch (flashMode) {
   2692         case FLASH_MODE_OFF:
   2693             return CameraParameters::FLASH_MODE_OFF;
   2694         case FLASH_MODE_AUTO:
   2695             return CameraParameters::FLASH_MODE_AUTO;
   2696         case FLASH_MODE_ON:
   2697             return CameraParameters::FLASH_MODE_ON;
   2698         case FLASH_MODE_RED_EYE:
   2699             return CameraParameters::FLASH_MODE_RED_EYE;
   2700         case FLASH_MODE_TORCH:
   2701             return CameraParameters::FLASH_MODE_TORCH;
   2702         default:
   2703             ALOGE("%s: Unknown flash mode enum %d",
   2704                     __FUNCTION__, flashMode);
   2705             return "unknown";
   2706     }
   2707 }
   2708 
   2709 Parameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
   2710         const char *focusMode) {
   2711     return
   2712         !focusMode ?
   2713             Parameters::FOCUS_MODE_INVALID :
   2714         !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
   2715             Parameters::FOCUS_MODE_AUTO :
   2716         !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
   2717             Parameters::FOCUS_MODE_INFINITY :
   2718         !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
   2719             Parameters::FOCUS_MODE_MACRO :
   2720         !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
   2721             Parameters::FOCUS_MODE_FIXED :
   2722         !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
   2723             Parameters::FOCUS_MODE_EDOF :
   2724         !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
   2725             Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
   2726         !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
   2727             Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
   2728         Parameters::FOCUS_MODE_INVALID;
   2729 }
   2730 
   2731 const char *Parameters::focusModeEnumToString(focusMode_t focusMode) {
   2732     switch (focusMode) {
   2733         case FOCUS_MODE_AUTO:
   2734             return CameraParameters::FOCUS_MODE_AUTO;
   2735         case FOCUS_MODE_MACRO:
   2736             return CameraParameters::FOCUS_MODE_MACRO;
   2737         case FOCUS_MODE_CONTINUOUS_VIDEO:
   2738             return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
   2739         case FOCUS_MODE_CONTINUOUS_PICTURE:
   2740             return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
   2741         case FOCUS_MODE_EDOF:
   2742             return CameraParameters::FOCUS_MODE_EDOF;
   2743         case FOCUS_MODE_INFINITY:
   2744             return CameraParameters::FOCUS_MODE_INFINITY;
   2745         case FOCUS_MODE_FIXED:
   2746             return CameraParameters::FOCUS_MODE_FIXED;
   2747         default:
   2748             ALOGE("%s: Unknown focus mode enum: %d",
   2749                     __FUNCTION__, focusMode);
   2750             return "unknown";
   2751     }
   2752 }
   2753 
   2754 status_t Parameters::parseAreas(const char *areasCStr,
   2755         Vector<Parameters::Area> *areas) {
   2756     static const size_t NUM_FIELDS = 5;
   2757     areas->clear();
   2758     if (areasCStr == NULL) {
   2759         // If no key exists, use default (0,0,0,0,0)
   2760         areas->push();
   2761         return OK;
   2762     }
   2763     String8 areasStr(areasCStr);
   2764     ssize_t areaStart = areasStr.find("(", 0) + 1;
   2765     while (areaStart != 0) {
   2766         const char* area = areasStr.string() + areaStart;
   2767         char *numEnd;
   2768         int vals[NUM_FIELDS];
   2769         for (size_t i = 0; i < NUM_FIELDS; i++) {
   2770             errno = 0;
   2771             vals[i] = strtol(area, &numEnd, 10);
   2772             if (errno || numEnd == area) return BAD_VALUE;
   2773             area = numEnd + 1;
   2774         }
   2775         areas->push(Parameters::Area(
   2776             vals[0], vals[1], vals[2], vals[3], vals[4]) );
   2777         areaStart = areasStr.find("(", areaStart) + 1;
   2778     }
   2779     return OK;
   2780 }
   2781 
   2782 status_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
   2783                                       size_t maxRegions,
   2784                                       AreaKind areaKind) const {
   2785     // Definition of valid area can be found in
   2786     // include/camera/CameraParameters.h
   2787     if (areas.size() == 0) return BAD_VALUE;
   2788     if (areas.size() == 1) {
   2789         if (areas[0].left == 0 &&
   2790                 areas[0].top == 0 &&
   2791                 areas[0].right == 0 &&
   2792                 areas[0].bottom == 0 &&
   2793                 areas[0].weight == 0) {
   2794             // Single (0,0,0,0,0) entry is always valid (== driver decides)
   2795             return OK;
   2796         }
   2797     }
   2798 
   2799     // fixed focus can only set (0,0,0,0,0) focus area
   2800     if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) {
   2801         return BAD_VALUE;
   2802     }
   2803 
   2804     if (areas.size() > maxRegions) {
   2805         ALOGE("%s: Too many areas requested: %zu",
   2806                 __FUNCTION__, areas.size());
   2807         return BAD_VALUE;
   2808     }
   2809 
   2810     for (Vector<Parameters::Area>::const_iterator a = areas.begin();
   2811          a != areas.end(); a++) {
   2812         if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
   2813         if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
   2814         if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
   2815         if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
   2816         if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
   2817         if (a->left >= a->right) return BAD_VALUE;
   2818         if (a->top >= a->bottom) return BAD_VALUE;
   2819     }
   2820     return OK;
   2821 }
   2822 
   2823 bool Parameters::boolFromString(const char *boolStr) {
   2824     return !boolStr ? false :
   2825         !strcmp(boolStr, CameraParameters::TRUE) ? true :
   2826         false;
   2827 }
   2828 
   2829 int Parameters::degToTransform(int degrees, bool mirror) {
   2830     if (!mirror) {
   2831         if (degrees == 0) return 0;
   2832         else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
   2833         else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
   2834         else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
   2835     } else {  // Do mirror (horizontal flip)
   2836         if (degrees == 0) {           // FLIP_H and ROT_0
   2837             return HAL_TRANSFORM_FLIP_H;
   2838         } else if (degrees == 90) {   // FLIP_H and ROT_90
   2839             return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
   2840         } else if (degrees == 180) {  // FLIP_H and ROT_180
   2841             return HAL_TRANSFORM_FLIP_V;
   2842         } else if (degrees == 270) {  // FLIP_H and ROT_270
   2843             return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
   2844         }
   2845     }
   2846     ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
   2847     return -1;
   2848 }
   2849 
   2850 int Parameters::cropXToArray(int x) const {
   2851     ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds"
   2852                          "(lower = 0)", x);
   2853 
   2854     CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
   2855     ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' "
   2856                     "is out of bounds (upper = %f)", x, previewCrop.width);
   2857 
   2858     int ret = x + previewCrop.left;
   2859 
   2860     ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth),
   2861         "Calculated pixel array value X = '%d' is out of bounds (upper = %d)",
   2862         ret, fastInfo.arrayWidth);
   2863     return ret;
   2864 }
   2865 
   2866 int Parameters::cropYToArray(int y) const {
   2867     ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds "
   2868         "(lower = 0)", y);
   2869 
   2870     CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
   2871     ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is "
   2872                 "out of bounds (upper = %f)", y, previewCrop.height);
   2873 
   2874     int ret = y + previewCrop.top;
   2875 
   2876     ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight),
   2877         "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)",
   2878         ret, fastInfo.arrayHeight);
   2879 
   2880     return ret;
   2881 
   2882 }
   2883 
   2884 int Parameters::normalizedXToCrop(int x) const {
   2885     CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
   2886     return (x + 1000) * (previewCrop.width - 1) / 2000;
   2887 }
   2888 
   2889 int Parameters::normalizedYToCrop(int y) const {
   2890     CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
   2891     return (y + 1000) * (previewCrop.height - 1) / 2000;
   2892 }
   2893 
   2894 int Parameters::normalizedXToArray(int x) const {
   2895 
   2896     // Work-around for HAL pre-scaling the coordinates themselves
   2897     if (quirks.meteringCropRegion) {
   2898         return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
   2899     }
   2900 
   2901     return cropXToArray(normalizedXToCrop(x));
   2902 }
   2903 
   2904 int Parameters::normalizedYToArray(int y) const {
   2905     // Work-around for HAL pre-scaling the coordinates themselves
   2906     if (quirks.meteringCropRegion) {
   2907         return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
   2908     }
   2909 
   2910     return cropYToArray(normalizedYToCrop(y));
   2911 }
   2912 
   2913 
   2914 Parameters::CropRegion Parameters::calculatePreviewCrop(
   2915         const CropRegion &scalerCrop) const {
   2916     float left, top, width, height;
   2917     float previewAspect = static_cast<float>(previewWidth) / previewHeight;
   2918     float cropAspect = scalerCrop.width / scalerCrop.height;
   2919 
   2920     if (previewAspect > cropAspect) {
   2921         width = scalerCrop.width;
   2922         height = cropAspect * scalerCrop.height / previewAspect;
   2923 
   2924         left = scalerCrop.left;
   2925         top = scalerCrop.top + (scalerCrop.height - height) / 2;
   2926     } else {
   2927         width = previewAspect * scalerCrop.width / cropAspect;
   2928         height = scalerCrop.height;
   2929 
   2930         left = scalerCrop.left + (scalerCrop.width - width) / 2;
   2931         top = scalerCrop.top;
   2932     }
   2933 
   2934     CropRegion previewCrop = {left, top, width, height};
   2935 
   2936     return previewCrop;
   2937 }
   2938 
   2939 int Parameters::arrayXToNormalizedWithCrop(int x,
   2940         const CropRegion &scalerCrop) const {
   2941     // Work-around for HAL pre-scaling the coordinates themselves
   2942     if (quirks.meteringCropRegion) {
   2943         return x * 2000 / (fastInfo.arrayWidth - 1) - 1000;
   2944     } else {
   2945         CropRegion previewCrop = calculatePreviewCrop(scalerCrop);
   2946         return (x - previewCrop.left) * 2000 / (previewCrop.width - 1) - 1000;
   2947     }
   2948 }
   2949 
   2950 int Parameters::arrayYToNormalizedWithCrop(int y,
   2951         const CropRegion &scalerCrop) const {
   2952     // Work-around for HAL pre-scaling the coordinates themselves
   2953     if (quirks.meteringCropRegion) {
   2954         return y * 2000 / (fastInfo.arrayHeight - 1) - 1000;
   2955     } else {
   2956         CropRegion previewCrop = calculatePreviewCrop(scalerCrop);
   2957         return (y - previewCrop.top) * 2000 / (previewCrop.height - 1) - 1000;
   2958     }
   2959 }
   2960 
   2961 status_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
   2962     if (info == NULL) {
   2963         ALOGE("%s: Static metadata is not initialized", __FUNCTION__);
   2964         return NO_INIT;
   2965     }
   2966     if (sizes == NULL) {
   2967         ALOGE("%s: Input size is null", __FUNCTION__);
   2968         return BAD_VALUE;
   2969     }
   2970     sizes->clear();
   2971 
   2972     Vector<StreamConfiguration> scs = getStreamConfigurations();
   2973     for (size_t i=0; i < scs.size(); i++) {
   2974         const StreamConfiguration &sc = scs[i];
   2975         if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
   2976                 sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
   2977                 sc.width <= limit.width && sc.height <= limit.height) {
   2978             int64_t minFrameDuration = getMinFrameDurationNs(
   2979                     {sc.width, sc.height}, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
   2980             if (minFrameDuration > MAX_PREVIEW_RECORD_DURATION_NS) {
   2981                 // Filter slow sizes from preview/record
   2982                 continue;
   2983             }
   2984             sizes->push({sc.width, sc.height});
   2985         }
   2986     }
   2987 
   2988     if (sizes->isEmpty()) {
   2989         ALOGE("generated preview size list is empty!!");
   2990         return BAD_VALUE;
   2991     }
   2992     return OK;
   2993 }
   2994 
   2995 Parameters::Size Parameters::getMaxSizeForRatio(
   2996         float ratio, const int32_t* sizeArray, size_t count) {
   2997     ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL");
   2998     ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number");
   2999 
   3000     Size maxSize = {0, 0};
   3001     for (size_t i = 0; i < count; i += 2) {
   3002         if (sizeArray[i] > 0 && sizeArray[i+1] > 0) {
   3003             float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1];
   3004             if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) {
   3005                 maxSize.width = sizeArray[i];
   3006                 maxSize.height = sizeArray[i+1];
   3007             }
   3008         }
   3009     }
   3010 
   3011     if (maxSize.width == 0 || maxSize.height == 0) {
   3012         maxSize.width = sizeArray[0];
   3013         maxSize.height = sizeArray[1];
   3014         ALOGW("Unable to find the size to match the given aspect ratio %f."
   3015                 "Fall back to %d x %d", ratio, maxSize.width, maxSize.height);
   3016     }
   3017 
   3018     return maxSize;
   3019 }
   3020 
   3021 Parameters::Size Parameters::getMaxSize(const Vector<Parameters::Size> &sizes) {
   3022     Size maxSize = {-1, -1};
   3023     for (size_t i = 0; i < sizes.size(); i++) {
   3024         if (sizes[i].width > maxSize.width ||
   3025                 (sizes[i].width == maxSize.width && sizes[i].height > maxSize.height )) {
   3026             maxSize = sizes[i];
   3027         }
   3028     }
   3029     return maxSize;
   3030 }
   3031 
   3032 Vector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() {
   3033     const int STREAM_CONFIGURATION_SIZE = 4;
   3034     const int STREAM_FORMAT_OFFSET = 0;
   3035     const int STREAM_WIDTH_OFFSET = 1;
   3036     const int STREAM_HEIGHT_OFFSET = 2;
   3037     const int STREAM_IS_INPUT_OFFSET = 3;
   3038     Vector<StreamConfiguration> scs;
   3039 
   3040     camera_metadata_ro_entry_t availableStreamConfigs =
   3041                 staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
   3042     for (size_t i = 0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
   3043         int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
   3044         int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
   3045         int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
   3046         int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
   3047         StreamConfiguration sc = {format, width, height, isInput};
   3048         scs.add(sc);
   3049     }
   3050     return scs;
   3051 }
   3052 
   3053 int64_t Parameters::getJpegStreamMinFrameDurationNs(Parameters::Size size) {
   3054     return getMinFrameDurationNs(size, HAL_PIXEL_FORMAT_BLOB);
   3055 }
   3056 
   3057 int64_t Parameters::getMinFrameDurationNs(Parameters::Size size, int fmt) {
   3058     const int STREAM_DURATION_SIZE = 4;
   3059     const int STREAM_FORMAT_OFFSET = 0;
   3060     const int STREAM_WIDTH_OFFSET = 1;
   3061     const int STREAM_HEIGHT_OFFSET = 2;
   3062     const int STREAM_DURATION_OFFSET = 3;
   3063     camera_metadata_ro_entry_t availableStreamMinDurations =
   3064                 staticInfo(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
   3065     for (size_t i = 0; i < availableStreamMinDurations.count; i+= STREAM_DURATION_SIZE) {
   3066         int64_t format = availableStreamMinDurations.data.i64[i + STREAM_FORMAT_OFFSET];
   3067         int64_t width = availableStreamMinDurations.data.i64[i + STREAM_WIDTH_OFFSET];
   3068         int64_t height = availableStreamMinDurations.data.i64[i + STREAM_HEIGHT_OFFSET];
   3069         int64_t duration = availableStreamMinDurations.data.i64[i + STREAM_DURATION_OFFSET];
   3070         if (format == fmt && width == size.width && height == size.height) {
   3071             return duration;
   3072         }
   3073     }
   3074 
   3075     return -1;
   3076 }
   3077 
   3078 bool Parameters::isFpsSupported(const Vector<Size> &sizes, int format, int32_t fps) {
   3079     // Get min frame duration for each size and check if the given fps range can be supported.
   3080     for (size_t i = 0 ; i < sizes.size(); i++) {
   3081         int64_t minFrameDuration = getMinFrameDurationNs(sizes[i], format);
   3082         if (minFrameDuration <= 0) {
   3083             ALOGE("Min frame duration (%" PRId64") for size (%dx%d) and format 0x%x is wrong!",
   3084                 minFrameDuration, sizes[i].width, sizes[i].height, format);
   3085             return false;
   3086         }
   3087         int32_t maxSupportedFps = 1e9 / minFrameDuration;
   3088         // Add some margin here for the case where the hal supports 29.xxxfps.
   3089         maxSupportedFps += FPS_MARGIN;
   3090         if (fps > maxSupportedFps) {
   3091             return false;
   3092         }
   3093     }
   3094     return true;
   3095 }
   3096 
   3097 SortedVector<int32_t> Parameters::getAvailableOutputFormats() {
   3098     SortedVector<int32_t> outputFormats; // Non-duplicated output formats
   3099     Vector<StreamConfiguration> scs = getStreamConfigurations();
   3100     for (size_t i = 0; i < scs.size(); i++) {
   3101         const StreamConfiguration &sc = scs[i];
   3102         if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) {
   3103             outputFormats.add(sc.format);
   3104         }
   3105     }
   3106 
   3107     return outputFormats;
   3108 }
   3109 
   3110 Vector<Parameters::Size> Parameters::getAvailableJpegSizes() {
   3111     Vector<Parameters::Size> jpegSizes;
   3112     Vector<StreamConfiguration> scs = getStreamConfigurations();
   3113     for (size_t i = 0; i < scs.size(); i++) {
   3114         const StreamConfiguration &sc = scs[i];
   3115         if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
   3116                 sc.format == HAL_PIXEL_FORMAT_BLOB) {
   3117             Size sz = {sc.width, sc.height};
   3118             jpegSizes.add(sz);
   3119         }
   3120     }
   3121 
   3122     return jpegSizes;
   3123 }
   3124 
   3125 Vector<Parameters::StreamConfiguration> Parameters::getPreferredStreamConfigurations(
   3126         int32_t usecaseId) const {
   3127     const size_t STREAM_CONFIGURATION_SIZE = 5;
   3128     const size_t STREAM_WIDTH_OFFSET = 0;
   3129     const size_t STREAM_HEIGHT_OFFSET = 1;
   3130     const size_t STREAM_FORMAT_OFFSET = 2;
   3131     const size_t STREAM_IS_INPUT_OFFSET = 3;
   3132     const size_t STREAM_USECASE_BITMAP_OFFSET = 4;
   3133     Vector<StreamConfiguration> scs;
   3134 
   3135     if (fastInfo.supportsPreferredConfigs) {
   3136         camera_metadata_ro_entry_t availableStreamConfigs = staticInfo(
   3137                 ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS);
   3138         for (size_t i = 0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
   3139             int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
   3140             int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
   3141             int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
   3142             int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
   3143             int32_t supportedUsecases =
   3144                     availableStreamConfigs.data.i32[i + STREAM_USECASE_BITMAP_OFFSET];
   3145             if (supportedUsecases & (1 << usecaseId)) {
   3146                 StreamConfiguration sc = {format, width, height, isInput};
   3147                 scs.add(sc);
   3148             }
   3149         }
   3150     }
   3151 
   3152     return scs;
   3153 }
   3154 
   3155 Vector<Parameters::Size> Parameters::getPreferredFilteredSizes(int32_t usecaseId,
   3156         int32_t format) const {
   3157     Vector<Parameters::Size> sizes;
   3158     Vector<StreamConfiguration> scs = getPreferredStreamConfigurations(usecaseId);
   3159     for (const auto &it : scs) {
   3160         if (it.format == format) {
   3161             sizes.add({it.width, it.height});
   3162         }
   3163     }
   3164 
   3165     return sizes;
   3166 }
   3167 
   3168 Vector<Parameters::Size> Parameters::getPreferredJpegSizes() const {
   3169     return getPreferredFilteredSizes(
   3170             ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_SNAPSHOT,
   3171             HAL_PIXEL_FORMAT_BLOB);
   3172 }
   3173 
   3174 Vector<Parameters::Size> Parameters::getPreferredPreviewSizes() const {
   3175     return getPreferredFilteredSizes(
   3176             ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_PREVIEW,
   3177             HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
   3178 }
   3179 
   3180 Vector<Parameters::Size> Parameters::getPreferredVideoSizes() const {
   3181     return getPreferredFilteredSizes(
   3182             ANDROID_SCALER_AVAILABLE_RECOMMENDED_STREAM_CONFIGURATIONS_RECORD,
   3183             HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
   3184 }
   3185 
   3186 Parameters::CropRegion Parameters::calculateCropRegion(bool previewOnly) const {
   3187 
   3188     float zoomLeft, zoomTop, zoomWidth, zoomHeight;
   3189 
   3190     // Need to convert zoom index into a crop rectangle. The rectangle is
   3191     // chosen to maximize its area on the sensor
   3192 
   3193     camera_metadata_ro_entry_t maxDigitalZoom =
   3194             staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
   3195     // For each zoom step by how many pixels more do we change the zoom
   3196     float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
   3197             (NUM_ZOOM_STEPS-1);
   3198     // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w)
   3199     // via interpolating zoom step into a zoom ratio
   3200     float zoomRatio = 1 + zoomIncrement * zoom;
   3201     ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]),
   3202         "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f",
   3203         maxDigitalZoom.data.f[0], zoomRatio);
   3204 
   3205     ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, "
   3206           "previewHeight=%d, activeWidth=%d, activeHeight=%d",
   3207           maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth,
   3208           previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight);
   3209 
   3210     if (previewOnly) {
   3211         // Calculate a tight crop region for the preview stream only
   3212         float previewRatio = static_cast<float>(previewWidth) / previewHeight;
   3213 
   3214         /* Ensure that the width/height never go out of bounds
   3215          * by scaling across a diffent dimension if an out-of-bounds
   3216          * possibility exists.
   3217          *
   3218          * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by
   3219          * calculating the zoomWidth from zoomHeight we'll actually get a
   3220          * zoomheight > arrayheight
   3221          */
   3222         float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight;
   3223         if (previewRatio >= arrayRatio) {
   3224             // Adjust the height based on the width
   3225             zoomWidth =  fastInfo.arrayWidth / zoomRatio;
   3226             zoomHeight = zoomWidth *
   3227                     previewHeight / previewWidth;
   3228 
   3229         } else {
   3230             // Adjust the width based on the height
   3231             zoomHeight = fastInfo.arrayHeight / zoomRatio;
   3232             zoomWidth = zoomHeight *
   3233                     previewWidth / previewHeight;
   3234         }
   3235     } else {
   3236         // Calculate the global crop region with a shape matching the active
   3237         // array.
   3238         zoomWidth = fastInfo.arrayWidth / zoomRatio;
   3239         zoomHeight = fastInfo.arrayHeight / zoomRatio;
   3240     }
   3241 
   3242     // center the zoom area within the active area
   3243     zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2;
   3244     zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2;
   3245 
   3246     ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d",
   3247         (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom);
   3248 
   3249     CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight };
   3250     return crop;
   3251 }
   3252 
   3253 status_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov)
   3254         const {
   3255     if (fastInfo.isExternalCamera) {
   3256         if (horizFov != NULL) {
   3257             *horizFov = -1.0;
   3258         }
   3259         if (vertFov != NULL) {
   3260             *vertFov = -1.0;
   3261         }
   3262         return OK;
   3263     }
   3264 
   3265     camera_metadata_ro_entry_t sensorSize =
   3266             staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2);
   3267     if (!sensorSize.count) return NO_INIT;
   3268 
   3269     camera_metadata_ro_entry_t pixelArraySize =
   3270             staticInfo(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 2, 2);
   3271     if (!pixelArraySize.count) return NO_INIT;
   3272 
   3273     float arrayAspect = static_cast<float>(fastInfo.arrayWidth) /
   3274             fastInfo.arrayHeight;
   3275     float stillAspect = static_cast<float>(pictureWidth) / pictureHeight;
   3276     ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect);
   3277 
   3278     // The crop factors from the full sensor array to the still picture crop
   3279     // region
   3280     float horizCropFactor = 1.f;
   3281     float vertCropFactor = 1.f;
   3282 
   3283     /**
   3284      * Need to calculate the still image field of view based on the total pixel
   3285      * array field of view, and the relative aspect ratios of the pixel array
   3286      * and output streams.
   3287      *
   3288      * Special treatment for quirky definition of crop region and relative
   3289      * stream cropping.
   3290      */
   3291     if (quirks.meteringCropRegion) {
   3292         // Use max of preview and video as first crop
   3293         float previewAspect = static_cast<float>(previewWidth) / previewHeight;
   3294         float videoAspect = static_cast<float>(videoWidth) / videoHeight;
   3295         if (videoAspect > previewAspect) {
   3296             previewAspect = videoAspect;
   3297         }
   3298         // First crop sensor to preview aspect ratio
   3299         if (arrayAspect < previewAspect) {
   3300             vertCropFactor = arrayAspect / previewAspect;
   3301         } else {
   3302             horizCropFactor = previewAspect / arrayAspect;
   3303         }
   3304         // Second crop to still aspect ratio
   3305         if (stillAspect < previewAspect) {
   3306             horizCropFactor *= stillAspect / previewAspect;
   3307         } else {
   3308             vertCropFactor *= previewAspect / stillAspect;
   3309         }
   3310     } else {
   3311         /**
   3312          * Crop are just a function of just the still/array relative aspect
   3313          * ratios. Since each stream will maximize its area within the crop
   3314          * region, and for FOV we assume a full-sensor crop region, we only ever
   3315          * crop the FOV either vertically or horizontally, never both.
   3316          */
   3317         horizCropFactor = (arrayAspect > stillAspect) ?
   3318                 (stillAspect / arrayAspect) : 1.f;
   3319         vertCropFactor = (arrayAspect < stillAspect) ?
   3320                 (arrayAspect / stillAspect) : 1.f;
   3321     }
   3322 
   3323     /**
   3324      * Convert the crop factors w.r.t the active array size to the crop factors
   3325      * w.r.t the pixel array size.
   3326      */
   3327     horizCropFactor *= (static_cast<float>(fastInfo.arrayWidth) /
   3328                             pixelArraySize.data.i32[0]);
   3329     vertCropFactor *= (static_cast<float>(fastInfo.arrayHeight) /
   3330                             pixelArraySize.data.i32[1]);
   3331 
   3332     ALOGV("Horiz crop factor: %f, vert crop fact: %f",
   3333             horizCropFactor, vertCropFactor);
   3334     /**
   3335      * Basic field of view formula is:
   3336      *   angle of view = 2 * arctangent ( d / 2f )
   3337      * where d is the physical sensor dimension of interest, and f is
   3338      * the focal length. This only applies to rectilinear sensors, for focusing
   3339      * at distances >> f, etc.
   3340      */
   3341     if (horizFov != NULL) {
   3342         *horizFov = 180 / M_PI * 2 *
   3343                 atanf(horizCropFactor * sensorSize.data.f[0] /
   3344                         (2 * fastInfo.defaultFocalLength));
   3345     }
   3346     if (vertFov != NULL) {
   3347         *vertFov = 180 / M_PI * 2 *
   3348                 atanf(vertCropFactor * sensorSize.data.f[1] /
   3349                         (2 * fastInfo.defaultFocalLength));
   3350     }
   3351     return OK;
   3352 }
   3353 
   3354 int32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const {
   3355     return max;
   3356 }
   3357 
   3358 }; // namespace camera2
   3359 }; // namespace android
   3360