Camera2Client.cpp revision 9e4c3db01ba4eb1e5acbed113f78a31374900df6
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),
589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureRequest(NULL),
599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingStreamId(NO_STREAM),
609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingRequest(NULL)
61f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
62a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
64f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDevice = new Camera2Device(cameraId);
65f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
66f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
67f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::initialize(camera_module_t *module)
68f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala{
69a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
709e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
71f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
72f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
73f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = mDevice->initialize(module);
74f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
75f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to initialize device: %s (%d)",
76f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
77f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
78f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
79f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
80f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    res = buildDefaultParameters();
81f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (res != OK) {
82f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGE("%s: Camera %d: unable to build defaults: %s (%d)",
83f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
84f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        return NO_INIT;
85f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
87f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (gLogLevel >= 1) {
88f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        ALOGD("%s: Default parameters converted from camera %d:", __FUNCTION__,
89f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala              mCameraId);
903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGD("%s", mParamsFlattened.string());
91f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
92f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
936db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = STOPPED;
946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
95f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
9661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
9761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
9861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaCamera2Client::~Camera2Client() {
99a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1004ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    ALOGV("%s: Camera %d: Shutting down", __FUNCTION__, mCameraId);
1014ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
102f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    mDestructionStarted = true;
103f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    disconnect();
1053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
10661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
10761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
10861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::dump(int fd, const Vector<String16>& args) {
109611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    String8 result;
1103297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("Client2[%d] (%p) PID: %d, dump:\n",
111611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mCameraId,
112611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            getCameraClient()->asBinder().get(),
113611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala            mClientPid);
1147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("  State: ");
1157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#define CASE_APPEND_ENUM(x) case x: result.append(#x "\n"); break;
1167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append(getStateName(mState));
1187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    result.append("\n  Current parameters:\n");
1207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview size: %d x %d\n",
1217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewWidth, mParameters.previewHeight);
1227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview FPS range: %d - %d\n",
12311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.previewFpsRange[0], mParameters.previewFpsRange[1]);
1247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Preview HAL pixel format: 0x%x\n",
1257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.previewFormat);
12611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    result.appendFormat("    Preview transform: %x\n",
12711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.previewTransform);
1287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Picture size: %d x %d\n",
1297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.pictureWidth, mParameters.pictureHeight);
1307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg thumbnail size: %d x %d\n",
13111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.jpegThumbSize[0], mParameters.jpegThumbSize[1]);
1327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg quality: %d, thumbnail quality: %d\n",
1337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.jpegQuality, mParameters.jpegThumbQuality);
1347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Jpeg rotation: %d\n", mParameters.jpegRotation);
1357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    GPS tags %s\n",
1367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.gpsEnabled ? "enabled" : "disabled");
1377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    if (mParameters.gpsEnabled) {
1387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS lat x long x alt: %f x %f x %f\n",
13911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                mParameters.gpsCoordinates[0], mParameters.gpsCoordinates[1],
14011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                mParameters.gpsCoordinates[2]);
1417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS timestamp: %lld\n",
1427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsTimestamp);
1437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("    GPS processing method: %s\n",
1447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.gpsProcessingMethod.string());
1457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    White balance mode: ");
1487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.wbMode) {
1497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_AUTO)
1507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_INCANDESCENT)
1517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_FLUORESCENT)
1527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_WARM_FLUORESCENT)
1537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_DAYLIGHT)
1547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT)
1557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_TWILIGHT)
1567f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AWB_SHADE)
1577f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1607f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Effect mode: ");
1617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.effectMode) {
1627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_OFF)
1637f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_MONO)
1647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_NEGATIVE)
1657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SOLARIZE)
1667f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_SEPIA)
1677f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_POSTERIZE)
1687f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_WHITEBOARD)
1697f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_BLACKBOARD)
1707f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_EFFECT_AQUA)
1717f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1727f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1737f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1747f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Antibanding mode: ");
1757f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.antibandingMode) {
1767f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_AUTO)
1777f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_OFF)
1787f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_50HZ)
1797f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_AE_ANTIBANDING_60HZ)
1807f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
1817f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
1827f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
1837f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Scene mode: ");
1847f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.sceneMode) {
1857f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
1867f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            result.append("AUTO\n"); break;
1877f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_ACTION)
1887f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PORTRAIT)
1897f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_LANDSCAPE)
1907f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT)
1917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT)
1927f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_THEATRE)
1937f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BEACH)
1947f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SNOW)
1957f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SUNSET)
1967f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO)
1977f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_FIREWORKS)
1987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_SPORTS)
1997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_PARTY)
2007f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT)
2017f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(ANDROID_CONTROL_SCENE_MODE_BARCODE)
2027f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2037f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2047f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2057f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Flash mode: ");
2067f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.flashMode) {
2077f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_OFF)
2087f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_AUTO)
2097f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_ON)
2107f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_TORCH)
2117f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_RED_EYE)
2127f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FLASH_MODE_INVALID)
2137f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2147f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2157f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2167f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focus mode: ");
2177f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    switch (mParameters.focusMode) {
2187f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_AUTO)
2197f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_MACRO)
2207f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_VIDEO)
2217f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_CONTINUOUS_PICTURE)
2227f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_EDOF)
2237f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INFINITY)
2247f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_FIXED)
2257f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        CASE_APPEND_ENUM(Parameters::FOCUS_MODE_INVALID)
2267f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        default: result.append("UNKNOWN\n");
2277f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2287f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2297f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.append("    Focusing areas:\n");
2307f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.focusingAreas.size(); i++) {
2317f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2327f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].left,
2337f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].top,
2347f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].right,
2357f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].bottom,
2367f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.focusingAreas[i].weight);
2377f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2387f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2397f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Exposure compensation index: %d\n",
2407f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.exposureCompensation);
2417f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2427f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    AE lock %s, AWB lock %s\n",
2437f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoExposureLock ? "enabled" : "disabled",
2447f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.autoWhiteBalanceLock ? "enabled" : "disabled" );
2457f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2467f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    result.appendFormat("    Metering areas:\n");
2477f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    for (size_t i = 0; i < mParameters.meteringAreas.size(); i++) {
2487f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala        result.appendFormat("      [ (%d, %d, %d, %d), weight %d ]\n",
2497f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].left,
2507f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].top,
2517f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].right,
2527f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].bottom,
2537f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala                mParameters.meteringAreas[i].weight);
2547f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala    }
2557f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2563297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Zoom index: %d\n", mParameters.zoom);
2573297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video size: %d x %d\n", mParameters.videoWidth,
2587f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoHeight);
2597f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2603297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Recording hint is %s\n",
2617f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.recordingHint ? "set" : "not set");
2627f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2633297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Video stabilization is %s\n",
2647f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala            mParameters.videoStabilization ? "enabled" : "disabled");
2657f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2663297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current streams:\n");
2673297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Preview stream ID: %d\n", mPreviewStreamId);
2683297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.appendFormat("    Capture stream ID: %d\n", mCaptureStreamId);
2693297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2703297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result.append("  Current requests:\n");
2713297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mPreviewRequest != NULL) {
2723297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request:\n");
2733297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2743297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        dump_camera_metadata(mPreviewRequest, fd, 2);
2753297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2763297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result.append("    Preview request: undefined\n");
2773297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2783297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2793297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2803297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (mCaptureRequest != NULL) {
2813297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request:\n";
2823297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2833297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        dump_camera_metadata(mCaptureRequest, fd, 2);
2843297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    } else {
2853297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = "    Capture request: undefined\n";
2863297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2873297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2883297daae9681004775012faba9181d65e097e00cEino-Ville Talvala
2893297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    result = "  Device dump:\n";
290611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    write(fd, result.string(), result.size());
2917f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2923297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    status_t res = mDevice->dump(fd, args);
2933297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    if (res != OK) {
2943297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        result = String8::format("   Error dumping device: %s (%d)",
2953297daae9681004775012faba9181d65e097e00cEino-Ville Talvala                strerror(-res), res);
2963297daae9681004775012faba9181d65e097e00cEino-Ville Talvala        write(fd, result.string(), result.size());
2973297daae9681004775012faba9181d65e097e00cEino-Ville Talvala    }
2987f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala
2997f61084a428a5c7afbeff2fa9e9839baf9018020Eino-Ville Talvala#undef CASE_APPEND_ENUM
300611f61998863d3a3ffae4e5f2b723b7319c59ddfEino-Ville Talvala    return NO_ERROR;
30161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
30261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
3034ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvalaconst char* Camera2Client::getStateName(State state) {
3044ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#define CASE_ENUM_TO_CHAR(x) case x: return(#x); break;
3054ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    switch(state) {
3064ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(NOT_INITIALIZED)
3074ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STOPPED)
3084ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(WAITING_FOR_PREVIEW_WINDOW)
3094ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(PREVIEW)
3104ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(RECORD)
3114ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(STILL_CAPTURE)
3124ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        CASE_ENUM_TO_CHAR(VIDEO_SNAPSHOT)
3134ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        default:
3144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return "Unknown state!";
3154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            break;
3164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
3174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala#undef CASE_ENUM_TO_CHAR
3184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala}
3194ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala
32061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala// ICamera interface
32161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
32261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::disconnect() {
323a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3249e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
325ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
326ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
327f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (mDevice == 0) return;
328f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
329ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
3306db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
331d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    mDevice->waitUntilDrained();
332d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
333d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
3346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mDevice->deleteStream(mPreviewStreamId);
335d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mPreviewStreamId = NO_STREAM;
336d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
337d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
338d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
339d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mDevice->deleteStream(mCaptureStreamId);
340d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureStreamId = NO_STREAM;
3416db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
342f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
343898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
344898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mDevice->deleteStream(mRecordingStreamId);
345898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        mRecordingStreamId = NO_STREAM;
346898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala    }
347898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
34861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    CameraService::Client::disconnect();
34961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
35061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
35161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::connect(const sp<ICameraClient>& client) {
352a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
354ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
355ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != 0 && getCallingPid() != mClientPid) {
3579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Connection attempt from pid %d; "
3589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "current locked to pid %d", __FUNCTION__,
3599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCameraId, getCallingPid(), mClientPid);
3609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return BAD_VALUE;
3619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mClientPid = getCallingPid();
3649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mCameraClient = client;
3659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
36761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
36861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
36961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::lock() {
370a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3719e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
372ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Lock call from pid %d; current client pid %d",
3749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
375ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == 0) {
3779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = getCallingPid();
3789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
3799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid != getCallingPid()) {
3829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Lock call from pid %d; currently locked to pid %d",
3839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
3849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return EBUSY;
3859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
3869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
38861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
38961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
39061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::unlock() {
391a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
3929e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
393ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
3949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Unlock call from pid %d; current client pid %d",
3959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
396ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
3979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Check for uninterruptable conditions
3989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
3999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mClientPid == getCallingPid()) {
4009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mClientPid = 0;
4019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCameraClient.clear();
4029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return OK;
4039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
4059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGE("%s: Camera %d: Unlock call from pid %d; currently locked to pid %d",
4069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            __FUNCTION__, mCameraId, getCallingPid(), mClientPid);
4079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return EBUSY;
40861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
40961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4106db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewDisplay(
4116db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<Surface>& surface) {
412a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4139e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
414ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
415ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4186db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surface != 0) {
4196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surface->asBinder();
4206db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = surface;
4216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
423d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder,window);
42461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
42561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
4266db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::setPreviewTexture(
4276db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        const sp<ISurfaceTexture>& surfaceTexture) {
428a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4299e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
430ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
431ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
4326db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<IBinder> binder;
4336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    sp<ANativeWindow> window;
4346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (surfaceTexture != 0) {
4356db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        binder = surfaceTexture->asBinder();
4366db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        window = new SurfaceTextureClient(surfaceTexture);
4376db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
438d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return setPreviewWindowLocked(binder, window);
4396db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
4406db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
441d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::setPreviewWindowLocked(const sp<IBinder>& binder,
442be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        sp<ANativeWindow> window) {
443a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
4446db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
4456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4466db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (binder == mPreviewSurface) {
4479e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala        ALOGV("%s: Camera %d: New window is same as old window",
4489e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                __FUNCTION__, mCameraId);
4496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return NO_ERROR;
4506db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
4539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case NOT_INITIALIZED:
4549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
4559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
4569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
4579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Cannot set preview display while in state %s",
4589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
4599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
4609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
4619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
4629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK
4639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
4649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
4659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Already running preview - need to stop and create a new stream
4669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Optimize this so that we don't wait for old stream to drain
4679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // before spinning up new stream
4689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mDevice->setStreamingRequest(NULL);
4699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mState = WAITING_FOR_PREVIEW_WINDOW;
4709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
4719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
4729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
473d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->waitUntilDrained();
475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Error waiting for preview to drain: %s (%d)",
477be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
4806db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->deleteStream(mPreviewStreamId);
4816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
482be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Unable to delete old preview stream: %s (%d)",
483be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, strerror(-res), res);
4846db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
4856db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
486be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        mPreviewStreamId = NO_STREAM;
4876db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4886db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
489bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala    mPreviewSurface = binder;
490be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mPreviewWindow = window;
491bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
4926db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mState == WAITING_FOR_PREVIEW_WINDOW) {
493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return startPreviewLocked();
4946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
4956db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
4966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
49761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
49861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
49961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::setPreviewCallbackFlag(int flag) {
500a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
501ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
50261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
50361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
50461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startPreview() {
505a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5069e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
507ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
508d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return startPreviewLocked();
509d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
510ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
511d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::startPreviewLocked() {
512d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
5136db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
5144ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (mState >= PREVIEW) {
5154ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        ALOGE("%s: Can't start preview in state %s",
5164ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala                __FUNCTION__, getStateName(mState));
5174ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return INVALID_OPERATION;
5184ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
5196db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewWindow == 0) {
5216db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        mState = WAITING_FOR_PREVIEW_WINDOW;
5226db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return OK;
5236db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    mState = STOPPED;
5256db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
5279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updatePreviewStream();
529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview stream: %s (%d)",
531be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
5336db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5346db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewRequest == NULL) {
536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updatePreviewRequest();
537be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview request: %s (%d)",
539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
5426db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5436db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mPreviewRequest,
545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mPreviewStreamId, 1);
5476db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
5486db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up preview request: %s (%d)",
5496db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
550be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
551be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
552be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mPreviewRequest);
553be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
554be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting preview request: %s (%d)",
555be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
5566db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
5576db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5586db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5596db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
5606db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (res != OK) {
561bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview request to start preview: "
562bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                "%s (%d)",
5636db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
5646db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        return res;
5656db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
5666db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    mState = PREVIEW;
5676db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
5686db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
56961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
57061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
57161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopPreview() {
572a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
5739e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
574ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
575ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    stopPreviewLocked();
576ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala}
577ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
578ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvalavoid Camera2Client::stopPreviewLocked() {
579ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    ATRACE_CALL();
580d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
581d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case NOT_INITIALIZED:
582d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Call before initialized",
583d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
584d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
585d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
586d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
587d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
588d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot stop preview during still capture.",
589d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
590d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
591d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
592d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // TODO: Handle record stop here
593d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
594d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mDevice->setStreamingRequest(NULL);
595d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
596d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STOPPED;
597d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
598d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
599d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state %d", __FUNCTION__, mCameraId,
600d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    mState);
601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
60261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
60461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::previewEnabled() {
605a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
606ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6076db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return mState == PREVIEW;
60861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
60961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
61061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::storeMetaDataInBuffers(bool enabled) {
611a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
612ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
61361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala    return BAD_VALUE;
61461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
61561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
61661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::startRecording() {
617a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6189e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
619ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
6219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
6229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
6239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = startPreviewLocked();
6249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) return res;
6259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
6279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Ready to go
6289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
6309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
6319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to call this when recording is already on
6329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return OK;
6339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
6359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't start recording in state %s",
6369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
6379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return INVALID_OPERATION;
6389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
6399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
6409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
6419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
6429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = updateRecordingStream();
6439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
6449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording stream: %s (%d)",
6459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
6479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
6489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
6499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingRequest == NULL) {
6509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateRecordingRequest();
6519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
6529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create recording request: %s (%d)",
6539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
6549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
6559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
6569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
6579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
6589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    uint8_t outputStreams[2] = { mPreviewStreamId, mRecordingStreamId };
6599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = updateEntry(mRecordingRequest,
6609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ANDROID_REQUEST_OUTPUT_STREAMS,
6619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            outputStreams, 2);
6629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
6639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up recording request: %s (%d)",
6649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
6669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
6679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = sort_camera_metadata(mRecordingRequest);
6689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
6699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Error sorting recording request: %s (%d)",
6709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
6719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
6729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
6739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
6749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mRecordingRequest);
6759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
6769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set recording request to start "
6779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "recording: %s (%d)", __FUNCTION__, mCameraId,
6789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
6799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
6809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
6819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = RECORD;
6829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
6839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
68461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
68561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
68661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::stopRecording() {
687a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
6889e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
689ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
6909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
6919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    switch (mState) {
6929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case RECORD:
6939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // OK to stop
6949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            break;
6959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STOPPED:
6969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case PREVIEW:
6979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case STILL_CAPTURE:
6989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        case VIDEO_SNAPSHOT:
6999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        default:
7009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't stop recording in state %s",
7019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, getStateName(mState));
7029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
7039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    };
7049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Back to preview. Since record can only be reached through preview,
7069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // all preview stream setup should be up to date.
7079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = mDevice->setStreamingRequest(mPreviewRequest);
7089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
7099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to switch back to preview request: "
7109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
7119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
7129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Should recording heap be freed? Can't do it yet since requests
7159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // could still be in flight.
7169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
7179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mState = PREVIEW;
71861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
71961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalabool Camera2Client::recordingEnabled() {
721a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
722ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return (mState == RECORD || mState == VIDEO_SNAPSHOT);
72461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
72561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
72661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalavoid Camera2Client::releaseRecordingFrame(const sp<IMemory>& mem) {
727a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
728ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Make sure this is for the current heap
7309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ssize_t offset;
7319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t size;
7329cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<IMemoryHeap> heap = mem->getMemory(&offset, &size);
7339cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (heap->getHeapID() != mRecordingHeap->mHeap->getHeapID()) {
7349cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGW("%s: Camera %d: Mismatched heap ID, ignoring release "
7359cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "(got %x, expected %x)", __FUNCTION__, mCameraId,
7369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                heap->getHeapID(), mRecordingHeap->mHeap->getHeapID());
7379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return;
7389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
7399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mRecordingHeapFree++;
74061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
74161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
74261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::autoFocus() {
743a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
744ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7456db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
74661ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
74761ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
74861ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::cancelAutoFocus() {
749a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
750ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
7516db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
75261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
75361ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
75461ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::takePicture(int msgType) {
755a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
756ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
757d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
758d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
759d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
760d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case NOT_INITIALIZED:
761d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STOPPED:
762d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case WAITING_FOR_PREVIEW_WINDOW:
763d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Cannot take picture without preview enabled",
764d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
765d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
766d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
767d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
768d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            // Good to go for takePicture
769d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
770d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case STILL_CAPTURE:
771d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case VIDEO_SNAPSHOT:
772d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Already taking a picture",
773d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
774d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
775d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
776d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
777d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
778d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
779d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = updateCaptureStream();
7804ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    if (res != OK) {
781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Can't set up still image stream: %s (%d)",
782be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
7834ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        return res;
7844ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala    }
785d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
786d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
7874ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        res = updateCaptureRequest();
7884ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        if (res != OK) {
789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create still image capture request: "
790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
7914ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala            return res;
7924ecfec32aca8749baeb634f7c961f804cb1e8f3eEino-Ville Talvala        }
793d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
794d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
795d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t outputStreams;
7969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mState == PREVIEW) {
7979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint8_t streamIds[2] = { mPreviewStreamId, mCaptureStreamId };
7989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
7999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &streamIds, 2);
8009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    } else if (mState == RECORD) {
8019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint8_t streamIds[3] = { mPreviewStreamId, mRecordingStreamId,
8029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                 mCaptureStreamId };
8039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = updateEntry(mCaptureRequest, ANDROID_REQUEST_OUTPUT_STREAMS,
8049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &streamIds, 3);
8059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
8069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
807d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
808d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set up still image capture request: "
809d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
810d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
811d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
812d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = sort_camera_metadata(mCaptureRequest);
814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to sort capture request: %s (%d)",
816be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
817be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
819d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
820d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_t *captureCopy = clone_camera_metadata(mCaptureRequest);
821d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (captureCopy == NULL) {
822d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to copy capture request for HAL device",
823d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
824d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return NO_MEMORY;
825d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
826d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
827d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mState == PREVIEW) {
828d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->setStreamingRequest(NULL);
829d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
830d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to stop preview for still capture: "
831d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)",
832d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
833d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
834d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
835d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
8369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // TODO: Capture should be atomic with setStreamingRequest here
837d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    res = mDevice->capture(captureCopy);
838d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (res != OK) {
839d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to submit still image capture request: "
840d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                "%s (%d)",
841d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
842d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return res;
843d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
844d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
845d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    switch (mState) {
846d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case PREVIEW:
847d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = STILL_CAPTURE;
848d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
849d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        case RECORD:
850d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mState = VIDEO_SNAPSHOT;
851d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            break;
852d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        default:
853d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unknown state for still capture!",
854d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
855d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return INVALID_OPERATION;
856d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
857d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
858d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
85961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
86061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
86161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::setParameters(const String8& params) {
862a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
8639e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala    ALOGV("%s: E", __FUNCTION__);
864ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
8656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
8666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    status_t res;
8676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    CameraParameters newParams(params);
8696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // TODO: Currently ignoring any changes to supposedly read-only
8716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // parameters such as supported preview sizes, etc. Should probably
8726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // produce an error if they're changed.
8736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Extract and verify new parameters */
8756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t i;
8776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_SIZE
8796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewWidth, previewHeight;
8806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPreviewSize(&previewWidth, &previewHeight);
8816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
8826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewWidth != mParameters.previewWidth ||
8836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            previewHeight != mParameters.previewHeight) {
8846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
8856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview size cannot be updated when preview "
8869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "is active! (Currently %d x %d, requested %d x %d",
8879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__,
8889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight,
8899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    previewWidth, previewHeight);
8906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
8916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewSizes =
8936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
8946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewSizes.count; i += 2 ) {
8956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePreviewSizes.data.i32[i] == previewWidth &&
8966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePreviewSizes.data.i32[i+1] == previewHeight) break;
8976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
8986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewSizes.count) {
8996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview size %d x %d is not supported",
9006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, previewWidth, previewHeight);
9016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FPS_RANGE
90611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFpsRange[2];
90711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int previewFps = 0;
9086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool fpsRangeChanged = false;
90911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    newParams.getPreviewFpsRange(&previewFpsRange[0], &previewFpsRange[1]);
91011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    if (previewFpsRange[0] != mParameters.previewFpsRange[0] ||
91111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] != mParameters.previewFpsRange[1]) {
9126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        fpsRangeChanged = true;
9136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePreviewFpsRanges =
9146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
9156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePreviewFpsRanges.count; i += 2) {
9166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if ((availablePreviewFpsRanges.data.i32[i] ==
91711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[0]) &&
9186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                (availablePreviewFpsRanges.data.i32[i+1] ==
91911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    previewFpsRange[1]) ) {
9206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
9216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
9226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePreviewFpsRanges.count) {
9246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview FPS range %d - %d is not supported",
92511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                __FUNCTION__, previewFpsRange[0], previewFpsRange[1]);
9266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
92811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        previewFps = previewFpsRange[0];
9296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FORMAT
9326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int previewFormat = formatStringToEnum(newParams.getPreviewFormat());
9336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (previewFormat != mParameters.previewFormat) {
9346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState >= PREVIEW) {
9356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Preview format cannot be updated when preview "
9366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "is active!", __FUNCTION__);
9376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableFormats =
9406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
9416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableFormats.count; i++) {
9426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableFormats.data.i32[i] == previewFormat) break;
9436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableFormats.count) {
9456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested preview format %s (0x%x) is not supported",
9466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, newParams.getPreviewFormat(), previewFormat);
9476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PREVIEW_FRAME_RATE
9526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Deprecated, only use if the preview fps range is unchanged this time.
9536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // The single-value FPS is the same as the minimum of the range.
9546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (!fpsRangeChanged) {
9556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        previewFps = newParams.getPreviewFrameRate();
9566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (previewFps != mParameters.previewFps) {
9576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableFrameRates =
9586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
9596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableFrameRates.count; i+=2) {
9606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (availableFrameRates.data.i32[i] == previewFps) break;
9616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
9626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableFrameRates.count) {
9636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested preview frame rate %d is not supported",
9646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__, previewFps);
9656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
9666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
96711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[0] = availableFrameRates.data.i32[i];
96811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            previewFpsRange[1] = availableFrameRates.data.i32[i+1];
9696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // PICTURE_SIZE
9736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int pictureWidth, pictureHeight;
9746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getPictureSize(&pictureWidth, &pictureHeight);
9756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (pictureWidth == mParameters.pictureWidth ||
9766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            pictureHeight == mParameters.pictureHeight) {
9776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availablePictureSizes =
9786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES);
9796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availablePictureSizes.count; i+=2) {
9806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availablePictureSizes.data.i32[i] == pictureWidth &&
9816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availablePictureSizes.data.i32[i+1] == pictureHeight) break;
9826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availablePictureSizes.count) {
9846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested picture size %d x %d is not supported",
9856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, pictureWidth, pictureHeight);
9866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
9876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
9886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
9896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
9906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_WIDTH/HEIGHT
99111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    int jpegThumbSize[2];
99211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[0] =
9936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH);
99411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    jpegThumbSize[1] =
9956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT);
99611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    if (jpegThumbSize[0] != mParameters.jpegThumbSize[0] ||
99711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            jpegThumbSize[1] != mParameters.jpegThumbSize[1]) {
9986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableJpegThumbSizes =
9996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES);
10006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableJpegThumbSizes.count; i+=2) {
100111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            if (availableJpegThumbSizes.data.i32[i] == jpegThumbSize[0] &&
100211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    availableJpegThumbSizes.data.i32[i+1] == jpegThumbSize[1]) {
10036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                break;
10046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
10056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableJpegThumbSizes.count) {
10076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested JPEG thumbnail size %d x %d is not supported",
100811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    __FUNCTION__, jpegThumbSize[0], jpegThumbSize[1]);
10096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_THUMBNAIL_QUALITY
10146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegThumbQuality =
10156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY);
10166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegThumbQuality < 0 || jpegThumbQuality > 100) {
10176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG thumbnail quality %d is not supported",
10186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegThumbQuality);
10196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // JPEG_QUALITY
10236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegQuality =
10246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_JPEG_QUALITY);
10256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegQuality < 0 || jpegQuality > 100) {
10266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested JPEG quality %d is not supported",
10276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegQuality);
10286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ROTATION
10326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int jpegRotation =
10336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.getInt(CameraParameters::KEY_ROTATION);
10346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (jpegRotation != 0 &&
10356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 90 &&
10366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 180 &&
10376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            jpegRotation != 270) {
10386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested picture rotation angle %d is not supported",
10396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, jpegRotation);
10406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
10416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // GPS
10446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool gpsEnabled = false;
104511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    double gpsCoordinates[3] = {0,0,0};
10466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int64_t gpsTimestamp = 0;
10476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 gpsProcessingMethod;
10486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    const char *gpsLatStr =
10496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            newParams.get(CameraParameters::KEY_GPS_LATITUDE);
10506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (gpsLatStr != NULL) {
10516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsLongStr =
10526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_LONGITUDE);
10536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsAltitudeStr =
10546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_ALTITUDE);
10556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsTimeStr =
10566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_TIMESTAMP);
10576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *gpsProcMethodStr =
10586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_GPS_PROCESSING_METHOD);
10596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (gpsLongStr == NULL ||
10606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsAltitudeStr == NULL ||
10616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsTimeStr == NULL ||
10626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                gpsProcMethodStr == NULL) {
10636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Incomplete set of GPS parameters provided",
10646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
10656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *endPtr;
10686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
106911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[0] = strtod(gpsLatStr, &endPtr);
10706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLatStr) {
10716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS latitude: %s", __FUNCTION__, gpsLatStr);
10726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
107511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[1] = strtod(gpsLongStr, &endPtr);
10766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsLongStr) {
10776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS longitude: %s", __FUNCTION__, gpsLongStr);
10786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
108111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala        gpsCoordinates[2] = strtod(gpsAltitudeStr, &endPtr);
10826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsAltitudeStr) {
10836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS altitude: %s", __FUNCTION__,
10846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    gpsAltitudeStr);
10856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        errno = 0;
10886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsTimestamp = strtoll(gpsTimeStr, &endPtr, 10);
10896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (errno || endPtr == gpsTimeStr) {
10906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Malformed GPS timestamp: %s", __FUNCTION__, gpsTimeStr);
10916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
10926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
10936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsProcessingMethod = gpsProcMethodStr;
10946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        gpsEnabled = true;
10966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
10976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
10986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // WHITE_BALANCE
10996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int wbMode = wbModeStringToEnum(
11006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_WHITE_BALANCE) );
11016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (wbMode != mParameters.wbMode) {
11026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableWbModes =
11036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
11046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableWbModes.count; i++) {
11056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (wbMode == availableWbModes.data.u8[i]) break;
11066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableWbModes.count) {
11086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested white balance mode %s is not supported",
11096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
11106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_WHITE_BALANCE));
11116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EFFECT
11166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int effectMode = effectModeStringToEnum(
11176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_EFFECT) );
11186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (effectMode != mParameters.effectMode) {
11196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableEffectModes =
11206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
11216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableEffectModes.count; i++) {
11226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (effectMode == availableEffectModes.data.u8[i]) break;
11236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableEffectModes.count) {
11256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested effect mode \"%s\" is not supported",
11266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
11276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_EFFECT) );
11286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ANTIBANDING
11336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int antibandingMode = abModeStringToEnum(
11346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_ANTIBANDING) );
11356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (antibandingMode != mParameters.antibandingMode) {
11366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableAbModes =
11376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
11386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableAbModes.count; i++) {
11396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (antibandingMode == availableAbModes.data.u8[i]) break;
11406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableAbModes.count) {
11426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested antibanding mode \"%s\" is not supported",
11436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
11446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_ANTIBANDING));
11456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // SCENE_MODE
11506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int sceneMode = sceneModeStringToEnum(
11516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_SCENE_MODE) );
11526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (sceneMode != mParameters.sceneMode) {
11536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableSceneModes =
11546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
11556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableSceneModes.count; i++) {
11566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (sceneMode == availableSceneModes.data.u8[i]) break;
11576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableSceneModes.count) {
11596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested scene mode \"%s\" is not supported",
11606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
11616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_SCENE_MODE));
11626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FLASH_MODE
11676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::flashMode_t flashMode = flashModeStringToEnum(
11686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FLASH_MODE) );
11696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (flashMode != mParameters.flashMode) {
11706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t flashAvailable =
11716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
11726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (!flashAvailable.data.u8[0] &&
11736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                flashMode != Parameters::FLASH_MODE_OFF) {
11746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is not supported: "
11756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    "No flash on device", __FUNCTION__,
11766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
11776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == Parameters::FLASH_MODE_RED_EYE) {
11796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t availableAeModes =
11806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
11816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            for (i = 0; i < availableAeModes.count; i++) {
11826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (flashMode == availableAeModes.data.u8[i]) break;
11836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
11846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (i == availableAeModes.count) {
11856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested flash mode \"%s\" is not supported",
11866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
11876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FLASH_MODE));
11886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
11896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
11906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        } else if (flashMode == -1) {
11916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested flash mode \"%s\" is unknown",
11926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__,
11936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    newParams.get(CameraParameters::KEY_FLASH_MODE));
11946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
11956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
11966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
11976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
11986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_MODE
11996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Parameters::focusMode_t focusMode = focusModeStringToEnum(
12006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_FOCUS_MODE));
12016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (focusMode != mParameters.focusMode) {
12026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (focusMode != Parameters::FOCUS_MODE_FIXED) {
12036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            camera_metadata_entry_t minFocusDistance =
12046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE);
12056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (minFocusDistance.data.f[0] == 0) {
12066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                ALOGE("%s: Requested focus mode \"%s\" is not available: "
12076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        "fixed focus lens",
12086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        __FUNCTION__,
12096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                        newParams.get(CameraParameters::KEY_FOCUS_MODE));
12106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                return BAD_VALUE;
12116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            } else if (focusMode != Parameters::FOCUS_MODE_INFINITY) {
12126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                camera_metadata_entry_t availableFocusModes =
12136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
12146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                for (i = 0; i < availableFocusModes.count; i++) {
12156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    if (focusMode == availableFocusModes.data.u8[i]) break;
12166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
12176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                if (i == availableFocusModes.count) {
12186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    ALOGE("%s: Requested focus mode \"%s\" is not supported",
12196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            __FUNCTION__,
12206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                            newParams.get(CameraParameters::KEY_FOCUS_MODE));
12216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    return BAD_VALUE;
12226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                }
12236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            }
12246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // FOCUS_AREAS
12286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> focusingAreas;
12296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_FOCUS_AREAS),
12306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &focusingAreas);
12316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    size_t max3aRegions =
12326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        (size_t)staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1).data.i32[0];
12336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
12346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
12356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested focus areas are malformed: %s",
12366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, newParams.get(CameraParameters::KEY_FOCUS_AREAS));
12376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
12386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // EXPOSURE_COMPENSATION
12416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int exposureCompensation =
12426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.getInt(CameraParameters::KEY_EXPOSURE_COMPENSATION);
12436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
12446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE);
12456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (exposureCompensation < exposureCompensationRange.data.i32[0] ||
12466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            exposureCompensation > exposureCompensationRange.data.i32[1]) {
12476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested exposure compensation index is out of bounds: %d",
12486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, exposureCompensation);
12496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
12506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_EXPOSURE_LOCK (always supported)
12536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoExposureLock = boolFromString(
12546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_EXPOSURE_LOCK));
12556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // AUTO_WHITEBALANCE_LOCK (always supported)
12576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool autoWhiteBalanceLock = boolFromString(
12586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK));
12596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // METERING_AREAS
12616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    Vector<Parameters::Area> meteringAreas;
12626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    res = parseAreas(newParams.get(CameraParameters::KEY_METERING_AREAS),
12636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            &meteringAreas);
12646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res == OK) res = validateAreas(focusingAreas, max3aRegions);
12656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (res != OK) {
12666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested metering areas are malformed: %s",
12676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__,
12686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                newParams.get(CameraParameters::KEY_METERING_AREAS));
12696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
12706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // ZOOM
12736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int zoom = newParams.getInt(CameraParameters::KEY_ZOOM);
12746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (zoom < 0 || zoom > (int)NUM_ZOOM_STEPS) {
12756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Requested zoom level %d is not supported",
12766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, zoom);
12776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
12786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
12796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
12806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_SIZE
12816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    int videoWidth, videoHeight;
12826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    newParams.getVideoSize(&videoWidth, &videoHeight);
12836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoWidth != mParameters.videoWidth ||
12846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            videoHeight != mParameters.videoHeight) {
12856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (mState == RECORD) {
12866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Video size cannot be updated when recording is active!",
12876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__);
12886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
12896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        camera_metadata_entry_t availableVideoSizes =
12916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES);
12926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (i = 0; i < availableVideoSizes.count; i += 2 ) {
12936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (availableVideoSizes.data.i32[i] == videoWidth &&
12946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    availableVideoSizes.data.i32[i+1] == videoHeight)  break;
12956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
12966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (i == availableVideoSizes.count) {
12976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ALOGE("%s: Requested video size %d x %d is not supported",
12986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                    __FUNCTION__, videoWidth, videoHeight);
12996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return BAD_VALUE;
13006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
13016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // RECORDING_HINT (always supported)
13046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool recordingHint = boolFromString(
13056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_RECORDING_HINT) );
13066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // VIDEO_STABILIZATION
13086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    bool videoStabilization = boolFromString(
13096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        newParams.get(CameraParameters::KEY_VIDEO_STABILIZATION) );
13106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
13116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
13126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (videoStabilization && availableVideoStabilizationModes.count == 1) {
13136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Video stabilization not supported", __FUNCTION__);
13146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
13156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    /** Update internal parameters */
13179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
13186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewWidth = previewWidth;
13196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewHeight = previewHeight;
132011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[0] = previewFpsRange[0];
132111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[1] = previewFpsRange[1];
13226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFps = previewFps;
13236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.previewFormat = previewFormat;
13246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.pictureWidth = pictureWidth;
13266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.pictureHeight = pictureHeight;
13276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
132811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[0] = jpegThumbSize[0];
132911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[1] = jpegThumbSize[1];
13306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegQuality = jpegQuality;
13316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.jpegThumbQuality = jpegThumbQuality;
13326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsEnabled = gpsEnabled;
133411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.gpsCoordinates[0] = gpsCoordinates[0];
133511b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.gpsCoordinates[1] = gpsCoordinates[1];
133611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.gpsCoordinates[2] = gpsCoordinates[2];
13376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsTimestamp = gpsTimestamp;
13386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.gpsProcessingMethod = gpsProcessingMethod;
13396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.wbMode = wbMode;
13416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.effectMode = effectMode;
13426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.antibandingMode = antibandingMode;
13436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.sceneMode = sceneMode;
13446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.flashMode = flashMode;
13466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.focusMode = focusMode;
13476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.focusingAreas = focusingAreas;
13496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.exposureCompensation = exposureCompensation;
13506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.autoExposureLock = autoExposureLock;
13516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = autoWhiteBalanceLock;
13526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.meteringAreas = meteringAreas;
13536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.zoom = zoom;
13546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoWidth = videoWidth;
13566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoHeight = videoHeight;
13576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.recordingHint = recordingHint;
13596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    mParameters.videoStabilization = videoStabilization;
13606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
1361be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updatePreviewRequest();
1362be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update preview request: %s (%d)",
1364be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateCaptureRequest();
1368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
1369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update capture request: %s (%d)",
1370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
1371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
1372be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
1373be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
13749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = updateRecordingRequest();
13759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
13769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update recording request: %s (%d)",
13779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, strerror(-res), res);
13789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
13799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
13809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mState == PREVIEW) {
1382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->setStreamingRequest(mPreviewRequest);
1383be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
1384be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new preview request: %s (%d)",
1385be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1386be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
1387be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
13889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    } else if (mState == RECORD || mState == VIDEO_SNAPSHOT) {
13899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->setStreamingRequest(mRecordingRequest);
13909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
13919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error streaming new record request: %s (%d)",
13929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
13939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
13949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1395be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
13966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
13979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    mParamsFlattened = params;
13989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
13996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
140061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
1401f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
140261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville TalvalaString8 Camera2Client::getParameters() const {
1403a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1404ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1405ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1406ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
1407ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
14083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // TODO: Deal with focus distances
14093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return mParamsFlattened;
141061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
141161ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
141261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvalastatus_t Camera2Client::sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) {
1413a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1414ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock icl(mICameraLock);
1415c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1416c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGV("%s: Camera %d: Command %d (%d, %d)", __FUNCTION__, mCameraId,
1417c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            cmd, arg1, arg2);
1418c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1419c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (cmd == CAMERA_CMD_SET_DISPLAY_ORIENTATION) {
1420c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        int transform = degToTransform(arg1,
1421c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                mCameraFacing == CAMERA_FACING_FRONT);
1422c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (transform == -1) {
1423c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            ALOGE("%s: Camera %d: Error setting %d as display orientation value",
1424c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                    __FUNCTION__, mCameraId, arg1);
1425c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return BAD_VALUE;
1426c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
1427c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (transform != mParameters.previewTransform &&
1428c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                mPreviewStreamId != NO_STREAM) {
1429c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mDevice->setStreamTransform(mPreviewStreamId, transform);
1430c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
1431c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        mParameters.previewTransform = transform;
1432c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return OK;
1433c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
1434c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
1435c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGE("%s: Camera %d: Unimplemented command %d (%d, %d)", __FUNCTION__,
1436c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mCameraId, cmd, arg1, arg2);
1437c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
14386db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
143961ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala}
144061ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
14413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Device-related methods */
14423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalavoid Camera2Client::onCaptureAvailable() {
1444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
1445d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
1446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    sp<ICameraClient> currentClient;
14479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ALOGV("%s: Camera %d: Still capture available", __FUNCTION__, mCameraId);
14489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
1449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    CpuConsumer::LockedBuffer imgBuffer;
1450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    {
1451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
1452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1453d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Signal errors here upstream
1454d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (mState != STILL_CAPTURE && mState != VIDEO_SNAPSHOT) {
1455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Still image produced unexpectedly!",
1456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
1457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1458d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1459d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mCaptureConsumer->lockNextBuffer(&imgBuffer);
1461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
1462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving still image buffer: %s (%d)",
1463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
1464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (imgBuffer.format != HAL_PIXEL_FORMAT_BLOB) {
1468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected format for still image: "
1469d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%x, expected %x", __FUNCTION__, mCameraId,
1470d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    imgBuffer.format,
1471d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    HAL_PIXEL_FORMAT_BLOB);
1472d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->unlockBuffer(imgBuffer);
1473d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return;
1474d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1475d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1476d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // TODO: Optimize this to avoid memcopy
14779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        void* captureMemory = mCaptureHeap->mHeap->getBase();
14789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size = mCaptureHeap->mHeap->getSize();
1479d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        memcpy(captureMemory, imgBuffer.data, size);
1480d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1481d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->unlockBuffer(imgBuffer);
1482d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
1483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient = mCameraClient;
1484d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        switch (mState) {
1485d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case STILL_CAPTURE:
1486d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = STOPPED;
1487d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1488d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            case VIDEO_SNAPSHOT:
1489d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                mState = RECORD;
1490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            default:
1492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unexpected state %d", __FUNCTION__,
1493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        mCameraId, mState);
1494d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                break;
1495d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
1496d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1497d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
1498d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (currentClient != 0) {
1499d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        currentClient->dataCallback(CAMERA_MSG_COMPRESSED_IMAGE,
15009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mCaptureHeap->mBuffers[0], NULL);
15019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
15029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
15039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalavoid Camera2Client::onRecordingFrameAvailable() {
15059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
15069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
15079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    sp<ICameraClient> currentClient;
15089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    size_t heapIdx = 0;
15099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    nsecs_t timestamp;
15109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    {
15119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        Mutex::Autolock icl(mICameraLock);
15129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // TODO: Signal errors here upstream
1513898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        bool discardData = false;
15149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mState != RECORD && mState != VIDEO_SNAPSHOT) {
1515898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            ALOGV("%s: Camera %d: Discarding recording image buffers received after "
1516898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala                    "recording done",
15179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
1518898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            discardData = true;
15199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
15209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        CpuConsumer::LockedBuffer imgBuffer;
15229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mRecordingConsumer->lockNextBuffer(&imgBuffer);
15239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
15249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error receiving recording buffer: %s (%d)",
15259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
15269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
15289cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15299cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (imgBuffer.format != (int)kRecordingFormat) {
15309cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unexpected recording format: %x",
15319cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId, imgBuffer.format);
1532898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala            discardData = true;
1533898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        }
1534898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
1535898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala        if (discardData) {
15369cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->unlockBuffer(imgBuffer);
15379cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
1539898a9a9b867e5d209671feee4c92266f90a55aa3Eino-Ville Talvala
15409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t bufferSize = imgBuffer.width * imgBuffer.height * 3 / 2;
15419cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15429cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mRecordingHeap == 0 ||
15439cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                bufferSize >
15449cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mHeap->getSize() / kRecordingHeapCount) {
15459cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGV("%s: Camera %d: Creating recording heap with %d buffers of "
15469cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "size %d bytes", __FUNCTION__, mCameraId,
15479cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    kRecordingHeapCount, bufferSize);
15489cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap != 0) {
15499cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGV("%s: Camera %d: Previous heap has size %d "
15509cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "(new will be %d) bytes", __FUNCTION__, mCameraId,
15519cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        mRecordingHeap->mHeap->getSize(),
15529cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        bufferSize * kRecordingHeapCount);
15539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
15549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // Need to allocate memory for heap
15559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeap.clear();
15569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeap = new Camera2Heap(bufferSize, kRecordingHeapCount,
15589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "Camera2Client::RecordingHeap");
15599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (mRecordingHeap->mHeap->getSize() == 0) {
15609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to allocate memory for recording",
15619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        __FUNCTION__, mCameraId);
15629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingConsumer->unlockBuffer(imgBuffer);
15639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return;
15649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
15659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapHead = 0;
15669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingHeapFree = kRecordingHeapCount;
15679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
15689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // TODO: Optimize this to avoid memcopy
15709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if ( mRecordingHeapFree == 0) {
15719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: No free recording buffers, dropping frame",
15729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    __FUNCTION__, mCameraId);
15739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->unlockBuffer(imgBuffer);
15749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return;
15759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
15769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        heapIdx = mRecordingHeapHead;
15779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        timestamp = imgBuffer.timestamp;
15789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapHead = (mRecordingHeapHead + 1) % kRecordingHeapCount;
15799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingHeapFree--;
15809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGV("%s: Camera %d: Timestamp %lld",
15829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                __FUNCTION__, mCameraId, timestamp);
15839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ssize_t offset;
15859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        size_t size;
15869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        sp<IMemoryHeap> heap =
15879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]->getMemory(&offset,
15889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        &size);
15899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        memcpy((uint8_t*)heap->getBase() + offset, imgBuffer.data, size);
15919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->unlockBuffer(imgBuffer);
15939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
15949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        currentClient = mCameraClient;
15959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
15969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    // Call outside mICameraLock to allow re-entrancy from notification
15979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (currentClient != 0) {
15989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        currentClient->dataCallbackTimestamp(timestamp,
15999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                CAMERA_MSG_VIDEO_FRAME,
16009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mRecordingHeap->mBuffers[heapIdx]);
1601d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
1602d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
1603d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
16043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalacamera_metadata_entry_t Camera2Client::staticInfo(uint32_t tag,
16053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        size_t minCount, size_t maxCount) {
16063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    status_t res;
16073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t entry;
16083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    res = find_camera_metadata_entry(mDevice->info(),
16093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            tag,
16103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            &entry);
16113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (CC_UNLIKELY( res != OK )) {
16123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
16133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
16143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
16153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
16163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Error finding static metadata entry '%s.%s' (%x): %s (%d)",
16183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, strerror(-res), res);
16193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
16203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
16213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else if (CC_UNLIKELY(
16223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (minCount != 0 && entry.count < minCount) ||
16233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            (maxCount != 0 && entry.count > maxCount) ) ) {
16243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagSection = get_camera_metadata_section_name(tag);
16253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagSection == NULL) tagSection = "<unknown>";
16263cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        const char* tagName = get_camera_metadata_tag_name(tag);
16273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        if (tagName == NULL) tagName = "<unknown>";
16283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        ALOGE("Malformed static metadata entry '%s.%s' (%x):"
16293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                "Expected between %d and %d values, but got %d values",
16303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                tagSection, tagName, tag, minCount, maxCount, entry.count);
16313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.count = 0;
16323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        entry.data.u8 = NULL;
16333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
16343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return entry;
16363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
16373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala/** Utility methods */
16393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1640f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1641f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvalastatus_t Camera2Client::buildDefaultParameters() {
1642a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
1643ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala    Mutex::Autolock pl(mParamsLock);
1644ac45eb3dfa7347f7b8c98be1111b2a5f9e344c46Eino-Ville Talvala
1645f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    status_t res;
16463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    CameraParameters params;
1647f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableProcessedSizes =
16493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_PROCESSED_SIZES, 2);
16503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableProcessedSizes.count) return NO_INIT;
1651f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1652f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick more intelligently
16533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewWidth = availableProcessedSizes.data.i32[0];
16543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewHeight = availableProcessedSizes.data.i32[1];
16553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoWidth = mParameters.previewWidth;
16563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.videoHeight = mParameters.previewHeight;
16573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
16583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPreviewSize(mParameters.previewWidth, mParameters.previewHeight);
16593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setVideoSize(mParameters.videoWidth, mParameters.videoHeight);
16603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREFERRED_PREVIEW_SIZE_FOR_VIDEO,
16613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%dx%d",
16623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight));
1663f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1664f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewSizes;
1665f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableProcessedSizes.count; i += 2) {
1666f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewSizes += ",";
1667f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewSizes += String8::format("%dx%d",
1668f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i],
1669f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableProcessedSizes.data.i32[i+1]);
1670f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
16713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_SIZES,
1672f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
16733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_VIDEO_SIZES,
1674f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewSizes);
1675f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1676f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFpsRanges =
16783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES, 2);
16793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFpsRanges.count) return NO_INIT;
1680f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
168111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[0] = availableFpsRanges.data.i32[0];
168211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.previewFpsRange[1] = availableFpsRanges.data.i32[1];
1683f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
16843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FPS_RANGE,
16853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            String8::format("%d,%d",
168611b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    mParameters.previewFpsRange[0],
168711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    mParameters.previewFpsRange[1]));
1688f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1689f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1690f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFpsRange;
1691f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1692f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFpsRange += ",";
1693f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFpsRange += String8::format("(%d,%d)",
1694f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i],
1695f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i+1]);
1696f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
16973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FPS_RANGE,
1698f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFpsRange);
1699f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1700f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.previewFormat = HAL_PIXEL_FORMAT_YCrCb_420_SP;
17023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FORMAT,
17033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            formatEnumToString(mParameters.previewFormat)); // NV21
17043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
1705c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    mParameters.previewTransform = degToTransform(0,
1706c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mCameraFacing == CAMERA_FACING_FRONT);
1707c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
17083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFormats =
17093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_FORMATS);
1710f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1711f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1712f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFormats;
1713f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1714f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFormats.count; i++) {
1715f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedPreviewFormats += ",";
1716f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1717f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableFormats.data.i32[i]) {
1718f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_SP:
1719bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1720bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422SP;
1721f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1722f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCrCb_420_SP:
1723bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1724bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420SP;
1725f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1726f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YCbCr_422_I:
1727bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1728bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV422I;
1729f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1730f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_YV12:
1731bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1732bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_YUV420P;
1733f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1734f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RGB_565:
1735bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedPreviewFormats +=
1736bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGB565;
1737f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
173811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_RGBA_8888:
173911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                supportedPreviewFormats +=
174011b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                    CameraParameters::PIXEL_FORMAT_RGBA8888;
174111b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala                break;
174211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            // Not advertizing JPEG, RAW_SENSOR, etc, for preview formats
1743f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case HAL_PIXEL_FORMAT_RAW_SENSOR:
174411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            case HAL_PIXEL_FORMAT_BLOB:
1745f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1746f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
174711b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala
1748f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1749f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown preview format: %x",
1750f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableFormats.data.i32[i]);
1751f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1752f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1753f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1754f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
17553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FORMATS,
1756f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFormats);
1757f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1758f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1759f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // PREVIEW_FRAME_RATE / SUPPORTED_PREVIEW_FRAME_RATES are deprecated, but
1760f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // still have to do something sane for them
1761f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_PREVIEW_FRAME_RATE,
176311b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.previewFpsRange[0]);
1764f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1765f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1766f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPreviewFrameRates;
1767f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableFpsRanges.count; i += 2) {
1768f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPreviewFrameRates += ",";
1769f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPreviewFrameRates += String8::format("%d",
1770f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableFpsRanges.data.i32[i]);
1771f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
17723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PREVIEW_FRAME_RATES,
1773f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPreviewFrameRates);
1774f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1775f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegSizes =
17773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_JPEG_SIZES, 2);
17783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegSizes.count) return NO_INIT;
1779f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1780f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick maximum
17813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureWidth = availableJpegSizes.data.i32[0];
17823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.pictureHeight = availableJpegSizes.data.i32[1];
1783f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureSize(mParameters.pictureWidth,
17853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.pictureHeight);
1786f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1787f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1788f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedPictureSizes;
1789f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegSizes.count; i += 2) {
1790f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedPictureSizes += ",";
1791f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedPictureSizes += String8::format("%dx%d",
1792f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i],
1793f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegSizes.data.i32[i+1]);
1794f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
17953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_PICTURE_SIZES,
1796f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedPictureSizes);
1797f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1798f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
17993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setPictureFormat(CameraParameters::PIXEL_FORMAT_JPEG);
18003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SUPPORTED_PICTURE_FORMATS,
18013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::PIXEL_FORMAT_JPEG);
1802f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableJpegThumbnailSizes =
18043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_JPEG_AVAILABLE_THUMBNAIL_SIZES, 2);
18053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableJpegThumbnailSizes.count) return NO_INIT;
1806f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1807f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // TODO: Pick default thumbnail size sensibly
180811b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[0] = availableJpegThumbnailSizes.data.i32[0];
180911b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala    mParameters.jpegThumbSize[1] = availableJpegThumbnailSizes.data.i32[1];
1810f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_WIDTH,
181211b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.jpegThumbSize[0]);
18133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_HEIGHT,
181411b7cdef9726f8270f12f6c393600e8fb3c469deEino-Ville Talvala            mParameters.jpegThumbSize[1]);
1815f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
1816f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1817f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedJpegThumbSizes;
1818f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableJpegThumbnailSizes.count; i += 2) {
1819f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (i != 0) supportedJpegThumbSizes += ",";
1820f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            supportedJpegThumbSizes += String8::format("%dx%d",
1821f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i],
1822f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    availableJpegThumbnailSizes.data.i32[i+1]);
1823f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_JPEG_THUMBNAIL_SIZES,
1825f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedJpegThumbSizes);
1826f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1827f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
18283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegThumbQuality = 90;
18293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_THUMBNAIL_QUALITY,
18303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegThumbQuality);
18313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegQuality = 90;
18323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_JPEG_QUALITY,
18333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegQuality);
18343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.jpegRotation = 0;
18353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ROTATION,
18363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            mParameters.jpegRotation);
18373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsEnabled = false;
18393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.gpsProcessingMethod = "unknown";
18403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    // GPS fields in CameraParameters are not set by implementation
18413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.wbMode = ANDROID_CONTROL_AWB_AUTO;
18433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_WHITE_BALANCE,
18443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::WHITE_BALANCE_AUTO);
18453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
18463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableWhiteBalanceModes =
18473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AWB_AVAILABLE_MODES);
1848f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1849f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedWhiteBalance;
1850f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1851f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableWhiteBalanceModes.count; i++) {
1852f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedWhiteBalance += ",";
1853f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1854f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableWhiteBalanceModes.data.u8[i]) {
1855f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_AUTO:
1856bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1857bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_AUTO;
1858f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1859f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_INCANDESCENT:
1860bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1861bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_INCANDESCENT;
1862f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1863f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_FLUORESCENT:
1864bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1865bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_FLUORESCENT;
1866f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1867f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_WARM_FLUORESCENT:
1868bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1869bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT;
1870f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1871f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_DAYLIGHT:
1872bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1873bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_DAYLIGHT;
1874f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1875f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT:
1876bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1877bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT;
1878f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1879f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_TWILIGHT:
1880bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1881bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_TWILIGHT;
1882f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1883f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_SHADE:
1884bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                supportedWhiteBalance +=
1885bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    CameraParameters::WHITE_BALANCE_SHADE;
1886f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1887f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            // Skipping values not mappable to v1 API
1888f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            case ANDROID_CONTROL_AWB_OFF:
1889f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1890f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1891f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            default:
1892f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                ALOGW("%s: Camera %d: Unknown white balance value: %d",
1893f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1894f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        availableWhiteBalanceModes.data.u8[i]);
1895f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                addComma = false;
1896f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
1897f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1898f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
18993cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_WHITE_BALANCE,
1900f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedWhiteBalance);
1901f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1902f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.effectMode = ANDROID_CONTROL_EFFECT_OFF;
19043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EFFECT,
19053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::EFFECT_NONE);
19063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableEffects =
19083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_EFFECTS);
19093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableEffects.count) return NO_INIT;
1910f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1911f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedEffects;
1912f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1913f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableEffects.count; i++) {
1914f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedEffects += ",";
1915f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1916f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableEffects.data.u8[i]) {
1917f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_OFF:
1918bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1919bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NONE;
1920f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1921f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_MONO:
1922bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1923bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_MONO;
1924bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    break;
1925f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_NEGATIVE:
1926bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1927bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_NEGATIVE;
1928f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1929f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SOLARIZE:
1930bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1931bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SOLARIZE;
1932f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1933f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_SEPIA:
1934bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1935bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_SEPIA;
1936f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1937f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_POSTERIZE:
1938bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1939bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_POSTERIZE;
1940f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1941f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_WHITEBOARD:
1942bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1943bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_WHITEBOARD;
1944f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1945f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_BLACKBOARD:
1946bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1947bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_BLACKBOARD;
1948f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1949f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_EFFECT_AQUA:
1950bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedEffects +=
1951bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::EFFECT_AQUA;
1952f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1953f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1954f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown effect value: %d",
1955f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableEffects.data.u8[i]);
1956f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1957f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1958f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
1959f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
19603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_EFFECTS, supportedEffects);
1961f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
1962f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
19633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.antibandingMode = ANDROID_CONTROL_AE_ANTIBANDING_AUTO;
19643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ANTIBANDING,
19653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::ANTIBANDING_AUTO);
19663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
19673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAntibandingModes =
19683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_ANTIBANDING_MODES);
19693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAntibandingModes.count) return NO_INIT;
1970f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
1971f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 supportedAntibanding;
1972f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
1973f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAntibandingModes.count; i++) {
1974f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedAntibanding += ",";
1975f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
1976f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAntibandingModes.data.u8[i]) {
1977f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_OFF:
1978bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1979bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_OFF;
1980f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1981f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_50HZ:
1982bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1983bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_50HZ;
1984f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1985f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_60HZ:
1986bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1987bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_60HZ;
1988f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1989f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AE_ANTIBANDING_AUTO:
1990bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedAntibanding +=
1991bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::ANTIBANDING_AUTO;
1992f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1993f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
1994f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown antibanding value: %d",
1995f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId,
1996f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                            availableAntibandingModes.data.u8[i]);
1997f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
1998f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
1999f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2000f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
20013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_ANTIBANDING,
2002f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedAntibanding);
2003f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2004f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
20053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.sceneMode = ANDROID_CONTROL_OFF;
20063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SCENE_MODE,
20073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::SCENE_MODE_AUTO);
20083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
20093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableSceneModes =
20103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_SCENE_MODES);
20113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableSceneModes.count) return NO_INIT;
2012f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2013bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala        String8 supportedSceneModes(CameraParameters::SCENE_MODE_AUTO);
2014f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2015f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool noSceneModes = false;
2016f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableSceneModes.count; i++) {
2017f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedSceneModes += ",";
2018f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2019f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableSceneModes.data.u8[i]) {
2020f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED:
2021f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    noSceneModes = true;
2022f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2023f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FACE_PRIORITY:
2024f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    // Not in old API
2025f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2026f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2027f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_ACTION:
2028bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2029bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_ACTION;
2030f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2031f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PORTRAIT:
2032bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2033bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PORTRAIT;
2034f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2035f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_LANDSCAPE:
2036bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2037bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_LANDSCAPE;
2038f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2039f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT:
2040bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2041bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT;
2042f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2043f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT:
2044bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2045bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_NIGHT_PORTRAIT;
2046f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2047f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_THEATRE:
2048bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2049bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_THEATRE;
2050f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2051f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BEACH:
2052bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2053bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BEACH;
2054f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2055f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SNOW:
2056bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2057bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SNOW;
2058f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2059f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SUNSET:
2060bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2061bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SUNSET;
2062f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2063f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO:
2064bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2065bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_STEADYPHOTO;
2066f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2067f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_FIREWORKS:
2068bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2069bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_FIREWORKS;
2070f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2071f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_SPORTS:
2072bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2073bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_SPORTS;
2074f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2075f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_PARTY:
2076bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2077bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_PARTY;
2078f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2079f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT:
2080bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2081bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_CANDLELIGHT;
2082f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2083f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_SCENE_MODE_BARCODE:
2084bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedSceneModes +=
2085bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::SCENE_MODE_BARCODE;
2086f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2087f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2088f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown scene mode value: %d",
2089bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        __FUNCTION__, mCameraId,
2090bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                            availableSceneModes.data.u8[i]);
2091f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2092f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2093f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2094f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
2095f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        if (!noSceneModes) {
20963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            params.set(CameraParameters::KEY_SUPPORTED_SCENE_MODES,
2097f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    supportedSceneModes);
2098f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
2099f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2100f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t flashAvailable =
21023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_FLASH_AVAILABLE, 1, 1);
21033cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!flashAvailable.count) return NO_INIT;
2104f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21053cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAeModes =
21063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_AVAILABLE_MODES);
21073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAeModes.count) return NO_INIT;
2108f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2109f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (flashAvailable.data.u8[0]) {
21103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_AUTO;
21113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
21123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_AUTO);
21133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
21143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFlashModes(CameraParameters::FLASH_MODE_OFF);
21153cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFlashModes = supportedFlashModes +
21163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_AUTO +
21173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_ON +
21183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            "," + CameraParameters::FLASH_MODE_TORCH;
2119f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAeModes.count; i++) {
2120f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (availableAeModes.data.u8[i] ==
2121f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE) {
21223cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                supportedFlashModes = supportedFlashModes + "," +
21233cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    CameraParameters::FLASH_MODE_RED_EYE;
2124f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                break;
2125f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2126f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
2128f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFlashModes);
21293cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    } else {
21303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.flashMode = Parameters::FLASH_MODE_OFF;
21313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FLASH_MODE,
21323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
21333cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FLASH_MODES,
21343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FLASH_MODE_OFF);
2135f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2136f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
21373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t minFocusDistance =
21383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_MINIMUM_FOCUS_DISTANCE, 1, 1);
21393cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!minFocusDistance.count) return NO_INIT;
21403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
21413cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableAfModes =
21423cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AF_AVAILABLE_MODES);
21433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableAfModes.count) return NO_INIT;
21443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2145f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (minFocusDistance.data.f[0] == 0) {
2146f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        // Fixed-focus lens
21473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_FIXED;
21483cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
21493cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
21503cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
21513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_FIXED);
2152f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
21533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        mParameters.focusMode = Parameters::FOCUS_MODE_AUTO;
21543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_FOCUS_MODE,
21553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FOCUS_MODE_AUTO);
21563cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        String8 supportedFocusModes(CameraParameters::FOCUS_MODE_FIXED);
21573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        supportedFocusModes = supportedFocusModes + "," +
21583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FOCUS_MODE_INFINITY;
2159f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = true;
2160bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala
2161f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        for (size_t i=0; i < availableAfModes.count; i++) {
2162f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) supportedFocusModes += ",";
2163f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2164f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            switch (availableAfModes.data.u8[i]) {
2165f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_AUTO:
2166bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2167bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_AUTO;
2168f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2169f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_MACRO:
2170bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2171bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_MACRO;
2172f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2173f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_VIDEO:
2174bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2175bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO;
2176f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2177f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_CONTINUOUS_PICTURE:
2178bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2179bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE;
2180f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2181f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_EDOF:
2182bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                    supportedFocusModes +=
2183bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                        CameraParameters::FOCUS_MODE_EDOF;
2184f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2185bd47b7bcfe7f5a97fef81143f4282c41590626feEino-Ville Talvala                // Not supported in old API
2186f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                case ANDROID_CONTROL_AF_OFF:
2187f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2188f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2189f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                default:
2190f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    ALOGW("%s: Camera %d: Unknown AF mode value: %d",
2191f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                        __FUNCTION__, mCameraId, availableAfModes.data.u8[i]);
2192f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    addComma = false;
2193f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                    break;
2194f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            }
2195f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
21963cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_SUPPORTED_FOCUS_MODES,
2197f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala                supportedFocusModes);
2198f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2199f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t max3aRegions =
22013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_MAX_REGIONS, 1, 1);
22023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!max3aRegions.count) return NO_INIT;
2203f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_FOCUS_AREAS,
2205f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
22063cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_AREAS,
2207f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
22083cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.clear();
22093cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.focusingAreas.add(Parameters::Area(0,0,0,0,0));
22103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableFocalLengths =
22123cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_LENS_AVAILABLE_FOCAL_LENGTHS);
22133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableFocalLengths.count) return NO_INIT;
2214f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2215f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float minFocalLength = availableFocalLengths.data.f[0];
22163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_FOCAL_LENGTH, minFocalLength);
2217f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t sensorSize =
22193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SENSOR_PHYSICAL_SIZE, 2, 2);
22203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!sensorSize.count) return NO_INIT;
2221f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2222f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    // The fields of view here assume infinity focus, maximum wide angle
2223f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float horizFov = 180 / M_PI *
2224f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[0] / (2 * minFocalLength));
2225f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    float vertFov  = 180 / M_PI *
2226f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            2 * atanf(sensorSize.data.f[1] / (2 * minFocalLength));
22273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_HORIZONTAL_VIEW_ANGLE, horizFov);
22283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_VERTICAL_VIEW_ANGLE, vertFov);
2229f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22303cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.exposureCompensation = 0;
22313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_EXPOSURE_COMPENSATION,
22323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                mParameters.exposureCompensation);
2233f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22343cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationRange =
22353cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_RANGE, 2, 2);
22363cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationRange.count) return NO_INIT;
22373cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22383cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_EXPOSURE_COMPENSATION,
2239f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[1]);
22403cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MIN_EXPOSURE_COMPENSATION,
2241f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationRange.data.i32[0]);
2242f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22433cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t exposureCompensationStep =
22443cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AE_EXP_COMPENSATION_STEP, 1, 1);
22453cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!exposureCompensationStep.count) return NO_INIT;
22463cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
22473cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.setFloat(CameraParameters::KEY_EXPOSURE_COMPENSATION_STEP,
2248f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].numerator /
2249f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            exposureCompensationStep.data.r[0].denominator);
2250f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22513cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoExposureLock = false;
22523cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK,
22533cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
22543cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_EXPOSURE_LOCK_SUPPORTED,
22553cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2256f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22573cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.autoWhiteBalanceLock = false;
22583cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK,
22593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
22603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_AUTO_WHITEBALANCE_LOCK_SUPPORTED,
22613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2262f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.meteringAreas.add(Parameters::Area(0, 0, 0, 0, 0));
22643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_METERING_AREAS,
2265f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            max3aRegions.data.i32[0]);
22663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_METERING_AREAS,
2267f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "(0,0,0,0,0)");
2268f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParameters.zoom = 0;
22703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM, mParameters.zoom);
22713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_ZOOM, NUM_ZOOM_STEPS - 1);
2272f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
22743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM, 1, 1);
22753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!maxDigitalZoom.count) return NO_INIT;
2276f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2277f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    {
2278f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        String8 zoomRatios;
2279f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoom = 1.f;
2280f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        float zoomIncrement = (maxDigitalZoom.data.f[0] - zoom) /
22816db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                (NUM_ZOOM_STEPS-1);
2282f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        bool addComma = false;
22836db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        for (size_t i=0; i < NUM_ZOOM_STEPS; i++) {
2284f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            if (addComma) zoomRatios += ",";
2285f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            addComma = true;
2286f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoomRatios += String8::format("%d", static_cast<int>(zoom * 100));
2287f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            zoom += zoomIncrement;
2288f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala        }
22893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_ZOOM_RATIOS, zoomRatios);
2290f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2291f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22923cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_ZOOM_SUPPORTED,
22933cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
22943cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_SMOOTH_ZOOM_SUPPORTED,
22953cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2296f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
22973cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_FOCUS_DISTANCES,
2298f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            "Infinity,Infinity,Infinity");
2299f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23003cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t maxFacesDetected =
23013cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_STATS_MAX_FACE_COUNT, 1, 1);
23023cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_HW,
2303f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            maxFacesDetected.data.i32[0]);
23043cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_MAX_NUM_DETECTED_FACES_SW,
2305f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala            0);
2306f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23073cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_FRAME_FORMAT,
23089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            formatEnumToString(kRecordingFormat));
2309f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23103cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_RECORDING_HINT,
23113cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
2312f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23133cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_SNAPSHOT_SUPPORTED,
23143cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::TRUE);
2315f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23163cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    params.set(CameraParameters::KEY_VIDEO_STABILIZATION,
23173cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            CameraParameters::FALSE);
23183cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
23193cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    camera_metadata_entry_t availableVideoStabilizationModes =
23203cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        staticInfo(ANDROID_CONTROL_AVAILABLE_VIDEO_STABILIZATION_MODES);
23213cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    if (!availableVideoStabilizationModes.count) return NO_INIT;
2322f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
2323f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    if (availableVideoStabilizationModes.count > 1) {
23243cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
23253cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::TRUE);
2326f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    } else {
23273cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        params.set(CameraParameters::KEY_VIDEO_STABILIZATION_SUPPORTED,
23283cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                CameraParameters::FALSE);
2329f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    }
2330f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala
23313cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    mParamsFlattened = params.flatten();
23323cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala
2333f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala    return OK;
2334f69c70ded4316ea3ee504ac779bd024433ed4ef7Eino-Ville Talvala}
233561ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala
2336be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updatePreviewStream() {
2337be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2338be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2339be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId != NO_STREAM) {
2340be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Check if stream parameters have to change
2341be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t currentWidth, currentHeight;
2342be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->getStreamInfo(mPreviewStreamId,
2343be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &currentWidth, &currentHeight, 0);
2344be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2345be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying preview stream info: "
2346be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2347be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2348be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2349be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (currentWidth != (uint32_t)mParameters.previewWidth ||
2350be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                currentHeight != (uint32_t)mParameters.previewHeight) {
23519e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala            ALOGV("%s: Camera %d: Preview size switch: %d x %d -> %d x %d",
23529e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    __FUNCTION__, mCameraId, currentWidth, currentHeight,
23539e4c3db01ba4eb1e5acbed113f78a31374900df6Eino-Ville Talvala                    mParameters.previewWidth, mParameters.previewHeight);
2354be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->waitUntilDrained();
2355be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2356be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Error waiting for preview to drain: "
2357be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2358be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2359be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2360be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            res = mDevice->deleteStream(mPreviewStreamId);
2361be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            if (res != OK) {
2362be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2363be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        "for preview: %s (%d)", __FUNCTION__, mCameraId,
2364be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                        strerror(-res), res);
2365be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                return res;
2366be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            }
2367be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mPreviewStreamId = NO_STREAM;
2368be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2369be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2370be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2371be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mPreviewStreamId == NO_STREAM) {
2372be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mPreviewWindow,
2373be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.previewWidth, mParameters.previewHeight,
2374be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                CAMERA2_HAL_PIXEL_FORMAT_OPAQUE, 0,
2375be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mPreviewStreamId);
2376be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2377be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create preview stream: %s (%d)",
2378be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    __FUNCTION__, mCameraId, strerror(-res), res);
2379be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2380be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2381be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2382be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2383c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    res = mDevice->setStreamTransform(mPreviewStreamId,
2384c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            mParameters.previewTransform);
2385c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (res != OK) {
2386c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        ALOGE("%s: Camera %d: Unable to set preview stream transform: "
2387c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala                "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2388c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        return res;
2389c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
2390c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala
2391be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2392be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2393be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
23946db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvalastatus_t Camera2Client::updatePreviewRequest() {
2395a189097d0c96fac9afa86e644312ffbb0027b124Eino-Ville Talvala    ATRACE_CALL();
23966db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    status_t res;
23976db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    if (mPreviewRequest == NULL) {
23986db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_PREVIEW,
23996db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                &mPreviewRequest);
24006db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        if (res != OK) {
24016db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default preview request: "
24026db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
24036db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala            return res;
24046db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala        }
24056db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    }
2406be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2407be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateRequestCommon(mPreviewRequest);
2408be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2409be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of preview "
2410be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2411be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2412be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2413be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2414be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
24156db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala    return OK;
24166db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala}
24176db981c45a964f0d9df4c3451f064dff7954d78eEino-Ville Talvala
2418d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureStream() {
2419be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2420d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2421d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    // Find out buffer size for JPEG
2422d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    camera_metadata_entry_t maxJpegSize =
2423d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            staticInfo(ANDROID_JPEG_MAX_SIZE);
2424d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (maxJpegSize.count == 0) {
2425d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        ALOGE("%s: Camera %d: Can't find ANDROID_JPEG_MAX_SIZE!",
2426d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                __FUNCTION__, mCameraId);
2427d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        return INVALID_OPERATION;
2428d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2429d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2430d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureConsumer == 0) {
2431d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create CPU buffer queue endpoint
2432d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer = new CpuConsumer(1);
2433d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setFrameAvailableListener(new CaptureWaiter(this));
2434d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureConsumer->setName(String8("Camera2Client::CaptureConsumer"));
2435d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        mCaptureWindow = new SurfaceTextureClient(
2436d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureConsumer->getProducerInterface());
2437d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Create memory for API consumption
24389cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mCaptureHeap = new Camera2Heap(maxJpegSize.data.i32[0], 1,
24399cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                                       "Camera2Client::CaptureHeap");
24409cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (mCaptureHeap->mHeap->getSize() == 0) {
2441d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to allocate memory for capture",
2442d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    __FUNCTION__, mCameraId);
2443d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return NO_MEMORY;
2444d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2445d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2446d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
2447be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId != NO_STREAM) {
2448d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        // Check if stream parameters have to change
2449d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        uint32_t currentWidth, currentHeight;
2450d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->getStreamInfo(mCaptureStreamId,
2451d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &currentWidth, &currentHeight, 0);
2452d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2453d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Error querying capture output stream info: "
2454d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2455d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2456d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2457d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (currentWidth != (uint32_t)mParameters.pictureWidth ||
2458d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                currentHeight != (uint32_t)mParameters.pictureHeight) {
2459d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            res = mDevice->deleteStream(mCaptureStreamId);
2460d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            if (res != OK) {
2461d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
2462d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        "for capture: %s (%d)", __FUNCTION__, mCameraId,
2463d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                        strerror(-res), res);
2464d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                return res;
2465d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            }
2466d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            mCaptureStreamId = NO_STREAM;
2467d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2468d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2469be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2470be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mCaptureStreamId == NO_STREAM) {
2471be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        // Create stream for HAL production
2472be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = mDevice->createStream(mCaptureWindow,
2473be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.pictureWidth, mParameters.pictureHeight,
2474be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                HAL_PIXEL_FORMAT_BLOB, maxJpegSize.data.i32[0],
2475be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mCaptureStreamId);
2476be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) {
2477be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for capture: "
2478be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2479be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return res;
2480be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        }
2481be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2482be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2483d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2484d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2485be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2486d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvalastatus_t Camera2Client::updateCaptureRequest() {
2487d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    ATRACE_CALL();
2488d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    status_t res;
2489d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    if (mCaptureRequest == NULL) {
2490d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_STILL_CAPTURE,
2491d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                &mCaptureRequest);
2492d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        if (res != OK) {
2493d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default still image request:"
2494d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
2495d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala            return res;
2496d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala        }
2497d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    }
2498be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2499be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateRequestCommon(mCaptureRequest);
2500be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2501be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of capture "
2502be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
2503be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                strerror(-res), res);
2504be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2505be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2506be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2507be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2508be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_SIZE,
2509be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            mParameters.jpegThumbSize, 2);
2510be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2511be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2512be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_THUMBNAIL_QUALITY,
2513be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.jpegThumbQuality, 1);
2514be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2515be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2516be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_QUALITY,
2517be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.jpegQuality, 1);
2518be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2519be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(mCaptureRequest,
2520be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_JPEG_ORIENTATION,
2521be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.jpegRotation, 1);
2522be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2523be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2524be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mParameters.gpsEnabled) {
2525be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2526be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES,
2527be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.gpsCoordinates, 3);
2528be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2529be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2530be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP,
2531be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mParameters.gpsTimestamp, 1);
2532be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2533be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(mCaptureRequest,
2534be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD,
2535be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.gpsProcessingMethod.string(),
2536be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.gpsProcessingMethod.size());
2537be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2538be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2539be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2540be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_COORDINATES);
2541be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2542be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2543be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_TIMESTAMP);
2544be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2545be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = deleteEntry(mCaptureRequest,
2546be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_JPEG_GPS_PROCESSING_METHOD);
2547be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2548be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2549be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2550d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala    return OK;
2551d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala}
2552d4bcfde6bf3e7b28e36f6ec66e6d9e5adebfa949Eino-Ville Talvala
25539cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Client::updateRecordingRequest() {
25549cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    ATRACE_CALL();
25559cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
25569cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingRequest == NULL) {
25579cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createDefaultRequest(CAMERA2_TEMPLATE_VIDEO_RECORD,
25589cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &mRecordingRequest);
25599cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
25609cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Unable to create default recording request:"
25619cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    " %s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
25629cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
25639cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
25649cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
25659cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
25669cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    res = updateRequestCommon(mRecordingRequest);
25679cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (res != OK) {
25689cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        ALOGE("%s: Camera %d: Unable to update common entries of recording "
25699cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                "request: %s (%d)", __FUNCTION__, mCameraId,
25709cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                strerror(-res), res);
25719cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        return res;
25729cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
25739cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
25749cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
25759cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
25769cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
25779cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvalastatus_t Camera2Client::updateRecordingStream() {
25789cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    status_t res;
25799cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
25809cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingConsumer == 0) {
25819cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Create CPU buffer queue endpoint
25829cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer = new CpuConsumer(1);
25839cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setFrameAvailableListener(new RecordingWaiter(this));
25849cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingConsumer->setName(String8("Camera2Client::RecordingConsumer"));
25859cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        mRecordingWindow = new SurfaceTextureClient(
25869cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingConsumer->getProducerInterface());
25879cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Allocate memory later, since we don't know buffer size until receipt
25889cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
25899cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
25909cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId != NO_STREAM) {
25919cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        // Check if stream parameters have to change
25929cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        uint32_t currentWidth, currentHeight;
25939cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->getStreamInfo(mRecordingStreamId,
25949cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                &currentWidth, &currentHeight, 0);
25959cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
25969cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Error querying recording output stream info: "
25979cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
25989cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
25999cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
26009cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (currentWidth != (uint32_t)mParameters.videoWidth ||
26019cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                currentHeight != (uint32_t)mParameters.videoHeight) {
26029cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            // TODO: Should wait to be sure previous recording has finished
26039cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            res = mDevice->deleteStream(mRecordingStreamId);
26049cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            if (res != OK) {
26059cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                ALOGE("%s: Camera %d: Unable to delete old output stream "
26069cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        "for recording: %s (%d)", __FUNCTION__, mCameraId,
26079cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                        strerror(-res), res);
26089cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                return res;
26099cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            }
26109cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            mRecordingStreamId = NO_STREAM;
26119cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
26129cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
26139cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
26149cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    if (mRecordingStreamId == NO_STREAM) {
26159cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        res = mDevice->createStream(mRecordingWindow,
26169cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                mParameters.videoWidth, mParameters.videoHeight,
26179cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                kRecordingFormat, 0, &mRecordingStreamId);
26189cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        if (res != OK) {
26199cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            ALOGE("%s: Camera %d: Can't create output stream for recording: "
26209cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala                    "%s (%d)", __FUNCTION__, mCameraId, strerror(-res), res);
26219cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala            return res;
26229cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala        }
26239cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    }
26249cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
26259cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala    return OK;
26269cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala}
26279cca4c6d976d2d4127286e9eaa54d1b99880c25cEino-Ville Talvala
2628be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateRequestCommon(camera_metadata_t *request) {
2629be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    ATRACE_CALL();
2630be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2631be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2632be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_TARGET_FPS_RANGE, mParameters.previewFpsRange, 2);
2633be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2634be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2635be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t wbMode = mParameters.autoWhiteBalanceLock ?
2636be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_LOCKED : mParameters.wbMode;
2637be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2638be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_MODE, &wbMode, 1);
2639be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2640be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2641be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_EFFECT_MODE, &mParameters.effectMode, 1);
2642be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2643be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2644be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_MODE,
2645be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.antibandingMode, 1);
2646be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2647be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2648be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t controlMode =
2649be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (mParameters.sceneMode == ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED) ?
2650be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AUTO : ANDROID_CONTROL_USE_SCENE_MODE;
2651be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2652be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_MODE, &controlMode, 1);
2653be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2654be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (controlMode == ANDROID_CONTROL_USE_SCENE_MODE) {
2655be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = updateEntry(request,
2656be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                ANDROID_CONTROL_SCENE_MODE,
2657be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                &mParameters.sceneMode, 1);
2658be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        if (res != OK) return res;
2659be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2660be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2661be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t flashMode = ANDROID_FLASH_OFF;
2662be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t aeMode;
2663be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    switch (mParameters.flashMode) {
2664be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_OFF:
2665be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON; break;
2666be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_AUTO:
2667be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH; break;
2668be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_ON:
2669be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_ALWAYS_FLASH; break;
2670be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_TORCH:
2671be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON;
2672be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            flashMode = ANDROID_FLASH_TORCH;
2673be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2674be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FLASH_MODE_RED_EYE:
2675be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            aeMode = ANDROID_CONTROL_AE_ON_AUTO_FLASH_REDEYE; break;
2676be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2677be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown flash mode %d", __FUNCTION__,
2678be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mCameraId, mParameters.flashMode);
2679be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2680be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2681be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mParameters.autoExposureLock) aeMode = ANDROID_CONTROL_AE_LOCKED;
2682be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2683be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2684be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_FLASH_MODE, &flashMode, 1);
2685be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2686be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2687be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_MODE, &aeMode, 1);
2688be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2689be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2690be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float focusDistance = 0; // infinity focus in diopters
2691be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t focusMode;
2692be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    switch (mParameters.focusMode) {
2693be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_AUTO:
2694be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_MACRO:
2695be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_VIDEO:
2696be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_CONTINUOUS_PICTURE:
2697be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_EDOF:
2698be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = mParameters.focusMode;
2699be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2700be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_INFINITY:
2701be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        case Parameters::FOCUS_MODE_FIXED:
2702be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            focusMode = ANDROID_CONTROL_AF_OFF;
2703be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            break;
2704be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        default:
2705be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ALOGE("%s: Camera %d: Unknown focus mode %d", __FUNCTION__,
2706be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                    mCameraId, mParameters.focusMode);
2707be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            return BAD_VALUE;
2708be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2709be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2710be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_LENS_FOCUS_DISTANCE, &focusDistance, 1);
2711be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2712be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2713be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_MODE, &focusMode, 1);
2714be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2715be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2716be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    size_t focusingAreasSize = mParameters.focusingAreas.size() * 5;
2717be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *focusingAreas = new int32_t[focusingAreasSize];
2718be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < focusingAreasSize; i += 5) {
2719be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 0] = mParameters.focusingAreas[i].left;
2720be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 1] = mParameters.focusingAreas[i].top;
2721be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 2] = mParameters.focusingAreas[i].right;
2722be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 3] = mParameters.focusingAreas[i].bottom;
2723be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        focusingAreas[i + 4] = mParameters.focusingAreas[i].weight;
2724be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2725be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2726be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AF_REGIONS, focusingAreas,focusingAreasSize);
2727be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2728be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] focusingAreas;
2729be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2730be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2731be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_EXP_COMPENSATION,
2732be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &mParameters.exposureCompensation, 1);
2733be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2734be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2735be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    size_t meteringAreasSize = mParameters.meteringAreas.size() * 5;
2736be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t *meteringAreas = new int32_t[meteringAreasSize];
2737be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    for (size_t i = 0; i < meteringAreasSize; i += 5) {
2738be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 0] = mParameters.meteringAreas[i].left;
2739be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 1] = mParameters.meteringAreas[i].top;
2740be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 2] = mParameters.meteringAreas[i].right;
2741be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 3] = mParameters.meteringAreas[i].bottom;
2742be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        meteringAreas[i + 4] = mParameters.meteringAreas[i].weight;
2743be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2744be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2745be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AE_REGIONS, meteringAreas, meteringAreasSize);
2746be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2747be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2748be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2749be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_AWB_REGIONS, meteringAreas, meteringAreasSize);
2750be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2751be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    delete[] meteringAreas;
2752be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2753be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // Need to convert zoom index into a crop rectangle. The rectangle is
2754be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // chosen to maximize its area on the sensor
2755be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2756be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t maxDigitalZoom =
2757be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SCALER_AVAILABLE_MAX_ZOOM);
2758be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomIncrement = (maxDigitalZoom.data.f[0] - 1) /
2759be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            (NUM_ZOOM_STEPS-1);
2760be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomRatio = 1 + zoomIncrement * mParameters.zoom;
2761be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2762be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t activePixelArraySize =
2763be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            staticInfo(ANDROID_SENSOR_ACTIVE_ARRAY_SIZE, 2, 2);
2764be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayWidth = activePixelArraySize.data.i32[0];
2765be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t arrayHeight = activePixelArraySize.data.i32[1];
2766be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    float zoomLeft, zoomTop, zoomWidth, zoomHeight;
2767be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (mParameters.previewWidth >= mParameters.previewHeight) {
2768be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth =  arrayWidth / zoomRatio;
2769be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = zoomWidth *
2770be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.previewHeight / mParameters.previewWidth;
2771be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else {
2772be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomHeight = arrayHeight / zoomRatio;
2773be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        zoomWidth = zoomHeight *
2774be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                mParameters.previewWidth / mParameters.previewHeight;
2775be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2776be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomLeft = (arrayWidth - zoomWidth) / 2;
2777be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    zoomTop = (arrayHeight - zoomHeight) / 2;
2778be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2779be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    int32_t cropRegion[3] = { zoomLeft, zoomTop, zoomWidth };
2780be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2781be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_SCALER_CROP_REGION, cropRegion, 3);
2782be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2783be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2784be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    // TODO: Decide how to map recordingHint, or whether just to ignore it
2785be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2786be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    uint8_t vstabMode = mParameters.videoStabilization ?
2787be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_ON :
2788be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_OFF;
2789be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = updateEntry(request,
2790be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            ANDROID_CONTROL_VIDEO_STABILIZATION_MODE,
2791be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala            &vstabMode, 1);
2792be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) return res;
2793be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2794be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return OK;
2795be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2796be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2797be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::updateEntry(camera_metadata_t *buffer,
2798be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        uint32_t tag, const void *data, size_t data_count) {
2799be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
2800be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2801be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
2802be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2803be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = add_camera_metadata_entry(buffer,
2804be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                tag, data, data_count);
2805be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res == OK) {
2806be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        res = update_camera_metadata_entry(buffer,
2807be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                entry.index, data, data_count, NULL);
2808be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2809be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2810be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2811be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Unable to update metadata entry %s.%s (%x): %s (%d)",
2812be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__, get_camera_metadata_section_name(tag),
2813be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2814be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2815be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
2816be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
2817be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala
2818be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvalastatus_t Camera2Client::deleteEntry(camera_metadata_t *buffer, uint32_t tag) {
2819be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    camera_metadata_entry_t entry;
2820be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    status_t res;
2821be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = find_camera_metadata_entry(buffer, tag, &entry);
2822be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res == NAME_NOT_FOUND) {
2823be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return OK;
2824be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    } else if (res != OK) {
2825be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error looking for entry %s.%s (%x): %s %d",
2826be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
2827be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
2828be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2829be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        return res;
2830be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2831be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    res = delete_camera_metadata_entry(buffer, entry.index);
2832be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    if (res != OK) {
2833be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala        ALOGE("%s: Error deleting entry %s.%s (%x): %s %d",
2834be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                __FUNCTION__,
2835be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_section_name(tag),
2836be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala                get_camera_metadata_tag_name(tag), tag, strerror(-res), res);
2837be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    }
2838be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala    return res;
2839be0573b93e2d6fa133579c885583af9ed16bc29dEino-Ville Talvala}
28406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::formatStringToEnum(const char *format) {
28416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
28426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422SP) ?
28436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_SP : // NV16
28446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420SP) ?
28456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCrCb_420_SP : // NV21
28466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV422I) ?
28476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YCbCr_422_I :  // YUY2
28486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_YUV420P) ?
28496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_YV12 :         // YV12
28506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGB565) ?
28516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGB_565 :      // RGB565
28526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_RGBA8888) ?
28536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RGBA_8888 :    // RGB8888
28546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(format, CameraParameters::PIXEL_FORMAT_BAYER_RGGB) ?
28556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            HAL_PIXEL_FORMAT_RAW_SENSOR :   // Raw sensor data
28566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
28576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
28586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
28593cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvalaconst char* Camera2Client::formatEnumToString(int format) {
28603cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    const char *fmt;
28613cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    switch(format) {
28623cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_SP: // NV16
28633cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422SP;
28643cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28653cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCrCb_420_SP: // NV21
28663cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420SP;
28673cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28683cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YCbCr_422_I: // YUY2
28693cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV422I;
28703cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28713cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_YV12:        // YV12
28723cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_YUV420P;
28733cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28743cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGB_565:     // RGB565
28753cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGB565;
28763cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28773cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RGBA_8888:   // RGBA8888
28783cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_RGBA8888;
28793cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28803cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        case HAL_PIXEL_FORMAT_RAW_SENSOR:
28813cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGW("Raw sensor preview format requested.");
28823cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = CameraParameters::PIXEL_FORMAT_BAYER_RGGB;
28833cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28843cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala        default:
28853cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            ALOGE("%s: Unknown preview format: %x",
28863cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala                    __FUNCTION__,  format);
28873cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            fmt = NULL;
28883cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala            break;
28893cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    }
28903cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala    return fmt;
28913cca136b73b0f4d058019230eb2070cc23e2bbb0Eino-Ville Talvala}
28926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
28936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::wbModeStringToEnum(const char *wbMode) {
28946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
28956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_AUTO) ?
28966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_AUTO :
28976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_INCANDESCENT) ?
28986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_INCANDESCENT :
28996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_FLUORESCENT) ?
29006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_FLUORESCENT :
29016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_WARM_FLUORESCENT) ?
29026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_WARM_FLUORESCENT :
29036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_DAYLIGHT) ?
29046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_DAYLIGHT :
29056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_CLOUDY_DAYLIGHT) ?
29066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_CLOUDY_DAYLIGHT :
29076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_TWILIGHT) ?
29086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_TWILIGHT :
29096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(wbMode, CameraParameters::WHITE_BALANCE_SHADE) ?
29106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AWB_SHADE :
29116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
29126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
29136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
29146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::effectModeStringToEnum(const char *effectMode) {
29156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
29166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NONE) ?
29176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_OFF :
29186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_MONO) ?
29196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_MONO :
29206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_NEGATIVE) ?
29216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_NEGATIVE :
29226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SOLARIZE) ?
29236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SOLARIZE :
29246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_SEPIA) ?
29256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_SEPIA :
29266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_POSTERIZE) ?
29276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_POSTERIZE :
29286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_WHITEBOARD) ?
29296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_WHITEBOARD :
29306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_BLACKBOARD) ?
29316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_BLACKBOARD :
29326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(effectMode, CameraParameters::EFFECT_AQUA) ?
29336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_EFFECT_AQUA :
29346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
29356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
29366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
29376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::abModeStringToEnum(const char *abMode) {
29386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
29396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_AUTO) ?
29406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_AUTO :
29416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_OFF) ?
29426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_OFF :
29436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_50HZ) ?
29446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_50HZ :
29456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(abMode, CameraParameters::ANTIBANDING_60HZ) ?
29466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_AE_ANTIBANDING_60HZ :
29476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
29486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
29496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
29506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalaint Camera2Client::sceneModeStringToEnum(const char *sceneMode) {
29516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
29526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_AUTO) ?
29536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_UNSUPPORTED :
29546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_ACTION) ?
29556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_ACTION :
29566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PORTRAIT) ?
29576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PORTRAIT :
29586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_LANDSCAPE) ?
29596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_LANDSCAPE :
29606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT) ?
29616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT :
29626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_NIGHT_PORTRAIT) ?
29636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_NIGHT_PORTRAIT :
29646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_THEATRE) ?
29656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_THEATRE :
29666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BEACH) ?
29676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BEACH :
29686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SNOW) ?
29696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SNOW :
29706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SUNSET) ?
29716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SUNSET :
29726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_STEADYPHOTO) ?
29736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_STEADYPHOTO :
29746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_FIREWORKS) ?
29756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_FIREWORKS :
29766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_SPORTS) ?
29776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_SPORTS :
29786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_PARTY) ?
29796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_PARTY :
29806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_CANDLELIGHT) ?
29816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_CANDLELIGHT :
29826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(sceneMode, CameraParameters::SCENE_MODE_BARCODE) ?
29836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            ANDROID_CONTROL_SCENE_MODE_BARCODE:
29846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        -1;
29856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
29866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
29876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::flashMode_t Camera2Client::flashModeStringToEnum(
29886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *flashMode) {
29896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
29906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_OFF) ?
29916861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_OFF :
29926861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_AUTO) ?
29936861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_AUTO :
29946861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_ON) ?
29956861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_ON :
29966861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_RED_EYE) ?
29976861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_RED_EYE :
29986861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(flashMode, CameraParameters::FLASH_MODE_TORCH) ?
29996861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FLASH_MODE_TORCH :
30006861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FLASH_MODE_INVALID;
30016861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30026861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30036861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville TalvalaCamera2Client::Parameters::focusMode_t Camera2Client::focusModeStringToEnum(
30046861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char *focusMode) {
30056861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return
30066861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_AUTO) ?
30076861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_AUTO :
30086861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_INFINITY) ?
30096861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_INFINITY :
30106861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_MACRO) ?
30116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_MACRO :
30126861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_FIXED) ?
30136861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_FIXED :
30146861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_EDOF) ?
30156861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_EDOF :
30166861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_VIDEO) ?
30176861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_VIDEO :
30186861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(focusMode, CameraParameters::FOCUS_MODE_CONTINUOUS_PICTURE) ?
30196861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            Parameters::FOCUS_MODE_CONTINUOUS_PICTURE :
30206861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Parameters::FOCUS_MODE_INVALID;
30216861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30226861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30236861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::parseAreas(const char *areasCStr,
30246861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        Vector<Parameters::Area> *areas) {
30256861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    static const size_t NUM_FIELDS = 5;
30266861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    areas->clear();
30276861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areasCStr == NULL) {
30286861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        // If no key exists, use default (0,0,0,0,0)
30296861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push();
30306861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return OK;
30316861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
30326861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    String8 areasStr(areasCStr);
30336861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    ssize_t areaStart = areasStr.find("(", 0) + 1;
30346861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    while (areaStart != 0) {
30356861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        const char* area = areasStr.string() + areaStart;
30366861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        char *numEnd;
30376861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        int vals[NUM_FIELDS];
30386861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        for (size_t i = 0; i < NUM_FIELDS; i++) {
30396861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            errno = 0;
30406861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[i] = strtol(area, &numEnd, 10);
30416861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            if (errno || numEnd == area) return BAD_VALUE;
30426861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            area = numEnd + 1;
30436861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
30446861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areas->push(Parameters::Area(
30456861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            vals[0], vals[1], vals[2], vals[3], vals[4]) );
30466861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        areaStart = areasStr.find("(", areaStart) + 1;
30476861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
30486861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
30496861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30506861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30516861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalastatus_t Camera2Client::validateAreas(const Vector<Parameters::Area> &areas,
30526861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                                      size_t maxRegions) {
30536861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // Definition of valid area can be found in
30546861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    // include/camera/CameraParameters.h
30556861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 0) return BAD_VALUE;
30566861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() == 1) {
30576861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (areas[0].left == 0 &&
30586861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].top == 0 &&
30596861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].right == 0 &&
30606861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].bottom == 0 &&
30616861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                areas[0].weight == 0) {
30626861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            // Single (0,0,0,0,0) entry is always valid (== driver decides)
30636861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala            return OK;
30646861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        }
30656861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
30666861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    if (areas.size() > maxRegions) {
30676861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        ALOGE("%s: Too many areas requested: %d",
30686861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala                __FUNCTION__, areas.size());
30696861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        return BAD_VALUE;
30706861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
30716861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30726861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    for (Vector<Parameters::Area>::const_iterator a = areas.begin();
30736861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala         a != areas.end(); a++) {
30746861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->weight < 1 || a->weight > 1000) return BAD_VALUE;
30756861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left < -1000 || a->left > 1000) return BAD_VALUE;
30766861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top < -1000 || a->top > 1000) return BAD_VALUE;
30776861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->right < -1000 || a->right > 1000) return BAD_VALUE;
30786861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->bottom < -1000 || a->bottom > 1000) return BAD_VALUE;
30796861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->left >= a->right) return BAD_VALUE;
30806861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        if (a->top >= a->bottom) return BAD_VALUE;
30816861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    }
30826861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return OK;
30836861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30846861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
30856861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvalabool Camera2Client::boolFromString(const char *boolStr) {
30866861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala    return !boolStr ? false :
30876861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        !strcmp(boolStr, CameraParameters::TRUE) ? true :
30886861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala        false;
30896861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala}
30906861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
3091c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvalaint Camera2Client::degToTransform(int degrees, bool mirror) {
3092c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    if (!mirror) {
3093c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) return 0;
3094c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 90) return HAL_TRANSFORM_ROT_90;
3095c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 180) return HAL_TRANSFORM_ROT_180;
3096c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        else if (degrees == 270) return HAL_TRANSFORM_ROT_270;
3097c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    } else {  // Do mirror (horizontal flip)
3098c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        if (degrees == 0) {           // FLIP_H and ROT_0
3099c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H;
3100c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 90) {   // FLIP_H and ROT_90
3101c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_H | HAL_TRANSFORM_ROT_90;
3102c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 180) {  // FLIP_H and ROT_180
3103c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V;
3104c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        } else if (degrees == 270) {  // FLIP_H and ROT_270
3105c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala            return HAL_TRANSFORM_FLIP_V | HAL_TRANSFORM_ROT_90;
3106c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala        }
3107c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    }
3108c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    ALOGE("%s: Bad input: %d", __FUNCTION__, degrees);
3109c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala    return -1;
3110c94cd19694ea0befe2eb22735c50b00070f006d9Eino-Ville Talvala}
31116861a4e9f929c2cb4a3131244e01e676c5b28f55Eino-Ville Talvala
311261ab9f93315ea817cd1ac110e2a95da4dab6b4d1Eino-Ville Talvala} // namespace android
3113