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
174bb8118816874c696d9f1adab48490df1da365f7Eino-Ville Talvala#define LOG_TAG "Camera2-Parameters"
182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin// #define LOG_NDEBUG 0
202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
21da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Log.h>
22da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala#include <utils/Trace.h>
23af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin#include <utils/Vector.h>
24af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin#include <utils/SortedVector.h>
25da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <math.h>
272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include <stdlib.h>
28b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala#include <cutils/properties.h>
292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "Parameters.h"
312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#include "system/camera.h"
32cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh#include "hardware/camera_common.h"
330cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/MediaProfiles.h>
340cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/mediarecorder.h>
352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 {
382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId,
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int cameraFacing) :
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraId(cameraId),
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraFacing(cameraFacing),
432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        info(NULL) {
442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() {
472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
49cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehstatus_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) {
502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (info->entryCount() == 0) {
532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: No static information provided!", __FUNCTION__);
542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::info = info;
57cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    mDeviceVersion = deviceVersion;
582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = buildFastInfo();
602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
62e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    res = buildQuirks();
63e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (res != OK) return res;
64e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
653ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    const Size MAX_PREVIEW_SIZE = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
660cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    // Treat the H.264 max size as the max supported video size.
670cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    MediaProfiles *videoEncoderProfiles = MediaProfiles::getInstance();
680cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    int32_t maxVideoWidth = videoEncoderProfiles->getVideoEncoderParamByName(
690cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                            "enc.vid.width.max", VIDEO_ENCODER_H264);
700cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    int32_t maxVideoHeight = videoEncoderProfiles->getVideoEncoderParamByName(
710cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                            "enc.vid.height.max", VIDEO_ENCODER_H264);
720cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    const Size MAX_VIDEO_SIZE = {maxVideoWidth, maxVideoHeight};
730cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He
740cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    res = getFilteredSizes(MAX_PREVIEW_SIZE, &availablePreviewSizes);
750cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    if (res != OK) return res;
760cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    res = getFilteredSizes(MAX_VIDEO_SIZE, &availableVideoSizes);
773ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (res != OK) return res;
782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
79a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    // Select initial preview and video size that's under the initial bound and
80a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    // on the list of both preview and recording sizes
81a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    previewWidth = 0;
82a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    previewHeight = 0;
83a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    for (size_t i = 0 ; i < availablePreviewSizes.size(); i++) {
84a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        int newWidth = availablePreviewSizes[i].width;
85a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        int newHeight = availablePreviewSizes[i].height;
86a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        if (newWidth >= previewWidth && newHeight >= previewHeight &&
87a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                newWidth <= MAX_INITIAL_PREVIEW_WIDTH &&
88a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                newHeight <= MAX_INITIAL_PREVIEW_HEIGHT) {
89a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala            for (size_t j = 0; j < availableVideoSizes.size(); j++) {
90a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                if (availableVideoSizes[j].width == newWidth &&
91a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                        availableVideoSizes[j].height == newHeight) {
92a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                    previewWidth = newWidth;
93a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                    previewHeight = newHeight;
94a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                }
95a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala            }
96a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        }
97a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    }
98a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    if (previewWidth == 0) {
99a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        ALOGE("%s: No initial preview size can be found!", __FUNCTION__);
100a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        return BAD_VALUE;
101a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    }
1022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoWidth = previewWidth;
1032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoHeight = previewHeight;
1042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPreviewSize(previewWidth, previewHeight);
1062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setVideoSize(videoWidth, videoHeight);
1072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
1082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%dx%d",
1092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight));
1102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewSizes;
1123ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        for (size_t i = 0; i < availablePreviewSizes.size(); i++) {
1132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
1142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
1153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                    availablePreviewSizes[i].width,
1163ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                    availablePreviewSizes[i].height);
1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1183ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGV("Supported preview sizes are: %s", supportedPreviewSizes.string());
1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
1210cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He
1220cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        String8 supportedVideoSizes;
1230cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        for (size_t i = 0; i < availableVideoSizes.size(); i++) {
1240cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He            if (i != 0) supportedVideoSizes += ",";
1250cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He            supportedVideoSizes += String8::format("%dx%d",
1260cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                    availableVideoSizes[i].width,
1270cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                    availableVideoSizes[i].height);
1280cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        }
1290cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        ALOGV("Supported video sizes are: %s", supportedVideoSizes.string());
1302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1310cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                supportedVideoSizes);
1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
1372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatEnumToString(previewFormat)); // NV21
1412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewTransform = degToTransform(0,
1432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            cameraFacing == CAMERA_FACING_FRONT);
1442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFormats;
147cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        SortedVector<int32_t> outputFormats = getAvailableOutputFormats();
1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
149cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < outputFormats.size(); i++) {
1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
152cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            switch (outputFormats[i]) {
1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1774a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_420_888:
1784a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                // Flexible YUV allows both YV12 and NV21
1794a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                supportedPreviewFormats +=
1804a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1814a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                supportedPreviewFormats += ",";
1824a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                supportedPreviewFormats +=
1834a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1844a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                break;
1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1864a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
1932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
194cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                        __FUNCTION__, cameraId, outputFormats[i]);
1952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
1962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
2002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats);
2012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    previewFpsRange[0] = availableFpsRanges.data.i32[0];
2040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    previewFpsRange[1] = availableFpsRanges.data.i32[1];
2050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // still have to do something sane for them
2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
209d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala    // NOTE: Not scaled like FPS range values are.
210d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala    int previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]);
2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
212af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            previewFps);
2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // PREVIEW_FPS_RANGE
2150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // -- Order matters. Set range after single value to so that a roundtrip
2160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //    of setParameters(getParameters()) would keep the FPS range in higher
2170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //    order.
2180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
2190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            String8::format("%d,%d",
2200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    previewFpsRange[0] * kFpsToApiScale,
2210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    previewFpsRange[1] * kFpsToApiScale));
2220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    {
2240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        String8 supportedPreviewFpsRange;
2250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            if (i != 0) supportedPreviewFpsRange += ",";
2270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            supportedPreviewFpsRange += String8::format("(%d,%d)",
2280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    availableFpsRanges.data.i32[i] * kFpsToApiScale,
2290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    availableFpsRanges.data.i32[i+1] * kFpsToApiScale);
2300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
2310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                supportedPreviewFpsRange);
2330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
2340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
236af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin        SortedVector<int32_t> sortedPreviewFrameRates;
237af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
2382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFrameRates;
2392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
240af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // from the [min, max] fps range use the max value
241af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            int fps = fpsFromRange(availableFpsRanges.data.i32[i],
242af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                                   availableFpsRanges.data.i32[i+1]);
243af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
244af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // de-dupe frame rates
245af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) {
246af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                sortedPreviewFrameRates.add(fps);
247af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
248af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            else {
249af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                continue;
250af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
251af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
252af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (sortedPreviewFrameRates.size() > 1) {
253af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                supportedPreviewFrameRates += ",";
254af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    fps);
258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
259af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            ALOGV("%s: Supported preview frame rates: %s",
260af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    __FUNCTION__, supportedPreviewFrameRates.string());
2612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFrameRates);
2642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
266cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<Size> availableJpegSizes = getAvailableJpegSizes();
267cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (!availableJpegSizes.size()) return NO_INIT;
2682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick maximum
270cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    pictureWidth = availableJpegSizes[0].width;
271cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    pictureHeight = availableJpegSizes[0].height;
2723ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
2733ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
2743ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = false;
2752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureSize(pictureWidth,
2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            pictureHeight);
2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPictureSizes;
281cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < availableJpegSizes.size(); i++) {
2822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
284cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    availableJpegSizes[i].width,
285cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    availableJpegSizes[i].height);
2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPictureSizes);
2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
296f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2999fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    // Pick the largest thumbnail size that matches still image aspect ratio.
3009fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0,
3019fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            "Invalid picture size, %d x %d", pictureWidth, pictureHeight);
3029fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight;
3039fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    Size thumbnailSize =
3049fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            getMaxSizeForRatio(
3059fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    picAspectRatio,
3069fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    &availableJpegThumbnailSizes.data.i32[0],
3079fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    availableJpegThumbnailSizes.count);
3089fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    jpegThumbSize[0] = thumbnailSize.width;
3099fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    jpegThumbSize[1] = thumbnailSize.height;
3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[0]);
3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[1]);
3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedJpegThumbSizes;
3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
3202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
3232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedJpegThumbSizes);
3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbQuality = 90;
3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbQuality);
3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegQuality = 90;
3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegQuality);
3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegRotation = 0;
3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegRotation);
3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsEnabled = false;
339a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[0] = 0.0;
340a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[1] = 0.0;
341a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[2] = 0.0;
342a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsTimestamp = 0;
3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsProcessingMethod = "unknown";
3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
346d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    wbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
351211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
352211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableWhiteBalanceModes.count) {
353211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
354211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::WHITE_BALANCE_AUTO);
355211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedWhiteBalance;
3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
362d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_AUTO:
3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
366d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
370d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
374d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
3772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
378d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
382d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
386d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
390d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_SHADE:
3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Skipping values not mappable to v1 API
395d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_OFF:
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance);
4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
410d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
415211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false);
416211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableEffects.count) {
417211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS,
418211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::EFFECT_NONE);
419211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedEffects;
4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedEffects += ",";
4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
426d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_OFF:
4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NONE;
4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
430d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_MONO:
4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_MONO;
4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
434d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE:
4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
438d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE:
4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
4412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
442d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SEPIA:
4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
446d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE:
4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
450d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD:
4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
454d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD:
4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
458d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_AQUA:
4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableEffects.data.u8[i]);
4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
472d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
477211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false);
478211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableAntibandingModes.count) {
479211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
480211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::ANTIBANDING_OFF);
481211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedAntibanding;
4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
488d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF:
4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
492d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ:
4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
496d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ:
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
500d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO:
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
5032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedAntibanding);
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
516c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk    sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
521211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
522211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableSceneModes.count) {
523211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.remove(CameraParameters::KEY_SCENE_MODE);
524211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool noSceneModes = false;
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
532c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                case ANDROID_CONTROL_SCENE_MODE_DISABLED:
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    noSceneModes = true;
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    // Not in old API
5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableSceneModes.data.u8[i]);
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!noSceneModes) {
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes);
610cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin        } else {
611cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin            params.remove(CameraParameters::KEY_SCENE_MODE);
6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
615211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    bool isFlashAvailable = false;
6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
617211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false);
618211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (flashAvailable.count) {
619211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        isFlashAvailable = flashAvailable.data.u8[0];
620211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    }
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
623211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false);
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
625248f9ce1b6052889dd55e7701f908477d16d6ff4Eino-Ville Talvala    flashMode = Parameters::FLASH_MODE_OFF;
626211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (isFlashAvailable) {
6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
6286f854608d26d7abcce5e46396c7260ed7b250653Alex Ray                CameraParameters::FLASH_MODE_OFF);
6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
637d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
6382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
6392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes);
6452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
646b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // No flash means null flash mode and supported flash modes keys, so
647b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // remove them just to be safe
648b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        params.remove(CameraParameters::KEY_FLASH_MODE);
649b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
653211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false);
6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
656211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false);
6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
658211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) {
6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // Fixed-focus lens
6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_FIXED;
6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_AUTO;
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
66980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        String8 supportedFocusModes;
67080ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        bool addComma = false;
67180ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        camera_metadata_ro_entry_t focusDistanceCalibration =
67280ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false);
67380ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh
67480ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        if (focusDistanceCalibration.count &&
67580ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh                focusDistanceCalibration.data.u8[0] !=
67680ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh                ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) {
67780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY;
67880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            addComma = true;
67980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        }
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
685d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
689d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
693d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
697d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
6982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
701d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
7042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                // Not supported in old API
706d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFocusModes);
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
719d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
72095069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala    shadowFocusMode = FOCUS_MODE_INVALID;
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
722ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS,
723ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION);
724ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT;
7252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7267d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    int32_t maxNumFocusAreas = 0;
7277d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    if (focusMode != Parameters::FOCUS_MODE_FIXED) {
728ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF];
7297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    }
7307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas);
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.clear();
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.add(Parameters::Area(0,0,0,0,0));
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
737211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false);
7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizFov, vertFov;
7441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
7451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (res != OK) {
7461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        ALOGE("%s: Can't calculate field of views!", __FUNCTION__);
7471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        return res;
7481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    exposureCompensation = 0;
7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                exposureCompensation);
7562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
758d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2);
7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
7642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
7652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
767d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1);
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoExposureLock = false;
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoWhiteBalanceLock = false;
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
788ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            max3aRegions.data.i32[Parameters::REGION_AE]);
7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoom = 0;
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, zoom);
7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
797d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1);
7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 zoomRatios;
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoom = 1.f;
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (NUM_ZOOM_STEPS-1);
8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) zoomRatios += ",";
8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoom += zoomIncrement;
8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
8162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
81882edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin            CameraParameters::FALSE);
8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "Infinity,Infinity,Infinity");
8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fastInfo.maxFaces);
8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            0);
8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
831a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    recordingHint = false;
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
8372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
838a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    videoStabilization = false;
8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
843211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
844211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::TRUE);
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
8502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FALSE);
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    storeMetadataInBuffers = true;
8572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    playShutterSound = true;
8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFaceDetect = false;
8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFocusMoveMessages = false;
861da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    afTriggerCounter = 1;
8622b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    afStateCounter = 0;
8632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    currentAfTriggerId = -1;
864a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    afInMotion = false;
8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    precaptureTriggerCounter = 1;
867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
8682b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    takePictureCounter = 0;
8692b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewCallbackFlags = 0;
871a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    previewCallbackOneShot = false;
8723ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    previewCallbackSurface = false;
8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
874afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He    char value[PROPERTY_VALUE_MAX];
875afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He    property_get("camera.disable_zsl_mode", value, "0");
876afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He    if (!strcmp(value,"1")) {
877afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He        ALOGI("Camera %d: Disabling ZSL mode", cameraId);
878b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala        zslMode = false;
8792f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala    } else {
880afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He        zslMode = true;
881b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala    }
882e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
883e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    lightFx = LIGHTFX_NONE;
884e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    state = STOPPED;
8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    paramsFlattened = params.flatten();
8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const {
8938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return paramsFlattened;
8948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
8958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() {
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
89903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4);
9002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
90103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    int32_t arrayWidth;
90203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    int32_t arrayHeight;
90303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    if (activeArraySize.count == 2) {
904e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray        ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!",
905e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray                __FUNCTION__, cameraId);
90603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayWidth = activeArraySize.data.i32[0];
90703e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayHeight = activeArraySize.data.i32[1];
90803e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    } else if (activeArraySize.count == 4) {
90903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayWidth = activeArraySize.data.i32[2];
91003e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayHeight = activeArraySize.data.i32[3];
91103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    } else return NO_INIT;
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    // We'll set the target FPS range for still captures to be as wide
9140181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    // as possible to give the HAL maximum latitude for exposure selection
9150181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
9160181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
9170181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) {
9180181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        return NO_INIT;
9190181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
9200181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
9210181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    int32_t bestStillCaptureFpsRange[2] = {
9220181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        availableFpsRanges.data.i32[0], availableFpsRanges.data.i32[1]
9230181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    };
9240181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    int32_t curRange =
9250181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0];
9260181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    for (size_t i = 2; i < availableFpsRanges.count; i += 2) {
9270181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        int32_t nextRange =
9280181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                availableFpsRanges.data.i32[i + 1] -
9290181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                availableFpsRanges.data.i32[i];
9300181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        if ( (nextRange > curRange) ||       // Maximize size of FPS range first
9310181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                (nextRange == curRange &&    // Then minimize low-end FPS
9320181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                 bestStillCaptureFpsRange[0] > availableFpsRanges.data.i32[i])) {
9330181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
9340181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[0] = availableFpsRanges.data.i32[i];
9350181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[1] = availableFpsRanges.data.i32[i + 1];
9360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            curRange = nextRange;
9370181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        }
9380181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
9390181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
9402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
941211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0,
942211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
9432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    uint8_t bestFaceDetectMode =
945d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
9462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
9472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
948d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF:
9492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
950d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE:
9512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (bestFaceDetectMode !=
952d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
9532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    bestFaceDetectMode =
954d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE;
9552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
9562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
957d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL:
9582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                bestFaceDetectMode =
959d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    ANDROID_STATISTICS_FACE_DETECT_MODE_FULL;
9602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
9612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
9622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
9632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
9642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
9652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return NO_INIT;
9662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
9672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
969211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    int32_t maxFaces = 0;
9702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
971211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false);
972211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (maxFacesDetected.count) {
973211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        maxFaces = maxFacesDetected.data.i32[0];
974211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    }
9752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
977211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
9788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t sceneModeOverrides =
979211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false);
9808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
981211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false);
982211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    bool fixedLens = minFocusDistance.count == 0 ||
983211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        minFocusDistance.data.f[0] == 0;
9848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
985176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala    camera_metadata_ro_entry_t focusDistanceCalibration =
986176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0,
987176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    false);
988176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala    bool canFocusInfinity = (focusDistanceCalibration.count &&
989176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            focusDistanceCalibration.data.u8[0] !=
990176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED);
991176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala
9921f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
9931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
9941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
9951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
996cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
997cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (!availableFormats.size()) return NO_INIT;
9984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
9994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
10008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeOverrides.count > 0) {
10018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // sceneModeOverrides is defined to have 3 entries for each scene mode,
10028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // which are AE, AWB, and AF override modes the HAL wants for that scene
10038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // mode.
10048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        const size_t kModesPerSceneMode = 3;
10058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        if (sceneModeOverrides.count !=
10068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                availableSceneModes.count * kModesPerSceneMode) {
10078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Camera %d: Scene mode override list is an "
1008e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                    "unexpected size: %zu (expected %zu)", __FUNCTION__,
10098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    cameraId, sceneModeOverrides.count,
10108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    availableSceneModes.count);
10118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return NO_INIT;
10128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
10138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        for (size_t i = 0; i < availableSceneModes.count; i++) {
10148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            DeviceInfo::OverrideModes modes;
10158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            uint8_t aeMode =
10168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0];
10178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            switch(aeMode) {
1018d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON:
10198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_OFF;
10208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1021d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
10228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_AUTO;
10238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1024d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
10258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_ON;
10268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1027d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
10288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_RED_EYE;
10298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                default:
10318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__,
10328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            aeMode);
10338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_INVALID;
10348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            }
10368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            modes.wbMode =
10378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1];
10388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            uint8_t afMode =
10398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2];
10408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            switch(afMode) {
1041d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
1042176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    if (!fixedLens && !canFocusInfinity) {
1043176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                        ALOGE("%s: Camera %d: Scene mode override lists asks for"
1044176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                " fixed focus on a device with focuser but not"
1045176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                " calibrated for infinity focus", __FUNCTION__,
1046176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                cameraId);
1047176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                        return NO_INIT;
1048176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    }
10498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = fixedLens ?
10508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY;
10518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1052d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
1053d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
1054d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
1055d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
1056d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
10578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = static_cast<focusMode_t>(afMode);
10588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                default:
10608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__,
10618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            afMode);
10628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = FOCUS_MODE_INVALID;
10638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            }
10658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i],
10668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes);
10678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
10688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
10698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
10702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayWidth = arrayWidth;
10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayHeight = arrayHeight;
10720181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0];
10730181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1];
10742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.bestFaceDetectMode = bestFaceDetectMode;
10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.maxFaces = maxFaces;
10761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
10771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // Find smallest (widest-angle) focal length to use as basis of still
10781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // picture FOV reporting.
10791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    fastInfo.minFocalLength = availableFocalLengths.data.f[0];
10801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    for (size_t i = 1; i < availableFocalLengths.count; i++) {
10811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) {
10821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            fastInfo.minFocalLength = availableFocalLengths.data.f[i];
10831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        }
10841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
10851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
10864a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888
10874a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    fastInfo.useFlexibleYuv = false;
1088cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    for (size_t i = 0; i < availableFormats.size(); i++) {
1089cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) {
10904a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            fastInfo.useFlexibleYuv = true;
10914a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            break;
10924a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        }
10934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    }
10944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    ALOGV("Camera %d: Flexible YUV %s supported",
10954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            cameraId, fastInfo.useFlexibleYuv ? "is" : "is not");
10964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
10972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
10982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
10992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1100e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() {
1101e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
1102e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO);
1103e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1);
1104e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled",
1105e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            cameraId);
1106e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
1107e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT);
1108e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1);
1109e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled",
1110e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            cameraId);
1111e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
11127373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION);
11137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1);
11147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion"
11157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                " enabled", cameraId);
11167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
1117fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT);
1118fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1);
1119fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult"
1120fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                " enabled", cameraId);
1121fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1122e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    return OK;
1123e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala}
1124e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
11252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
1126d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin        size_t minCount, size_t maxCount, bool required) const {
11272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t entry = info->find(tag);
11282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1129d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin    if (CC_UNLIKELY( entry.count == 0 ) && required) {
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
11332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
11342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
11362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag);
11372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (CC_UNLIKELY(
11382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
11392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
11402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
11412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
11422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
11432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
11442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1145e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                "Expected between %zu and %zu values, but got %zu values",
11462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
11472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return entry;
11502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
11512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) {
11532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
11542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    CameraParameters2 newParams(paramString);
11562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only parameters
11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // such as supported preview sizes, etc. Should probably produce an error if
11592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // they're changed.
11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Extract and verify new parameters */
11622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t i;
11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters validatedParams(*this);
11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_SIZE
11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewSize(&validatedParams.previewWidth,
11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewHeight);
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewWidth != previewWidth ||
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewHeight != previewHeight) {
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight,
11782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth, validatedParams.previewHeight);
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11813ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        for (i = 0; i < availablePreviewSizes.size(); i++) {
11823ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He            if ((availablePreviewSizes[i].width ==
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth) &&
11843ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                (availablePreviewSizes[i].height ==
11852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight)) break;
11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11873ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        if (i == availablePreviewSizes.size()) {
11882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.previewWidth,
11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight);
11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1195af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    // RECORDING_HINT (always supported)
1196af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    validatedParams.recordingHint = boolFromString(
1197af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
11980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    IF_ALOGV() { // Avoid unused variable warning
11990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        bool recordingHintChanged =
12000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.recordingHint != recordingHint;
12010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        if (recordingHintChanged) {
12020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: Recording hint changed to %d",
12030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__, validatedParams.recordingHint);
12040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
12050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
1206af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FPS_RANGE
1208d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
12090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
12100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Use the single FPS value if it was set later than the range.
12110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Otherwise, use the range value.
12120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
12130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    bool fpsUseSingleValue;
12140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    {
12150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        const char *fpsRange, *fpsSingle;
12160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE);
12180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
12190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        /**
12210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         * Pick either the range or the single key if only one was set.
12220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         *
12230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         * If both are set, pick the one that has greater set order.
12240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         */
12250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        if (fpsRange == NULL && fpsSingle == NULL) {
12260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGE("%s: FPS was not set. One of %s or %s must be set.",
12270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE,
12280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  CameraParameters::KEY_PREVIEW_FPS_RANGE);
12290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return BAD_VALUE;
12300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else if (fpsRange == NULL) {
12310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = true;
12320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: FPS range not set, using FPS single value",
12330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__);
12340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else if (fpsSingle == NULL) {
12350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = false;
12360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: FPS single not set, using FPS range value",
12370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__);
12380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else {
12390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            int fpsKeyOrder;
12400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            res = newParams.compareSetOrder(
12410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    CameraParameters::KEY_PREVIEW_FRAME_RATE,
12420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    CameraParameters::KEY_PREVIEW_FPS_RANGE,
12430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    &fpsKeyOrder);
12440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys");
12450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = (fpsKeyOrder > 0);
12470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1249d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
12500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS value is used from '%s'",
12510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin              __FUNCTION__, fpsUseSingleValue ? "single" : "range");
12520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
12532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
12542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewFpsRange[1]);
12550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1256c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala    validatedParams.previewFpsRange[0] /= kFpsToApiScale;
1257c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala    validatedParams.previewFpsRange[1] /= kFpsToApiScale;
1258c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala
12590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Ignore the FPS range if the FPS single has higher precedence
12600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (!fpsUseSingleValue) {
12610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__,
12620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0],
12630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1]);
1264d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
12652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
12662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
12672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
12682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
12692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[0]) &&
12702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
12712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]) ) {
12722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
12732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
12742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
12762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
12772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.previewFpsRange[0],
12782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]);
12792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FORMAT
12842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.previewFormat =
12852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatStringToEnum(newParams.getPreviewFormat());
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFormat != previewFormat) {
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
12892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active!", __FUNCTION__);
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1292cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
12934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        // If using flexible YUV, always support NV21/YV12. Otherwise, check
12944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        // HAL's list.
12954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        if (! (fastInfo.useFlexibleYuv &&
12964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                (validatedParams.previewFormat ==
12974a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        HAL_PIXEL_FORMAT_YCrCb_420_SP ||
12984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                 validatedParams.previewFormat ==
12994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        HAL_PIXEL_FORMAT_YV12) ) ) {
13004a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            // Not using flexible YUV format, so check explicitly
1301cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            for (i = 0; i < availableFormats.size(); i++) {
1302cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                if (availableFormats[i] == validatedParams.previewFormat) break;
13034a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            }
1304cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (i == availableFormats.size()) {
13054a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                ALOGE("%s: Requested preview format %s (0x%x) is not supported",
13064a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        __FUNCTION__, newParams.getPreviewFormat(),
13074a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        validatedParams.previewFormat);
13084a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                return BAD_VALUE;
13094a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            }
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // PREVIEW_FRAME_RATE Deprecated
13140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // - Use only if the single FPS value was set later than the FPS range
13150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (fpsUseSingleValue) {
1316d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala        int previewFps = newParams.getPreviewFrameRate();
13170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS single value requested: %d",
13180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin              __FUNCTION__, previewFps);
13190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        {
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
1322af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            /**
1323af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * If recording hint is set, find the range that encompasses
1324af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * previewFps with the largest min index.
1325af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              *
1326af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * If recording hint is not set, find the range with previewFps
1327af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * with the smallest min index.
1328af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              *
1329af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * Either way, in case of multiple ranges, break the tie by
1330af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * selecting the smaller range.
1331af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              */
1332d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
1333d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala            // all ranges which have previewFps
1334af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            Vector<Range> candidateRanges;
13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
1336af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                Range r = {
1337af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                            availableFrameRates.data.i32[i],
1338af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                            availableFrameRates.data.i32[i+1]
1339af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                };
1340af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1341d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala                if (r.min <= previewFps && previewFps <= r.max) {
1342af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    candidateRanges.push(r);
1343af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1345af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (candidateRanges.isEmpty()) {
13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
1347d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala                        __FUNCTION__, previewFps);
13482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
13492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1350af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // most applicable range with targetFps
1351af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            Range bestRange = candidateRanges[0];
1352af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            for (i = 1; i < candidateRanges.size(); ++i) {
1353af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                Range r = candidateRanges[i];
1354af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1355af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                // Find by largest minIndex in recording mode
1356af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                if (validatedParams.recordingHint) {
1357af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    if (r.min > bestRange.min) {
1358af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1359af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1360af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
1361af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1362af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1363af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
1364af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                // Find by smallest minIndex in preview mode
1365af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                else {
1366af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    if (r.min < bestRange.min) {
1367af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1368af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1369af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
1370af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1371af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1372af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
1373af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
1374af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
13752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[0] =
1376af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    bestRange.min;
13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] =
1378af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    bestRange.max;
1379af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1380af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d",
1381af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                __FUNCTION__,
1382af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.previewFpsRange[0],
1383af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.previewFpsRange[1],
1384af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.recordingHint);
13852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
13890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Update Preview FPS and Preview FPS ranges based on
13900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * what we actually set.
13910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
13920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * This updates the API-visible (Camera.Parameters#getParameters) values of
13930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * the FPS fields, not only the internal versions.
13940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
13950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Order matters: The value that was set last takes precedence.
13960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * - If the client does a setParameters(getParameters()) we retain
13970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *   the same order for preview FPS.
13980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
13990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (!fpsUseSingleValue) {
14000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set fps single, then fps range (range wins)
14010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFrameRate(
14020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                fpsFromRange(/*min*/validatedParams.previewFpsRange[0],
14030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                             /*max*/validatedParams.previewFpsRange[1]));
14040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFpsRange(
14050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0] * kFpsToApiScale,
14060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1] * kFpsToApiScale);
14070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    } else {
14080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set fps range, then fps single (single wins)
14090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFpsRange(
14100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0] * kFpsToApiScale,
14110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1] * kFpsToApiScale);
14120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set this to the same value, but with higher priority
14130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFrameRate(
14140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                newParams.getPreviewFrameRate());
14150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
14160b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
14172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PICTURE_SIZE
14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPictureSize(&validatedParams.pictureWidth,
14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.pictureHeight);
14203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (validatedParams.pictureWidth != pictureWidth ||
14213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh            validatedParams.pictureHeight != pictureHeight) {
1422cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<Size> availablePictureSizes = getAvailableJpegSizes();
1423cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (i = 0; i < availablePictureSizes.size(); i++) {
1424cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if ((availablePictureSizes[i].width ==
14252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureWidth) &&
1426cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                (availablePictureSizes[i].height ==
14272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight)) break;
14282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1429cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (i == availablePictureSizes.size()) {
14302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
14312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.pictureWidth,
14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight);
14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[0] =
14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[1] =
14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableJpegThumbSizes.data.i32[i] ==
14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[0]) &&
14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableJpegThumbSizes.data.i32[i+1] ==
14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1])) break;
14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.jpegThumbSize[0],
14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1]);
14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
1461c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
1462c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    // also makes sure quality fits in uint8_t
1463c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    if (quality < 0 || quality > 100) {
14642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
1465c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala                __FUNCTION__, quality);
14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1468c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    validatedParams.jpegThumbQuality = quality;
14692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_QUALITY
1471c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
1472c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    // also makes sure quality fits in uint8_t
1473c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    if (quality < 0 || quality > 100) {
14742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
1475c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala                __FUNCTION__, quality);
14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1478c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    validatedParams.jpegQuality = quality;
14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ROTATION
14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegRotation =
14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegRotation != 0 &&
14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 90 &&
14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 180 &&
14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 270) {
14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegRotation);
14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS
14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *gpsLatStr =
14952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
14962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (gpsLatStr != NULL) {
14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsLongStr =
14982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsAltitudeStr =
15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
15012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsTimeStr =
15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsProcMethodStr =
15042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (gpsLongStr == NULL ||
15062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsAltitudeStr == NULL ||
15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsTimeStr == NULL ||
15082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsProcMethodStr == NULL) {
15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
15112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *endPtr;
15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
15232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    gpsAltitudeStr);
15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsProcessingMethod = gpsProcMethodStr;
15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = true;
15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = false;
15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EFFECT
15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.effectMode = effectModeStringToEnum(
15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.effectMode != effectMode) {
15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableEffectModes.count) {
15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ANTIBANDING
15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.antibandingMode = abModeStringToEnum(
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.antibandingMode != antibandingMode) {
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableAbModes.count) {
15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // SCENE_MODE
15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.sceneMode = sceneModeStringToEnum(
15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.sceneMode != sceneMode &&
15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.sceneMode !=
1586c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED) {
15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableSceneModes.count) {
15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    bool sceneModeSet =
1601c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED;
16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FLASH_MODE
16048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
16058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode =
16068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
16078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).flashMode;
16088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
16098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode = FLASH_MODE_INVALID;
16108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.flashMode == FLASH_MODE_INVALID) {
16128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode = flashModeStringToEnum(
16138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            newParams.get(CameraParameters::KEY_FLASH_MODE) );
16148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.flashMode != flashMode) {
16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
1618d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1);
1619b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        bool isFlashAvailable =
1620b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala                flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE;
1621b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        if (!isFlashAvailable &&
16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (validatedParams.flashMode == availableAeModes.data.u8[i])
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
16342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableAeModes.count) {
16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == -1) {
16412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
16422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
16432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1646b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // Update in case of override, but only if flash is supported
1647b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        if (isFlashAvailable) {
1648b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala            newParams.set(CameraParameters::KEY_FLASH_MODE,
1649b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala                    flashModeEnumToString(validatedParams.flashMode));
1650b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        }
16518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
16538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    // WHITE_BALANCE
16548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
16558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.wbMode =
16568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
16578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).wbMode;
16588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
1659d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF;
16608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
1661d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
16628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.wbMode = wbModeStringToEnum(
16638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
16648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.wbMode != wbMode) {
16668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
1667211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
16688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
16698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
16708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
16718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        if (i == availableWbModes.count) {
16728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
16738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__,
16748a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
16758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return BAD_VALUE;
16768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
16778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // Update in case of override
16788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        newParams.set(CameraParameters::KEY_WHITE_BALANCE,
16798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                wbModeEnumToString(validatedParams.wbMode));
16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_MODE
16838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
16848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode =
16858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
16868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).focusMode;
16878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
16888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode = FOCUS_MODE_INVALID;
16898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.focusMode == FOCUS_MODE_INVALID) {
16918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode = focusModeStringToEnum(
16928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                newParams.get(CameraParameters::KEY_FOCUS_MODE) );
16938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.focusMode != focusMode) {
16952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = -1;
16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
1698211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0,
1699211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                        false);
1700211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray            if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) {
17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
17022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        "fixed focus lens",
17032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
17042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
17052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
17062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            } else if (validatedParams.focusMode !=
17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::FOCUS_MODE_INFINITY) {
17082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
17102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
17112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (validatedParams.focusMode ==
17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableFocusModes.data.u8[i]) break;
17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
17142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (i == availableFocusModes.count) {
17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
17162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            __FUNCTION__,
17172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return BAD_VALUE;
17192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
17202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
17212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1722d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
172395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // Always reset shadow focus mode to avoid reverting settings
1724d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        validatedParams.shadowFocusMode = FOCUS_MODE_INVALID;
17258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // Update in case of override
17268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        newParams.set(CameraParameters::KEY_FOCUS_MODE,
17278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                focusModeEnumToString(validatedParams.focusMode));
17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = currentAfTriggerId;
17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_AREAS
17332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.focusingAreas);
1735ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
1736ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk              Parameters::NUM_REGION, Parameters::NUM_REGION).
1737ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk              data.i32[Parameters::REGION_AF];
17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) res = validateAreas(validatedParams.focusingAreas,
1739ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            maxAfRegions, AREA_KIND_FOCUS);
17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EXPOSURE_COMPENSATION
17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.exposureCompensation =
17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
1750d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE);
17512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if ((validatedParams.exposureCompensation <
17522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]) ||
17532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (validatedParams.exposureCompensation >
17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1])) {
17552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
17562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.exposureCompensation);
17572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
17582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoExposureLock = boolFromString(
17622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoWhiteBalanceLock = boolFromString(
17662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // METERING_AREAS
1769ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
1770ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION).
1771ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            data.i32[Parameters::REGION_AE];
17722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.meteringAreas);
17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) {
1775ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        res = validateAreas(validatedParams.meteringAreas, maxAeRegions,
17767d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                            AREA_KIND_METERING);
17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
17802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
17812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
17832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ZOOM
17862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1787709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin    if (validatedParams.zoom < 0
1788709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin                || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) {
17892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
17902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.zoom);
17912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
17922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_SIZE
17952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getVideoSize(&validatedParams.videoWidth,
17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.videoHeight);
17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoWidth != videoWidth ||
17982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.videoHeight != videoHeight) {
17992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state == RECORD) {
1800c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)"
1801c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    " when recording is active! Ignore the size update!",
1802c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth,
18032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight);
1804c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            validatedParams.videoWidth = videoWidth;
1805c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            validatedParams.videoHeight = videoHeight;
1806c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            newParams.setVideoSize(videoWidth, videoHeight);
1807c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He        } else {
1808c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            for (i = 0; i < availableVideoSizes.size(); i++) {
1809c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                if ((availableVideoSizes[i].width ==
1810c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoWidth) &&
1811c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    (availableVideoSizes[i].height ==
1812c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoHeight)) break;
1813c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            }
1814c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            if (i == availableVideoSizes.size()) {
1815c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                ALOGE("%s: Requested video size %d x %d is not supported",
1816c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        __FUNCTION__, validatedParams.videoWidth,
1817c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoHeight);
1818c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                return BAD_VALUE;
1819c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            }
18202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
18212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_STABILIZATION
18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.videoStabilization = boolFromString(
18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
18262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
1827211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
1828211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
18292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoStabilization &&
18302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            availableVideoStabilizationModes.count == 1) {
18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1834e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    // LIGHTFX
1835e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    validatedParams.lightFx = lightFxStringToEnum(
1836e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        newParams.get(CameraParameters::KEY_LIGHTFX));
1837e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
18382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Update internal parameters */
18392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    *this = validatedParams;
18413ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    updateOverriddenJpegSize();
18422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /** Update external parameters calculated from the internal ones */
18441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
18451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // HORIZONTAL/VERTICAL FIELD OF VIEW
18461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizFov, vertFov;
18471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
18481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (res != OK) {
18491f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        ALOGE("%s: Can't calculate FOVs", __FUNCTION__);
18501f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        // continue so parameters are at least consistent
18511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
18521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
18531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            horizFov);
18541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE,
18551f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            vertFov);
18561f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov);
18571f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
18588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    // Need to flatten again in case of overrides
18598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    paramsFlattened = newParams.flatten();
18608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    params = newParams;
18618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
18632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1865da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const {
1866da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
1867da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
1868da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
186903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    /**
187003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * Mixin default important security values
187103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * - android.led.transmit = defaulted ON
187203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     */
187303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS,
1874d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*minimumCount*/0,
1875d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*maximumCount*/0,
1876d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*required*/false);
187703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    for(size_t i = 0; i < entry.count; ++i) {
187803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        uint8_t led = entry.data.u8[i];
187903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
188003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        switch(led) {
188103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            // Transmit LED is unconditionally on when using
188203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            // the android.hardware.Camera API
188303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
188403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
188503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                res = request->update(ANDROID_LED_TRANSMIT,
188603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                                      &transmitDefault, 1);
188703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                if (res != OK) return res;
188803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                break;
188903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            }
189003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        }
189103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    }
189203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
189303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    /**
189403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * Construct metadata from parameters
189503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     */
189603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
1897d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
1898da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_REQUEST_METADATA_MODE,
1899da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &metadataMode, 1);
1900da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1901da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
19020181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    camera_metadata_entry_t intent =
19030181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            request->find(ANDROID_CONTROL_CAPTURE_INTENT);
1904c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi
1905c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi    if (intent.count == 0) return BAD_VALUE;
1906c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi
19070181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) {
19080181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
19090181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                fastInfo.bestStillCaptureFpsRange, 2);
19100181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    } else {
19110181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
19120181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                previewFpsRange, 2);
19130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
1914da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1915da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
191696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    uint8_t reqWbLock = autoWhiteBalanceLock ?
191796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
191896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_LOCK,
191996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            &reqWbLock, 1);
192096150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala
1921da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
1922da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &effectMode, 1);
1923da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1924da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
1925da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &antibandingMode, 1);
1926da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1927da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
192861c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // android.hardware.Camera requires that when face detect is enabled, the
192961c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // camera is in a face-priority mode. HAL2 splits this into separate parts
193061c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // (face detection statistics and face priority scene mode). Map from other
193161c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // to the other.
19328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    bool sceneModeActive =
1933c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
1934d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO;
19358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (enableFaceDetect || sceneModeActive) {
1936d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE;
193761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    }
1938da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
1939da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqControlMode, 1);
1940da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
194161c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala
1942d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala    uint8_t reqSceneMode =
19438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            sceneModeActive ? sceneMode :
1944d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala            enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY :
1945c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
194661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_SCENE_MODE,
194761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala            &reqSceneMode, 1);
194861c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    if (res != OK) return res;
1949da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1950d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF;
1951d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF;
1952da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    switch (flashMode) {
1953da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
1954d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break;
1955da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
1956d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break;
1957da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_ON:
1958d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break;
1959da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
1960d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON;
1961d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqFlashMode = ANDROID_FLASH_MODE_TORCH;
1962da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
1963da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
1964d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break;
1965da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        default:
1966da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
1967da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    cameraId, flashMode);
19688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                return BAD_VALUE;
1969da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1970da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
1971da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFlashMode, 1);
1972da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1973da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
1974da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqAeMode, 1);
1975da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1976da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
197796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    uint8_t reqAeLock = autoExposureLock ?
197896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
197996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_LOCK,
198096150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            &reqAeLock, 1);
19818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (res != OK) return res;
19828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
19838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
19848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            &wbMode, 1);
19858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (res != OK) return res;
198696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala
1987da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    float reqFocusDistance = 0; // infinity focus in diopters
1988d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
1989da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    switch (focusMode) {
1990da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
1991da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
1992da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
1993da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
1994da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
1995da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusMode = focusMode;
1996da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
1997da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
1998da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
1999d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
2000da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
2001da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        default:
20028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
20038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        cameraId, focusMode);
20048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                return BAD_VALUE;
2005da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2006da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
2007da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFocusDistance, 1);
2008da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2009da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
2010da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFocusMode, 1);
2011da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2012da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2013da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t reqFocusingAreasSize = focusingAreas.size() * 5;
2014da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize];
2015894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He    for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) {
2016894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        if (focusingAreas[j].weight != 0) {
2017da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 0] =
2018894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedXToArray(focusingAreas[j].left);
2019da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 1] =
2020894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedYToArray(focusingAreas[j].top);
2021da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 2] =
2022894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedXToArray(focusingAreas[j].right);
2023da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 3] =
2024894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedYToArray(focusingAreas[j].bottom);
2025da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
2026da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 0] = 0;
2027da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 1] = 0;
2028da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 2] = 0;
2029da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 3] = 0;
2030da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
2031894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        reqFocusingAreas[i + 4] = focusingAreas[j].weight;
2032da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2033da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
2034da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas, reqFocusingAreasSize);
2035da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2036da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    delete[] reqFocusingAreas;
2037da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2038d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
2039da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &exposureCompensation, 1);
2040da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2041da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2042da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t reqMeteringAreasSize = meteringAreas.size() * 5;
2043da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize];
2044894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He    for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) {
2045894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        if (meteringAreas[j].weight != 0) {
2046da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 0] =
2047894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedXToArray(meteringAreas[j].left);
2048da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 1] =
2049894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedYToArray(meteringAreas[j].top);
2050da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 2] =
2051894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedXToArray(meteringAreas[j].right);
2052da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 3] =
2053894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedYToArray(meteringAreas[j].bottom);
2054da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
2055da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 0] = 0;
2056da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 1] = 0;
2057da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 2] = 0;
2058da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 3] = 0;
2059da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
2060894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        reqMeteringAreas[i + 4] = meteringAreas[j].weight;
2061da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2062da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
2063da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas, reqMeteringAreasSize);
2064da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2065da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2066ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    // Set awb regions to be the same as the metering regions if allowed
2067ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
2068ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION).
2069ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            data.i32[Parameters::REGION_AWB];
2070ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    if (maxAwbRegions > 0) {
2071ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        if (maxAwbRegions >= meteringAreas.size()) {
2072ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2073ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk                    reqMeteringAreas, reqMeteringAreasSize);
2074ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        } else {
2075ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            // Ensure the awb regions are zeroed if the region count is too high.
2076ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0};
2077ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2078ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk                    zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t));
2079ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        }
2080ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        if (res != OK) return res;
2081ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    }
2082ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk
2083da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    delete[] reqMeteringAreas;
2084da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
20857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    /* don't include jpeg thumbnail size - it's valid for
20867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin       it to be set to (0,0), meaning 'no thumbnail' */
20877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion crop = calculateCropRegion( (CropRegion::Outputs)(
20887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            CropRegion::OUTPUT_PREVIEW     |
20897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            CropRegion::OUTPUT_VIDEO       |
20907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            CropRegion::OUTPUT_PICTURE    ));
209105bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin    int32_t reqCropRegion[4] = {
2092c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala        static_cast<int32_t>(crop.left),
2093c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala        static_cast<int32_t>(crop.top),
209405bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin        static_cast<int32_t>(crop.width),
209505bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin        static_cast<int32_t>(crop.height)
2096c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    };
2097da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
209805bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin            reqCropRegion, 4);
2099da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2100da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2101da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t reqVstabMode = videoStabilization ?
2102d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON :
2103d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
2104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqVstabMode, 1);
2106da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2107da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2108da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t reqFaceDetectMode = enableFaceDetect ?
2109da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            fastInfo.bestFaceDetectMode :
2110d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
2111d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE,
2112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFaceDetectMode, 1);
2113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2114da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2115da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
2116da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
2117da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2118ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const {
2119ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    status_t res;
2120ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2121ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE,
2122ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            jpegThumbSize, 2);
2123ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2124ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY,
2125ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegThumbQuality, 1);
2126ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2127ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_QUALITY,
2128ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegQuality, 1);
2129ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2130ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(
2131ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2132ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegRotation, 1);
2133ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2134ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2135ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (gpsEnabled) {
2136ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2137ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2138ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                gpsCoordinates, 3);
2139ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2140ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2141ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2142ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                &gpsTimestamp, 1);
2143ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2144ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2145ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2146ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                gpsProcessingMethod);
2147ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2148ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    } else {
2149ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_COORDINATES);
2150ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2151ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP);
2152ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2153ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
2154ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2155ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    }
2156ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    return OK;
2157ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala}
2158ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
21593ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::overrideJpegSizeByVideoSize() {
21603ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (pictureSizeOverriden) {
21613ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has been overridden. Skip overriding");
21623ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
21633ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
21643ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21653ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = true;
21663ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
21673ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
21683ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = videoWidth;
21693ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = videoHeight;
21703ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    // This change of picture size is invisible to app layer.
21713ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    // Do not update app visible params
21723ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
21733ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
21743ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21753ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::updateOverriddenJpegSize() {
21763ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (!pictureSizeOverriden) {
21773ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has not been overridden. Skip checking");
21783ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
21793ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
21803ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21813ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
21823ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
21833ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21843ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) {
21853ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        // Picture size is now smaller than video size. No need to override anymore
21863ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return recoverOverriddenJpegSize();
21873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
21883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = videoWidth;
21903ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = videoHeight;
21913ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21923ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
21933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
21943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::recoverOverriddenJpegSize() {
21963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (!pictureSizeOverriden) {
21973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has not been overridden. Skip recovering");
21983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
21993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
22003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = false;
22013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = pictureWidthLastSet;
22023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = pictureHeightLastSet;
22033ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
22043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
2205ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
22062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) {
22072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
22082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(state) {
22092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
22102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
22112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
22122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
22132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
22142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
22152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
22162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
22172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return "Unknown state!";
22182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR
22212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) {
2224b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    return CameraParameters::previewFormatToEnum(format);
22252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) {
22282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *fmt;
22292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(format) {
22302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
22312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
22322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
22462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
22472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
22492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
22512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
22532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
22542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,  format);
22552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = NULL;
22562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return fmt;
22592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) {
22622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
22634a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !wbMode ?
2264d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
22652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2266d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
22672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2268d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_INCANDESCENT :
22692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2270d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_FLUORESCENT :
22712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2272d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT :
22732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2274d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_DAYLIGHT :
22752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2276d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT :
22772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2278d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_TWILIGHT :
22792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2280d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_SHADE :
22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) {
22858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (wbMode) {
2286d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_AUTO:
22878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_AUTO;
2288d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
22898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_INCANDESCENT;
2290d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
22918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_FLUORESCENT;
2292d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
22938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2294d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
22958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_DAYLIGHT;
2296d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
22978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2298d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
22998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_TWILIGHT;
2300d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_SHADE:
23018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_SHADE;
23028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
23038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown AWB mode enum: %d",
23048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, wbMode);
23058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
23068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
23078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
23088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) {
23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23114a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !effectMode ?
2312d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
23132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2314d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
23152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2316d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_MONO :
23172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2318d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_NEGATIVE :
23192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2320d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SOLARIZE :
23212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2322d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SEPIA :
23232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2324d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_POSTERIZE :
23252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2326d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD :
23272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2328d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD :
23292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2330d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_AQUA :
23312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
23322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) {
23352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23364a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !abMode ?
2337d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
23382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2339d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
23402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2341d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF :
23422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2343d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ :
23442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2345d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ :
23462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
23472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) {
23502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23514a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !sceneMode ?
2352c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED :
23532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2354c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED :
23552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
23562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
23572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
23582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
23592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
23602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
23612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
23622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
23632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
23642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
23652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
23662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
23672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
23682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
23692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
23702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
23712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
23722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
23732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
23742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
23752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
23762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
23782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
23792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
23802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
23812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
23822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
23832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
23842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
23852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
23862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
23892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *flashMode) {
23902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23914a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !flashMode ?
2392b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
23942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
23952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
23962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
23972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
23982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
23992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
24002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
24012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
24022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
24032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
24042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) {
24078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (flashMode) {
24088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_OFF:
24098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_OFF;
24108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_AUTO:
24118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_AUTO;
24128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_ON:
24138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_ON;
24148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_RED_EYE:
24158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_RED_EYE;
24168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_TORCH:
24178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_TORCH;
24188a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
24198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown flash mode enum %d",
24208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, flashMode);
24218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
24228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
24238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
24248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
24252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
24262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *focusMode) {
24272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
24284a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !focusMode ?
24294a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala            Parameters::FOCUS_MODE_INVALID :
24302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
24312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
24322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
24332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
24342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
24352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
24362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
24372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
24382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
24392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
24402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
24412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
24422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
24432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
24442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
24452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) {
24488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (focusMode) {
24498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_AUTO:
24508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_AUTO;
24518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_MACRO:
24528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_MACRO;
24538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_VIDEO:
24548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
24558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_PICTURE:
24568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
24578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_EDOF:
24588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_EDOF;
24598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_INFINITY:
24608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_INFINITY;
24618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_FIXED:
24628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_FIXED;
24638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
24648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown focus mode enum: %d",
24658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, focusMode);
24668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
24678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
24688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
24698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
2470e538206d15282afbc5b168d60b1026a5dfcd13c0James PainterParameters::Parameters::lightFxMode_t Parameters::lightFxStringToEnum(
2471e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        const char *lightFxMode) {
2472e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter    return
24734a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !lightFxMode ?
24744a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala            Parameters::LIGHTFX_NONE :
2475e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        !strcmp(lightFxMode, CameraParameters::LIGHTFX_LOWLIGHT) ?
2476e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            Parameters::LIGHTFX_LOWLIGHT :
2477e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        !strcmp(lightFxMode, CameraParameters::LIGHTFX_HDR) ?
2478e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter            Parameters::LIGHTFX_HDR :
2479e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter        Parameters::LIGHTFX_NONE;
2480e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter}
2481e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
24822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr,
24832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
24842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
24852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    areas->clear();
24862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areasCStr == NULL) {
24872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
24882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push();
24892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return OK;
24902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
24912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    String8 areasStr(areasCStr);
24922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
24932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    while (areaStart != 0) {
24942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
24952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *numEnd;
24962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int vals[NUM_FIELDS];
24972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
24982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            errno = 0;
24992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
25002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
25012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            area = numEnd + 1;
25022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
25032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push(Parameters::Area(
25042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
25062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
25082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
25117d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                                      size_t maxRegions,
25127d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                                      AreaKind areaKind) const {
25132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Definition of valid area can be found in
25142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // include/camera/CameraParameters.h
25152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 1) {
25172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (areas[0].left == 0 &&
25182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].top == 0 &&
25192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].right == 0 &&
25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].bottom == 0 &&
25212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].weight == 0) {
25222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
25232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return OK;
25242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
25252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25267d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin
25277d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    // fixed focus can only set (0,0,0,0,0) focus area
25287d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) {
25297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin        return BAD_VALUE;
25307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    }
25317d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin
25322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() > maxRegions) {
2533e5729fac81c8a984e984fefc90afc64135817d4fColin Cross        ALOGE("%s: Too many areas requested: %zu",
25342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, areas.size());
25352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
25362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
25392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala         a != areas.end(); a++) {
25402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
25412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
25422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
25432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
25442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
25452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
25462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
25472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
25492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) {
25522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return !boolStr ? false :
25532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
25542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        false;
25552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) {
25582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!mirror) {
25592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) return 0;
25602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
25612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
25622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
25632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
25642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
25652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
25662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
25672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
25682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
25692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
25702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
25712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
25722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
25732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
25752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return -1;
25762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25787373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const {
25797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds"
25807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                         "(lower = 0)", x);
25817373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
25827373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
25837373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' "
25841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                    "is out of bounds (upper = %f)", x, previewCrop.width);
25857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
25867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = x + previewCrop.left;
25877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
25887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth),
25897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "Calculated pixel array value X = '%d' is out of bounds (upper = %d)",
25907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        ret, fastInfo.arrayWidth);
25917373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
25927373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
25937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
25947373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const {
25957373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds "
25967373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "(lower = 0)", y);
25977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
25987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
25997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is "
26001f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                "out of bounds (upper = %f)", y, previewCrop.height);
26017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26027373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = y + previewCrop.top;
26037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight),
26057373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)",
26067373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        ret, fastInfo.arrayHeight);
26077373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
26097373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26127373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const {
26137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
26147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return (x + 1000) * (previewCrop.width - 1) / 2000;
26157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26177373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const {
26187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
26197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return (y + 1000) * (previewCrop.height - 1) / 2000;
26207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26227373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayXToCrop(int x) const {
26237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
26247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return x - previewCrop.left;
26257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26277373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::arrayYToCrop(int y) const {
26287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
26297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return y - previewCrop.top;
26307373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26317373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26327373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToNormalized(int x) const {
26337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
26347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return x * 2000 / (previewCrop.width - 1) - 1000;
26357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26377373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToNormalized(int y) const {
26387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    CropRegion previewCrop = calculateCropRegion(CropRegion::OUTPUT_PREVIEW);
26397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return y * 2000 / (previewCrop.height - 1) - 1000;
26407373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayXToNormalized(int width) const {
26437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = cropXToNormalized(arrayXToCrop(width));
26447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of "
26467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "lower bounds %d", ret);
26477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of "
26487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "upper bounds %d", ret);
26497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26507373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26517373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
26527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        return width * 2000 / (fastInfo.arrayWidth - 1) - 1000;
26537373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
26562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::arrayYToNormalized(int height) const {
26597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = cropYToNormalized(arrayYToCrop(height));
26607373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(ret >= -1000, "Calculated normalized value out of lower bounds"
26627373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        " %d", ret);
26637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(ret <= 1000, "Calculated normalized value out of upper bounds"
26647373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        " %d", ret);
26657373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26667373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26677373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
26687373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        return height * 2000 / (fastInfo.arrayHeight - 1) - 1000;
26697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26717373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
26722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedXToArray(int x) const {
26757373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26767373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
26787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
26797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26817373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return cropXToArray(normalizedXToCrop(x));
26822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::normalizedYToArray(int y) const {
26857373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26867373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
26877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
26887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26897373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26907373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return cropYToArray(normalizedYToCrop(y));
26912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26930cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun Hestatus_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
26943ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (info == NULL) {
26953ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("%s: Static metadata is not initialized", __FUNCTION__);
26963ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return NO_INIT;
26973ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
26983ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (sizes == NULL) {
26993ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("%s: Input size is null", __FUNCTION__);
27003ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return BAD_VALUE;
27013ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
2702cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    sizes->clear();
2703cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2704cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2705cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
2706cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < scs.size(); i++) {
2707cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            const StreamConfiguration &sc = scs[i];
2708cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
2709cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
2710cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sc.width <= limit.width && sc.height <= limit.height) {
2711cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                Size sz = {sc.width, sc.height};
2712cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                sizes->push(sz);
27133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He            }
2714cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2715cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    } else {
2716cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const size_t SIZE_COUNT = sizeof(Size) / sizeof(int);
2717cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        camera_metadata_ro_entry_t availableProcessedSizes =
2718cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, SIZE_COUNT);
2719cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (availableProcessedSizes.count < SIZE_COUNT) return BAD_VALUE;
2720cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2721cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Size filteredSize;
2722cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i = 0; i < availableProcessedSizes.count; i += SIZE_COUNT) {
2723cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            filteredSize.width = availableProcessedSizes.data.i32[i];
2724cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            filteredSize.height = availableProcessedSizes.data.i32[i+1];
2725cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                // Need skip the preview sizes that are too large.
2726cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                if (filteredSize.width <= limit.width &&
2727cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                        filteredSize.height <= limit.height) {
2728cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sizes->push(filteredSize);
2729cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                }
2730cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
27313ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
2732cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
27333ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (sizes->isEmpty()) {
27343ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("generated preview size list is empty!!");
27353ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return BAD_VALUE;
27363ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
27373ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    return OK;
27383ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He}
27393ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He
27409fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio(
27419fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        float ratio, const int32_t* sizeArray, size_t count) {
27429fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL");
27439fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number");
27449fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
27459fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    Size maxSize = {0, 0};
27469fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    for (size_t i = 0; i < count; i += 2) {
27479fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        if (sizeArray[i] > 0 && sizeArray[i+1] > 0) {
27489fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1];
27499fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) {
27509fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                maxSize.width = sizeArray[i];
27519fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                maxSize.height = sizeArray[i+1];
27529fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            }
27539fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        }
27549fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    }
27559fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
27569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    if (maxSize.width == 0 || maxSize.height == 0) {
27579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        maxSize.width = sizeArray[0];
27589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        maxSize.height = sizeArray[1];
27599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        ALOGW("Unable to find the size to match the given aspect ratio %f."
27609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                "Fall back to %d x %d", ratio, maxSize.width, maxSize.height);
27619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    }
27629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
27639fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    return maxSize;
27649fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He}
27659fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
2766cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() {
2767cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_CONFIGURATION_SIZE = 4;
2768cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_FORMAT_OFFSET = 0;
2769cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_WIDTH_OFFSET = 1;
2770cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_HEIGHT_OFFSET = 2;
2771cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_IS_INPUT_OFFSET = 3;
2772cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<StreamConfiguration> scs;
2773cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) {
2774cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        ALOGE("StreamConfiguration is only valid after device HAL 3.2!");
2775cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        return scs;
2776cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2777cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2778cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    camera_metadata_ro_entry_t availableStreamConfigs =
2779cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
2780cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    for (size_t i=0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
2781cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
2782cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
2783cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
2784cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
2785cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        StreamConfiguration sc = {format, width, height, isInput};
2786cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        scs.add(sc);
2787cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2788cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return scs;
2789cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
2790cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2791cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehSortedVector<int32_t> Parameters::getAvailableOutputFormats() {
2792cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    SortedVector<int32_t> outputFormats; // Non-duplicated output formats
2793cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2794cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
2795cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < scs.size(); i++) {
2796cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            const StreamConfiguration &sc = scs[i];
2797cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) {
2798cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                outputFormats.add(sc.format);
2799cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            }
2800cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2801cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    } else {
2802cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        camera_metadata_ro_entry_t availableFormats = staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
2803cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < availableFormats.count; i++) {
2804cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            outputFormats.add(availableFormats.data.i32[i]);
2805cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2806cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2807cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return outputFormats;
2808cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
2809cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2810cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::Size> Parameters::getAvailableJpegSizes() {
2811cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<Parameters::Size> jpegSizes;
2812cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2813cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
2814cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < scs.size(); i++) {
2815cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            const StreamConfiguration &sc = scs[i];
2816cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
2817cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sc.format == HAL_PIXEL_FORMAT_BLOB) {
2818cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                Size sz = {sc.width, sc.height};
2819cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                jpegSizes.add(sz);
2820cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            }
2821cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2822cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    } else {
2823cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const int JPEG_SIZE_ENTRY_COUNT = 2;
2824cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const int WIDTH_OFFSET = 0;
2825cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const int HEIGHT_OFFSET = 1;
2826cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        camera_metadata_ro_entry_t availableJpegSizes =
2827cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
2828cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < availableJpegSizes.count; i+= JPEG_SIZE_ENTRY_COUNT) {
2829cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            int width = availableJpegSizes.data.i32[i + WIDTH_OFFSET];
2830cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            int height = availableJpegSizes.data.i32[i + HEIGHT_OFFSET];
2831cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            Size sz = {width, height};
2832cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            jpegSizes.add(sz);
2833cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2834cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2835cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return jpegSizes;
2836cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
2837cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
28387373cbe85e617345f7002256a4be389fe62af913Igor MurashkinParameters::CropRegion Parameters::calculateCropRegion(
28397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                            Parameters::CropRegion::Outputs outputs) const {
2840018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2841018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2842018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2843018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // Need to convert zoom index into a crop rectangle. The rectangle is
2844018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // chosen to maximize its area on the sensor
2845018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2846018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    camera_metadata_ro_entry_t maxDigitalZoom =
2847d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
2848018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // For each zoom step by how many pixels more do we change the zoom
2849018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
2850018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            (NUM_ZOOM_STEPS-1);
2851018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w)
2852018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // via interpolating zoom step into a zoom ratio
2853018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomRatio = 1 + zoomIncrement * zoom;
2854018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]),
2855018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f",
2856018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        maxDigitalZoom.data.f[0], zoomRatio);
2857018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2858018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, "
2859018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          "previewHeight=%d, activeWidth=%d, activeHeight=%d",
2860018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth,
2861018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight);
2862018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2863018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    /*
2864018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * Assumption: On the HAL side each stream buffer calculates its crop
2865018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * rectangle as follows:
2866018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     *   cropRect = (zoomLeft, zoomRight,
2867018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     *               zoomWidth, zoomHeight * zoomWidth / outputWidth);
2868018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     *
2869018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * Note that if zoomWidth > bufferWidth, the new cropHeight > zoomHeight
2870018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     *      (we can then get into trouble if the cropHeight > arrayHeight).
2871018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * By selecting the zoomRatio based on the smallest outputRatio, we
2872018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * guarantee this will never happen.
2873018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     */
2874018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2875018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // Enumerate all possible output sizes, select the one with the smallest
2876018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // aspect ratio
2877018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float minOutputWidth, minOutputHeight, minOutputRatio;
2878018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    {
2879018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        float outputSizes[][2] = {
2880c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala            { static_cast<float>(previewWidth),
2881c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala              static_cast<float>(previewHeight) },
2882c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala            { static_cast<float>(videoWidth),
2883c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala              static_cast<float>(videoHeight) },
2884c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala            { static_cast<float>(jpegThumbSize[0]),
2885c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala              static_cast<float>(jpegThumbSize[1]) },
2886c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala            { static_cast<float>(pictureWidth),
2887c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala              static_cast<float>(pictureHeight) },
2888018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        };
2889018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2890018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        minOutputWidth = outputSizes[0][0];
2891018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        minOutputHeight = outputSizes[0][1];
2892018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        minOutputRatio = minOutputWidth / minOutputHeight;
2893018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        for (unsigned int i = 0;
2894018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin             i < sizeof(outputSizes) / sizeof(outputSizes[0]);
2895018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin             ++i) {
2896018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
28977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            // skip over outputs we don't want to consider for the crop region
28987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            if ( !((1 << i) & outputs) ) {
28997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                continue;
29007373cbe85e617345f7002256a4be389fe62af913Igor Murashkin            }
29017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
2902018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            float outputWidth = outputSizes[i][0];
2903018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            float outputHeight = outputSizes[i][1];
2904018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            float outputRatio = outputWidth / outputHeight;
2905018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2906018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            if (minOutputRatio > outputRatio) {
2907018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin                minOutputRatio = outputRatio;
2908018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin                minOutputWidth = outputWidth;
2909018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin                minOutputHeight = outputHeight;
2910018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            }
2911018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2912018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            // and then use this output ratio instead of preview output ratio
2913018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            ALOGV("Enumerating output ratio %f = %f / %f, min is %f",
2914018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin                  outputRatio, outputWidth, outputHeight, minOutputRatio);
2915018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        }
2916018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    }
2917018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2918018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    /* Ensure that the width/height never go out of bounds
2919018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * by scaling across a diffent dimension if an out-of-bounds
2920018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * possibility exists.
2921018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     *
2922018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by
2923018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * calculating the zoomWidth from zoomHeight we'll actually get a
2924018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     * zoomheight > arrayheight
2925018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin     */
2926018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight;
2927018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    if (minOutputRatio >= arrayRatio) {
2928018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        // Adjust the height based on the width
2929018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        zoomWidth =  fastInfo.arrayWidth / zoomRatio;
2930018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        zoomHeight = zoomWidth *
2931018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin                minOutputHeight / minOutputWidth;
2932018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2933018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    } else {
2934018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        // Adjust the width based on the height
2935018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        zoomHeight = fastInfo.arrayHeight / zoomRatio;
2936018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        zoomWidth = zoomHeight *
2937018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin                minOutputWidth / minOutputHeight;
2938018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    }
2939018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // centering the zoom area within the active area
2940018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2;
2941018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2;
2942018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2943018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d",
2944018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom);
2945018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2946018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2947018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight };
2948018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    return crop;
2949018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin}
2950018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
29511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov)
29521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        const {
29531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
29541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2);
29551f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
29561f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
29571f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float arrayAspect = static_cast<float>(fastInfo.arrayWidth) /
29581f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            fastInfo.arrayHeight;
29591f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float stillAspect = static_cast<float>(pictureWidth) / pictureHeight;
29601f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect);
29611f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
29621f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // The crop factors from the full sensor array to the still picture crop
29631f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // region
29641f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizCropFactor = 1.f;
29651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float vertCropFactor = 1.f;
29661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
29671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /**
29681f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Need to calculate the still image field of view based on the total pixel
29691f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * array field of view, and the relative aspect ratios of the pixel array
29701f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * and output streams.
29711f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     *
29721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Special treatment for quirky definition of crop region and relative
29731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * stream cropping.
29741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     */
29751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (quirks.meteringCropRegion) {
2976c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // Use max of preview and video as first crop
2977c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        float previewAspect = static_cast<float>(previewWidth) / previewHeight;
2978c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        float videoAspect = static_cast<float>(videoWidth) / videoHeight;
2979c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (videoAspect > previewAspect) {
2980c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            previewAspect = videoAspect;
2981c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        }
2982c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // First crop sensor to preview aspect ratio
2983c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (arrayAspect < previewAspect) {
2984c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            vertCropFactor = arrayAspect / previewAspect;
2985c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        } else {
2986c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            horizCropFactor = previewAspect / arrayAspect;
2987c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        }
2988c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // Second crop to still aspect ratio
2989c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (stillAspect < previewAspect) {
2990c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            horizCropFactor *= stillAspect / previewAspect;
2991c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        } else {
2992c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            vertCropFactor *= previewAspect / stillAspect;
29931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        }
29941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    } else {
29951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        /**
29961f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * Crop are just a function of just the still/array relative aspect
29971f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * ratios. Since each stream will maximize its area within the crop
29981f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * region, and for FOV we assume a full-sensor crop region, we only ever
29991f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * crop the FOV either vertically or horizontally, never both.
30001f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         */
30011f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        horizCropFactor = (arrayAspect > stillAspect) ?
30021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                (stillAspect / arrayAspect) : 1.f;
30031f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        vertCropFactor = (arrayAspect < stillAspect) ?
30041f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                (arrayAspect / stillAspect) : 1.f;
30051f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
30061f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Horiz crop factor: %f, vert crop fact: %f",
30071f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            horizCropFactor, vertCropFactor);
30081f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /**
30091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Basic field of view formula is:
30101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     *   angle of view = 2 * arctangent ( d / 2f )
30111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * where d is the physical sensor dimension of interest, and f is
30121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * the focal length. This only applies to rectilinear sensors, for focusing
30131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * at distances >> f, etc.
30141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     */
30151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (horizFov != NULL) {
30161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        *horizFov = 180 / M_PI * 2 *
30171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                atanf(horizCropFactor * sensorSize.data.f[0] /
30181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                        (2 * fastInfo.minFocalLength));
30191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
30201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (vertFov != NULL) {
30211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        *vertFov = 180 / M_PI * 2 *
30221f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                atanf(vertCropFactor * sensorSize.data.f[1] /
30231f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                        (2 * fastInfo.minFocalLength));
30241f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
30251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    return OK;
30261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala}
30271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
3028ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const {
3029af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    return max;
3030af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin}
3031af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
30322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2
30332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android
3034