12e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala/*
22e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
32e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *
42e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
52e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * you may not use this file except in compliance with the License.
62e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * You may obtain a copy of the License at
72e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *
82e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
92e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala *
102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * See the License for the specific language governing permissions and
142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala * limitations under the License.
152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala */
162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17852c381dbd1a9f86e6759201b50ac8847a1c3e3cEino-Ville Talvala#define LOG_TAG "Camera2-Parameters"
182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala//#define LOG_NDEBUG 0
202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Log.h>
2269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala#include <utils/Trace.h>
2363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin#include <utils/Vector.h>
2463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin#include <utils/SortedVector.h>
2569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <math.h>
272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <stdlib.h>
28c33e4b59c48aff4c531ba33d03066b0fe101b8bfEino-Ville Talvala#include <cutils/properties.h>
292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "Parameters.h"
312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "system/camera.h"
322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 {
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId,
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int cameraFacing) :
382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraId(cameraId),
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraFacing(cameraFacing),
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        info(NULL) {
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() {
442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::initialize(const CameraMetadata *info) {
472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (info->entryCount() == 0) {
502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: No static information provided!", __FUNCTION__);
512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::info = info;
542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = buildFastInfo();
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
58596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    res = buildQuirks();
59596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    if (res != OK) return res;
60596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala
612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableProcessedSizes =
622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick more intelligently
662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewWidth = availableProcessedSizes.data.i32[0];
672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewHeight = availableProcessedSizes.data.i32[1];
682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoWidth = previewWidth;
692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoHeight = previewHeight;
702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPreviewSize(previewWidth, previewHeight);
722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setVideoSize(videoWidth, videoHeight);
732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%dx%d",
752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight));
762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewSizes;
782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFpsRange[0] = availableFpsRanges.data.i32[0];
952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFpsRange[1] = availableFpsRanges.data.i32[1];
962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%d,%d",
99b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala                    previewFpsRange[0] * kFpsToApiScale,
100b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala                    previewFpsRange[1] * kFpsToApiScale));
1012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFpsRange;
1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
107b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala                    availableFpsRanges.data.i32[i] * kFpsToApiScale,
108b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1] * kFpsToApiScale);
1092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFpsRange);
1122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatEnumToString(previewFormat)); // NV21
1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewTransform = degToTransform(0,
1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            cameraFacing == CAMERA_FACING_FRONT);
1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFormats =
1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFormats;
1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
15592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_420_888:
15692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                // Flexible YUV allows both YV12 and NV21
15792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                supportedPreviewFormats +=
15892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
15992086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                supportedPreviewFormats += ",";
16092086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                supportedPreviewFormats +=
16192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
16292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                break;
1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
16492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableFormats.data.i32[i]);
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats);
1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // still have to do something sane for them
1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
184823b786e8558b7e73d9096cdd629e8896226e422Eino-Ville Talvala    // NOTE: Not scaled like FPS range values are.
18563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin    previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]);
1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
18763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            previewFps);
1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
19063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin        SortedVector<int32_t> sortedPreviewFrameRates;
19163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
19463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            // from the [min, max] fps range use the max value
19563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            int fps = fpsFromRange(availableFpsRanges.data.i32[i],
19663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                                   availableFpsRanges.data.i32[i+1]);
19763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
19863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            // de-dupe frame rates
19963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) {
20063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                sortedPreviewFrameRates.add(fps);
20163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            }
20263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            else {
20363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                continue;
20463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            }
20563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
20663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            if (sortedPreviewFrameRates.size() > 1) {
20763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                supportedPreviewFrameRates += ",";
20863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            }
20963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
21163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    fps);
21263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
21363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            ALOGV("%s: Supported preview frame rates: %s",
21463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    __FUNCTION__, supportedPreviewFrameRates.string());
2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFrameRates);
2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegSizes =
2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick maximum
2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    pictureWidth = availableJpegSizes.data.i32[0];
2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    pictureHeight = availableJpegSizes.data.i32[1];
2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureSize(pictureWidth,
2292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            pictureHeight);
2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPictureSizes;
2332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
2342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
2362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
2372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPictureSizes);
2412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
2442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
2452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
2462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
248a1e4e309e9a32afa3a26576fa592789168db182eEino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
2492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
2522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[0]);
2572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[1]);
2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedJpegThumbSizes;
2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
2672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedJpegThumbSizes);
2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbQuality = 90;
2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbQuality);
2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegQuality = 90;
2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegQuality);
2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegRotation = 0;
2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegRotation);
2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsEnabled = false;
2834cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    gpsCoordinates[0] = 0.0;
2844cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    gpsCoordinates[1] = 0.0;
2854cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    gpsCoordinates[2] = 0.0;
2864cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    gpsTimestamp = 0;
2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsProcessingMethod = "unknown";
2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2902d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    wbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
2962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedWhiteBalance;
2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
3032d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_AUTO:
3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3072d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3112d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3232d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3272d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_SHADE:
3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Skipping values not mappable to v1 API
3362d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_CONTROL_AWB_MODE_OFF:
3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance);
3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3512d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedEffects;
3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedEffects += ",";
3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
3652d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_OFF:
3662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NONE;
3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3692d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_MONO:
3702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_MONO;
3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3732d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE:
3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3772d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE:
3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3812d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SEPIA:
3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3852d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE:
3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3892d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD:
3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3932d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD:
3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3972d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_AQUA:
3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableEffects.data.u8[i]);
4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4112d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedAntibanding;
4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
4252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF:
4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ:
4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ:
4342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO:
4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedAntibanding);
4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
453c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    sceneMode = ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool noSceneModes = false;
4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    noSceneModes = true;
4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    // Not in old API
4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableSceneModes.data.u8[i]);
5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!noSceneModes) {
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes);
546b08a63931f22a1e934b32e8fb8de9ab4877d5258Igor Murashkin        } else {
547b08a63931f22a1e934b32e8fb8de9ab4877d5258Igor Murashkin            params.remove(CameraParameters::KEY_SCENE_MODE);
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
5522d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1);
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
5602814a4dc0dd45007ce62871af08b98214cd1692cAlex Ray        flashMode = Parameters::FLASH_MODE_OFF;
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
5622814a4dc0dd45007ce62871af08b98214cd1692cAlex Ray                CameraParameters::FLASH_MODE_OFF);
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
5712d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                    ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes);
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        flashMode = Parameters::FLASH_MODE_OFF;
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
5882d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 1, 1);
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // Fixed-focus lens
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_FIXED;
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_AUTO;
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY);
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
6132d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6212d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                // Not supported in old API
6342d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
6382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFocusModes);
6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
647f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala    focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
6484c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala    shadowFocusMode = FOCUS_MODE_INVALID;
6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t max3aRegions =
6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
654572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    int32_t maxNumFocusAreas = 0;
655572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    if (focusMode != Parameters::FOCUS_MODE_FIXED) {
656572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin        maxNumFocusAreas = max3aRegions.data.i32[0];
657572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    }
658572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas);
6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.clear();
6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.add(Parameters::Area(0,0,0,0,0));
6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
6652d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
671a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    float horizFov, vertFov;
672a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
673a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (res != OK) {
674a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        ALOGE("%s: Can't calculate field of views!", __FUNCTION__);
675a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        return res;
676a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    }
6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    exposureCompensation = 0;
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                exposureCompensation);
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
6862d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2);
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
6952d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1);
6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoExposureLock = false;
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoWhiteBalanceLock = false;
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions.data.i32[0]);
7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoom = 0;
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, zoom);
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
7252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1);
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 zoomRatios;
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoom = 1.f;
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (NUM_ZOOM_STEPS-1);
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) zoomRatios += ",";
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoom += zoomIncrement;
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
7460ad293aac9af377606fb4aa752b95547a8462791Igor Murashkin            CameraParameters::FALSE);
7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "Infinity,Infinity,Infinity");
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fastInfo.maxFaces);
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            0);
7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7594cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    recordingHint = false;
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7664cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    videoStabilization = false;
7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::TRUE);
7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FALSE);
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    storeMetadataInBuffers = true;
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    playShutterSound = true;
7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFaceDetect = false;
7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFocusMoveMessages = false;
78969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    afTriggerCounter = 1;
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    currentAfTriggerId = -1;
7914cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    afInMotion = false;
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
79369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    precaptureTriggerCounter = 1;
79469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewCallbackFlags = 0;
7964cc45fa65659ff8771a185e4f4584a9b0da10247Eino-Ville Talvala    previewCallbackOneShot = false;
7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
798059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin    camera_metadata_ro_entry_t supportedHardwareLevel =
799059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        staticInfo(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL);
800059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin    if (!supportedHardwareLevel.count || (supportedHardwareLevel.data.u8[0] ==
801059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin            ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_LIMITED)) {
802059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        ALOGI("Camera %d: ZSL mode disabled for limited mode HALs", cameraId);
803c33e4b59c48aff4c531ba33d03066b0fe101b8bfEino-Ville Talvala        zslMode = false;
804a2acc96eadc02228b8a3366de3d05d3a6a81272cEino-Ville Talvala    } else {
805059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        char value[PROPERTY_VALUE_MAX];
806059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        property_get("camera.disable_zsl_mode", value, "0");
807059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        if (!strcmp(value,"1")) {
808059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin            ALOGI("Camera %d: Disabling ZSL mode", cameraId);
809059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin            zslMode = false;
810059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        } else {
811059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin            zslMode = true;
812059161b7ab0a38b276b1aa26e73ff4398a02e012Igor Murashkin        }
813c33e4b59c48aff4c531ba33d03066b0fe101b8bfEino-Ville Talvala    }
814c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
815c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    lightFx = LIGHTFX_NONE;
816c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    state = STOPPED;
8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    paramsFlattened = params.flatten();
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
824c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville TalvalaString8 Parameters::get() const {
825c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    return paramsFlattened;
826c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala}
827c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() {
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
8312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 2);
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t arrayWidth = activeArraySize.data.i32[0];
8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t arrayHeight = activeArraySize.data.i32[1];
8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
8372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES);
8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFaceDetectModes.count) return NO_INIT;
8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    uint8_t bestFaceDetectMode =
8412d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
8442d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF:
8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
8462d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE:
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (bestFaceDetectMode !=
8482d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    bestFaceDetectMode =
8502d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE;
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
8532d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL:
8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                bestFaceDetectMode =
8552d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                    ANDROID_STATISTICS_FACE_DETECT_MODE_FULL;
8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return NO_INIT;
8622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
8662d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 1, 1);
8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxFacesDetected.count) return NO_INIT;
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t maxFaces = maxFacesDetected.data.i32[0];
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
871c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
872c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
873c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    camera_metadata_ro_entry_t sceneModeOverrides =
874c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES);
875c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
8762d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
877c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    bool fixedLens = (minFocusDistance.data.f[0] == 0);
878c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
879a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
880a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
881a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
882a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
88392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    camera_metadata_ro_entry_t availableFormats =
88492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
88592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    if (!availableFormats.count) return NO_INIT;
88692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala
88792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala
888c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (sceneModeOverrides.count > 0) {
889c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        // sceneModeOverrides is defined to have 3 entries for each scene mode,
890c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        // which are AE, AWB, and AF override modes the HAL wants for that scene
891c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        // mode.
892c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        const size_t kModesPerSceneMode = 3;
893c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        if (sceneModeOverrides.count !=
894c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                availableSceneModes.count * kModesPerSceneMode) {
895c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            ALOGE("%s: Camera %d: Scene mode override list is an "
896c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    "unexpected size: %d (expected %d)", __FUNCTION__,
897c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    cameraId, sceneModeOverrides.count,
898c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    availableSceneModes.count);
899c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return NO_INIT;
900c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        }
901c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        for (size_t i = 0; i < availableSceneModes.count; i++) {
902c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            DeviceInfo::OverrideModes modes;
903c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            uint8_t aeMode =
904c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0];
905c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            switch(aeMode) {
9062d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_MODE_ON:
907c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.flashMode = FLASH_MODE_OFF;
908c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
9092d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
910c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.flashMode = FLASH_MODE_AUTO;
911c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
9122d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
913c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.flashMode = FLASH_MODE_ON;
914c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
9152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
916c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.flashMode = FLASH_MODE_RED_EYE;
917c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
918c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                default:
919c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__,
920c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                            aeMode);
921c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.flashMode = FLASH_MODE_INVALID;
922c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
923c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            }
924c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            modes.wbMode =
925c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1];
926c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            uint8_t afMode =
927c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2];
928c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            switch(afMode) {
9292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
930c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.focusMode = fixedLens ?
931c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                            FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY;
932c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
9332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
9342d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
9352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
9362d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
9372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
938c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.focusMode = static_cast<focusMode_t>(afMode);
939c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
940c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                default:
941c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__,
942c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                            afMode);
943c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes.focusMode = FOCUS_MODE_INVALID;
944c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    break;
945c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            }
946c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i],
947c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    modes);
948c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        }
949c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
950c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayWidth = arrayWidth;
9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayHeight = arrayHeight;
9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.bestFaceDetectMode = bestFaceDetectMode;
9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.maxFaces = maxFaces;
955a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
956a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    // Find smallest (widest-angle) focal length to use as basis of still
957a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    // picture FOV reporting.
958a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    fastInfo.minFocalLength = availableFocalLengths.data.f[0];
959a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    for (size_t i = 1; i < availableFocalLengths.count; i++) {
960a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) {
961a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            fastInfo.minFocalLength = availableFocalLengths.data.f[i];
962a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        }
963a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    }
964a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
96592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888
96692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    fastInfo.useFlexibleYuv = false;
96792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    for (size_t i = 0; i < availableFormats.count; i++) {
96892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala        if (availableFormats.data.i32[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) {
96992086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            fastInfo.useFlexibleYuv = true;
97092086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            break;
97192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala        }
97292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    }
97392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala    ALOGV("Camera %d: Flexible YUV %s supported",
97492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            cameraId, fastInfo.useFlexibleYuv ? "is" : "is not");
97592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
979596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvalastatus_t Parameters::buildQuirks() {
980596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    camera_metadata_ro_entry_t entry;
981596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO);
982596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1);
983596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled",
984596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala            cameraId);
985596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala
986596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT);
987596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1);
988596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled",
989596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala            cameraId);
990596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala
9913a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION);
9923a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1);
9933a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion"
9943a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin                " enabled", cameraId);
9953a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
996596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala    return OK;
997596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala}
998596cb97dff006229f10db8bd7306f4d228f96dfdEino-Ville Talvala
9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
100037b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin        size_t minCount, size_t maxCount, bool required) const {
10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t entry = info->find(tag);
10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
100337b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin    if (CC_UNLIKELY( entry.count == 0 ) && required) {
10042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
10052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
10072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag);
10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (CC_UNLIKELY(
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
10212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return entry;
10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1026c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalastatus_t Parameters::set(const String8& paramString) {
10272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
10282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1029c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    CameraParameters newParams(paramString);
10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only parameters
10322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // such as supported preview sizes, etc. Should probably produce an error if
10332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // they're changed.
10342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Extract and verify new parameters */
10362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t i;
10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters validatedParams(*this);
10402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_SIZE
10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewSize(&validatedParams.previewWidth,
10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewHeight);
10442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewWidth != previewWidth ||
10462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewHeight != previewHeight) {
10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
10502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight,
10522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth, validatedParams.previewHeight);
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewSizes =
10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewSizes.data.i32[i] ==
10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth) &&
10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewSizes.data.i32[i+1] ==
10612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight)) break;
10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.previewWidth,
10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight);
10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
107163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin    // RECORDING_HINT (always supported)
107263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin    validatedParams.recordingHint = boolFromString(
107363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
107463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin    bool recordingHintChanged = validatedParams.recordingHint != recordingHint;
107563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin    ALOGV_IF(recordingHintChanged, "%s: Recording hint changed to %d",
107663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            __FUNCTION__, recordingHintChanged);
107763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FPS_RANGE
10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool fpsRangeChanged = false;
10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewFpsRange[1]);
1082b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala    validatedParams.previewFpsRange[0] /= kFpsToApiScale;
1083b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala    validatedParams.previewFpsRange[1] /= kFpsToApiScale;
1084b5d91138fddcb1c4acdc91ddc68a9f4097da5b40Eino-Ville Talvala
10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFpsRange[0] != previewFpsRange[0] ||
10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] != previewFpsRange[1]) {
10872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        fpsRangeChanged = true;
10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
10912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
10922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[0]) &&
10932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
10942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]) ) {
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
11002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.previewFpsRange[0],
11012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]);
11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
110463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin        validatedParams.previewFps =
110563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            fpsFromRange(validatedParams.previewFpsRange[0],
110663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                         validatedParams.previewFpsRange[1]);
1107c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        newParams.setPreviewFrameRate(validatedParams.previewFps);
11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FORMAT
11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.previewFormat =
11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatStringToEnum(newParams.getPreviewFormat());
11132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFormat != previewFormat) {
11142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
11162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active!", __FUNCTION__);
11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableFormats =
11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
112192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala        // If using flexible YUV, always support NV21/YV12. Otherwise, check
112292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala        // HAL's list.
112392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala        if (! (fastInfo.useFlexibleYuv &&
112492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                (validatedParams.previewFormat ==
112592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                        HAL_PIXEL_FORMAT_YCrCb_420_SP ||
112692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                 validatedParams.previewFormat ==
112792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                        HAL_PIXEL_FORMAT_YV12) ) ) {
112892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            // Not using flexible YUV format, so check explicitly
112992086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            for (i = 0; i < availableFormats.count; i++) {
113092086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                if (availableFormats.data.i32[i] ==
113192086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                        validatedParams.previewFormat) break;
113292086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            }
113392086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            if (i == availableFormats.count) {
113492086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                ALOGE("%s: Requested preview format %s (0x%x) is not supported",
113592086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                        __FUNCTION__, newParams.getPreviewFormat(),
113692086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                        validatedParams.previewFormat);
113792086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala                return BAD_VALUE;
113892086e6d402dcad6e199325ef097d7707b3d1f83Eino-Ville Talvala            }
11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE
11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
11452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!fpsRangeChanged) {
1146823b786e8558b7e73d9096cdd629e8896226e422Eino-Ville Talvala        validatedParams.previewFps = newParams.getPreviewFrameRate();
114763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin        if (validatedParams.previewFps != previewFps || recordingHintChanged) {
11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
115063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            /**
115163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              * If recording hint is set, find the range that encompasses
115263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              * previewFps with the largest min index.
115363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              *
115463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              * If recording hint is not set, find the range with previewFps
115563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              * with the smallest min index.
115663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              *
115763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              * Either way, in case of multiple ranges, break the tie by
115863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              * selecting the smaller range.
115963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin              */
116063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            int targetFps = validatedParams.previewFps;
116163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            // all ranges which have targetFps
116263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            Vector<Range> candidateRanges;
11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
116463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                Range r = {
116563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                            availableFrameRates.data.i32[i],
116663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                            availableFrameRates.data.i32[i+1]
116763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                };
116863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
116963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                if (r.min <= targetFps && targetFps <= r.max) {
117063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    candidateRanges.push(r);
117163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                }
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
117363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            if (candidateRanges.isEmpty()) {
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, validatedParams.previewFps);
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
117863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            // most applicable range with targetFps
117963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            Range bestRange = candidateRanges[0];
118063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            for (i = 1; i < candidateRanges.size(); ++i) {
118163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                Range r = candidateRanges[i];
118263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
118363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                // Find by largest minIndex in recording mode
118463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                if (validatedParams.recordingHint) {
118563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    if (r.min > bestRange.min) {
118663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                        bestRange = r;
118763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    }
118863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
118963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                        bestRange = r;
119063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    }
119163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                }
119263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                // Find by smallest minIndex in preview mode
119363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                else {
119463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    if (r.min < bestRange.min) {
119563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                        bestRange = r;
119663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    }
119763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
119863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                        bestRange = r;
119963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    }
120063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                }
120163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            }
120263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[0] =
120463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    bestRange.min;
12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] =
120663dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                    bestRange.max;
120763dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
120863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin            ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d",
120963dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                __FUNCTION__,
121063dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                validatedParams.previewFpsRange[0],
121163dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                validatedParams.previewFpsRange[1],
121263dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin                validatedParams.recordingHint);
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
121402b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala        newParams.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
121502b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala                String8::format("%d,%d",
121602b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala                        validatedParams.previewFpsRange[0] * kFpsToApiScale,
121702b62d3672ebb0761752ba6c841b2cc469c59ed3Eino-Ville Talvala                        validatedParams.previewFpsRange[1] * kFpsToApiScale));
121863dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PICTURE_SIZE
12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPictureSize(&validatedParams.pictureWidth,
12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.pictureHeight);
12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.pictureWidth == pictureWidth ||
12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.pictureHeight == pictureHeight) {
12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePictureSizes =
12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePictureSizes.data.i32[i] ==
12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureWidth) &&
12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePictureSizes.data.i32[i+1] ==
12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight)) break;
12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePictureSizes.count) {
12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.pictureWidth,
12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight);
12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
12432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[0] =
12442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[1] =
12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
12522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableJpegThumbSizes.data.i32[i] ==
12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[0]) &&
12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableJpegThumbSizes.data.i32[i+1] ==
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1])) break;
12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.jpegThumbSize[0],
12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1]);
12612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
1266eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
1267eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    // also makes sure quality fits in uint8_t
1268eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    if (quality < 0 || quality > 100) {
12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
1270eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala                __FUNCTION__, quality);
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1273eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    validatedParams.jpegThumbQuality = quality;
12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_QUALITY
1276eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
1277eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    // also makes sure quality fits in uint8_t
1278eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    if (quality < 0 || quality > 100) {
12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
1280eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala                __FUNCTION__, quality);
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1283eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    validatedParams.jpegQuality = quality;
12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ROTATION
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegRotation =
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegRotation != 0 &&
12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 90 &&
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 180 &&
12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 270) {
12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegRotation);
12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *gpsLatStr =
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (gpsLatStr != NULL) {
13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsLongStr =
13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsAltitudeStr =
13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsTimeStr =
13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsProcMethodStr =
13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (gpsLongStr == NULL ||
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsAltitudeStr == NULL ||
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsTimeStr == NULL ||
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsProcMethodStr == NULL) {
13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *endPtr;
13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    gpsAltitudeStr);
13362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
13412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsProcessingMethod = gpsProcMethodStr;
13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = true;
13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = false;
13492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EFFECT
13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.effectMode = effectModeStringToEnum(
13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.effectMode != effectMode) {
13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableEffectModes.count) {
13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
13622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
13632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
13642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ANTIBANDING
13692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.antibandingMode = abModeStringToEnum(
13702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
13712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.antibandingMode != antibandingMode) {
13722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
13732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableAbModes.count) {
13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
13802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // SCENE_MODE
13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.sceneMode = sceneModeStringToEnum(
13882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.sceneMode != sceneMode &&
13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.sceneMode !=
13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) {
13922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
13932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
13942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
13952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
13962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableSceneModes.count) {
13992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
14002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
14012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1405c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    bool sceneModeSet =
1406c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
14072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FLASH_MODE
1409c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (sceneModeSet) {
1410c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.flashMode =
1411c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                fastInfo.sceneModeOverrides.
1412c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                        valueFor(validatedParams.sceneMode).flashMode;
1413c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    } else {
1414c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.flashMode = FLASH_MODE_INVALID;
1415c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
1416c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (validatedParams.flashMode == FLASH_MODE_INVALID) {
1417c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.flashMode = flashModeStringToEnum(
1418c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            newParams.get(CameraParameters::KEY_FLASH_MODE) );
1419c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
1420c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.flashMode != flashMode) {
14222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
14232d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1);
14242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
14262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (validatedParams.flashMode == availableAeModes.data.u8[i])
14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableAeModes.count) {
14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == -1) {
14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1449c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        // Update in case of override
1450c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        newParams.set(CameraParameters::KEY_FLASH_MODE,
1451c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                flashModeEnumToString(validatedParams.flashMode));
1452c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
1453c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
1454c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    // WHITE_BALANCE
1455c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (sceneModeSet) {
1456c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.wbMode =
1457c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                fastInfo.sceneModeOverrides.
1458c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                        valueFor(validatedParams.sceneMode).wbMode;
1459c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    } else {
14602d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF;
1461c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
14622d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
1463c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.wbMode = wbModeStringToEnum(
1464c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
1465c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
1466c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (validatedParams.wbMode != wbMode) {
1467c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
1468c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1469c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
1470c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
1471c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        }
1472c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        if (i == availableWbModes.count) {
1473c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
1474c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    __FUNCTION__,
1475c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
1476c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return BAD_VALUE;
1477c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        }
1478c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        // Update in case of override
1479c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        newParams.set(CameraParameters::KEY_WHITE_BALANCE,
1480c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                wbModeEnumToString(validatedParams.wbMode));
14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_MODE
1484c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (sceneModeSet) {
1485c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.focusMode =
1486c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                fastInfo.sceneModeOverrides.
1487c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                        valueFor(validatedParams.sceneMode).focusMode;
1488c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    } else {
1489c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.focusMode = FOCUS_MODE_INVALID;
1490c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
1491c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (validatedParams.focusMode == FOCUS_MODE_INVALID) {
1492c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        validatedParams.focusMode = focusModeStringToEnum(
1493c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                newParams.get(CameraParameters::KEY_FOCUS_MODE) );
1494c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.focusMode != focusMode) {
14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = -1;
14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
14992d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin                staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE);
15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        "fixed focus lens",
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            } else if (validatedParams.focusMode !=
15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::FOCUS_MODE_INFINITY) {
15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
15112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (validatedParams.focusMode ==
15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableFocusModes.data.u8[i]) break;
15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (i == availableFocusModes.count) {
15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            __FUNCTION__,
15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return BAD_VALUE;
15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1522f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
15234c843702c7c2d2ca951e25bc54787c68c2071a8bEino-Ville Talvala        // Always reset shadow focus mode to avoid reverting settings
1524f1a6e0d28abdd0fcf9d35ecf53d7497f573f6113Eino-Ville Talvala        validatedParams.shadowFocusMode = FOCUS_MODE_INVALID;
1525c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        // Update in case of override
1526c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        newParams.set(CameraParameters::KEY_FOCUS_MODE,
1527c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                focusModeEnumToString(validatedParams.focusMode));
15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = currentAfTriggerId;
15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_AREAS
15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.focusingAreas);
15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t max3aRegions =
15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) res = validateAreas(validatedParams.focusingAreas,
1538572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin            max3aRegions, AREA_KIND_FOCUS);
15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EXPOSURE_COMPENSATION
15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.exposureCompensation =
15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
15492d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE);
15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if ((validatedParams.exposureCompensation <
15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]) ||
15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (validatedParams.exposureCompensation >
15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1])) {
15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.exposureCompensation);
15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoExposureLock = boolFromString(
15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoWhiteBalanceLock = boolFromString(
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // METERING_AREAS
15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.meteringAreas);
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) {
1571572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin        res = validateAreas(validatedParams.meteringAreas, max3aRegions,
1572572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin                            AREA_KIND_METERING);
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ZOOM
15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1583cfdd84284394cecdb33cf121fe6d4205da84c761Igor Murashkin    if (validatedParams.zoom < 0
1584cfdd84284394cecdb33cf121fe6d4205da84c761Igor Murashkin                || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) {
15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.zoom);
15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_SIZE
15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getVideoSize(&validatedParams.videoWidth,
15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.videoHeight);
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoWidth != videoWidth ||
15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.videoHeight != videoHeight) {
15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state == RECORD) {
15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableVideoSizes =
16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableVideoSizes.data.i32[i] ==
16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoWidth) &&
16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableVideoSizes.data.i32[i+1] ==
16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight)) break;
16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableVideoSizes.count) {
16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.videoWidth,
16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight);
16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_STABILIZATION
16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.videoStabilization = boolFromString(
16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoStabilization &&
16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            availableVideoStabilizationModes.count == 1) {
16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1626c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    // LIGHTFX
1627c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    validatedParams.lightFx = lightFxStringToEnum(
1628c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        newParams.get(CameraParameters::KEY_LIGHTFX));
1629c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Update internal parameters */
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    *this = validatedParams;
16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1634a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    /** Update external parameters calculated from the internal ones */
1635a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
1636a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    // HORIZONTAL/VERTICAL FIELD OF VIEW
1637a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    float horizFov, vertFov;
1638a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
1639a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (res != OK) {
1640a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        ALOGE("%s: Can't calculate FOVs", __FUNCTION__);
1641a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        // continue so parameters are at least consistent
1642a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    }
1643a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
1644a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            horizFov);
1645a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE,
1646a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            vertFov);
1647a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov);
1648a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
1649c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    // Need to flatten again in case of overrides
1650c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    paramsFlattened = newParams.flatten();
1651c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    params = newParams;
1652c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
16532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
165669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const {
165769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
165869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
165969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
1660b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin    /**
1661b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin     * Mixin default important security values
1662b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin     * - android.led.transmit = defaulted ON
1663b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin     */
1664b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin    camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS,
166537b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin                                                  /*minimumCount*/0,
166637b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin                                                  /*maximumCount*/0,
166737b2602761cbfc20f8a36e27eb4cf1b3dfd04e6bIgor Murashkin                                                  /*required*/false);
1668b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin    for(size_t i = 0; i < entry.count; ++i) {
1669b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin        uint8_t led = entry.data.u8[i];
1670b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin
1671b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin        switch(led) {
1672b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin            // Transmit LED is unconditionally on when using
1673b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin            // the android.hardware.Camera API
1674b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin            case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
1675b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin                uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
1676b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin                res = request->update(ANDROID_LED_TRANSMIT,
1677b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin                                      &transmitDefault, 1);
1678b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin                if (res != OK) return res;
1679b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin                break;
1680b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin            }
1681b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin        }
1682b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin    }
1683b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin
1684b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin    /**
1685b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin     * Construct metadata from parameters
1686b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin     */
1687b2d99929781e6c6c4aee41636aa5c6b6922b83deIgor Murashkin
16882d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
168969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_REQUEST_METADATA_MODE,
169069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &metadataMode, 1);
169169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
169269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
169369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
169469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            previewFpsRange, 2);
169569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
169669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
16972d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    uint8_t reqWbLock = autoWhiteBalanceLock ?
16982d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
16992d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_LOCK,
17002d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            &reqWbLock, 1);
17012d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala
170269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
170369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &effectMode, 1);
170469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
170569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
170669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &antibandingMode, 1);
170769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
170869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17092a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    // android.hardware.Camera requires that when face detect is enabled, the
17102a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    // camera is in a face-priority mode. HAL2 splits this into separate parts
17112a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    // (face detection statistics and face priority scene mode). Map from other
17122a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    // to the other.
1713c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    bool sceneModeActive =
1714c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
17152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO;
1716c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (enableFaceDetect || sceneModeActive) {
17172d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE;
17182a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    }
171969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
172069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqControlMode, 1);
172169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
17222a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala
1723063886eed72c1a12ff73953561d662b47e8230d5Eino-Ville Talvala    uint8_t reqSceneMode =
1724c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            sceneModeActive ? sceneMode :
1725063886eed72c1a12ff73953561d662b47e8230d5Eino-Ville Talvala            enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY :
1726063886eed72c1a12ff73953561d662b47e8230d5Eino-Ville Talvala            (uint8_t)ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED;
17272a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_SCENE_MODE,
17282a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala            &reqSceneMode, 1);
17292a88b7130e50ea579401a4407847e57fd36eab85Eino-Ville Talvala    if (res != OK) return res;
173069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF;
17322d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF;
173369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    switch (flashMode) {
173469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
17352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break;
173669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
17372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break;
173869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_ON:
17392d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break;
174069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
17412d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON;
17422d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqFlashMode = ANDROID_FLASH_MODE_TORCH;
174369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
174469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
17452d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break;
174669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        default:
174769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
174869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    cameraId, flashMode);
1749c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                return BAD_VALUE;
175069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
175169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
175269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFlashMode, 1);
175369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
175469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
175569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqAeMode, 1);
175669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
175769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
17582d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    uint8_t reqAeLock = autoExposureLock ?
17592d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
17602d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_LOCK,
17612d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            &reqAeLock, 1);
1762c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (res != OK) return res;
1763c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
1764c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
1765c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            &wbMode, 1);
1766c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    if (res != OK) return res;
17672d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala
176869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    float reqFocusDistance = 0; // infinity focus in diopters
17692d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
177069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    switch (focusMode) {
177169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
177269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
177369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
177469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
177569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
177669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusMode = focusMode;
177769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
177869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
177969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
17802d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
178169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
178269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        default:
1783c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
1784c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                        cameraId, focusMode);
1785c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                return BAD_VALUE;
178669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
178769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
178869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFocusDistance, 1);
178969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
179069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
179169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFocusMode, 1);
179269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
179369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
179469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t reqFocusingAreasSize = focusingAreas.size() * 5;
179569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize];
179669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (size_t i = 0; i < reqFocusingAreasSize; i += 5) {
179769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (focusingAreas[i].weight != 0) {
179869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 0] =
179969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedXToArray(focusingAreas[i].left);
180069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 1] =
180169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedYToArray(focusingAreas[i].top);
180269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 2] =
180369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedXToArray(focusingAreas[i].right);
180469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 3] =
180569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedYToArray(focusingAreas[i].bottom);
180669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
180769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 0] = 0;
180869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 1] = 0;
180969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 2] = 0;
181069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 3] = 0;
181169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
181269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        reqFocusingAreas[i + 4] = focusingAreas[i].weight;
181369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
181469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
181569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas, reqFocusingAreasSize);
181669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
181769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    delete[] reqFocusingAreas;
181869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18192d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
182069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &exposureCompensation, 1);
182169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
182269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
182369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t reqMeteringAreasSize = meteringAreas.size() * 5;
182469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize];
182569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (size_t i = 0; i < reqMeteringAreasSize; i += 5) {
182669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (meteringAreas[i].weight != 0) {
182769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 0] =
182869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedXToArray(meteringAreas[i].left);
182969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 1] =
183069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedYToArray(meteringAreas[i].top);
183169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 2] =
183269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedXToArray(meteringAreas[i].right);
183369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 3] =
183469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedYToArray(meteringAreas[i].bottom);
183569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
183669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 0] = 0;
183769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 1] = 0;
183869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 2] = 0;
183969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 3] = 0;
184069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
184169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        reqMeteringAreas[i + 4] = meteringAreas[i].weight;
184269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
184369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
184469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas, reqMeteringAreasSize);
184569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
184669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
184769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    delete[] reqMeteringAreas;
184869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
18493a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    /* don't include jpeg thumbnail size - it's valid for
18503a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin       it to be set to (0,0), meaning 'no thumbnail' */
18513a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion crop = calculateCropRegion( (CropRegion::Outputs)(
18523a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin            CropRegion::OUTPUT_PREVIEW     |
18533a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin            CropRegion::OUTPUT_VIDEO       |
18543a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin            CropRegion::OUTPUT_PICTURE    ));
1855be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin    int32_t reqCropRegion[4] = {
1856eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala        static_cast<int32_t>(crop.left),
1857eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala        static_cast<int32_t>(crop.top),
1858be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin        static_cast<int32_t>(crop.width),
1859be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin        static_cast<int32_t>(crop.height)
1860eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala    };
186169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
1862be53a80f4e50921790aa7c5eb12b798b988232b6Igor Murashkin            reqCropRegion, 4);
186369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
186469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
186569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqVstabMode = videoStabilization ?
18662d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON :
18672d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
186869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
186969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqVstabMode, 1);
187069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
187169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
187269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqFaceDetectMode = enableFaceDetect ?
187369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            fastInfo.bestFaceDetectMode :
18742d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
18752d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin    res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE,
187669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFaceDetectMode, 1);
187769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
187869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
187969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
188069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
188169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
1882db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const {
1883db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    status_t res;
1884db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala
1885db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE,
1886db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala            jpegThumbSize, 2);
1887db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) return res;
1888db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY,
1889db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala            &jpegThumbQuality, 1);
1890db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) return res;
1891db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = request->update(ANDROID_JPEG_QUALITY,
1892db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala            &jpegQuality, 1);
1893db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) return res;
1894db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    res = request->update(
1895db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
1896db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala            &jpegRotation, 1);
1897db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (res != OK) return res;
1898db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala
1899db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    if (gpsEnabled) {
1900db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        res = request->update(
1901db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
1902db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                gpsCoordinates, 3);
1903db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        if (res != OK) return res;
1904db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        res = request->update(
1905db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
1906db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                &gpsTimestamp, 1);
1907db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        if (res != OK) return res;
1908db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        res = request->update(
1909db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
1910db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala                gpsProcessingMethod);
1911db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        if (res != OK) return res;
1912db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    } else {
1913db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_COORDINATES);
1914db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        if (res != OK) return res;
1915db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP);
1916db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        if (res != OK) return res;
1917db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
1918db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala        if (res != OK) return res;
1919db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    }
1920db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala    return OK;
1921db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala}
1922db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala
1923db30e68be637ca85da238c1e8e3534ec07919985Eino-Ville Talvala
19242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) {
19252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
19262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(state) {
19272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
19282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
19292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
19302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
19312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
19322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
19332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
19342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
19352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return "Unknown state!";
19362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR
19392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
19402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) {
19422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
19434c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !format ?
19444c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP :
19452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
19462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
19472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
19482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
19492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
19502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
19512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
19522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
19532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
19542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
19552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
19562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
19572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
19582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
19592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
19602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
19612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) {
19632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *fmt;
19642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(format) {
19652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
19662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
19672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
19692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
19702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
19722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
19732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
19752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
19762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
19782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
19792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
19812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
19822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
19842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
19852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
19862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
19882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
19892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,  format);
19902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = NULL;
19912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
19922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return fmt;
19942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
19952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) {
19972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
19984c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !wbMode ?
19992d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
20002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
20012d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
20022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
20032d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_INCANDESCENT :
20042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
20052d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_FLUORESCENT :
20062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
20072d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT :
20082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
20092d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_DAYLIGHT :
20102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
20112d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT :
20122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
20132d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_TWILIGHT :
20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
20152d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AWB_MODE_SHADE :
20162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
20172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
20182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2019c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) {
2020c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    switch (wbMode) {
20212d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_AUTO:
2022c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_AUTO;
20232d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
2024c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_INCANDESCENT;
20252d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
2026c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_FLUORESCENT;
20272d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
2028c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
20292d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
2030c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_DAYLIGHT;
20312d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
2032c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
20332d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
2034c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_TWILIGHT;
20352d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin        case ANDROID_CONTROL_AWB_MODE_SHADE:
2036c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::WHITE_BALANCE_SHADE;
2037c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        default:
2038c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            ALOGE("%s: Unknown AWB mode enum: %d",
2039c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    __FUNCTION__, wbMode);
2040c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return "unknown";
2041c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
2042c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala}
2043c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
20442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) {
20452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
20464c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !effectMode ?
20472d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
20482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
20492d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
20502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
20512d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_MONO :
20522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
20532d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_NEGATIVE :
20542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
20552d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SOLARIZE :
20562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
20572d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SEPIA :
20582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
20592d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_POSTERIZE :
20602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
20612d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD :
20622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
20632d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD :
20642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
20652d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_EFFECT_MODE_AQUA :
20662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
20672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
20682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
20692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) {
20702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
20714c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !abMode ?
20722d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
20732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
20742d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
20752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
20762d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF :
20772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
20782d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ :
20792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
20802d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ :
20812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
20822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
20832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
20842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) {
20852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
20864c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !sceneMode ?
20874c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
20882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
20892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
20902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
20912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
20922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
20932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
20942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
20952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
20962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
20972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
20982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
20992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
21002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
21012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
21022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
21032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
21042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
21052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
21062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
21072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
21082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
21092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
21102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
21112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
21122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
21132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
21142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
21152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
21162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
21172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
21182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
21192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
21202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
21212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
21222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
21232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
21242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *flashMode) {
21252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
21264c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !flashMode ?
21274c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            Parameters::FLASH_MODE_INVALID :
21282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
21292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
21302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
21312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
21322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
21332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
21342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
21352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
21362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
21372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
21382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
21392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
21402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2141c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) {
2142c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    switch (flashMode) {
2143c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FLASH_MODE_OFF:
2144c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FLASH_MODE_OFF;
2145c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FLASH_MODE_AUTO:
2146c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FLASH_MODE_AUTO;
2147c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FLASH_MODE_ON:
2148c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FLASH_MODE_ON;
2149c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FLASH_MODE_RED_EYE:
2150c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FLASH_MODE_RED_EYE;
2151c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FLASH_MODE_TORCH:
2152c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FLASH_MODE_TORCH;
2153c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        default:
2154c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            ALOGE("%s: Unknown flash mode enum %d",
2155c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    __FUNCTION__, flashMode);
2156c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return "unknown";
2157c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
2158c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala}
2159c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
21602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
21612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *focusMode) {
21622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
21634c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !focusMode ?
21644c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            Parameters::FOCUS_MODE_INVALID :
21652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
21662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
21672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
21682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
21692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
21702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
21712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
21722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
21732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
21742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
21752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
21762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
21772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
21782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
21792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
21802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
21812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2182c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) {
2183c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    switch (focusMode) {
2184c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_AUTO:
2185c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_AUTO;
2186c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_MACRO:
2187c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_MACRO;
2188c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_VIDEO:
2189c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
2190c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_PICTURE:
2191c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
2192c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_EDOF:
2193c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_EDOF;
2194c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_INFINITY:
2195c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_INFINITY;
2196c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        case FOCUS_MODE_FIXED:
2197c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return CameraParameters::FOCUS_MODE_FIXED;
2198c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala        default:
2199c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            ALOGE("%s: Unknown focus mode enum: %d",
2200c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala                    __FUNCTION__, focusMode);
2201c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala            return "unknown";
2202c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala    }
2203c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala}
2204c85f826e7b67bdf159a3f1b01bc9f1f33d05aaffEino-Ville Talvala
2205c3dbf1a40df85b75e5805382838a90416f69730fJames PainterParameters::Parameters::lightFxMode_t Parameters::lightFxStringToEnum(
2206c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        const char *lightFxMode) {
2207c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return
22084c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !lightFxMode ?
22094c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            Parameters::LIGHTFX_NONE :
2210c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        !strcmp(lightFxMode, CameraParameters::LIGHTFX_LOWLIGHT) ?
2211c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            Parameters::LIGHTFX_LOWLIGHT :
2212c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        !strcmp(lightFxMode, CameraParameters::LIGHTFX_HDR) ?
2213c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            Parameters::LIGHTFX_HDR :
2214c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        Parameters::LIGHTFX_NONE;
2215c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
2216c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
22172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr,
22182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
22192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
22202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    areas->clear();
22212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areasCStr == NULL) {
22222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
22232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push();
22242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return OK;
22252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    String8 areasStr(areasCStr);
22272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
22282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    while (areaStart != 0) {
22292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
22302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *numEnd;
22312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int vals[NUM_FIELDS];
22322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
22332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            errno = 0;
22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            area = numEnd + 1;
22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push(Parameters::Area(
22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
2246572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin                                      size_t maxRegions,
2247572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin                                      AreaKind areaKind) const {
22482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Definition of valid area can be found in
22492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // include/camera/CameraParameters.h
22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
22512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 1) {
22522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (areas[0].left == 0 &&
22532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].top == 0 &&
22542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].right == 0 &&
22552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].bottom == 0 &&
22562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].weight == 0) {
22572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
22582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return OK;
22592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
22602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2261572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin
2262572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    // fixed focus can only set (0,0,0,0,0) focus area
2263572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) {
2264572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin        return BAD_VALUE;
2265572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin    }
2266572bf9a00204ac91de8c5347d793891c6a4bf1d7Igor Murashkin
22672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() > maxRegions) {
22682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
22692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, areas.size());
22702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
22712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
22742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala         a != areas.end(); a++) {
22752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
22762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
22772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
22782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
22792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
22802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
22842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) {
22872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return !boolStr ? false :
22882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
22892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        false;
22902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) {
22932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!mirror) {
22942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) return 0;
22952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
22962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
22972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
22982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
22992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
23002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
23012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
23022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
23032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
23042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
23052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
23062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
23072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
23082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return -1;
23112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23133a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropXToArray(int x) const {
23143a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds"
23153a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin                         "(lower = 0)", x);
23163a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23173a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23183a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' "
2319a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                    "is out of bounds (upper = %f)", x, previewCrop.width);
23203a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23213a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    int ret = x + previewCrop.left;
23223a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23233a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth),
23243a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        "Calculated pixel array value X = '%d' is out of bounds (upper = %d)",
23253a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        ret, fastInfo.arrayWidth);
23263a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return ret;
23273a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23283a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23293a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropYToArray(int y) const {
23303a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds "
23313a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        "(lower = 0)", y);
23323a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23333a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23343a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is "
2335a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                "out of bounds (upper = %f)", y, previewCrop.height);
23363a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23373a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    int ret = y + previewCrop.top;
23383a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23393a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight),
23403a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)",
23413a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        ret, fastInfo.arrayHeight);
23423a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23433a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return ret;
23443a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23453a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23463a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23473a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::normalizedXToCrop(int x) const {
23483a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23493a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return (x + 1000) * (previewCrop.width - 1) / 2000;
23503a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23513a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23523a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::normalizedYToCrop(int y) const {
23533a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23543a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return (y + 1000) * (previewCrop.height - 1) / 2000;
23553a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23563a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23573a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::arrayXToCrop(int x) const {
23583a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23593a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return x - previewCrop.left;
23603a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23613a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23623a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::arrayYToCrop(int y) const {
23633a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23643a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return y - previewCrop.top;
23653a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23663a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23673a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropXToNormalized(int x) const {
23683a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23693a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return x * 2000 / (previewCrop.width - 1) - 1000;
23703a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23713a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23723a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkinint Parameters::cropYToNormalized(int y) const {
23733a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
23743a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return y * 2000 / (previewCrop.height - 1) - 1000;
23753a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin}
23763a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const {
23783a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    int ret = cropXToNormalized(arrayXToCrop(width));
23793a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23803a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of "
23813a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        "lower bounds %d", ret);
23823a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of "
23833a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        "upper bounds %d", ret);
23843a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23853a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
23863a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    if (quirks.meteringCropRegion) {
23873a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        return width * 2000 / (fastInfo.arrayWidth - 1) - 1000;
23883a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    }
23893a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23903a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return ret;
23912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const {
23943a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    int ret = cropYToNormalized(arrayYToCrop(height));
23953a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
23963a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of lower bounds"
23973a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        " %d", ret);
23983a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of upper bounds"
23993a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        " %d", ret);
24003a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
24013a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
24023a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    if (quirks.meteringCropRegion) {
24033a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        return height * 2000 / (fastInfo.arrayHeight - 1) - 1000;
24043a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    }
24053a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
24063a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return ret;
24072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const {
24103a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
24113a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
24123a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    if (quirks.meteringCropRegion) {
24133a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
24143a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    }
24153a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
24163a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return cropXToArray(normalizedXToCrop(x));
24172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const {
24203a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
24213a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    if (quirks.meteringCropRegion) {
24223a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin        return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
24233a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    }
24243a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
24253a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin    return cropYToArray(normalizedYToCrop(y));
24262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24283a6e45320685b36bb266bbf8fa548f4474d90d6cIgor MurashkinParameters::CropRegion Parameters::calculateCropRegion(
24293a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin                            Parameters::CropRegion::Outputs outputs) const {
2430e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2431e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2432e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2433e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // Need to convert zoom index into a crop rectangle. The rectangle is
2434e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // chosen to maximize its area on the sensor
2435e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2436e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    camera_metadata_ro_entry_t maxDigitalZoom =
24372d2b40b67515208273197ac2f03c5fabd430efaeIgor Murashkin            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
2438e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // For each zoom step by how many pixels more do we change the zoom
2439e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
2440e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            (NUM_ZOOM_STEPS-1);
2441e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w)
2442e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // via interpolating zoom step into a zoom ratio
2443e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    float zoomRatio = 1 + zoomIncrement * zoom;
2444e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]),
2445e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f",
2446e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        maxDigitalZoom.data.f[0], zoomRatio);
2447e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2448e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, "
2449e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin          "previewHeight=%d, activeWidth=%d, activeHeight=%d",
2450e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin          maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth,
2451e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin          previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight);
2452e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2453e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    /*
2454e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * Assumption: On the HAL side each stream buffer calculates its crop
2455e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * rectangle as follows:
2456e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     *   cropRect = (zoomLeft, zoomRight,
2457e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     *               zoomWidth, zoomHeight * zoomWidth / outputWidth);
2458e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     *
2459e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * Note that if zoomWidth > bufferWidth, the new cropHeight > zoomHeight
2460e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     *      (we can then get into trouble if the cropHeight > arrayHeight).
2461e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * By selecting the zoomRatio based on the smallest outputRatio, we
2462e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * guarantee this will never happen.
2463e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     */
2464e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2465e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // Enumerate all possible output sizes, select the one with the smallest
2466e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // aspect ratio
2467e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    float minOutputWidth, minOutputHeight, minOutputRatio;
2468e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    {
2469e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        float outputSizes[][2] = {
2470eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala            { static_cast<float>(previewWidth),
2471eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala              static_cast<float>(previewHeight) },
2472eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala            { static_cast<float>(videoWidth),
2473eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala              static_cast<float>(videoHeight) },
2474eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala            { static_cast<float>(jpegThumbSize[0]),
2475eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala              static_cast<float>(jpegThumbSize[1]) },
2476eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala            { static_cast<float>(pictureWidth),
2477eae312137f71af037d5f5b4071eef8e2ecd6055eEino-Ville Talvala              static_cast<float>(pictureHeight) },
2478e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        };
2479e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2480e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        minOutputWidth = outputSizes[0][0];
2481e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        minOutputHeight = outputSizes[0][1];
2482e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        minOutputRatio = minOutputWidth / minOutputHeight;
2483e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        for (unsigned int i = 0;
2484e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin             i < sizeof(outputSizes) / sizeof(outputSizes[0]);
2485e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin             ++i) {
2486e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
24873a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin            // skip over outputs we don't want to consider for the crop region
24883a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin            if ( !((1 << i) & outputs) ) {
24893a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin                continue;
24903a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin            }
24913a6e45320685b36bb266bbf8fa548f4474d90d6cIgor Murashkin
2492e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            float outputWidth = outputSizes[i][0];
2493e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            float outputHeight = outputSizes[i][1];
2494e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            float outputRatio = outputWidth / outputHeight;
2495e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2496e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            if (minOutputRatio > outputRatio) {
2497e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin                minOutputRatio = outputRatio;
2498e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin                minOutputWidth = outputWidth;
2499e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin                minOutputHeight = outputHeight;
2500e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            }
2501e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2502e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            // and then use this output ratio instead of preview output ratio
2503e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin            ALOGV("Enumerating output ratio %f = %f / %f, min is %f",
2504e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin                  outputRatio, outputWidth, outputHeight, minOutputRatio);
2505e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        }
2506e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    }
2507e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2508e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    /* Ensure that the width/height never go out of bounds
2509e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * by scaling across a diffent dimension if an out-of-bounds
2510e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * possibility exists.
2511e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     *
2512e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by
2513e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * calculating the zoomWidth from zoomHeight we'll actually get a
2514e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     * zoomheight > arrayheight
2515e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin     */
2516e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight;
2517e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    if (minOutputRatio >= arrayRatio) {
2518e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        // Adjust the height based on the width
2519e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        zoomWidth =  fastInfo.arrayWidth / zoomRatio;
2520e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        zoomHeight = zoomWidth *
2521e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin                minOutputHeight / minOutputWidth;
2522e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2523e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    } else {
2524e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        // Adjust the width based on the height
2525e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        zoomHeight = fastInfo.arrayHeight / zoomRatio;
2526e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        zoomWidth = zoomHeight *
2527e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin                minOutputWidth / minOutputHeight;
2528e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    }
2529e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    // centering the zoom area within the active area
2530e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2;
2531e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2;
2532e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2533e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d",
2534e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin        (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom);
2535e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2536e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2537e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight };
2538e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin    return crop;
2539e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin}
2540e500bc25cb801e69b4193b2863ec40bb3de04db9Igor Murashkin
2541a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov)
2542a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        const {
2543a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
2544a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2);
2545a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
2546a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
2547a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
2548a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
2549a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
2550a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
2551a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    float arrayAspect = static_cast<float>(fastInfo.arrayWidth) /
2552a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            fastInfo.arrayHeight;
2553a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    float stillAspect = static_cast<float>(pictureWidth) / pictureHeight;
2554a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect);
2555a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
2556a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    // The crop factors from the full sensor array to the still picture crop
2557a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    // region
2558a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    float horizCropFactor = 1.f;
2559a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    float vertCropFactor = 1.f;
2560a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
2561a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    /**
2562a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * Need to calculate the still image field of view based on the total pixel
2563a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * array field of view, and the relative aspect ratios of the pixel array
2564a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * and output streams.
2565a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     *
2566a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * Special treatment for quirky definition of crop region and relative
2567a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * stream cropping.
2568a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     */
2569a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (quirks.meteringCropRegion) {
25704ad015003cbab4ee6889b803225648c76a156193Alex Ray        // Use max of preview and video as first crop
25714ad015003cbab4ee6889b803225648c76a156193Alex Ray        float previewAspect = static_cast<float>(previewWidth) / previewHeight;
25724ad015003cbab4ee6889b803225648c76a156193Alex Ray        float videoAspect = static_cast<float>(videoWidth) / videoHeight;
25734ad015003cbab4ee6889b803225648c76a156193Alex Ray        if (videoAspect > previewAspect) {
25744ad015003cbab4ee6889b803225648c76a156193Alex Ray            previewAspect = videoAspect;
25754ad015003cbab4ee6889b803225648c76a156193Alex Ray        }
25764ad015003cbab4ee6889b803225648c76a156193Alex Ray        // First crop sensor to preview aspect ratio
25774ad015003cbab4ee6889b803225648c76a156193Alex Ray        if (arrayAspect < previewAspect) {
25784ad015003cbab4ee6889b803225648c76a156193Alex Ray            vertCropFactor = arrayAspect / previewAspect;
25794ad015003cbab4ee6889b803225648c76a156193Alex Ray        } else {
25804ad015003cbab4ee6889b803225648c76a156193Alex Ray            horizCropFactor = previewAspect / arrayAspect;
25814ad015003cbab4ee6889b803225648c76a156193Alex Ray        }
25824ad015003cbab4ee6889b803225648c76a156193Alex Ray        // Second crop to still aspect ratio
25834ad015003cbab4ee6889b803225648c76a156193Alex Ray        if (stillAspect < previewAspect) {
25844ad015003cbab4ee6889b803225648c76a156193Alex Ray            horizCropFactor *= stillAspect / previewAspect;
25854ad015003cbab4ee6889b803225648c76a156193Alex Ray        } else {
25864ad015003cbab4ee6889b803225648c76a156193Alex Ray            vertCropFactor *= previewAspect / stillAspect;
2587a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        }
2588a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    } else {
2589a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        /**
2590a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala         * Crop are just a function of just the still/array relative aspect
2591a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala         * ratios. Since each stream will maximize its area within the crop
2592a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala         * region, and for FOV we assume a full-sensor crop region, we only ever
2593a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala         * crop the FOV either vertically or horizontally, never both.
2594a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala         */
2595a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        horizCropFactor = (arrayAspect > stillAspect) ?
2596a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                (stillAspect / arrayAspect) : 1.f;
2597a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        vertCropFactor = (arrayAspect < stillAspect) ?
2598a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                (arrayAspect / stillAspect) : 1.f;
2599a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    }
2600a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    ALOGV("Horiz crop factor: %f, vert crop fact: %f",
2601a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala            horizCropFactor, vertCropFactor);
2602a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    /**
2603a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * Basic field of view formula is:
2604a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     *   angle of view = 2 * arctangent ( d / 2f )
2605a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * where d is the physical sensor dimension of interest, and f is
2606a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * the focal length. This only applies to rectilinear sensors, for focusing
2607a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     * at distances >> f, etc.
2608a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala     */
2609a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (horizFov != NULL) {
2610a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        *horizFov = 180 / M_PI * 2 *
2611a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                atanf(horizCropFactor * sensorSize.data.f[0] /
2612a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                        (2 * fastInfo.minFocalLength));
2613a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    }
2614a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    if (vertFov != NULL) {
2615a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala        *vertFov = 180 / M_PI * 2 *
2616a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                atanf(vertCropFactor * sensorSize.data.f[1] /
2617a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala                        (2 * fastInfo.minFocalLength));
2618a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    }
2619a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala    return OK;
2620a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala}
2621a1220f482f5a50488777ab789abd861b5565acdcEino-Ville Talvala
2622ebe3f69ef09777001b14a1cb9a2a21090655a14bIgor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const {
262363dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin    return max;
262463dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin}
262563dc19921f2770f07bf976bb7573a1133d6548f9Igor Murashkin
26262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2
26272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android
2628