Parameters.cpp revision 4c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2
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
172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-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>
2369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <math.h>
252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <stdlib.h>
262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "Parameters.h"
282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "system/camera.h"
292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "camera/CameraParameters.h"
302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 {
332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId,
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int cameraFacing) :
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraId(cameraId),
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraFacing(cameraFacing),
382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        info(NULL) {
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() {
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::initialize(const CameraMetadata *info) {
452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (info->entryCount() == 0) {
482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: No static information provided!", __FUNCTION__);
492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::info = info;
522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = buildFastInfo();
542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    CameraParameters params;
572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableProcessedSizes =
592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick more intelligently
632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewWidth = availableProcessedSizes.data.i32[0];
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewHeight = availableProcessedSizes.data.i32[1];
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoWidth = previewWidth;
662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoHeight = previewHeight;
672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPreviewSize(previewWidth, previewHeight);
692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setVideoSize(videoWidth, videoHeight);
702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%dx%d",
722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight));
732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewSizes;
752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFpsRange[0] = availableFpsRanges.data.i32[0];
922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFpsRange[1] = availableFpsRanges.data.i32[1];
932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%d,%d",
962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewFpsRange[0],
972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewFpsRange[1]));
982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFpsRange;
1012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFpsRange);
1092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatEnumToString(previewFormat)); // NV21
1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewTransform = degToTransform(0,
1162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            cameraFacing == CAMERA_FACING_FRONT);
1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFormats =
1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFormats;
1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableFormats.data.i32[i]);
1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats);
1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // still have to do something sane for them
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            previewFpsRange[0]);
1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFrameRates);
1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegSizes =
1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick maximum
1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    pictureWidth = availableJpegSizes.data.i32[0];
1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    pictureHeight = availableJpegSizes.data.i32[1];
1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureSize(pictureWidth,
1952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            pictureHeight);
1962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPictureSizes;
1992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
2002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
2012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
2022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
2032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
2042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPictureSizes);
2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
2122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
214a1e4e309e9a32afa3a26576fa592789168db182eEino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[0]);
2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[1]);
2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedJpegThumbSizes;
2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
2292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
2322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
2332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedJpegThumbSizes);
2362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbQuality = 90;
2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbQuality);
2412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegQuality = 90;
2422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
2432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegQuality);
2442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegRotation = 0;
2452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
2462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegRotation);
2472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsEnabled = false;
2492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsProcessingMethod = "unknown";
2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
2512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    wbMode = ANDROID_CONTROL_AWB_AUTO;
2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
2552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
2572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
2582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedWhiteBalance;
2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
2722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
2842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
2962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Skipping values not mappable to v1 API
2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance);
3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    effectMode = ANDROID_CONTROL_EFFECT_OFF;
3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedEffects;
3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedEffects += ",";
3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NONE;
3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_MONO;
3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableEffects.data.u8[i]);
3662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedAntibanding;
3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedAntibanding);
4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    sceneMode = ANDROID_CONTROL_OFF;
4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool noSceneModes = false;
4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    noSceneModes = true;
4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
4342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    // Not in old API
4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableSceneModes.data.u8[i]);
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!noSceneModes) {
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes);
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        flashMode = Parameters::FLASH_MODE_AUTO;
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes);
5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        flashMode = Parameters::FLASH_MODE_OFF;
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // Fixed-focus lens
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_FIXED;
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_AUTO;
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY);
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                // Not supported in old API
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFocusModes);
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t max3aRegions =
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions.data.i32[0]);
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.clear();
6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.add(Parameters::Area(0,0,0,0,0));
6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float horizFov = 180 / M_PI *
6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float vertFov  = 180 / M_PI *
6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    exposureCompensation = 0;
6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                exposureCompensation);
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
6472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
6482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
6562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoExposureLock = false;
6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoWhiteBalanceLock = false;
6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
6722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions.data.i32[0]);
6742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
6752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoom = 0;
6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, zoom);
6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 zoomRatios;
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoom = 1.f;
6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (NUM_ZOOM_STEPS-1);
6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) zoomRatios += ",";
6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoom += zoomIncrement;
6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "Infinity,Infinity,Infinity");
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fastInfo.maxFaces);
7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            0);
7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::TRUE);
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FALSE);
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    storeMetadataInBuffers = true;
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    playShutterSound = true;
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFaceDetect = false;
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFocusMoveMessages = false;
74469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    afTriggerCounter = 1;
7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    currentAfTriggerId = -1;
7462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
74769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    precaptureTriggerCounter = 1;
74869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewCallbackFlags = 0;
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
751c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    zslMode = false;
752c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
753c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    lightFx = LIGHTFX_NONE;
754c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    state = STOPPED;
7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    paramsFlattened = params.flatten();
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() {
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t arrayWidth = activeArraySize.data.i32[0];
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t arrayHeight = activeArraySize.data.i32[1];
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES);
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFaceDetectModes.count) return NO_INIT;
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    uint8_t bestFaceDetectMode =
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ANDROID_STATS_FACE_DETECTION_OFF;
7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_OFF:
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_SIMPLE:
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (bestFaceDetectMode !=
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        ANDROID_STATS_FACE_DETECTION_FULL) {
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    bestFaceDetectMode =
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        ANDROID_STATS_FACE_DETECTION_SIMPLE;
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_FULL:
7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                bestFaceDetectMode =
7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ANDROID_STATS_FACE_DETECTION_FULL;
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return NO_INIT;
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxFacesDetected.count) return NO_INIT;
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t maxFaces = maxFacesDetected.data.i32[0];
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayWidth = arrayWidth;
8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayHeight = arrayHeight;
8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.bestFaceDetectMode = bestFaceDetectMode;
8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.maxFaces = maxFaces;
8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        size_t minCount, size_t maxCount) const {
8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t entry = info->find(tag);
8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (CC_UNLIKELY( entry.count == 0 )) {
8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag);
8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (CC_UNLIKELY(
8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return entry;
8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::set(const String8& params) {
8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    CameraParameters newParams(params);
8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only parameters
8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // such as supported preview sizes, etc. Should probably produce an error if
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // they're changed.
8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Extract and verify new parameters */
8502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t i;
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters validatedParams(*this);
8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_SIZE
8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewSize(&validatedParams.previewWidth,
8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewHeight);
8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewWidth != previewWidth ||
8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewHeight != previewHeight) {
8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
8622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight,
8662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth, validatedParams.previewHeight);
8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewSizes =
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewSizes.data.i32[i] ==
8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth) &&
8742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewSizes.data.i32[i+1] ==
8752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight)) break;
8762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
8782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.previewWidth,
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight);
8812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
8822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FPS_RANGE
8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool fpsRangeChanged = false;
8872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewFpsRange[1]);
8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFpsRange[0] != previewFpsRange[0] ||
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] != previewFpsRange[1]) {
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        fpsRangeChanged = true;
8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
8942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
8952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[0]) &&
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]) ) {
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.previewFpsRange[0],
9052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]);
9062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.previewFps = validatedParams.previewFpsRange[0];
9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FORMAT
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.previewFormat =
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatStringToEnum(newParams.getPreviewFormat());
9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFormat != previewFormat) {
9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
9172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active!", __FUNCTION__);
9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableFormats =
9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
9232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableFormats.data.i32[i] == validatedParams.previewFormat)
9242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
9252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableFormats.count) {
9272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
9282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(),
9292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFormat);
9302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE
9352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
9372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!fpsRangeChanged) {
9382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.previewFps = newParams.getPreviewFrameRate();
9392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.previewFps != previewFps) {
9402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
9412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
9422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (availableFrameRates.data.i32[i] ==
9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        validatedParams.previewFps) break;
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableFrameRates.count) {
9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
9482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, validatedParams.previewFps);
9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[0] =
9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFrameRates.data.i32[i];
9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] =
9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFrameRates.data.i32[i+1];
9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PICTURE_SIZE
9592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPictureSize(&validatedParams.pictureWidth,
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.pictureHeight);
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.pictureWidth == pictureWidth ||
9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.pictureHeight == pictureHeight) {
9632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePictureSizes =
9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
9652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
9662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePictureSizes.data.i32[i] ==
9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureWidth) &&
9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePictureSizes.data.i32[i+1] ==
9692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight)) break;
9702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePictureSizes.count) {
9722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.pictureWidth,
9742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight);
9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
9802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[0] =
9812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[1] =
9832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
9842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableJpegThumbSizes.data.i32[i] ==
9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[0]) &&
9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableJpegThumbSizes.data.i32[i+1] ==
9922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1])) break;
9932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.jpegThumbSize[0],
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1]);
9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
10032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbQuality =
10042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
10052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbQuality < 0 ||
10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbQuality > 100) {
10072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegThumbQuality);
10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_QUALITY
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegQuality =
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegQuality < 0 || validatedParams.jpegQuality > 100) {
10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegQuality);
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ROTATION
10222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegRotation =
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegRotation != 0 &&
10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 90 &&
10262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 180 &&
10272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 270) {
10282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
10292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegRotation);
10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS
10342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *gpsLatStr =
10362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (gpsLatStr != NULL) {
10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsLongStr =
10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
10402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsAltitudeStr =
10412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsTimeStr =
10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
10442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsProcMethodStr =
10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
10462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (gpsLongStr == NULL ||
10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsAltitudeStr == NULL ||
10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsTimeStr == NULL ||
10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsProcMethodStr == NULL) {
10502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
10522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *endPtr;
10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    gpsAltitudeStr);
10722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
10762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
10772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsProcessingMethod = gpsProcMethodStr;
10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = true;
10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
10842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = false;
10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // WHITE_BALANCE
10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.wbMode = wbModeStringToEnum(
10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.wbMode != wbMode) {
10912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
10922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
10932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
10942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableWbModes.count) {
10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
11002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EFFECT
11052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.effectMode = effectModeStringToEnum(
11062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
11072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.effectMode != effectMode) {
11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
11092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableEffectModes.count) {
11142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ANTIBANDING
11222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.antibandingMode = abModeStringToEnum(
11232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
11242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.antibandingMode != antibandingMode) {
11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
11262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
11272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
11292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableAbModes.count) {
11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
11332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
11352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // SCENE_MODE
11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.sceneMode = sceneModeStringToEnum(
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.sceneMode != sceneMode &&
11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.sceneMode !=
11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) {
11452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
11462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
11472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
11502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableSceneModes.count) {
11522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
11532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
11552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FLASH_MODE
11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.flashMode = flashModeStringToEnum(
11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
11622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.flashMode != flashMode) {
11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (validatedParams.flashMode == availableAeModes.data.u8[i])
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableAeModes.count) {
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
11842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == -1) {
11852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_MODE
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.focusMode = focusModeStringToEnum(
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.focusMode != focusMode) {
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = -1;
11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
11992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        "fixed focus lens",
12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
12062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            } else if (validatedParams.focusMode !=
12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::FOCUS_MODE_INFINITY) {
12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
12092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
12102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (validatedParams.focusMode ==
12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableFocusModes.data.u8[i]) break;
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
12142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (i == availableFocusModes.count) {
12152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
12162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            __FUNCTION__,
12172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
12182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return BAD_VALUE;
12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = currentAfTriggerId;
12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_AREAS
12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.focusingAreas);
12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t max3aRegions =
12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) res = validateAreas(validatedParams.focusingAreas,
12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions);
12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
12342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EXPOSURE_COMPENSATION
12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.exposureCompensation =
12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
12432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
12442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if ((validatedParams.exposureCompensation <
12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]) ||
12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (validatedParams.exposureCompensation >
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1])) {
12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.exposureCompensation);
12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoExposureLock = boolFromString(
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoWhiteBalanceLock = boolFromString(
12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // METERING_AREAS
12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
12632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.meteringAreas);
12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) {
12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        res = validateAreas(validatedParams.meteringAreas, max3aRegions);
12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ZOOM
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.zoom < 0 || validatedParams.zoom > (int)NUM_ZOOM_STEPS) {
12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.zoom);
12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_SIZE
12832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getVideoSize(&validatedParams.videoWidth,
12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.videoHeight);
12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoWidth != videoWidth ||
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.videoHeight != videoHeight) {
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state == RECORD) {
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableVideoSizes =
12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableVideoSizes.data.i32[i] ==
12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoWidth) &&
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableVideoSizes.data.i32[i+1] ==
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight)) break;
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableVideoSizes.count) {
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.videoWidth,
13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight);
13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // RECORDING_HINT (always supported)
13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.recordingHint = boolFromString(
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_STABILIZATION
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.videoStabilization = boolFromString(
13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoStabilization &&
13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            availableVideoStabilizationModes.count == 1) {
13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1322c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    // LIGHTFX
1323c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    validatedParams.lightFx = lightFxStringToEnum(
1324c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        newParams.get(CameraParameters::KEY_LIGHTFX));
1325c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Update internal parameters */
13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.paramsFlattened = params;
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    *this = validatedParams;
13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
133469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const {
133569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    ATRACE_CALL();
133669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    status_t res;
133769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
133869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t metadataMode = ANDROID_REQUEST_METADATA_FULL;
133969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_REQUEST_METADATA_MODE,
134069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &metadataMode, 1);
134169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
134269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
134369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
134469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            previewFpsRange, 2);
134569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
134669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
134769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
13482d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            &wbMode, 1);
134969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
13502d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala
13512d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    uint8_t reqWbLock = autoWhiteBalanceLock ?
13522d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
13532d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_LOCK,
13542d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            &reqWbLock, 1);
13552d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala
135669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
135769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &effectMode, 1);
135869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
135969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
136069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &antibandingMode, 1);
136169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
136269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
136369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqControlMode =
136469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            (sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
136569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
136669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
136769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqControlMode, 1);
136869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
136969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (reqControlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
137069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_SCENE_MODE,
137169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                &sceneMode, 1);
137269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (res != OK) return res;
137369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
137469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
137569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqFlashMode = ANDROID_FLASH_OFF;
137669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqAeMode;
137769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    switch (flashMode) {
137869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
137969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqAeMode = ANDROID_CONTROL_AE_ON; break;
138069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
138169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqAeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
138269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_ON:
138369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqAeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
138469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
138569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqAeMode = ANDROID_CONTROL_AE_ON;
138669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFlashMode = ANDROID_FLASH_TORCH;
138769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
138869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
138969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqAeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
139069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        default:
139169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
139269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    cameraId, flashMode);
139369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return BAD_VALUE;
139469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
139569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
139669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFlashMode, 1);
139769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
139869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
139969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqAeMode, 1);
140069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
140169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
14022d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    uint8_t reqAeLock = autoExposureLock ?
14032d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
14042d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_LOCK,
14052d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala            &reqAeLock, 1);
14062d6a503f548ac047f30995c4f74f58259ab9027bEino-Ville Talvala
140769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    float reqFocusDistance = 0; // infinity focus in diopters
140869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqFocusMode;
140969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    switch (focusMode) {
141069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
141169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
141269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
141369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
141469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
141569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusMode = focusMode;
141669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
141769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
141869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
141969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusMode = ANDROID_CONTROL_AF_OFF;
142069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            break;
142169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        default:
142269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
142369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    cameraId, focusMode);
142469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            return BAD_VALUE;
142569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
142669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
142769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFocusDistance, 1);
142869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
142969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
143069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFocusMode, 1);
143169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
143269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
143369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t reqFocusingAreasSize = focusingAreas.size() * 5;
143469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize];
143569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (size_t i = 0; i < reqFocusingAreasSize; i += 5) {
143669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (focusingAreas[i].weight != 0) {
143769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 0] =
143869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedXToArray(focusingAreas[i].left);
143969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 1] =
144069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedYToArray(focusingAreas[i].top);
144169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 2] =
144269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedXToArray(focusingAreas[i].right);
144369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 3] =
144469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                    normalizedYToArray(focusingAreas[i].bottom);
144569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
144669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 0] = 0;
144769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 1] = 0;
144869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 2] = 0;
144969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas[i + 3] = 0;
145069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
145169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        reqFocusingAreas[i + 4] = focusingAreas[i].weight;
145269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
145369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
145469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqFocusingAreas, reqFocusingAreasSize);
145569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
145669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    delete[] reqFocusingAreas;
145769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
145869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_EXP_COMPENSATION,
145969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &exposureCompensation, 1);
146069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
146169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
146269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    size_t reqMeteringAreasSize = meteringAreas.size() * 5;
146369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize];
146469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    for (size_t i = 0; i < reqMeteringAreasSize; i += 5) {
146569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        if (meteringAreas[i].weight != 0) {
146669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 0] =
146769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedXToArray(meteringAreas[i].left);
146869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 1] =
146969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedYToArray(meteringAreas[i].top);
147069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 2] =
147169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedXToArray(meteringAreas[i].right);
147269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 3] =
147369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                normalizedYToArray(meteringAreas[i].bottom);
147469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        } else {
147569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 0] = 0;
147669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 1] = 0;
147769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 2] = 0;
147869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas[i + 3] = 0;
147969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        }
148069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        reqMeteringAreas[i + 4] = meteringAreas[i].weight;
148169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
148269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
148369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas, reqMeteringAreasSize);
148469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
148569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
148669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_REGIONS,
148769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqMeteringAreas, reqMeteringAreasSize);
148869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
148969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    delete[] reqMeteringAreas;
149069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
149169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
149269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // chosen to maximize its area on the sensor
149369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
149469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
149569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
149669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
149769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            (NUM_ZOOM_STEPS-1);
149869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * zoom;
149969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
150069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
150169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (previewWidth >= previewHeight) {
150269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        zoomWidth =  fastInfo.arrayWidth / zoomRatio;
150369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        zoomHeight = zoomWidth *
150469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                previewHeight / previewWidth;
150569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    } else {
150669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        zoomHeight = fastInfo.arrayHeight / zoomRatio;
150769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala        zoomWidth = zoomHeight *
150869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala                previewWidth / previewHeight;
150969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    }
151069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2;
151169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2;
151269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
151369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    int32_t reqCropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
151469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
151569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            reqCropRegion, 3);
151669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
151769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
151869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
151969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
152069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqVstabMode = videoStabilization ?
152169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
152269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
152369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
152469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqVstabMode, 1);
152569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
152669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
152769230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    uint8_t reqFaceDetectMode = enableFaceDetect ?
152869230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            fastInfo.bestFaceDetectMode :
152969230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            (uint8_t)ANDROID_STATS_FACE_DETECTION_OFF;
153069230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    res = request->update(ANDROID_STATS_FACE_DETECT_MODE,
153169230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala            &reqFaceDetectMode, 1);
153269230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    if (res != OK) return res;
153369230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
153469230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala    return OK;
153569230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala}
153669230df9905534cda15becd44c0109874c4be5f0Eino-Ville Talvala
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) {
15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(state) {
15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return "Unknown state!";
15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR
15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) {
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
15564c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !format ?
15574c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP :
15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) {
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *fmt;
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(format) {
15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,  format);
16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = NULL;
16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return fmt;
16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) {
16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
16114c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !wbMode ?
16124c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) {
16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
16344c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !effectMode ?
16354c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
16412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
16422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
16432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
16452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
16472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
16482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
16512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
16522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
16532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) {
16582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
16594c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !abMode ?
16604c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
16652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
16662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
16672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
16682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
16692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
16702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) {
16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
16744c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !sceneMode ?
16754c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
16762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
16772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
16782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
16792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
16832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
16842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
16852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
16862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
16872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
16882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
16892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
16902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
16912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
16922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
16932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
16942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
16952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
16982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
16992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
17002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
17022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
17032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
17042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
17052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
17062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
17082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
17102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *flashMode) {
17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
17144c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !flashMode ?
17154c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            Parameters::FLASH_MODE_INVALID :
17162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
17172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
17192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
17202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
17212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
17222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
17232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
17242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
17252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
17262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
17272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *focusMode) {
17312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
17324c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !focusMode ?
17334c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            Parameters::FOCUS_MODE_INVALID :
17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
17352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
17362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
17372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
17392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
17502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1751c3dbf1a40df85b75e5805382838a90416f69730fJames PainterParameters::Parameters::lightFxMode_t Parameters::lightFxStringToEnum(
1752c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        const char *lightFxMode) {
1753c3dbf1a40df85b75e5805382838a90416f69730fJames Painter    return
17544c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala        !lightFxMode ?
17554c6b0b8fe86740a7cee1e179d0f55cbcd143d2d2Eino-Ville Talvala            Parameters::LIGHTFX_NONE :
1756c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        !strcmp(lightFxMode, CameraParameters::LIGHTFX_LOWLIGHT) ?
1757c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            Parameters::LIGHTFX_LOWLIGHT :
1758c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        !strcmp(lightFxMode, CameraParameters::LIGHTFX_HDR) ?
1759c3dbf1a40df85b75e5805382838a90416f69730fJames Painter            Parameters::LIGHTFX_HDR :
1760c3dbf1a40df85b75e5805382838a90416f69730fJames Painter        Parameters::LIGHTFX_NONE;
1761c3dbf1a40df85b75e5805382838a90416f69730fJames Painter}
1762c3dbf1a40df85b75e5805382838a90416f69730fJames Painter
17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr,
17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
17662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    areas->clear();
17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areasCStr == NULL) {
17682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
17692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push();
17702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return OK;
17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    String8 areasStr(areasCStr);
17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    while (areaStart != 0) {
17752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
17762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *numEnd;
17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int vals[NUM_FIELDS];
17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            errno = 0;
17802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
17812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            area = numEnd + 1;
17832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push(Parameters::Area(
17852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
17862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
17872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
17892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
17902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
17922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                      size_t maxRegions) {
17932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Definition of valid area can be found in
17942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // include/camera/CameraParameters.h
17952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 1) {
17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (areas[0].left == 0 &&
17982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].top == 0 &&
17992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].right == 0 &&
18002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].bottom == 0 &&
18012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].weight == 0) {
18022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
18032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return OK;
18042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() > maxRegions) {
18072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
18082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, areas.size());
18092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
18102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
18132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala         a != areas.end(); a++) {
18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
18182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
18192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
18202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
18212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) {
18262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return !boolStr ? false :
18272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
18282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        false;
18292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) {
18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!mirror) {
18332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) return 0;
18342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
18352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
18362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
18372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
18382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
18392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
18402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
18412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
18422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
18432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
18442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
18452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
18462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
18472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
18492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return -1;
18502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const {
18532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return width * 2000 / (fastInfo.arrayWidth - 1) - 1000;
18542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const {
18572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return height * 2000 / (fastInfo.arrayHeight - 1) - 1000;
18582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const {
18612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const {
18652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
18662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2
18692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android
1870