Camera2Client.cpp revision 3297daae9681004775012faba9181d65e097e00c
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",
1207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewFpsRangeMin, mParameters.previewFpsRangeMax);
1217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
1227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewFormat);
1237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
1247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.pictureWidth, mParameters.pictureHeight);
1257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
1267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.jpegThumbWidth, mParameters.jpegThumbHeight);
1277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.jpegQuality, mParameters.jpegThumbQuality);
1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", mParameters.jpegRotation);
1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
1317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.gpsEnabled ? "enabled" : "disabled");
1327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    if (mParameters.gpsEnabled) {
1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
1347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsLatitude, mParameters.gpsLongitude,
1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsAltitude);
1367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsTimestamp);
1387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
1397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsProcessingMethod.string());
1407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.wbMode) {
1447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.effectMode) {
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.antibandingMode) {
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.sceneMode) {
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.flashMode) {
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.focusMode) {
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].left,
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].top,
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].right,
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].bottom,
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].weight);
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.exposureCompensation);
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoExposureLock ? "enabled" : "disabled",
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].left,
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].top,
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].right,
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].bottom,
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].weight);
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2513297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", mParameters.zoom);
2523297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", mParameters.videoWidth,
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoHeight);
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2553297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
2567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.recordingHint ? "set" : "not set");
2577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2583297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoStabilization ? "enabled" : "disabled");
2607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2613297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2623297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
2643297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2653297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
2663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mPreviewRequest != NULL) {
2673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
2683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        dump_camera_metadata(mPreviewRequest, fd, 2);
2703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
2723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mCaptureRequest != NULL) {
2763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        dump_camera_metadata(mCaptureRequest, fd, 2);
2793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
285611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
2867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
2903297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
2913297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
295611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
29661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
29761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2984ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) {
2994ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
3004ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    switch(state) {
3014ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
3024ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
3034ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
3044ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
3054ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
3064ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
3074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
3084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        default:
3094ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return "Unknown state!";
3104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            break;
3114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
3124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR
3134ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala}
3144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
31561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
31661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
31761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
318a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
319ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
320ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
323ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
3246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
325d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mDevice->waitUntilDrained();
326d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
327d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3286db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
329d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
330d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
334d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
33761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
33861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
33961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
341a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
342ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
343ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
34461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
34561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
34661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
34761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
348a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
349ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
350ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
35161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
35261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
35361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
355a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
356ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
357ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
35861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
35961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
36061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
3626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
363a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
364ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
365ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
366ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    if (mState >= PREVIEW) return INVALID_OPERATION;
3676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
3696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
3706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
3716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
3726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
3736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
3746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
375d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder,window);
37661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
37761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
3796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
380a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
381ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
382ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
383ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    if (mState >= PREVIEW) return INVALID_OPERATION;
3846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
3866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
3876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
3886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
3896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
3906db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
391d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder, window);
3926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
3936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
394d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
3956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ANativeWindow>& window) {
396a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
3986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
3996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
403d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: Should wait until HAL has no remaining requests
404d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
405d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
4066db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
4076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
4086db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
4096db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
4106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->createStream(window,
4123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.previewWidth, mParameters.previewHeight,
413d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
4146db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &mPreviewStreamId);
4156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
4166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
419bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
420bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
4216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
422d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return startPreviewLocked();
4236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4246db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
42661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
42861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
429a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
43161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
43261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
43361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
434a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
435ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
436d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return startPreviewLocked();
437d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
438ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
439d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() {
440d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
4416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4424ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (mState >= PREVIEW) {
4434ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
4444ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                __FUNCTION__, getStateName(mState));
4454ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
4464ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
4476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
448d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4526db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4536db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
4546db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        updatePreviewRequest();
4556db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    uint8_t outputStream = mPreviewStreamId;
4586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    camera_metadata_entry_t outputStreams;
4606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = find_camera_metadata_entry(mPreviewRequest,
4616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
4626db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            &outputStreams);
4636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
4646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = add_camera_metadata_entry(mPreviewRequest,
4656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
4666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &outputStream, 1);
4676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    } else if (res == OK) {
4686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = update_camera_metadata_entry(mPreviewRequest,
4696db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                outputStreams.index, &outputStream, 1, NULL);
4706db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4726db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
4736db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
4746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
4756db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
4766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
481bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
482bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
4836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = STOPPED;
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
4866db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
49061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
49261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
493a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
494ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
495ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
496ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
497ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
498ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() {
499ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
500d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
501d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case NOT_INITIALIZED:
502d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
503d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
504d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
505d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
506d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
507d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
510d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // TODO: Handle record stop here
513d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
514d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mDevice->setStreamingRequest(NULL);
515d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
516d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STOPPED;
517d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
518d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
519d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
520d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mState);
521d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
52261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
52361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
52461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
525a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
526ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
52861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
52961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
53061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
531a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
532ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
53361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
53461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
53561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
53661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
537a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
538ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
53961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
54061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
543a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
544ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
54561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
54661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
54761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
548a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
549ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
55061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
55161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
55261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
55361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
554a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
555ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
55661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
55761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
55861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
559a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
560ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5616db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
56261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
56461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
565a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
566ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
5676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
56861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
56961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
57061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
571a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
572ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
573d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
574d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
575d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
576d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case NOT_INITIALIZED:
577d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
578d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
579d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
580d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
581d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
582d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
583d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
584d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case VIDEO_SNAPSHOT:
588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
591d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = updateCaptureStream();
5964ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (res != OK) {
5974ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't set up still image stream: %s (%d)",
5984ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                __FUNCTION__, strerror(-res), res);
5994ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return res;
6004ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
6034ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        res = updateCaptureRequest();
6044ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
6054ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            ALOGE("%s: Can't set up still image capture request: %s (%d)",
6064ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
6074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
6084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
609d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
610d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
611d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: For video snapshot, need 3 streams here
612d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t outputStreams;
613d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
614d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = find_camera_metadata_entry(mCaptureRequest,
615d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
616d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            &outputStreams);
617d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res == NAME_NOT_FOUND) {
618d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = add_camera_metadata_entry(mCaptureRequest,
619d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ANDROID_REQUEST_OUTPUT_STREAMS,
620d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                streamIds, 2);
621d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    } else if (res == OK) {
622d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = update_camera_metadata_entry(mCaptureRequest,
623d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                outputStreams.index, streamIds, 2, NULL);
624d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
625d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
626d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
627d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
628d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
629d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
630d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
631d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
632d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
633d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
634d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (captureCopy == NULL) {
635d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
636d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
637d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
638d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
639d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
640d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mState == PREVIEW) {
641d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->setStreamingRequest(NULL);
642d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
643d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
644d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
645d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
646d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
647d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
648d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
649d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
650d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
651d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
652d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
653d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
654d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
655d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
656d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
657d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
658d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
659d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
660d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STILL_CAPTURE;
661d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
662d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
663d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = VIDEO_SNAPSHOT;
664d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
665d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
666d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
667d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
668d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
669d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
670d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
671d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
67261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
67361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
67461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
675a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
676ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
6786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
6796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    CameraParameters newParams(params);
6816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only
6836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // parameters such as supported preview sizes, etc. Should probably
6846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // produce an error if they're changed.
6856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Extract and verify new parameters */
6876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t i;
6896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_SIZE
6916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewWidth, previewHeight;
6926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewSize(&previewWidth, &previewHeight);
6936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
6946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewWidth != mParameters.previewWidth ||
6956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            previewHeight != mParameters.previewHeight) {
6966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
6976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
6986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
6996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewSizes =
7026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
7036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
7046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePreviewSizes.data.i32[i] == previewWidth &&
7056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
7066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
7086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
7096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, previewWidth, previewHeight);
7106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FPS_RANGE
7156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFpsRangeMin, previewFpsRangeMax, previewFps = 0;
7166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool fpsRangeChanged = false;
7176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewFpsRange(&previewFpsRangeMin, &previewFpsRangeMax);
7186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewFpsRangeMin != mParameters.previewFpsRangeMin ||
7196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            previewFpsRangeMax != mParameters.previewFpsRangeMax) {
7206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        fpsRangeChanged = true;
7216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewFpsRanges =
7226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
7236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
7246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
7256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    previewFpsRangeMin) &&
7266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
7276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    previewFpsRangeMax) ) {
7286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
7296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
7306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
7326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
7336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, previewFpsRangeMin, previewFpsRangeMax);
7346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = previewFpsRangeMin;
7376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FORMAT
7406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
7416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewFormat != mParameters.previewFormat) {
7426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
7436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
7446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
7456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableFormats =
7486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
7496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
7506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableFormats.data.i32[i] == previewFormat) break;
7516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableFormats.count) {
7536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
7546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
7556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FRAME_RATE
7606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
7616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
7626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (!fpsRangeChanged) {
7636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = newParams.getPreviewFrameRate();
7646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (previewFps != mParameters.previewFps) {
7656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableFrameRates =
7666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
7676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
7686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (availableFrameRates.data.i32[i] == previewFps) break;
7696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
7706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableFrameRates.count) {
7716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
7726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__, previewFps);
7736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
7746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
7756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            previewFpsRangeMin = availableFrameRates.data.i32[i];
7766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            previewFpsRangeMax = availableFrameRates.data.i32[i+1];
7776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PICTURE_SIZE
7816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int pictureWidth, pictureHeight;
7826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPictureSize(&pictureWidth, &pictureHeight);
7836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (pictureWidth == mParameters.pictureWidth ||
7846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            pictureHeight == mParameters.pictureHeight) {
7856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePictureSizes =
7866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
7876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
7886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePictureSizes.data.i32[i] == pictureWidth &&
7896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
7906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePictureSizes.count) {
7926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
7936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, pictureWidth, pictureHeight);
7946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
7956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
7966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
7976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
7986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
7996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbWidth, jpegThumbHeight;
8006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    jpegThumbWidth =
8016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
8026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    jpegThumbHeight =
8036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
8046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbWidth != mParameters.jpegThumbWidth ||
8056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegThumbHeight != mParameters.jpegThumbHeight) {
8066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableJpegThumbSizes =
8076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
8086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
8096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableJpegThumbSizes.data.i32[i] == jpegThumbWidth &&
8106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbHeight) {
8116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
8126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
8136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
8156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
8166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, jpegThumbWidth, jpegThumbHeight);
8176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
8226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbQuality =
8236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
8246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
8256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
8266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegThumbQuality);
8276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
8286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_QUALITY
8316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegQuality =
8326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
8336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegQuality < 0 || jpegQuality > 100) {
8346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
8356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegQuality);
8366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
8376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ROTATION
8406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegRotation =
8416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
8426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegRotation != 0 &&
8436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 90 &&
8446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 180 &&
8456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 270) {
8466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
8476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegRotation);
8486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
8496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
8506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // GPS
8526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool gpsEnabled = false;
8536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    double gpsLatitude = 0, gpsLongitude = 0, gpsAltitude = 0;
8546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int64_t gpsTimestamp = 0;
8556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 gpsProcessingMethod;
8566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    const char *gpsLatStr =
8576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
8586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (gpsLatStr != NULL) {
8596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsLongStr =
8606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
8616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsAltitudeStr =
8626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
8636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsTimeStr =
8646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
8656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsProcMethodStr =
8666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
8676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (gpsLongStr == NULL ||
8686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsAltitudeStr == NULL ||
8696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsTimeStr == NULL ||
8706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsProcMethodStr == NULL) {
8716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
8726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
8736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *endPtr;
8766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
8776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsLatitude = strtod(gpsLatStr, &endPtr);
8786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
8796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
8806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
8836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsLongitude = strtod(gpsLongStr, &endPtr);
8846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
8856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
8866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
8896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsAltitude = strtod(gpsAltitudeStr, &endPtr);
8906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
8916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
8926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    gpsAltitudeStr);
8936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
8966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
8976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
8986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
8996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsProcessingMethod = gpsProcMethodStr;
9026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsEnabled = true;
9046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // WHITE_BALANCE
9076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int wbMode = wbModeStringToEnum(
9086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
9096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (wbMode != mParameters.wbMode) {
9106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableWbModes =
9116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
9126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
9136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (wbMode == availableWbModes.data.u8[i]) break;
9146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableWbModes.count) {
9166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
9176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
9196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EFFECT
9246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int effectMode = effectModeStringToEnum(
9256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
9266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (effectMode != mParameters.effectMode) {
9276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableEffectModes =
9286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
9296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
9306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (effectMode == availableEffectModes.data.u8[i]) break;
9316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableEffectModes.count) {
9336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
9346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
9366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ANTIBANDING
9416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int antibandingMode = abModeStringToEnum(
9426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
9436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (antibandingMode != mParameters.antibandingMode) {
9446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableAbModes =
9456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
9466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
9476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (antibandingMode == availableAbModes.data.u8[i]) break;
9486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableAbModes.count) {
9506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
9516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
9536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // SCENE_MODE
9586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int sceneMode = sceneModeStringToEnum(
9596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
9606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (sceneMode != mParameters.sceneMode) {
9616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableSceneModes =
9626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
9636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
9646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (sceneMode == availableSceneModes.data.u8[i]) break;
9656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableSceneModes.count) {
9676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
9686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
9696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FLASH_MODE
9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::flashMode_t flashMode = flashModeStringToEnum(
9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (flashMode != mParameters.flashMode) {
9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t flashAvailable =
9796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                flashMode != Parameters::FLASH_MODE_OFF) {
9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
9856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableAeModes =
9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
9896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
9906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (flashMode == availableAeModes.data.u8[i]) break;
9916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
9926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableAeModes.count) {
9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
9946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
9966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
9976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == -1) {
9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
10016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
10026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_MODE
10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::focusMode_t focusMode = focusModeStringToEnum(
10086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (focusMode != mParameters.focusMode) {
10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t minFocusDistance =
10126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
10136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
10146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        "fixed focus lens",
10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                camera_metadata_entry_t availableFocusModes =
10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
10226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (focusMode == availableFocusModes.data.u8[i]) break;
10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (i == availableFocusModes.count) {
10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            __FUNCTION__,
10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return BAD_VALUE;
10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_AREAS
10366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> focusingAreas;
10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
10386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &focusingAreas);
10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t max3aRegions =
10406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
10456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EXPOSURE_COMPENSATION
10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int exposureCompensation =
10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
10546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            exposureCompensation > exposureCompensationRange.data.i32[1]) {
10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, exposureCompensation);
10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoExposureLock = boolFromString(
10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoWhiteBalanceLock = boolFromString(
10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // METERING_AREAS
10696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> meteringAreas;
10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &meteringAreas);
10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
10756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__,
10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ZOOM
10816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, zoom);
10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_SIZE
10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int videoWidth, videoHeight;
10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getVideoSize(&videoWidth, &videoHeight);
10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoWidth != mParameters.videoWidth ||
10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            videoHeight != mParameters.videoHeight) {
10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState == RECORD) {
10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableVideoSizes =
10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableVideoSizes.data.i32[i] == videoWidth &&
11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableVideoSizes.count) {
11056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, videoWidth, videoHeight);
11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // RECORDING_HINT (always supported)
11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool recordingHint = boolFromString(
11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_STABILIZATION
11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool videoStabilization = boolFromString(
11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
11216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Update internal parameters */
11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewWidth = previewWidth;
11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewHeight = previewHeight;
11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFpsRangeMin = previewFpsRangeMin;
11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFpsRangeMax = previewFpsRangeMax;
11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFps = previewFps;
11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFormat = previewFormat;
11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.pictureWidth = pictureWidth;
11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.pictureHeight = pictureHeight;
11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegThumbWidth = jpegThumbWidth;
11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegThumbHeight = jpegThumbHeight;
11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegQuality = jpegQuality;
11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegThumbQuality = jpegThumbQuality;
11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsEnabled = gpsEnabled;
11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsLatitude = gpsLatitude;
11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsLongitude = gpsLongitude;
11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsAltitude = gpsAltitude;
11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsTimestamp = gpsTimestamp;
11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsProcessingMethod = gpsProcessingMethod;
11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.wbMode = wbMode;
11486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.effectMode = effectMode;
11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.antibandingMode = antibandingMode;
11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.sceneMode = sceneMode;
11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.flashMode = flashMode;
11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.focusMode = focusMode;
11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.focusingAreas = focusingAreas;
11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.exposureCompensation = exposureCompensation;
11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.autoExposureLock = autoExposureLock;
11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.meteringAreas = meteringAreas;
11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.zoom = zoom;
11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoWidth = videoWidth;
11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoHeight = videoHeight;
11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.recordingHint = recordingHint;
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoStabilization = videoStabilization;
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    updatePreviewRequest();
1169d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    updateCaptureRequest();
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11716db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
117261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1173f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
117461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1175a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1176ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1177ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1178ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
1179ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
11803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
11813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return mParamsFlattened;
118261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
118361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
118461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1185a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1186ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
11876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
118861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
118961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
11903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
11913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1192d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1193d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1194d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1195d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    sp<ICameraClient> currentClient;
1196d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1197d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
1198d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
1199d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1200d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Signal errors here upstream
1201d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1202d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1203d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1204d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1205d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1206d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1207d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1208d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1209d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1210d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1211d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1212d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1213d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1214d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1215d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1216d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1217d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1218d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1219d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1220d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1221d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1222d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1223d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
1224d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        void* captureMemory = mCaptureHeap->getBase();
1225d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        size_t size = mCaptureHeap->getSize();
1226d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1227d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1228d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1229d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1230d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient = mCameraClient;
1231d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        switch (mState) {
1232d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case STILL_CAPTURE:
1233d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = STOPPED;
1234d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1235d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case VIDEO_SNAPSHOT:
1236d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = RECORD;
1237d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1238d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1239d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1240d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCameraId, mState);
1241d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1242d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1243d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1244d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
1245d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (currentClient != 0) {
1246d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
1247d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mCaptureMemory, NULL);
1248d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1249d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1250d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
12513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
12523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
12533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
12543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
12553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
12563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
12573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
12583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
12593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
12603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
12613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
12623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
12633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
12643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
12653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
12663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
12673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
12683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
12693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
12703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
12713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
12723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
12733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
12743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
12753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
12763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
12773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
12783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
12793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
12803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
12813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
12823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
12833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
12843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
12853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
12863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
1289a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1290ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
1291ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1292f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
12933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
1294f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
12953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
12963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
12973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
1298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
13003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewWidth = availableProcessedSizes.data.i32[0];
13013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewHeight = availableProcessedSizes.data.i32[1];
13023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoWidth = mParameters.previewWidth;
13033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoHeight = mParameters.previewHeight;
13043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
13053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
13063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
13073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
13083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
13093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight));
1310f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1311f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
1312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1313f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
1314f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
1315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
1316f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
1317f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
13183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1319f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
13203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1321f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
1322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
13253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
13263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
1327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFpsRangeMin = availableFpsRanges.data.i32[0];
13293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFpsRangeMax = availableFpsRanges.data.i32[1];
1330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
13323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
13333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewFpsRangeMin,
13343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewFpsRangeMax));
1335f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1336f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1337f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
1338f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1339f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1340f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
1341f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
1342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
1343f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
13443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1345f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
1346f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1347f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
13483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
13493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
13503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(mParameters.previewFormat)); // NV21
13513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
13523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
13533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1354f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1355f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1356f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
1357f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1358f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1359f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1360f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1361f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1362f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1363bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1364bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1365f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1366f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1367bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1368bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1369f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1370f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1371bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1372bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1373f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1374f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1375bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1376bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1377f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1378f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1379bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1380bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1381f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1382f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1383f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
1384f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1385f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1386f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1387f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1388f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1389f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1390f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1391f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1392f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
13933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1394f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
1395f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1396f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1397f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1398f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
1399f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
14013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.previewFpsRangeMin);
1402f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1403f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1404f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1405f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1406f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
1407f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
1408f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
1409f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1411f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
1412f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1413f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
14153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
14163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
1417f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1418f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
14193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureWidth = availableJpegSizes.data.i32[0];
14203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureHeight = availableJpegSizes.data.i32[1];
1421f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureSize(mParameters.pictureWidth,
14233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.pictureHeight);
1424f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1425f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1426f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
1427f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1428f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
1429f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
1430f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
1431f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
1432f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
1434f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
1435f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1436f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
14383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
14393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
1440f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
14423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
14433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
1444f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1445f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
14463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbWidth = availableJpegThumbnailSizes.data.i32[0];
14473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbHeight = availableJpegThumbnailSizes.data.i32[1];
1448f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
14503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbWidth);
14513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
14523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbHeight);
1453f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1454f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1455f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
1456f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1457f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
1458f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
1459f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
1460f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
1461f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
14623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
1463f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
1464f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1465f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
14663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbQuality = 90;
14673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
14683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbQuality);
14693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegQuality = 90;
14703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
14713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegQuality);
14723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegRotation = 0;
14733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
14743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegRotation);
14753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
14763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsEnabled = false;
14773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsProcessingMethod = "unknown";
14783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
14793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
14803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
14813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
14823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
14833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
14843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
14853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1486f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1487f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
1488f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1489f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1490f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
1491f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1492f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
1493f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
1494bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1495bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
1496f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1497f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
1498bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1499bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
1500f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1501f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
1502bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1503bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
1504f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1505f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
1506bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1507bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
1508f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1509f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
1510bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1511bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
1512f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1513f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
1514bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1515bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
1516f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1517f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
1518bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1519bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
1520f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1521f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
1522bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1523bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
1524f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1525f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
1526f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
1527f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1528f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1529f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1530f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
1531f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1532f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
1533f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1534f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1535f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1536f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
15373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
1538f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
1539f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1540f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
15413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
15423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
15433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
15443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
15453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
15463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
15473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
1548f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1549f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
1550f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1551f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
1552f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
1553f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1554f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
1555f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
1556bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1557bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NONE;
1558f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1559f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
1560bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1561bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_MONO;
1562bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    break;
1563f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
1564bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1565bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
1566f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1567f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
1568bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1569bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
1570f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1571f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
1572bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1573bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
1574f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1575f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
1576bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1577bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
1578f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1579f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
1580bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1581bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
1582f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1583f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
1584bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1585bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
1586f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1587f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
1588bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1589bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
1590f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1591f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1592f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
1593f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1594f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1595f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1596f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1597f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
15983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
1599f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1600f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
16023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
16033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
16043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
16063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
16073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
1608f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1609f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
1610f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1611f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
1612f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
1613f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1614f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
1615f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
1616bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1617bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
1618f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1619f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
1620bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1621bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
1622f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1623f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
1624bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1625bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
1626f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1627f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
1628bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1629bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
1630f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1631f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1632f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1633f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1634f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
1635f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1636f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1637f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1638f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
16393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
1640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
1641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1642f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.sceneMode = ANDROID_CONTROL_OFF;
16443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
16453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
16463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
16483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
16493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
1650f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1651bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
1652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
1653f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
1654f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
1655f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
1656f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1657f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
1658f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1659f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
1660f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1661f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
1662f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
1663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
1666bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1667bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
1668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
1670bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1671bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
1672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1673f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
1674bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1675bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
1676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1677f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
1678bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1679bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
1680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1681f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
1682bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1683bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
1684f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1685f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
1686bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1687bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
1688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
1690bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1691bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
1692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
1694bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1695bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
1696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1697f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
1698bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1699bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
1700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1701f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
1702bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1703bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
1704f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1705f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
1706bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1707bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
1708f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1709f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
1710bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1711bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
1712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
1714bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1715bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
1716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
1718bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1719bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
1720f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
1722bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
1723bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
1724f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
1727bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        __FUNCTION__, mCameraId,
1728bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            availableSceneModes.data.u8[i]);
1729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1731f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1732f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
1733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
17343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
1735f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
1736f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
1737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1738f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
17403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
17413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
1742f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
17443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
17453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
1746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1747f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
17483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
17493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
17503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
17513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
17533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
17543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
17553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
17563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
1757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
1758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
1759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
17603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
17613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
1762f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1763f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
17653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
1766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
17673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
17683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_OFF;
17693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
17703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
17713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
17723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
1773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
17763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
17773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
17783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
17793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
17803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
17813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
17823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
1784f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
17853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
17863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
17873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
17883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
17893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
1790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
17913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
17923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
17933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
17943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
17953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFocusModes = supportedFocusModes + "," +
17963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FOCUS_MODE_INFINITY;
1797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
1798bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
1799f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
1800f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
1801f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
1803f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
1804bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1805bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
1806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
1808bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1809bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
1810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1811f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
1812bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1813bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
1814f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
1816bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1817bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
1818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
1820bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
1821bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
1822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1823bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                // Not supported in old API
1824f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
1825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1828f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
1829f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
1830f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1831f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1832f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1833f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
1835f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
1836f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1837f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
18393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
18403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
1841f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
1843f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
18443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
1845f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
18463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.clear();
18473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
18483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
18503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
18513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
1852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
18543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
18573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
18583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1860f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
1861f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
1862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
1864f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
18653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
18663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
1867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.exposureCompensation = 0;
18693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
18703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                mParameters.exposureCompensation);
1871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
18733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
18743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
18753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
1877f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
18783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
1879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
1880f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
18823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
18833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
18843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
1886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
1887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
1888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoExposureLock = false;
18903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
18913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
18923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
18933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = false;
18963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
18973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
18983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
18993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
19023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
1903f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
19043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
1905f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
1906f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.zoom = 0;
19083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
19093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
1910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
19123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
19133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
1914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
1917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
1918f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
19196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
1920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
19216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
1922f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
1923f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1924f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
1925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
1926f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
19273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
1928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
19313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
19323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
19333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1934f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
1936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
1937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
19393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
19403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
1941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
19423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
1943f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
1944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
19463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(HAL_PIXEL_FORMAT_YCrCb_420_SP));
1947f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
19493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
1950f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
19523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
19553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
19563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
19583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
19593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
1960f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
19623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
19633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
1964f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
19653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
19663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
1967f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1968f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParamsFlattened = params.flatten();
19703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
1972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
197361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
19746db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
1975a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
19766db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
19776db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
19786db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
19796db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
19806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
19816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
19826db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
19836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
19846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
19856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
19863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Adjust for params changes
19876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
19886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
19896db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
1990d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureStream() {
1991d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1992d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
1993d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t maxJpegSize =
1994d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            staticInfo(ANDROID_JPEG_MAX_SIZE);
1995d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
1996d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
1997d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
1998d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
1999d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2000d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2001d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2002d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2003d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2004d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2005d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2006d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2007d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2008d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
2009d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureHeap = new MemoryHeapBase(maxJpegSize.data.i32[0], 0,
2010d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "Camera2Client::CaptureHeap");
2011d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mCaptureHeap->getSize() == 0) {
2012d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2013d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2014d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2015d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2016d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureMemory = new MemoryBase(mCaptureHeap,
2017d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                0, maxJpegSize.data.i32[0]);
2018d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2019d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2020d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create stream for HAL production
2021d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2022d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mParameters.pictureWidth, mParameters.pictureHeight,
2023d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2024d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureStreamId);
2025d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2026d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2027d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2028d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2029d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2030d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2031d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    } else {
2032d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2033d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2034d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2035d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2036d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2037d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2038d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2039d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2040d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2041d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2042d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                currentHeight != (uint32_t)mParameters.pictureHeight) {
2043d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2044d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2045d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2046d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2047d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2048d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2049d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2050d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2051d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return updateCaptureStream();
2052d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2053d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2054d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2055d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2056d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest() {
2057d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2058d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2059d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
2060d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2061d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2062d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2063d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2064d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2065d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2066d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2067d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2068d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // TODO: Adjust for params changes
2069d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2070d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2071d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
20726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) {
20736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
20746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
20756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
20766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
20776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
20786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
20796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
20806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
20816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
20826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
20836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
20846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
20856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
20866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
20876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
20886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
20896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
20906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
20913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
20923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
20933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
20943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
20953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
20963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
20973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
20983cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
20993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
21013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
21023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
21043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
21053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
21073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
21083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
21103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
21113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
21133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
21143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
21173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
21183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
21193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
21203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
21213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
21223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
21233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
21246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
21256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) {
21266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
21276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
21286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
21296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
21306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
21316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
21326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
21336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
21346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
21356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
21366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
21376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
21386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
21396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
21406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
21416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
21426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
21436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
21446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
21456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
21466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) {
21476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
21486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
21496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
21506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
21516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
21526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
21536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
21546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
21556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
21566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
21576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
21586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
21596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
21606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
21616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
21626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
21636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
21646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
21656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
21666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
21676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
21686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
21696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) {
21706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
21716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
21726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
21736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
21746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
21756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
21766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
21776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
21786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
21796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
21806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
21816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
21826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
21836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
21846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
21856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
21866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
21876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
21886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
21896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
21906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
21916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
21926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
21936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
21946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
21956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
21966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
21976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
21986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
21996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
22006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
22016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
22026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
22036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
22046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
22056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
22066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
22076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
22086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
22096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
22106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
22116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
22126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
22136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
22146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
22156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
22166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
22176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
22186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
22196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
22206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *flashMode) {
22216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
22226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
22236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
22246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
22256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
22266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
22276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
22286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
22296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
22306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
22316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
22326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
22336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
22346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
22356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
22366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *focusMode) {
22376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
22386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
22396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
22406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
22416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
22426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
22436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
22446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
22456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
22466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
22476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
22486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
22496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
22506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
22516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
22526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
22536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
22546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
22556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr,
22566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
22576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
22586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    areas->clear();
22596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areasCStr == NULL) {
22606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
22616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push();
22626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return OK;
22636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
22646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 areasStr(areasCStr);
22656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
22666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    while (areaStart != 0) {
22676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
22686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *numEnd;
22696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        int vals[NUM_FIELDS];
22706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
22716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            errno = 0;
22726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
22736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
22746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            area = numEnd + 1;
22756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
22766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push(Parameters::Area(
22776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
22786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
22796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
22806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
22816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
22826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
22836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
22846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                      size_t maxRegions) {
22856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Definition of valid area can be found in
22866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // include/camera/CameraParameters.h
22876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
22886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 1) {
22896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (areas[0].left == 0 &&
22906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].top == 0 &&
22916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].right == 0 &&
22926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].bottom == 0 &&
22936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].weight == 0) {
22946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
22956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return OK;
22966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
22976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
22986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() > maxRegions) {
22996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
23006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, areas.size());
23016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
23026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
23036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
23046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
23056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala         a != areas.end(); a++) {
23066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
23076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
23086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
23096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
23106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
23116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
23126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
23136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
23146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
23156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
23166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
23176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) {
23186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return !boolStr ? false :
23196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
23206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        false;
23216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
23226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
23236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
232461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
2325