Camera2Client.cpp revision be0573b93e2d6fa133579c885583af9ed16bc29d
161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala/*
261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Copyright (C) 2012 The Android Open Source Project
361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Licensed under the Apache License, Version 2.0 (the "License");
561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * you may not use this file except in compliance with the License.
661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * You may obtain a copy of the License at
761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *      http://www.apache.org/licenses/LICENSE-2.0
961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala *
1061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * Unless required by applicable law or agreed to in writing, software
1161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * distributed under the License is distributed on an "AS IS" BASIS,
1261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * See the License for the specific language governing permissions and
1461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala * limitations under the License.
1561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala */
1661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
1761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define LOG_TAG "Camera2Client"
18a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#define ATRACE_TAG ATRACE_TAG_CAMERA
1961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala//#define LOG_NDEBUG 0
20a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala
21f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <utils/Log.h>
22a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala#include <utils/Trace.h>
2361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <cutils/properties.h>
2561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/SurfaceTextureClient.h>
2661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include <gui/Surface.h>
2761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
28f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala#include <math.h>
29f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
3061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#include "Camera2Client.h"
3161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalanamespace android {
3361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG1(...) ALOGD_IF(gLogLevel >= 1, __VA_ARGS__);
3561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala#define ALOG2(...) ALOGD_IF(gLogLevel >= 2, __VA_ARGS__);
3661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingPid() {
3861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingPid();
3961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatic int getCallingUid() {
4261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return IPCThreadState::self()->getCallingUid();
4361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
4461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// Interface used by CameraService
4661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::Camera2Client(const sp<CameraService>& cameraService,
4861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        const sp<ICameraClient>& cameraClient,
4961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraId,
5061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int cameraFacing,
5161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        int clientPid):
5261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala        Client(cameraService, cameraClient,
53f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                cameraId, cameraFacing, clientPid),
546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState(NOT_INITIALIZED),
55d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId(NO_STREAM),
56d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewRequest(NULL),
57d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId(NO_STREAM),
58d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureRequest(NULL)
59f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
60a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
62f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
63f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
67a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
69f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
70f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
86f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGD("%s", mParamsFlattened.string());
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
9361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
9461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
96a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
974ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
984ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
99f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
101f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
1023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
10361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
106611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1073297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
108611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
109611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
110611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append(getStateName(mState));
1157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
1187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewWidth, mParameters.previewHeight);
1197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
12011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.previewFpsRange[0], mParameters.previewFpsRange[1]);
1217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
1227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewFormat);
12311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
12411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.previewTransform);
1257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
1267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.pictureWidth, mParameters.pictureHeight);
1277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
12811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.jpegThumbSize[0], mParameters.jpegThumbSize[1]);
1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.jpegQuality, mParameters.jpegThumbQuality);
1317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", mParameters.jpegRotation);
1327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.gpsEnabled ? "enabled" : "disabled");
1347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    if (mParameters.gpsEnabled) {
1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
13611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                mParameters.gpsCoordinates[0], mParameters.gpsCoordinates[1],
13711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                mParameters.gpsCoordinates[2]);
1387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsTimestamp);
1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsProcessingMethod.string());
1427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.wbMode) {
1467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.effectMode) {
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.antibandingMode) {
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.sceneMode) {
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.flashMode) {
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.focusMode) {
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].left,
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].top,
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].right,
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].bottom,
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].weight);
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.exposureCompensation);
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoExposureLock ? "enabled" : "disabled",
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].left,
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].top,
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].right,
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].bottom,
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].weight);
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2533297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", mParameters.zoom);
2543297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", mParameters.videoWidth,
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoHeight);
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.recordingHint ? "set" : "not set");
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoStabilization ? "enabled" : "disabled");
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
2663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
2683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mPreviewRequest != NULL) {
2693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
2703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        dump_camera_metadata(mPreviewRequest, fd, 2);
2723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
2743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mCaptureRequest != NULL) {
2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
2793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        dump_camera_metadata(mCaptureRequest, fd, 2);
2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
287611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
2887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
297611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
29861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3004ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) {
3014ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
3024ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    switch(state) {
3034ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
3044ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
3054ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
3064ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
3074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
3084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
3094ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
3104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        default:
3114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return "Unknown state!";
3124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            break;
3134ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
3144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR
3154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala}
3164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
31761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
31861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
31961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
320a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
321ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
322ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
324f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
325ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
3266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
327d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mDevice->waitUntilDrained();
328d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
329d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
334d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
335d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
33961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
34061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
34161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
343a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
344ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
345ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
34661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
34761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
34861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
350a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
351ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
352ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
35361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
35461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
35561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
357a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
358ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
359ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
36061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
36161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
36261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
3646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
365a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
366ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
367ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
368ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    if (mState >= PREVIEW) return INVALID_OPERATION;
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
3726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
3746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
3756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
377d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder,window);
37861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
37961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
3816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
382a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
383ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
384ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
385ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    if (mState >= PREVIEW) return INVALID_OPERATION;
3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
3886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
3896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
3906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
3916db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
3926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
393d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder, window);
3946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
3956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
396d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
397be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
398a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
405d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
406be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
407be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
408be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
410be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
411be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
4126db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
4136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
414be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
415be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
4166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
4176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
418be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
4196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
421bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
422be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
423bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
4246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
425d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return startPreviewLocked();
4266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
42961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
432a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
433ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
43461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
437a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
438ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
439d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return startPreviewLocked();
440d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
441ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
442d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() {
443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
4446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (mState >= PREVIEW) {
4464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
4474ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                __FUNCTION__, getStateName(mState));
4484ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
4494ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
451be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
4526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
455be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mState = STOPPED;
4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
457be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updatePreviewStream();
458be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
459be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
460be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
461be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
4626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
464be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewRequest == NULL) {
465be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updatePreviewRequest();
466be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
467be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
468be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
470be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mPreviewRequest,
474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mPreviewStreamId, 1);
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
4776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
480be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
481be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mPreviewRequest);
482be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
484be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
490bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
491bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
4936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
50061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
501a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
502ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
503ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
504ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
505ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
506ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() {
507ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case NOT_INITIALIZED:
510d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
513d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
514d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
515d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
516d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
517d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
518d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
519d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
520d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // TODO: Handle record stop here
521d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
522d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mDevice->setStreamingRequest(NULL);
523d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
524d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STOPPED;
525d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
526d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
527d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
528d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mState);
529d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
53061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
53161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
53261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
533a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
534ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
53661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
53761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
53861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
539a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
540ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
54161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
54261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
545a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
546ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
54761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
54861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
55061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
551a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
552ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
55361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
55461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
55561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
556a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
557ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
55861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
55961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
562a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
563ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
56461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
567a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
568ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
57061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
57161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
57261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
573a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
574ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
57661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
57761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
57861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
579a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
580ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
581d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
582d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
583d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
584d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case NOT_INITIALIZED:
585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
591d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case VIDEO_SNAPSHOT:
596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = updateCaptureStream();
6044ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (res != OK) {
605be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
606be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return res;
6084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
609d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
6114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        res = updateCaptureRequest();
6124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
613be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
614be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
6154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
6164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
617d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
618d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
619be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: For video snapshot, will need 3 streams here
620d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t outputStreams;
621d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
622be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
623be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &streamIds, 2);
624d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
628d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
629d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mCaptureRequest);
631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
632be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
633be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
636d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
637d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
638d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (captureCopy == NULL) {
639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
643d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
644d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mState == PREVIEW) {
645d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->setStreamingRequest(NULL);
646d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
647d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
648d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
649d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
650d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
651d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
652d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
653d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
654d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
655d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
656d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
657d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
658d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
659d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
660d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
661d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
662d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
663d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
664d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STILL_CAPTURE;
665d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
666d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
667d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = VIDEO_SNAPSHOT;
668d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
669d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
670d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
671d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
672d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
673d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
674d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
675d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
67661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
67761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
679a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
680ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
6826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
6836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    CameraParameters newParams(params);
6856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only
6876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // parameters such as supported preview sizes, etc. Should probably
6886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // produce an error if they're changed.
6896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Extract and verify new parameters */
6916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t i;
6936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_SIZE
6956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewWidth, previewHeight;
6966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewSize(&previewWidth, &previewHeight);
6976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewWidth != mParameters.previewWidth ||
6996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            previewHeight != mParameters.previewHeight) {
7006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
7016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
7026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
7036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewSizes =
7066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
7076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
7086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePreviewSizes.data.i32[i] == previewWidth &&
7096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
7106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
7126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
7136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, previewWidth, previewHeight);
7146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FPS_RANGE
71911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFpsRange[2];
72011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFps = 0;
7216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool fpsRangeChanged = false;
72211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
72311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    if (previewFpsRange[0] != mParameters.previewFpsRange[0] ||
72411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] != mParameters.previewFpsRange[1]) {
7256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        fpsRangeChanged = true;
7266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewFpsRanges =
7276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
7286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
7296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
73011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[0]) &&
7316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
73211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[1]) ) {
7336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
7346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
7356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
7376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
73811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
7396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
74111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        previewFps = previewFpsRange[0];
7426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FORMAT
7456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
7466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewFormat != mParameters.previewFormat) {
7476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
7486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
7496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
7506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableFormats =
7536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
7546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
7556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableFormats.data.i32[i] == previewFormat) break;
7566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableFormats.count) {
7586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
7596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
7606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FRAME_RATE
7656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
7666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
7676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (!fpsRangeChanged) {
7686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = newParams.getPreviewFrameRate();
7696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (previewFps != mParameters.previewFps) {
7706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableFrameRates =
7716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
7726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
7736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (availableFrameRates.data.i32[i] == previewFps) break;
7746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
7756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableFrameRates.count) {
7766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
7776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__, previewFps);
7786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
7796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
78011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[0] = availableFrameRates.data.i32[i];
78111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] = availableFrameRates.data.i32[i+1];
7826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PICTURE_SIZE
7866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int pictureWidth, pictureHeight;
7876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPictureSize(&pictureWidth, &pictureHeight);
7886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (pictureWidth == mParameters.pictureWidth ||
7896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            pictureHeight == mParameters.pictureHeight) {
7906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePictureSizes =
7916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
7926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
7936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePictureSizes.data.i32[i] == pictureWidth &&
7946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
7956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePictureSizes.count) {
7976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
7986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, pictureWidth, pictureHeight);
7996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
80411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int jpegThumbSize[2];
80511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[0] =
8066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
80711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[1] =
8086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
80911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    if (jpegThumbSize[0] != mParameters.jpegThumbSize[0] ||
81011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            jpegThumbSize[1] != mParameters.jpegThumbSize[1]) {
8116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableJpegThumbSizes =
8126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
8136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
81411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
81511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
8166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
8176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
8186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
8206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
82111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
8226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
8276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbQuality =
8286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
8296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
8306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
8316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegThumbQuality);
8326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
8336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_QUALITY
8366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegQuality =
8376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
8386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegQuality < 0 || jpegQuality > 100) {
8396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
8406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegQuality);
8416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
8426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ROTATION
8456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegRotation =
8466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
8476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegRotation != 0 &&
8486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 90 &&
8496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 180 &&
8506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 270) {
8516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
8526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegRotation);
8536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
8546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // GPS
8576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool gpsEnabled = false;
85811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    double gpsCoordinates[3] = {0,0,0};
8596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int64_t gpsTimestamp = 0;
8606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 gpsProcessingMethod;
8616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    const char *gpsLatStr =
8626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
8636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (gpsLatStr != NULL) {
8646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsLongStr =
8656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
8666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsAltitudeStr =
8676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
8686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsTimeStr =
8696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
8706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsProcMethodStr =
8716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
8726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (gpsLongStr == NULL ||
8736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsAltitudeStr == NULL ||
8746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsTimeStr == NULL ||
8756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsProcMethodStr == NULL) {
8766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
8776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
8786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *endPtr;
8816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
88211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
8836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
8846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
8856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
88811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
8896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
8906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
8916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
89411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
8956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
8966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
8976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    gpsAltitudeStr);
8986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
9016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
9026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
9036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
9046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsProcessingMethod = gpsProcMethodStr;
9076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsEnabled = true;
9096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // WHITE_BALANCE
9126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int wbMode = wbModeStringToEnum(
9136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
9146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (wbMode != mParameters.wbMode) {
9156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableWbModes =
9166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
9176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
9186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (wbMode == availableWbModes.data.u8[i]) break;
9196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableWbModes.count) {
9216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
9226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
9246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EFFECT
9296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int effectMode = effectModeStringToEnum(
9306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
9316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (effectMode != mParameters.effectMode) {
9326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableEffectModes =
9336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
9346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
9356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (effectMode == availableEffectModes.data.u8[i]) break;
9366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableEffectModes.count) {
9386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
9396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
9416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ANTIBANDING
9466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int antibandingMode = abModeStringToEnum(
9476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
9486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (antibandingMode != mParameters.antibandingMode) {
9496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableAbModes =
9506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
9516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
9526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (antibandingMode == availableAbModes.data.u8[i]) break;
9536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableAbModes.count) {
9556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
9566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
9586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // SCENE_MODE
9636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int sceneMode = sceneModeStringToEnum(
9646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
9656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (sceneMode != mParameters.sceneMode) {
9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableSceneModes =
9676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
9686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
9696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (sceneMode == availableSceneModes.data.u8[i]) break;
9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableSceneModes.count) {
9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FLASH_MODE
9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::flashMode_t flashMode = flashModeStringToEnum(
9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (flashMode != mParameters.flashMode) {
9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t flashAvailable =
9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
9856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
9866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                flashMode != Parameters::FLASH_MODE_OFF) {
9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
9896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
9906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
9926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableAeModes =
9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
9946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (flashMode == availableAeModes.data.u8[i]) break;
9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableAeModes.count) {
9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
10026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == -1) {
10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_MODE
10126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::focusMode_t focusMode = focusModeStringToEnum(
10136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
10146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (focusMode != mParameters.focusMode) {
10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t minFocusDistance =
10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        "fixed focus lens",
10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
10226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                camera_metadata_entry_t availableFocusModes =
10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (focusMode == availableFocusModes.data.u8[i]) break;
10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (i == availableFocusModes.count) {
10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            __FUNCTION__,
10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return BAD_VALUE;
10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
10366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_AREAS
10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> focusingAreas;
10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &focusingAreas);
10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t max3aRegions =
10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EXPOSURE_COMPENSATION
10546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int exposureCompensation =
10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            exposureCompensation > exposureCompensationRange.data.i32[1]) {
10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, exposureCompensation);
10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoExposureLock = boolFromString(
10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoWhiteBalanceLock = boolFromString(
10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // METERING_AREAS
10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> meteringAreas;
10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &meteringAreas);
10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__,
10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ZOOM
10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, zoom);
10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_SIZE
10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int videoWidth, videoHeight;
10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getVideoSize(&videoWidth, &videoHeight);
10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoWidth != mParameters.videoWidth ||
10976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            videoHeight != mParameters.videoHeight) {
10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState == RECORD) {
10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableVideoSizes =
11046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
11056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableVideoSizes.data.i32[i] == videoWidth &&
11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableVideoSizes.count) {
11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, videoWidth, videoHeight);
11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // RECORDING_HINT (always supported)
11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool recordingHint = boolFromString(
11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_STABILIZATION
11216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool videoStabilization = boolFromString(
11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Update internal parameters */
11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewWidth = previewWidth;
11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewHeight = previewHeight;
113211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[0] = previewFpsRange[0];
113311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[1] = previewFpsRange[1];
11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFps = previewFps;
11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFormat = previewFormat;
11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.pictureWidth = pictureWidth;
11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.pictureHeight = pictureHeight;
11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
114011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[0] = jpegThumbSize[0];
114111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[1] = jpegThumbSize[1];
11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegQuality = jpegQuality;
11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegThumbQuality = jpegThumbQuality;
11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsEnabled = gpsEnabled;
114611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.gpsCoordinates[0] = gpsCoordinates[0];
114711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.gpsCoordinates[1] = gpsCoordinates[1];
114811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.gpsCoordinates[2] = gpsCoordinates[2];
11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsTimestamp = gpsTimestamp;
11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsProcessingMethod = gpsProcessingMethod;
11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.wbMode = wbMode;
11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.effectMode = effectMode;
11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.antibandingMode = antibandingMode;
11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.sceneMode = sceneMode;
11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.flashMode = flashMode;
11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.focusMode = focusMode;
11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.focusingAreas = focusingAreas;
11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.exposureCompensation = exposureCompensation;
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.autoExposureLock = autoExposureLock;
11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.meteringAreas = meteringAreas;
11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.zoom = zoom;
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoWidth = videoWidth;
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoHeight = videoHeight;
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.recordingHint = recordingHint;
11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoStabilization = videoStabilization;
11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1173be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updatePreviewRequest();
1174be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1175be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1176be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1177be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1178be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1179be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateCaptureRequest();
1180be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1181be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
1182be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1183be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1184be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1185be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
1186be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mState == PREVIEW) {
1187be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
1188be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1189be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1190be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1191be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1192be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
1193be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
119661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1197f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
119861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1199a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1200ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1201ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1202ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
1203ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
12043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
12053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return mParamsFlattened;
120661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
120761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
120861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1209a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1210ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
12116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
121261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
121361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
12143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
12153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    sp<ICameraClient> currentClient;
1220d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
1222d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
1223d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1224d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Signal errors here upstream
1225d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1226d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1227d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1228d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1229d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1230d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1231d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1232d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1233d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1234d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1235d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1236d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1237d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1238d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1239d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1240d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1241d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1242d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1243d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1244d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1245d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1246d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1247d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
1248d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        void* captureMemory = mCaptureHeap->getBase();
1249d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t size = mCaptureHeap->getSize();
1250d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1251d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1252d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1253d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1254d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient = mCameraClient;
1255d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        switch (mState) {
1256d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case STILL_CAPTURE:
1257d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = STOPPED;
1258d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1259d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case VIDEO_SNAPSHOT:
1260d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = RECORD;
1261d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1262d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1263d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1264d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCameraId, mState);
1265d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1266d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1267d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1268d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
1269d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (currentClient != 0) {
1270d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1271d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mCaptureMemory, NULL);
1272d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1273d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1274d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
12753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
12763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
12773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
12783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
12793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
12803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
12813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
12823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
12833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
12843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
12853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
12863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
12873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
12883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
12893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
12903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
12913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
12923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
12933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
12943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
12953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
12963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
12973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
12983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
12993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
13003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
13013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
13023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
13033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
13043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
13053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
13063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
13073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
13083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
13093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
13103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1311f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
1313a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1314ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
1315ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
13173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
1318f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
13203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
13213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
1322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
13243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewWidth = availableProcessedSizes.data.i32[0];
13253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewHeight = availableProcessedSizes.data.i32[1];
13263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoWidth = mParameters.previewWidth;
13273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoHeight = mParameters.previewHeight;
13283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
13293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
13303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
13313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
13323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
13333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight));
1334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
1336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
1338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
1339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
1340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
1341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
13423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
13443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
1346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
13493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
13503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
1351f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
135211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
135311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
1354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
13563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
135711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    mParameters.previewFpsRange[0],
135811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    mParameters.previewFpsRange[1]));
1359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
1362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1363f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1364f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
1365f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
1366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
1367f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
13683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
1370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1371f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
13733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
13743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(mParameters.previewFormat)); // NV21
13753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
13763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
13773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1379f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1380f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
1381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1387bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1388bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1391bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1392bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1393f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1395bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1396bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1399bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1400bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1403bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1404bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
140611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
140711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                supportedPreviewFormats +=
140811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
140911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                break;
141011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
141211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1414f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
141511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala
1416f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1419f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1420f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1422f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
1425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
1429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
143111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.previewFpsRange[0]);
1432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1433f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
1437f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
1438f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
1439f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1441f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
1442f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1443f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
14453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
14463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
1447f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
14493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureWidth = availableJpegSizes.data.i32[0];
14503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureHeight = availableJpegSizes.data.i32[1];
1451f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureSize(mParameters.pictureWidth,
14533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.pictureHeight);
1454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
1457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
1459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
1460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
1461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
1462f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
1464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
1465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1466f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
14683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
14693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
1470f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
14723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
14733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
1474f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1475f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
147611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
147711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
1478f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
148011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.jpegThumbSize[0]);
14813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
148211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.jpegThumbSize[1]);
1483f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1484f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1485f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
1486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
1488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
1489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
1490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
1491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
1493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
1494f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1495f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbQuality = 90;
14973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
14983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbQuality);
14993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegQuality = 90;
15003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
15013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegQuality);
15023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegRotation = 0;
15033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
15043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegRotation);
15053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
15063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsEnabled = false;
15073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsProcessingMethod = "unknown";
15083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
15093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
15103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
15113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
15123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
15133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
15143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
15153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1516f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
1518f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1519f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
1521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1522f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
1523f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
1524bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1525bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
1526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
1528bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1529bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
1530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
1532bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1533bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
1534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
1536bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1537bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
1538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
1540bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1541bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
1542f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1543f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
1544bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1545bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
1546f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1547f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
1548bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1549bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
1550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
1552bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1553bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
1554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
1556f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
1557f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1560f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
1561f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1562f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
1563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1564f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1565f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
15673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
1568f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
1569f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
15713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
15723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
15733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
15743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
15753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
15763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
15773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
1578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
1580f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1581f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
1582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
1583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1584f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
1585f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
1586bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1587bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NONE;
1588f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1589f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
1590bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1591bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_MONO;
1592bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    break;
1593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
1594bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1595bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
1596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
1598bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1599bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
1600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1601f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
1602bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1603bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
1604f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1605f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
1606bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1607bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
1608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
1610bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1611bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
1612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
1614bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1615bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
1616f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1617f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
1618bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1619bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
1620f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1621f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
1623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1624f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1625f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
16283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
1629f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
16323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
16333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
16343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
16363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
16373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
1638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1639f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
1640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
1642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
1643f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1644f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
1645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
1646bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1647bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
1648f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1649f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
1650bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1651bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
1652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
1654bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1655bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
1656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
1658bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1659bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
1660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
1665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
16693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
1670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
1671f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.sceneMode = ANDROID_CONTROL_OFF;
16743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
16753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
16763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
16783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
16793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
1680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1681bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
1682f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
1683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
1684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
1685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
1686f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1687f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
1688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
1690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
1692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
1693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
1696bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1697bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
1698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
1700bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1701bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
1702f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1703f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
1704bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1705bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
1706f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1707f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
1708bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1709bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
1710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
1712bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1713bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
1714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
1716bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1717bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
1718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1719f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
1720bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1721bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
1722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1723f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
1724bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1725bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
1726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1727f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
1728bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1729bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
1730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
1732bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1733bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
1734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
1736bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1737bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
1738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1739f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
1740bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1741bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
1742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
1744bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1745bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
1746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
1748bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1749bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
1750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
1752bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1753bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
1754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1755f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
1757bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        __FUNCTION__, mCameraId,
1758bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            availableSceneModes.data.u8[i]);
1759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
1763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
17643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
1765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
1766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
1767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
17703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
17713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
1772f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
17743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
17753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
1776f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1777f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
17783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
17793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
17803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
17813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
17833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
17843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
17853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
17863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
1787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
1788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
1789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
17903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
17913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
1792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
17953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
17973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
17983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_OFF;
17993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
18003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
18013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
18023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
1803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1804f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
18063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
18073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
18083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
18103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
18113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
18123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1813f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
1814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
18153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
18163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
18173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
18183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
18193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
1820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
18213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
18223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
18233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
18243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
18253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFocusModes = supportedFocusModes + "," +
18263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FOCUS_MODE_INFINITY;
1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
1828bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
1829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
1830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
1831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
1833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
1834bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1835bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
1836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
1838bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1839bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
1840f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
1842bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1843bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
1844f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
1846bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1847bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
1848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
1850bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1851bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
1852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1853bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                // Not supported in old API
1854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1856f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1857f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1865f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
1866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
18693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
18703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
1871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
1873f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
18743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
1875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
18763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.clear();
18773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
18783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
18803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
18813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
1882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
18843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
1885f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
18873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
18883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
1889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
1891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
1892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
1894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
18953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
18963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
1897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.exposureCompensation = 0;
18993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
19003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                mParameters.exposureCompensation);
1901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
19033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
19043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
19053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
1907f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
19083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
1909f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
1910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
19123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
19133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
19143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
1916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
1917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
1918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoExposureLock = false;
19203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
19213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
19223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
19233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = false;
19263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
19273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
19283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
19293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1930f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
19323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
1933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
19343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
1935f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
1936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.zoom = 0;
19383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
19393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
1940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
19423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
19433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
1944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1946f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
1947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
1948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
19496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
1950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
19516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
1952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
1956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
19573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
1958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
19613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
19623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
19633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
1966f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
1967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
19693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
19703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
19723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
1973f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
1974f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
19763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
1977f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
19793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
1980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
19823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1983f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
19853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
19863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
19883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
19893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
1990f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1991f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
19923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
19933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
1994f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
19953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
19963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
1997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParamsFlattened = params.flatten();
20003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2001f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
2002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
200361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2004be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream() {
2005be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2006be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2007be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
2008be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
2009be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
2010be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
2011be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
2012be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2013be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
2014be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2015be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2016be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2017be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (currentWidth != (uint32_t)mParameters.previewWidth ||
2018be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                currentHeight != (uint32_t)mParameters.previewHeight) {
2019be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
2020be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2021be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
2022be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2023be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2024be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2025be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
2026be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2027be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2028be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
2029be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
2030be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2031be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2032be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
2033be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2034be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2035be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2036be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
2037be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
2038be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.previewWidth, mParameters.previewHeight,
2039be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
2040be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
2041be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2042be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
2043be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
2044be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2045be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2046be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2047be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2048be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2049be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2050be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
20516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
2052a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
20536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
20546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
20556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
20566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
20576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
20586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
20596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
20606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
20616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
20626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2063be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2064be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateRequestCommon(mPreviewRequest);
2065be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2066be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
2067be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2068be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2069be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2070be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2071be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
20726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
20736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
20746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2075d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureStream() {
2076be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2077d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2078d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
2079d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t maxJpegSize =
2080d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            staticInfo(ANDROID_JPEG_MAX_SIZE);
2081d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
2082d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2083d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
2084d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
2085d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2086d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2087d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2088d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2089d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2090d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2091d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2092d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2093d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2094d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
2095d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0,
2096d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "Camera2Client::CaptureHeap");
2097d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mCaptureHeap->getSize() == 0) {
2098d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2099d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2100d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2101d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2102d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureMemory = new MemoryBase(mCaptureHeap,
2103d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                0, maxJpegSize.data.i32[0]);
2104d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2105d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2106be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
2107d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2108d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2109d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2110d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2111d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2112d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2113d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2114d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2115d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2116d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2117d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                currentHeight != (uint32_t)mParameters.pictureHeight) {
2118d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2119d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2120d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2121d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2122d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2123d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2124d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2125d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2126d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2127d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2128be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2129be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2130be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
2131be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2132be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.pictureWidth, mParameters.pictureHeight,
2133be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2134be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
2135be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2136be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2137be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2138be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2139be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2140be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2141be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2142d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2143d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2144be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2145d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest() {
2146d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2147d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2148d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
2149d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2150d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2151d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2152d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2153d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2154d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2155d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2156d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2157be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2158be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateRequestCommon(mCaptureRequest);
2159be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2160be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2161be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2162be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2163be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2164be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2165be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2166be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2167be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_SIZE,
2168be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mParameters.jpegThumbSize, 2);
2169be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2170be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2171be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_QUALITY,
2172be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.jpegThumbQuality, 1);
2173be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2174be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2175be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_QUALITY,
2176be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.jpegQuality, 1);
2177be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2178be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2179be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2180be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.jpegRotation, 1);
2181be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2182be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2183be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mParameters.gpsEnabled) {
2184be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2185be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2186be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.gpsCoordinates, 3);
2187be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2188be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2189be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2190be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mParameters.gpsTimestamp, 1);
2191be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2192be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2193be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2194be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.gpsProcessingMethod.string(),
2195be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.gpsProcessingMethod.size());
2196be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2197be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2198be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2199be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES);
2200be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2201be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2202be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP);
2203be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2204be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2205be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD);
2206be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2207be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2208be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2209d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2210d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2211d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2212be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request) {
2213be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2214be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2215be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2216be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_TARGET_FPS_RANGE, mParameters.previewFpsRange, 2);
2217be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2218be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2219be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t wbMode = mParameters.autoWhiteBalanceLock ?
2220be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCKED : mParameters.wbMode;
2221be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2222be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_MODE, &wbMode, 1);
2223be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2224be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2225be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_EFFECT_MODE, &mParameters.effectMode, 1);
2226be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2227be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2228be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_MODE,
2229be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.antibandingMode, 1);
2230be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2231be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2232be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
2233be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (mParameters.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
2234be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
2235be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2236be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_MODE, &controlMode, 1);
2237be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2238be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
2239be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(request,
2240be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_CONTROL_SCENE_MODE,
2241be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mParameters.sceneMode, 1);
2242be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2243be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2244be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2245be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
2246be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
2247be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    switch (mParameters.flashMode) {
2248be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
2249be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
2250be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
2251be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
2252be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
2253be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
2254be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
2255be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
2256be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
2257be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2258be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
2259be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
2260be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2261be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
2262be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mCameraId, mParameters.flashMode);
2263be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2264be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2265be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mParameters.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
2266be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2267be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2268be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_FLASH_MODE, &flashMode, 1);
2269be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2270be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2271be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_MODE, &aeMode, 1);
2272be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2273be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2274be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
2275be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
2276be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    switch (mParameters.focusMode) {
2277be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2278be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2279be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2280be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2281be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2282be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = mParameters.focusMode;
2283be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2284be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2285be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2286be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
2287be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2288be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2289be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
2290be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mCameraId, mParameters.focusMode);
2291be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2292be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2293be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2294be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
2295be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2296be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2297be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_MODE, &focusMode, 1);
2298be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2299be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2300be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    size_t focusingAreasSize = mParameters.focusingAreas.size() * 5;
2301be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
2302be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
2303be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 0] = mParameters.focusingAreas[i].left;
2304be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 1] = mParameters.focusingAreas[i].top;
2305be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 2] = mParameters.focusingAreas[i].right;
2306be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 3] = mParameters.focusingAreas[i].bottom;
2307be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 4] = mParameters.focusingAreas[i].weight;
2308be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2309be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2310be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize);
2311be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2312be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
2313be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2314be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2315be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION,
2316be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.exposureCompensation, 1);
2317be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2318be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2319be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    size_t meteringAreasSize = mParameters.meteringAreas.size() * 5;
2320be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
2321be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
2322be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 0] = mParameters.meteringAreas[i].left;
2323be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 1] = mParameters.meteringAreas[i].top;
2324be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 2] = mParameters.meteringAreas[i].right;
2325be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 3] = mParameters.meteringAreas[i].bottom;
2326be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 4] = mParameters.meteringAreas[i].weight;
2327be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2328be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2329be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize);
2330be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2331be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2332be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2333be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize);
2334be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2335be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
2336be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2337be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
2338be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
2339be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2340be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
2341be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
2342be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
2343be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (NUM_ZOOM_STEPS-1);
2344be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * mParameters.zoom;
2345be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2346be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t activePixelArraySize =
2347be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
2348be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayWidth = activePixelArraySize.data.i32[0];
2349be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayHeight = activePixelArraySize.data.i32[1];
2350be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2351be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mParameters.previewWidth >= mParameters.previewHeight) {
2352be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth =  arrayWidth / zoomRatio;
2353be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
2354be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.previewHeight / mParameters.previewWidth;
2355be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2356be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = arrayHeight / zoomRatio;
2357be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
2358be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.previewWidth / mParameters.previewHeight;
2359be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2360be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomLeft = (arrayWidth - zoomWidth) / 2;
2361be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomTop = (arrayHeight - zoomHeight) / 2;
2362be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2364be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_SCALER_CROP_REGION, cropRegion, 3);
2366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
2369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t vstabMode = mParameters.videoStabilization ?
2371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
2372be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
2373be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2374be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2375be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
2376be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2377be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2378be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2379be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2380be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer,
2382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t tag, const void *data, size_t data_count) {
2383be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
2384be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2385be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
2386be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2387be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = add_camera_metadata_entry(buffer,
2388be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                tag, data, data_count);
2389be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res == OK) {
2390be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = update_camera_metadata_entry(buffer,
2391be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                entry.index, data, data_count, NULL);
2392be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2393be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2394be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2395be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
2396be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, get_camera_metadata_section_name(tag),
2397be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2398be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2399be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
2400be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2401be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2402be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) {
2403be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
2404be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2405be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
2406be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2407be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return OK;
2408be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res != OK) {
2409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
2410be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
2411be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
2412be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2413be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2414be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2415be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = delete_camera_metadata_entry(buffer, entry.index);
2416be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2417be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
2418be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
2419be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
2420be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2421be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2422be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
2423be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
24246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) {
24256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
24266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
24276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
24286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
24296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
24306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
24316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
24326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
24336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
24346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
24356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
24366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
24376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
24386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
24396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
24406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
24416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
24426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
24433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
24443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
24453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
24463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
24473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
24483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
24503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
24513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
24533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
24543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
24563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
24573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
24593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
24603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
24623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
24633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
24653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
24663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
24673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
24693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
24703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
24713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
24723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
24733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
24743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
24753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
24766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
24776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) {
24786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
24796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
24806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
24816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
24826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
24836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
24846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
24856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
24866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
24876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
24886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
24896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
24906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
24916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
24926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
24936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
24946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
24956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
24966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
24976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
24986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) {
24996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
25006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
25016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
25026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
25036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
25046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
25056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
25066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
25076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
25086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
25096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
25106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
25116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
25126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
25136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
25146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
25156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
25166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
25176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
25186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
25196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
25206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
25216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) {
25226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
25236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
25246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
25256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
25266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
25276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
25286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
25296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
25306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
25316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
25326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
25336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
25346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
25356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
25366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
25376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
25386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
25396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
25406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
25416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
25426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
25436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
25446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
25456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
25466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
25476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
25486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
25496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
25506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
25516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
25526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
25536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
25546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
25556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
25566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
25576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
25586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
25596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
25606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
25616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
25626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
25636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
25646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
25656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
25666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
25676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
25686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
25696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
25706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
25716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
25726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *flashMode) {
25736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
25746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
25756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
25766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
25776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
25786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
25796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
25806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
25816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
25826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
25836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
25846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
25856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
25866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
25876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
25886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *focusMode) {
25896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
25906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
25916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
25926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
25936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
25946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
25956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
25966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
25976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
25986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
25996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
26006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
26016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
26026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
26036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
26046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
26056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
26066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
26076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr,
26086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
26096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
26106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    areas->clear();
26116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areasCStr == NULL) {
26126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
26136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push();
26146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return OK;
26156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
26166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 areasStr(areasCStr);
26176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
26186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    while (areaStart != 0) {
26196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
26206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *numEnd;
26216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        int vals[NUM_FIELDS];
26226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
26236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            errno = 0;
26246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
26256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
26266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            area = numEnd + 1;
26276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
26286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push(Parameters::Area(
26296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
26306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
26316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
26326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
26336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
26346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
26356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
26366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                      size_t maxRegions) {
26376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Definition of valid area can be found in
26386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // include/camera/CameraParameters.h
26396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
26406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 1) {
26416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (areas[0].left == 0 &&
26426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].top == 0 &&
26436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].right == 0 &&
26446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].bottom == 0 &&
26456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].weight == 0) {
26466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
26476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return OK;
26486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
26496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
26506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() > maxRegions) {
26516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
26526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, areas.size());
26536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
26546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
26556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
26566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
26576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala         a != areas.end(); a++) {
26586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
26596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
26606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
26616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
26626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
26636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
26646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
26656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
26666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
26676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
26686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
26696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) {
26706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return !boolStr ? false :
26716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
26726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        false;
26736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
26746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
26756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
267661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2677