Parameters.cpp revision f128dc51c81e6b831806e0de505e4edbb02b7e71
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
212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <math.h>
222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <stdlib.h>
232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "Parameters.h"
252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "system/camera.h"
262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "camera/CameraParameters.h"
272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 {
302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId,
322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int cameraFacing) :
332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraId(cameraId),
342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraFacing(cameraFacing),
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        info(NULL) {
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() {
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::initialize(const CameraMetadata *info) {
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (info->entryCount() == 0) {
452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: No static information provided!", __FUNCTION__);
462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::info = info;
492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = buildFastInfo();
512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    CameraParameters params;
542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableProcessedSizes =
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick more intelligently
602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewWidth = availableProcessedSizes.data.i32[0];
612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewHeight = availableProcessedSizes.data.i32[1];
622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoWidth = previewWidth;
632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoHeight = previewHeight;
642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPreviewSize(previewWidth, previewHeight);
662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setVideoSize(videoWidth, videoHeight);
672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%dx%d",
692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight));
702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewSizes;
722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFpsRange[0] = availableFpsRanges.data.i32[0];
892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFpsRange[1] = availableFpsRanges.data.i32[1];
902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%d,%d",
932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewFpsRange[0],
942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewFpsRange[1]));
952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFpsRange;
982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
1012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFpsRange);
1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatEnumToString(previewFormat)); // NV21
1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewTransform = degToTransform(0,
1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            cameraFacing == CAMERA_FACING_FRONT);
1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFormats =
1162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFormats;
1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableFormats.data.i32[i]);
1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats);
1642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // still have to do something sane for them
1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            previewFpsRange[0]);
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFrameRates);
1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegSizes =
1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick maximum
1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    pictureWidth = availableJpegSizes.data.i32[0];
1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    pictureHeight = availableJpegSizes.data.i32[1];
1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureSize(pictureWidth,
1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            pictureHeight);
1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPictureSizes;
1962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
1982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
1992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
2002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
2012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPictureSizes);
2042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
2092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
211f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
2122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
2192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[0]);
2202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[1]);
2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedJpegThumbSizes;
2252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
2272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
2292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
2302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
2322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedJpegThumbSizes);
2332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbQuality = 90;
2362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
2372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbQuality);
2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegQuality = 90;
2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
2402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegQuality);
2412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegRotation = 0;
2422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
2432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegRotation);
2442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsEnabled = false;
2462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsProcessingMethod = "unknown";
2472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
2482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    wbMode = ANDROID_CONTROL_AWB_AUTO;
2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
2512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
2522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
2552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedWhiteBalance;
2572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
2582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
2672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
2732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
2812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Skipping values not mappable to v1 API
2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
2962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance);
3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    effectMode = ANDROID_CONTROL_EFFECT_OFF;
3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedEffects;
3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedEffects += ",";
3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NONE;
3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_MONO;
3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableEffects.data.u8[i]);
3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
3662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedAntibanding;
3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedAntibanding);
4102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    sceneMode = ANDROID_CONTROL_OFF;
4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool noSceneModes = false;
4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    noSceneModes = true;
4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    // Not in old API
4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
4962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableSceneModes.data.u8[i]);
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!noSceneModes) {
5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes);
5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        flashMode = Parameters::FLASH_MODE_AUTO;
5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes);
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        flashMode = Parameters::FLASH_MODE_OFF;
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // Fixed-focus lens
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_FIXED;
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_AUTO;
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_INFINITY);
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                // Not supported in old API
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFocusModes);
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t max3aRegions =
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions.data.i32[0]);
6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.clear();
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.add(Parameters::Area(0,0,0,0,0));
6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float horizFov = 180 / M_PI *
6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float vertFov  = 180 / M_PI *
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    exposureCompensation = 0;
6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                exposureCompensation);
6382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
6472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoExposureLock = false;
6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoWhiteBalanceLock = false;
6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
6652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions.data.i32[0]);
6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
6722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoom = 0;
6752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, zoom);
6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
6772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 zoomRatios;
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoom = 1.f;
6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (NUM_ZOOM_STEPS-1);
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) zoomRatios += ",";
6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoom += zoomIncrement;
6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "Infinity,Infinity,Infinity");
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fastInfo.maxFaces);
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            0);
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::TRUE);
7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FALSE);
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    storeMetadataInBuffers = true;
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    playShutterSound = true;
7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFaceDetect = false;
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFocusMoveMessages = false;
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    afTriggerCounter = 0;
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    currentAfTriggerId = -1;
7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewCallbackFlags = 0;
7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    state = STOPPED;
7472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    paramsFlattened = params.flatten();
7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() {
7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t arrayWidth = activeArraySize.data.i32[0];
7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t arrayHeight = activeArraySize.data.i32[1];
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_STATS_AVAILABLE_FACE_DETECT_MODES);
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFaceDetectModes.count) return NO_INIT;
7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    uint8_t bestFaceDetectMode =
7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ANDROID_STATS_FACE_DETECTION_OFF;
7672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_OFF:
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_SIMPLE:
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (bestFaceDetectMode !=
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        ANDROID_STATS_FACE_DETECTION_FULL) {
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    bestFaceDetectMode =
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        ANDROID_STATS_FACE_DETECTION_SIMPLE;
7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case ANDROID_STATS_FACE_DETECTION_FULL:
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                bestFaceDetectMode =
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ANDROID_STATS_FACE_DETECTION_FULL;
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return NO_INIT;
7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxFacesDetected.count) return NO_INIT;
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    int32_t maxFaces = maxFacesDetected.data.i32[0];
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayWidth = arrayWidth;
7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayHeight = arrayHeight;
7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.bestFaceDetectMode = bestFaceDetectMode;
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.maxFaces = maxFaces;
8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        size_t minCount, size_t maxCount) const {
8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t entry = info->find(tag);
8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (CC_UNLIKELY( entry.count == 0 )) {
8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag);
8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (CC_UNLIKELY(
8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return entry;
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::set(const String8& params) {
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    CameraParameters newParams(params);
8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only parameters
8372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // such as supported preview sizes, etc. Should probably produce an error if
8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // they're changed.
8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Extract and verify new parameters */
8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t i;
8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters validatedParams(*this);
8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_SIZE
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewSize(&validatedParams.previewWidth,
8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewHeight);
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewWidth != previewWidth ||
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewHeight != previewHeight) {
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight,
8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth, validatedParams.previewHeight);
8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewSizes =
8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
8622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewSizes.data.i32[i] ==
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth) &&
8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewSizes.data.i32[i+1] ==
8662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight)) break;
8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.previewWidth,
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight);
8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FPS_RANGE
8772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    bool fpsRangeChanged = false;
8782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewFpsRange[1]);
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFpsRange[0] != previewFpsRange[0] ||
8812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] != previewFpsRange[1]) {
8822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        fpsRangeChanged = true;
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
8842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
8872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[0]) &&
8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]) ) {
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
8942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
8952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.previewFpsRange[0],
8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]);
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.previewFps = validatedParams.previewFpsRange[0];
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FORMAT
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.previewFormat =
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatStringToEnum(newParams.getPreviewFormat());
9052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFormat != previewFormat) {
9062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active!", __FUNCTION__);
9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableFormats =
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableFormats.data.i32[i] == validatedParams.previewFormat)
9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableFormats.count) {
9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(),
9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFormat);
9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE
9262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
9272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
9282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!fpsRangeChanged) {
9292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.previewFps = newParams.getPreviewFrameRate();
9302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.previewFps != previewFps) {
9312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
9322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
9342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (availableFrameRates.data.i32[i] ==
9352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        validatedParams.previewFps) break;
9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
9372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableFrameRates.count) {
9382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
9392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, validatedParams.previewFps);
9402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
9412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
9422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[0] =
9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFrameRates.data.i32[i];
9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] =
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableFrameRates.data.i32[i+1];
9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PICTURE_SIZE
9502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPictureSize(&validatedParams.pictureWidth,
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.pictureHeight);
9522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.pictureWidth == pictureWidth ||
9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.pictureHeight == pictureHeight) {
9542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePictureSizes =
9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
9572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePictureSizes.data.i32[i] ==
9582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureWidth) &&
9592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePictureSizes.data.i32[i+1] ==
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight)) break;
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePictureSizes.count) {
9632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.pictureWidth,
9652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight);
9662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
9712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[0] =
9722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[1] =
9742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
9782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
9802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableJpegThumbSizes.data.i32[i] ==
9812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[0]) &&
9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableJpegThumbSizes.data.i32[i+1] ==
9832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1])) break;
9842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.jpegThumbSize[0],
9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1]);
9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbQuality =
9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbQuality < 0 ||
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbQuality > 100) {
9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegThumbQuality);
10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_QUALITY
10042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegQuality =
10052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
10062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegQuality < 0 || validatedParams.jpegQuality > 100) {
10072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegQuality);
10092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
10102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ROTATION
10132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegRotation =
10142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
10152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegRotation != 0 &&
10162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 90 &&
10172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 180 &&
10182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 270) {
10192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
10202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegRotation);
10212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
10222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS
10252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *gpsLatStr =
10272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
10282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (gpsLatStr != NULL) {
10292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsLongStr =
10302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
10312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsAltitudeStr =
10322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
10332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsTimeStr =
10342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
10352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsProcMethodStr =
10362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
10372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (gpsLongStr == NULL ||
10382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsAltitudeStr == NULL ||
10392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsTimeStr == NULL ||
10402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsProcMethodStr == NULL) {
10412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
10422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
10432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *endPtr;
10462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
10482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
10492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
10502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
10542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
10552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
10562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
10612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
10622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    gpsAltitudeStr);
10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
10682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsProcessingMethod = gpsProcMethodStr;
10722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = true;
10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = false;
10762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // WHITE_BALANCE
10792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.wbMode = wbModeStringToEnum(
10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.wbMode != wbMode) {
10822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
10842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableWbModes.count) {
10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
10892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
10912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
10922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EFFECT
10962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.effectMode = effectModeStringToEnum(
10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.effectMode != effectMode) {
10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
11002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
11012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
11022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableEffectModes.count) {
11052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
11062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ANTIBANDING
11132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.antibandingMode = abModeStringToEnum(
11142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
11152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.antibandingMode != antibandingMode) {
11162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
11172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
11182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
11192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
11202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
11212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableAbModes.count) {
11232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
11242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
11262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // SCENE_MODE
11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.sceneMode = sceneModeStringToEnum(
11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
11332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.sceneMode != sceneMode &&
11342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.sceneMode !=
11352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) {
11362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
11372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
11382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableSceneModes.count) {
11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
11462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FLASH_MODE
11512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.flashMode = flashModeStringToEnum(
11522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
11532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.flashMode != flashMode) {
11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
11552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
11562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
11572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (validatedParams.flashMode == availableAeModes.data.u8[i])
11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableAeModes.count) {
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == -1) {
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_MODE
11842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.focusMode = focusModeStringToEnum(
11852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.focusMode != focusMode) {
11872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = -1;
11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        "fixed focus lens",
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            } else if (validatedParams.focusMode !=
11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::FOCUS_MODE_INFINITY) {
11992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (validatedParams.focusMode ==
12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableFocusModes.data.u8[i]) break;
12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (i == availableFocusModes.count) {
12062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            __FUNCTION__,
12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
12092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return BAD_VALUE;
12102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
12142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = currentAfTriggerId;
12152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_AREAS
12182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.focusingAreas);
12202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t max3aRegions =
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) res = validateAreas(validatedParams.focusingAreas,
12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            max3aRegions);
12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EXPOSURE_COMPENSATION
12312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.exposureCompensation =
12322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
12332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
12342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
12352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if ((validatedParams.exposureCompensation <
12362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]) ||
12372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (validatedParams.exposureCompensation >
12382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1])) {
12392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.exposureCompensation);
12412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
12452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoExposureLock = boolFromString(
12462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
12472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
12492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoWhiteBalanceLock = boolFromString(
12502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
12512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // METERING_AREAS
12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.meteringAreas);
12552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) {
12562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        res = validateAreas(validatedParams.meteringAreas, max3aRegions);
12572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
12612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
12622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ZOOM
12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
12672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.zoom < 0 || validatedParams.zoom > (int)NUM_ZOOM_STEPS) {
12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.zoom);
12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_SIZE
12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getVideoSize(&validatedParams.videoWidth,
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.videoHeight);
12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoWidth != videoWidth ||
12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.videoHeight != videoHeight) {
12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state == RECORD) {
12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableVideoSizes =
12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableVideoSizes.data.i32[i] ==
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoWidth) &&
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableVideoSizes.data.i32[i+1] ==
12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight)) break;
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableVideoSizes.count) {
12922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
12932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.videoWidth,
12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight);
12952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // RECORDING_HINT (always supported)
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.recordingHint = boolFromString(
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_STABILIZATION
13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.videoStabilization = boolFromString(
13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoStabilization &&
13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            availableVideoStabilizationModes.count == 1) {
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Update internal parameters */
13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.paramsFlattened = params;
13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    *this = validatedParams;
13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) {
13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(state) {
13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
13252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return "Unknown state!";
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR
13362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) {
13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
13412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
13492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
13512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) {
13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *fmt;
13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(format) {
13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
13622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
13642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
13652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
13672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
13702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
13712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
13732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
13762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
13802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
13832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
13842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,  format);
13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = NULL;
13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return fmt;
13892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
13902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) {
13922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
13932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
13942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
13952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
13962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
13972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
13982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
13992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
14002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
14012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
14022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
14032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
14042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
14052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
14062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
14072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
14092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
14102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
14112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) {
14132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
14142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
14152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
14162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
14172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
14222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
14232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
14242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
14262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
14292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) {
14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) {
14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
14592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
14602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
14612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
14622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
14632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
14642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
14652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
14682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
14692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
14702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
14712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
14722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
14732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
14742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
14752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
14782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *flashMode) {
14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
14942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *focusMode) {
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
15112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr,
15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
15232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    areas->clear();
15252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areasCStr == NULL) {
15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push();
15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return OK;
15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    String8 areasStr(areasCStr);
15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    while (areaStart != 0) {
15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *numEnd;
15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int vals[NUM_FIELDS];
15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            errno = 0;
15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            area = numEnd + 1;
15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push(Parameters::Area(
15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                                      size_t maxRegions) {
15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Definition of valid area can be found in
15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // include/camera/CameraParameters.h
15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 1) {
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (areas[0].left == 0 &&
15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].top == 0 &&
15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].right == 0 &&
15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].bottom == 0 &&
15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].weight == 0) {
15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return OK;
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() > maxRegions) {
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, areas.size());
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala         a != areas.end(); a++) {
15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) {
15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return !boolStr ? false :
15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        false;
15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) {
15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!mirror) {
15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) return 0;
15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return -1;
16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const {
16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return width * 2000 / (fastInfo.arrayWidth - 1) - 1000;
16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const {
16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return height * 2000 / (fastInfo.arrayHeight - 1) - 1000;
16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const {
16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const {
16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2
16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android
1628