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"
33d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala#include <android/hardware/ICamera.h>
340cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/MediaProfiles.h>
350cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He#include <media/mediarecorder.h>
362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace android {
382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalanamespace camera2 {
392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters(int cameraId,
412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int cameraFacing) :
422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraId(cameraId),
432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        cameraFacing(cameraFacing),
442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        info(NULL) {
452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::~Parameters() {
482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
50cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yehstatus_t Parameters::initialize(const CameraMetadata *info, int deviceVersion) {
512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (info->entryCount() == 0) {
542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: No static information provided!", __FUNCTION__);
552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters::info = info;
58cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    mDeviceVersion = deviceVersion;
592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = buildFastInfo();
612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) return res;
622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
63e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    res = buildQuirks();
64e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    if (res != OK) return res;
65e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
663ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    const Size MAX_PREVIEW_SIZE = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
670cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    // Treat the H.264 max size as the max supported video size.
680cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    MediaProfiles *videoEncoderProfiles = MediaProfiles::getInstance();
6944d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    Vector<video_encoder> encoders = videoEncoderProfiles->getVideoEncoders();
7044d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    int32_t maxVideoWidth = 0;
7144d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    int32_t maxVideoHeight = 0;
7244d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    for (size_t i = 0; i < encoders.size(); i++) {
7344d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        int width = videoEncoderProfiles->getVideoEncoderParamByName(
7444d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh                "enc.vid.width.max", encoders[i]);
7544d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        int height = videoEncoderProfiles->getVideoEncoderParamByName(
7644d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh                "enc.vid.height.max", encoders[i]);
7744d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        // Treat width/height separately here to handle the case where different
7844d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        // profile might report max size of different aspect ratio
7944d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        if (width > maxVideoWidth) {
8044d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh            maxVideoWidth = width;
8144d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        }
8244d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        if (height > maxVideoHeight) {
8344d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh            maxVideoHeight = height;
8444d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh        }
8544d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    }
8644d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    // This is just an upper bound and may not be an actually valid video size
8744d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    const Size VIDEO_SIZE_UPPER_BOUND = {maxVideoWidth, maxVideoHeight};
880cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He
890cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    res = getFilteredSizes(MAX_PREVIEW_SIZE, &availablePreviewSizes);
900cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He    if (res != OK) return res;
9144d842a762e463f0a29e95036e97fef2def4b8eaYin-Chia Yeh    res = getFilteredSizes(VIDEO_SIZE_UPPER_BOUND, &availableVideoSizes);
923ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (res != OK) return res;
932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
94a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    // Select initial preview and video size that's under the initial bound and
95a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    // on the list of both preview and recording sizes
96a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    previewWidth = 0;
97a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    previewHeight = 0;
98a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    for (size_t i = 0 ; i < availablePreviewSizes.size(); i++) {
99a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        int newWidth = availablePreviewSizes[i].width;
100a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        int newHeight = availablePreviewSizes[i].height;
101a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        if (newWidth >= previewWidth && newHeight >= previewHeight &&
102a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                newWidth <= MAX_INITIAL_PREVIEW_WIDTH &&
103a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                newHeight <= MAX_INITIAL_PREVIEW_HEIGHT) {
104a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala            for (size_t j = 0; j < availableVideoSizes.size(); j++) {
105a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                if (availableVideoSizes[j].width == newWidth &&
106a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                        availableVideoSizes[j].height == newHeight) {
107a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                    previewWidth = newWidth;
108a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                    previewHeight = newHeight;
109a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala                }
110a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala            }
111a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        }
112a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    }
113a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    if (previewWidth == 0) {
114a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        ALOGE("%s: No initial preview size can be found!", __FUNCTION__);
115a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala        return BAD_VALUE;
116a4c95a6bc3b801bf41ca841440e9124f947e53feEino-Ville Talvala    }
1172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoWidth = previewWidth;
1182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    videoHeight = previewHeight;
1192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPreviewSize(previewWidth, previewHeight);
1212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setVideoSize(videoWidth, videoHeight);
1222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
1232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            String8::format("%dx%d",
1242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight));
1252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewSizes;
1273ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        for (size_t i = 0; i < availablePreviewSizes.size(); i++) {
1282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
1292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
1303ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                    availablePreviewSizes[i].width,
1313ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                    availablePreviewSizes[i].height);
1322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1333ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGV("Supported preview sizes are: %s", supportedPreviewSizes.string());
1342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewSizes);
1360cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He
1370cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        String8 supportedVideoSizes;
1380cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        for (size_t i = 0; i < availableVideoSizes.size(); i++) {
1390cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He            if (i != 0) supportedVideoSizes += ",";
1400cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He            supportedVideoSizes += String8::format("%dx%d",
1410cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                    availableVideoSizes[i].width,
1420cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                    availableVideoSizes[i].height);
1430cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        }
1440cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He        ALOGV("Supported video sizes are: %s", supportedVideoSizes.string());
1452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1460cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun He                supportedVideoSizes);
1472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
1502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
1512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
1522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
1542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
1552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatEnumToString(previewFormat)); // NV21
1562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewTransform = degToTransform(0,
1582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            cameraFacing == CAMERA_FACING_FRONT);
1592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
1612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFormats;
162cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        SortedVector<int32_t> outputFormats = getAvailableOutputFormats();
1632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
164cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < outputFormats.size(); i++) {
1652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
167cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            switch (outputFormats[i]) {
1682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
1892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats +=
1902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
1912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1924a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_420_888:
1934a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                // Flexible YUV allows both YV12 and NV21
1944a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                supportedPreviewFormats +=
1954a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1964a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                supportedPreviewFormats += ",";
1974a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                supportedPreviewFormats +=
1984a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1994a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                break;
200a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala            // Not advertizing JPEG, RAW16, etc, for preview formats
2014a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            case HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED:
202a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW16:
2032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
2042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
2052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
2082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
209cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                        __FUNCTION__, cameraId, outputFormats[i]);
2102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
2112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
2122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
2132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
2152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFormats);
2162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
218652f7d7ebd9a8cec067588c2a232e49710d5cd83Yin-Chia Yeh    previewFpsRange[0] = fastInfo.bestStillCaptureFpsRange[0];
219652f7d7ebd9a8cec067588c2a232e49710d5cd83Yin-Chia Yeh    previewFpsRange[1] = fastInfo.bestStillCaptureFpsRange[1];
2200b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
2222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // still have to do something sane for them
2232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
224d0cec0cb574a3d629afb7c32883bc986d7a65535Eino-Ville Talvala    // NOTE: Not scaled like FPS range values are.
225d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala    int previewFps = fpsFromRange(previewFpsRange[0], previewFpsRange[1]);
2262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
227af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            previewFps);
2282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // PREVIEW_FPS_RANGE
2300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // -- Order matters. Set range after single value to so that a roundtrip
2310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //    of setParameters(getParameters()) would keep the FPS range in higher
2320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    //    order.
2330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
2340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            String8::format("%d,%d",
2350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    previewFpsRange[0] * kFpsToApiScale,
2360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    previewFpsRange[1] * kFpsToApiScale));
2370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    {
2390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        String8 supportedPreviewFpsRange;
2400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
2410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            if (i != 0) supportedPreviewFpsRange += ",";
2420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            supportedPreviewFpsRange += String8::format("(%d,%d)",
2430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    availableFpsRanges.data.i32[i] * kFpsToApiScale,
2440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    availableFpsRanges.data.i32[i+1] * kFpsToApiScale);
2450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
2460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                supportedPreviewFpsRange);
2480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
2490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
251af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin        SortedVector<int32_t> sortedPreviewFrameRates;
252af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
2532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFrameRates;
2542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // from the [min, max] fps range use the max value
256af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            int fps = fpsFromRange(availableFpsRanges.data.i32[i],
257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                                   availableFpsRanges.data.i32[i+1]);
258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
259af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // de-dupe frame rates
260af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) {
261af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                sortedPreviewFrameRates.add(fps);
262af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
263af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            else {
264af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                continue;
265af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
266af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
267af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (sortedPreviewFrameRates.size() > 1) {
268af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                supportedPreviewFrameRates += ",";
269af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
270af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
2712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
272af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    fps);
273af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
274af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            ALOGV("%s: Supported preview frame rates: %s",
275af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    __FUNCTION__, supportedPreviewFrameRates.string());
2762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFrameRates);
2792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
281cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<Size> availableJpegSizes = getAvailableJpegSizes();
282cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (!availableJpegSizes.size()) return NO_INIT;
2832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick maximum
285cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    pictureWidth = availableJpegSizes[0].width;
286cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    pictureHeight = availableJpegSizes[0].height;
2873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
2883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
2893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = false;
2902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureSize(pictureWidth,
2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            pictureHeight);
2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
2952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPictureSizes;
296cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < availableJpegSizes.size(); i++) {
2972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
2982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
299cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    availableJpegSizes[i].width,
300cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    availableJpegSizes[i].height);
3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPictureSizes);
3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
3082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
3092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
311f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3149fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    // Pick the largest thumbnail size that matches still image aspect ratio.
3159fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0,
3169fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            "Invalid picture size, %d x %d", pictureWidth, pictureHeight);
3179fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight;
3189fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    Size thumbnailSize =
3199fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            getMaxSizeForRatio(
3209fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    picAspectRatio,
3219fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    &availableJpegThumbnailSizes.data.i32[0],
3229fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    availableJpegThumbnailSizes.count);
3239fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    jpegThumbSize[0] = thumbnailSize.width;
3249fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    jpegThumbSize[1] = thumbnailSize.height;
3252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
3272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[0]);
3282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
3292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[1]);
3302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedJpegThumbSizes;
3332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedJpegThumbSizes);
3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbQuality = 90;
3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbQuality);
3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegQuality = 90;
3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegQuality);
3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegRotation = 0;
3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegRotation);
3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsEnabled = false;
354a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[0] = 0.0;
355a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[1] = 0.0;
356a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[2] = 0.0;
357a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsTimestamp = 0;
3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsProcessingMethod = "unknown";
3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
361d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    wbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
3632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
3642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
366211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
367211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableWhiteBalanceModes.count) {
368211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
369211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::WHITE_BALANCE_AUTO);
370211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedWhiteBalance;
3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
3752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
377d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_AUTO:
3782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
381d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
385d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
3862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
389d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
3902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
393d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
3942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
397d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
3982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
401d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
4022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
405d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_SHADE:
4062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Skipping values not mappable to v1 API
410d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_OFF:
4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
4142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance);
4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
425d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
430211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false);
431211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableEffects.count) {
432211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS,
433211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::EFFECT_NONE);
434211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedEffects;
4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedEffects += ",";
4392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
441d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_OFF:
4422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NONE;
4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
445d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_MONO:
4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_MONO;
4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
449d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE:
4502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
453d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE:
4542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
457d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SEPIA:
4582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
461d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE:
4622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
465d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD:
4662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
469d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD:
4702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
473d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_AQUA:
4742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableEffects.data.u8[i]);
4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
487d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
492211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false);
493211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableAntibandingModes.count) {
494211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
495211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::ANTIBANDING_OFF);
496211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedAntibanding;
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
5012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
503d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF:
5042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
507d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ:
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
511d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ:
5122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
515d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO:
5162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
5202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedAntibanding);
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
531c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk    sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
536211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
537211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableSceneModes.count) {
538211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.remove(CameraParameters::KEY_SCENE_MODE);
539211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
5402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool noSceneModes = false;
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
5452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
547c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                case ANDROID_CONTROL_SCENE_MODE_DISABLED:
5482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    noSceneModes = true;
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    // Not in old API
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
614af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_HDR:
615af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                    supportedSceneModes +=
616af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                        CameraParameters::SCENE_MODE_HDR;
617af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                    break;
6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableSceneModes.data.u8[i]);
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
6232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!noSceneModes) {
6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes);
629cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin        } else {
630cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin            params.remove(CameraParameters::KEY_SCENE_MODE);
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
634211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    bool isFlashAvailable = false;
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
636211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false);
637211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (flashAvailable.count) {
638211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        isFlashAvailable = flashAvailable.data.u8[0];
639211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    }
6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
642211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false);
6432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
644248f9ce1b6052889dd55e7701f908477d16d6ff4Eino-Ville Talvala    flashMode = Parameters::FLASH_MODE_OFF;
645211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (isFlashAvailable) {
6462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
6476f854608d26d7abcce5e46396c7260ed7b250653Alex Ray                CameraParameters::FLASH_MODE_OFF);
6482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
6512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
6532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
6542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
656d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes);
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
665b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // No flash means null flash mode and supported flash modes keys, so
666b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // remove them just to be safe
667b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        params.remove(CameraParameters::KEY_FLASH_MODE);
668b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
672211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false);
6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
675211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false);
6762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
677211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) {
6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // Fixed-focus lens
6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_FIXED;
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_AUTO;
6862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
68880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        String8 supportedFocusModes;
68980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        bool addComma = false;
69080ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        camera_metadata_ro_entry_t focusDistanceCalibration =
69180ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false);
69280ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh
69380ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        if (focusDistanceCalibration.count &&
69480ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh                focusDistanceCalibration.data.u8[0] !=
69580ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh                ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) {
69680ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY;
69780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            addComma = true;
69880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        }
6992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
7012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
7022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
7032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
704d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
7052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
7072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
708d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
712d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
7132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
716d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
7172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
720d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
7212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                // Not supported in old API
725d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
7292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
7342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFocusModes);
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
738d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
73995069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala    shadowFocusMode = FOCUS_MODE_INVALID;
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
741ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS,
742ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION);
743ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT;
7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    int32_t maxNumFocusAreas = 0;
7467d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    if (focusMode != Parameters::FOCUS_MODE_FIXED) {
747ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF];
7487d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    }
7497d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas);
7502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
7512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
7522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.clear();
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.add(Parameters::Area(0,0,0,0,0));
7542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
756211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false);
7572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
7582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7621f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizFov, vertFov;
7631f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
7641f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (res != OK) {
7651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        ALOGE("%s: Can't calculate field of views!", __FUNCTION__);
7661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        return res;
7671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
7682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
7702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
7712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    exposureCompensation = 0;
7732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                exposureCompensation);
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
777d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2);
7782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
7792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
7812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
786d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1);
7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
7912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoExposureLock = false;
7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoWhiteBalanceLock = false;
8002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
807ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            max3aRegions.data.i32[Parameters::REGION_AE]);
8082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
8092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
8102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoom = 0;
8122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, zoom);
8132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
8142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
816d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1);
8172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
8182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
8202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 zoomRatios;
8212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoom = 1.f;
8222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (NUM_ZOOM_STEPS-1);
8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
8252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
8262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) zoomRatios += ",";
8272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
8282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
8292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            zoom += zoomIncrement;
8302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
8322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
8352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
8362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
83782edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin            CameraParameters::FALSE);
8382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "Infinity,Infinity,Infinity");
8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
8432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fastInfo.maxFaces);
8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            0);
8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
8482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
850a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    recordingHint = false;
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
8532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
8552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
8562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
857a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    videoStabilization = false;
8582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
8592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
8602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
862211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
863211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
8642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
8662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
8672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::TRUE);
8682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
8692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FALSE);
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
8722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
8748cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    videoFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
8752cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala    videoDataSpace = HAL_DATASPACE_V0_BT709;
876d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    videoBufferMode = hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV;
8772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    playShutterSound = true;
8782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFaceDetect = false;
8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFocusMoveMessages = false;
881da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    afTriggerCounter = 1;
8822b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    afStateCounter = 0;
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    currentAfTriggerId = -1;
884a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    afInMotion = false;
8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
886da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    precaptureTriggerCounter = 1;
887da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
8882b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    takePictureCounter = 0;
8892b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewCallbackFlags = 0;
891a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    previewCallbackOneShot = false;
8923ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    previewCallbackSurface = false;
8932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
894355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    Size maxJpegSize = getMaxSize(getAvailableJpegSizes());
895355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(maxJpegSize);
896355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
897355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    slowJpegMode = false;
898355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (minFrameDurationNs > kSlowJpegModeThreshold) {
899355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        slowJpegMode = true;
900355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // Slow jpeg devices does not support video snapshot without
901355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // slowing down preview.
902355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // TODO: support video size video snapshot only?
903355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
904355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            CameraParameters::FALSE);
905355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
906355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
907afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He    char value[PROPERTY_VALUE_MAX];
908afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He    property_get("camera.disable_zsl_mode", value, "0");
909355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (!strcmp(value,"1") || slowJpegMode) {
910afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He        ALOGI("Camera %d: Disabling ZSL mode", cameraId);
911b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala        zslMode = false;
9122f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala    } else {
913afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He        zslMode = true;
914b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala    }
915e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
916355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    ALOGI("%s: zslMode: %d slowJpegMode %d", __FUNCTION__, zslMode, slowJpegMode);
917355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
9182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    state = STOPPED;
9192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    paramsFlattened = params.flatten();
9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
9232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
9242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const {
9268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return paramsFlattened;
9278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
9288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
9292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() {
9302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
93203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4);
9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
93403e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    int32_t arrayWidth;
93503e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    int32_t arrayHeight;
93603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    if (activeArraySize.count == 2) {
937e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray        ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!",
938e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray                __FUNCTION__, cameraId);
93903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayWidth = activeArraySize.data.i32[0];
94003e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayHeight = activeArraySize.data.i32[1];
94103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    } else if (activeArraySize.count == 4) {
94203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayWidth = activeArraySize.data.i32[2];
94303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayHeight = activeArraySize.data.i32[3];
94403e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    } else return NO_INIT;
9452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9460181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    // We'll set the target FPS range for still captures to be as wide
9470181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    // as possible to give the HAL maximum latitude for exposure selection
9480181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
9490181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
9500181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) {
9510181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        return NO_INIT;
9520181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
9530181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
9540181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    int32_t bestStillCaptureFpsRange[2] = {
9550181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        availableFpsRanges.data.i32[0], availableFpsRanges.data.i32[1]
9560181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    };
9570181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    int32_t curRange =
9580181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0];
9590181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    for (size_t i = 2; i < availableFpsRanges.count; i += 2) {
9600181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        int32_t nextRange =
9610181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                availableFpsRanges.data.i32[i + 1] -
9620181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                availableFpsRanges.data.i32[i];
9630181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        if ( (nextRange > curRange) ||       // Maximize size of FPS range first
9640181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                (nextRange == curRange &&    // Then minimize low-end FPS
9650181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                 bestStillCaptureFpsRange[0] > availableFpsRanges.data.i32[i])) {
9660181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
9670181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[0] = availableFpsRanges.data.i32[i];
9680181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[1] = availableFpsRanges.data.i32[i + 1];
9690181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            curRange = nextRange;
9700181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        }
9710181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
9720181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
9732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
974211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0,
975211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
9762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    uint8_t bestFaceDetectMode =
978d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
9792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
9802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
981d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF:
9822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
983d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE:
9842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (bestFaceDetectMode !=
985d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    bestFaceDetectMode =
987d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE;
9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
990d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL:
9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                bestFaceDetectMode =
992d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    ANDROID_STATISTICS_FACE_DETECT_MODE_FULL;
9932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
9942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
9952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return NO_INIT;
9992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1002211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    int32_t maxFaces = 0;
10032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
1004211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false);
1005211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (maxFacesDetected.count) {
1006211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        maxFaces = maxFacesDetected.data.i32[0];
1007211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    }
10082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
1010211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
10118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t sceneModeOverrides =
1012211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false);
10138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
1014211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false);
1015211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    bool fixedLens = minFocusDistance.count == 0 ||
1016211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        minFocusDistance.data.f[0] == 0;
10178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
1018176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala    camera_metadata_ro_entry_t focusDistanceCalibration =
1019176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0,
1020176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    false);
1021176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala    bool canFocusInfinity = (focusDistanceCalibration.count &&
1022176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            focusDistanceCalibration.data.u8[0] !=
1023176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED);
1024176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala
10251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
10261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS);
10271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
10281f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
1029cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
1030cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (!availableFormats.size()) return NO_INIT;
10314a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
10324a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
10338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeOverrides.count > 0) {
10348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // sceneModeOverrides is defined to have 3 entries for each scene mode,
10358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // which are AE, AWB, and AF override modes the HAL wants for that scene
10368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // mode.
10378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        const size_t kModesPerSceneMode = 3;
10388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        if (sceneModeOverrides.count !=
10398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                availableSceneModes.count * kModesPerSceneMode) {
10408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Camera %d: Scene mode override list is an "
1041e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                    "unexpected size: %zu (expected %zu)", __FUNCTION__,
10428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    cameraId, sceneModeOverrides.count,
104319fdbfcf8af3ca689c3c62b88059ac5d3c6907d1Hubert Rzezniczak                    availableSceneModes.count * kModesPerSceneMode);
10448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return NO_INIT;
10458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
10468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        for (size_t i = 0; i < availableSceneModes.count; i++) {
10478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            DeviceInfo::OverrideModes modes;
10488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            uint8_t aeMode =
10498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0];
10508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            switch(aeMode) {
1051d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON:
10528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_OFF;
10538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1054d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
10558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_AUTO;
10568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1057d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
10588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_ON;
10598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1060d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
10618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_RED_EYE;
10628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                default:
10648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__,
10658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            aeMode);
10668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_INVALID;
10678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            }
10698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            modes.wbMode =
10708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1];
10718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            uint8_t afMode =
10728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2];
10738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            switch(afMode) {
1074d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
1075176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    if (!fixedLens && !canFocusInfinity) {
1076176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                        ALOGE("%s: Camera %d: Scene mode override lists asks for"
1077176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                " fixed focus on a device with focuser but not"
1078176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                " calibrated for infinity focus", __FUNCTION__,
1079176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                cameraId);
1080176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                        return NO_INIT;
1081176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    }
10828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = fixedLens ?
10838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY;
10848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1085d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
1086d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
1087d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
1088d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
1089d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
10908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = static_cast<focusMode_t>(afMode);
10918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                default:
10938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__,
10948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            afMode);
10958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = FOCUS_MODE_INVALID;
10968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
10978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            }
10988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i],
10998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes);
11008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
11018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
11028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
11032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayWidth = arrayWidth;
11042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayHeight = arrayHeight;
11050181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0];
11060181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1];
11072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.bestFaceDetectMode = bestFaceDetectMode;
11082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.maxFaces = maxFaces;
11091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
11101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // Find smallest (widest-angle) focal length to use as basis of still
11111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // picture FOV reporting.
11121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    fastInfo.minFocalLength = availableFocalLengths.data.f[0];
11131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    for (size_t i = 1; i < availableFocalLengths.count; i++) {
11141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) {
11151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            fastInfo.minFocalLength = availableFocalLengths.data.f[i];
11161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        }
11171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
11181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
11194a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888
11204a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    fastInfo.useFlexibleYuv = false;
1121cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    for (size_t i = 0; i < availableFormats.size(); i++) {
1122cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) {
11234a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            fastInfo.useFlexibleYuv = true;
11244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            break;
11254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        }
11264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    }
11274a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    ALOGV("Camera %d: Flexible YUV %s supported",
11284a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            cameraId, fastInfo.useFlexibleYuv ? "is" : "is not");
11294a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
11302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
11312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
11322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1133e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() {
1134e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
1135e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO);
1136e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1);
1137e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled",
1138e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            cameraId);
1139e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
1140e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT);
1141e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1);
1142e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled",
1143e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            cameraId);
1144e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
11457373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION);
11467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1);
11477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion"
11487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                " enabled", cameraId);
11497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
1150fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT);
1151fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1);
1152fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult"
1153fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                " enabled", cameraId);
1154fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1155e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    return OK;
1156e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala}
1157e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
11582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
1159d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin        size_t minCount, size_t maxCount, bool required) const {
11602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t entry = info->find(tag);
11612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1162d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin    if (CC_UNLIKELY( entry.count == 0 ) && required) {
11632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
11642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
11652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
11662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
11672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
11692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag);
11702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (CC_UNLIKELY(
11712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
11722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
11732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
11742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
11752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
11762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
11772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1178e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                "Expected between %zu and %zu values, but got %zu values",
11792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
11802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
11812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return entry;
11832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
11842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) {
11862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
11872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    CameraParameters2 newParams(paramString);
11892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only parameters
11912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // such as supported preview sizes, etc. Should probably produce an error if
11922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // they're changed.
11932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Extract and verify new parameters */
11952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t i;
11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
11982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters validatedParams(*this);
11992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_SIZE
12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewSize(&validatedParams.previewWidth,
12022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewHeight);
12032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewWidth != previewWidth ||
12052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewHeight != previewHeight) {
12062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
12072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
12082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
12092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
12102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight,
12112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth, validatedParams.previewHeight);
12122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        for (i = 0; i < availablePreviewSizes.size(); i++) {
12153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He            if ((availablePreviewSizes[i].width ==
12162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth) &&
12173ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                (availablePreviewSizes[i].height ==
12182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight)) break;
12192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12203ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        if (i == availablePreviewSizes.size()) {
12212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
12222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.previewWidth,
12232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight);
12242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
12252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
12262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
12272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1228af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    // RECORDING_HINT (always supported)
1229af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    validatedParams.recordingHint = boolFromString(
1230af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
12310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    IF_ALOGV() { // Avoid unused variable warning
12320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        bool recordingHintChanged =
12330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.recordingHint != recordingHint;
12340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        if (recordingHintChanged) {
12350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: Recording hint changed to %d",
12360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__, validatedParams.recordingHint);
12370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
12380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
1239af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
12402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FPS_RANGE
1241d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
12420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
12430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Use the single FPS value if it was set later than the range.
12440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Otherwise, use the range value.
12450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
12460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    bool fpsUseSingleValue;
12470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    {
12480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        const char *fpsRange, *fpsSingle;
12490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE);
12510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
12520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        /**
12540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         * Pick either the range or the single key if only one was set.
12550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         *
12560b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         * If both are set, pick the one that has greater set order.
12570b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         */
12580b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        if (fpsRange == NULL && fpsSingle == NULL) {
12590b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGE("%s: FPS was not set. One of %s or %s must be set.",
12600b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE,
12610b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  CameraParameters::KEY_PREVIEW_FPS_RANGE);
12620b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return BAD_VALUE;
12630b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else if (fpsRange == NULL) {
12640b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = true;
12650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: FPS range not set, using FPS single value",
12660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__);
12670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else if (fpsSingle == NULL) {
12680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = false;
12690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: FPS single not set, using FPS range value",
12700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__);
12710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else {
12720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            int fpsKeyOrder;
12730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            res = newParams.compareSetOrder(
12740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    CameraParameters::KEY_PREVIEW_FRAME_RATE,
12750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    CameraParameters::KEY_PREVIEW_FPS_RANGE,
12760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    &fpsKeyOrder);
12770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys");
12780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = (fpsKeyOrder > 0);
12800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
12810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1282d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
12830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS value is used from '%s'",
12840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin              __FUNCTION__, fpsUseSingleValue ? "single" : "range");
12850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
12872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewFpsRange[1]);
12880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1289c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala    validatedParams.previewFpsRange[0] /= kFpsToApiScale;
1290c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala    validatedParams.previewFpsRange[1] /= kFpsToApiScale;
1291c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala
12920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Ignore the FPS range if the FPS single has higher precedence
12930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (!fpsUseSingleValue) {
12940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__,
12950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0],
12960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1]);
1297d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[0]) &&
13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
13042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]) ) {
13052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
13072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.previewFpsRange[0],
13112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]);
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FORMAT
13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.previewFormat =
13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatStringToEnum(newParams.getPreviewFormat());
13192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFormat != previewFormat) {
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
13222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active!", __FUNCTION__);
13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1325cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
13264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        // If using flexible YUV, always support NV21/YV12. Otherwise, check
13274a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        // HAL's list.
13284a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        if (! (fastInfo.useFlexibleYuv &&
13294a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                (validatedParams.previewFormat ==
13304a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        HAL_PIXEL_FORMAT_YCrCb_420_SP ||
13314a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                 validatedParams.previewFormat ==
13324a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        HAL_PIXEL_FORMAT_YV12) ) ) {
13334a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            // Not using flexible YUV format, so check explicitly
1334cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            for (i = 0; i < availableFormats.size(); i++) {
1335cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                if (availableFormats[i] == validatedParams.previewFormat) break;
13364a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            }
1337cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (i == availableFormats.size()) {
13384a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                ALOGE("%s: Requested preview format %s (0x%x) is not supported",
13394a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        __FUNCTION__, newParams.getPreviewFormat(),
13404a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        validatedParams.previewFormat);
13414a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                return BAD_VALUE;
13424a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            }
13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // PREVIEW_FRAME_RATE Deprecated
13470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // - Use only if the single FPS value was set later than the FPS range
13480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (fpsUseSingleValue) {
1349d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala        int previewFps = newParams.getPreviewFrameRate();
13500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS single value requested: %d",
13510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin              __FUNCTION__, previewFps);
13520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        {
13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
13542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
1355af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            /**
1356af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * If recording hint is set, find the range that encompasses
1357af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * previewFps with the largest min index.
1358af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              *
1359af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * If recording hint is not set, find the range with previewFps
1360af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * with the smallest min index.
1361af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              *
1362af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * Either way, in case of multiple ranges, break the tie by
1363af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * selecting the smaller range.
1364af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              */
1365d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
1366d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala            // all ranges which have previewFps
1367af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            Vector<Range> candidateRanges;
13682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
1369af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                Range r = {
1370af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                            availableFrameRates.data.i32[i],
1371af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                            availableFrameRates.data.i32[i+1]
1372af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                };
1373af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1374d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala                if (r.min <= previewFps && previewFps <= r.max) {
1375af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    candidateRanges.push(r);
1376af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
13772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1378af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (candidateRanges.isEmpty()) {
13792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
1380d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala                        __FUNCTION__, previewFps);
13812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
13822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1383af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // most applicable range with targetFps
1384af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            Range bestRange = candidateRanges[0];
1385af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            for (i = 1; i < candidateRanges.size(); ++i) {
1386af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                Range r = candidateRanges[i];
1387af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1388af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                // Find by largest minIndex in recording mode
1389af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                if (validatedParams.recordingHint) {
1390af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    if (r.min > bestRange.min) {
1391af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1392af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1393af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
1394af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1395af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1396af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
1397af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                // Find by smallest minIndex in preview mode
1398af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                else {
1399af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    if (r.min < bestRange.min) {
1400af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1401af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1402af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
1403af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1404af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1405af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
1406af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
1407af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
14082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[0] =
1409af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    bestRange.min;
14102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] =
1411af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    bestRange.max;
1412af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1413af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d",
1414af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                __FUNCTION__,
1415af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.previewFpsRange[0],
1416af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.previewFpsRange[1],
1417af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.recordingHint);
14182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14210b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
14220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Update Preview FPS and Preview FPS ranges based on
14230b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * what we actually set.
14240b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
14250b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * This updates the API-visible (Camera.Parameters#getParameters) values of
14260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * the FPS fields, not only the internal versions.
14270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
14280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Order matters: The value that was set last takes precedence.
14290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * - If the client does a setParameters(getParameters()) we retain
14300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *   the same order for preview FPS.
14310b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
14320b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (!fpsUseSingleValue) {
14330b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set fps single, then fps range (range wins)
14340b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFrameRate(
14350b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                fpsFromRange(/*min*/validatedParams.previewFpsRange[0],
14360b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                             /*max*/validatedParams.previewFpsRange[1]));
14370b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFpsRange(
14380b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0] * kFpsToApiScale,
14390b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1] * kFpsToApiScale);
14400b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    } else {
14410b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set fps range, then fps single (single wins)
14420b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFpsRange(
14430b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0] * kFpsToApiScale,
14440b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1] * kFpsToApiScale);
14450b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set this to the same value, but with higher priority
14460b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFrameRate(
14470b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                newParams.getPreviewFrameRate());
14480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
14490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PICTURE_SIZE
14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPictureSize(&validatedParams.pictureWidth,
14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.pictureHeight);
14533ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (validatedParams.pictureWidth != pictureWidth ||
14543ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh            validatedParams.pictureHeight != pictureHeight) {
1455cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<Size> availablePictureSizes = getAvailableJpegSizes();
1456cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (i = 0; i < availablePictureSizes.size(); i++) {
1457cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if ((availablePictureSizes[i].width ==
14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureWidth) &&
1459cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                (availablePictureSizes[i].height ==
14602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight)) break;
14612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1462cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (i == availablePictureSizes.size()) {
14632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
14642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.pictureWidth,
14652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight);
14662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
14712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[0] =
14722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
14732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[1] =
14742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
14752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
14762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
14782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
14802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableJpegThumbSizes.data.i32[i] ==
14812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[0]) &&
14822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableJpegThumbSizes.data.i32[i+1] ==
14832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1])) break;
14842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
14862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.jpegThumbSize[0],
14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1]);
14892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
1494c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
1495c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    // also makes sure quality fits in uint8_t
1496c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    if (quality < 0 || quality > 100) {
14972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
1498c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala                __FUNCTION__, quality);
14992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1501c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    validatedParams.jpegThumbQuality = quality;
15022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_QUALITY
1504c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
1505c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    // also makes sure quality fits in uint8_t
1506c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    if (quality < 0 || quality > 100) {
15072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
1508c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala                __FUNCTION__, quality);
15092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1511c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    validatedParams.jpegQuality = quality;
15122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ROTATION
15142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegRotation =
15152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
15162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegRotation != 0 &&
15172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 90 &&
15182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 180 &&
15192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 270) {
15202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
15212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegRotation);
15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
15232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS
15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *gpsLatStr =
15282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
15292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (gpsLatStr != NULL) {
15302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsLongStr =
15312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
15322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsAltitudeStr =
15332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
15342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsTimeStr =
15352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
15362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsProcMethodStr =
15372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
15382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (gpsLongStr == NULL ||
15392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsAltitudeStr == NULL ||
15402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsTimeStr == NULL ||
15412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsProcMethodStr == NULL) {
15422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
15432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
15442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *endPtr;
15472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
15492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
15502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
15512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
15562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
15612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
15622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
15632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    gpsAltitudeStr);
15642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
15682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
15692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
15702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsProcessingMethod = gpsProcMethodStr;
15732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = true;
15752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
15762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = false;
15772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EFFECT
15802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.effectMode = effectModeStringToEnum(
15812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
15822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.effectMode != effectMode) {
15832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
15842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
15852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
15862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
15872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableEffectModes.count) {
15892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
15902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
15912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
15922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
15932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ANTIBANDING
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.antibandingMode = abModeStringToEnum(
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.antibandingMode != antibandingMode) {
16002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
16012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
16022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
16032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
16042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableAbModes.count) {
16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
16092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // SCENE_MODE
16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.sceneMode = sceneModeStringToEnum(
16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.sceneMode != sceneMode &&
16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.sceneMode !=
1619c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED) {
16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableSceneModes.count) {
16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    bool sceneModeSet =
1634c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED;
16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FLASH_MODE
16378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
16388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode =
16398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
16408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).flashMode;
16418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
16428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode = FLASH_MODE_INVALID;
16438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.flashMode == FLASH_MODE_INVALID) {
16458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode = flashModeStringToEnum(
16468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            newParams.get(CameraParameters::KEY_FLASH_MODE) );
16478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.flashMode != flashMode) {
16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
1651d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1);
1652b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        bool isFlashAvailable =
1653b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala                flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE;
1654b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        if (!isFlashAvailable &&
16552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
16572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
16582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
16592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (validatedParams.flashMode == availableAeModes.data.u8[i])
16652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
16662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
16672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableAeModes.count) {
16682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
16692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
16702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == -1) {
16742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
16752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
16762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
16772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1679b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // Update in case of override, but only if flash is supported
1680b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        if (isFlashAvailable) {
1681b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala            newParams.set(CameraParameters::KEY_FLASH_MODE,
1682b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala                    flashModeEnumToString(validatedParams.flashMode));
1683b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        }
16848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
16868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    // WHITE_BALANCE
16878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
16888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.wbMode =
16898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
16908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).wbMode;
16918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
1692d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF;
16938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
1694d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
16958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.wbMode = wbModeStringToEnum(
16968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
16978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
16988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.wbMode != wbMode) {
16998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
1700211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
17018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
17028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
17038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
17048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        if (i == availableWbModes.count) {
17058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
17068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__,
17078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
17088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return BAD_VALUE;
17098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
17108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // Update in case of override
17118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        newParams.set(CameraParameters::KEY_WHITE_BALANCE,
17128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                wbModeEnumToString(validatedParams.wbMode));
17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_MODE
17168a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
17178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode =
17188a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
17198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).focusMode;
17208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
17218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode = FOCUS_MODE_INVALID;
17228a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
17238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.focusMode == FOCUS_MODE_INVALID) {
17248a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode = focusModeStringToEnum(
17258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                newParams.get(CameraParameters::KEY_FOCUS_MODE) );
17268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
17272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.focusMode != focusMode) {
17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = -1;
17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
1731211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0,
1732211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                        false);
1733211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray            if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) {
17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
17352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        "fixed focus lens",
17362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
17372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
17392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            } else if (validatedParams.focusMode !=
17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::FOCUS_MODE_INFINITY) {
17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (validatedParams.focusMode ==
17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableFocusModes.data.u8[i]) break;
17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (i == availableFocusModes.count) {
17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            __FUNCTION__,
17502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
17512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return BAD_VALUE;
17522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
17532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1755d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
175695069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // Always reset shadow focus mode to avoid reverting settings
1757d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        validatedParams.shadowFocusMode = FOCUS_MODE_INVALID;
17588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // Update in case of override
17598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        newParams.set(CameraParameters::KEY_FOCUS_MODE,
17608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                focusModeEnumToString(validatedParams.focusMode));
17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
17622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = currentAfTriggerId;
17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_AREAS
17662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.focusingAreas);
1768ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
1769ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk              Parameters::NUM_REGION, Parameters::NUM_REGION).
1770ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk              data.i32[Parameters::REGION_AF];
17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) res = validateAreas(validatedParams.focusingAreas,
1772ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            maxAfRegions, AREA_KIND_FOCUS);
17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
17752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
17762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EXPOSURE_COMPENSATION
17802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.exposureCompensation =
17812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
1783d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE);
17842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if ((validatedParams.exposureCompensation <
17852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]) ||
17862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (validatedParams.exposureCompensation >
17872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1])) {
17882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
17892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.exposureCompensation);
17902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
17912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
17942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoExposureLock = boolFromString(
17952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
17982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.autoWhiteBalanceLock = boolFromString(
17992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
18002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // METERING_AREAS
1802ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
1803ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION).
1804ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            data.i32[Parameters::REGION_AE];
18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.meteringAreas);
18072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) {
1808ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        res = validateAreas(validatedParams.meteringAreas, maxAeRegions,
18097d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                            AREA_KIND_METERING);
18102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
18122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
18132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ZOOM
18192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
1820709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin    if (validatedParams.zoom < 0
1821709bc10c04a9b62875b1c7f1f69486cf275338baIgor Murashkin                || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) {
18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.zoom);
18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_SIZE
18282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getVideoSize(&validatedParams.videoWidth,
18292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.videoHeight);
18302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoWidth != videoWidth ||
18312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.videoHeight != videoHeight) {
18322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state == RECORD) {
1833c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)"
1834c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    " when recording is active! Ignore the size update!",
1835c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth,
18362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight);
1837c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            validatedParams.videoWidth = videoWidth;
1838c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            validatedParams.videoHeight = videoHeight;
1839c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            newParams.setVideoSize(videoWidth, videoHeight);
1840c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He        } else {
1841c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            for (i = 0; i < availableVideoSizes.size(); i++) {
1842c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                if ((availableVideoSizes[i].width ==
1843c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoWidth) &&
1844c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    (availableVideoSizes[i].height ==
1845c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoHeight)) break;
1846c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            }
1847c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            if (i == availableVideoSizes.size()) {
1848c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                ALOGE("%s: Requested video size %d x %d is not supported",
1849c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        __FUNCTION__, validatedParams.videoWidth,
1850c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoHeight);
1851c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                return BAD_VALUE;
1852c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            }
18532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
18542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_STABILIZATION
18572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.videoStabilization = boolFromString(
18582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
18592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
1860211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
1861211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoStabilization &&
18632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            availableVideoStabilizationModes.count == 1) {
18642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
18652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Update internal parameters */
18682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    *this = validatedParams;
18703ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    updateOverriddenJpegSize();
18712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /** Update external parameters calculated from the internal ones */
18731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
18741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // HORIZONTAL/VERTICAL FIELD OF VIEW
18751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizFov, vertFov;
18761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
18771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (res != OK) {
18781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        ALOGE("%s: Can't calculate FOVs", __FUNCTION__);
18791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        // continue so parameters are at least consistent
18801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
18811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
18821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            horizFov);
18831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE,
18841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            vertFov);
18851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov);
18861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
18878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    // Need to flatten again in case of overrides
18888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    paramsFlattened = newParams.flatten();
18898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    params = newParams;
18908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
18912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
18922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
18932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1894da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const {
1895da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
1896da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
1897da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
189803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    /**
189903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * Mixin default important security values
190003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * - android.led.transmit = defaulted ON
190103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     */
190203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS,
1903d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*minimumCount*/0,
1904d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*maximumCount*/0,
1905d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*required*/false);
190603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    for(size_t i = 0; i < entry.count; ++i) {
190703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        uint8_t led = entry.data.u8[i];
190803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
190903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        switch(led) {
191003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            // Transmit LED is unconditionally on when using
191103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            // the android.hardware.Camera API
191203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
191303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
191403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                res = request->update(ANDROID_LED_TRANSMIT,
191503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                                      &transmitDefault, 1);
191603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                if (res != OK) return res;
191703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                break;
191803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            }
191903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        }
192003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    }
192103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
192203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    /**
192303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * Construct metadata from parameters
192403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     */
192503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
1926d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
1927da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_REQUEST_METADATA_MODE,
1928da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &metadataMode, 1);
1929da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1930da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
19310181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    camera_metadata_entry_t intent =
19320181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            request->find(ANDROID_CONTROL_CAPTURE_INTENT);
1933c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi
1934c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi    if (intent.count == 0) return BAD_VALUE;
1935c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi
19360181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) {
19370181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
19380181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                fastInfo.bestStillCaptureFpsRange, 2);
19390181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    } else {
19400181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
19410181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                previewFpsRange, 2);
19420181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
1943da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1944da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
194596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    uint8_t reqWbLock = autoWhiteBalanceLock ?
194696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
194796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_LOCK,
194896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            &reqWbLock, 1);
194996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala
1950da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
1951da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &effectMode, 1);
1952da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1953da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
1954da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &antibandingMode, 1);
1955da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
1956da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
195761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // android.hardware.Camera requires that when face detect is enabled, the
1958d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // camera is in a face-priority mode. HAL3.x splits this into separate parts
195961c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // (face detection statistics and face priority scene mode). Map from other
196061c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // to the other.
19618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    bool sceneModeActive =
1962c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
1963d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO;
19648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (enableFaceDetect || sceneModeActive) {
1965d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE;
196661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    }
1967da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
1968da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqControlMode, 1);
1969da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
197061c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala
1971d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala    uint8_t reqSceneMode =
19728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            sceneModeActive ? sceneMode :
1973d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala            enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY :
1974c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
197561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_SCENE_MODE,
197661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala            &reqSceneMode, 1);
197761c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    if (res != OK) return res;
1978da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
1979d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF;
1980d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF;
1981da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    switch (flashMode) {
1982da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
1983d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break;
1984da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
1985d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break;
1986da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_ON:
1987d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break;
1988da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
1989d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON;
1990d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqFlashMode = ANDROID_FLASH_MODE_TORCH;
1991da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
1992da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
1993d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break;
1994da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        default:
1995da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
1996da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    cameraId, flashMode);
19978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                return BAD_VALUE;
1998da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
1999da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
2000da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFlashMode, 1);
2001da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2002da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
2003da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqAeMode, 1);
2004da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2005da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
200696150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    uint8_t reqAeLock = autoExposureLock ?
200796150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
200896150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_LOCK,
200996150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala            &reqAeLock, 1);
20108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (res != OK) return res;
20118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
20128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
20138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            &wbMode, 1);
20148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (res != OK) return res;
201596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala
2016da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    float reqFocusDistance = 0; // infinity focus in diopters
2017d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
2018da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    switch (focusMode) {
2019da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2020da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2021da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2022da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2023da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2024da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusMode = focusMode;
2025da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
2026da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2027da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2028d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
2029da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
2030da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        default:
20318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
20328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        cameraId, focusMode);
20338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                return BAD_VALUE;
2034da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2035da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
2036da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFocusDistance, 1);
2037da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2038da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
2039da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFocusMode, 1);
2040da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2041da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2042da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t reqFocusingAreasSize = focusingAreas.size() * 5;
2043da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize];
2044894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He    for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) {
2045894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        if (focusingAreas[j].weight != 0) {
2046da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 0] =
2047894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedXToArray(focusingAreas[j].left);
2048da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 1] =
2049894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedYToArray(focusingAreas[j].top);
2050da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 2] =
2051894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedXToArray(focusingAreas[j].right);
2052da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 3] =
2053894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedYToArray(focusingAreas[j].bottom);
2054da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
2055da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 0] = 0;
2056da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 1] = 0;
2057da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 2] = 0;
2058da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 3] = 0;
2059da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
2060894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        reqFocusingAreas[i + 4] = focusingAreas[j].weight;
2061da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2062da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
2063da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas, reqFocusingAreasSize);
2064da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2065da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    delete[] reqFocusingAreas;
2066da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2067d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
2068da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &exposureCompensation, 1);
2069da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2070da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2071da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t reqMeteringAreasSize = meteringAreas.size() * 5;
2072da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize];
2073894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He    for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) {
2074894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        if (meteringAreas[j].weight != 0) {
2075da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 0] =
2076894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedXToArray(meteringAreas[j].left);
2077da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 1] =
2078894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedYToArray(meteringAreas[j].top);
2079da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 2] =
2080894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedXToArray(meteringAreas[j].right);
2081da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 3] =
2082894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedYToArray(meteringAreas[j].bottom);
2083da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
2084da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 0] = 0;
2085da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 1] = 0;
2086da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 2] = 0;
2087da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 3] = 0;
2088da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
2089894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        reqMeteringAreas[i + 4] = meteringAreas[j].weight;
2090da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2091da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
2092da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas, reqMeteringAreasSize);
2093da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2094da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2095ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    // Set awb regions to be the same as the metering regions if allowed
2096ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
2097ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION).
2098ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            data.i32[Parameters::REGION_AWB];
2099ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    if (maxAwbRegions > 0) {
2100ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        if (maxAwbRegions >= meteringAreas.size()) {
2101ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2102ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk                    reqMeteringAreas, reqMeteringAreasSize);
2103ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        } else {
2104ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            // Ensure the awb regions are zeroed if the region count is too high.
2105ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0};
2106ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2107ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk                    zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t));
2108ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        }
2109ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        if (res != OK) return res;
2110ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    }
2111ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk
2112da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    delete[] reqMeteringAreas;
2113da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2114d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion crop = calculateCropRegion(/*previewOnly*/ false);
211505bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin    int32_t reqCropRegion[4] = {
2116c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala        static_cast<int32_t>(crop.left),
2117c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala        static_cast<int32_t>(crop.top),
211805bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin        static_cast<int32_t>(crop.width),
211905bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin        static_cast<int32_t>(crop.height)
2120c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    };
2121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
212205bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin            reqCropRegion, 4);
2123da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2124da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2125da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t reqVstabMode = videoStabilization ?
2126d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON :
2127d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
2128da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2129da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqVstabMode, 1);
2130da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2131da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2132da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t reqFaceDetectMode = enableFaceDetect ?
2133da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            fastInfo.bestFaceDetectMode :
2134d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
2135d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE,
2136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFaceDetectMode, 1);
2137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
2140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
2141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2142ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const {
2143ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    status_t res;
2144ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2145ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE,
2146ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            jpegThumbSize, 2);
2147ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2148ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY,
2149ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegThumbQuality, 1);
2150ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2151ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_QUALITY,
2152ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegQuality, 1);
2153ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2154ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(
2155ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2156ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegRotation, 1);
2157ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2158ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2159ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (gpsEnabled) {
2160ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2161ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2162ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                gpsCoordinates, 3);
2163ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2164ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2165ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2166ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                &gpsTimestamp, 1);
2167ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2168ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2169ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2170ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                gpsProcessingMethod);
2171ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2172ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    } else {
2173ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_COORDINATES);
2174ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2175ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP);
2176ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2177ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
2178ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2179ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    }
2180ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    return OK;
2181ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala}
2182ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
21833ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::overrideJpegSizeByVideoSize() {
21843ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (pictureSizeOverriden) {
21853ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has been overridden. Skip overriding");
21863ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
21873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
21883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = true;
21903ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
21913ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
21923ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = videoWidth;
21933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = videoHeight;
21943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    // This change of picture size is invisible to app layer.
21953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    // Do not update app visible params
21963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
21973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
21983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
21993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::updateOverriddenJpegSize() {
22003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (!pictureSizeOverriden) {
22013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has not been overridden. Skip checking");
22023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
22033ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
22043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
22053ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
22063ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
22073ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
22083ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) {
22093ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        // Picture size is now smaller than video size. No need to override anymore
22103ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return recoverOverriddenJpegSize();
22113ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
22123ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
22133ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = videoWidth;
22143ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = videoHeight;
22153ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
22163ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
22173ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
22183ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
22193ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::recoverOverriddenJpegSize() {
22203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (!pictureSizeOverriden) {
22213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has not been overridden. Skip recovering");
22223ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
22233ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
22243ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = false;
22253ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = pictureWidthLastSet;
22263ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = pictureHeightLastSet;
22273ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
22283ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
2229ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2230092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yehbool Parameters::isJpegSizeOverridden() {
2231092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh    return pictureSizeOverriden;
2232092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh}
2233092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh
22342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) {
22352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
22362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(state) {
22372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
22382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
22392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
22402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
22412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
22422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
22432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
22442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
22452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return "Unknown state!";
22462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR
22492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) {
2252b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    return CameraParameters::previewFormatToEnum(format);
22532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) {
22562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *fmt;
22572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(format) {
22582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
22592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
22602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
22622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
22632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
22652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
22662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
22682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
22692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
22712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
22722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
22742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
22752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
2276a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
22772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
22782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
22792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
22812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
22822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,  format);
22832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = NULL;
22842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
22852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
22862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return fmt;
22872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
22882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
22892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) {
22902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
22914a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !wbMode ?
2292d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
22932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2294d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
22952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2296d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_INCANDESCENT :
22972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2298d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_FLUORESCENT :
22992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2300d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT :
23012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2302d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_DAYLIGHT :
23032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2304d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT :
23052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2306d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_TWILIGHT :
23072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2308d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_SHADE :
23092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
23102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) {
23138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (wbMode) {
2314d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_AUTO:
23158a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_AUTO;
2316d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
23178a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_INCANDESCENT;
2318d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
23198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_FLUORESCENT;
2320d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
23218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2322d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
23238a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_DAYLIGHT;
2324d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
23258a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2326d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
23278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_TWILIGHT;
2328d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_SHADE:
23298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_SHADE;
23308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
23318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown AWB mode enum: %d",
23328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, wbMode);
23338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
23348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
23358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
23368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
23372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) {
23382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23394a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !effectMode ?
2340d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
23412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2342d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
23432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2344d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_MONO :
23452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2346d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_NEGATIVE :
23472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2348d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SOLARIZE :
23492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2350d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SEPIA :
23512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2352d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_POSTERIZE :
23532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2354d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD :
23552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2356d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD :
23572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2358d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_AQUA :
23592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
23602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) {
23632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23644a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !abMode ?
2365d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
23662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2367d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
23682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2369d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF :
23702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2371d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ :
23722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2373d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ :
23742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
23752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
23762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
23772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) {
23782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
23794a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !sceneMode ?
2380c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED :
23812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2382c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED :
23832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
23842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
23852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
23862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
23872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
23882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
23892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
23902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
23912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
23922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
23932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
23942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
23952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
23962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
23972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
23982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
23992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
24002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
24012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
24022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
24032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
24042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
24052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
24062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
24072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
24082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
24092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
24102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
24112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
24122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
2413af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_HDR) ?
2414af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_HDR:
24152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
24162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
24192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *flashMode) {
24202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
24214a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !flashMode ?
2422b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
24232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
24242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
24252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
24262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
24272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
24282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
24292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
24302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
24312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
24322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
24332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
24342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) {
24378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (flashMode) {
24388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_OFF:
24398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_OFF;
24408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_AUTO:
24418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_AUTO;
24428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_ON:
24438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_ON;
24448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_RED_EYE:
24458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_RED_EYE;
24468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_TORCH:
24478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_TORCH;
24488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
24498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown flash mode enum %d",
24508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, flashMode);
24518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
24528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
24538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
24548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
24552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
24562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *focusMode) {
24572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
24584a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !focusMode ?
24594a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala            Parameters::FOCUS_MODE_INVALID :
24602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
24612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
24622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
24632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
24642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
24652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
24662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
24672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
24682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
24692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
24702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
24712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
24722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
24732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
24742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
24752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) {
24788a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (focusMode) {
24798a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_AUTO:
24808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_AUTO;
24818a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_MACRO:
24828a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_MACRO;
24838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_VIDEO:
24848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
24858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_PICTURE:
24868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
24878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_EDOF:
24888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_EDOF;
24898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_INFINITY:
24908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_INFINITY;
24918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_FIXED:
24928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_FIXED;
24938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
24948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown focus mode enum: %d",
24958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, focusMode);
24968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
24978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
24988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
24998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
25002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr,
25012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
25022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
25032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    areas->clear();
25042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areasCStr == NULL) {
25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
25062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push();
25072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return OK;
25082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    String8 areasStr(areasCStr);
25102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
25112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    while (areaStart != 0) {
25122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
25132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *numEnd;
25142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int vals[NUM_FIELDS];
25152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            errno = 0;
25172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
25182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
25192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            area = numEnd + 1;
25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
25212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push(Parameters::Area(
25222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
25232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
25242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
25262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
25297d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                                      size_t maxRegions,
25307d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                                      AreaKind areaKind) const {
25312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Definition of valid area can be found in
25322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // include/camera/CameraParameters.h
25332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
25342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 1) {
25352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (areas[0].left == 0 &&
25362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].top == 0 &&
25372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].right == 0 &&
25382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].bottom == 0 &&
25392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].weight == 0) {
25402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
25412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return OK;
25422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
25432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25447d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin
25457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    // fixed focus can only set (0,0,0,0,0) focus area
25467d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) {
25477d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin        return BAD_VALUE;
25487d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    }
25497d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin
25502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() > maxRegions) {
2551e5729fac81c8a984e984fefc90afc64135817d4fColin Cross        ALOGE("%s: Too many areas requested: %zu",
25522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, areas.size());
25532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
25542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
25572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala         a != areas.end(); a++) {
25582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
25592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
25602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
25612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
25622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
25632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
25642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
25652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
25672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) {
25702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return !boolStr ? false :
25712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
25722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        false;
25732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) {
25762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!mirror) {
25772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) return 0;
25782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
25792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
25802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
25812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
25822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
25832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
25842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
25852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
25862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
25872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
25882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
25892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
25902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
25912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
25932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return -1;
25942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25967373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const {
25977373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds"
25987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                         "(lower = 0)", x);
25997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
2600d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
26017373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' "
26021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                    "is out of bounds (upper = %f)", x, previewCrop.width);
26037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = x + previewCrop.left;
26057373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26067373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth),
26077373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "Calculated pixel array value X = '%d' is out of bounds (upper = %d)",
26087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        ret, fastInfo.arrayWidth);
26097373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
26107373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26117373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26127373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const {
26137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds "
26147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "(lower = 0)", y);
26157373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
2616d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
26177373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is "
26181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                "out of bounds (upper = %f)", y, previewCrop.height);
26197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = y + previewCrop.top;
26217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26227373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight),
26237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)",
26247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        ret, fastInfo.arrayHeight);
26257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
26277373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26307373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const {
2631d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
26327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return (x + 1000) * (previewCrop.width - 1) / 2000;
26337373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26357373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const {
2636d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
26377373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return (y + 1000) * (previewCrop.height - 1) / 2000;
26387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26405e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedXToArray(int x) const {
26417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26425e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    // Work-around for HAL pre-scaling the coordinates themselves
26435e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    if (quirks.meteringCropRegion) {
26445e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
26455e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    }
26467373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26475e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    return cropXToArray(normalizedXToCrop(x));
26487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
26497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26505e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedYToArray(int y) const {
26517373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
26535e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
26547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26557373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26565e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    return cropYToArray(normalizedYToCrop(y));
26572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26597373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26605e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu ChenParameters::CropRegion Parameters::calculatePreviewCrop(
26615e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        const CropRegion &scalerCrop) const {
26625e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    float left, top, width, height;
26635e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    float previewAspect = static_cast<float>(previewWidth) / previewHeight;
26645e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    float cropAspect = scalerCrop.width / scalerCrop.height;
26657373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26665e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    if (previewAspect > cropAspect) {
26675e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        width = scalerCrop.width;
26685e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        height = cropAspect * scalerCrop.height / previewAspect;
26695e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen
26705e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        left = scalerCrop.left;
26715e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        top = scalerCrop.top + (scalerCrop.height - height) / 2;
26725e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    } else {
26735e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        width = previewAspect * scalerCrop.width / cropAspect;
26745e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        height = scalerCrop.height;
26755e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen
26765e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        left = scalerCrop.left + (scalerCrop.width - width) / 2;
26775e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        top = scalerCrop.top;
26787373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26797373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26805e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    CropRegion previewCrop = {left, top, width, height};
26812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26825e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    return previewCrop;
26835e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen}
26847373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
26855e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayXToNormalizedWithCrop(int x,
26865e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        const CropRegion &scalerCrop) const {
26877373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26887373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
26895e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return x * 2000 / (fastInfo.arrayWidth - 1) - 1000;
26905e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    } else {
26915e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        CropRegion previewCrop = calculatePreviewCrop(scalerCrop);
26925e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (x - previewCrop.left) * 2000 / (previewCrop.width - 1) - 1000;
26937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
26942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26965e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayYToNormalizedWithCrop(int y,
26975e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        const CropRegion &scalerCrop) const {
26987373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
26997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
27005e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return y * 2000 / (fastInfo.arrayHeight - 1) - 1000;
27015e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    } else {
27025e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        CropRegion previewCrop = calculatePreviewCrop(scalerCrop);
27035e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (y - previewCrop.top) * 2000 / (previewCrop.height - 1) - 1000;
27047373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
27052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
27062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
27070cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun Hestatus_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
27083ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (info == NULL) {
27093ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("%s: Static metadata is not initialized", __FUNCTION__);
27103ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return NO_INIT;
27113ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
27123ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (sizes == NULL) {
27133ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("%s: Input size is null", __FUNCTION__);
27143ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return BAD_VALUE;
27153ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
2716cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    sizes->clear();
2717cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2718cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2719cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
2720cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < scs.size(); i++) {
2721cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            const StreamConfiguration &sc = scs[i];
2722cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
2723cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
2724cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sc.width <= limit.width && sc.height <= limit.height) {
2725cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                Size sz = {sc.width, sc.height};
2726cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                sizes->push(sz);
27273ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He            }
2728cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2729cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    } else {
2730cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const size_t SIZE_COUNT = sizeof(Size) / sizeof(int);
2731cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        camera_metadata_ro_entry_t availableProcessedSizes =
2732cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, SIZE_COUNT);
2733cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (availableProcessedSizes.count < SIZE_COUNT) return BAD_VALUE;
2734cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2735cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Size filteredSize;
2736cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i = 0; i < availableProcessedSizes.count; i += SIZE_COUNT) {
2737cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            filteredSize.width = availableProcessedSizes.data.i32[i];
2738cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            filteredSize.height = availableProcessedSizes.data.i32[i+1];
2739cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                // Need skip the preview sizes that are too large.
2740cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                if (filteredSize.width <= limit.width &&
2741cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                        filteredSize.height <= limit.height) {
2742cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sizes->push(filteredSize);
2743cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                }
2744cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
27453ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
2746cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
27473ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (sizes->isEmpty()) {
27483ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("generated preview size list is empty!!");
27493ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return BAD_VALUE;
27503ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
27513ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    return OK;
27523ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He}
27533ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He
27549fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio(
27559fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        float ratio, const int32_t* sizeArray, size_t count) {
27569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL");
27579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number");
27589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
27599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    Size maxSize = {0, 0};
27609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    for (size_t i = 0; i < count; i += 2) {
27619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        if (sizeArray[i] > 0 && sizeArray[i+1] > 0) {
27629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1];
27639fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) {
27649fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                maxSize.width = sizeArray[i];
27659fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                maxSize.height = sizeArray[i+1];
27669fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            }
27679fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        }
27689fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    }
27699fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
27709fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    if (maxSize.width == 0 || maxSize.height == 0) {
27719fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        maxSize.width = sizeArray[0];
27729fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        maxSize.height = sizeArray[1];
27739fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        ALOGW("Unable to find the size to match the given aspect ratio %f."
27749fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                "Fall back to %d x %d", ratio, maxSize.width, maxSize.height);
27759fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    }
27769fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
27779fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    return maxSize;
27789fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He}
27799fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
2780355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia YehParameters::Size Parameters::getMaxSize(const Vector<Parameters::Size> &sizes) {
2781355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    Size maxSize = {-1, -1};
2782355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    for (size_t i = 0; i < sizes.size(); i++) {
2783355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        if (sizes[i].width > maxSize.width ||
2784355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                (sizes[i].width == maxSize.width && sizes[i].height > maxSize.height )) {
2785355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            maxSize = sizes[i];
2786355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
2787355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
2788355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    return maxSize;
2789355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh}
2790355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
2791cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() {
2792cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_CONFIGURATION_SIZE = 4;
2793cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_FORMAT_OFFSET = 0;
2794cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_WIDTH_OFFSET = 1;
2795cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_HEIGHT_OFFSET = 2;
2796cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_IS_INPUT_OFFSET = 3;
2797cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<StreamConfiguration> scs;
2798cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion < CAMERA_DEVICE_API_VERSION_3_2) {
2799cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        ALOGE("StreamConfiguration is only valid after device HAL 3.2!");
2800cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        return scs;
2801cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2802cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2803cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    camera_metadata_ro_entry_t availableStreamConfigs =
2804cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
2805355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    for (size_t i = 0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
2806cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
2807cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
2808cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
2809cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
2810cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        StreamConfiguration sc = {format, width, height, isInput};
2811cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        scs.add(sc);
2812cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2813cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return scs;
2814cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
2815cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2816355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yehint64_t Parameters::getJpegStreamMinFrameDurationNs(Parameters::Size size) {
2817355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2818355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        const int STREAM_DURATION_SIZE = 4;
2819355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        const int STREAM_FORMAT_OFFSET = 0;
2820355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        const int STREAM_WIDTH_OFFSET = 1;
2821355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        const int STREAM_HEIGHT_OFFSET = 2;
2822355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        const int STREAM_DURATION_OFFSET = 3;
2823355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        camera_metadata_ro_entry_t availableStreamMinDurations =
2824355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                    staticInfo(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
2825355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        for (size_t i = 0; i < availableStreamMinDurations.count; i+= STREAM_DURATION_SIZE) {
2826355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            int64_t format = availableStreamMinDurations.data.i64[i + STREAM_FORMAT_OFFSET];
2827355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            int64_t width = availableStreamMinDurations.data.i64[i + STREAM_WIDTH_OFFSET];
2828355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            int64_t height = availableStreamMinDurations.data.i64[i + STREAM_HEIGHT_OFFSET];
2829355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            int64_t duration = availableStreamMinDurations.data.i64[i + STREAM_DURATION_OFFSET];
2830355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            if (format == HAL_PIXEL_FORMAT_BLOB && width == size.width && height == size.height) {
2831355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                return duration;
2832355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            }
2833355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
2834355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    } else {
2835355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        Vector<Size> availableJpegSizes = getAvailableJpegSizes();
2836355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        size_t streamIdx = availableJpegSizes.size();
2837355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        for (size_t i = 0; i < availableJpegSizes.size(); i++) {
2838355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            if (availableJpegSizes[i].width == size.width &&
2839355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                    availableJpegSizes[i].height == size.height) {
2840355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                streamIdx = i;
2841355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                break;
2842355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            }
2843355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
2844355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        if (streamIdx != availableJpegSizes.size()) {
2845355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            camera_metadata_ro_entry_t jpegMinDurations =
2846355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                    staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_MIN_DURATIONS);
2847355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            if (streamIdx < jpegMinDurations.count) {
2848355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                return jpegMinDurations.data.i64[streamIdx];
2849355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            }
2850355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
2851355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
2852355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    ALOGE("%s: cannot find min frame duration for jpeg size %dx%d",
2853355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            __FUNCTION__, size.width, size.height);
2854355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    return -1;
2855355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh}
2856355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
2857cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehSortedVector<int32_t> Parameters::getAvailableOutputFormats() {
2858cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    SortedVector<int32_t> outputFormats; // Non-duplicated output formats
2859cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2860cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
2861355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        for (size_t i = 0; i < scs.size(); i++) {
2862cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            const StreamConfiguration &sc = scs[i];
2863cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) {
2864cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                outputFormats.add(sc.format);
2865cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            }
2866cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2867cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    } else {
2868cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        camera_metadata_ro_entry_t availableFormats = staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
2869355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        for (size_t i = 0; i < availableFormats.count; i++) {
2870cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            outputFormats.add(availableFormats.data.i32[i]);
2871cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2872cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2873cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return outputFormats;
2874cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
2875cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2876cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::Size> Parameters::getAvailableJpegSizes() {
2877cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<Parameters::Size> jpegSizes;
2878cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (mDeviceVersion >= CAMERA_DEVICE_API_VERSION_3_2) {
2879cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
2880355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        for (size_t i = 0; i < scs.size(); i++) {
2881cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            const StreamConfiguration &sc = scs[i];
2882cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
2883cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    sc.format == HAL_PIXEL_FORMAT_BLOB) {
2884cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                Size sz = {sc.width, sc.height};
2885cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                jpegSizes.add(sz);
2886cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            }
2887cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2888cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    } else {
2889cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const int JPEG_SIZE_ENTRY_COUNT = 2;
2890cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const int WIDTH_OFFSET = 0;
2891cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        const int HEIGHT_OFFSET = 1;
2892cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        camera_metadata_ro_entry_t availableJpegSizes =
2893cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
2894355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        for (size_t i = 0; i < availableJpegSizes.count; i+= JPEG_SIZE_ENTRY_COUNT) {
2895cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            int width = availableJpegSizes.data.i32[i + WIDTH_OFFSET];
2896cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            int height = availableJpegSizes.data.i32[i + HEIGHT_OFFSET];
2897cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            Size sz = {width, height};
2898cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            jpegSizes.add(sz);
2899cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
2900cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
2901cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return jpegSizes;
2902cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
2903cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
2904d48521fc2f7c34623a745728a07dad728da49254Eino-Ville TalvalaParameters::CropRegion Parameters::calculateCropRegion(bool previewOnly) const {
2905018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2906018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2907018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2908018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // Need to convert zoom index into a crop rectangle. The rectangle is
2909018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // chosen to maximize its area on the sensor
2910018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2911018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    camera_metadata_ro_entry_t maxDigitalZoom =
2912d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
2913018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // For each zoom step by how many pixels more do we change the zoom
2914018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
2915018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            (NUM_ZOOM_STEPS-1);
2916018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w)
2917018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // via interpolating zoom step into a zoom ratio
2918018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomRatio = 1 + zoomIncrement * zoom;
2919018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]),
2920018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f",
2921018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        maxDigitalZoom.data.f[0], zoomRatio);
2922018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2923018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, "
2924018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          "previewHeight=%d, activeWidth=%d, activeHeight=%d",
2925018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth,
2926018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight);
2927018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2928d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    if (previewOnly) {
2929d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        // Calculate a tight crop region for the preview stream only
2930d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        float previewRatio = static_cast<float>(previewWidth) / previewHeight;
2931018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2932d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        /* Ensure that the width/height never go out of bounds
2933d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * by scaling across a diffent dimension if an out-of-bounds
2934d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * possibility exists.
2935d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         *
2936d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by
2937d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * calculating the zoomWidth from zoomHeight we'll actually get a
2938d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * zoomheight > arrayheight
2939d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         */
2940d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight;
2941d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        if (previewRatio >= arrayRatio) {
2942d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            // Adjust the height based on the width
2943d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomWidth =  fastInfo.arrayWidth / zoomRatio;
2944d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomHeight = zoomWidth *
2945d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala                    previewHeight / previewWidth;
2946018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2947d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        } else {
2948d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            // Adjust the width based on the height
2949d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomHeight = fastInfo.arrayHeight / zoomRatio;
2950d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomWidth = zoomHeight *
2951d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala                    previewWidth / previewHeight;
2952018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        }
2953018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    } else {
2954d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        // Calculate the global crop region with a shape matching the active
2955d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        // array.
2956d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        zoomWidth = fastInfo.arrayWidth / zoomRatio;
2957018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        zoomHeight = fastInfo.arrayHeight / zoomRatio;
2958018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    }
2959d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala
2960d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    // center the zoom area within the active area
2961018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2;
2962018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2;
2963018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2964018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d",
2965018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom);
2966018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
2967018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight };
2968018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    return crop;
2969018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin}
2970018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
29711f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov)
29721f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        const {
29731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
29741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2);
29751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
29761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
29771bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    camera_metadata_ro_entry_t pixelArraySize =
29781bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen            staticInfo(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 2, 2);
29791bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    if (!pixelArraySize.count) return NO_INIT;
29801bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen
29811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float arrayAspect = static_cast<float>(fastInfo.arrayWidth) /
29821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            fastInfo.arrayHeight;
29831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float stillAspect = static_cast<float>(pictureWidth) / pictureHeight;
29841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect);
29851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
29861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // The crop factors from the full sensor array to the still picture crop
29871f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // region
29881f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizCropFactor = 1.f;
29891f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float vertCropFactor = 1.f;
29901f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
29911f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /**
29921f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Need to calculate the still image field of view based on the total pixel
29931f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * array field of view, and the relative aspect ratios of the pixel array
29941f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * and output streams.
29951f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     *
29961f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Special treatment for quirky definition of crop region and relative
29971f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * stream cropping.
29981f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     */
29991f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (quirks.meteringCropRegion) {
3000c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // Use max of preview and video as first crop
3001c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        float previewAspect = static_cast<float>(previewWidth) / previewHeight;
3002c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        float videoAspect = static_cast<float>(videoWidth) / videoHeight;
3003c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (videoAspect > previewAspect) {
3004c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            previewAspect = videoAspect;
3005c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        }
3006c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // First crop sensor to preview aspect ratio
3007c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (arrayAspect < previewAspect) {
3008c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            vertCropFactor = arrayAspect / previewAspect;
3009c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        } else {
3010c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            horizCropFactor = previewAspect / arrayAspect;
3011c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        }
3012c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // Second crop to still aspect ratio
3013c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (stillAspect < previewAspect) {
3014c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            horizCropFactor *= stillAspect / previewAspect;
3015c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        } else {
3016c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            vertCropFactor *= previewAspect / stillAspect;
30171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        }
30181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    } else {
30191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        /**
30201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * Crop are just a function of just the still/array relative aspect
30211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * ratios. Since each stream will maximize its area within the crop
30221f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * region, and for FOV we assume a full-sensor crop region, we only ever
30231f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * crop the FOV either vertically or horizontally, never both.
30241f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         */
30251f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        horizCropFactor = (arrayAspect > stillAspect) ?
30261f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                (stillAspect / arrayAspect) : 1.f;
30271f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        vertCropFactor = (arrayAspect < stillAspect) ?
30281f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                (arrayAspect / stillAspect) : 1.f;
30291f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
30301bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen
30311bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    /**
30321bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen     * Convert the crop factors w.r.t the active array size to the crop factors
30331bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen     * w.r.t the pixel array size.
30341bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen     */
30351bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    horizCropFactor *= (static_cast<float>(fastInfo.arrayWidth) /
30361bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen                            pixelArraySize.data.i32[0]);
30371bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    vertCropFactor *= (static_cast<float>(fastInfo.arrayHeight) /
30381bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen                            pixelArraySize.data.i32[1]);
30391bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen
30401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Horiz crop factor: %f, vert crop fact: %f",
30411f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            horizCropFactor, vertCropFactor);
30421f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /**
30431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Basic field of view formula is:
30441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     *   angle of view = 2 * arctangent ( d / 2f )
30451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * where d is the physical sensor dimension of interest, and f is
30461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * the focal length. This only applies to rectilinear sensors, for focusing
30471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * at distances >> f, etc.
30481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     */
30491f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (horizFov != NULL) {
30501f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        *horizFov = 180 / M_PI * 2 *
30511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                atanf(horizCropFactor * sensorSize.data.f[0] /
30521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                        (2 * fastInfo.minFocalLength));
30531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
30541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (vertFov != NULL) {
30551f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        *vertFov = 180 / M_PI * 2 *
30561f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                atanf(vertCropFactor * sensorSize.data.f[1] /
30571f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                        (2 * fastInfo.minFocalLength));
30581f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
30591f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    return OK;
30601f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala}
30611f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
3062ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const {
3063af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    return max;
3064af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin}
3065af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
30662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2
30672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android
3068