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) {
2414f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            if (!isFpsSupported(availablePreviewSizes,
2424f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He                HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, availableFpsRanges.data.i32[i+1])) {
2434f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He                continue;
2444f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            }
245c067179b6a402fc0c284cfae886058a6738e9b20Yin-Chia Yeh            if (supportedPreviewFpsRange.length() > 0) {
246c067179b6a402fc0c284cfae886058a6738e9b20Yin-Chia Yeh                supportedPreviewFpsRange += ",";
247c067179b6a402fc0c284cfae886058a6738e9b20Yin-Chia Yeh            }
2480b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            supportedPreviewFpsRange += String8::format("(%d,%d)",
2490b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    availableFpsRanges.data.i32[i] * kFpsToApiScale,
2500b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    availableFpsRanges.data.i32[i+1] * kFpsToApiScale);
2510b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
2520b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
2530b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                supportedPreviewFpsRange);
2540b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
2550b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
2562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin        SortedVector<int32_t> sortedPreviewFrameRates;
258af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
2592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPreviewFrameRates;
2602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
261af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // from the [min, max] fps range use the max value
262af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            int fps = fpsFromRange(availableFpsRanges.data.i32[i],
263af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                                   availableFpsRanges.data.i32[i+1]);
2644f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            if (!isFpsSupported(availablePreviewSizes,
2654f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He                    HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, fps)) {
2664f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He                continue;
2674f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            }
268af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            // de-dupe frame rates
269af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (sortedPreviewFrameRates.indexOf(fps) == NAME_NOT_FOUND) {
270af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                sortedPreviewFrameRates.add(fps);
271af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
272af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            else {
273af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                continue;
274af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
275af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
276af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            if (sortedPreviewFrameRates.size() > 1) {
277af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                supportedPreviewFrameRates += ",";
278af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
279af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
2802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
281af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    fps);
282af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
283af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            ALOGV("%s: Supported preview frame rates: %s",
284af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    __FUNCTION__, supportedPreviewFrameRates.string());
2852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
2862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
2872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPreviewFrameRates);
2882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
2892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
290cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<Size> availableJpegSizes = getAvailableJpegSizes();
291cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (!availableJpegSizes.size()) return NO_INIT;
2922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Pick maximum
294cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    pictureWidth = availableJpegSizes[0].width;
295cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    pictureHeight = availableJpegSizes[0].height;
2963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
2973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
2983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = false;
2992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureSize(pictureWidth,
3012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            pictureHeight);
3022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedPictureSizes;
305cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (size_t i=0; i < availableJpegSizes.size(); i++) {
3062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
3072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
308cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    availableJpegSizes[i].width,
309cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                    availableJpegSizes[i].height);
3102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
3122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedPictureSizes);
3132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
3162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
3172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
3182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableJpegThumbnailSizes =
320f128dc51c81e6b831806e0de505e4edbb02b7e71Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 4);
3212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
3222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3239fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    // Pick the largest thumbnail size that matches still image aspect ratio.
3249fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(pictureWidth > 0 && pictureHeight > 0,
3259fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            "Invalid picture size, %d x %d", pictureWidth, pictureHeight);
3269fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    float picAspectRatio = static_cast<float>(pictureWidth) / pictureHeight;
3279fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    Size thumbnailSize =
3289fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            getMaxSizeForRatio(
3299fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    picAspectRatio,
3309fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    &availableJpegThumbnailSizes.data.i32[0],
3319fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                    availableJpegThumbnailSizes.count);
3329fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    jpegThumbSize[0] = thumbnailSize.width;
3339fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    jpegThumbSize[1] = thumbnailSize.height;
3342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
3362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[0]);
3372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
3382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbSize[1]);
3392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    {
3412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedJpegThumbSizes;
3422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
3432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
3442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
3452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
3462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
3472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
3482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
3492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedJpegThumbSizes);
3502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
3512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegThumbQuality = 90;
3532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
3542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegThumbQuality);
3552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegQuality = 90;
3562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
3572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegQuality);
3582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    jpegRotation = 0;
3592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
3602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            jpegRotation);
3612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsEnabled = false;
363a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[0] = 0.0;
364a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[1] = 0.0;
365a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsCoordinates[2] = 0.0;
366a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    gpsTimestamp = 0;
3672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    gpsProcessingMethod = "unknown";
3682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
3692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
370d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    wbMode = ANDROID_CONTROL_AWB_MODE_AUTO;
3712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
3722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
3732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
3742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableWhiteBalanceModes =
375211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
376211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableWhiteBalanceModes.count) {
377211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
378211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::WHITE_BALANCE_AUTO);
379211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
3802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedWhiteBalance;
3812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
3822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
3832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
3842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
3852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
386d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_AUTO:
3872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
3892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
390d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
3912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
3932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
394d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
3952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
3962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
3972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
398d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
3992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
4012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
402d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
4032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
4052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
406d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
4072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
4092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
410d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
4112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
4132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
414d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_SHADE:
4152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance +=
4162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
4172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Skipping values not mappable to v1 API
419d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_CONTROL_AWB_MODE_OFF:
4202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
4212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
4232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
4242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
4252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
4262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                addComma = false;
4272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
4282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
4312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedWhiteBalance);
4322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
434d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    effectMode = ANDROID_CONTROL_EFFECT_MODE_OFF;
4352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
4362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
4372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
4382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableEffects =
439211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS, 0, 0, false);
440211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableEffects.count) {
441211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS,
442211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::EFFECT_NONE);
443211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
4442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedEffects;
4452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
4462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
4472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedEffects += ",";
4482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
4492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
450d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_OFF:
4512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NONE;
4532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
454d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_MONO:
4552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_MONO;
4572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
458d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_NEGATIVE:
4592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
4612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
462d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SOLARIZE:
4632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
4652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
466d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_SEPIA:
4672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
4692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
470d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_POSTERIZE:
4712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
4732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
474d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD:
4752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
4772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
478d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD:
4792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
4812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
482d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_EFFECT_MODE_AQUA:
4832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedEffects +=
4842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
4852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
4872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
4882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableEffects.data.u8[i]);
4892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
4902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
4912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
4922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
4932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
4942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
4952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
496d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO;
4972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
4982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
4992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAntibandingModes =
501211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES, 0, 0, false);
502211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableAntibandingModes.count) {
503211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
504211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                CameraParameters::ANTIBANDING_OFF);
505211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
5062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedAntibanding;
5072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = false;
5082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
5092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
5102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
512d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF:
5132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
5152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
516d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ:
5172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
5192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
520d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ:
5212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
5232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
524d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO:
5252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedAntibanding +=
5262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
5272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
5292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
5302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
5312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
5322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
5352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
5362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
5372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedAntibanding);
5382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
5392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
540c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk    sceneMode = ANDROID_CONTROL_SCENE_MODE_DISABLED;
5412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
5422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
5432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
5442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
545211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
546211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!availableSceneModes.count) {
547211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        params.remove(CameraParameters::KEY_SCENE_MODE);
548211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    } else {
5492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
5502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool addComma = true;
5512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        bool noSceneModes = false;
5522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
5532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
5542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
5552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
556c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk                case ANDROID_CONTROL_SCENE_MODE_DISABLED:
5572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    noSceneModes = true;
5582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
5602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    // Not in old API
5612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
5622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
5642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
5662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
5682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
5702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
5722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
5742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
5762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
5782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
5802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
5822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
5842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
5862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
5882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
5902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
5922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
5942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
5962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
5972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
5982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
5992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
6002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
6022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
6042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
6062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
6082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
6102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
6122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
6142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
6162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
6182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
6202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes +=
6212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
6222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
623af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_HDR:
624af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                    supportedSceneModes +=
625af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                        CameraParameters::SCENE_MODE_HDR;
626af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala                    break;
6272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
6282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
6292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
6302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableSceneModes.data.u8[i]);
6312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
6322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
6332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (!noSceneModes) {
6362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
6372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedSceneModes);
638cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin        } else {
639cc76ec941661206e3a3c53f9aff789c839a869bbIgor Murashkin            params.remove(CameraParameters::KEY_SCENE_MODE);
6402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
643211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    bool isFlashAvailable = false;
6442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t flashAvailable =
645211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 0, 1, false);
646211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (flashAvailable.count) {
647211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        isFlashAvailable = flashAvailable.data.u8[0];
648211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    }
6492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAeModes =
651211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES, 0, 0, false);
6522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
653248f9ce1b6052889dd55e7701f908477d16d6ff4Eino-Ville Talvala    flashMode = Parameters::FLASH_MODE_OFF;
654211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (isFlashAvailable) {
6552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
6566f854608d26d7abcce5e46396c7260ed7b250653Alex Ray                CameraParameters::FLASH_MODE_OFF);
6572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
6592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
6602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
6612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
6622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
6632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
6642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
665d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE) {
6662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
6672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
6682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
6692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
6702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
6712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
6722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFlashModes);
6732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
674b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // No flash means null flash mode and supported flash modes keys, so
675b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // remove them just to be safe
676b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        params.remove(CameraParameters::KEY_FLASH_MODE);
677b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        params.remove(CameraParameters::KEY_SUPPORTED_FLASH_MODES);
6782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
6792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
681211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 1, false);
6822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
6832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableAfModes =
684211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES, 0, 0, false);
6852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
686211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (!minFocusDistance.count || minFocusDistance.data.f[0] == 0) {
6872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // Fixed-focus lens
6882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_FIXED;
6892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
6922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
6932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
6942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        focusMode = Parameters::FOCUS_MODE_AUTO;
6952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
6962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
69780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        String8 supportedFocusModes;
69880ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        bool addComma = false;
69980ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        camera_metadata_ro_entry_t focusDistanceCalibration =
70080ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0, false);
70180ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh
70280ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        if (focusDistanceCalibration.count &&
70380ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh                focusDistanceCalibration.data.u8[0] !=
70480ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh                ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED) {
70580ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            supportedFocusModes += CameraParameters::FOCUS_MODE_INFINITY;
70680ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh            addComma = true;
70780ef94b5a7daa2d48ca72501e335a648dc67bc1dYin-Chia Yeh        }
7082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
7102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
7112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            addComma = true;
7122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
713d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
7142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
7162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
717d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
7182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
7202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
721d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
7222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
7242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
725d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
7262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
7282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
729d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
7302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    supportedFocusModes +=
7312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
7322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                // Not supported in old API
734d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
7352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
7362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                default:
7382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
7392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId, availableAfModes.data.u8[i]);
7402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    addComma = false;
7412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
7422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
7432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
7442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
7452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                supportedFocusModes);
7462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
747d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala    focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
74895069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala    shadowFocusMode = FOCUS_MODE_INVALID;
7492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
750ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    camera_metadata_ro_entry_t max3aRegions = staticInfo(ANDROID_CONTROL_MAX_REGIONS,
751ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION);
752ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    if (max3aRegions.count != Parameters::NUM_REGION) return NO_INIT;
7532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7547d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    int32_t maxNumFocusAreas = 0;
7557d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    if (focusMode != Parameters::FOCUS_MODE_FIXED) {
756ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        maxNumFocusAreas = max3aRegions.data.i32[Parameters::REGION_AF];
7577d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    }
7587d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS, maxNumFocusAreas);
7592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
7602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
7612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.clear();
7622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    focusingAreas.add(Parameters::Area(0,0,0,0,0));
7632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
764c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    if (fastInfo.isExternalCamera) {
765c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, -1.0);
766c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    } else {
767c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        camera_metadata_ro_entry_t availableFocalLengths =
768c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, false);
769c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        if (!availableFocalLengths.count) return NO_INIT;
770c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh
771c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        float minFocalLength = availableFocalLengths.data.f[0];
772c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
773c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    }
7742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizFov, vertFov;
7771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
7781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (res != OK) {
7791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        ALOGE("%s: Can't calculate field of views!", __FUNCTION__);
7801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        return res;
7811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
7822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
7842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
7852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    exposureCompensation = 0;
7872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
7882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                exposureCompensation);
7892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
791d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE, 2, 2);
7922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
7932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
7952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
7962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
7972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
7982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
7992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationStep =
800d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_STEP, 1, 1);
8012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
8022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
8042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (float)exposureCompensationStep.data.r[0].numerator /
8052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
8062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoExposureLock = false;
8082638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    autoExposureLockAvailable = false;
8092638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    camera_metadata_ro_entry_t exposureLockAvailable =
8102638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        staticInfo(ANDROID_CONTROL_AE_LOCK_AVAILABLE, 1, 1);
8112638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    if ((0 < exposureLockAvailable.count) &&
8122638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev            (ANDROID_CONTROL_AE_LOCK_AVAILABLE_TRUE ==
8132638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                    exposureLockAvailable.data.u8[0])) {
8142638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
8152638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                CameraParameters::FALSE);
8162638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
8172638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                   CameraParameters::TRUE);
8182638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        autoExposureLockAvailable = true;
8192638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    } else {
8202638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
8212638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                   CameraParameters::FALSE);
8222638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    }
8232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    autoWhiteBalanceLock = false;
8252638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    autoWhiteBalanceLockAvailable = false;
8262638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    camera_metadata_ro_entry_t whitebalanceLockAvailable =
8272638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        staticInfo(ANDROID_CONTROL_AWB_LOCK_AVAILABLE, 1, 1);
8282638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    if ((0 < whitebalanceLockAvailable.count) &&
8292638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev            (ANDROID_CONTROL_AWB_LOCK_AVAILABLE_TRUE ==
8302638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                    whitebalanceLockAvailable.data.u8[0])) {
8312638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
8322638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                CameraParameters::FALSE);
8332638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
8342638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                CameraParameters::TRUE);
8352638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        autoWhiteBalanceLockAvailable = true;
8362638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    } else {
8372638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
8382638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                CameraParameters::FALSE);
8392638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    }
8402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
8422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
843ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            max3aRegions.data.i32[Parameters::REGION_AE]);
8442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
8452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "(0,0,0,0,0)");
8462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    zoom = 0;
8485b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev    zoomAvailable = false;
8492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxDigitalZoom =
850d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM, /*minCount*/1, /*maxCount*/1);
8512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
8522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8535b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev    if (fabs(maxDigitalZoom.data.f[0] - 1.f) > 0.00001f) {
8545b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        params.set(CameraParameters::KEY_ZOOM, zoom);
8555b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
8565b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev
8575b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        {
8585b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            String8 zoomRatios;
8595b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            float zoom = 1.f;
8605b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
8615b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                    (NUM_ZOOM_STEPS-1);
8625b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            bool addComma = false;
8635b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
8645b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                if (addComma) zoomRatios += ",";
8655b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                addComma = true;
8665b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
8675b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                zoom += zoomIncrement;
8685b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            }
8695b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
8702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
8712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8725b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
8735b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                CameraParameters::TRUE);
8745b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        zoomAvailable = true;
8755b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev    } else {
8765b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
8775b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                CameraParameters::FALSE);
8785b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev    }
8792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
88082edd5431951f461058c07b73c0dbc093aa45c99Igor Murashkin            CameraParameters::FALSE);
8812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
8832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            "Infinity,Infinity,Infinity");
8842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
8862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fastInfo.maxFaces);
8872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
8882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            0);
8892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
8912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_ANDROID_OPAQUE);
8922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
893a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    recordingHint = false;
8942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
8952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
8962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
8972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
8982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::TRUE);
8992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
900a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    videoStabilization = false;
9012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
9022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            CameraParameters::FALSE);
9032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
905211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
906211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
9072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
9092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
9102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::TRUE);
9112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
9122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
9132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                CameraParameters::FALSE);
9142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
9152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Set up initial state for non-Camera.Parameters state variables
9178cca0750a84c2d97224c0cfef7cf255308ee80b3Chien-Yu Chen    videoFormat = HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED;
9182cbf6cea23539bfe99e36d1d221de62255452e86Eino-Ville Talvala    videoDataSpace = HAL_DATASPACE_V0_BT709;
919d56db1d2bee182d1851097a9c712712fc094d117Eino-Ville Talvala    videoBufferMode = hardware::ICamera::VIDEO_BUFFER_MODE_DATA_CALLBACK_YUV;
9202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    playShutterSound = true;
9212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFaceDetect = false;
9222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    enableFocusMoveMessages = false;
924da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    afTriggerCounter = 1;
9252b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    afStateCounter = 0;
9262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    currentAfTriggerId = -1;
927a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    afInMotion = false;
9282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
929da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    precaptureTriggerCounter = 1;
930da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
9312b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala    takePictureCounter = 0;
9322b07e0207da44d7b3cc63c369fd10c9f12a5e2cdEino-Ville Talvala
9332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    previewCallbackFlags = 0;
934a3ee047fd8e2a63253f70346925c3ffd069dfc99Eino-Ville Talvala    previewCallbackOneShot = false;
9353ee3550a2f529cbf56d87d8503f59a8f45dccf32Eino-Ville Talvala    previewCallbackSurface = false;
9362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
937355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    Size maxJpegSize = getMaxSize(getAvailableJpegSizes());
938355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(maxJpegSize);
939355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
940355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    slowJpegMode = false;
941355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    if (minFrameDurationNs > kSlowJpegModeThreshold) {
942355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        slowJpegMode = true;
943355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // Slow jpeg devices does not support video snapshot without
944355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // slowing down preview.
945355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        // TODO: support video size video snapshot only?
946355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
947355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            CameraParameters::FALSE);
948355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
949355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
9502efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    isZslReprocessPresent = false;
9512d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev    camera_metadata_ro_entry_t availableCapabilities =
9522d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev        staticInfo(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
9532d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev    if (0 < availableCapabilities.count) {
9542d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev        const uint8_t *caps = availableCapabilities.data.u8;
9552d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev        for (size_t i = 0; i < availableCapabilities.count; i++) {
9562d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev            if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ==
9577b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala                    caps[i]) {
9582d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev                isZslReprocessPresent = true;
9592d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev                break;
9602d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev            }
9612d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev        }
9622d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev    }
9632d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev
9647b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    isDistortionCorrectionSupported = false;
9657b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    camera_metadata_ro_entry_t distortionCorrectionModes =
9667b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala            staticInfo(ANDROID_DISTORTION_CORRECTION_AVAILABLE_MODES);
9677b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    for (size_t i = 0; i < distortionCorrectionModes.count; i++) {
9687b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala        if (distortionCorrectionModes.data.u8[i] !=
9697b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala                ANDROID_DISTORTION_CORRECTION_MODE_OFF) {
9707b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala            isDistortionCorrectionSupported = true;
9717b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala            break;
9727b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala        }
9737b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    }
9747b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala
975fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen    if (isDeviceZslSupported || slowJpegMode ||
976fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen            property_get_bool("camera.disable_zsl_mode", false)) {
977afada1e56cf0f91be5e44678850fcead2a70cca2Zhijun He        ALOGI("Camera %d: Disabling ZSL mode", cameraId);
978c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala        allowZslMode = false;
9792f93127de30bbe17707ca8923c486d4494ffda37Eino-Ville Talvala    } else {
9802d16ffaae63051b5faf7c39a455c6d5af0226377Emilian Peev        allowZslMode = isZslReprocessPresent;
981b075252349a4b40ddda791f2e1221ae0ce7e4cd1Eino-Ville Talvala    }
982e538206d15282afbc5b168d60b1026a5dfcd13c0James Painter
983c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    ALOGI("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode);
984355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
9852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    state = STOPPED;
9862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    paramsFlattened = params.flatten();
9882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
9902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
9912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville TalvalaString8 Parameters::get() const {
9938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    return paramsFlattened;
9948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
9958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
9962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::buildFastInfo() {
9972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
9982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t activeArraySize =
99903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        staticInfo(ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE, 2, 4);
10002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!activeArraySize.count) return NO_INIT;
100103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    int32_t arrayWidth;
100203e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    int32_t arrayHeight;
100303e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    if (activeArraySize.count == 2) {
1004e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray        ALOGW("%s: Camera %d: activeArraySize is missing xmin/ymin!",
1005e8fdbae47bf5793124f244c684ed597ebb78d3f5Alex Ray                __FUNCTION__, cameraId);
100603e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayWidth = activeArraySize.data.i32[0];
100703e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayHeight = activeArraySize.data.i32[1];
100803e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    } else if (activeArraySize.count == 4) {
100903e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayWidth = activeArraySize.data.i32[2];
101003e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray        arrayHeight = activeArraySize.data.i32[3];
101103e6579fc8d853ab6dd6b8ece10ebf4d434b1e17Alex Ray    } else return NO_INIT;
10122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    // We'll set the target FPS range for still captures to be as wide
10140181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    // as possible to give the HAL maximum latitude for exposure selection
10150181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    camera_metadata_ro_entry_t availableFpsRanges =
10160181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
10170181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    if (availableFpsRanges.count < 2 || availableFpsRanges.count % 2 != 0) {
10180181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        return NO_INIT;
10190181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
10200181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
10212efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    // Get supported preview fps ranges, up to default maximum.
102249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    Vector<Size> supportedPreviewSizes;
102349aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    Vector<FpsRange> supportedPreviewFpsRanges;
102449aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    const Size PREVIEW_SIZE_BOUND = { MAX_PREVIEW_WIDTH, MAX_PREVIEW_HEIGHT };
102549aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    status_t res = getFilteredSizes(PREVIEW_SIZE_BOUND, &supportedPreviewSizes);
102649aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    if (res != OK) return res;
102749aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    for (size_t i=0; i < availableFpsRanges.count; i += 2) {
102849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        if (!isFpsSupported(supportedPreviewSizes,
10292efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, availableFpsRanges.data.i32[i+1]) ||
10302efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                availableFpsRanges.data.i32[i+1] > MAX_DEFAULT_FPS) {
103149aac43b4a323a8702d93b7cf878252905dc3987Zhijun He            continue;
103249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        }
103349aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        FpsRange fpsRange = {availableFpsRanges.data.i32[i], availableFpsRanges.data.i32[i+1]};
103449aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        supportedPreviewFpsRanges.add(fpsRange);
103549aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    }
103649aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    if (supportedPreviewFpsRanges.size() == 0) {
103749aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        ALOGE("Supported preview fps range is empty");
103849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        return NO_INIT;
103949aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    }
104049aac43b4a323a8702d93b7cf878252905dc3987Zhijun He
10410181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    int32_t bestStillCaptureFpsRange[2] = {
104249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He        supportedPreviewFpsRanges[0].low, supportedPreviewFpsRanges[0].high
10430181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    };
10440181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    int32_t curRange =
10450181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            bestStillCaptureFpsRange[1] - bestStillCaptureFpsRange[0];
104649aac43b4a323a8702d93b7cf878252905dc3987Zhijun He    for (size_t i = 1; i < supportedPreviewFpsRanges.size(); i ++) {
10470181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        int32_t nextRange =
104849aac43b4a323a8702d93b7cf878252905dc3987Zhijun He                supportedPreviewFpsRanges[i].high -
104949aac43b4a323a8702d93b7cf878252905dc3987Zhijun He                supportedPreviewFpsRanges[i].low;
10500181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        if ( (nextRange > curRange) ||       // Maximize size of FPS range first
10510181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                (nextRange == curRange &&    // Then minimize low-end FPS
105249aac43b4a323a8702d93b7cf878252905dc3987Zhijun He                 bestStillCaptureFpsRange[0] > supportedPreviewFpsRanges[i].low)) {
10530181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
105449aac43b4a323a8702d93b7cf878252905dc3987Zhijun He            bestStillCaptureFpsRange[0] = supportedPreviewFpsRanges[i].low;
105549aac43b4a323a8702d93b7cf878252905dc3987Zhijun He            bestStillCaptureFpsRange[1] = supportedPreviewFpsRanges[i].high;
10560181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            curRange = nextRange;
10570181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        }
10580181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
10590181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala
10602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableFaceDetectModes =
1061211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_STATISTICS_INFO_AVAILABLE_FACE_DETECT_MODES, 0, 0,
1062211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
10632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    uint8_t bestFaceDetectMode =
1065d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
10662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (size_t i = 0 ; i < availableFaceDetectModes.count; i++) {
10672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        switch (availableFaceDetectModes.data.u8[i]) {
1068d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_OFF:
10692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1070d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE:
10712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (bestFaceDetectMode !=
1072d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_FULL) {
10732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    bestFaceDetectMode =
1074d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                        ANDROID_STATISTICS_FACE_DETECT_MODE_SIMPLE;
10752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
10762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
1077d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            case ANDROID_STATISTICS_FACE_DETECT_MODE_FULL:
10782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                bestFaceDetectMode =
1079d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                    ANDROID_STATISTICS_FACE_DETECT_MODE_FULL;
10802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
10812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            default:
10822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown face detect mode %d:",
10832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__, cameraId,
10842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        availableFaceDetectModes.data.u8[i]);
10852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return NO_INIT;
10862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
10872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
10882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1089211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    int32_t maxFaces = 0;
10902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t maxFacesDetected =
1091211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_STATISTICS_INFO_MAX_FACE_COUNT, 0, 1, false);
1092211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    if (maxFacesDetected.count) {
1093211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        maxFaces = maxFacesDetected.data.i32[0];
1094211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    }
10952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
10968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t availableSceneModes =
1097211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES, 0, 0, false);
10988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t sceneModeOverrides =
1099211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_SCENE_MODE_OVERRIDES, 0, 0, false);
11008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    camera_metadata_ro_entry_t minFocusDistance =
1101211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0, false);
1102211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray    bool fixedLens = minFocusDistance.count == 0 ||
1103211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        minFocusDistance.data.f[0] == 0;
11048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
1105176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala    camera_metadata_ro_entry_t focusDistanceCalibration =
1106176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            staticInfo(ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION, 0, 0,
1107176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    false);
1108176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala    bool canFocusInfinity = (focusDistanceCalibration.count &&
1109176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            focusDistanceCalibration.data.u8[0] !=
1110176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala            ANDROID_LENS_INFO_FOCUS_DISTANCE_CALIBRATION_UNCALIBRATED);
1111176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala
1112c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh
1113c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    camera_metadata_ro_entry_t hwLevel = staticInfo(ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL);
1114c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    if (!hwLevel.count) return NO_INIT;
1115c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    fastInfo.isExternalCamera =
1116c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            hwLevel.data.u8[0] == ANDROID_INFO_SUPPORTED_HARDWARE_LEVEL_EXTERNAL;
1117c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh
11181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    camera_metadata_ro_entry_t availableFocalLengths =
1119c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        staticInfo(ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS, 0, 0, /*required*/false);
1120c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    if (!availableFocalLengths.count && !fastInfo.isExternalCamera) return NO_INIT;
11211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
1122cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
1123cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    if (!availableFormats.size()) return NO_INIT;
11244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
11254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
11268a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeOverrides.count > 0) {
11278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // sceneModeOverrides is defined to have 3 entries for each scene mode,
11288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // which are AE, AWB, and AF override modes the HAL wants for that scene
11298a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // mode.
11308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        const size_t kModesPerSceneMode = 3;
11318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        if (sceneModeOverrides.count !=
11328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                availableSceneModes.count * kModesPerSceneMode) {
11338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Camera %d: Scene mode override list is an "
1134e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                    "unexpected size: %zu (expected %zu)", __FUNCTION__,
11358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    cameraId, sceneModeOverrides.count,
113619fdbfcf8af3ca689c3c62b88059ac5d3c6907d1Hubert Rzezniczak                    availableSceneModes.count * kModesPerSceneMode);
11378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return NO_INIT;
11388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
11398a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        for (size_t i = 0; i < availableSceneModes.count; i++) {
11408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            DeviceInfo::OverrideModes modes;
11418a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            uint8_t aeMode =
11428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 0];
11438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            switch(aeMode) {
1144d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON:
11458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_OFF;
11468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1147d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH:
11488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_AUTO;
11498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1150d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH:
11518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_ON;
11528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1153d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE:
11548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_RED_EYE;
11558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
11568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                default:
11578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    ALOGE("%s: Unknown override AE mode: %d", __FUNCTION__,
11588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            aeMode);
11598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.flashMode = FLASH_MODE_INVALID;
11608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
11618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            }
11628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            modes.wbMode =
11638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 1];
11648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            uint8_t afMode =
11658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    sceneModeOverrides.data.u8[i * kModesPerSceneMode + 2];
11668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            switch(afMode) {
1167d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_OFF:
1168176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    if (!fixedLens && !canFocusInfinity) {
1169176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                        ALOGE("%s: Camera %d: Scene mode override lists asks for"
1170176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                " fixed focus on a device with focuser but not"
1171176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                " calibrated for infinity focus", __FUNCTION__,
1172176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                                cameraId);
1173176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                        return NO_INIT;
1174176e4c253a63d581af6b21f3182d71b3026ef516Eino-Ville Talvala                    }
11758a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = fixedLens ?
11768a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            FOCUS_MODE_FIXED : FOCUS_MODE_INFINITY;
11778a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
1178d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_AUTO:
1179d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_MACRO:
1180d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_VIDEO:
1181d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_CONTINUOUS_PICTURE:
1182d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin                case ANDROID_CONTROL_AF_MODE_EDOF:
11838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = static_cast<focusMode_t>(afMode);
11848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
11858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                default:
11868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    ALOGE("%s: Unknown override AF mode: %d", __FUNCTION__,
11878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                            afMode);
11888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes.focusMode = FOCUS_MODE_INVALID;
11898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    break;
11908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            }
11918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            fastInfo.sceneModeOverrides.add(availableSceneModes.data.u8[i],
11928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    modes);
11938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
11948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
11958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
11962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayWidth = arrayWidth;
11972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.arrayHeight = arrayHeight;
11980181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    fastInfo.bestStillCaptureFpsRange[0] = bestStillCaptureFpsRange[0];
11990181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    fastInfo.bestStillCaptureFpsRange[1] = bestStillCaptureFpsRange[1];
12002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.bestFaceDetectMode = bestFaceDetectMode;
12012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    fastInfo.maxFaces = maxFaces;
12021f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
12031f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // Find smallest (widest-angle) focal length to use as basis of still
12041f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // picture FOV reporting.
1205c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    if (fastInfo.isExternalCamera) {
1206c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        fastInfo.minFocalLength = -1.0;
1207c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    } else {
1208c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        fastInfo.minFocalLength = availableFocalLengths.data.f[0];
1209c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        for (size_t i = 1; i < availableFocalLengths.count; i++) {
1210c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            if (fastInfo.minFocalLength > availableFocalLengths.data.f[i]) {
1211c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh                fastInfo.minFocalLength = availableFocalLengths.data.f[i];
1212c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            }
12131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        }
12141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
12151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
12164a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    // Check if the HAL supports HAL_PIXEL_FORMAT_YCbCr_420_888
12174a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    fastInfo.useFlexibleYuv = false;
1218cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    for (size_t i = 0; i < availableFormats.size(); i++) {
1219cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (availableFormats[i] == HAL_PIXEL_FORMAT_YCbCr_420_888) {
12204a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            fastInfo.useFlexibleYuv = true;
12214a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            break;
12224a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        }
12234a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    }
12244a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala    ALOGV("Camera %d: Flexible YUV %s supported",
12254a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            cameraId, fastInfo.useFlexibleYuv ? "is" : "is not");
12264a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala
1227c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    fastInfo.maxJpegSize = getMaxSize(getAvailableJpegSizes());
1228c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala
122966814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    isZslReprocessPresent = false;
123066814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    camera_metadata_ro_entry_t availableCapabilities =
123166814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        staticInfo(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
123266814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    if (0 < availableCapabilities.count) {
123366814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        const uint8_t *caps = availableCapabilities.data.u8;
123466814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        for (size_t i = 0; i < availableCapabilities.count; i++) {
123566814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh            if (ANDROID_REQUEST_AVAILABLE_CAPABILITIES_PRIVATE_REPROCESSING ==
12367b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala                    caps[i]) {
123766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh                isZslReprocessPresent = true;
123866814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh                break;
123966814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh            }
124066814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        }
124166814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    }
124266814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    if (isZslReprocessPresent) {
124366814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        Vector<StreamConfiguration> scs = getStreamConfigurations();
124466814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        Size maxPrivInputSize = {0, 0};
124566814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        for (const auto& sc : scs) {
124666814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh            if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_INPUT &&
124766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh                    sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED) {
124866814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh                if (sc.width * sc.height > maxPrivInputSize.width * maxPrivInputSize.height) {
124966814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh                    maxPrivInputSize = {sc.width, sc.height};
125066814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh                }
125166814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh            }
125266814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        }
125366814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        fastInfo.maxZslSize = maxPrivInputSize;
125466814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    } else {
125566814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh        fastInfo.maxZslSize = {0, 0};
125666814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh    }
125766814d4c3bb8819cc81f7fac208cc7936fa40f0dYin-Chia Yeh
12582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
12592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
12602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1261e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvalastatus_t Parameters::buildQuirks() {
1262e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    camera_metadata_ro_entry_t entry;
1263e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_TRIGGER_AF_WITH_AUTO);
1264e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    quirks.triggerAfWithAuto = (entry.count != 0 && entry.data.u8[0] == 1);
1265e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    ALOGV_IF(quirks.triggerAfWithAuto, "Camera %d: Quirk triggerAfWithAuto enabled",
1266e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            cameraId);
1267e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
1268e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_ZSL_FORMAT);
1269e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    quirks.useZslFormat = (entry.count != 0 && entry.data.u8[0] == 1);
1270e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    ALOGV_IF(quirks.useZslFormat, "Camera %d: Quirk useZslFormat enabled",
1271e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala            cameraId);
1272e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
12737373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    entry = info->find(ANDROID_QUIRKS_METERING_CROP_REGION);
12747373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    quirks.meteringCropRegion = (entry.count != 0 && entry.data.u8[0] == 1);
12757373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOGV_IF(quirks.meteringCropRegion, "Camera %d: Quirk meteringCropRegion"
12767373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                " enabled", cameraId);
12777373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
1278fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    entry = info->find(ANDROID_QUIRKS_USE_PARTIAL_RESULT);
1279fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    quirks.partialResults = (entry.count != 0 && entry.data.u8[0] == 1);
1280fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala    ALOGV_IF(quirks.partialResults, "Camera %d: Quirk usePartialResult"
1281fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala                " enabled", cameraId);
1282fd6ecdd39bd83ea020f78b425e96310380d66c35Eino-Ville Talvala
1283e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala    return OK;
1284e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala}
1285e382ee28709b83264a46b09e8f766c5ef42efa35Eino-Ville Talvala
12862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalacamera_metadata_ro_entry_t Parameters::staticInfo(uint32_t tag,
1287d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin        size_t minCount, size_t maxCount, bool required) const {
12882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t entry = info->find(tag);
128971c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev    const camera_metadata_t *metaBuffer = info->getAndLock();
12902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1291d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin    if (CC_UNLIKELY( entry.count == 0 ) && required) {
129271c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev        const char* tagSection = get_local_camera_metadata_section_name(tag,
129371c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev                metaBuffer);
12942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
129571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev        const char* tagName = get_local_camera_metadata_tag_name(tag,
129671c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev                metaBuffer);
12972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
12982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
12992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x)",
13002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag);
13012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else if (CC_UNLIKELY(
13022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
13032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
130471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev        const char* tagSection = get_local_camera_metadata_section_name(tag,
130571c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev                metaBuffer);
13062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
130771c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev        const char* tagName = get_local_camera_metadata_tag_name(tag,
130871c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev                metaBuffer);
13092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
13102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
1311e5729fac81c8a984e984fefc90afc64135817d4fColin Cross                "Expected between %zu and %zu values, but got %zu values",
13122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
13132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
131471c73a2985a7ac65ee597be3441ab300fa56e22eEmilian Peev    info->unlock(metaBuffer);
13152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return entry;
13172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
13182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalastatus_t Parameters::set(const String8& paramString) {
13202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    status_t res;
13212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    CameraParameters2 newParams(paramString);
13232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only parameters
13252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // such as supported preview sizes, etc. Should probably produce an error if
13262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // they're changed.
13272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Extract and verify new parameters */
13292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    size_t i;
13312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    Parameters validatedParams(*this);
13332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_SIZE
13352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewSize(&validatedParams.previewWidth,
13362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewHeight);
13372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
13382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewWidth != previewWidth ||
13392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewHeight != previewHeight) {
13402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
13412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
13422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
13432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
13442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    previewWidth, previewHeight,
13452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth, validatedParams.previewHeight);
13462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13483ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        for (i = 0; i < availablePreviewSizes.size(); i++) {
13493ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He            if ((availablePreviewSizes[i].width ==
13502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewWidth) &&
13513ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He                (availablePreviewSizes[i].height ==
13522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight)) break;
13532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13543ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        if (i == availablePreviewSizes.size()) {
13552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
13562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.previewWidth,
13572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewHeight);
13582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
13592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
13602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
13612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
1362af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    // RECORDING_HINT (always supported)
1363af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    validatedParams.recordingHint = boolFromString(
1364af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
13650b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    IF_ALOGV() { // Avoid unused variable warning
13660b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        bool recordingHintChanged =
13670b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.recordingHint != recordingHint;
13680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        if (recordingHintChanged) {
13690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: Recording hint changed to %d",
13700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__, validatedParams.recordingHint);
13710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
13720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
1373af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
13742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FPS_RANGE
1375d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
13760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
13770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Use the single FPS value if it was set later than the range.
13780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Otherwise, use the range value.
13790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
13800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    bool fpsUseSingleValue;
13810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    {
13820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        const char *fpsRange, *fpsSingle;
13830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1384b915da10831802013d670d6a316727e7b2e1a74eGigon Bae        fpsSingle = newParams.get(CameraParameters::KEY_PREVIEW_FRAME_RATE);
1385b915da10831802013d670d6a316727e7b2e1a74eGigon Bae        fpsRange = newParams.get(CameraParameters::KEY_PREVIEW_FPS_RANGE);
13860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
13870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        /**
13880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         * Pick either the range or the single key if only one was set.
13890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         *
13900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         * If both are set, pick the one that has greater set order.
13910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin         */
13920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        if (fpsRange == NULL && fpsSingle == NULL) {
13930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGE("%s: FPS was not set. One of %s or %s must be set.",
13940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__, CameraParameters::KEY_PREVIEW_FRAME_RATE,
13950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  CameraParameters::KEY_PREVIEW_FPS_RANGE);
13960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            return BAD_VALUE;
13970b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else if (fpsRange == NULL) {
13980b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = true;
13990b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: FPS range not set, using FPS single value",
14000b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__);
14010b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else if (fpsSingle == NULL) {
14020b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = false;
14030b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            ALOGV("%s: FPS single not set, using FPS range value",
14040b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                  __FUNCTION__);
14050b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        } else {
14060b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            int fpsKeyOrder;
14070b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            res = newParams.compareSetOrder(
14080b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    CameraParameters::KEY_PREVIEW_FRAME_RATE,
14090b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    CameraParameters::KEY_PREVIEW_FPS_RANGE,
14100b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                    &fpsKeyOrder);
14110b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            LOG_ALWAYS_FATAL_IF(res != OK, "Impossibly bad FPS keys");
14120b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
14130b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin            fpsUseSingleValue = (fpsKeyOrder > 0);
14140b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
14150b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        }
1416d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
14170b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS value is used from '%s'",
14180b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin              __FUNCTION__, fpsUseSingleValue ? "single" : "range");
14190b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
14202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPreviewFpsRange(&validatedParams.previewFpsRange[0],
14212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.previewFpsRange[1]);
14220b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
1423c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala    validatedParams.previewFpsRange[0] /= kFpsToApiScale;
1424c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala    validatedParams.previewFpsRange[1] /= kFpsToApiScale;
1425c9d7e4da3f963dadbea19e9b520fb7a7e28e614aEino-Ville Talvala
14260b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // Ignore the FPS range if the FPS single has higher precedence
14270b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (!fpsUseSingleValue) {
14280b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS range (%d, %d)", __FUNCTION__,
14290b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0],
14300b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1]);
1431d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
14322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availablePreviewFpsRanges =
14332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
14342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
14352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
14362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[0]) &&
14372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
14382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]) ) {
14392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
14402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
14412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
14432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
14442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.previewFpsRange[0],
14452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.previewFpsRange[1]);
14462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PREVIEW_FORMAT
14512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.previewFormat =
14522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            formatStringToEnum(newParams.getPreviewFormat());
14532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.previewFormat != previewFormat) {
14542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state >= PREVIEW) {
14552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
14562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "is active!", __FUNCTION__);
14572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
14582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1459cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        SortedVector<int32_t> availableFormats = getAvailableOutputFormats();
14604a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        // If using flexible YUV, always support NV21/YV12. Otherwise, check
14614a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        // HAL's list.
14624a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala        if (! (fastInfo.useFlexibleYuv &&
14634a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                (validatedParams.previewFormat ==
14644a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        HAL_PIXEL_FORMAT_YCrCb_420_SP ||
14654a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                 validatedParams.previewFormat ==
14664a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        HAL_PIXEL_FORMAT_YV12) ) ) {
14674a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            // Not using flexible YUV format, so check explicitly
1468cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            for (i = 0; i < availableFormats.size(); i++) {
1469cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                if (availableFormats[i] == validatedParams.previewFormat) break;
14704a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            }
1471cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if (i == availableFormats.size()) {
14724a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                ALOGE("%s: Requested preview format %s (0x%x) is not supported",
14734a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        __FUNCTION__, newParams.getPreviewFormat(),
14744a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                        validatedParams.previewFormat);
14754a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala                return BAD_VALUE;
14764a66ad403b21a256773c719ae39f7b5e705b244eEino-Ville Talvala            }
14772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
14782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
14792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
14800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // PREVIEW_FRAME_RATE Deprecated
14810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    // - Use only if the single FPS value was set later than the FPS range
14820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (fpsUseSingleValue) {
1483d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala        int previewFps = newParams.getPreviewFrameRate();
14840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        ALOGV("%s: Preview FPS single value requested: %d",
14850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin              __FUNCTION__, previewFps);
14860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        {
14872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableFrameRates =
14882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
1489af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            /**
1490af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * If recording hint is set, find the range that encompasses
1491af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * previewFps with the largest min index.
1492af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              *
1493af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * If recording hint is not set, find the range with previewFps
1494af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * with the smallest min index.
1495af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              *
1496af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * Either way, in case of multiple ranges, break the tie by
1497af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              * selecting the smaller range.
14982efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang              *
14992efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang              * Always select range within 30fps if one exists.
1500af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin              */
1501d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala
1502d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala            // all ranges which have previewFps
1503af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            Vector<Range> candidateRanges;
15042efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang            Vector<Range> candidateFastRanges;
15052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
1506af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                Range r = {
1507af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                            availableFrameRates.data.i32[i],
1508af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                            availableFrameRates.data.i32[i+1]
1509af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                };
15102efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                if (!isFpsSupported(availablePreviewSizes,
15112efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                        HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED, r.max)) {
15122efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                    continue;
15132efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                }
1514af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1515d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala                if (r.min <= previewFps && previewFps <= r.max) {
15162efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                    if (r.max <= MAX_DEFAULT_FPS) {
15172efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                        candidateRanges.push(r);
15182efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                    } else {
15192efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                        candidateFastRanges.push(r);
15202efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                    }
1521af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
15222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
15232efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang            if (candidateRanges.isEmpty() && candidateFastRanges.isEmpty()) {
15242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
1525d8a62e25ba6520c2531c7a3d32cc8066e1dab776Eino-Ville Talvala                        __FUNCTION__, previewFps);
15262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
15272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
1528af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
15292efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang            // most applicable range with targetFps
15302efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang            Vector<Range>& ranges =
15312efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                    candidateRanges.size() > 0 ? candidateRanges : candidateFastRanges;
15322efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang            Range bestRange = ranges[0];
15332efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang            for (i = 1; i < ranges.size(); ++i) {
15342efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang                Range r = ranges[i];
1535af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                // Find by largest minIndex in recording mode
1536af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                if (validatedParams.recordingHint) {
1537af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    if (r.min > bestRange.min) {
1538af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1539af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1540af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
1541af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1542af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1543af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
1544af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                // Find by smallest minIndex in preview mode
1545af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                else {
1546af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    if (r.min < bestRange.min) {
1547af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1548af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1549af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    else if (r.min == bestRange.min && r.max < bestRange.max) {
1550af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                        bestRange = r;
1551af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    }
1552af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                }
1553af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            }
1554af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
15552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[0] =
1556af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    bestRange.min;
15572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.previewFpsRange[1] =
1558af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                    bestRange.max;
1559af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
1560af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin            ALOGV("%s: New preview FPS range: %d, %d, recordingHint = %d",
1561af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                __FUNCTION__,
1562af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.previewFpsRange[0],
1563af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.previewFpsRange[1],
1564af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin                validatedParams.recordingHint);
15652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
15662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
15672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
15680b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    /**
15690b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Update Preview FPS and Preview FPS ranges based on
15700b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * what we actually set.
15710b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
15720b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * This updates the API-visible (Camera.Parameters#getParameters) values of
15730b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * the FPS fields, not only the internal versions.
15740b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *
15750b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * Order matters: The value that was set last takes precedence.
15760b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     * - If the client does a setParameters(getParameters()) we retain
15770b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     *   the same order for preview FPS.
15780b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin     */
15790b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    if (!fpsUseSingleValue) {
15800b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set fps single, then fps range (range wins)
15810b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFrameRate(
15820b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                fpsFromRange(/*min*/validatedParams.previewFpsRange[0],
15830b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                             /*max*/validatedParams.previewFpsRange[1]));
15840b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFpsRange(
15850b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0] * kFpsToApiScale,
15860b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1] * kFpsToApiScale);
15870b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    } else {
15880b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set fps range, then fps single (single wins)
15890b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFpsRange(
15900b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[0] * kFpsToApiScale,
15910b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                validatedParams.previewFpsRange[1] * kFpsToApiScale);
15920b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        // Set this to the same value, but with higher priority
15930b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin        newParams.setPreviewFrameRate(
15940b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin                newParams.getPreviewFrameRate());
15950b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin    }
15960b88a62d4d5ac1e515721e587cdf9bcec191812bIgor Murashkin
15972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // PICTURE_SIZE
15982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getPictureSize(&validatedParams.pictureWidth,
15992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.pictureHeight);
16003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (validatedParams.pictureWidth != pictureWidth ||
16013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh            validatedParams.pictureHeight != pictureHeight) {
1602cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        Vector<Size> availablePictureSizes = getAvailableJpegSizes();
1603cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        for (i = 0; i < availablePictureSizes.size(); i++) {
1604cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            if ((availablePictureSizes[i].width ==
16052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureWidth) &&
1606cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                (availablePictureSizes[i].height ==
16072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight)) break;
16082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1609cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        if (i == availablePictureSizes.size()) {
16102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
16112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.pictureWidth,
16122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.pictureHeight);
16132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
16182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[0] =
16192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
16202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegThumbSize[1] =
16212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
16222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegThumbSize[0] != jpegThumbSize[0] ||
16232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegThumbSize[1] != jpegThumbSize[1]) {
16242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableJpegThumbSizes =
16252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
16262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
16272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if ((availableJpegThumbSizes.data.i32[i] ==
16282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[0]) &&
16292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                (availableJpegThumbSizes.data.i32[i+1] ==
16302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1])) break;
16312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
16332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
16342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__, validatedParams.jpegThumbSize[0],
16352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.jpegThumbSize[1]);
16362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
1641c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    int quality = newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
1642c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    // also makes sure quality fits in uint8_t
1643c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    if (quality < 0 || quality > 100) {
16442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
1645c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala                __FUNCTION__, quality);
16462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
16472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1648c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    validatedParams.jpegThumbQuality = quality;
16492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // JPEG_QUALITY
1651c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    quality = newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
1652c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    // also makes sure quality fits in uint8_t
1653c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    if (quality < 0 || quality > 100) {
16542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
1655c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala                __FUNCTION__, quality);
16562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
16572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
1658c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    validatedParams.jpegQuality = quality;
16592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ROTATION
16612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.jpegRotation =
16622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
16632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.jpegRotation != 0 &&
16642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 90 &&
16652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 180 &&
16662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.jpegRotation != 270) {
16672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
16682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.jpegRotation);
16692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
16702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
16712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // GPS
16732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
16742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *gpsLatStr =
16752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
16762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (gpsLatStr != NULL) {
16772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsLongStr =
16782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
16792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsAltitudeStr =
16802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
16812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsTimeStr =
16822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
16832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *gpsProcMethodStr =
16842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
16852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (gpsLongStr == NULL ||
16862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsAltitudeStr == NULL ||
16872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsTimeStr == NULL ||
16882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                gpsProcMethodStr == NULL) {
16892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
16902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__);
16912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
16932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *endPtr;
16942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
16952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
16962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
16972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
16982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
16992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
17012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
17022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
17032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
17042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
17052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
17072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
17082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
17092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
17102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    gpsAltitudeStr);
17112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
17122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        errno = 0;
17142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
17152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
17162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
17172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
17182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsProcessingMethod = gpsProcMethodStr;
17202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = true;
17222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
17232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.gpsEnabled = false;
17242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EFFECT
17272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.effectMode = effectModeStringToEnum(
17282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
17292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.effectMode != effectMode) {
17302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableEffectModes =
17312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
17322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
17332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.effectMode == availableEffectModes.data.u8[i]) break;
17342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableEffectModes.count) {
17362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
17372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
17382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
17392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
17402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ANTIBANDING
17442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.antibandingMode = abModeStringToEnum(
17452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
17462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.antibandingMode != antibandingMode) {
17472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableAbModes =
17482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
17492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
17502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.antibandingMode == availableAbModes.data.u8[i])
17512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
17522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableAbModes.count) {
17542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
17552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
17562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
17572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
17582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // SCENE_MODE
17622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.sceneMode = sceneModeStringToEnum(
17632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
17642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.sceneMode != sceneMode &&
17652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.sceneMode !=
1766c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED) {
17672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t availableSceneModes =
17682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
17692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
17702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (validatedParams.sceneMode == availableSceneModes.data.u8[i])
17712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                break;
17722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (i == availableSceneModes.count) {
17742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
17752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
17762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
17772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
17782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
17792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
17808a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    bool sceneModeSet =
1781c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            validatedParams.sceneMode != ANDROID_CONTROL_SCENE_MODE_DISABLED;
17822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
17832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FLASH_MODE
17848a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
17858a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode =
17868a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
17878a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).flashMode;
17888a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
17898a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode = FLASH_MODE_INVALID;
17908a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
17918a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.flashMode == FLASH_MODE_INVALID) {
17928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.flashMode = flashModeStringToEnum(
17938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            newParams.get(CameraParameters::KEY_FLASH_MODE) );
17948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
17958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
17962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.flashMode != flashMode) {
17972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        camera_metadata_ro_entry_t flashAvailable =
1798d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            staticInfo(ANDROID_FLASH_INFO_AVAILABLE, 1, 1);
1799b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        bool isFlashAvailable =
1800b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala                flashAvailable.data.u8[0] == ANDROID_FLASH_INFO_AVAILABLE_TRUE;
1801b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        if (!isFlashAvailable &&
18022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                validatedParams.flashMode != Parameters::FLASH_MODE_OFF) {
18032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
18042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
18052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
18062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
18072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == Parameters::FLASH_MODE_RED_EYE) {
18082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t availableAeModes =
18092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
18102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
18112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (validatedParams.flashMode == availableAeModes.data.u8[i])
18122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    break;
18132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
18142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (i == availableAeModes.count) {
18152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
18162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
18172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
18182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
18192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
18202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (validatedParams.flashMode == -1) {
18212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
18222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,
18232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
18242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return BAD_VALUE;
18252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1826b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        // Update in case of override, but only if flash is supported
1827b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        if (isFlashAvailable) {
1828b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala            newParams.set(CameraParameters::KEY_FLASH_MODE,
1829b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala                    flashModeEnumToString(validatedParams.flashMode));
1830b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala        }
18318a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
18328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
18338a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    // WHITE_BALANCE
18348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
18358a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.wbMode =
18368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
18378a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).wbMode;
18388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
1839d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        validatedParams.wbMode = ANDROID_CONTROL_AWB_MODE_OFF;
18408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
1841d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    if (validatedParams.wbMode == ANDROID_CONTROL_AWB_MODE_OFF) {
18428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.wbMode = wbModeStringToEnum(
18438a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
18448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
18458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.wbMode != wbMode) {
18468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        camera_metadata_ro_entry_t availableWbModes =
1847211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES, 0, 0, false);
18488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
18498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            if (validatedParams.wbMode == availableWbModes.data.u8[i]) break;
18508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
18518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        if (i == availableWbModes.count) {
18528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
18538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__,
18548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
18558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return BAD_VALUE;
18568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        }
18578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // Update in case of override
18588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        newParams.set(CameraParameters::KEY_WHITE_BALANCE,
18598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                wbModeEnumToString(validatedParams.wbMode));
18602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
18612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
18622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_MODE
18638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (sceneModeSet) {
18648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode =
18658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                fastInfo.sceneModeOverrides.
18668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        valueFor(validatedParams.sceneMode).focusMode;
18678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    } else {
18688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode = FOCUS_MODE_INVALID;
18698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
18708a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (validatedParams.focusMode == FOCUS_MODE_INVALID) {
18718a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        validatedParams.focusMode = focusModeStringToEnum(
18728a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                newParams.get(CameraParameters::KEY_FOCUS_MODE) );
18738a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
18742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.focusMode != focusMode) {
18752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = -1;
18762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (validatedParams.focusMode != Parameters::FOCUS_MODE_FIXED) {
18772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            camera_metadata_ro_entry_t minFocusDistance =
1878211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                staticInfo(ANDROID_LENS_INFO_MINIMUM_FOCUS_DISTANCE, 0, 0,
1879211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                        false);
1880211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray            if (minFocusDistance.count && minFocusDistance.data.f[0] == 0) {
18812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
18822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        "fixed focus lens",
18832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        __FUNCTION__,
18842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
18852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                return BAD_VALUE;
18862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            } else if (validatedParams.focusMode !=
18872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    Parameters::FOCUS_MODE_INFINITY) {
18882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                camera_metadata_ro_entry_t availableFocusModes =
18892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
18902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
18912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    if (validatedParams.focusMode ==
18922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            availableFocusModes.data.u8[i]) break;
18932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
18942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                if (i == availableFocusModes.count) {
18952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
18962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            __FUNCTION__,
18972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
18982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    return BAD_VALUE;
18992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                }
19002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            }
19012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
1902d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        validatedParams.focusState = ANDROID_CONTROL_AF_STATE_INACTIVE;
190395069fefbdf54d87a624c2ac73727fce1c38545eEino-Ville Talvala        // Always reset shadow focus mode to avoid reverting settings
1904d6cc4a62f3d94cad4dd36bd0a844ba8764177d26Eino-Ville Talvala        validatedParams.shadowFocusMode = FOCUS_MODE_INVALID;
19058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        // Update in case of override
19068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        newParams.set(CameraParameters::KEY_FOCUS_MODE,
19078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                focusModeEnumToString(validatedParams.focusMode));
19082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {
19092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        validatedParams.currentAfTriggerId = currentAfTriggerId;
19102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // FOCUS_AREAS
19132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
19142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.focusingAreas);
1915ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAfRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
1916ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk              Parameters::NUM_REGION, Parameters::NUM_REGION).
1917ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk              data.i32[Parameters::REGION_AF];
19182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) res = validateAreas(validatedParams.focusingAreas,
1919ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            maxAfRegions, AREA_KIND_FOCUS);
19202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
19212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
19222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
19232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
19242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // EXPOSURE_COMPENSATION
19272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.exposureCompensation =
19282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
19292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t exposureCompensationRange =
1930d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        staticInfo(ANDROID_CONTROL_AE_COMPENSATION_RANGE);
19312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if ((validatedParams.exposureCompensation <
19322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[0]) ||
19332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        (validatedParams.exposureCompensation >
19342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            exposureCompensationRange.data.i32[1])) {
19352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
19362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, validatedParams.exposureCompensation);
19372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
19382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19402638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    if (autoExposureLockAvailable) {
19412638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        validatedParams.autoExposureLock = boolFromString(
19422638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev            newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
19432638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    } else if (nullptr !=
19442638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev            newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK)){
19452638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        ALOGE("%s: Requested auto exposure lock is not supported",
19462638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev              __FUNCTION__);
19472638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        return BAD_VALUE;
19482638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    }
19492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19502638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    if (autoWhiteBalanceLockAvailable) {
19512638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        validatedParams.autoWhiteBalanceLock = boolFromString(
19522638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
19532638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    } else if (nullptr !=
19542638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev           newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK)) {
19552638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        ALOGE("%s: Requested auto whitebalance lock is not supported",
19562638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev              __FUNCTION__);
19572638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        return BAD_VALUE;
19582638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    }
19592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // METERING_AREAS
1961ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAeRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
1962ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION).
1963ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            data.i32[Parameters::REGION_AE];
19642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
19652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.meteringAreas);
19662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res == OK) {
1967ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        res = validateAreas(validatedParams.meteringAreas, maxAeRegions,
19687d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                            AREA_KIND_METERING);
19692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (res != OK) {
19712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
19722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__,
19732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
19742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
19752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // ZOOM
19785b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev    if (zoomAvailable) {
19795b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        validatedParams.zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
19805b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        if (validatedParams.zoom < 0
19815b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                    || validatedParams.zoom >= (int)NUM_ZOOM_STEPS) {
19825b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            ALOGE("%s: Requested zoom level %d is not supported",
19835b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev                    __FUNCTION__, validatedParams.zoom);
19845b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev            return BAD_VALUE;
19855b3570dcede02e7427b0bf3350499974ec8c75c7Emilian Peev        }
19862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
19872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
19882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_SIZE
19892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    newParams.getVideoSize(&validatedParams.videoWidth,
19902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            &validatedParams.videoHeight);
19912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoWidth != videoWidth ||
19922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            validatedParams.videoHeight != videoHeight) {
19932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (state == RECORD) {
1994c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            ALOGW("%s: Video size cannot be updated (from %d x %d to %d x %d)"
1995c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    " when recording is active! Ignore the size update!",
1996c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    __FUNCTION__, videoWidth, videoHeight, validatedParams.videoWidth,
19972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    validatedParams.videoHeight);
1998c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            validatedParams.videoWidth = videoWidth;
1999c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            validatedParams.videoHeight = videoHeight;
2000c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            newParams.setVideoSize(videoWidth, videoHeight);
2001c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He        } else {
2002c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            for (i = 0; i < availableVideoSizes.size(); i++) {
2003c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                if ((availableVideoSizes[i].width ==
2004c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoWidth) &&
2005c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                    (availableVideoSizes[i].height ==
2006c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoHeight)) break;
2007c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            }
2008c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            if (i == availableVideoSizes.size()) {
2009c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                ALOGE("%s: Requested video size %d x %d is not supported",
2010c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        __FUNCTION__, validatedParams.videoWidth,
2011c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                        validatedParams.videoHeight);
2012c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He                return BAD_VALUE;
2013c572362427cdfda53142ad0b44818c269c1d9db1Zhijun He            }
20142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
20152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
20162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
20172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // VIDEO_STABILIZATION
20182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    validatedParams.videoStabilization = boolFromString(
20192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
20202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    camera_metadata_ro_entry_t availableVideoStabilizationModes =
2021211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES, 0, 0,
2022211a2ed2c05044a10c8619d1dba1070b72a8b256Alex Ray                false);
20232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (validatedParams.videoStabilization &&
20242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            availableVideoStabilizationModes.count == 1) {
20252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
20262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
20272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
20282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    /** Update internal parameters */
20292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
20302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    *this = validatedParams;
20313ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    updateOverriddenJpegSize();
20322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
20331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /** Update external parameters calculated from the internal ones */
20341f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
20351f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // HORIZONTAL/VERTICAL FIELD OF VIEW
20361f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizFov, vertFov;
20371f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    res = calculatePictureFovs(&horizFov, &vertFov);
20381f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (res != OK) {
20391f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        ALOGE("%s: Can't calculate FOVs", __FUNCTION__);
20401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        // continue so parameters are at least consistent
20411f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
20421f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE,
20431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            horizFov);
20441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    newParams.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE,
20451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            vertFov);
20461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Current still picture FOV: %f x %f deg", horizFov, vertFov);
20471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
20488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    // Need to flatten again in case of overrides
20498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    paramsFlattened = newParams.flatten();
20508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    params = newParams;
20518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
20522efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    slowJpegMode = false;
20532efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    Size pictureSize = { pictureWidth, pictureHeight };
20542efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    int64_t minFrameDurationNs = getJpegStreamMinFrameDurationNs(pictureSize);
20552efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    if (previewFpsRange[1] > 1e9/minFrameDurationNs + FPS_MARGIN) {
20562efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang        slowJpegMode = true;
20572efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    }
2058fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen    if (isDeviceZslSupported || slowJpegMode ||
2059fa52c0fd3ce1bb23450b9b9a188aa3e66e36d613Chien-Yu Chen            property_get_bool("camera.disable_zsl_mode", false)) {
20602efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang        allowZslMode = false;
20612efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    } else {
20622efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang        allowZslMode = isZslReprocessPresent;
20632efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    }
20642efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang    ALOGV("%s: allowZslMode: %d slowJpegMode %d", __FUNCTION__, allowZslMode, slowJpegMode);
20652efd6be69a00b55bd2c20f27a99039b5ac2c5ff3Shuzhen Wang
20662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
20672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
20682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
2069da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvalastatus_t Parameters::updateRequest(CameraMetadata *request) const {
2070da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    ATRACE_CALL();
2071da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    status_t res;
2072da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
207303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    /**
207403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * Mixin default important security values
207503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * - android.led.transmit = defaulted ON
207603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     */
207703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    camera_metadata_ro_entry_t entry = staticInfo(ANDROID_LED_AVAILABLE_LEDS,
2078d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*minimumCount*/0,
2079d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*maximumCount*/0,
2080d8c7ad1cbc2e6830560a085380a5828cc3d41010Igor Murashkin                                                  /*required*/false);
208103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    for(size_t i = 0; i < entry.count; ++i) {
208203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        uint8_t led = entry.data.u8[i];
208303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
208403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        switch(led) {
208503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            // Transmit LED is unconditionally on when using
208603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            // the android.hardware.Camera API
208703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            case ANDROID_LED_AVAILABLE_LEDS_TRANSMIT: {
208803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                uint8_t transmitDefault = ANDROID_LED_TRANSMIT_ON;
208903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                res = request->update(ANDROID_LED_TRANSMIT,
209003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                                      &transmitDefault, 1);
209103ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                if (res != OK) return res;
209203ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin                break;
209303ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin            }
209403ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin        }
209503ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    }
209603ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
209703ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin    /**
209803ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     * Construct metadata from parameters
209903ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin     */
210003ac850527ffb90348dcdaad95caceb97649fd6bIgor Murashkin
2101d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t metadataMode = ANDROID_REQUEST_METADATA_MODE_FULL;
2102da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_REQUEST_METADATA_MODE,
2103da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &metadataMode, 1);
2104da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2105da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
21060181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    camera_metadata_entry_t intent =
21070181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala            request->find(ANDROID_CONTROL_CAPTURE_INTENT);
2108c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi
2109c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi    if (intent.count == 0) return BAD_VALUE;
2110c90f4c7c5838e4dee2f550c4d581e7205e666faaYuvraj Pasi
21117b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    uint8_t distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_OFF;
21120181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    if (intent.data.u8[0] == ANDROID_CONTROL_CAPTURE_INTENT_STILL_CAPTURE) {
21130181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
21140181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                fastInfo.bestStillCaptureFpsRange, 2);
21157b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala        distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_HIGH_QUALITY;
21160181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    } else {
21170181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala        res = request->update(ANDROID_CONTROL_AE_TARGET_FPS_RANGE,
21180181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala                previewFpsRange, 2);
21197b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala        distortionMode = ANDROID_DISTORTION_CORRECTION_MODE_FAST;
21200181fde7bd20238cb13ae2665f0e5bfe7c2d9ac8Eino-Ville Talvala    }
2121da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2122da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
21237b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    if (isDistortionCorrectionSupported) {
21247b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala        res = request->update(ANDROID_DISTORTION_CORRECTION_MODE,
21257b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala                &distortionMode, 1);
21267b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala        if (res != OK) return res;
21277b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala    }
21287b8a1fd27d12d1b3ea711b0edca6ff5b07f5beb1Eino-Ville Talvala
21292638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    if (autoWhiteBalanceLockAvailable) {
21302638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        uint8_t reqWbLock = autoWhiteBalanceLock ?
21312638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                ANDROID_CONTROL_AWB_LOCK_ON : ANDROID_CONTROL_AWB_LOCK_OFF;
21322638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        res = request->update(ANDROID_CONTROL_AWB_LOCK,
21332638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                &reqWbLock, 1);
21342638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    }
213596150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala
2136da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_EFFECT_MODE,
2137da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &effectMode, 1);
2138da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2139da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_ANTIBANDING_MODE,
2140da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &antibandingMode, 1);
2141da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2142da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
214361c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // android.hardware.Camera requires that when face detect is enabled, the
2144d309fb9c8a2c4564d88fffba19c4e3688e4b862bEino-Ville Talvala    // camera is in a face-priority mode. HAL3.x splits this into separate parts
214561c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // (face detection statistics and face priority scene mode). Map from other
214661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    // to the other.
21478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    bool sceneModeActive =
2148c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            sceneMode != (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
2149d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqControlMode = ANDROID_CONTROL_MODE_AUTO;
21508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (enableFaceDetect || sceneModeActive) {
2151d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        reqControlMode = ANDROID_CONTROL_MODE_USE_SCENE_MODE;
215261c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    }
2153da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_MODE,
2154da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqControlMode, 1);
2155da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
215661c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala
2157d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala    uint8_t reqSceneMode =
21588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            sceneModeActive ? sceneMode :
2159d14de47262340d70fc11fe56159462b9b981067fEino-Ville Talvala            enableFaceDetect ? (uint8_t)ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY :
2160c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            (uint8_t)ANDROID_CONTROL_SCENE_MODE_DISABLED;
216161c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_SCENE_MODE,
216261c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala            &reqSceneMode, 1);
216361c0cc6af2c64d280bcfc1fcca3e3589172a5817Eino-Ville Talvala    if (res != OK) return res;
2164da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2165d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqFlashMode = ANDROID_FLASH_MODE_OFF;
2166d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqAeMode = ANDROID_CONTROL_AE_MODE_OFF;
2167da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    switch (flashMode) {
2168da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
2169d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON; break;
2170da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
2171d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH; break;
2172da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_ON:
2173d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_ALWAYS_FLASH; break;
2174da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
2175d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON;
2176d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqFlashMode = ANDROID_FLASH_MODE_TORCH;
2177da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
2178da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
2179d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqAeMode = ANDROID_CONTROL_AE_MODE_ON_AUTO_FLASH_REDEYE; break;
2180da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        default:
2181da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
2182da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala                    cameraId, flashMode);
21838a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                return BAD_VALUE;
2184da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2185da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_FLASH_MODE,
2186da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFlashMode, 1);
2187da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2188da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_MODE,
2189da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqAeMode, 1);
2190da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2191da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
21922638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    if (autoExposureLockAvailable) {
21932638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        uint8_t reqAeLock = autoExposureLock ?
21942638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                ANDROID_CONTROL_AE_LOCK_ON : ANDROID_CONTROL_AE_LOCK_OFF;
21952638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        res = request->update(ANDROID_CONTROL_AE_LOCK,
21962638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev                &reqAeLock, 1);
21972638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev        if (res != OK) return res;
21982638f7216de92f254a50dd55be1539f1c6b23552Emilian Peev    }
21998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
22008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AWB_MODE,
22018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            &wbMode, 1);
22028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    if (res != OK) return res;
220396150cfc6b9ae93b6c4b60b5c7889a7a90af5defEino-Ville Talvala
2204da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    float reqFocusDistance = 0; // infinity focus in diopters
2205d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    uint8_t reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
2206da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    switch (focusMode) {
2207da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2208da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2209da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2210da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2211da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2212da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusMode = focusMode;
2213da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
2214da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2215da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2216d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            reqFocusMode = ANDROID_CONTROL_AF_MODE_OFF;
2217da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            break;
2218da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        default:
22198a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
22208a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                        cameraId, focusMode);
22218a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                return BAD_VALUE;
2222da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2223da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_LENS_FOCUS_DISTANCE,
2224da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFocusDistance, 1);
2225da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2226da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_MODE,
2227da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFocusMode, 1);
2228da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2229da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2230da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t reqFocusingAreasSize = focusingAreas.size() * 5;
2231da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t *reqFocusingAreas = new int32_t[reqFocusingAreasSize];
2232894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He    for (size_t i = 0, j = 0; i < reqFocusingAreasSize; i += 5, j++) {
2233894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        if (focusingAreas[j].weight != 0) {
2234da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 0] =
2235894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedXToArray(focusingAreas[j].left);
2236da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 1] =
2237894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedYToArray(focusingAreas[j].top);
2238da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 2] =
2239894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedXToArray(focusingAreas[j].right);
2240da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 3] =
2241894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                    normalizedYToArray(focusingAreas[j].bottom);
2242da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
2243da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 0] = 0;
2244da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 1] = 0;
2245da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 2] = 0;
2246da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas[i + 3] = 0;
2247da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
2248894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        reqFocusingAreas[i + 4] = focusingAreas[j].weight;
2249da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2250da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AF_REGIONS,
2251da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqFocusingAreas, reqFocusingAreasSize);
2252da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2253da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    delete[] reqFocusingAreas;
2254da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2255d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    res = request->update(ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION,
2256da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &exposureCompensation, 1);
2257da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2258da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2259da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    size_t reqMeteringAreasSize = meteringAreas.size() * 5;
2260da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    int32_t *reqMeteringAreas = new int32_t[reqMeteringAreasSize];
2261894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He    for (size_t i = 0, j = 0; i < reqMeteringAreasSize; i += 5, j++) {
2262894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        if (meteringAreas[j].weight != 0) {
2263da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 0] =
2264894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedXToArray(meteringAreas[j].left);
2265da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 1] =
2266894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedYToArray(meteringAreas[j].top);
2267da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 2] =
2268894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedXToArray(meteringAreas[j].right);
2269da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 3] =
2270894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He                normalizedYToArray(meteringAreas[j].bottom);
22710a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X            // Requested size may be zero by rounding error with/without zooming.
22720a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X            // The ae regions should be at least 1 if metering width/height is not zero.
22730a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X            if (reqMeteringAreas[i + 0] == reqMeteringAreas[i + 2]) {
22740a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X                reqMeteringAreas[i + 2]++;
22750a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X            }
22760a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X            if (reqMeteringAreas[i + 1] == reqMeteringAreas[i + 3]) {
22770a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X                reqMeteringAreas[i + 3]++;
22780a484a048208b130c13ba1ee959b6c6a45c446b3Nobuo, Ishii X            }
2279da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        } else {
2280da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 0] = 0;
2281da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 1] = 0;
2282da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 2] = 0;
2283da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas[i + 3] = 0;
2284da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala        }
2285894fb7bc41dc8c3b8fb7d21ba24a5777c4347a5bZhijun He        reqMeteringAreas[i + 4] = meteringAreas[j].weight;
2286da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    }
2287da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_AE_REGIONS,
2288da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            reqMeteringAreas, reqMeteringAreasSize);
2289da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2290da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2291ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    // Set awb regions to be the same as the metering regions if allowed
2292ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    size_t maxAwbRegions = (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS,
2293ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            Parameters::NUM_REGION, Parameters::NUM_REGION).
2294ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            data.i32[Parameters::REGION_AWB];
2295ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    if (maxAwbRegions > 0) {
2296ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        if (maxAwbRegions >= meteringAreas.size()) {
2297ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2298ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk                    reqMeteringAreas, reqMeteringAreasSize);
2299ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        } else {
2300ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            // Ensure the awb regions are zeroed if the region count is too high.
2301ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            int32_t zeroedAwbAreas[5] = {0, 0, 0, 0, 0};
2302ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk            res = request->update(ANDROID_CONTROL_AWB_REGIONS,
2303ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk                    zeroedAwbAreas, sizeof(zeroedAwbAreas)/sizeof(int32_t));
2304ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        }
2305ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk        if (res != OK) return res;
2306ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk    }
2307ce6249980434dd04e0eac397083d917cdc4452e9Ruben Brunk
2308da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    delete[] reqMeteringAreas;
2309da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2310d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion crop = calculateCropRegion(/*previewOnly*/ false);
231105bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin    int32_t reqCropRegion[4] = {
2312c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala        static_cast<int32_t>(crop.left),
2313c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala        static_cast<int32_t>(crop.top),
231405bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin        static_cast<int32_t>(crop.width),
231505bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin        static_cast<int32_t>(crop.height)
2316c695b7c660e1fe62fca35c6b25c1849f3c81a49fEino-Ville Talvala    };
2317da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_SCALER_CROP_REGION,
231805bbae99e0fc30ffdef8a3c5037fb3db7c55211bIgor Murashkin            reqCropRegion, 4);
2319da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2320da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2321da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t reqVstabMode = videoStabilization ?
2322d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_ON :
2323d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE_OFF;
2324da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    res = request->update(ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2325da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqVstabMode, 1);
2326da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2327da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2328da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    uint8_t reqFaceDetectMode = enableFaceDetect ?
2329da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            fastInfo.bestFaceDetectMode :
2330d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            (uint8_t)ANDROID_STATISTICS_FACE_DETECT_MODE_OFF;
2331d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin    res = request->update(ANDROID_STATISTICS_FACE_DETECT_MODE,
2332da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala            &reqFaceDetectMode, 1);
2333da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    if (res != OK) return res;
2334da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2335da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala    return OK;
2336da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala}
2337da6665cbd06ca58d3357c3002b7366d13e23f152Eino-Ville Talvala
2338ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvalastatus_t Parameters::updateRequestJpeg(CameraMetadata *request) const {
2339ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    status_t res;
2340ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2341ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_SIZE,
2342ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            jpegThumbSize, 2);
2343ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2344ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_THUMBNAIL_QUALITY,
2345ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegThumbQuality, 1);
2346ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2347ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(ANDROID_JPEG_QUALITY,
2348ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegQuality, 1);
2349ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2350ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    res = request->update(
2351ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2352ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala            &jpegRotation, 1);
2353ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (res != OK) return res;
2354ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2355ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    if (gpsEnabled) {
2356ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2357ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2358ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                gpsCoordinates, 3);
2359ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2360ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2361ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2362ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                &gpsTimestamp, 1);
2363ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2364ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->update(
2365ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2366ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala                gpsProcessingMethod);
2367ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2368ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    } else {
2369ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_COORDINATES);
2370ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2371ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_TIMESTAMP);
2372ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2373ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        res = request->erase(ANDROID_JPEG_GPS_PROCESSING_METHOD);
2374ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala        if (res != OK) return res;
2375ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    }
2376ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala    return OK;
2377ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala}
2378ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
23793ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::overrideJpegSizeByVideoSize() {
23803ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (pictureSizeOverriden) {
23813ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has been overridden. Skip overriding");
23823ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
23833ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
23843ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
23853ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = true;
23863ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
23873ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
23883ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = videoWidth;
23893ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = videoHeight;
23903ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    // This change of picture size is invisible to app layer.
23913ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    // Do not update app visible params
23923ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
23933ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
23943ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
23953ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::updateOverriddenJpegSize() {
23963ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (!pictureSizeOverriden) {
23973ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has not been overridden. Skip checking");
23983ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
23993ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
24003ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
24013ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidthLastSet = pictureWidth;
24023ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeightLastSet = pictureHeight;
24033ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
24043ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (pictureWidth <= videoWidth && pictureHeight <= videoHeight) {
24053ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        // Picture size is now smaller than video size. No need to override anymore
24063ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return recoverOverriddenJpegSize();
24073ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
24083ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
24093ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = videoWidth;
24103ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = videoHeight;
24113ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
24123ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
24133ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
24143ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh
24153ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yehstatus_t Parameters::recoverOverriddenJpegSize() {
24163ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    if (!pictureSizeOverriden) {
24173ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        ALOGV("Picture size has not been overridden. Skip recovering");
24183ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh        return OK;
24193ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    }
24203ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureSizeOverriden = false;
24213ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureWidth = pictureWidthLastSet;
24223ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    pictureHeight = pictureHeightLastSet;
24233ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh    return OK;
24243ea3fcd0822b2f43d87f1d8f67d7bf145864b201Yin-Chia Yeh}
2425ec7710898208162576c3242f5a590651ab42aa2dEino-Ville Talvala
2426092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yehbool Parameters::isJpegSizeOverridden() {
2427092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh    return pictureSizeOverriden;
2428092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh}
2429092d49c26d77fafad5170bf709c2a716ec335855Yin-Chia Yeh
2430c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvalabool Parameters::useZeroShutterLag() const {
2431c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    // If ZSL mode is disabled, don't use it
2432c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    if (!allowZslMode) return false;
2433c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    // If recording hint is enabled, don't do ZSL
2434c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    if (recordingHint) return false;
2435c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    // If still capture size is no bigger than preview or video size,
2436c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    // don't do ZSL
2437c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    if (pictureWidth <= previewWidth || pictureHeight <= previewHeight ||
2438c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala            pictureWidth <= videoWidth || pictureHeight <= videoHeight) {
2439c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala        return false;
2440c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    }
2441c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    // If still capture size is less than quarter of max, don't do ZSL
2442c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    if ((pictureWidth * pictureHeight) <
2443c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala            (fastInfo.maxJpegSize.width * fastInfo.maxJpegSize.height / 4) ) {
2444c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala        return false;
2445c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    }
2446c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala    return true;
2447c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala}
2448c451d0f8098c9efd21d796e32f739af1915f9abaEino-Ville Talvala
24492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::getStateName(State state) {
24502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
24512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(state) {
24522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(DISCONNECTED)
24532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
24542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
24552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
24562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
24572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
24582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
24592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
24602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return "Unknown state!";
24612e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
24632e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala#undef CASE_ENUM_TO_CHAR
24642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::formatStringToEnum(const char *format) {
2467b2119af7f4ced0ecfefd4c7388f86b4e3a3ea7d8Ruben Brunk    return CameraParameters::previewFormatToEnum(format);
24682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
24692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
24702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaconst char* Parameters::formatEnumToString(int format) {
24712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    const char *fmt;
24722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    switch(format) {
24732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
24742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
24752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
24772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
24782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
24802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
24812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
24832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
24842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
24862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
24872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
24892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
24902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
2491a97dfeb91aae9569ff11a5a40634e2960c03915eEino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW16:
24922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
24932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
24942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
24952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        default:
24962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
24972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                    __FUNCTION__,  format);
24982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            fmt = NULL;
24992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            break;
25002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
25012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return fmt;
25022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::wbModeStringToEnum(const char *wbMode) {
25052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
25064a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !wbMode ?
2507d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
25082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
2509d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_AUTO :
25102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
2511d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_INCANDESCENT :
25122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
2513d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_FLUORESCENT :
25142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
2515d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT :
25162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
2517d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_DAYLIGHT :
25182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
2519d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT :
25202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
2521d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_TWILIGHT :
25222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
2523d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AWB_MODE_SHADE :
25242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
25252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25278a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char* Parameters::wbModeEnumToString(uint8_t wbMode) {
25288a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (wbMode) {
2529d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_AUTO:
25308a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_AUTO;
2531d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_INCANDESCENT:
25328a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_INCANDESCENT;
2533d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_FLUORESCENT:
25348a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_FLUORESCENT;
2535d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_WARM_FLUORESCENT:
25368a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
2537d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_DAYLIGHT:
25388a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_DAYLIGHT;
2539d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_CLOUDY_DAYLIGHT:
25408a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
2541d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_TWILIGHT:
25428a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_TWILIGHT;
2543d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin        case ANDROID_CONTROL_AWB_MODE_SHADE:
25448a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::WHITE_BALANCE_SHADE;
25458a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
25468a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown AWB mode enum: %d",
25478a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, wbMode);
25488a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
25498a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
25508a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
25518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
25522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::effectModeStringToEnum(const char *effectMode) {
25532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
25544a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !effectMode ?
2555d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
25562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
2557d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_OFF :
25582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
2559d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_MONO :
25602e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
2561d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_NEGATIVE :
25622e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
2563d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SOLARIZE :
25642e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
2565d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_SEPIA :
25662e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
2567d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_POSTERIZE :
25682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
2569d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_WHITEBOARD :
25702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
2571d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_BLACKBOARD :
25722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
2573d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_EFFECT_MODE_AQUA :
25742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
25752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::abModeStringToEnum(const char *abMode) {
25782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
25794a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !abMode ?
2580d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
25812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
2582d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_AUTO :
25832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
2584d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_OFF :
25852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
2586d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_50HZ :
25872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
2588d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            ANDROID_CONTROL_AE_ANTIBANDING_MODE_60HZ :
25892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
25902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
25912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
25922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::sceneModeStringToEnum(const char *sceneMode) {
25932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
25944a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !sceneMode ?
2595c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED :
25962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
2597c69b91ceae6255e41c5413796fb0ed4f7af45b15Ruben Brunk            ANDROID_CONTROL_SCENE_MODE_DISABLED :
25982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
25992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
26002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
26012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
26022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
26032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
26042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
26052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
26062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
26072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
26082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
26092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
26102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
26112e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
26122e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
26132e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
26142e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
26152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
26162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
26172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
26182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
26192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
26202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
26212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
26222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
26232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
26242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
26252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
26262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
26272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
2628af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_HDR) ?
2629af2645a679a61c8e8199d43d29b8b5ead5723b25Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_HDR:
26302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        -1;
26312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::flashMode_t Parameters::flashModeStringToEnum(
26342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *flashMode) {
26352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
26364a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !flashMode ?
2637b5bd1df2d6c78f8db5e7f6b416353ca8a93b7119Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
26382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
26392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
26402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
26412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
26422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
26432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
26442e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
26452e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
26462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
26472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
26482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
26492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26518a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::flashModeEnumToString(flashMode_t flashMode) {
26528a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (flashMode) {
26538a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_OFF:
26548a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_OFF;
26558a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_AUTO:
26568a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_AUTO;
26578a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_ON:
26588a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_ON;
26598a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_RED_EYE:
26608a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_RED_EYE;
26618a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FLASH_MODE_TORCH:
26628a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FLASH_MODE_TORCH;
26638a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
26648a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown flash mode enum %d",
26658a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, flashMode);
26668a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
26678a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
26688a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
26698a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
26702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville TalvalaParameters::Parameters::focusMode_t Parameters::focusModeStringToEnum(
26712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char *focusMode) {
26722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return
26734a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala        !focusMode ?
26744a02cc818607c0c145f91c3acb9181868a108f26Eino-Ville Talvala            Parameters::FOCUS_MODE_INVALID :
26752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
26762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
26772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
26782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
26792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
26802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
26812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
26822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
26832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
26842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
26852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
26862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
26872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
26882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
26892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
26902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
26912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
26928a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvalaconst char *Parameters::focusModeEnumToString(focusMode_t focusMode) {
26938a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    switch (focusMode) {
26948a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_AUTO:
26958a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_AUTO;
26968a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_MACRO:
26978a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_MACRO;
26988a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_VIDEO:
26998a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
27008a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_CONTINUOUS_PICTURE:
27018a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
27028a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_EDOF:
27038a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_EDOF;
27048a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_INFINITY:
27058a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_INFINITY;
27068a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        case FOCUS_MODE_FIXED:
27078a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return CameraParameters::FOCUS_MODE_FIXED;
27088a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala        default:
27098a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            ALOGE("%s: Unknown focus mode enum: %d",
27108a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala                    __FUNCTION__, focusMode);
27118a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala            return "unknown";
27128a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala    }
27138a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala}
27148a42dd8cd1a245d844f96cfd67dc342d7937e353Eino-Ville Talvala
27152e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::parseAreas(const char *areasCStr,
27162e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
27172e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
27182e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    areas->clear();
27192e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areasCStr == NULL) {
27202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
27212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push();
27222e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return OK;
27232e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
27242e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    String8 areasStr(areasCStr);
27252e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
27262e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    while (areaStart != 0) {
27272e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
27282e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        char *numEnd;
27292e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        int vals[NUM_FIELDS];
27302e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
27312e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            errno = 0;
27322e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
27332e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
27342e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            area = numEnd + 1;
27352e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
27362e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areas->push(Parameters::Area(
27372e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
27382e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
27392e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
27402e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
27412e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
27422e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
27432e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalastatus_t Parameters::validateAreas(const Vector<Parameters::Area> &areas,
27447d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                                      size_t maxRegions,
27457d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin                                      AreaKind areaKind) const {
27462e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // Definition of valid area can be found in
27472e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    // include/camera/CameraParameters.h
27482e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
27492e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() == 1) {
27502e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (areas[0].left == 0 &&
27512e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].top == 0 &&
27522e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].right == 0 &&
27532e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].bottom == 0 &&
27542e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                areas[0].weight == 0) {
27552e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
27562e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return OK;
27572e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
27582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
27597d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin
27607d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    // fixed focus can only set (0,0,0,0,0) focus area
27617d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    if (areaKind == AREA_KIND_FOCUS && focusMode == FOCUS_MODE_FIXED) {
27627d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin        return BAD_VALUE;
27637d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin    }
27647d2a4aaaf5691ee523fc0d03c286620f392ed16fIgor Murashkin
27652e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (areas.size() > maxRegions) {
2766e5729fac81c8a984e984fefc90afc64135817d4fColin Cross        ALOGE("%s: Too many areas requested: %zu",
27672e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala                __FUNCTION__, areas.size());
27682e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        return BAD_VALUE;
27692e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
27702e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
27712e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
27722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala         a != areas.end(); a++) {
27732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
27742e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
27752e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
27762e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
27772e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
27782e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
27792e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
27802e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
27812e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return OK;
27822e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
27832e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
27842e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalabool Parameters::boolFromString(const char *boolStr) {
27852e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return !boolStr ? false :
27862e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
27872e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        false;
27882e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
27892e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
27902e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvalaint Parameters::degToTransform(int degrees, bool mirror) {
27912e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    if (!mirror) {
27922e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) return 0;
27932e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
27942e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
27952e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
27962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
27972e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
27982e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
27992e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
28002e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
28012e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
28022e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
28032e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
28042e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
28052e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala        }
28062e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    }
28072e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
28082e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala    return -1;
28092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
28102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
28117373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropXToArray(int x) const {
28127373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(x >= 0, "Crop-relative X coordinate = '%d' is out of bounds"
28137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin                         "(lower = 0)", x);
28147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
2815d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
28167373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(x < previewCrop.width, "Crop-relative X coordinate = '%d' "
28171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                    "is out of bounds (upper = %f)", x, previewCrop.width);
28187373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = x + previewCrop.left;
28207373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28217373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayWidth),
28227373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "Calculated pixel array value X = '%d' is out of bounds (upper = %d)",
28237373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        ret, fastInfo.arrayWidth);
28247373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
28257373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
28267373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28277373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::cropYToArray(int y) const {
28287373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(y >= 0, "Crop-relative Y coordinate = '%d' is out of bounds "
28297373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "(lower = 0)", y);
28307373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
2831d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
28327373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT(y < previewCrop.height, "Crop-relative Y coordinate = '%d' is "
28331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                "out of bounds (upper = %f)", y, previewCrop.height);
28347373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28357373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    int ret = y + previewCrop.top;
28367373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28377373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    ALOG_ASSERT( (ret >= 0 && ret < fastInfo.arrayHeight),
28387373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        "Calculated pixel array value Y = '%d' is out of bounds (upper = %d)",
28397373cbe85e617345f7002256a4be389fe62af913Igor Murashkin        ret, fastInfo.arrayHeight);
28407373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28417373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return ret;
28427373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28437373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
28447373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28457373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedXToCrop(int x) const {
2846d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
28477373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return (x + 1000) * (previewCrop.width - 1) / 2000;
28487373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
28497373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28507373cbe85e617345f7002256a4be389fe62af913Igor Murashkinint Parameters::normalizedYToCrop(int y) const {
2851d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    CropRegion previewCrop = calculateCropRegion(/*previewOnly*/ true);
28527373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    return (y + 1000) * (previewCrop.height - 1) / 2000;
28537373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
28547373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28555e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedXToArray(int x) const {
28567373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28575e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    // Work-around for HAL pre-scaling the coordinates themselves
28585e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    if (quirks.meteringCropRegion) {
28595e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (x + 1000) * (fastInfo.arrayWidth - 1) / 2000;
28605e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    }
28617373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28625e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    return cropXToArray(normalizedXToCrop(x));
28637373cbe85e617345f7002256a4be389fe62af913Igor Murashkin}
28647373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28655e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::normalizedYToArray(int y) const {
28667373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
28677373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
28685e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (y + 1000) * (fastInfo.arrayHeight - 1) / 2000;
28697373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
28707373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28715e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    return cropYToArray(normalizedYToCrop(y));
28722e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
28732e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
28747373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28755e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu ChenParameters::CropRegion Parameters::calculatePreviewCrop(
28765e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        const CropRegion &scalerCrop) const {
28775e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    float left, top, width, height;
28785e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    float previewAspect = static_cast<float>(previewWidth) / previewHeight;
28795e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    float cropAspect = scalerCrop.width / scalerCrop.height;
28807373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28815e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    if (previewAspect > cropAspect) {
28825e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        width = scalerCrop.width;
28835e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        height = cropAspect * scalerCrop.height / previewAspect;
28845e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen
28855e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        left = scalerCrop.left;
28865e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        top = scalerCrop.top + (scalerCrop.height - height) / 2;
28875e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    } else {
28885e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        width = previewAspect * scalerCrop.width / cropAspect;
28895e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        height = scalerCrop.height;
28905e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen
28915e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        left = scalerCrop.left + (scalerCrop.width - width) / 2;
28925e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        top = scalerCrop.top;
28937373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
28947373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
28955e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    CropRegion previewCrop = {left, top, width, height};
28962e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
28975e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    return previewCrop;
28985e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen}
28997373cbe85e617345f7002256a4be389fe62af913Igor Murashkin
29005e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayXToNormalizedWithCrop(int x,
29015e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        const CropRegion &scalerCrop) const {
29027373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
29037373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
29045e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return x * 2000 / (fastInfo.arrayWidth - 1) - 1000;
29055e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    } else {
29065e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        CropRegion previewCrop = calculatePreviewCrop(scalerCrop);
29075e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (x - previewCrop.left) * 2000 / (previewCrop.width - 1) - 1000;
29087373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
29092e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
29102e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
29115e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chenint Parameters::arrayYToNormalizedWithCrop(int y,
29125e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        const CropRegion &scalerCrop) const {
29137373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    // Work-around for HAL pre-scaling the coordinates themselves
29147373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    if (quirks.meteringCropRegion) {
29155e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return y * 2000 / (fastInfo.arrayHeight - 1) - 1000;
29165e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen    } else {
29175e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        CropRegion previewCrop = calculatePreviewCrop(scalerCrop);
29185e15b80e801a0110bc1bad1190f02cb9c7d22e37Chien-Yu Chen        return (y - previewCrop.top) * 2000 / (previewCrop.height - 1) - 1000;
29197373cbe85e617345f7002256a4be389fe62af913Igor Murashkin    }
29202e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}
29212e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala
29220cbfbf3624c67cf40a18d5405a46d002aa12a048Zhijun Hestatus_t Parameters::getFilteredSizes(Size limit, Vector<Size> *sizes) {
29233ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (info == NULL) {
29243ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("%s: Static metadata is not initialized", __FUNCTION__);
29253ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return NO_INIT;
29263ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
29273ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (sizes == NULL) {
29283ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("%s: Input size is null", __FUNCTION__);
29293ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return BAD_VALUE;
29303ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
2931cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    sizes->clear();
2932cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
29337e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    Vector<StreamConfiguration> scs = getStreamConfigurations();
29347e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    for (size_t i=0; i < scs.size(); i++) {
29357e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev        const StreamConfiguration &sc = scs[i];
29367e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev        if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
29377e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev                sc.format == HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED &&
29387e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev                sc.width <= limit.width && sc.height <= limit.height) {
2939c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            int64_t minFrameDuration = getMinFrameDurationNs(
2940c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh                    {sc.width, sc.height}, HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
2941c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            if (minFrameDuration > MAX_PREVIEW_RECORD_DURATION_NS) {
2942c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh                // Filter slow sizes from preview/record
2943c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh                continue;
2944c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            }
2945c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            sizes->push({sc.width, sc.height});
2946cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
29473ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
2948cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
29493ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    if (sizes->isEmpty()) {
29503ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        ALOGE("generated preview size list is empty!!");
29513ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He        return BAD_VALUE;
29523ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    }
29533ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He    return OK;
29543ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He}
29553ef464e095da6c5d1acb5723dbc4b9f7cfd4ecf8Zhijun He
29569fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun HeParameters::Size Parameters::getMaxSizeForRatio(
29579fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        float ratio, const int32_t* sizeArray, size_t count) {
29589fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(sizeArray != NULL, "size array shouldn't be NULL");
29599fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    ALOG_ASSERT(count >= 2 && count % 2 == 0, "count must be a positive even number");
29609fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
29619fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    Size maxSize = {0, 0};
29629fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    for (size_t i = 0; i < count; i += 2) {
29639fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        if (sizeArray[i] > 0 && sizeArray[i+1] > 0) {
29649fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            float curRatio = static_cast<float>(sizeArray[i]) / sizeArray[i+1];
29659fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            if (fabs(curRatio - ratio) < ASPECT_RATIO_TOLERANCE && maxSize.width < sizeArray[i]) {
29669fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                maxSize.width = sizeArray[i];
29679fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                maxSize.height = sizeArray[i+1];
29689fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He            }
29699fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        }
29709fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    }
29719fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
29729fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    if (maxSize.width == 0 || maxSize.height == 0) {
29739fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        maxSize.width = sizeArray[0];
29749fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        maxSize.height = sizeArray[1];
29759fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He        ALOGW("Unable to find the size to match the given aspect ratio %f."
29769fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He                "Fall back to %d x %d", ratio, maxSize.width, maxSize.height);
29779fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    }
29789fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
29799fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He    return maxSize;
29809fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He}
29819fc79c6fccc41255bb4f3538e2a21b01db8dc2dcZhijun He
2982355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia YehParameters::Size Parameters::getMaxSize(const Vector<Parameters::Size> &sizes) {
2983355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    Size maxSize = {-1, -1};
2984355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    for (size_t i = 0; i < sizes.size(); i++) {
2985355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        if (sizes[i].width > maxSize.width ||
2986355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh                (sizes[i].width == maxSize.width && sizes[i].height > maxSize.height )) {
2987355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh            maxSize = sizes[i];
2988355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh        }
2989355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    }
2990355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    return maxSize;
2991355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh}
2992355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
2993cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::StreamConfiguration> Parameters::getStreamConfigurations() {
2994cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_CONFIGURATION_SIZE = 4;
2995cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_FORMAT_OFFSET = 0;
2996cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_WIDTH_OFFSET = 1;
2997cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_HEIGHT_OFFSET = 2;
2998cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    const int STREAM_IS_INPUT_OFFSET = 3;
2999cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<StreamConfiguration> scs;
3000cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
3001cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    camera_metadata_ro_entry_t availableStreamConfigs =
3002cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh                staticInfo(ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS);
3003355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh    for (size_t i = 0; i < availableStreamConfigs.count; i+= STREAM_CONFIGURATION_SIZE) {
3004cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t format = availableStreamConfigs.data.i32[i + STREAM_FORMAT_OFFSET];
3005cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t width = availableStreamConfigs.data.i32[i + STREAM_WIDTH_OFFSET];
3006cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t height = availableStreamConfigs.data.i32[i + STREAM_HEIGHT_OFFSET];
3007cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        int32_t isInput = availableStreamConfigs.data.i32[i + STREAM_IS_INPUT_OFFSET];
3008cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        StreamConfiguration sc = {format, width, height, isInput};
3009cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        scs.add(sc);
3010cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
3011cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return scs;
3012cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
3013cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
3014355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yehint64_t Parameters::getJpegStreamMinFrameDurationNs(Parameters::Size size) {
30157e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    return getMinFrameDurationNs(size, HAL_PIXEL_FORMAT_BLOB);
3016355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh}
3017355d9c6b74cd22a88fc7d1c9ba2e928ba566c69eYin-Chia Yeh
30184f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun Heint64_t Parameters::getMinFrameDurationNs(Parameters::Size size, int fmt) {
30194f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    const int STREAM_DURATION_SIZE = 4;
30204f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    const int STREAM_FORMAT_OFFSET = 0;
30214f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    const int STREAM_WIDTH_OFFSET = 1;
30224f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    const int STREAM_HEIGHT_OFFSET = 2;
30234f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    const int STREAM_DURATION_OFFSET = 3;
30244f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    camera_metadata_ro_entry_t availableStreamMinDurations =
30254f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He                staticInfo(ANDROID_SCALER_AVAILABLE_MIN_FRAME_DURATIONS);
30264f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    for (size_t i = 0; i < availableStreamMinDurations.count; i+= STREAM_DURATION_SIZE) {
30274f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        int64_t format = availableStreamMinDurations.data.i64[i + STREAM_FORMAT_OFFSET];
30284f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        int64_t width = availableStreamMinDurations.data.i64[i + STREAM_WIDTH_OFFSET];
30294f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        int64_t height = availableStreamMinDurations.data.i64[i + STREAM_HEIGHT_OFFSET];
30304f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        int64_t duration = availableStreamMinDurations.data.i64[i + STREAM_DURATION_OFFSET];
30314f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        if (format == fmt && width == size.width && height == size.height) {
30324f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            return duration;
30334f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        }
30344f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    }
30354f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He
30364f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    return -1;
30374f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He}
30384f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He
30394f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun Hebool Parameters::isFpsSupported(const Vector<Size> &sizes, int format, int32_t fps) {
30404f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    // Get min frame duration for each size and check if the given fps range can be supported.
30414f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    for (size_t i = 0 ; i < sizes.size(); i++) {
30424f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        int64_t minFrameDuration = getMinFrameDurationNs(sizes[i], format);
30434f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        if (minFrameDuration <= 0) {
30444f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            ALOGE("Min frame duration (%" PRId64") for size (%dx%d) and format 0x%x is wrong!",
30454f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He                minFrameDuration, sizes[i].width, sizes[i].height, format);
30464f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            return false;
30474f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        }
30484f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        int32_t maxSupportedFps = 1e9 / minFrameDuration;
304984eb96049ce0690334530ad916e22d6933c0223bZhijun He        // Add some margin here for the case where the hal supports 29.xxxfps.
305084eb96049ce0690334530ad916e22d6933c0223bZhijun He        maxSupportedFps += FPS_MARGIN;
30514f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        if (fps > maxSupportedFps) {
30524f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He            return false;
30534f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He        }
30544f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    }
30554f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He    return true;
30564f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He}
30574f5dc7799f082d77e399d8beee7b017a02755cf6Zhijun He
3058cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehSortedVector<int32_t> Parameters::getAvailableOutputFormats() {
3059cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    SortedVector<int32_t> outputFormats; // Non-duplicated output formats
30607e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    Vector<StreamConfiguration> scs = getStreamConfigurations();
30617e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    for (size_t i = 0; i < scs.size(); i++) {
30627e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev        const StreamConfiguration &sc = scs[i];
30637e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev        if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT) {
30647e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev            outputFormats.add(sc.format);
3065cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
3066cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
30677e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev
3068cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return outputFormats;
3069cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
3070cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
3071cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia YehVector<Parameters::Size> Parameters::getAvailableJpegSizes() {
3072cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    Vector<Parameters::Size> jpegSizes;
30737e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    Vector<StreamConfiguration> scs = getStreamConfigurations();
30747e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev    for (size_t i = 0; i < scs.size(); i++) {
30757e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev        const StreamConfiguration &sc = scs[i];
30767e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev        if (sc.isInput == ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT &&
30777e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev                sc.format == HAL_PIXEL_FORMAT_BLOB) {
30787e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev            Size sz = {sc.width, sc.height};
3079cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh            jpegSizes.add(sz);
3080cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh        }
3081cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    }
30827e8d4590f75afc2b271e7d2e5762ac43d56728dbEmilian Peev
3083cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh    return jpegSizes;
3084cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh}
3085cd8fce8fbe0f515e53a0ea0f50b739cf42ee57a4Yin-Chia Yeh
3086d48521fc2f7c34623a745728a07dad728da49254Eino-Ville TalvalaParameters::CropRegion Parameters::calculateCropRegion(bool previewOnly) const {
3087018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3088018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
3089018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3090018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // Need to convert zoom index into a crop rectangle. The rectangle is
3091018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // chosen to maximize its area on the sensor
3092018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3093018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    camera_metadata_ro_entry_t maxDigitalZoom =
3094d32b99b1a87497280add6efc0e99bd383e402de1Igor Murashkin            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);
3095018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // For each zoom step by how many pixels more do we change the zoom
3096018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
3097018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin            (NUM_ZOOM_STEPS-1);
3098018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // The desired activeAreaWidth/cropAreaWidth ratio (or height if h>w)
3099018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    // via interpolating zoom step into a zoom ratio
3100018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    float zoomRatio = 1 + zoomIncrement * zoom;
3101018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOG_ASSERT( (zoomRatio >= 1.f && zoomRatio <= maxDigitalZoom.data.f[0]),
3102018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        "Zoom ratio calculated out of bounds. Expected 1 - %f, actual: %f",
3103018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        maxDigitalZoom.data.f[0], zoomRatio);
3104018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3105018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOGV("Zoom maxDigital=%f, increment=%f, ratio=%f, previewWidth=%d, "
3106018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          "previewHeight=%d, activeWidth=%d, activeHeight=%d",
3107018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          maxDigitalZoom.data.f[0], zoomIncrement, zoomRatio, previewWidth,
3108018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin          previewHeight, fastInfo.arrayWidth, fastInfo.arrayHeight);
3109018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3110d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    if (previewOnly) {
3111d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        // Calculate a tight crop region for the preview stream only
3112d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        float previewRatio = static_cast<float>(previewWidth) / previewHeight;
3113018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3114d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        /* Ensure that the width/height never go out of bounds
3115d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * by scaling across a diffent dimension if an out-of-bounds
3116d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * possibility exists.
3117d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         *
3118d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * e.g. if the previewratio < arrayratio and e.g. zoomratio = 1.0, then by
3119d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * calculating the zoomWidth from zoomHeight we'll actually get a
3120d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         * zoomheight > arrayheight
3121d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala         */
3122d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        float arrayRatio = 1.f * fastInfo.arrayWidth / fastInfo.arrayHeight;
3123d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        if (previewRatio >= arrayRatio) {
3124d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            // Adjust the height based on the width
3125d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomWidth =  fastInfo.arrayWidth / zoomRatio;
3126d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomHeight = zoomWidth *
3127d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala                    previewHeight / previewWidth;
3128018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3129d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        } else {
3130d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            // Adjust the width based on the height
3131d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomHeight = fastInfo.arrayHeight / zoomRatio;
3132d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala            zoomWidth = zoomHeight *
3133d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala                    previewWidth / previewHeight;
3134018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        }
3135018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    } else {
3136d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        // Calculate the global crop region with a shape matching the active
3137d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        // array.
3138d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala        zoomWidth = fastInfo.arrayWidth / zoomRatio;
3139018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        zoomHeight = fastInfo.arrayHeight / zoomRatio;
3140018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    }
3141d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala
3142d48521fc2f7c34623a745728a07dad728da49254Eino-Ville Talvala    // center the zoom area within the active area
3143018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    zoomLeft = (fastInfo.arrayWidth - zoomWidth) / 2;
3144018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    zoomTop = (fastInfo.arrayHeight - zoomHeight) / 2;
3145018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3146018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    ALOGV("Crop region calculated (x=%d,y=%d,w=%f,h=%f) for zoom=%d",
3147018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin        (int32_t)zoomLeft, (int32_t)zoomTop, zoomWidth, zoomHeight, this->zoom);
3148018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
3149018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    CropRegion crop = { zoomLeft, zoomTop, zoomWidth, zoomHeight };
3150018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin    return crop;
3151018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin}
3152018d228ac43a8da7d5f36e45fd105c9baf2490a0Igor Murashkin
31531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvalastatus_t Parameters::calculatePictureFovs(float *horizFov, float *vertFov)
31541f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        const {
3155c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    if (fastInfo.isExternalCamera) {
3156c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        if (horizFov != NULL) {
3157c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            *horizFov = -1.0;
3158c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        }
3159c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        if (vertFov != NULL) {
3160c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh            *vertFov = -1.0;
3161c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        }
3162c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh        return OK;
3163c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh    }
3164c3e9d6f704f7bf9e94c8447aa2f0f21e750c08beYin-Chia Yeh
31651f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    camera_metadata_ro_entry_t sensorSize =
31661f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            staticInfo(ANDROID_SENSOR_INFO_PHYSICAL_SIZE, 2, 2);
31671f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
31681f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
31691bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    camera_metadata_ro_entry_t pixelArraySize =
31701bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen            staticInfo(ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE, 2, 2);
31711bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    if (!pixelArraySize.count) return NO_INIT;
31721bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen
31731f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float arrayAspect = static_cast<float>(fastInfo.arrayWidth) /
31741f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            fastInfo.arrayHeight;
31751f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float stillAspect = static_cast<float>(pictureWidth) / pictureHeight;
31761f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Array aspect: %f, still aspect: %f", arrayAspect, stillAspect);
31771f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
31781f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // The crop factors from the full sensor array to the still picture crop
31791f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    // region
31801f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float horizCropFactor = 1.f;
31811f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    float vertCropFactor = 1.f;
31821f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
31831f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /**
31841f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Need to calculate the still image field of view based on the total pixel
31851f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * array field of view, and the relative aspect ratios of the pixel array
31861f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * and output streams.
31871f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     *
31881f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Special treatment for quirky definition of crop region and relative
31891f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * stream cropping.
31901f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     */
31911f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (quirks.meteringCropRegion) {
3192c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // Use max of preview and video as first crop
3193c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        float previewAspect = static_cast<float>(previewWidth) / previewHeight;
3194c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        float videoAspect = static_cast<float>(videoWidth) / videoHeight;
3195c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (videoAspect > previewAspect) {
3196c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            previewAspect = videoAspect;
3197c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        }
3198c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // First crop sensor to preview aspect ratio
3199c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (arrayAspect < previewAspect) {
3200c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            vertCropFactor = arrayAspect / previewAspect;
3201c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        } else {
3202c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            horizCropFactor = previewAspect / arrayAspect;
3203c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        }
3204c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        // Second crop to still aspect ratio
3205c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        if (stillAspect < previewAspect) {
3206c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            horizCropFactor *= stillAspect / previewAspect;
3207c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray        } else {
3208c3624cbf410c8915a103fcb3dacaab583badcfe0Alex Ray            vertCropFactor *= previewAspect / stillAspect;
32091f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        }
32101f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    } else {
32111f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        /**
32121f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * Crop are just a function of just the still/array relative aspect
32131f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * ratios. Since each stream will maximize its area within the crop
32141f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * region, and for FOV we assume a full-sensor crop region, we only ever
32151f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         * crop the FOV either vertically or horizontally, never both.
32161f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala         */
32171f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        horizCropFactor = (arrayAspect > stillAspect) ?
32181f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                (stillAspect / arrayAspect) : 1.f;
32191f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        vertCropFactor = (arrayAspect < stillAspect) ?
32201f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                (arrayAspect / stillAspect) : 1.f;
32211f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
32221bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen
32231bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    /**
32241bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen     * Convert the crop factors w.r.t the active array size to the crop factors
32251bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen     * w.r.t the pixel array size.
32261bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen     */
32271bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    horizCropFactor *= (static_cast<float>(fastInfo.arrayWidth) /
32281bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen                            pixelArraySize.data.i32[0]);
32291bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen    vertCropFactor *= (static_cast<float>(fastInfo.arrayHeight) /
32301bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen                            pixelArraySize.data.i32[1]);
32311bbc1c93b5db545e503dc27c262eef38685d0726Chien-Yu Chen
32321f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    ALOGV("Horiz crop factor: %f, vert crop fact: %f",
32331f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala            horizCropFactor, vertCropFactor);
32341f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    /**
32351f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * Basic field of view formula is:
32361f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     *   angle of view = 2 * arctangent ( d / 2f )
32371f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * where d is the physical sensor dimension of interest, and f is
32381f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * the focal length. This only applies to rectilinear sensors, for focusing
32391f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     * at distances >> f, etc.
32401f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala     */
32411f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (horizFov != NULL) {
32421f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        *horizFov = 180 / M_PI * 2 *
32431f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                atanf(horizCropFactor * sensorSize.data.f[0] /
32441f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                        (2 * fastInfo.minFocalLength));
32451f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
32461f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    if (vertFov != NULL) {
32471f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala        *vertFov = 180 / M_PI * 2 *
32481f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                atanf(vertCropFactor * sensorSize.data.f[1] /
32491f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala                        (2 * fastInfo.minFocalLength));
32501f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    }
32511f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala    return OK;
32521f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala}
32531f1872f1e1f3705e235ce784ce6d79102d26c117Eino-Ville Talvala
3254ddf3c5025e2f6f35a4c188c19f30142c64a092c4Igor Murashkinint32_t Parameters::fpsFromRange(int32_t /*min*/, int32_t max) const {
3255af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin    return max;
3256af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin}
3257af3d28870f7890370d6acb21d20cf1ccab4b9e08Igor Murashkin
32582e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace camera2
32592e19c3c02957208371cdd491e6342ea7ddb440d9Eino-Ville Talvala}; // namespace android
3260